gpt4 book ai didi

delphi - Firemonkey 网格控制 - 将列右对齐

转载 作者:行者123 更新时间:2023-12-03 15:01:03 25 4
gpt4 key购买 nike

我正在使用 FireMonkey 网格控件,但在尝试右对齐列时遇到持续的问题。从其他用户的帖子中,我设法创建了一个新的 TColumn 类型,对此应用了一种样式(文本为 HorzAlign=taTrailing),理论上 - 认为这将是解决方案。这些值由 OnGetValue 函数提供给网格控件。

问题是,虽然一开始看起来不错,但如果您滚动栏/鼠标滚轮等,新的 TColumn 类型列似乎无法使用下面的方法/代码正确刷新。这可能是网格的错误/功能(或者我这样做的方式)。我尝试过.ReAlign等...;但无济于事。让网格重新对齐的唯一方法是调整列大小,然后正确地重新绘制?

下面的代码显示它是一个简单的 TGrid,有 2 个列,1 个标准 StringColumn 和 1 个我的新 StringColNum(应用了右对齐)。 - 感谢任何帮助,因为这是任何网格工作的基本要求。

unit Unit1;

interface

uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.Objects, FMX.Grid,
FMX.Layouts, FMX.Edit;

type
TForm1 = class(TForm)
Grid1: TGrid;
Button1: TButton;
StyleBook1: TStyleBook;
procedure Grid1GetValue(Sender: TObject; const Col, Row: Integer;
var Value: Variant);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

TStringColNum = class(TStringColumn)
private
function CreateCellControl: TStyledControl; override;
public
constructor Create(AOwner: TComponent); override;
published
end;

var
Form1: TForm1;

implementation

{$R *.fmx}

constructor TStringColNum.Create(AOwner: TComponent);
begin
inherited;
end;

function TStringColNum.CreateCellControl: TStyledControl;
var
t:TEdit;
begin
Result:=TStringColNum.Create(Self);
Result.StyleLookup := 'textrightalign';
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Grid1.AddObject(TStringColumn.Create(Self));
Grid1.AddObject(TStringColNum.Create(Self)); // Right Aligned column?

Grid1.RowCount:=5000;
Grid1.ShowScrollBars:=True;
end;

procedure TForm1.Grid1GetValue(Sender: TObject; const Col, Row: Integer;
var Value: Variant);
var
cell: TStyledControl;
t: TText;
begin
if Col=0 then
Value:='Row '+IntToStr(Row);;

if Col=1 then
begin
cell := Grid1.Columns[Col].CellControlByRow(Row);
if Assigned(cell) then
begin
t := (Cell.FindStyleResource('text') as TText);
if Assigned(t) then
t.Text:='Row '+IntToStr(Row);
end;
end;
end;

end.

亲切的问候。伊恩。

最佳答案

所有这些都提醒我,我还没有写关于此的博客文章。

无论如何,网格单元可以是 TStyledControl 的任何后代(基本上是任何控件)。文本单元格的默认值是 TTextCell,它只是一个 TEdit。作为 TEdit 意味着更改对齐方式非常简单:只需更改 TextAlign 属性即可。无需搞乱样式(除非您真的想要)。

您的列需要在 CreateCellControl 方法中创建单元格。您实际上正在创建列的实例,这是您的主要问题。

您的列不需要 Create 方法(它什么也不做),因此请将其删除(除非您需要它用于其他用途)并修改您的 CreateCellControl。

function TStringColNum.CreateCellControl: TStyledControl;
begin
Result:=inherited;
TTextCell(Result).TextAlign := taTrailing;
end;

最后,您的 GetValue 事件处理程序只需返回值即可:

procedure TForm1.Grid1GetValue(Sender: TObject; const Col, Row: Integer;
var Value: Variant);
begin
if Col=0 then
Value:='Row '+IntToStr(Row);

if Col=1 then
Value := 'Row '+IntToStr(Row);
end;

关于delphi - Firemonkey 网格控制 - 将列右对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9250491/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com