malabarista hat geschrieben:Code: Alles auswählen
procedure TFoffice.tische(Sender: TObject);
var
tisch_v:TFtisch;
begin
tisch_v:=TFtisch.Create(Nil);
tisch_v.Show;
Oder ist dieser Aufruf völlig falsch ?
Völlig falsch nicht, aber gefährlich. Der Parameter, der bei Create angegeben wird, ist der "Owner" eines Objekts. Das ist das Objekt, der dafür zuständig ist, die zu erzeugende Instanz, also "tisch", wieder freizugeben. Du verwendest dafür "nil", also niemand, also musst du das machen, sonst hat du ein Speicherleck. Zudem ist die Instanz "tisch" eine lokale Variable der aufrufenden Prozedur, du hast also nach dem Verlassen der Prozedur keine Chance mehr zu erkennen, welches Objekt da zu zerstören ist. Pascal hat keine Garbage-Collection, die dafür sorgen würden, dass ein Objekt, dessen Gültigkeit erlischt (beim Verlassen von "tische"), automatisch freigegeben wird.
Besser: Verwende self als Owner. Self meint die Klasse, zu der die aufrufende Methode gehört. Damit wird TFtisch immer dann zerstört, wenn auch TOffice zerstört wird. "nil" verwende ich als Owner nur im überschaubaren Zusammenhang, wo man erkennen kann, dass das Objekt auch wieder zerstört wird, also so:
Code: Alles auswählen
procedure TFoffice.tische(Sender: TObject);
var
tisch_v: TFtisch;
begin
tisch_v := TFtisch.Create(nil);
try
TuEtwasMitTisch(tisch_v);
finally
tish_v.Free;
end;
end;