Jak stworzyć dynamiczne kolumny w TADMemTable?

Jak stworzyć dynamiczne kolumny w TADMemTable?
J0
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 82
0

Witam.
Używam Delphi XE i komponentu TADMemTable. Muszę dynamicznie utworzyć w tym komponencie kilka kolumn, w których wpisuje liczby zmiennoprzecinkowe.
Zazwyczaj tworzenie kolumny jest proste i można to zrobić przy użyciu kodu: <memTable>.FieldDefs.Add('NazwaKolumny', <TypKolumny> [,<Rozmiar>])

Ja potrzebuję stworzyć kolumnę gdzie wpiszę liczbę z dwoma miejscami po przeicnku np 15,00 i chciałbym aby właśnie te dwa zera po przecinku były widoczne w kolumnie.

Gdy tworzę kolumnę z typem danych ftFloat: <memTable>.FieldDefs.Add('kwota', ftFloat); to niestety liczba 15,00 wyświetlana jest jako liczba całkowita 15, bez zer po przecinku.

Gdy tworzę kolumnę z tym danych ftBCD: <memTable>.FieldDefs.Add('kwota', ftBCD, 15); to wszystko widać poprawnie z zerami po przecinku jednak taki sposób utworzenia kolumny sprawia, że na komponencie typu DBGrid to co wpiszemy jako argument 'NazwaKolumny' jest również wyświetlone jako opis (Caption) tej kolumny. Aby móc określić inny opis kolumny niż jej nazwa to tworzę kolumnę w taki sposób:

Kopiuj
memDane: TADMemTable;
...
procedure AddField(AName: string; AType: TFieldType; ASize: Byte = 0; APrec: Byte = 0; ALabel: string = '');
var
  NewField: TField;
  FieldDef: TFieldDef;
begin
  FieldDef := memDane.FieldDefs.AddFieldDef;
  FieldDef.DataType := AType;
  FieldDef.Name := AName;

  if ASize > 0 then
    FieldDef.Size := ASize;

  if APrec > 0 then
    FieldDef.Precision := APrec;

  NewField := FieldDef.CreateField(memDane);

  if ALabel <> '' then
    NewField.DisplayLabel := ALabel
  else
    NewField.DisplayLabel := AName;
end;

// Użycie procedury AddField:

AddField('M1', ftBCD, 15, 2, 'Styczeń 2023');

Gdy wykorzystam procedurę AddField tworząc kolumnę typu ftBCD to mam błąd: memDane Type mismatch for field 'Styczeń 2023', expecting BCD actual FMTBcdField.
Natomiast gdy utworzę kolumną z typem ftFMTBcd to błędu już nie mam, ale liczba np 15,00 wyświetlana jest bez zer po przecinku.

W jaki sposób zatem utworzyć kolumnę z nazwą (M1) oraz własnym opisem (Styczeń 2023) aby liczba 15,00 wyświetlała się z zerami po przecinku?

WL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1084
3
jm0x01 napisał(a):

Witam.

/ciach/
Nie wiem o co pytasz, bo tam znalazłem kilka "kwiatków", no to odpowiem na pytanie ;-)

W jaki sposób zatem utworzyć kolumnę z nazwą (M1) oraz własnym opisem (Styczeń 2023) aby liczba 15,00 wyświetlała się z zerami po przecinku?

Co to jest własny opis kolumny? To co się ma wyświetlać np. w nazwie kolumny w DBGrid?
No to jak już utworzysz te kolumny, to dla każdej z nich określi:

Kopiuj
var
  lField : TField;
begin
  lField := adMemTable.FindField('M1');
  lField.DisplayLabel := 'Styczeń 2003'; //Opis kolumny
  (lField as TNumericField).DisplayFormat := ',0.00##'; // Format wyświetlania dnych dla tej kolumny
  (lField as TNumericField).EditFormFormat := '########.####'; // Format edycji danych dla tej kolumny.
end;

A przy okazji, jeśli te dane to faktycznie wartości kwotowe (nieważne w jakiej walucie) to użyj właściwego typu danych, czyli ftCurrency co spowoduje utworzenie pola TCurrencyField.
Ono jest dedykowane do kwot.

J0
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 82
0

Nie wiem o co pytasz, bo tam znalazłem kilka "kwiatków", no to odpowiem na pytanie ;-)

Nie wiem o jakich "kwiatkach" mówisz ale to bez znaczenia. :)
Dziękuje Ci za podpowiedź.

Kopiuj
  lField := adMemTable.FindField('M1');
  lField.DisplayLabel := 'Styczeń 2003';

Określiłem w ten sposób opisy dla każdej z kolumn i mam to co chciałem uzyskać.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.