Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Rückgabewert von Function freigeben (https://www.delphipraxis.net/41062-rueckgabewert-von-function-freigeben.html)

LoL 25. Feb 2005 10:25


Rückgabewert von Function freigeben
 
hallo

folgendes:
ich habe eine Function mir was vom Typ TComponent zurück gibt:

Delphi-Quellcode:
function CurrentOL : TComponent;
begin
  if ... then result := EineKomponente
  else result := EineAndereKompoente;
end;
Warum kann ich nun die Procedure FreeAndNil(CurrentOL) nicht anwenden?
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

KrasserChecker 25. Feb 2005 10:28

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:

(CurrentOL := TComponent.Create(form1) das geht ja nicht...
siehe oben (Einer Funktion kann kein Wert zugewiesen werden)

Bernhard Geyer 25. Feb 2005 10:29

Re: Rückgabewert von Function freigeben
 
Zitat:

Zitat von LoL
Warum kann ich nun die Procedure FreeAndNil(CurrentOL) nicht anwenden?
Fehler: Constant object cannot be passed as var parameter

Dann schau mal die Implementierung von FreeAndNil an. Dort wird der übergebene Parameter auf nil gesetzt.
Und das wird schlecht für eine Funktion gehen.

Zitat:

Zitat von LoL
wie kann ich die zurückgegeben komponente freigeben?

Delphi-Quellcode:
CurrentOL.Free
Zitat:

Zitat von LoL
Wie kann ich dann mit der zurückgegebenen komponente wieder eine TComponent erstellen

Versteh ich nicht. Die Funktion CurrentOL liefert doch eine TComponent-Instanz zurück?

LoL 25. Feb 2005 10:36

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)

KrasserChecker 25. Feb 2005 10:39

Re: Rückgabewert von Function freigeben
 
Stell doch deine Methode einfach auf einen Var-Parameter um:
Delphi-Quellcode:
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;
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:

LoL 25. Feb 2005 10:45

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:

himitsu 25. Feb 2005 10:49

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^);

KrasserChecker 25. Feb 2005 10:51

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;

alcaeus 25. Feb 2005 10:54

Re: Rückgabewert von Function freigeben
 
Kann mir das mal jemand erklären?

nehmen wir an ich hätte folgende Funktion:

Delphi-Quellcode:
function Foo: TBitmap;
begin
  Result := TBitmap.Create;
end;
Wenn ich nun das mache:

Delphi-Quellcode:
var
  B: TBitmap;
begin
  B := Foo;
  B.Free;
end;
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?

Greetz
alcaeus

himitsu 25. Feb 2005 10:58

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 16:43 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz