我正在使用Delphi11Alexandria,并正在构建一个FMX项目,以便在Windows、iOS和Android上发布。
我正在构建一个手动语言翻译系统,为此,我生成了一个映射文档,将语言文本映射到使用组件名称映射的组件。
我的客户坚持不使用自动翻译技术。
我的代码对所有东西都很好,接受TComboBox
和TListItem
当我在启动时为TListItem
设置文本值时,它可以工作。例如,设计时值是英文的,如果保存状态确定最后使用的语言是Deutschland,则此函数成功地更改了TComboBox
的下拉文本和标题文本(非常奇怪)。
但是,当我在启动后更改语言以更改所有文本时,它不会更改下拉文本,而是会更改标题文本值。
也就是说,我最初以英语加载文本,保存状态以英语加载,然后改为Deutschland。
当我更改为Deutschland时,ComboBox中的标题文本显示"Bereich“,但是下拉值表示"Area”。这是对所有的下拉值,只有标题文本变化,而不是下拉值?
请注意:我已经添加了if
语句if cmp is TListBoxItem then
,以便于定位任何其他代码以使其工作。
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;
发布于 2022-03-21 15:41:25
这确实是一个错误,不是在TListBoxItem
中,而是在TComboBox
组件中。它有一个优化,可以防止每次显示下拉列表时重新创建项目列表,除非添加或删除项,或者通过Items
属性替换整个列表。似乎简单地改变项目的文本并不会触发这样的下垂娱乐。
解决方法是通过将源文件FMX.ListBox.pas
复制到项目文件夹并在TCustomComboBox.InitPicker
过程中注释掉FItemsChanged
检查,从而禁用此优化:
// if FItemsChanged then <-- disable this check
// begin
AListPicker.Values := Items;
FItemsChanged := False;
// end;
注这是基于Delphi11.0源文件。对于以前的/将来的Delphi版本,解决方法可能有所不同。
https://stackoverflow.com/questions/71437555
复制相似问题