首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Delphi无法在运行时更改TCombobox TListItem的下拉文本

Delphi无法在运行时更改TCombobox TListItem的下拉文本
EN

Stack Overflow用户
提问于 2022-03-11 11:05:37
回答 1查看 133关注 0票数 2

我正在使用Delphi11Alexandria,并正在构建一个FMX项目,以便在Windows、iOS和Android上发布。

我正在构建一个手动语言翻译系统,为此,我生成了一个映射文档,将语言文本映射到使用组件名称映射的组件。

我的客户坚持不使用自动翻译技术。

我的代码对所有东西都很好,接受TComboBoxTListItem

当我在启动时为TListItem设置文本值时,它可以工作。例如,设计时值是英文的,如果保存状态确定最后使用的语言是Deutschland,则此函数成功地更改了TComboBox的下拉文本和标题文本(非常奇怪)。

但是,当我在启动后更改语言以更改所有文本时,它不会更改下拉文本,而是会更改标题文本值。

也就是说,我最初以英语加载文本,保存状态以英语加载,然后改为Deutschland。

当我更改为Deutschland时,ComboBox中的标题文本显示"Bereich“,但是下拉值表示"Area”。这是对所有的下拉值,只有标题文本变化,而不是下拉值?

请注意:我已经添加了if语句if cmp is TListBoxItem then,以便于定位任何其他代码以使其工作。

代码语言:javascript
运行
复制
procedure setLangTextVal(cmp: TComponent; text: string);
var
  Ctx: TRttiContext;
  Prop: TRttiProperty;
begin
  Prop := Ctx.GetType(cmp.ClassType).GetProperty('Text');
  if (Prop <> nil) and (Prop.Visibility in [mvPublic, mvPublished]) then
  begin
    if cmp is TListBoxItem then
      Prop.SetValue(cmp, text)
    else
      Prop.SetValue(cmp, text);
    Exit;
  end;

  Prop := Ctx.GetType(cmp.ClassType).GetProperty('Caption');
  if (Prop <> nil) and (Prop.Visibility in [mvPublic, mvPublished]) then
  begin
    Prop.SetValue(cmp, text);
    Exit;
  end;
end;
EN

Stack Overflow用户

回答已采纳

发布于 2022-03-21 15:41:25

这确实是一个错误,不是在TListBoxItem中,而是在TComboBox组件中。它有一个优化,可以防止每次显示下拉列表时重新创建项目列表,除非添加或删除项,或者通过Items属性替换整个列表。似乎简单地改变项目的文本并不会触发这样的下垂娱乐。

解决方法是通过将源文件FMX.ListBox.pas复制到项目文件夹并在TCustomComboBox.InitPicker过程中注释掉FItemsChanged检查,从而禁用此优化:

代码语言:javascript
运行
复制
// if FItemsChanged then          <-- disable this check
// begin
  AListPicker.Values := Items;
  FItemsChanged := False;
// end;

注这是基于Delphi11.0源文件。对于以前的/将来的Delphi版本,解决方法可能有所不同。

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71437555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档