![]() |
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. |
Hallo MrSpock!!
Also hab ich das jetzt richtig verstanden... 1. Ich habe meine Tabelle MyTable in der Oberfläche und die ist ja die auf die ich mich in meiner Anwendung beziehe. 2. Ich lege ne zweite Tabelle SampleTable an und stell in dieser die Felder und z.B.: OnGetText Methoden ein 3. Beim starten der Anwendung bekommt 'SampleTable.name' den Namen 'MyTable' und ich führe danach ein MyTable.CreateTable aus in der Hoffnung alles übernehmen zu können? Ist das richtig? Irgendwie hab ich wohl dennoch was falsch gemacht oder noch nich verstanden. Bekomme zu oft Fehler :) Könntest Du's vielleicht bestätigen, ich mein ob ich' gerafft hab? Ansonsten wär'n Bsp recht hilfreich. Danke :D |
Hallo Fischli80,
nein, ist nicht ganz richtig :mrgreen: . Du doppelklickst direkt MyTable (kein zweites TTable Objekt notwendig) und fügst die Felder dieser Tabelle deiner Anwendung hinzu. Der Spalte oder den Spalten, deren Anzeige du verändern möchtest weist du im Ereignis OnGetText den Code zu, der die Anzeige nach deinen Wünschen anpasst. Klickt der Benutzer jetzt auf "Neue Tabelle", machst du folgendes:
Delphi-Quellcode:
Du solltest noch prüfen, ob die Tabelle mit dem neuen Namen bereits existiert und ggf. fragen, ob sie überschrieben werden soll. Die neue Tabelle hat jetzt die gleiche Struktur, wie die alte, aber einen neuen Namen. Die persistenten Felder und deren Format Einstellungen werden automatisch korrekt zugeordnet.
if MyTable.Active then
MyTable.Close; MyTable.TableName := Edit1.Text; { oder wie auch immer du den Namen ermittelst } MyTable.CreateTable; { Jetzt kannst du die Tabelle noch öffnen, wenn du willst } |
Ok...also ic glaub jetzt hab ich's
Ich habe mein TTable Objekt in der Delphi Umgebung und da gehe ich in den Feldeditor und lasse all die Spalten meiner Tabelle hinzufügen. Dann verändere ich die Spalten, welche ich benutzen möchte, sei es OnGetText o.ä. Und wenn ich nun eine Tabelle öffne oder besonders wenn ich eine neue anlege, dann darf ich keine FieldDefs mehr vornehmen, sondern nur noch wie Du beschrieben hast den neuen Namen zuweisen. Dabei sollte ja noch nichmal ein Unterschied bestehen ob ich neu anlege oder öffne oder? Ich hoffe das ich das richtig verstanden habe und werde es probieren wenn ich über die Tage wieder Zeit finde und mein Ergebnis posten. Wenn Du (MrSpock) oder sonst noch jemand nen Kommentar hat, ruhig posten, da ich mir das zwar die nächsten Tage durchlesen kann, aber leider nich an mein Delphi rankommme :) Ansonsten wünsche ich Euch allen frohe Weihnachtsfeiertage und nen guten Rutsch ins Jahr 2003!!!!! :D |
Hallo Fischli80,
genauso ist es. Es gibt keinen Unterschied bezüglich der persistenten Felder zwischen Öffnen und Anlegen einer neuen Tabelle. Meld dich, wenn es nicht klappen sollte... Aber auch wenn geklappt :mrgreen: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:27 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