私のアプリケーションでは、複数のフォームが同時に表示され、同じサイズの単位でディスクスペース(ファイル、ハードディスクサイズなど)が表示されます。だから、それらのすべては、バイト、KB、MB、GBまたはTBのディスク容量を表示します。私はまた、別のフォームで必要なディスプレイのサイズを変更することができる別の設定フォームを持っています。ユーザーが設定フォームで[OK]をクリックすると、他のすべての(開いている)フォームですぐにサイズ設定が変更されます。複数のフォームをDelphiで複数のフォームに送信する方法
すべてのフォームには、保護されたプロシージャSetViewSettingsがあり、ジョブを処理します。それらはすべて、SetViewSettingsを仮想および抽象として定義する先祖フォームの子孫です。実際に表示されるフォームは、祖先のSetViewSettingsメソッドをオーバーライドします。これまでのところ問題はありません。
私はすべての個々のフォーム(FormX.SetViewSetttings、FormY.SetViewSettings、など)を呼び出すにしたくないので、私は以下のソリューションを使用しています:
procedure TApplicationForms.SetUnits;
var
I: Integer;
begin
for I := 0 to Screen.FormCount - 1 do
if Screen.Forms[I] is TfrAncestorInfo then
with Screen.Forms[I] as TfrAncestorInfo do
acSetUnits.Execute;
end;
この手順は次のようにSettingsFormから呼び出されますユーザーは[OK]をクリックします。 TFrAncestorInfoは、TFormの子孫であり、SetViewSettingsメソッドを仮想および抽象として宣言します。 acSetUnitsはTfrAncestorInfoで宣言されたActionで、SetViewSettingsだけを呼び出します。これはうまくいきますが、SetViewSettingsメソッドをオーバーライドするのを忘れている間、TFrAncestorInfoの新しい子孫フォームを作成するリスクがあります。この場合、「抽象エラー」例外が発生します。
すべての子孫フォームを個別に表示(呼び出し)せずに、フォームでSetViewSettingsメソッドを呼び出す方法はありますか。私はメッセージや出来事を知っていますが、私は複数形の状況でこれらをどのように使うべきか分かりません。一般的に、TFrAncestorInfoのすべての子孫フォームに対して、個別にリストすることなく直接メッセージを送信したり、イベントを生成したりするにはどうすればよいですか?
簡単な解決策は、例えば、 'acSetUnits.Execute'を捨てすること、および'非抽象SetViewUnits'が、空または最小限の共有コードのいずれかになるだろう'FViewUnits:= Value'。また、 'acSetUnits.Execute'を捨て、' SetViewUnits(newUnits) 'を直接呼び出してください。 –