【发布时间】:2022-09-24 16:29:32
【问题描述】:
我有一个包含标签、按钮、备忘录等的面板,我希望在该面板上禁用每个组件,单独(即Enabled 为假)。
我希望单独禁用组件(而不仅仅是禁用面板本身)以向使用我的程序的人显示对象存在但无法使用(它们是变灰因为Enabled 属性为假)。
有没有更快的方法来禁用所有这些立刻,而不是将每个组件的 Enabled 属性更改为 false?
标签: delphi delphi-2010 vcl
我有一个包含标签、按钮、备忘录等的面板,我希望在该面板上禁用每个组件,单独(即Enabled 为假)。
我希望单独禁用组件(而不仅仅是禁用面板本身)以向使用我的程序的人显示对象存在但无法使用(它们是变灰因为Enabled 属性为假)。
有没有更快的方法来禁用所有这些立刻,而不是将每个组件的 Enabled 属性更改为 false?
标签: delphi delphi-2010 vcl
如果您不希望禁用面板的选项,另一个选项是使用ControlsCount 和Controls[i] 循环通过面板内的所有组件。
使用这样的代码,您可以做到:
procedure TForm3.DisableAll(pnl: TPanel);
var
i:integer;
begin
for i := 0 to (pnl.ControlCount - 1) do
SetPropValue(pnl.Controls[i], 'Enabled', False);
可能有组件没有Enabled 属性(例如TBevel),在这种情况下会出错;为此,您可以检查您运行的每个组件是否具有它 (GetPropInfo):
for i := 0 to (pnl.ControlCount - 1) do
if Assigned(GetPropInfo(pnl.Controls[i], 'Enabled')) then
SetPropValue(pnl.Controls[i], 'Enabled', False);
也可以有另一个TPanel(面板2)里面原来的TPanel(面板1) 具有更多组件,如图所示。在这种情况下,此代码只会禁用第一个代码,并且面板2(不是里面的组件面板2)。
如图所示。
如果你想让它运行递归地,您需要运行该函数递归地.像这样的东西:
procedure TForm3.DisableAll(pnl: TPanel);
var
i:integer;
info:PPropInfo;
begin
for i := 0 to (pnl.ControlCount - 1) do
if (pnl.Controls[i] is TPanel) then
DisableAll(TPanel(pnl.Controls[i]))
else
if Assigned(GetPropInfo(pnl.Controls[i], 'Enabled')) then
SetPropValue(pnl.Controls[i], 'Enabled', False);
end;
【讨论】:
有没有更快的方法来禁用所有这些立刻,而不是将每个组件的
Enabled属性更改为 false?最快的方法是禁用面板本身,但您排除了这种可能性。所以不行,没有别的办法。您必须循环浏览面板的组件并一次禁用它们。
【讨论】: