Autor Beitrag
dickeWade
Hält's aus hier
Beiträge: 14
Erhaltene Danke: 1

Win95, Vista
Delphi 3, Delphi 7
BeitragVerfasst: Fr 18.03.11 14:35 
Ich hab für die Anzeige meiner "Datenbank" (einer Filmliste für den Festplattenrekorder) ein TStringGrid gewählt. Mit Markierung Zeilenweise und nicht einzelne Zellen. Die sind auch nicht direkt editierbar. Alles schön und fein. Wenn ich nun dank breiter Spalten (max 12 Stück) nach rechts scrolle und dann mit Cursortasten nach oben oder unten die aktuelle Zeile wechsele springt das Grid wieder komplett nach links, zur ersten Spalte. Desgleichen, wenn ich vom Programm aus mit .Row = Zeilennummer eine neue aktive Zeile setze. Ich find das unschön.

Gibts da einen Trick, das zu unterbinden?

Ich hab da bisher selber folgendes herausgefunden:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TListenFenster.FilmListeTopLeftChanged(Sender: TObject);
begin
  LinkeSpalte := Filmliste.LeftCol;
end;
.....
procedure TListenFenster.FilmListeSelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean);
begin
  PostMessage(Handle, WM_LinkeSpalteSetzen, 0, LinkeSpalte);
  // hier in der Procedure besteht die linke Spalte noch, erst hinterher scrollt das Grid wieder zuück auf 1 - daher die PostMessage
end;
.....
procedure TListenFenster.LinkeSpalteSetzen_Message(var Msg: TMessage);
begin
  FilmListe.LeftCol := Msg.LParam;
end;


Das funktioniert ja durchaus, da hab ich aber ein etwas unschönes Flackern, weil die Liste ja erst nach links und sofort wieder zurück scrollt.

Gruß Tommi
ALF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Fr 18.03.11 14:48 
Mh... verstehen nicht, warum neuerdings soviele mit Postmessage arbeiten? Die Objekte bieten doch alles was man benötigt?

Was da bei Dir passiert ist, das Du Change und click und dan unterschiedliche columen hast.
Lass einfach change weg wenn Du es nicht unbedingt benötigst!

Alf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
dickeWade Threadstarter
Hält's aus hier
Beiträge: 14
Erhaltene Danke: 1

Win95, Vista
Delphi 3, Delphi 7
BeitragVerfasst: Fr 18.03.11 15:52 
*mhm* Versteh ich nun nicht so ganz. "TopLeftChanged" weglassen? Die hab ich nur extra hinzugefügt, um bei einer Änderung der linken sichtbaren Spalte diese in der Variable zu speichern. Ansonsten brauche ich dies nicht.

Beispiel: Ich scrolle soweit nach rechts, dass die Spalte 3 die erste sichtbare Spalte links ist. Egal mit welchen Methoden, Maus oder Cursortasten, ich nun die aktuelle Zeile wechsel, das Grid springt dabei grundsätzlich wieder zur Spalte 1 zurück und das gefällt mir nicht. Muss dann ja jedesmal wieder nach rechts scrollen um z. B. Spalte 12 sehen zu können. Das ist eben doof.

Alf hat folgendes geschrieben:
Mh... verstehen nicht, warum neuerdings soviele mit Postmessage arbeiten?


Das gefällt mir ja auch nicht und das war erst mal ein Notbehelf damit es irgendwie funzt. Mein Problem war, dass es in der "OnSelectCell"-Procedure nichts brachte, dort die linke Spalte zu setzen weil das Grid erst danach zur linken Spalte scrollt. :?

Gruß Tommi
ALF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Fr 18.03.11 16:20 
Warum gehst du nicht methodisch vor? Wen Du in den Ereignissen von StringGrid nicht wirklich ernsthaft was benötigst, Dokumentiere alle Zeilen in den Proceduren aus. Wenn dann die Bedienung des StringGrid normal ist, dann weist du das Du irgend wo was nicht richtig machst.

ALf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
dickeWade Threadstarter
Hält's aus hier
Beiträge: 14
Erhaltene Danke: 1

Win95, Vista
Delphi 3, Delphi 7
BeitragVerfasst: Sa 19.03.11 03:58 
Nun jaaa, die beiden Ereigbnisbehandlungsroutinen OnTopLeftChange und OnSelectCell hab ich ja erst hinzu genommen um das Problem zu beseitigen. Ohne diese mach das StringGrid genau das was ich nicht will. Es springt von alleine immer wieder nach links zur ersten Spalte wenn ich die aktive Zeile wechsele. Die Einträge pinsele ich selbst in der Procedure OnDrawCell. Aber auch wenn ich die Darstellung dem StringGrid wieder komplett selbst überlasse indem ich OnDrawCell rausnehme, macht es diesen Blödsinn. Vielleicht ist das kein Blödsinn sondern normal so, aber ich will das eben nicht. Und dies zu Umgehen hab ich wie oben beschrieben die Proceduren eingefügt. Es funktioniert zwar aber elegant ist das eben nicht.

Gruß Tommi
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 19.03.11 08:02 
Mach es dir doch nicht unnötig schwer, nimm einfach eine TVirtualStringTree. Sieht tausendmal besser aus und macht das von Hause aus so.

Zudem kannst du da auch viel leichter Filter einbauen und du kannst auch Unterknoten erstellen (natürlich auch mit den Spalten) und einklappen usw., wenn du das willst.

Und du kannst alles sehr gut anpassen, wenn du es noch anders haben willst. Dafür gibt es Unmengen an Events.

Für diesen Beitrag haben gedankt: dickeWade
ALF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Sa 19.03.11 12:32 
So hab Dein TH noch mal langsam gelesen:

user profile icondickeWade hat folgendes geschrieben Zum zitierten Posting springen:
... Mit Markierung Zeilenweise und nicht einzelne Zellen. Die sind auch nicht direkt editierbar....
ist klar das es so ist, wenn man RowSelect aktiv hat!(Hätte vorher richtig lesen müssen sorry).
Rowselect fängt nun mal von Column 1 an und ruft dann SelectCell auf. Ist leider so. Das einzigste wo man was machen kann ist SelectCell, da könnte man Hand anlegen! Rowselect:= False und in SelectCell selber was machen.
Problem dabei ist, Du weist nicht welche Celle gerade im sichtbarenbereich ist. Die Position von HScrollbar bekommst Du auch nicht um evtl diese Pos zu setzten.
Also bleibt nur, Fremdkomponente die sowas ermöglicht, Stringgrid selber verändern oder @jaenicke
Vorschlag nehmen.

Leider

ALF

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!

Für diesen Beitrag haben gedankt: dickeWade
dickeWade Threadstarter
Hält's aus hier
Beiträge: 14
Erhaltene Danke: 1

Win95, Vista
Delphi 3, Delphi 7
BeitragVerfasst: So 20.03.11 00:29 
Dankeschön. Das VirtualTreeView schau ich mir mal an und werde das mal reinzubasteln versuchen :)

Gruß Tommi