Как изменить заголовок всех элементов управления в форме?[C ++ Builder] - PullRequest
0 голосов
/ 10 октября 2018

Я хочу установить заголовок для всех элементов управления (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 Ответ

0 голосов
/ 10 октября 2018

Работает для всех потомков 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 и т. д., и установите новую строку.

Пример Delphi RTTI с использованием подхода старого стиля (новый RTTI доступен с D2010).Не уверен, что это работает для Builder

 uses... TypInfo

 if IsPublishedProp(Site.Controls[i], 'Caption') then
   SetStrProp(Site.Controls[i], 'Caption', 'Cap');
...