如何访问FMX中TListBox项的TextSettings属性?
如何访问FMX中TListBox项的TextSettings属性?
嗨,我来帮你排查下问题出在哪~
首先你遇到的访问违规,核心问题有两个:
- 索引越界了:你用
BatchSets_ListBox.Items.Count作为ListItems的索引,但ListItems是0基的(第一个项索引是0)。刚执行完Items.Add后,Count会变成新的总数量,比如原来空列表,Add后Count=1,这时候你用1去访问ListItems,自然就越界了,应该用Count - 1来定位刚添加的项。 - BeginUpdate期间的潜在问题:在BeginUpdate和EndUpdate的块里,ListBox会暂停内部的UI更新和控件初始化,这时候直接访问自动创建的ListItems可能会因为控件还没完全初始化而出问题。
不过即使修正了索引,还是有概率踩坑,更稳妥的方式是手动创建TListBoxItem实例,设置好属性后再添加到ListBox,这样你能完全掌控每个项的初始化过程,不会依赖ListBox的自动创建逻辑。
给你两种可行的修正方案:
方案一:修正索引(快速修复原有代码)
如果你想沿用原来的Items.Add方式,只需要把索引改成Count - 1,同时把BeginUpdate/EndUpdate用try-finally包起来,避免异常时忘记EndUpdate:
BatchSets_ListBox.Items.BeginUpdate; try BatchSets_ListBox.Items.Clear; For i := 0 to (Length(MyList) - 1) do Begin BatchSets_ListBox.Items.Add(MyList[i].BATCH_SET_NAME); // 用Count-1访问刚添加的项,0基索引 BatchSets_ListBox.ListItems[BatchSets_ListBox.Items.Count - 1].TextSettings.Font.Size := 18; End; finally BatchSets_ListBox.Items.EndUpdate; end;
方案二:手动创建项(推荐,更稳定)
这种方式可以彻底避免ListBox自动创建项带来的不确定问题,还能方便设置更多TextSettings属性:
var ListItem: TListBoxItem; i: Integer; begin BatchSets_ListBox.Items.BeginUpdate; try BatchSets_ListBox.Items.Clear; For i := 0 to (Length(MyList) - 1) do Begin // 手动创建ListBoxItem,把ListBox作为所有者 ListItem := TListBoxItem.Create(BatchSets_ListBox); try ListItem.Text := MyList[i].BATCH_SET_NAME; // 直接设置TextSettings属性,想改字体颜色、样式都可以在这里加 ListItem.TextSettings.Font.Size := 18; // 示例:设置粗体和红色字体 // ListItem.TextSettings.Font.Style := [TFontStyle.fsBold]; // ListItem.TextSettings.FontColor := TAlphaColors.Red; // 添加到ListBox BatchSets_ListBox.AddObject(ListItem); except // 如果添加失败,释放创建的Item避免内存泄漏 ListItem.Free; raise; end; End; finally BatchSets_ListBox.Items.EndUpdate; end; end;
另外补充下:FMX的TListBox确实有ListItems属性,它是存储所有可见项的集合,但只有当项被完全初始化后才能安全访问,手动创建的方式能确保这一点,所以更推荐用方案二。
备注:内容来源于stack exchange,提问作者Sergio Bonfiglio
相关产品推荐
相关产品推荐

