我正在使用 Delphi 11 Alexandria 并正在構建一個 FMX 專案以在 Windows、iOS 和 Android 上發布。
我正在構建一個手動語言翻譯系統,為此我生成了一個映射檔案,該檔案將語言文本映射到使用組件名稱映射的組件。
我的客戶堅持不應該使用自動翻譯技術。
我的代碼適用于所有接受TComboBox和TListItem?
TListItem當我為啟動時設定文本值時,它可以作業。例如,設計時間值是英語,如果保存狀態確定最后使用的語言是德語,那么這個函式成功地改變了下拉文本和標題文本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;
uj5u.com熱心網友回復:
這確實不是組件中的錯誤,TListBoxItem而是TComboBox組件中的錯誤。它有一個優化,可以防止每次顯示下拉串列時重新創建專案串列,除非添加或洗掉專案或通過Items屬性替換整個串列。似乎簡單地更改專案的文本不會觸發這種下拉娛樂。
一種解決方法是通過將源檔案復制FMX.ListBox.pas到您的專案檔案夾并注釋掉程序中的FItemsChanged檢查來禁用此優化TCustomComboBox.InitPicker:
// if FItemsChanged then <-- disable this check
// begin
AListPicker.Values := Items;
FItemsChanged := False;
// end;
請注意,這是基于 Delphi 11.0 源檔案。Delphi 以前/未來版本的解決方法可能會有所不同。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/447973.html
上一篇:如何在VCLTMemo控制元件的按鍵事件處理程式中檢測Ctrl Alt x?
下一篇:使用QT的C庫
