Via Cà Matta 2 - Peschiera Borromeo (MI)
+39 02 00704272
info@synaptica.info

Gestione del Custom Draw nelle TStringGrid di FireMonkey (Delphi 12.1)

Digital Innovation Partner

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:

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:

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.

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:

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.