我有一个面板,包括标签,按钮,备忘录等,我希望每个组件在该面板上被禁用,单独(即,Enabled
是假的)。
我希望单独禁用组件(而不仅仅是禁用面板本身),以向使用我的程序的人显示对象在那里,但不能使用(由于Enabled
属性为false),这些对象是灰色的。
是否有一种更快捷的方法同时禁用所有这些组件,而不是将每个组件的Enabled
属性更改为false?
发布于 2022-09-22 00:07:44
如果不希望该选项禁用面板,则另一个选项是使用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
(panel2) (panel1)中也可以有另一个组件,如在图像中。在这种情况下,这段代码只会禁用第一个代码和Panel2 (而不是panel2中的组件)。从图像中可以看到。
如果您希望它运行recursively,,则需要运行函数recursively.就像这样:
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;
结果会是这样的:
发布于 2022-09-21 09:49:10
是否有更快的方法同时禁用所有这些组件,而不是将每个组件的
Enabled
属性更改为false?
最快的方法是仅仅禁用面板本身,但你排除了这种可能性。所以没有别的办法了。您必须循环遍历面板的组件,并一次禁用它们。
https://stackoverflow.com/questions/73804597
复制相似问题