Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi dbgrid Zeilen färben anhand von calcfields (https://www.delphipraxis.net/163558-dbgrid-zeilen-faerben-anhand-von-calcfields.html)

Panschi 4. Okt 2011 13:06

Datenbank: MSQL • Version: 2005 • Zugriff über: ADO

dbgrid Zeilen färben anhand von calcfields
 
Hallo Forum,
Ich habe mal wieder ein Problem mit meinem dbGrid. Wie in einem anderen Thema von mir bereits beschrieben, habe ich 2 Datenbanken, welche ich in dbGrids gegenüberstelle. Die eine DAtenbank heißt Master, die andere Slave. Die Zellen in der Slave sollen dann anhand der Mastervorgabe verändert werden... schön und gut soweit. Klappt auch eigentlich. Nur habe ich ein grafisches Problem:
Zellen die gleich sind sollen in der Slave weiß, Zellen die in der Slave vorhanden sind, jedoch in der Master nicht(sprich gelöscht werden müssen) sollen rot und die in denen der string geändert werden muss sollen gelb dargestellt werden.
Die Farben sollen mit einem berechnenden Feld unterschieden werden: 0 = weiß, 1 = gelb, 2 = rot.

Bis jetzt realisiere ich das folgendermaßen:
Delphi-Quellcode:
          //herausfiltern welche Zellen wie gefärbt werden müssen
procedure TFMain.QrySlaveCalcFields(DataSet: TDataSet);
begin
      //Description vergleichen
  if QryMaster.FieldByName('Description').Value
   <> QrySlave.FieldByName('Description').Value then
  begin
    if QryMaster.FieldByName('Description').Value = '' then
    begin
      QrySlaveVeraendert.Value := 2;  // 2 = löschen
    end
    else begin
      QrySlaveVeraendert.Value := 1;  // 1 = hinzufügen/ändern
    end;
  end
  else begin
    QrySlaveVeraendert.Value := 0;    //0 = gleichbleibend
  end;

  if QryMaster.Eof = false then
  begin
    QryMaster.Next;
  end;
end;


procedure TFMain.dbgSlaveDrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
var Farbe: TColor;

begin
  case QrySlaveVeraendert.Value of
    0: Farbe := clWhite;
    1: Farbe := TColor($00B0FFFF);
    2: Farbe := TColor($00A69EFF);
  end;

    //Hintergrundfarbe
    TDBGrid(Sender).Canvas.Brush.Color:=Farbe;
    TDBGrid(Sender).Canvas.Brush.Style:=bsSolid;
    TDBGrid(Sender).Canvas.Pen.Style:=psclear;
    TDBGrid(Sender).Canvas.FillRect(Rect);

    //Text
    TDBGrid(Sender).Canvas.Pen.Style:=psSolid;
    TDBGrid(Sender).Canvas.Pen.Color:=clBlack;
    TDBGrid(Sender).DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
Dieser Code klappt solange, bis ich die Form verkleiner/vergrößer und Calcfields noch einmal aufgerufen wird. Dann wird der DAtensatz auf den QueryMaster zeigt nämlich nicht auf den ersten gesetzt, sondern bleibt hinten, wodurch ein durcheinandern an Farben entstehen kann, je nach Datenbanken. Nun habe ich versucht ,die calcfields-Variante nur einmal aufzurufen, nämlich nur dann wenn das Query geöffnet wird. Dazu habe ich diesen Code geschrieben:
Delphi-Quellcode:
procedure TFMain.QrySlaveAfterOpen(DataSet: TDataSet);
begin
 QryMaster.First;
 QrySlave.First;

  while not QryMaster.Eof do
  begin
    QrySlave.Edit;
         //Description vergleichen
    if QryMaster.FieldByName('Description').Value
     <> QrySlave.FieldByName('Description').Value then
    begin
      if QryMaster.FieldByName('Description').Value = '' then
      begin
        QrySlaveVeraendert.Value := 2;  // 2 = löschen
      end
      else begin
        QrySlaveVeraendert.Value := 1;  // 1 = hinzufügen/ändern
      end;
    end
    else begin
      QrySlaveVeraendert.Value := 0;    //0 = gleichbleibend
    end;
    QrySlave.Post;
    QryMaster.Next;
    QrySlave.Next;
  end;
end;
nun wird aber 1. dbgSlaveDrawColumnCell vor QrySlaveAfterOpen ausgeführt, womit die Tabelle komplett weiß bleibt und 2. wird laut Breakpoint-Kontrolle die Methode QrySlaveAfterOpen durchlaufen und die werte anscheinend auch gesetzt, aber später in der Tabelle nicht angezeigt... Hat jemand einen Tipp für mich?


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:31 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