![]() |
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:
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:
//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;
Delphi-Quellcode:
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?
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:30 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