AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Rückgabewert von Function freigeben

Ein Thema von LoL · begonnen am 25. Feb 2005 · letzter Beitrag vom 28. Feb 2005
Antwort Antwort
Seite 1 von 3  1 23      
LoL
(Gast)

n/a Beiträge
 
#1

Rückgabewert von Function freigeben

  Alt 25. Feb 2005, 11:25
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 einfach fragen
  Mit Zitat antworten Zitat
KrasserChecker

Registriert seit: 21. Jul 2004
120 Beiträge
 
#2

Re: Rückgabewert von Function freigeben

  Alt 25. Feb 2005, 11:28
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)
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.202 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Rückgabewert von Function freigeben

  Alt 25. Feb 2005, 11:29
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 von LoL:
wie kann ich die zurückgegeben komponente freigeben?
CurrentOL.Free
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?
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
LoL
(Gast)

n/a Beiträge
 
#4

Re: Rückgabewert von Function freigeben

  Alt 25. Feb 2005, 11:36
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)
  Mit Zitat antworten Zitat
KrasserChecker

Registriert seit: 21. Jul 2004
120 Beiträge
 
#5

Re: Rückgabewert von Function freigeben

  Alt 25. Feb 2005, 11:39
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).
  Mit Zitat antworten Zitat
LoL
(Gast)

n/a Beiträge
 
#6

Re: Rückgabewert von Function freigeben

  Alt 25. Feb 2005, 11:45
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

Re: Rückgabewert von Function freigeben

  Alt 25. Feb 2005, 11:49
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^);
$2B or not $2B
  Mit Zitat antworten Zitat
KrasserChecker

Registriert seit: 21. Jul 2004
120 Beiträge
 
#8

Re: Rückgabewert von Function freigeben

  Alt 25. Feb 2005, 11:51
Richtig, wollte ich auch gerade sagen. HAbe nur zu langsam

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;
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#9

Re: Rückgabewert von Function freigeben

  Alt 25. Feb 2005, 11:54
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
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#10

Re: Rückgabewert von Function freigeben

  Alt 25. Feb 2005, 11:58
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.
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:12 Uhr.
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