Lazarus 2.0.10 (2020.07.11.)
Letöltés

file DataSet field DisplayFormat float/integer számára

  • makgab
  • makgab profilkép
  • Törzstag
  • Törzstag
  • Hozzászólások: 280
  • Karma: -1
  • Köszönetek: 1

makgab válaszolt a témára: DataSet field DisplayFormat float/integer számára

Megvan!
Ez a DisplayFormat a jó: #0.#
#2049

  • JohnnyK
  • JohnnyK profilkép
  • Gyakori fórumozó
  • Gyakori fórumozó
  • Hozzászólások: 78
  • Köszönetek: 16

JohnnyK válaszolt a témára: DataSet field DisplayFormat float/integer számára

A Canvas-nak van egy TextWidth függvénye, ami megadja, hány pixel széles a szöveg. Valahogy így működne a kódoddal:
procedure TForm1.DBGridDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: integer; Column: TColumn; State: TGridDrawState);
var    aValue: double;
       Str: string;
begin
  if Column.DisplayFormat = '0#0#0#' then  // this is custom format
  begin
    aValue := report_part_productsSQLQuery.Fields[DataCol].AsFloat;
    with TDBGrid(Sender).Canvas do
    begin
      FillRect(Rect);
      if aValue = Trunc(aValue) Then
        Str := FormatFloat('0', aValue))
        else
        Str := FormatFloat('0.0000', aValue));
      TextOut(Rect.Right - TextWidth(Str) - 3, Rect.Top + 2, Str);
    end;
  end;
end;
#2046
Megköszönték: makgab

  • makgab
  • makgab profilkép
  • Törzstag
  • Törzstag
  • Hozzászólások: 280
  • Karma: -1
  • Köszönetek: 1

makgab válaszolt a témára: DataSet field DisplayFormat float/integer számára

Közben rájöttem (Rect.Right):
      if aValue = Trunc(aValue) Then
         TextOut(Rect.Right - 12, Rect.Top + 2, FormatFloat('0', aValue))
         else
         TextOut(Rect.Right - 38, Rect.Top + 2, FormatFloat('0.0000', aValue));

Ezzel lehet megjelenítési probléma? Pl. felhasználó által átállított betütípus v. méret esetén?
#2045

  • makgab
  • makgab profilkép
  • Törzstag
  • Törzstag
  • Hozzászólások: 280
  • Karma: -1
  • Köszönetek: 1

makgab válaszolt a témára: DataSet field DisplayFormat float/integer számára

Működik, köszönöm!
var     aValue: double;
begin
  if Column.DisplayFormat = '0#0#0#' then  // this is custom format
  begin
    aValue := report_part_productsSQLQuery.Fields[DataCol].AsFloat;
    with TDBGrid(Sender).Canvas do
    begin
      FillRect(Rect);
      if aValue = Trunc(aValue) Then
         TextOut(Rect.Left + 3, Rect.Top + 2, FormatFloat('0', aValue))
         else
         TextOut(Rect.Left + 3, Rect.Top + 2, FormatFloat('0.0000', aValue));
    end;
  end;
end; 

Már csak az a kérdés, hogy az értéket (mint szöveget) tudom jobbra igazítani?
#2044

  • makgab
  • makgab profilkép
  • Törzstag
  • Törzstag
  • Hozzászólások: 280
  • Karma: -1
  • Köszönetek: 1

makgab válaszolt a témára: DataSet field DisplayFormat float/integer számára

köszönöm, megnézem.
#2043

  • JohnnyK
  • JohnnyK profilkép
  • Gyakori fórumozó
  • Gyakori fórumozó
  • Hozzászólások: 78
  • Köszönetek: 16

JohnnyK válaszolt a témára: DataSet field DisplayFormat float/integer számára

A jelzett formátumhoz szerintem nem létezik egy közös formátum string, kettőt kellene variálni hozzá ('0' és '0.0000').
Ha pl a DBGrid OnPrepareCanvas metódusában vizsgálod a DataSet értékét, és annak értékétől függően változtatod a Column.DisplayFormat értékét, akkor nálam sajnos eléggé leterhelődik az alkalmazás.
Más lehetőség volna, ha a DataSet szövegként tartalmazná már a megjelenítendő számokat, tehát a formázás logikáját az SQL-re bíznád.
Harmadik lehetőség az lehetne, ha a a DBGrid OnDrawColumnCell metódusában a Canvas-t módosítod:
uses StrUtils, ...
 
procedure TForm1.DBGridDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: integer; Column: TColumn; State: TGridDrawState);
var     aValue: double;
begin
  if Column.DisplayFormat = '0#0#0#' then  // Ezt a mintát lenne szükséges beírnod ahhoz az oszlophoz, ahol ezt a formázást szeretnéd használni
  begin
    aValue := SQLQuery.Fields[DataCol].AsFloat;
    with TDBGrid(Sender).Canvas do
    begin
      FillRect(Rect);
      TextOut(Rect.Left + 3, Rect.Top + 2, FormatFloat(IfThen(aValue = Trunc(aValue), '0', '0.0000'), aValue));
    end;
  end;
end;
Biztos vannak további lehetőségek is, de egyelőre ez a három jutna eszembe.
#2042
Megköszönték: makgab

  • makgab
  • makgab profilkép
  • Törzstag
  • Törzstag
  • Hozzászólások: 280
  • Karma: -1
  • Köszönetek: 1

makgab létrehozta a témát: DataSet field DisplayFormat float/integer számára

Üdv!
Meg lehet valahogy adni, hogy a Dataset (pl. SQLQuery) field DisplayFormat automatikusan formázza a float típusú mezőt egész és nem egész érték esetén?
Az egészeket tizedesek nélkül, az törteket fix tizedessel mutassa.
Tehát pl.:
1.505 -> 1.5050
1.66 -> 1.6600
1.0000 -> 1

( Ilyeneket próbáltam: '#,####0,0000', '#.####0.0000' )

Milyen DisplayFormat kell ebben az esetben?
#2039