Delphi Format Stringgrid

0

Witam wszystkich !

Pewnie temat był już kiedyś wałkowany ale nie mogę nic ciekawego namierzyć w Googlach.
O co chodzi ? W stringridzie udało mi się justowanie ogarnąć, działa bez zarzutu, ale chciałbym również aby np. w 4 kolumnie liczby, które wpisuje wyglądały następująco : 12,00 , 15,21 , 0,00 , itp. Czyli są dwa miejsca po przecinku.
Wklejam co znalazłem, i wklejam co już mam, Proszę o pomoc.
**
Co mam : **
procedure TNarzedziaFrm.StringGrid_NarzedziaDrawCell(Sender: TObject; ACol,
ARow: Integer; Rect: TRect; State: TGridDrawState);
var
bEsNum : boolean;
SCad: string;
u: integer;
s:string;
begin
with StringGrid_Narzedzia.Canvas do
begin
S:= StringGrid_Narzedzia.Cells[acol, arow];
if acol = 4 then
begin
StringGrid_Narzedzia.Canvas.FillRect(Rect);
DrawText(Handle, PChar(s), Length(S), Rect, DT_RIGHT or DT_VCENTER or DT_SINGLELINE);
end;
if acol = 5 then
begin
StringGrid_Narzedzia.Canvas.FillRect(Rect);
DrawText(Handle, PChar(s), Length(S), Rect, DT_CENTER or DT_VCENTER or DT_SINGLELINE);
end;
end;

Co znalazłem do formatowanie 0,00 :
: if Grid.Cells[ACol,ARow] <> '' then begin
: bEsNum := True;
: sCad := Grid.Cells[ACol,ARow];
: for i:=1 to length(sCad) do
: if not (sCad[i] in ['0'..'9','-',',']) then bEsNum := False;
: if bEsNum then begin
: sCad := Format('%10.2f',[StrToFloat(Grid.Cells[ACol,ARow])]);
: with Grid.Canvas,Rect do begin
: i:=Right-TextWidth(sCad+' ');
: Grid.Canvas.FillRect(Rect);
: Grid.Canvas.TextOut(i,Top+2,sCad);
: end;
: end;
: end;

Jak to połączyć Panowie / Panie ?

0
var
  s1:string;
  lr:Real;
  code:Integer;

  S:= StringGrid_Narzedzia.Cells[acol, arow];//tutaj jest liczba rzeczywista?
  Val(S,lr,code);//code>0 oznacza błąd
  Str(lr:0:2,s1);
//...
  DrawText(Handle, PChar(s1), Length(S1), Rect, DT_RIGHT or DT_VCENTER or DT_SINGLELINE);
0

To jest podpowiedź ? bo nie działa :P

1

nie działa

To powinno być cenzurowane bo cholera teraz każdy napisze 'nie działa' i myśli że wszyscy wiemy co to się stało! Problem w tym że tak nie jest. Mógłbyś się wysilić i powiedzieć co zrobiłeś, co się stało itd. Bo taki opis jest dokładny jak 'zepsuł mi się samochód. Jak go naprawić?'

0

W prawdzie kompiluje program ale nadal liczby które wpisuje mają typ całkowity : 1 , 2 ,3 zamiast 1,00 itd..
Nie wywala żadnego błędu. Teraz mój kod wygląda następująco :

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

end;

0

Myśleć trochę trzeba a nie tylko wklejać gotowce.

procedure TNarzedziaFrm.StringGrid_NarzedziaDrawCell(Sender: TObject; ACol,
  ARow: Integer; Rect: TRect; State: TGridDrawState);
var
  bEsNum : boolean;
  SCad: string;
  u: integer;
  s,s1:string;
  lr: real;
  code:integer;
  begin
    with StringGrid_Narzedzia.Canvas do
    begin
    S:= StringGrid_Narzedzia.Cells[aCol, aRow];
    if (aCol = 1) or (aCol = 2) or (aCol = 3) or (aCol = 4) or (aCol = 5)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 = 6 then//tutaj masz liczby?
    begin
      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);
    end;

  end;
0

Dziękuję bardzo.

P.S. Całą noc nad tym siedziałem i jedyne co udało mi sie ogarnąć to po zmianie w kolumnie z wartosciami 0.00 w prawdzie zmienialo ale non stop mrugało, tak jakby się zapetlało...

Dzieki jeszcze raz.

0

A jest jeszcze jeden mały problem.
Bo wywala mi błąd podczas wczytywania :
Access violation at address 00404E94 .... Read of address 00000160
Wczyta całość ale wywala taki błąd...
Procedura do wczytywania :

procedure TNarzedziaFrm.Button2Click(Sender: TObject);
var tf:TextFile;
tab:array[0..100] of string;
i: integer;
row,col:integer;
begin
i:= 0; row:= -1; col:= 0;
if FileExists(Adres + 'Narzedzia/Narzedzia'+KtoryPracownik+'.txt') then
begin
AssignFile(tf, Adres + 'Narzedzia/Narzedzia'+KtoryPracownik+'.txt');
reset(tf);
while not Eof(tf) do
begin
Readln(tf, tab[i]);
if tab[col][1] = '#' then // jeżeli nowy rząd
begin
row:= row+1; // zwiększ licznik
col:= 0;
end else
begin
StringGrid_Narzedzia.Cells[col-1,row]:= tab[i];
end;
col:=col+1;
i:=i+1;
FormCreate(Sender);
end; // while not eof
closefile(tf);
end
else
ShowMessage('Nie znalazłem pliku !');

end;

Zaznaczę tylko, że błąd pojawił się gdy prawidłowo zadziałała procedura DrawCell...

0

nie wiem czy potrzeba, domyślam się że nie ... :) fajnie by było żeby to zadziałało bo mi już witki opadają jak patrzę na kod...

0

No panowie, kto pomoże ?

0

No panowie, kto pomoże ?

Google w znalezieniu opisu debuggera i debugger w znalezieniu błędu.

I do każdego trzeba oczywiście pisać to odzielnie bo on sam nie jest w stanie odkryć czegoś takiego... eh

0

Nie działa gdy chce zsumować całą kolumnę ... Wywala błąd is not valid integer value .. nie liczy całości tylko wtedy kiedy jest ciągłość wpisanych liczb, gdy natomiast jest 0 czyli ' ' to wywala ten błąd i nie liczy ... kto pomoże ?

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