如何为 firemonkey TGrid/TStringGrid 中的特定列设置文本对齐方式?
How to set text alignment for a specific column in firemonkey TGrid/TStringGrid?
在 firemonkey (RAD Studio 10.3) 中,我正在使用连接到数据库的 TStringGrid,我想更改特定列的文本对齐方式。我怎样才能做到这一点?在 TextSettings 中更改 HorzAlign 属性,更改所有列的对齐方式。
我尝试了 this page 中建议的解决方案,但没有成功!在较新版本的 Firemonkey 中,以下解决方案代码会导致错误。
type TSpecificColumn = class(TColumn)
protected
function CreateCellControl: TStyledControl;override;
end;
TColumn Class 中没有 CreateCellControl 函数可以重写!这是我得到的错误:
在基 class 中找不到方法 CreateCellControl。
在 OnDrawColumnCell
and/or OnDrawColumnHeader
事件中,您可以使用 TTextLayout
来达到目的。如以下示例所示,使用三种不同的对齐方式绘制单元格。绘制 headers:
时同样适用
uses
...
fmx.textlayout;
procedure TForm11.Grid1DrawColumnCell(Sender: TObject; const Canvas: TCanvas;
const Column: TColumn; const Bounds: TRectF; const Row: Integer;
const Value: TValue; const State: TGridDrawStates);
var
tl: TTextLayout;
rf: TRectF; // added
begin
tl := TTextLayoutManager.DefaultTextLayout.Create;
try
tl.BeginUpdate;
try
// added from here
rf := Bounds;
InflateRect(rf, -2, -2);
if (TGridDrawState.Selected in State) or
(TGridDrawState.Focused in State) or
(TGridDrawState.RowSelected in State)
then
Canvas.Fill.Color := TAlphaColors.LightBlue
else
Canvas.Fill.Color := TAlphaColors.White;
Canvas.FillRect(rf, 0, 0, [], 1);
// added until here
tl.TopLeft := Bounds.TopLeft;
tl.MaxSize := PointF(Column.Width, Column.Height);
tl.Font.Size := 15;
tl.Text := 'Some text'; // Value
case Column.Index of
0: tl.HorizontalAlign := TTextAlign.Leading;
1: tl.HorizontalAlign := TTextAlign.Center;
2: tl.HorizontalAlign := TTextAlign.Trailing;
end;
finally
tl.EndUpdate;
end;
tl.RenderLayout(Canvas);
finally
tl.Free;
end;
end;
TTextLayout
还有许多其他有用的选项和属性,所以我建议看一下文档。
除了已经确定的更改 InflateRect(rf, 0, 0)
之外,为了让现有数据能够正确显示:
改变
tl.Text := 'Some text'; // Value line
到
tl.Text := [StringGrid name property].Cells[Column.Index,Row];
这对我有用。
在 firemonkey (RAD Studio 10.3) 中,我正在使用连接到数据库的 TStringGrid,我想更改特定列的文本对齐方式。我怎样才能做到这一点?在 TextSettings 中更改 HorzAlign 属性,更改所有列的对齐方式。
我尝试了 this page 中建议的解决方案,但没有成功!在较新版本的 Firemonkey 中,以下解决方案代码会导致错误。
type TSpecificColumn = class(TColumn)
protected
function CreateCellControl: TStyledControl;override;
end;
TColumn Class 中没有 CreateCellControl 函数可以重写!这是我得到的错误:
在基 class 中找不到方法 CreateCellControl。
在 OnDrawColumnCell
and/or OnDrawColumnHeader
事件中,您可以使用 TTextLayout
来达到目的。如以下示例所示,使用三种不同的对齐方式绘制单元格。绘制 headers:
uses
...
fmx.textlayout;
procedure TForm11.Grid1DrawColumnCell(Sender: TObject; const Canvas: TCanvas;
const Column: TColumn; const Bounds: TRectF; const Row: Integer;
const Value: TValue; const State: TGridDrawStates);
var
tl: TTextLayout;
rf: TRectF; // added
begin
tl := TTextLayoutManager.DefaultTextLayout.Create;
try
tl.BeginUpdate;
try
// added from here
rf := Bounds;
InflateRect(rf, -2, -2);
if (TGridDrawState.Selected in State) or
(TGridDrawState.Focused in State) or
(TGridDrawState.RowSelected in State)
then
Canvas.Fill.Color := TAlphaColors.LightBlue
else
Canvas.Fill.Color := TAlphaColors.White;
Canvas.FillRect(rf, 0, 0, [], 1);
// added until here
tl.TopLeft := Bounds.TopLeft;
tl.MaxSize := PointF(Column.Width, Column.Height);
tl.Font.Size := 15;
tl.Text := 'Some text'; // Value
case Column.Index of
0: tl.HorizontalAlign := TTextAlign.Leading;
1: tl.HorizontalAlign := TTextAlign.Center;
2: tl.HorizontalAlign := TTextAlign.Trailing;
end;
finally
tl.EndUpdate;
end;
tl.RenderLayout(Canvas);
finally
tl.Free;
end;
end;
TTextLayout
还有许多其他有用的选项和属性,所以我建议看一下文档。
除了已经确定的更改 InflateRect(rf, 0, 0)
之外,为了让现有数据能够正确显示:
改变
tl.Text := 'Some text'; // Value line
到
tl.Text := [StringGrid name property].Cells[Column.Index,Row];
这对我有用。