2011. június 2., csütörtök
Align cells in a TStringGrid (4)
Problem/Question/Abstract:
Anyone know a simple way of vertically centering your text in a TStringGrid cell. Actually, I wish the StringGrid had the ability to align horizontally as well.
Answer:
Below is some Delphi3 code that I wrote for handling left-right alignment of text in string grids. It would be straightforward to change it for vertical instead (or as well). See DT_BOTTOM, DT_VCENTER and DT_TOP in the description of DrawText in Delphi's Win32 help file. The code also handles automatic word-wrapping and font changes on a per cell basis.
procedure DrawSGCell(Sender: TObject; C, R: integer; Rect: TRect;
Style: TFontStyles; Wrap: boolean; Just: TAlignment; NoEditCols: TNoEditCols);
{formats cell text; call this routine from grid's DrawCell event;
Style is TFontStyles...
TFontStyles = set of TFontStyle;
TFontStyle = (fsBold, fsItalic, fsUnderline, fsStrikeOut);
Wrap is word-wrap on/off,
Just is (taLeftJustify, taRightJustify, taCenter)}
var
S: string;
DrawRect: TRect;
begin
{multi-line wordwrapped cells, with any justification, and any font params}
{if Row > 0 then
{ only used for column headings}
exit;
}
{ get cell contents }
with (Sender as TStringGrid), Canvas do
begin
S := Cells[C, R];
{erase earlier contents from default drawing }
Brush.Color := FixedColor;
if (R >= FixedRows) and (C >= FixedCols) and not (C in NoEditCols) then
Brush.Color := Color;
FillRect(Rect);
if length(S) > 0 then
begin
{switch to font style}
Font.Style := Style;
{local copy of cell rectangle}
DrawRect := Rect;
if Wrap then
begin
{get size of text rectangle in DrawRect}
DrawText(Handle, PChar(S), length(S), DrawRect, dt_calcrect or dt_wordbreak or
dt_center);
if (DrawRect.Bottom - DrawRect.Top) > RowHeights[R] then
begin
{cell word-wrapped; need to increase row height}
RowHeights[R] := DrawRect.Bottom - DrawRect.Top;
SetGridHeight(Sender as TStringGrid);
end
else
begin
DrawRect.Right := Rect.Right;
FillRect(DrawRect);
case Just of
taLeftJustify:
begin
S := ' ' + S;
DrawText(Handle, PChar(S), length(S), DrawRect, dt_wordbreak or
dt_left);
end;
taCenter:
DrawText(Handle, PChar(S), length(S), DrawRect, dt_wordbreak or
dt_center);
taRightJustify:
begin
S := S + ' ';
DrawText(Handle, PChar(S), length(S), DrawRect, dt_wordbreak or
dt_right);
end;
end;
end;
end
else
{no wrap}
case Just of
taLeftJustify:
begin
S := ' ' + S;
DrawText(Handle, PChar(S), length(S), DrawRect, dt_singleline or
dt_vcenter or dt_left);
end;
taCenter:
DrawText(Handle, PChar(S), length(S), DrawRect, dt_singleline or
dt_vcenter or dt_center);
taRightJustify:
begin
S := S + ' ';
DrawText(Handle, PChar(S), length(S), DrawRect, dt_singleline or
dt_vcenter or dt_right);
end;
end;
{restore no font styles}
Font.Style := [];
end;
end;
end;
Feliratkozás:
Megjegyzések küldése (Atom)
Nincsenek megjegyzések:
Megjegyzés küldése