In questo articolo esploreremo come personalizzare il rendering delle celle di una TStringGrid in FireMonkey (FMX). Utilizzeremo gli eventi OnDrawColumnCell e OnDrawColumnBackground per modificare l’aspetto delle celle, inclusi i colori di sfondo e le proprietà del font.
Per iniziare, crea un nuovo progetto FireMonkey in Delphi e aggiungi una TStringGrid al form. Configura la griglia impostando il numero di righe e colonne e aggiungendo alcuni dati di esempio:
procedure TForm1.FormCreate(Sender: TObject);
begin
// Configurazione iniziale della StringGrid
StringGrid1.RowCount := 10;
StringGrid1.ColumnCount := 3;
StringGrid1.Cells[1, 1] := 'Important';
StringGrid1.Cells[1, 2] := 'Normal';
StringGrid1.Cells[1, 3] := 'Critical';
// Imposta l'altezza predefinita delle righe
StringGrid1.DefaultRowHeight := 40;
// Imposta l'altezza specifica per alcune righe
StringGrid1.RowHeights[1] := 50;
StringGrid1.RowHeights[2] := 60;
// Collegare l'evento OnSelChanged
StringGrid1.OnSelChanged := StringGrid1SelChanged;
end;
Per cambiare il colore di sfondo delle celle, utilizziamo l’evento OnDrawColumnBackground. In questo esempio, evidenziamo le celle selezionate con un background giallo chiaro e applichiamo colori diversi in base al contenuto delle celle:
procedure TForm1.StringGrid1DrawColumnBackground(Sender: TObject; const Canvas: TCanvas;
const Column: TColumn; const Bounds: TRectF; const Row: Integer;
const Value: TValue; const State: TGridDrawStates);
begin
// Verifica se la cella è selezionata
if TGridDrawState.gdSelected in State then
Canvas.Fill.Color := TAlphaColors.Lightyellow
else
begin
// Personalizzazione del colore di sfondo in base al valore della cella
if Value.ToString = 'Important' then
Canvas.Fill.Color := TAlphaColors.Yellow
else if Value.ToString = 'Normal' then
Canvas.Fill.Color := TAlphaColors.White
else if Value.ToString = 'Critical' then
Canvas.Fill.Color := TAlphaColors.Red
else
Canvas.Fill.Color := TAlphaColors.Lightgray;
end;
// Disegna il rettangolo di sfondo
Canvas.FillRect(Bounds, 0, 0, [], 1);
end;
Per personalizzare il font delle celle e il draw diretto sul canvas delle stesse, è per prima cosa necessario disabilitare la proprietà DefaultDrawing dell’oggetto TStringGrid.
A questo punto utilizziamo l’evento OnDrawColumnCell facciamo un esempio di come gestire il render della cella in tutte le sue parti.
procedure TForm1.StringGrid1DrawColumnCell(Sender: TObject; const Canvas: TCanvas;
const Column: TColumn; const Bounds: TRectF; const Row: Integer;
const Value: TValue; const State: TGridDrawStates);
begin
// Personalizzazione del font in base al valore della cella
if Value.ToString = 'Important' then
begin
Canvas.Font.Style := [TFontStyle.fsBold];
Canvas.Font.Size := 14;
Canvas.Font.Family := 'Arial';
end
else if Value.ToString = 'Normal' then
begin
Canvas.Font.Style := [];
Canvas.Font.Size := 12;
Canvas.Font.Family := 'Tahoma';
end
else if Value.ToString = 'Critical' then
begin
Canvas.Font.Style := [TFontStyle.fsBold, TFontStyle.fsItalic];
Canvas.Font.Size := 16;
Canvas.Font.Family := 'Verdana';
end
else
begin
Canvas.Font.Style := [];
Canvas.Font.Size := 12;
Canvas.Font.Family := 'Helvetica';
end;
// Disegna il testo della cella
Canvas.Fill.Color := TAlphaColors.Black;
Canvas.FillText(Bounds, Value.ToString, False, 1, [], TTextAlign.Leading, TTextAlign.Center);
end;
Per assicurarsi che la griglia venga aggiornata correttamente quando la selezione cambia, utilizziamo l’evento OnSelChanged per forzare il ridisegno della griglia chiamando il metodo InvalidateContent:
procedure TForm1.StringGrid1SelChanged(Sender: TObject);
begin
// Forza il ridisegno della StringGrid quando cambia la selezione
StringGrid1.InvalidateContent;
end;
Con queste impostazioni, hai ora il controllo completo sull’aspetto delle celle nella tua TStringGrid di FireMonkey, permettendoti di creare interfacce utente più ricche e personalizzate.