Hi,
Angenommen In einem TDBGrid kann der User mehrere Zeilen auswählen/markieren.
Nun gibt es TActions aus einer TActionlist die für eine einzelne Zeile gültig sind und andere die für mehrere ausgeführt werden können. (die Actions sind diversen Controls zugeordnet)
Wenn man die entsprechenden Actions enabled/disabled ist das ja kein Problem, dann kann der benutzer nichts falsch machen.
Meine Frage ist: Was wäre das richtige Event (des DBGrid) um das elegant machen zu können und die Zeilen auch schon markiert sind ? (um mit DBGrid1.SelectedRows.Count den Status abzufragen)
THX
DBGrid - suche nach dem richtigen Event
-
- Beiträge: 1063
- Registriert: Sa 12. Sep 2015, 12:10
- OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
- CPU-Target: Win 32/64, Linux64
- Wohnort: Wien
Re: DBGrid - suche nach dem richtigen Event
Wenn die Actions nur per DBGrid Popupmenu aufgerufen werden können sollen, wäre vor der Öffnung des Popupmenues diese Prüfung möglich (z.B. OnMouseDown vom Grid).
Andernfalls hast du die Möglichkeit in allen möglichen Events, wie OnAfterScroll, OnKeyUp, OnMouseUp, immer da, wo der User bzw. das Programm die Selektion verändern kann, zu checken, ob eine Action möglich ist oder nicht.
Habe eben in dbgrids.pas nachgeschaut. Unter TBookmarkList.SetCurrentRowSelected wird bei einer Änderung FGrid.Invalidate aufgerufen. Ein anderer Event wird dabei nicht zwangsläufig gefeuert (evtl. wäre es sinnvoll sowas noch einzubauen?!).
Somit gibt es nur OnPaint (public property) vom DBGrid, wo du hundert prozentig sicher sein kannst, daß es immer nach einer Änderung der Selektion aufgerufen wird. Allerdings wird OnPaint auch bei jedem Neuzeichnen z.B. bei Resizing gefeuert.
Ich würde OnPaint nutzen, da der Overhead durch diesen Check mMn minimal ist.
Habe es auch eben mit einem Bufdataset getestet. Anbei, falls es nützt.
Andernfalls hast du die Möglichkeit in allen möglichen Events, wie OnAfterScroll, OnKeyUp, OnMouseUp, immer da, wo der User bzw. das Programm die Selektion verändern kann, zu checken, ob eine Action möglich ist oder nicht.
Habe eben in dbgrids.pas nachgeschaut. Unter TBookmarkList.SetCurrentRowSelected wird bei einer Änderung FGrid.Invalidate aufgerufen. Ein anderer Event wird dabei nicht zwangsläufig gefeuert (evtl. wäre es sinnvoll sowas noch einzubauen?!).
Somit gibt es nur OnPaint (public property) vom DBGrid, wo du hundert prozentig sicher sein kannst, daß es immer nach einer Änderung der Selektion aufgerufen wird. Allerdings wird OnPaint auch bei jedem Neuzeichnen z.B. bei Resizing gefeuert.
Ich würde OnPaint nutzen, da der Overhead durch diesen Check mMn minimal ist.
Habe es auch eben mit einem Bufdataset getestet. Anbei, falls es nützt.
- Dateianhänge
-
Bufdataset.zip
- (2.57 KiB) 57-mal heruntergeladen
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
Re: DBGrid - suche nach dem richtigen Event
Ich verstehe die Frage nicht ganz. Wenn es darum geht, wie man dafür sorgen kann, dass Actions je nach Programmzustand automatisch enabled/disabled werden, dann brauchst du das Ereignis OnUpdate der ActionList bzw. der betreffenden Action. Das wird jeweils aufgerufen, wenn die Anwendung Idle ist (d.h. in OnUpdate dürfen keine aufwändigen Berechnungen erfolgen). Siehe dazu auch: http://blong.com/Articles/Actions/Actio ... AreUpdated
Re: DBGrid - suche nach dem richtigen Event
Das wusste ich bisher gar nicht. Ich habe das bisher immer anders herum gemacht (also ähnlich dem Beispiel oben). Hab es probiert, geht prima. Wieder was gelernt.wp_xyz hat geschrieben: Sa 3. Jul 2021, 11:52dann brauchst du das Ereignis OnUpdate der ActionList bzw. der betreffenden Action

Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;