![]() |
Anzeige der Felder im DBGrid verändern
Hallo zusammen!!
Ich möchte gerne in einem DBGrid, was sich auf eine Paradox Datenbank bezieht, die Darstellung der Felder ändern. Ich mein damit die Zellen und nicht die Titelfelder. Und zwar steht in der Datenbank immer ein Wert zwischen 0 und 3 und ich will je nachdem welcher Wert das ist, dass in der Spalte dann ein entsprechender String steht. Aber wie kann ich das machen? Oder muß ich die Datenbank ändern?? Doch wohl eher nich hoff ich!! :oops: Wär's ne Möglichkeit irgendwie ne Art Alias-Spalte einzufügen? Aber wie koordiniere ich den Abgleich?? Vielen Dank an Jeden der sich die Zeit nimmt dies zu lesen :) |
Hallo Fischli80,
dazu kannst du das Event OnGetText des TFiled-Objektes verwenden. Dort weist du dem Parameter Text den Wert zu, der angezeigt werden soll:
Delphi-Quellcode:
case Table1FeldMitWert1bis3.AsInteger of
1: Text := 'Eins'; 2: Text := 'Zwei'; 3: Text := 'Drei' else Text := 'Schrott'; end; DisplayText := True; |
Hmm...klingt soweit gut :)
Ich weiß zwar nich ob es an der fortgeschrittenen Stunde liegt, aber ich weiß nich so ganz an welche Stelle Deine Implementation rein muss. Ich meine Du erwähntest das TField Objekt. Ist sicherlich die Spalte oder? Aber wo genau mach ich das? Ich meine ich kann über den Objekt-Inspektor auf die Properties des DBGrid zugreifen aber die der Spalten? Und wahrscheinlich muß dass ja mit den AfterPost bzw AfterEdit Properties von der TTable im Zusammenhang stehen oder? :? Trotzdem schonmal vielen Dank!!! |
Hallöle,
Du kannst doch mal vrsuchen in der Object Hierarchie nach den einzelnen Spalten suchen, wenn Du eine Markiert hast, schaust dann wieder im Object Inspector unter Eigenschaften. Da müsste irgendwo OnGetText stehen. Da machst DU ein Doppelklick drauf und da kommt dann der Code rein. Grüsse, Daniel :hi: |
Ja schon klar :)
Aber leider kann ich nicht über den Objektinspektor auf die Spalten einer DBGrid zugreifen um deren Methoden oder Ereignisse zu verändern. Ich hab nur Zugriff auf die Eigenschaften des ganzen DBGrid und da kann ich die OnGetText Methode nich definieren. Ich müsste dass schon igendwie zur Laufzeit machen. Der Tip von MrSpock klingt ja vielversprechend, ich weiß nur nich wo ich ihn genau implementieren soll :( |
Hallo Fischli80,
das OnGetText gehört auch nicht zum Grid, sondern zu der zugrundeliegenden Tabelle/Abfrage. Wenn du die Tabelle doppelklickst, öffnet sich der Feldeditor. Durch Rechtsklick fügst du einzelne oder alle Felder hinzu. Wenn du dann ein bestimmtes Feld anklickst, zeigt der Objektinspektor das entsprechende Feld an. Dort findest du dann dan OnGetText Ereignis. |
Sorry das ich so lang nich reagiert hab!!
Also die Idee von MrSpock ist schon okay. Funzt nur nich bei mir. Und zwar beschwert sich Delphi zur Laufzeit, dass ein Spaltenfeld der Tabelle nich existiert, welches ich anspreche. Ich erzeuge nämlich die Felder der Tabelle immer manuell beim laden bzw anlegen einer Datenbank. Und wenn ich dass schon in der Entwicklungsumgebung mache, dann klappts nich. Selbst wenn ich die jeweilige Spalte nich manuell anlegen lasse, sondern nur im Feldeditor einfüge. Das harmoniert einfach nich :( Wie kann ich das ändern, falls jemand mein wirrwarr noch durchblickt :) |
Hallo Fischli80,
:wiejetzt: wie war das im Mittelteil? Kannst du einmal beschreiben, was du genau machst? Öffnest oder erzeugst du mit deinem Programm verschiedene Tabellen mit unterschiedlichen Strukturen, die zur Programmerstellung noch unbekannt sind? Falls ja, d.h. du kennst die Struktur nicht, was genau willst du dann in der Darstellung von welchen Feldern ändern? |
Also.....
Ich verwalte eine Paradox Datenbank, welche aus zwei Tabellen besteht. Also noch recht überschaubar das Ganze. Ich binde meine Tabelle immer zur Laufzeit ein, nachdem über einen Dialog entweder eine existierende Tabelle gewählt wurde, oder der User eine neue anlegen läßt. :coder: Als erstes lege ich die Tabelle abstrakt an:
Code:
Dann kommen die Index-Definitionen für die Spalten:with Form1.MyTable do begin active:=false; DatabaseName:=dBname; // wird nach Auswahldialog übergeben TableName:='media.db'; TableType:=ttParadox; with FieldDefs do begin clear; Add('ColID', ftAutoInc, 0, false); Add('Col1', ftString, 30, false); Add('Col2', ftString, 30, false); end; end;
Code:
Und nun wird die Tabelle erzeugt:with Form1.MyTable.IndexDefs do begin Add ('', 'ColID', [ixPrimary]); Add ('Col1', 'Col1', [ixCaseInsensitive]); Add ('Col2', 'Col2', [ixCaseInsensitive]); end; Form1.MyTable.IndexName := Form1.MyTable.IndexDefs.Items[1].Name;
Code:
Beim öffnen einer existierenden Datenbank wird natürlich kein Create gebraucht und auch sonst werden die FieldDefs natürlich nich gemacht, da die Tabelle die ja schon hat.CreateTable; Sooo......lange Rede kurzer Sinn....ich möchte nun im eigentlichen nur in meinem DBGrid, welches meine Table darstellt, eine Spalte haben, in welcher die Werte anders dargestellt werden als sie in der Tabelle sind. Also entweder ne neue Spalte welche dann halt immer ne Art:
Code:
...macht. Oder halt dass die Originalspalte das von alleine schafft.Case Col[i].Value Of 0: Col[2].Value := "Typ A" 1: Col[2].Value := "Typ B" 2: Col[2].Value := "Typ C" else Col[2].Value := "Typ unbekannt" end; In diese Szenario ist mein Feldeditor also leer, da die FieldDefs erst zur Laufzeit kommen. Aber auf deren OnGetText Property kann ich nich zugreifen in meiner Entwicklungsphase. Und wenn ich die FieldDefs im Feldeditor erstellen lasse, dann meckert Delphi nur noch rum, sobald er halt selber die FieldDefs zur Laufzeit anlegen will. Unterlass ich das nochmalige anlegen, sagt er mir dass er die Felder nich findet. Iss irgendwie verzwackt :) Ich hoffe das diese epische Breite mein Problem richtig erläutert :oops: Aber ich habe dass Gefühl das Ihr da draussen ganz helle Köpfe seit und mir helfen könnt. Insbesondere MrSpock :lol: Tschüssie 8) |
Hallo Fischli80,
wenn die Struktur der Tabelle immer gleich ist, gibt es eine einfache Lösung. Du erstellst eine "Beispieltabelle" über die Datenbankoberfläche, fügst die Felder der Tabelle über den Feldeditor des TTable Objects in deine Anwendung ein, fügst der OnGetText Methode den Code hinzu, der für die Anzeige die Ersetzung durchführt. Beim Anlegen einer neuen Tabelle, machst du jetzt nicht anderes, als dem bestehenden TTable Object einen neuen TableName zuzuweisen und anschließend die Methode CreateTable dieses TTable Objects aufzurufen. Die Einstellungen werden aufgrund derselben Struktur alle übernommen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:51 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