Živě.cz o počítačích a internetu

Tipy a triky v Delphi, díl 112. - StringGrid pod lupou

Jan Šindelář - 15.10.2003

StringGrid je velmi často užívanou komponentou, protože zobrazení dat v tabulkách je názorné a běžně používané. Abychom však celkem fádní vzhled obyčejného StringGridu trochu vylepšili, ukážeme si několik možností.

Základem bude událost OnDrawCell. Tuto událost si podchytíme vlastním kódem, který nám do buňky vložený text upraví podle našeho přání. Vytvoříme si na to zvláštní proceduru s příslušnými parametry, která zajistí překreslení původního "normálního" obsahu buňky podle našich přání. Při zadávání hodnot do buňky bude tedy vše na první pohled beze změn a až po potvrzení klávesou Enter či přechodem do jiné buňky se vzhled změní.

Pro náš dnešní příklad tedy stačí umístit na prázdný formulář StringGrid a vložit následující kód:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids;

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure StringGridRotateTextOut(Grid: TStringGrid; ARow, ACol: Integer; Rect: TRect; FontName: string; Size: Integer; Color: TColor; Alignment: TAlignment);
var
  lf: TLogFont;
  tf: TFont;
begin
  with Grid.Canvas do
  begin
    Font.Name := FontName;
    Font.Size := Size;
    Font.Color := Color;
    tf := TFont.Create;
    try
      tf.Assign(Font);
      GetObject(tf.Handle, SizeOf(lf), @lf);
      lf.lfEscapement := 900;
      lf.lfOrientation := 0;
      tf.Handle := CreateFontIndirect(lf);
      Font.Assign(tf);
    finally
      tf.Free;
    end;
    FillRect(Rect);
    if Alignment = taLeftJustify then TextRect(Rect, Rect.Left + 2, Rect.Bottom - 2, Grid.Cells[ACol, ARow]);
    if Alignment = taCenter then TextRect(Rect, Rect.Left + Grid.ColWidths[ACol] div 2 - Size + Size div 3, Rect.Bottom - 2, Grid.Cells[ACol, ARow]);
    if Alignment = taRightJustify then TextRect(Rect, Rect.Right - Size - Size div 2 - 2, Rect.Bottom - 2, Grid.Cells[ACol, ARow]);
  end;
end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
begin
  if ACol = 1 then StringGridRotateTextOut(StringGrid1, ARow, ACol, Rect, `Arial`, 12, clRed, taLeftJustify);
  if ACol = 2 then StringGridRotateTextOut(StringGrid1, ARow, ACol, Rect, `Arial`, 12, clBlue, taCenter);
  if ACol > 2 then StringGridRotateTextOut(StringGrid1, ARow, ACol, Rect, `Arial`, 12, clGreen, taRightJustify);
end;

end.

Právě v události OnDrawCell řídíme všechny parametry výsledné tabulky. Veškerý text bude otočen o 90 stupňů, takže můžeme psát i vertikálně. Navíc bude u prvního sloupce změněna barva na červenou a text zarovnán vlevo. Druhý sloupec bude modrý a zarovnán na střed a všechny ostatní sloupce budou mít text zelený a zarovnaný vpravo. Všechno je dostatečně zřejmé z parametrů použitých v naší proceduře StringGridRotateText, takže můžete snadno experimentovat.