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 がありますか」と答える 1 つの一般的なテストにまとめる方法があるかもしれませんが、それが何であるかはわかりません。
誰かが私の答えを建設的に批判してくれることを願っています (反対票を投じるだけではなく)。