Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Prism dbgrid aktuelle Zeile im dbGrind färben (https://www.delphipraxis.net/131762-dbgrid-aktuelle-zeile-im-dbgrind-faerben.html)

Andreas Nord 30. Mär 2009 16:31

Datenbank: bde • Zugriff über: keine ahnung

dbgrid aktuelle Zeile im dbGrind färben
 
Hallo, würde zu gerne die gesamte ausgewählte Zeile in einen DbGrind einfärben.
Bekomme leider nur die aktuelle Zelle gefärbt:

Delphi-Quellcode:
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);

begin
if (State=[gdSelected,gdFocused])
    then DBGrid1.Canvas.Brush.Color := clred
    else DBGrid1.Canvas.Brush.Color := clWhite;
end;
Hab schon mindestens 3 Stunden gesucht. Wäre sehr dankbar!

DeddyH 30. Mär 2009 16:42

Re: dbgrid aktuelle Zeile im dbGrind färben
 
Und wenn Du unter "Options" RowSelect auf true stellst?

[edit] BDE unter Delphi.NET? Bist Du da sicher? [/edit]

Andreas Nord 30. Mär 2009 16:59

Re: dbgrid aktuelle Zeile im dbGrind färben
 
Klappt leider auch nicht. Möchte auch gerne jede Celle zur laufzeit editieren können. Aber trotzdem Danke.
Ist eine Paradox 7 Tabelle.

DeddyH 30. Mär 2009 17:05

Re: dbgrid aktuelle Zeile im dbGrind färben
 
Dann such doch mal nach Hier im Forum suchenDrawColumnCell, da solltest Du einige Beispiele finden.

shmia 30. Mär 2009 17:10

Re: dbgrid aktuelle Zeile im dbGrind färben
 
Das Problem ist, dass du hier zwei Mengen auf Gleichheit überprüfst.
Nur Zellen, die Selected und Fokusiert werden eingefärbt (nur eine Zelle hat den Fokus)
Delphi-Quellcode:
begin
  if gdSelected in State then  // ***
     DBGrid1.Canvas.Brush.Color := clred
  else
     DBGrid1.Canvas.Brush.Color := clWhite;
end;

DeddyH 30. Mär 2009 17:13

Re: dbgrid aktuelle Zeile im dbGrind färben
 
:wall: das hab ich natürlich geflissentlich übersehen. Vielleicht sollte ich mich mal sinnvollen Dingen wie Fliegenfischen in der Badewanne widmen, so wird das hier eh nichts mehr.

Andreas Nord 30. Mär 2009 17:26

Re: dbgrid aktuelle Zeile im dbGrind färben
 
Sorry, laut Delphi-Hilfe:

gdSelected - Die Zelle ist aktuell ausgewählt

Ich möchte wissen, ob die Zeile und nicht die Zelle ausgewählt ist!

Danke für die Bemühungen.

DeddyH 30. Mär 2009 17:31

Re: dbgrid aktuelle Zeile im dbGrind färben
 
Nochmal: RowSelect auf true stellen und die Abfrage ändern.
Zitat:

Delphi-Quellcode:
if (State=[gdSelected,gdFocused])

Das tritt nämlich nur dann ein, wenn State genau diese beiden Flags enthält. Wenn Dir eins der beiden genügt, müsste das IMHO so lauten:
Delphi-Quellcode:
if (gdSelected in State) or (gdFocused in State)

Andreas Nord 30. Mär 2009 17:39

Re: dbgrid aktuelle Zeile im dbGrind färben
 
Also mit:
Delphi-Quellcode:
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
  begin
if gdSelected in State
    then DBGrid1.Canvas.Brush.Color := clred
    else DBGrid1.Canvas.Brush.Color := clWhite;
end;
und der Option "RowSelect" erhalte ich genau mein erwünschtes ergebnis.

Nun kann ich aber nicht mehr die einzelnen Zellen editieren :wall:

Andreas Nord 30. Mär 2009 18:20

Re: dbgrid aktuelle Zeile im dbGrind färben
 
Es muss doch irgendwie möglichsein, innerhalb der Funktion "DBGrid1DrawColumnCell" festzustellen welche Zeile bei einer Tabelle ausgewählt ist!?

Mit RecNo geht das leider nicht, da inerhalb von DBGrid1DrawColumnCell dieser von 0 bis an das Tabellenende Hochgezählt wird.

Andreas Nord 30. Mär 2009 18:49

Re: dbgrid aktuelle Zeile im dbGrind färben
 
So, hab eine Lösung gefunden. Wenn auch nicht ganz sauber:

1. hab mir ne globale Variable erstellet: current_row: integer;

2. Diese setze ich beim "DataSource1DataChange" auf die ausgewählte Zeile:

Delphi-Quellcode:
procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
begin
 current_row:= Table1.RecNo;
 DBGrid1.Repaint;            // wird benötigt wenn das Mausrad benutzt wird
end;
3. Und zur vollständigkeit noch meine DBGrid1DrawColumnCell-Funktion:
Delphi-Quellcode:

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if Table1.RecNo=current_row
      then DBGrid1.Canvas.Brush.Color := clred
      else DBGrid1.Canvas.Brush.Color := clWhite;
DBGrid1.DefaultDrawColumnCell(rect,datacol,column,state);
end;
So, tolles Ergebnis für einen Nachmitag Arbeit :glaskugel:

Über eine Sauber kurze Lösung wäre ich echt noch dankbar, oder teilt mal mit, wenn ihr das selbe problem habt.
Und danke an alle!

alex517 30. Mär 2009 18:50

Re: dbgrid aktuelle Zeile im dbGrind färben
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,

Delphi-Quellcode:
type
  // kleiner Trick um an die aktuelle Row heranzukommen.
  TDBGrid = class(DBGrids.TDBGrid)
  public
    property Row;
  end;

  TForm1 = class(TForm)
    MyDBGrid: TDBGrid;

.....
    procedure MyDBGridDrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.MyDBGridDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if (State * [gdFocused, gdSelected] = []) then
  begin
    if MyDBGrid.Row = MyDBGrid.MouseCoord(Rect.Left, Rect.Top).Y then
    begin
      // aktuelle Zeile
      MyDBGrid.Canvas.Brush.Color := clAqua;
      MyDBGrid.Canvas.Font.Color := clWindowText;
    end else
      if MyDBGrid.SelectedRows.IndexOf(MyDBGrid.DataSource.DataSet.Bookmark) >= 0 then
      begin
        // alle selektierten Zeilen
        MyDBGrid.Canvas.Brush.Color := clHighlight;
        MyDBGrid.Canvas.Font.Color := clWindowText;
      end else
      begin
        // alle anderen Zeilen
        if (MyDBGrid.DataSource.DataSet.RecNo mod 2) = 0 then
          MyDBGrid.Canvas.Brush.Color := clInfoBk
        else
          MyDBGrid.Canvas.Brush.Color := clWindow;
        MyDBGrid.Canvas.Font.Color := clWindowText;
      end;
  end;
  MyDBGrid.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
sieht dann so aus wie im Anhang.

alex

alex517 30. Mär 2009 19:32

Re: dbgrid aktuelle Zeile im dbGrind färben
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hier nochmal das ganze Project (für D7) mit Scrollrad.
alex

Andreas Nord 31. Mär 2009 09:43

Re: dbgrid aktuelle Zeile im dbGrind färben
 
Vielen Dank, bin mit meiner Lösung doch zu frieden. Musste halt ne Nacht drüber schlafen.
Find es halt schade, das beim dbgrid so ohnen weiteres nicht möglich die aktuelle Zeile hervorzuheben
und ich denke, dass ich nicht der einzige mit diesem wunsch bin!

Dank noch mal an alle. :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:10 Uhr.

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