基于 Guillem 的帖子:
关闭一切:
使用 for 循环遍历表单上的每个组件,如下所示,将属性更改为所需的值。
如果您想稍后恢复到原始属性值,则必须保存原始值(因为下面使用了 OldEvent。)
编辑:下面的代码显示了正在讨论的关键概念。如果在运行时添加或删除组件,或者如果您想使用绝对最少的内存量,那么使用动态数组,正如 Pieter 建议的那样,存储指向组件的指针而不是索引它们。
const
MAX_COMPONENTS_ON_PAGE = 100; // arbitrarily larger than what you'd expect. (Use a dynamic array if this worries you.
var
OldEvent: Array[0.. MAX_COMPONENTS_ON_PAGE - 1] of TNotifyEvent; // save original values here
i: Integer;
begin
for i := 0 to ComponentCount - 1 do
begin
if (Components[i] is TCheckBox) then
begin
OldEvent[i] := TCheckBox(Components[i]).OnClick; // remember old state
TCheckBox(Components[i]).OnClick := nil;
end
else if (Components[i] is TEdit) then
begin
OldEvent[i] := TEdit(Components[i]).OnClick; // remember old state
TEdit(Components[i]).OnClick := nil;
end;
end;
恢复到以前的值
for i := 0 to ComponentCount - 1 do
begin
if (Components[i] is TCheckBox) then
TCheckBox(Components[i]).OnClick := OldEvent[i]
else if (Components[i] is TEdit) then
TEdit(Components[i]).OnClick := OldEvent[i];
end;
可能有一种方法可以将所有 if 语句折叠到一个通用测试中,该测试回答“这个组件是否有 OnClickEvent”——但我不知道它是什么。
希望有人会建设性地批评我的回答(而不是仅仅投反对票。)但是,希望我上面展示的内容是可行的。