Gestione del Custom Draw nelle TStringGrid di FireMonkey (Delphi 12.1)
Gestione del Custom Draw nelle TStringGrid di FireMonkey
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.
Impostazione di base
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
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; |
Personalizzazione dello Sfondo delle Celle
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
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; |
Gestire il custom draw delle celle
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
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; |
Aggiornamento della Selezione
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:
1 2 3 4 5 |
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.