Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   DBGrid - Option dgRowSelect vs dgEditing (https://www.delphipraxis.net/208068-dbgrid-option-dgrowselect-vs-dgediting.html)

blawen 4. Jun 2021 09:26

DBGrid - Option dgRowSelect vs dgEditing
 
Beim DBGrid kann die selektierte Zeile mit der Option dgRowSelect optisch markiert werden.
Dies hat allerdings den Nachteil, dass die Option dgEditing nicht mehr zur Verfügung steht.
Diese brauche ich aber um eine einzelne Zelle zu markieren (Doppelklick) und deren Inhalt in die Zwischenablage zu kopieren und z.B. in einem Dokument einzufügen (copy/paste)

Daher zeichne ich im DrawColumnCell selber, der Ansatz sieht sieht so aus:
Delphi-Quellcode:
if dgAuftraege.DataSource.DataSet.RecNo = FAuftrag_ID
then begin
  dgAuftraege.Canvas.Brush.Color := clHighlight;
  dgAuftraege.Canvas.Font.Color := clwhite;
end;
Die FAuftrag_ID wird im Datachange vom Dataset zwischengespeichert.

Dieser Ansatz funktioniert soweit, allerdings nur wenn ich auf eine Zelle klicke.
Wenn ich mittels dem Mausrad durchscrolle, ist es nur eine Frage der Zeit, bis sämtliche Einträge eingefärbt sind.

Wie würdet Ihr dies lösen oder was mache ich falsch?

rokli 4. Jun 2021 11:13

AW: DBGrid - Option dgRowSelect vs dgEditing
 
Hallo Roland,

Du kannst die Zeilen im DbGrid mit OnDrawDataCell beeinflussen - auch nach dem Inhalt eines Feldes - und das funktioniert auch beim Bewegen des Mauszeiges:

Delphi-Quellcode:
procedure TfrmMain.dbgKSuchDrawDataCell(Sender: TObject; const [Ref] Rect: TRect; Field: TField; State: TGridDrawState);
{-------------------------------------------------------------------------------
   bei einem Grid die Zeilen in Abhängigkeit eines
   Feldwertes farbig machen
-------------------------------------------------------------------------------}
var
   clNew         : TColor;
   clOld         : TColor;
begin
   // alte Farbe merken
   clOld         := TDBGrid(Sender).Canvas.Brush.Color;

   // neue Farbe in Abhängikeit des Wertes einstellen
   if qryKSuch.FieldByName('BEZ').AsString = '*** fehlt in Parametertabelle ***' then begin
      clNew            := clRed;
   end
   else begin

      if qryKSuch.FieldByName('ART').AsString = 'Parameter 1' then begin
         clNew         := clGreen;
      end
      else begin
         if qryKSuch.FieldByName('ART').AsString = 'Parameter 2' then begin
            clNew      := clBlue;
         end
         else begin
            clNew      := clOld;
         end;
      end;
   end;

   // aktive Zeile anders zeichen
   with (Sender as TDBGrid) do begin
      if (gdSelected in State) then begin
         Canvas.Brush.Color   :=clSkyBlue; // Cursor-Farbe
         Canvas.Brush.Style   :=bsSolid;
         Canvas.Pen.Style      :=psclear;
         Canvas.FillRect(Rect);
      end
      else begin
         Canvas.Brush.Color   :=clNew;
         Canvas.Brush.Style   :=bsSolid;
         Canvas.Pen.Style      :=psclear;
         Canvas.FillRect(Rect);
      end;
   end;

  //Text (muss separat gezeichnet werden)
  TDBGrid(Sender).Canvas.Pen.Style      :=psSolid;
  TDBGrid(Sender).Canvas.Pen.Color      :=clBlack;
  TDBGrid(Sender).Canvas.TextRect(Rect,Rect.Left+2,Rect.Top+2,Field.AsString);
End;


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz