TListBoxItem的WordWrap

时间:2015-02-13 19:30:08

标签: delphi listbox firemonkey word-wrap

我正在使用Delphi XE7(Firemonkey)创建RSS提要应用程序,并且文章显示为Listbox :(标题的ListBoxItem文本和文章的ListBoxItem的详细信息)。 但正如您在此屏幕截图中看到的那样:

1 http://www.evolutiongraph.fr/chevereto/images/2015/02/13/Capture.jpg

文章太长,不回来。 ListBox的属性WordWrap不存在。 所以我一直在寻找解决这个问题的方法,但我找不到。

你能帮帮我吗?如果不可能这样做,你能否提出另一种展示文章的方法? 谢谢!

2 个答案:

答案 0 :(得分:4)

使用TListBox(正如您所做的那样):

在运行时,ListBoxItems已经在aListBoxItem.StyledSettings中存储了计算样式。 要在运行时更改设置,首先必须将其从样式设置列表中删除。

例如,如果您要更改FontColor,请首先删除'样式'字体颜色:

aListboxItem.StyledSettings := aListboxItem.StyledSettings - [TStyledSetting.FontColor];

然后再申请一个:

aListboxItem.FontColor := TAlphaColors.Green;

WordWrap属性在TStyledSetting.Other中定义。 改变它:

aListboxItem.StyledSettings := aListboxItem.StyledSettings - [TStyledSetting.Other];

aListboxItem.WordWrap := True;

列出了TStyledSetting个常量和相应的TTextSettings属性here in Delphi's doc

访问TListBoxItem媒体资源时 theListBox.Items[i]可以访问项目内容,而不是项目本身。 要获取ListboxItem作为控件,然后对其属性进行操作,您可以使用:

aListboxItem := theListBox.ListItems[i]; 

aListboxItem := theListBox.ItemByIndex(i);

两者给出完全相同的结果,我不能说一个是否更好。

关于文字高度: 将文本包装在控件中后,您可能需要调整控件的高度以显示整个文本。 这可以使用OnApplyStyleLookup

TTextLayout事件中完成
uses 
... ,FMX.TextLayout;

procedure TfrmForm1.ListBoxItem1ApplyStyleLookup(Sender: TObject);
var
  myLayout: TTextLayout;
  i: integer;
  aPoint: TPointF;
begin

  myLayout := TTextLayoutManager.DefaultTextLayout.Create;
  myLayout.BeginUpdate;

  // Setting the layout MaxSize
  aPoint.X := ListBoxItem1.Width;
  aPoint.Y := TfrmForm1.Height;
  myLayout.MaxSize := aPoint;

  myLayout.Text := ListBoxItem1.Text;
  myLayout.WordWrap := True ;
  myLayout.Font := ListBoxItem1.Font;
  myLayout.HorizontalAlign := ListBoxItem1.TextSettings.HorzAlign;
  myLayout.VerticalAlign := ListBoxItem1.TextSettings.VertAlign;
  myLayout.Padding := ListBoxItem1.Padding;
  // set other properties as needed

  myLayout.EndUpdate;

  ListBoxItem1.Height := Trunc(myLayout.TextHeight) + 3 ;

end;

请注意,MaxSize是限制性的。例如,aPoint.Y将限制最终的TextHeight。 您应该将其设置得很大,因为无论TextHeight应该是什么,如果myLayout.TextHeight大于myLayout.MaxSize.Y,那么myLayout.TextHeight将设置为myLayout.MaxSize.YTTextLayoutListBoxItem1.Font.Size = 14个属性。

N.B。:您可能必须在测量文本高度之前在运行时指定字体大小,或者在设计时设置与默认值不同。 在我的测试设备(Samsung Note 2)上,默认字体大小为14(myLayout.TextHeight),但它呈现为18.并且它不是规模问题。 然后,Font.Size = 14的计算使用ListBoxItem完成,而Font.Size = 18仍将呈现Font.Size,仍然不合适。 通过添加:

,在布局计算之前重置ListBoxItem1.StyledSettings := ListBoxItem1.StyledSettings - [TStyledSetting.Size] ; ListBoxItem1.Font.Size := ListBoxItem1.Font.Size ; 会很有用
TListView

或者,您可以使用TListView

WordWrap更适合长列表,enctype="multipart/form-data"属性可以在设计时设置。 要在 Object Inspector 中找到它,请转到:

  

ListView1> ItemAppearanceObjects> ItemObjects>文字>自动换行

仍然需要调整大小以适应文本高度。

此CodeRage视频中可以使用ListBox和ListView执行的操作示例。 Here's a list

答案 1 :(得分:1)

您可以尝试使用ListBoxItem.WordWrap。网站http://docwiki.embarcadero.com/

中的更多细节

尝试编写类似的功能:

for I:= 0 To ListBox1.Items.Count - 1 Do
  ListBox1.Items[I].WordWrap := True;