Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi DisplayFormat während der Laufzeit zuweisen (https://www.delphipraxis.net/2477-displayformat-waehrend-der-laufzeit-zuweisen.html)

eddy 25. Jan 2003 13:03


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:
  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;
Wahrscheinlich kein Problem, wenn man weiß, wie's geht.

Vielen Dank für jeden brauchbaren Tip im Voraus.

mfg
eddy

xbu58 26. Jan 2003 12:04

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:
  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;
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!

Gruss
Xaver

eddy 27. Jan 2003 15:55

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:
  TabArtBestand.DisplayFormat := '#,##0.0000';
während der Laufzeit fehlerfrei.

Solltest Du, oder ein anderer Delphi-Wissender, noch eine Idee haben, dann bitte her damit!

mfg
eddy

xbu58 27. Jan 2003 18:08

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:
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;
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:
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

eddy 27. Jan 2003 20:28

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 02:04 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