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?