DBGrid selecktierte Zeile markieren.

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Luckner
Beiträge: 88
Registriert: Sa 18. Jan 2020, 09:56
OS, Lazarus, FPC: Winux (L 2.2.0 FPC 3.2.2)
CPU-Target: Windows 64-Bit

DBGrid selecktierte Zeile markieren.

Beitrag von Luckner »

Hallo,

um die Farben in einem DBGrid zu ändern habe ich folgende Routine eingetrage:

Code: Alles auswählen

procedure TFrameArtikel.GridArtikelGridDrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  with GridArtikelGrid.Canvas do
  begin
    if State = [gdSelected, gdFocused] then
    begin
      Brush.Color := $00D8D8D8; //Farbe für die Zelle mit dem Focus
      Font.Color := $00000000 ; //Farbe für die Schrift mit dem Focus
    end
    else
    begin
       Brush.Color := $00FFFFFF;
       Font.Color  := $00000000;
    end;
 
    FillRect( Rect );
    TextOut( Rect.Left, Rect.Top, Column.Field.Text );
  end;
end;


Jetzt wird leider nur eine Zelle entsprechend den Änderungen markiert, aber nicht mehr die ganze Zeile. Obwohl 'dgRowselect = True' gesetzt ist.
Muß ich in 'FillRect( Rect );' das 'Rect' durch etwas anderes ersetzen?

Danke, Luckner

Benutzeravatar
gladio
Beiträge: 217
Registriert: Sa 21. Jun 2014, 06:15
OS, Lazarus, FPC: Win10-64 - aktuelle Lazarus/FPC Standard-Edition
CPU-Target: 64Bit
Wohnort: Rügen

Re: DBGrid selecktierte Zeile markieren.

Beitrag von gladio »

Mal versuchen:
Ersetze mal die Zeile mit TextOut...
mit
DefaultDrawColumnCell(Rect,DataCol,Column,State);

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

Re: DBGrid selecktierte Zeile markieren.

Beitrag von wp_xyz »

Luckner hat geschrieben:

Code: Alles auswählen

    if State = [gdSelected, gdFocused] then[

Diese Anweisung bedeutet, dass der IF-Zweig betreten wird, wenn die State-Menge exakt die beiden genannten Elemente enthält. Das trifft aber nur bei der aktiven Zelle zu. Besser ist es, zu prüfen, ob nur eines der beiden in der Menge enthalten ist:

Code: Alles auswählen

    if State * [gdSelected, gdFocused] <> [] then 

Folgenden Code habe ich in meinen Demo-Programmen gefunden. Funktioniert (allerdings mit anderen Farben). Beachte, dass ich hier das OnPrepareCanvas-Ereignis verwende. Das ist m.E. einfacher als im OnDrawCell die komplette Zelle neu zu zeichnen. OnPrepareCanvas wird unmittelbar vor dem Zeichnen der Zelle aufgerufen, alle Canvas-Eigenschaften sind schon gesetzt, aber man kann hier nochmals änderungen vornehmen, also z.B. Farben austauschen.

Code: Alles auswählen

procedure TForm1.DBGrid1PrepareCanvas(sender: TObject; DataCol: Integer;
  Column: TColumn; AState: TGridDrawState);
begin
  if ([gdSelected, gdFocused] * AState <> []) then begin
    if (DBGrid1.SelectedColumn = Column) then begin
      DBGrid1.Canvas.Brush.Color := clRed;
      DBGrid1.Canvas.Font.Color := clWhite;
    end else
    begin
      DBGrid1.Canvas.Brush.Color := RgbToColor(255, 128, 128);
      DBGrid1.Canvas.Font.Color := clBlack;
    end;
  end;
end;
 

Luckner
Beiträge: 88
Registriert: Sa 18. Jan 2020, 09:56
OS, Lazarus, FPC: Winux (L 2.2.0 FPC 3.2.2)
CPU-Target: Windows 64-Bit

Re: DBGrid selecktierte Zeile markieren.

Beitrag von Luckner »

Hallo gladio und wp_xyz,
gladio, danke für diese Lösung und es funktioniert. Vielen Dank. wp_xyz, ich werde auch Deine mögliche Lösung ausprobieren und mich hier noch einmal melden.

Danke und Gruß, Luckner

Antworten