![]() |
Problem mit TDBAdvGrid (TMS)
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:
Erläuterung: Die Routine FieldsToRec kopiert aus TField einen Datensatz in ein Record.
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; Mein Versuch mit dem TDBAdvGrid von TMS sieht fast identisch aus:
Delphi-Quellcode:
Leider kommt es hier zu einem merkwürdigen Effekt:
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; 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. |
AW: Problem mit TDBAdvGrid (TMS)
Das funktioniert beim TMS DBGrid so nicht. Das Grid hat in den Events keinen "Cursor" zum Datensatz.
Du kannst dort also nicht auf das Query zugreifen wie es bei anderen Grids möglich ist. So musst du die Werte/Spalten die du z.B für Berechnungen o.ä brauchst im Grid ablegen und die Daten von dort holen. Also die Spalte ORT hinzufügen. Wenn du die Spalte nicht brauchst, schaltest du sie mit grid.HideColumn weg.
Delphi-Quellcode:
Da ich neugierig bin, was soll das eigentlich werden? :wink:
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 S:= Grid.Cells[Grid.ColumnByFieldName['PLZ'].Index, ARow] + ' ' + Grid.Cells[Grid.ColumnByFieldName['ORT'].Index, ARow]; Grid.Canvas.TextOut(Rect.Left+2,Rect.Top+2,S); end; end; |
AW: Problem mit TDBAdvGrid (TMS)
Hallo Chris,
herzlichen Dank für Deine Antwort! Ich hatte mir schon fast gedacht, dass das nicht funktioniert; hatte aber noch auf einen Fehler meinerseits gehofft. Dass Ersatzkomponenten von Drittanbietern nicht die (Basis-) Funktionalität der Komponenten, die sie ersetzen sollen haben, ist irgendwie unschön. Was das werden soll? Ich überarbeite gerade ein größeres Projekt (wobei ich nicht genau weiß, ab wann ein Projekt ein größers ist) und stelle dabei von Delphi 2010 auf 10.2 um. Es handelt sich um eine Behördenanwendung im DOI-Netz und läuft lokal mit SQL-Server und Oracle (Oracle fliegt aber wahrscheinlich raus). Mit den DBGrids werden verschiedenste Datenauswahlfenster realisiert. Nun werde ich mal sehen, ob ich gewillt bin, die Geschichte so umzubauen, dass sie mit dem TMS-Grid funktioniert. Gruß Michael |
AW: Problem mit TDBAdvGrid (TMS)
Hallo,
ich benutzte aus diesem Grid das DB-Grid von TMS nicht, sondern das ganz "normale" TAdvStringGrid mit Grid.Objects zum Halten der Objekte.. Genauer: An einer Stelle benutzt es ein Kollege und genau dort ärgere ich mich noch mit rum. |
AW: Problem mit TDBAdvGrid (TMS)
"Was soll das werden"
Damit meinte ich nicht was die Anwendung macht, sondern eher was du da versuchst. In einer Zelle 2 DB Spalten anzuzeigen geht einfacher. Überlass das z.B der Datenbank (concat_ws z.B) Mich hat das "Grid.Canvas.TextOut" gewundert. Warum zeichnest du selbst? Im Event OnGetText tuts Grid.Cells[c,r] := 'foobar' genau so gut. Die Masse an Ereignissen wollte anfangs das Geld zurück, langsam schätze ich das Grid (und auch den Support) TMS macht "fast" alles anders als die normalen Komponenten. Dafür bieten sich viele Möglichkeiten, allerdings auch hürden. Objekte im Grid zu halten finde ich in den meisten fällen unnötig. Klärt mich auf. Braucht man das? |
AW: Problem mit TDBAdvGrid (TMS)
Hallo,
Zitat:
Vor dem Füllen des Grids wird eine Liste von Objekten gefüllt incl. des Objektes selbst, und ein Teil der Objektdaten im Grid angezeigt. Beim Ändern brauche ich aber die DBId, die höole ich mir dann aus dem Objekt. PS: Früher hatte ich auch immer die Id als versteckte Spalte mit eingetragen, Objects ist aber einfacher. |
AW: Problem mit TDBAdvGrid (TMS)
Wenn es nur um die Id geht, ist das nicht einfacher.
Bei mehreren Spalten die später nicht sichtbar sein sollen mag das sein. In manchen fällen ist dann ein DBAdvGrid besser. Wenn dann Sachen wie Gruppierung oder die interne Sortierung von nöten sind, dann einfach den PageMode umstellen. Einen Zeiger auf die Datenbank bekommt man bei OnSelectCell mit einem Locate auf das Dataset. |
AW: Problem mit TDBAdvGrid (TMS)
Zitat:
Zitat:
Zitat:
Ich kann also nicht abfragen, ob die aktuelle Spalte 'PLZ' ist und dann die Plz in Value zurückgeben, vom dahinterliegenden ORT ganz zu schweigen. Zitat:
So, nun steh ich kurz davor, es hoika gleichzutun, und das 'einfache' AdvStringGrid einzusetzen... Vielen Dank für Eure Postings! :thumb: Gruß Michael |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:02 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