In meiner Anwendung habe ich mehrere Formulare, die zur gleichen Zeit sichtbar sein können und alle zeigen Speicherplatz (Dateien, Festplattengröße usw.) in der gleichen Größe Einheiten. Alle von ihnen zeigen Speicherplatz in Bytes, KB, MB, GB oder TB. Ich habe auch ein separates Einstellungsformular, in dem der Benutzer die Anzeigegröße ändern kann, die er in den anderen Formen möchte. Sobald der Benutzer im Einstellungsformular auf OK klickt, möchte ich, dass alle anderen (offenen) Formulare sofort ihre Größeneinstellungen ändern.So senden Sie ein Ereignis an mehrere Formulare in Delphi
Jedes Formular verfügt über eine geschützte Prozedur SetViewSettings, die sich um den Job kümmert. Sie sind alle Abkömmlinge einer Vorfahrenform, die SetViewSettings als virtuell und abstrakt definiert. Die tatsächlich angezeigten Formulare überschreiben die SetViewSettings-Methode des Vorfahren. Bis jetzt keine Probleme.
Weil ich mag nicht jede einzelne Form nennen (FormX.SetViewSetttings, FormY.SetViewSettings, etc.), ich die folgende Lösung verwenden:
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;
Dieses Verfahren aus dem SettingsForm aufgerufen wird als Der Benutzer klickt auf OK. TFrAncestorInfo ist ein Nachkomme von TForm und deklariert die SetViewSettings-Methode als virtuell und abstrakt. acSetUnits ist eine in TfrAncestorInfo deklarierte Aktion, die nur SetViewSettings aufruft. Das alles funktioniert gut, aber das Risiko liegt darin, eine neue Abkömmlingsform von TFrAncestorInfo zu erstellen, während Sie vergessen, die SetViewSettings-Methode zu überschreiben. In diesem Fall werden Sie auf eine 'Abstract Error'-Ausnahme stoßen.
Gibt es Alternativen zum Aufrufen der SetViewSettings-Methode in den Formularen, ohne alle untergeordneten Formulare einzeln aufzulisten (aufzurufen)? Ich kenne Nachrichten und Ereignisse, aber ich weiß nicht, wie man diese in einer Situation mit mehreren Formen benutzt. Allgemein: Wie kann ich eine Nachricht an alle TFrAncestorInfo-Abkömmlingsformulare direkt senden oder ein Ereignis generieren, ohne sie einzeln aufzulisten?
Eine einfachere Lösung wäre, die 'acSetUnits.Execute' zu Graben, und machen' SetViewUnits' nicht abstrakt, sondern entweder leer oder mit minimalem shared Code, z.B. 'FViewUnits: = Wert'. Ziehen Sie auch die 'acSetUnits.Execute' ab und rufen Sie' SetViewUnits (newUnits) 'direkt auf. –