DBGrid onTitleClick

Rund um die LCL und andere Komponenten
Antworten
icho2099
Beiträge: 22
Registriert: Fr 21. Feb 2020, 19:17
OS, Lazarus, FPC: Win10/64
CPU-Target: 64 Bit
Wohnort: Osterholz-Scharmbeck

DBGrid onTitleClick

Beitrag von icho2099 »

Hallo,
ich möchte mit onTitleClick in einem DBGrid nach der Spalte sortieren.
Gleichzeitig soll aber auch ColumnMove und ColumnResize möglich sein.
Wie löst man das auf?
Das Sort selber ist nicht das Problem, nur die Funktionen move, resize, sort zu unterscheiden bereitet Kopfschmerzen.
Jemand dafür eine Lösung?

Joh
Lazarusforum e. V.
Beiträge: 187
Registriert: Sa 26. Mai 2012, 17:31
OS, Lazarus, FPC: Win 10 (L 2.2.6 x64 FPC 3.2.2)
CPU-Target: 64Bit

Re: DBGrid onTitleClick

Beitrag von Joh »

ähem, ich versteh das Problem nicht...
Im OnTitleClick findet die Sortierung statt.
Davon ist das Move oder/und Resize doch nicht betroffen.
just my two Beer

Soner
Beiträge: 623
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: DBGrid onTitleClick

Beitrag von Soner »

Du brauchst nicht um die Sortierung zu kümmern, das macht das Datenbankprogramm (FireBird, Sqlite, MariaDB ...).
Und die TDBGrid enthält keine Daten, es zeigt es nur an. Schau das Ereignis OnTitleClick an:

Code: Alles auswählen

procedure TForm1.DBGrid1TitleClick(Column: TColumn);
begin
    // Column.Field.Name ist das Feld nach dem sortiert werden soll
    // nehmen wir an du hast eine Query dann kannst du jetzt so sortieren:
   SQLQuery1.SQL.Text:=' select * from meine_tabelle order by '+Column.Field.Name;
   
    // Du kannst auch mit Colum.Title.ImageIndex ein Bild anzeigen lassen, damit macht sieht, dass es nach dieser Spalte sortiert wird.
end; 
Das ist vereinfachter Code. Mann kann Sortierfelder in einer Variable speichern und nach viele Spalten sortieren, z.B. mit Shitf-Taste und Mausklick oder Sortierreihenfolge(ASC/DESC) ändern. Ich mache es immer so ähnlich.

Wenn du ZEOS-Komponenten verwendest musst du nicht die gleichen Daten wieder vom DB-Server holen. Du kannst TZQuery/TZReadOnlyQuery.SortedFields-Eigenschaft benutzen. Es ist ziemlich schnell. Nur wenn du die Daten vom DB-Server neu holst dann, musst du SortedFields leeren und es dir von DB-Server sortieren lassen, die sind schneller. Vielleicht gibt es so etwas bei SQLDB.

Viel Spaß.

Antworten