Einzelnen Beitrag anzeigen

EmWieMichael

Registriert seit: 28. Mär 2012
103 Beiträge
 
#1

Problem mit TDBAdvGrid (TMS)

  Alt 13. Feb 2019, 12:30
Moin!

Der Einsatz des TDBAdvGrid von TMS bereitet mir seit zwei Tagen Kopfzerbrechen. Vielleicht hat hier schon jemand nicht nur das gleiche Problem, sondern auch eine Lösung dafür gehabt.
Es geht um die 'manuelle' Darstellung einzelner Zellen. Im folgenden Beispiel soll in der Zelle des Tabellenfeldes 'PLZ' nicht nur die Plz, sondern auch der Ort angezeigt werden.

Unter Verwendung eines (Delphi-) TDBGrid funktioniert das einwandfrei, z. B. so:
Delphi-Quellcode:
procedure TForm1.GridDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer;
                                    Column: TColumn; State: TGridDrawState);
 var S:String; Adresse:TAdresse;
begin
  if (Column.FieldName = 'PLZ') then
   begin
     Grid.Canvas.FillRect(Rect);
     FieldsToRec(Query.Fields, Adresse, dbAdresse);
     S:=Adresse.Plz+' '+Adresse.Ort;
     Grid.Canvas.TextOut(Rect.Left+2,Rect.Top+2,S);
   end;
end;
Erläuterung: Die Routine FieldsToRec kopiert aus TField einen Datensatz in ein Record.

Mein Versuch mit dem TDBAdvGrid von TMS sieht fast identisch aus:
Delphi-Quellcode:
procedure TBrowseForm.GridDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
 var S:String; Adresse:TAdresse;
begin
  if (Grid.Columns[ACol].FieldName = 'PLZ') then
   begin
     Grid.Canvas.FillRect(Rect);
     FieldsToRec(Query.Fields, Adresse, dbAdresse);
     S:=Adresse.Plz+' '+Adresse.Ort;
     Grid.Canvas.TextOut(Rect.Left+2,Rect.Top+2,S);
   end;
end;
Leider kommt es hier zu einem merkwürdigen Effekt:
Im Grid erhalten alle Datensätze Plz und Ort des ersten Satzes. Das lässt sich auch anschließend gut nachvollziehen:
Stellt man den Auswahlcursor z. B. von der zweiten auf die fünfte Zeile, wird in der fünften Zeile die korrekte Plz/Ort-Kombi angezeigt, leider wird dann der gleiche String auch in der zweiten Zeile abgebildet; dabei wird OnDrawCell nur einmal abgefeuert.
Der Parameter 'State' ist übrigens stets leer.
  Mit Zitat antworten Zitat