![]() |
Rückgabewert von Function freigeben
hallo
folgendes: ich habe eine Function mir was vom Typ TComponent zurück gibt:
Delphi-Quellcode:
Warum kann ich nun die Procedure FreeAndNil(CurrentOL) nicht anwenden?
function CurrentOL : TComponent;
begin if ... then result := EineKomponente else result := EineAndereKompoente; end; Fehler: Constant object cannot be passed as var parameter wie kann ich die zurückgegeben komponente freigeben? 2. Wie kann ich dann mit der zurückgegebenen komponente wieder eine TComponent erstellen (CurrentOL := TComponent.Create(form1);) das geht ja nicht... Ist vielleicht ein bisschen komisch erklärt aber wenn ihr fragen habt :mrgreen: einfach fragen |
Re: Rückgabewert von Function freigeben
FreeAndNil erwartet einen VAR-Parameter. D.h. die Funktion will den übergebenen Wert ändern (schließlich setzt die Methode die übergebene Variable auf "nil").
Einer Funktion kann kein Wert zugewiesen werden, daher kannst Du deine Funktion auch nicht direkt an FreeAndNil weitergeben. Lösung:
Delphi-Quellcode:
var temp: TObject;
begin temp := CurrentOL; FreeAndNil(temp); end; Zitat:
|
Re: Rückgabewert von Function freigeben
Zitat:
Und das wird schlecht für eine Funktion gehen. Zitat:
Delphi-Quellcode:
CurrentOL.Free
Zitat:
|
Re: Rückgabewert von Function freigeben
ok erst mal danke.
das freigeben hab ich jetzt schon verstanden. jetzt will ich nachdem ich sie freigegeben habe wieder "erstellen" also zurückgegebene variable := TComponent.create(form1) |
Re: Rückgabewert von Function freigeben
Stell doch deine Methode einfach auf einen Var-Parameter um:
Delphi-Quellcode:
Nein, vergiss es, mal wieder erst geschrieben und dann nachgedacht. Dadurch schreibst den neuen Zeiger ja nicht in die alte Variablen (EineKomponente oder EineAndereKompoente). :wall:
procedure CurrentOL(var Value : TComponent);
begin if ... then Value := EineKomponente else Value := EineAndereKompoente; end; procedure DoSomething; var temp: TObject; begin CurrentOL(temp); temp.Free; temp := TIrgendwas.Create(form1); end; |
Re: Rückgabewert von Function freigeben
genau das war ja eigentlich meine frage ich arbeite ja nur mit der temnporären kompoente und das wird ja nicht auf die ursprünglich komponente übertrangen :wink:
|
Re: Rückgabewert von Function freigeben
Du könntest ja auch mit Zeigern arbeiten?
Also in etwa so:
Delphi-Quellcode:
function CurrentOL : Pointer;
begin if ... then result := @EineKomponente else result := @EineAndereKompoente; end; FreeAndNil(CurrentOL^); |
Re: Rückgabewert von Function freigeben
Richtig, wollte ich auch gerade sagen. HAbe nur zu langsam :coder:
Delphi-Quellcode:
function CurrentOL: Pointer;
begin if ... then Result := @EineKomponente else Result := @EineAndereKompoente; end; procedure DoSomething; var temp: Pointer; begin temp := CurrentOL; temp^.Free; temp := TIrgendwas.Create(form1); end; |
Re: Rückgabewert von Function freigeben
Kann mir das mal jemand erklären?
nehmen wir an ich hätte folgende Funktion:
Delphi-Quellcode:
Wenn ich nun das mache:
function Foo: TBitmap;
begin Result := TBitmap.Create; end;
Delphi-Quellcode:
Theoretisch müsste wohl B freigegeben werden, also das Objekt das "Foo" erstellt hat, schließlich wird das Objekt bei den Zuweisungen nicht kopiert, oder doch?
var
B: TBitmap; begin B := Foo; B.Free; end; Greetz alcaeus |
Re: Rückgabewert von Function freigeben
Ja alcaeus, so klappt es, aber da in diesem fall nicht .Free, sonder Funktion FreeAndNil verwendet wird, wird eine Variable benötogt und Funktionen lievern nunmal Konstanten als unktionsergebnis.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:27 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz