如何更改窗体上所有控件的标题? [C ++ Builder]

时间:2018-10-10 10:21:16

标签: c++ delphi 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 个答案:

答案 0 :(得分:3)

适用于所有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示例(自D2010开始提供新的RTTI)。不确定works for Builder

 uses... TypInfo

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