Miejsca po przecinku

0

Heja

mam takie coś, dzięki czemu drukuje mi jedną spośród kilku kolumn stringgrida.

Printer.Canvas.TextOut(2300, - YPos - 45, Grid.Cells[7, I + (Seite - 1) * Zeilen - 1]);

Wszystko fajnie, tyle że w tej akurat kolumnie znajdują się wartości typu string (normalne dla stringgrida:) ale użytkownik wpisuje tam tylko i wyłącznie cyfry (np. 2, 3, 2.14, 5.08) itd. Chcę żeby podczas drukowania pokazywało mi (2,00 , 3,00 , 2,14 itd...)
Jak to ogarnąć ?

Proszę o pomoc.

0

To się robi za pomocą procedury

Str
0

Dzięki. Wymyśliłem coś takiego ale nie do końca działa.

StrPomocnicza:= Grid.Cells[7, I + (Seite - 1) * Zeilen - 1];
Str(Wartosc:0:2,StrPomocnicza);
Printer.Canvas.TextOut(2300, - YPos - 45, StrPomocnicza);

Otóż, w prawdzie wypisuje mi wszystko w postaci : 0.00 ale same zera są od góry do dołu. A przecież w stringgridzie mam wartości wpisane w tej kolumnie i to nie są zera...

Dodam tylko, że to ' I ' znajduje się w pętli :

for I := 1 to Row.Count do

Jakieś pomysły ?
Próbowałem zrobić z StrPomocnicza tablicę string i wtedy kod wyglądał następująco :

StrPomocnicza[I]:= Grid.Cells[7, I + (Seite - 1) * Zeilen - 1];
Str(Wartosc:0:2,StrPomocnicza[I]);
Printer.Canvas.TextOut(2300, - YPos - 45, StrPomocnicza[I]);

ale wywalało błąd i nie szło tego wydrukować. . .

0

Nie do końca dobrze to wymyśliłeś :)

var
  StrPomocnicza:string;
  wartosc:Real;
  code:Integer;
//...
  Val(Grid.Cells[7, I + (Seite - 1) * Zeilen - 1],wartosc,code);//code>0 jeżeli błąd
  Str(Wartosc:0:2,StrPomocnicza);
  Printer.Canvas.TextOut(2300, - YPos - 45, StrPomocnicza);
0

Rządzisz...
Dziękuje bardzo :)

0

A tak zapytam przy okazji, bo na bank będziesz się orientował.

Skoro mam to zaokrąglanie, to czemu gdy wpisuje wartość 23,13 to pokazuje mi 23 ? żeby było śmiesznej to gdy próbuje podsumować tę kolumnę to wywala błąd.
Być może jest to spowodowane tym że jest kropka zamiast przecinka.
W 7 kolumnie są wartości typu real , a tak wygląda procedura rysowania StringGrida :

procedure TNarzedziaFrm.StringGrid_NarzedziaDrawCell(Sender: TObject; ACol,
  ARow: Integer; Rect: TRect; State: TGridDrawState);
var
  s,s1:string;
  lr: real;
  code:integer;
  begin
    with StringGrid_Narzedzia.Canvas do
    begin
    S:= StringGrid_Narzedzia.Cells[aCol, aRow];
    if (aCol = 0) or (aCol = 1) or (aCol = 2) or (aCol = 3) or (aCol = 4) or (aCol = 5) or (aCol = 6) or (aCol = 8) or (aCol = 9) or (aCol = 10) then
    begin
      StringGrid_Narzedzia.Canvas.FillRect(Rect);
      DrawText(Handle, PChar(S), Length(S), Rect, DT_CENTER or DT_VCENTER or DT_SINGLELINE);
    end;
    if (aCol = 7) and (aRow <> 0) then
    begin
      try
      Val(S,lr,code);//code>0 oznacza błąd
      Str(lr:0:2,s1);
      StringGrid_Narzedzia.Canvas.FillRect(Rect);
      DrawText(Handle, PChar(s1), Length(S1), Rect, DT_RIGHT or DT_VCENTER or DT_SINGLELINE);
      except;
      end;
    end
    else
    begin
      StringGrid_Narzedzia.Canvas.FillRect(Rect);
      DrawText(Handle, PChar(S), Length(S), Rect, DT_CENTER or DT_VCENTER or DT_SINGLELINE);
    end;
  end;
  end;

Procedura do zsumowania :

procedure TNarzedziaFrm.SumaWartosci(Sender: TObject);
  var
    j: integer;
  begin
    suma:= 0;
      try
        for j:=1 to NarzedziaFrm.StringGrid_Narzedzia.RowCount do
          begin
            suma:= suma + StrToInt(NarzedziaFrm.StringGrid_Narzedzia.Cells[7,j]);
          end;
      except;
      end;
    RichEdit_Wartosc.Text:= FloatToStr(suma);
  end;

Sumuje tylko i wyłącznie gdy wartości są typu integer : czyli jak wpisze np. 23 ; 32 ; 56 ale jak wpisze 23,12 to wywala błąd : is not valid integer value
i tylko i wyłącznie wtedy gdy zachowana jest kolejność (czyli po drodze nie natrafi na ' ' puste :) - w moim przypadku brak ceny .

Pomóż !

0
    if (aCol = 0) or (aCol = 1) or (aCol = 2) or (aCol = 3) or (aCol = 4) or (aCol = 5) or (aCol = 6) or (aCol = 8) or (aCol = 9) or (aCol = 10) then

Co to ma być?
To można bezproblemowo skrócić do:

if (aCol in [0..6,8..10])

:|

0

No nieważne... w każdym razie dlaczego wywala błąd ?

0

Ustaw breakpoint'a w tej linii i sprawdź wartość code

Val(Grid.Cells[7, I + (Seite - 1) * Zeilen - 1],wartosc,code);

W komórce tej niech będzie 23,12
Sprawdź też zmienną DecimalSeparator
Ponadto

suma:= suma + StrToInt(NarzedziaFrm.StringGrid_Narzedzia.Cells[7,j]);

Ewidentny błąd. suma ma być typy Real/Double, zamiast StrToInt użyj StrToFloat. Poczytaj o TryStrToFloat.

1 użytkowników online, w tym zalogowanych: 0, gości: 1