AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit TDBAdvGrid (TMS)

Ein Thema von EmWieMichael · begonnen am 13. Feb 2019 · letzter Beitrag vom 14. Feb 2019
Antwort Antwort
EmWieMichael

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

Problem mit TDBAdvGrid (TMS)

  Alt 13. Feb 2019, 13: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
hhcm

Registriert seit: 12. Feb 2006
Ort: Wegberg
310 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Problem mit TDBAdvGrid (TMS)

  Alt 13. Feb 2019, 14:15
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:
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;
Da ich neugierig bin, was soll das eigentlich werden?
Chris
  Mit Zitat antworten Zitat
EmWieMichael

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

AW: Problem mit TDBAdvGrid (TMS)

  Alt 13. Feb 2019, 16:31
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
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Problem mit TDBAdvGrid (TMS)

  Alt 13. Feb 2019, 17:07
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.
Heiko

Geändert von hoika (13. Feb 2019 um 17:32 Uhr)
  Mit Zitat antworten Zitat
hhcm

Registriert seit: 12. Feb 2006
Ort: Wegberg
310 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Problem mit TDBAdvGrid (TMS)

  Alt 13. Feb 2019, 20:12
"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?
Chris
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Problem mit TDBAdvGrid (TMS)

  Alt 14. Feb 2019, 07:44
Hallo,
Zitat:
Objekte im Grid
Es wird z.B. nicht alles angezeigt, z.B. die interne Datenbank-Id (DBId).
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.
Heiko
  Mit Zitat antworten Zitat
hhcm

Registriert seit: 12. Feb 2006
Ort: Wegberg
310 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Problem mit TDBAdvGrid (TMS)

  Alt 14. Feb 2019, 08:11
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.
Chris
  Mit Zitat antworten Zitat
EmWieMichael

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

AW: Problem mit TDBAdvGrid (TMS)

  Alt 14. Feb 2019, 15:31
In einer Zelle 2 DB Spalten anzuzeigen geht einfacher. Überlass das z.B der Datenbank (concat_ws z.B)
Das ist durchaus eine Alternative; funktioniert aber nur, wenn auch sämtliche benötigten Daten auch in den Tabellen der Datenbank vorhanden sind. Das ist in meinem Fall nicht immer so. Aber bei einigen Abfragen könnte ich das durchaus umsetzen. Danke für die Anregung!

Zitat:
Mich hat das "Grid.Canvas.TextOut" gewundert. Warum zeichnest du selbst?
Macht der Gewohnheit; TDBGrid bietet nichts anderes und hat die letzten zehn Jahre prima funktioniert. Mit den TMS-Komponenten arbeite (besser: forsche) ich erst seit wenigen Tagen.

Zitat:
Im Event OnGetText tuts Grid.Cells[c,r] := 'foobar' genau so gut.
Ich habe das gerade mal mit OnGetDisplText (OnGetText gibt es bei meiner Version nicht) versucht. Das scheint aber nur dann zu funktionieren, wenn man auf Zellen zugreift, die vor der aktuellen Zelle liegen.
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:
Objekte im Grid zu halten finde ich in den meisten fällen unnötig. Klärt mich auf. Braucht man das?
Ich habe das bisher so gehandhabt, dass ich in einem kleinen Recordtyp interne Satznummern in der Grid-Objektliste gesichert habe. Wählt der Anwender einen Eintrag (Zeile) aus, können anhand der Satznummern die Datensätze gelesen werden. Mit dem TMS-Grid geht das natürlich auch mit den Hidden-Columns.

So, nun steh ich kurz davor, es hoika gleichzutun, und das 'einfache' AdvStringGrid einzusetzen...

Vielen Dank für Eure Postings!

Gruß Michael
  Mit Zitat antworten Zitat
Antwort Antwort


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 03:35 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz