Autor |
Beitrag |
dickeWade
Hält's aus hier
Beiträge: 14
Erhaltene Danke: 1
Win95, Vista
Delphi 3, Delphi 7
|
Verfasst: 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:
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); 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
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: 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 
Hält's aus hier
Beiträge: 14
Erhaltene Danke: 1
Win95, Vista
Delphi 3, Delphi 7
|
Verfasst: 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
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: 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 
Hält's aus hier
Beiträge: 14
Erhaltene Danke: 1
Win95, Vista
Delphi 3, Delphi 7
|
Verfasst: 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
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Sa 19.03.11 12:32
So hab Dein TH noch mal langsam gelesen:
dickeWade hat folgendes geschrieben : | ... 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 
Hält's aus hier
Beiträge: 14
Erhaltene Danke: 1
Win95, Vista
Delphi 3, Delphi 7
|
Verfasst: So 20.03.11 00:29
Dankeschön. Das VirtualTreeView schau ich mir mal an und werde das mal reinzubasteln versuchen
Gruß Tommi
|
|
|