DBGrid - suche nach dem richtigen Event

Rund um die LCL und andere Komponenten
Antworten
charlytango
Beiträge: 843
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

DBGrid - suche nach dem richtigen Event

Beitrag von charlytango »

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

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: DBGrid - suche nach dem richtigen Event

Beitrag von Michl »

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.
Dateianhänge
Bufdataset.zip
(2.57 KiB) 44-mal heruntergeladen

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: DBGrid - suche nach dem richtigen Event

Beitrag von wp_xyz »

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

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: DBGrid - suche nach dem richtigen Event

Beitrag von Michl »

wp_xyz hat geschrieben:
Sa 3. Jul 2021, 11:52
dann brauchst du das Ereignis OnUpdate der ActionList bzw. der betreffenden Action
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. :D

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Antworten