Gelöst: TMemdataset Feldformat und TDBGrid

Rund um die LCL und andere Komponenten
Antworten
charlytango
Beiträge: 843
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Gelöst: TMemdataset Feldformat und TDBGrid

Beitrag von charlytango »

Hi

Mittels TMemdataset wird eine Tabelle erstellt und in einem TDBGrid zum Editieren angezeigt.

Für eine der Tabellenspalten suche ich ein passendes Format das mir einen Dezimalwert (Wie DEZIMAL 5,2 von MariaDB oder MySQL) anzeigt.
TMemdataset scheint keinen entsprechenden TFieldType für Dezimalwerte zu haben (Unit DB Zeile 106, TFieldType). ftCurrency wäre in etwa das was ich suche (mit mehr Nachkommastellen allerdings) nur wird dann ein Währungszeichen angezeigt.

Mein Workaround war ftFloat als FieldType zu nehmen und der Felddefinition auch eine Editmask (EditMask:='0,000';) mitzugeben damit diese im Grid übernommen wird.

Klappt auch, aber die Editmask verhält sich aus meiner Sicht "komisch" denn einfach zb 1 (eins) als Zahl einzugeben und dann ENTER oder TAB zu drücken um das Feld zu verlassen geht nicht. Man muss scheinbar die volle Editmask ausfüllen (1,00).
Ich sehe da schon Fragen aus Benutzersicht auf mich zukommen -- geht das irgendwie anders?
Eleganter und smoother aus Benutzersicht?

Beispielprojekt liegt bei -- THX
Dateianhänge
project1.zip
Beispielprojekt
(126.13 KiB) 86-mal heruntergeladen
Zuletzt geändert von charlytango am Fr 22. Jan 2021, 11:19, insgesamt 1-mal geändert.

Benutzeravatar
gladio
Beiträge: 217
Registriert: Sa 21. Jun 2014, 06:15
OS, Lazarus, FPC: Win10-64 - aktuelle Lazarus/FPC Standard-Edition
CPU-Target: 64Bit
Wohnort: Rügen

Re: TMemdataset Feldformat und TDBGrid

Beitrag von gladio »

Hast du mal andere EditMask ausprobiert?
https://wiki.freepascal.org/TMaskEdit

charlytango
Beiträge: 843
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: TMemdataset Feldformat und TDBGrid

Beitrag von charlytango »

Danke, der Tip hat schon etwas geholfen. Die EditMask '0,999' hat schon sehr geholfen.
Noch andere Vorschläge?

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: TMemdataset Feldformat und TDBGrid

Beitrag von wp_xyz »

DisplayFormat? Du musst allerdings das Feld nach TFloatField casten:

Code: Alles auswählen

  with TFloatField(mdsTemplate.FieldByName('Anzahl')) do
   begin
     DisplayLabel := 'Anzahl';
     ReadOnly := False;
     Visible := True;
     DisplayWidth := 10;
     DisplayFormat := '0.000';   // <---------------- HIER

     //POS2   hier ist evtl die richtige Editmask nötig
     //       diese verhält sich für mich komisch
//     EditMask:='0,000';
   end;  

charlytango
Beiträge: 843
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: TMemdataset Feldformat und TDBGrid

Beitrag von charlytango »

hmm....
scheinbar wird mit

Code: Alles auswählen

mdsTemplate.FieldDefs.Add('Anzahl',  ftFloat, 5);
zwar ein Feld erzeugt aber es scheint keines vom Typ TFloatField zu sein.
Ich habe versucht den Erstellungsprozess im Code zurückzuverfolgen, hab mich dann aber irgendwie bei den TFielddefs "verirrt".

Jedenfalls stammt ein TFloatField von TNumeric ab und dort sind beide Eigenschaften definiert.

TNumericField.DisplayFormat
TNumericField.EditFormat

scheinbar je ein Format zur Anzeige und zum Editieren.
Wobei in beiden Beschreibungen folgendes steht:
"Which formatting function (and, consequently, which format can be entered)"
also doch beide auch zur Eingabe?

Für mich funktioniert

Code: Alles auswählen

EditMask:='0,999';
ohne den Cast auf TFloatField ausreichend gut, damit.... case closed, Danke

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: TMemdataset Feldformat und TDBGrid

Beitrag von wp_xyz »

charlytango hat geschrieben:
Fr 22. Jan 2021, 11:19
hmm....
scheinbar wird mit

Code: Alles auswählen

mdsTemplate.FieldDefs.Add('Anzahl',  ftFloat, 5);
zwar ein Feld erzeugt aber es scheint keines vom Typ TFloatField zu sein.
Nein, hier wird auch noch kein Feld erzeugt, sondern nur ein TFieldDef, als die Anweisung, wie das Feld aussehen soll. Erzeugt wird das Feld später in TFieldDef.CreateField, und dort wird dem bei FieldDefs.Add angegebenen Feldtypen ftFloat die Klasse TFloatField zugeordnet, was dann letztendlich zu einem TFloatfield führt.

Zur Klarstellung: DisplayFormat ändert das Anzeigeformat, lässt aber den Feldinhalt unverändert. EditMask greift schon bei der Eingabe ein und lässt nur bestimmte Zeichen zu, die dann halt auch entsprechend angezeigt werden.

Ich weiß jetzt nicht, was das DECIMAL 5,2 von MariaDB/MySQL macht. Ist das nur für die Ausgabe, oder werden damit die Zahlen auch nur mit 2 Dezimalstellen abgespeichert? Letzteres hieße insbesondere, dass diese DB Zahlen als Strings abspeichert, was ich mir nicht vorstellen kann.

charlytango
Beiträge: 843
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Gelöst: TMemdataset Feldformat und TDBGrid

Beitrag von charlytango »

danke f die kompetente Erklärung. So etwas ähnliches hatte ich mir schon gedacht.
Freue mich, hier immer wieder etwas dazu lernen zu können - THX

Antworten