Newsgroup: it.comp.lang.delphi
Titolo: TStringGrid e testo colorato.

Ciao a tutti,
mi scuso per il post quasi "doppione" del mio sottostante, tuttavia 
stavolta andro un po piu nello specifico con qualche riga di codice.
Vorrei colorare alcune righe di una TStringGrid, in funzione del valore 
di alcuni dati.
Ho buttato giu questo codice, ma non funziona, e non capisco dove 
sbaglio. Le celle si presentano sempre tutte rosse.
Grazie anticipate a chi avra la cortesia di rispondermi.
ZioGian
procedure TForm2.gridDrawCell(Sender: TObject; ACol, ARow: Integer;
   Rect: TRect; State: TGridDrawState);
begin
   grid.Canvas.TextOut(rect.Left + 2,
                       rect.Bottom - 15,
                       grid.Cells[acol, arow]);
end;
procedure TForm2.FormShow(Sender: TObject);
var
   i : integer;
begin
       grid.RowCount := high(samarray);
   for i := 1 to high(samarray) do begin
     grid.Cells[0, i] := inttostr(samarray[i].samplenumber);
     grid.Cells[1, i] := inttostr(samarray[i].value);
     grid.Cells[2, i] := inttostr(samarray[i].min);
     grid.Cells[3, i] := inttostr(samarray[i].med);
     grid.Cells[4, i] := inttostr(samarray[i].max);
     grid.Cells[5, i] := datetostr(samarray[i].datetime)
        + ' - ' + timetostr(samarray[i].datetime);
     if samarray[i].value > 5000 then begin
       grid.Canvas.Font.Color := clred;
       addtolog('rosso');
       end
     else begin
       grid.Canvas.Font.Color := clblack;
       addtolog('nero');
       end;
     application.ProcessMessages;
     end; //finde del ciclo for
end;

Parzialmente mi rispondo da solo.
Come sotto funzionicchia, ma il codice mi fa un po ribrezzo. Possibile 
che non si possa fare meglio ? Perche non mi accetta la definizione del 
colore e dello sfondo, se non all'interno del gestore di evento su 
ondrawcell?
ZioGian
procedure TForm2.gridDrawCell(Sender: TObject; ACol, ARow: Integer;
   Rect: TRect; State: TGridDrawState);
begin
   //eseguo la procedura solo se sto scrivendo la prima cella di una riga.
   if arow = 0 then
     grid.Canvas.Brush.Color := clBtnFace;
     grid.Canvas.FillRect(rect);
     grid.Canvas.TextOut(rect.Left + 2,
                         rect.Bottom - 15,
                         grid.Cells[acol, arow]);
     grid.Canvas.Brush.Color := clWhite;
   if (acol = 0) AND (arow > 0) then begin
     //verifico se il valore supera il limite massimo
     if strtoint(grid.Cells[acol + 1, arow]) >
        strtoint(grid.Cells[acol + 4, arow]) then begin
          grid.Canvas.Font.Color := clred;
          end  //fine della verifica sul limite alto
     else      //se il limite alto non è superato, scrivo in nero.
        grid.Canvas.Font.Color := clblack;
     //scrivo la cella con il numero di campione
     grid.Canvas.TextOut(rect.Left + 2,
                         rect.Bottom - 15,
                         grid.Cells[acol, arow]);
     //scrivo la cella valore
     grid.Canvas.TextOut(rect.Left + 4
                           + grid.ColWidths[0],
                         rect.Bottom - 15,
                         grid.Cells[acol + 1, arow]);
     //scrivo la vella min
     grid.Canvas.TextOut(rect.Left + 6
                           + grid.ColWidths[0]
                           + grid.ColWidths[1],
                         rect.Bottom - 15,
                         grid.Cells[acol + 2, arow]);
     //scrivo la cella med
     grid.Canvas.TextOut(rect.Left + 8
                           + grid.ColWidths[0]
                           + grid.ColWidths[1]
                           + grid.ColWidths[2],
                         rect.Bottom - 15,
                         grid.Cells[acol + 3, arow]);
     //scrivo la cella max
     grid.Canvas.TextOut(rect.Left + 10
                           + grid.ColWidths[0]
                           + grid.ColWidths[1]
                           + grid.ColWidths[2]
                           + grid.ColWidths[3],
                         rect.Bottom - 15,
                         grid.Cells[acol + 4, arow]);
     //scrivo la cella dataeora
     grid.Canvas.TextOut(rect.Left + 12
                           + grid.ColWidths[0]
                           + grid.ColWidths[1]
                           + grid.ColWidths[2]
                           + grid.ColWidths[3]
                           + grid.ColWidths[4],
                         rect.Bottom - 15,
                         grid.Cells[acol + 5, arow]);
     end; //fine dell' IF iniziale, che verifica se riscrivere o meno.
end;
procedure TForm2.FormShow(Sender: TObject);
var
   i : integer;
begin
       grid.RowCount := high(samarray);
   for i := 1 to high(samarray) do begin
     grid.Cells[0, i] := inttostr(samarray[i].samplenumber); 
//numero di campione
     grid.Cells[1, i] := inttostr(samarray[i].value);
     grid.Cells[2, i] := inttostr(samarray[i].min);
     grid.Cells[3, i] := inttostr(samarray[i].med);
     grid.Cells[4, i] := inttostr(samarray[i].max);
     grid.Cells[5, i] := datetostr(samarray[i].datetime)
        + ' - ' + timetostr(samarray[i].datetime);


Se usi il Delphi 5 e non ti fa schifo usare un componente esterno....
Cerca la "HyperGrid".
Risolve problemi del genere in maniera semplice e veloce. E' come la
Stringrid solo con diverse funzionalità in più.
Ciao ciao

dove trovo la HyperGrid?


-- 
Using Opera's revolutionary e-mail client: 
http://www.opera.com/mail/