Как изменить заголовок всех элементов управления в форме? [C++ Builder]
Я хочу установить заголовок для всех элементов управления (Tlabel, Tbutton, Teditlabel, Tbitbtn, TGroupBox и т. Д.) И всех компонентов (TMenuItems, TActions), которые имеют заголовок из языкового файла.
Моя проблема в том, что Caption не является общедоступным в TComponent, TControl или даже TWinControl. Более того, некоторые "общие" элементы управления, такие как TLabel / TBitBtn, даже не являются производными от TWinControl.
Пример:
void SetCaptionAll(TComponent *container)
{
for (int i = 0; i < container->ComponentCount; i++)
{
TComponent *child = container->Components[i];
child->Caption = ReadFromFile; <-- This won't work. Caption is private
}
}
Самое главное: я не хочу использовать макрос (я думаю, это то, что называется), например:
#define GetCtrlCaption(p)\
{ code here }
потому что это не отлаживается.
Мне нужен пример C++ Builder, но Delphi также принимается.
1 ответ
Работает для всех потомков TControl:
for i := 0 to ControlCount - 1 do
Controls[i].SetTextBuf('CommonText');
Чтобы просмотреть все элементы управления, в том числе на дочерних элементах, таких как панели, вы можете использовать рекурсивный обход:
procedure SetControlText(Site: TWinControl; const s: string);
var
i: Integer;
begin
for i := 0 to Site.ControlCount - 1 do begin
Site.Controls[i].SetTextBuf(PWideChar(s));
if Site.Controls[i] is TWinControl then
SetControlText(TWinControl(Site.Controls[i]), s);
end;
end;
begin
SetControlText(Self, 'CommonText');
Для таких компонентов, как TMenuItems
Вы можете использовать RTTI - проверьте, есть ли у компонента свойство Caption, Text
и т.д. и установить новую строку.
Пример RTFI Delphi с использованием подхода старого стиля (новый RTTI доступен с D2010). Не уверен, что это работает для Builder
uses... TypInfo
if IsPublishedProp(Site.Controls[i], 'Caption') then
SetStrProp(Site.Controls[i], 'Caption', 'Cap');