AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi dbgrid Zeilen färben anhand von calcfields

dbgrid Zeilen färben anhand von calcfields

Ein Thema von Panschi · begonnen am 4. Okt 2011
Antwort Antwort
Benutzerbild von Panschi
Panschi

Registriert seit: 30. Aug 2011
Ort: Sauerland
51 Beiträge
 
Delphi XE2 Enterprise
 
#1

dbgrid Zeilen färben anhand von calcfields

  Alt 4. Okt 2011, 13:06
Datenbank: MSQL • Version: 2005 • Zugriff über: ADO
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?
Warum mögen Frauen OOP-Programmierer? Weil sie Klasse haben

Geändert von Panschi ( 4. Okt 2011 um 13:59 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:36 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf