问题描述
在 Delphi 10.4 的 Firemonkey 中。我想构建一个列表视图,其中列表视图项文本根据列表项内容显示为左对齐或右对齐。
我这样做如下:
procedure TForm1.FormCreate(Sender: TObject);
procedure AddItem(No: integer);
var
Item: TListViewItem;
begin
Item := ListView1.Items.AddItem(No);
Item.Text := 'Text item No ' + No.ToString;
Item.Tag := No;
if No mod 2 = 0 then
Item.Objects.TextObject.TextAlign := TTextAlign.Leading
else
Item.Objects.TextObject.TextAlign := TTextAlign.Trailing;
end;
var
c: integer;
begin
for c := 0 to 9 do
AddItem(c);
end;
然而,这并不适用于所有平台。但是,一旦 ListView 更改其大小,所有 ListItems 都会在左侧显示为齐平。有没有更好的方法来做到这一点?
作为一种解决方法,我做了以下工作:
procedure TForm1.ListView1Resized(Sender: TObject);
var
c: integer;
begin
for c := 0 to ListView1.ItemCount - 1 do
if ListView1.Items[c].Tag mod 2 = 0 then
ListView1.Items[c].Objects.TextObject.TextAlign := TTextAlign.Leading
else
ListView1.Items[c].Objects.TextObject.TextAlign := TTextAlign.Trailing;
end;
解决方法
使用 ItemAppearance=ListItem
无法解决此问题,因为在内部 ResetView
方法中,Item.Objects.TextObject
的所有属性都将写回 ItemAppearanceObjects.ItemObjects
。
因此,此应用程序的 ItemAppearance
必须设置为 DynamicAppearance
。必须在 TextObjectAppearance
下的 Structure View 中手动创建两个 ListView.ItemAppearance.Item
对象,其中 Text1
必须设置为 TextAlign=Leading
和 {{1} } 到 Text2
。
之后,只有一个 Text Object 必须填充文本:
TextAlign=Trailing
这里是对应的 FMX 文件:
procedure TForm1.FormCreate(Sender: TObject);
procedure AddItem(No: integer);
var
Item: TListViewItem;
begin
Item := ListView1.Items.AddItem(No);
if No mod 2 = 0 then
Item.Data['Text1'] := 'Text item No ' + No.ToString
else
Item.Data['Text2'] := 'Text item No ' + No.ToString
end;
var
c: integer;
begin
for c := 0 to 9 do
AddItem(c);
end;