AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi DisplayFormat während der Laufzeit zuweisen
Thema durchsuchen
Ansicht
Themen-Optionen

DisplayFormat während der Laufzeit zuweisen

Ein Thema von eddy · begonnen am 25. Jan 2003 · letzter Beitrag vom 27. Jan 2003
Antwort Antwort
Benutzerbild von eddy
eddy

Registriert seit: 4. Jan 2003
Ort: Sachsen
573 Beiträge
 
Delphi 5 Professional
 
#1

DisplayFormat während der Laufzeit zuweisen

  Alt 25. Jan 2003, 14:03
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
  Mit Zitat antworten Zitat
xbu58

Registriert seit: 10. Dez 2002
Ort: Bäretswil / Schweiz
121 Beiträge
 
Delphi 7 Enterprise
 
#2
  Alt 26. Jan 2003, 13: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
  Mit Zitat antworten Zitat
Benutzerbild von eddy
eddy

Registriert seit: 4. Jan 2003
Ort: Sachsen
573 Beiträge
 
Delphi 5 Professional
 
#3
  Alt 27. Jan 2003, 16: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 = 'Bestandthen 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:

  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
  Mit Zitat antworten Zitat
xbu58

Registriert seit: 10. Dez 2002
Ort: Bäretswil / Schweiz
121 Beiträge
 
Delphi 7 Enterprise
 
#4
  Alt 27. Jan 2003, 19: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
  Mit Zitat antworten Zitat
Benutzerbild von eddy
eddy

Registriert seit: 4. Jan 2003
Ort: Sachsen
573 Beiträge
 
Delphi 5 Professional
 
#5
  Alt 27. Jan 2003, 21: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
  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 14:49 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