![]() |
DisplayFormat während der Laufzeit zuweisen
Hallo Leute,
ich habe einen Datenbank-Betrachter (mit diversen Zusatzfunktionen), in dem Paradox-Datenbanken in einer Tab1 : TTable einzeln geöffnet werden können. Die Anzeige erfolgt in dbg1 : TDBGrid Klappt alles super, nur ist es mir bis zum heutigen Zeitpunkt nicht gelungen, den Felder bzw. Tabellen-Spalten, die vom Typ Float sind, während der Laufzeit ein DisplayFormat zuzuweisen. (In Tabellen mit vorher bekannter Datenstruktur zur Entwurfzeit das DisplayFormat im OI zuzuweisen ist kein Problem.) Mir schwebt da etwas in der nachfolgend skizzierten Form vor:
Delphi-Quellcode:
Wahrscheinlich kein Problem, wenn man weiß, wie's geht.
for i := 0 to Tab1.FieldCount - 1 do begin
if Tab1.FieldDefs.Items[i].DataType = ftFloat then begin s := Tab1.FieldDefs.Items[i].Name; // DisplayFormat von diesem DB-Feld := '#,##0.00'; end; end; Vielen Dank für jeden brauchbaren Tip im Voraus. mfg eddy |
Hallo Eddy
Da DisplayFormat nicht im TField vorhanden ist, musst Du die Class-Instance zuerst "Casten". Dafür musst Du den Class-Type feststellen, wie Du das ja schon gemacht hast. Besser wäre jedoch, wenn Du anstelle von if mit case arbeiten würdest, da Du ev. auch noch andere Felder einbeziehen möchtest z.B Datum. So sieht es aus:
Code:
Achtung: Diese Cast-Methode umgeht die Kontrolle des Compilers. Er kann also nicht feststellen, ob die beiden Klassen zuweisungskompatibel sind. Du musst also selber sicherstellen, dass das der Fall ist!
for i := 0 to Tab1.FieldCount - 1 do
begin case Tab1.FieldDefs.Items[i].DataType of ftFloat : TFloatField(Tab1.FieldDefs.Items[i]).DisplayFormat := '#,##0.00'; end; end; Gruss Xaver |
Hallo Xaver,
vielen Dank für Deinen Tip. Natürlich habe ich es gleich ausprobiert, aber ich kriege immer nur die Fehlermeldung: Exception der Klasse EAccessViolation ist aufgetreten. Um irgendwelche Format-Fehler auszuschließen, habe ich eine Tabelle mit den bereits im OI definierten Objekten TabArtInvBestand und TabArtBestand vom Typ TFloatField verwendet. Die Fehlermeldung war identisch.
Delphi-Quellcode:
for i := 0 to TabArt.FieldCount - 1 do begin
s := TabArt.FieldDefs.Items[i].Name; if s = 'Bestand' then begin case TabArt.FieldDefs.Items[i].DataType of ftFloat : begin TFloatField(TabArt.FieldDefs.Items[i]).DisplayFormat := TabArtInvBestand.DisplayFormat; // TFloatField(TabArt.FieldDefs.Items[i]).DisplayFormat := '#,##0.00'; end; end; end; end; Definiere ich im OI TabArtBestand ist auch die Zuweisung:
Delphi-Quellcode:
während der Laufzeit fehlerfrei.
TabArtBestand.DisplayFormat := '#,##0.0000';
Solltest Du, oder ein anderer Delphi-Wissender, noch eine Idee haben, dann bitte her damit! mfg eddy |
Hallo Eddy
Ist mein Fehler, dass ich Deine Source zuwenig genau angesehen habe. :? Die Daten werden natürlich nicht in FieldDefs zurückgegeben, sondern in Fields! Also folgender Code habe ich getestet und der hat funktioniert:
Code:
xFld musst Du natürlich nicht unbedingt definieren. Kannst an dessen Stelle auch einfach Table1.Fields[xInd] einsetzen. Ich definiere jedoch meistens eine lokale Variable für solche Sachen, was zwei Vorteile hat:
var
xInd : integer; xFld : TField; begin for xInd := 0 to Table1.Fields.Count-1 do begin xFld := Table1.Fields[xInd]; case xFld.DataType of ftFloat : TFloatField(xFld).DisplayFormat := '#,##0.000'; end; end; Erstens ist das Auslesen aus der Liste etwas langsamer als das einmalige übergeben an eine Variable, wenn diese Variable mehrmals benötigt wird. Und zweitens kannst Du im Debugger besser die Werte prüfen. Gruss Xaver |
Hallo Xaver,
vielen Dank für die Korrektur. Klappt jetzt super, ich bin ein schon lange vor mich hingeschobenes Problem los. Was die Variablen betrifft handle ich ebenso, alles was öfter als ein Mal benötigt wird, landet in einer Variable und beim Testen kann man sehen, ob auch das 'drin steht was man erwartet. mfg eddy |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:34 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