Moin,
Und wie rufe ich die procedure ShowListCount(); aus Form3?
das geht dann auf verschiedenen Wegen. Zum Beispiel
hoika bietet eine Lösung an. Die setzt allerdings voraus das die Form3, die Form1 kennt und auch sie nutzt Form1. Ersteres führt vermutlich zu einer zyklischen Einbindung und ich zumindest "hasse" sowas
auch wenn es einen "Workaround" gibt.
Eine andere Möglichkeit wäre:
Delphi-Quellcode:
type
TEmptyEvent = procedure() of object; // Evtl. gibts das schon
TForm1 = class(TForm)
[...]
private
procedure ShowListCount();
[...]
public
procedure ShowForm3();
[...]
end;
TForm3 = class(TForm)
[...]
private
FShowListCount : TEmptyEvent;
[...]
public
property OnShowListCount : TEmptyEvent read FShowListCount write FShowListCount;
[...]
end;
var
[...]
Form3 : TForm3;
[...]
procedure foo();
begin
if Assigned(Form3) then
Form3.Caption := 'Haha!';
end;
procedure TForm1.ShowForm3();
var
f : TForm3;
begin
f := TForm3.Create();
try
//foo; // siehe unten
f.OnShowListCount := ShowListCount;
f.Show; // oder modal
finally
f.Free;
end;
end;
Das ist natürlich etwas komplizierter, aber hier muss die
Unit der Form1 nur die
Unit der Form3 kennen. So arbeiten übrigens auch die Ereignisse von den Komponenten (TButton.OnClick zum Beispiel). Ereignisse haben den großen Vorteil, dass die auslösende Klasse die andere Klasse nicht kennen muss.
Um das Ereignis auszulösen musst du nur folgendes Codesegment einfügen:
Delphi-Quellcode:
if Assigned(FShowListCount) then
FShowListCount();
Die if-Abfrage verhindert, dass er versucht Ereignisse zu feuern die es nicht gibt. Du kannst übrigens alle ()-Blöcke löschen
Das kommt von Java/C#.
Außerdem kann ich damit verdeutlichen, warum man nicht Form3 oder sowas nehmen sollte (i.A. globale Variablen).
Wenn du jetzt nämlich den auskommentierten Befehl "foo" aufrufst, dann ändert er nicht (!) die Caption von der Form, die in f steht. Weil f != Form3 ist.
Wegen dein Kommentar: Du kannst die Methode auch weiterhin an mehreren Stellen aufrufen, und gerade dafür sind ja Methoden da.
MfG
Fabian