Sortierrichtung im Titel von dbGrid

Rund um die LCL und andere Komponenten
Antworten
MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Sortierrichtung im Titel von dbGrid

Beitrag von MacWomble »

Hallo, ich habe mein Testprogramm so weit, dass ich durch Klicken auf die Titelfelder eines DBGrid die Sortierung (ASC/DESC) umschalten kann.
Gibt es auch eine Möglichkeit, dies durch einen Indikator in der Titelzeile anzuzeigen, so wie man dies von vielen Programmen kennt (Pfeil auf/ab)?
Im Moment kann ich zwar sehen, welche Spalte sortiert ist, nicht aber in welche Richtung, außer ich verändere die Caption der Spalte.

Danke Klaus
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

baba
Beiträge: 265
Registriert: Mi 4. Apr 2007, 17:47

Re: Sortierrichtung im Titel von dbGrid

Beitrag von baba »

Moin, moin,

ich würde im Ereignis onDrawCell, je nach Sortierung, die entsprechende Titelzeile mit einer kleinen Grafik verzieren (^v).

Gruß
Baba.

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: Sortierrichtung im Titel von dbGrid

Beitrag von MacWomble »

Danke für den Tipp.

Als VB-Umsteiger fällt mir dies doch recht schwer umzusetzen. Gibt es hierfür evtl. ein Demo?
Ebenfalls bin ich am experimentieren mit Zeilenfarben in Abhängigkeit eines DB-Feldinhalts im DBGrid.

Wenn ich es richtig verstanden habe, muss ich beiden in 'OnDrawColumnCell' unter bringen und über den Canvas realisieren?

Sollte jemand bereit sein, mich hierbei etwas ausführlicher zu unterstützen, wäre ich dankbar

Mein letzter Versuch war:

Code: Alles auswählen

procedure Tfrm_TouriEdit.DBGrid1DrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  with Sender as TDBGrid do begin
    //if DataModule1.ZQuery1.FieldByName('telzusatz').AsString = 'Telefax' then
      //Canvas.Brush.Color := clWhite
    //else
      Canvas.Brush.Color := clRed;
    DefaultDrawColumnCell(Rect, DataCol, Column, State);
  end;
end;
Nach meinem Verständnis hätten nun ALLE Zeilen rot sein müssen - wo ist hier der Holzweg, auf dem ich wandle?

Gruß Klaus
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Benutzeravatar
theo
Beiträge: 10949
Registriert: Mo 11. Sep 2006, 19:01

Re: Sortierrichtung im Titel von dbGrid

Beitrag von theo »

MacWomble hat geschrieben:wo ist hier der Holzweg, auf dem ich wandle?
Ohne es genau zu wissen, würde ich sagen dass du mit DefaultDrawColumnCell alles zurücksetzt.

Probier mal nach
Canvas.Brush.Color := clRed;
alles selber zu zeichnen.

Also z.B.
Canvas.FillRect(Rect);
Canvas.TextOut(....);

baba
Beiträge: 265
Registriert: Mi 4. Apr 2007, 17:47

Re: Sortierrichtung im Titel von dbGrid

Beitrag von baba »

... ich greife auf die Zeilen in einem Grid wie folgt zu, wobei das Beispiel in einer Cell - 2Zeiligen Text in unterschiedlicher Größe ausgibt.

Code: Alles auswählen

//------------------------------------------------------------------------------
procedure TFMain.SG_Setup3DrawCell(Sender: TObject; aCol, aRow: Integer;
  aRect: TRect; aState: TGridDrawState);
 
   procedure PrintZeile(pMode : Integer; pText : String);
   begin
      if pMode = 1 then begin
         SG_Setup3.Canvas.Font.Size  := 8;
         SG_Setup3.Canvas.Font.Style := [fsBold];
         SG_Setup3.Canvas.Font.Color := clBlack;
         SG_Setup3.Canvas.TextOut(aRect.Left, aRect.Top, pText);
      end else
      if pMode = 2 then begin
         SG_Setup3.Canvas.Font.Size  := 6;
         SG_Setup3.Canvas.Font.Style := [];
         SG_Setup3.Canvas.Font.Color := clRed;
         SG_Setup3.Canvas.TextOut(aRect.Left, aRect.Top + 15, pText); 
      end;
   end;
begin
   if (aCol = 0) then begin
      case aRow of
         0 : begin
                PrintZeile(1, 'Festtasten-Mode');
                PrintZeile(2, '20 oder 40 Tasten anzeigen');
             end;
         1 : begin
                PrintZeile(1, 'Tastengruppe');
                PrintZeile(2, 'Startseite im Kassenfenster');
             end;
         2 : begin
                PrintZeile(1, '10er Block (Mode)');
                PrintZeile(2, '+/- oder 10er Block anzeigen');
             end;
         3 : begin
                ...
             end;
      end;
   end;
end;
Dies mal so als Anregung, da kannst Du bestimmt eine Menge eigener individueller Anpassungen - wie eine Grafik auf dem Canvas - vornehmen.

Ich nutze z.B. einen ähnlichen Aufbau um in Grid´s negative Zahlen ROT anzuzeigen.

Gruß
Baba.

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: Sortierrichtung im Titel von dbGrid

Beitrag von MacWomble »

Danke für die Hinweise!

So funktioniert die farbliche Darstellung:

Code: Alles auswählen

procedure Tfrm_TouriEdit.DBGrid1DrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  with TDBGrid(Sender) do begin  //Syntax geändert
    if DataModule1.ZQuery1.FieldByName('telzusatz').AsString <> 'Telefon' then
      Canvas.Brush.Color := clRed;
    Canvas.FillRect(Rect); //Hatte ich vergessen
    DefaultDrawColumnCell(Rect, DataCol, Column, State);
  end;
end;
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Antworten