Lazarus 3.0 (2023.12.21.)
Letöltés

  • Oldal:
  • 1

TÉMA:

DataSet field DisplayFormat float/integer számára 2016 júl. 07 13:59 #2049

  • makgab
  • makgab profilkép Témaindító
  • Törzsgárda tag
  • Törzsgárda tag
  • Hozzászólások: 280
  • Köszönetek: 1
Megvan!
Ez a DisplayFormat a jó: #0.#

DataSet field DisplayFormat float/integer számára 2016 jún. 28 11:52 #2046

  • JohnnyK
  • JohnnyK profilkép
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 78
  • Köszönetek: 16
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;
Megköszönték: makgab

DataSet field DisplayFormat float/integer számára 2016 jún. 28 11:26 #2045

  • makgab
  • makgab profilkép Témaindító
  • Törzsgárda tag
  • Törzsgárda tag
  • Hozzászólások: 280
  • Köszönetek: 1
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?

DataSet field DisplayFormat float/integer számára 2016 jún. 28 10:52 #2044

  • makgab
  • makgab profilkép Témaindító
  • Törzsgárda tag
  • Törzsgárda tag
  • Hozzászólások: 280
  • Köszönetek: 1
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?

DataSet field DisplayFormat float/integer számára 2016 jún. 28 09:11 #2043

  • makgab
  • makgab profilkép Témaindító
  • Törzsgárda tag
  • Törzsgárda tag
  • Hozzászólások: 280
  • Köszönetek: 1
köszönöm, megnézem.

DataSet field DisplayFormat float/integer számára 2016 jún. 28 08:41 #2042

  • JohnnyK
  • JohnnyK profilkép
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 78
  • Köszönetek: 16
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.
Megköszönték: makgab

DataSet field DisplayFormat float/integer számára 2016 jún. 27 11:17 #2039

  • makgab
  • makgab profilkép Témaindító
  • Törzsgárda tag
  • Törzsgárda tag
  • Hozzászólások: 280
  • Köszönetek: 1
Ü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?

  • Oldal:
  • 1