Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Result := Text, heißt dass @Result = @Text (https://www.delphipraxis.net/83412-result-%3D-text-heisst-dass-%40result-%3D-%40text.html)

Muetze1 2. Jan 2007 13:48

Re: Result := Text, heißt dass @Result = @Text
 
... Und da man das Anlegen und freigeben von Objekten auf der gleichen Ebene handeln sollte zum besseren Verständnis und Pflege des Quellcodes, würde ich das ganze so umstellen:

Delphi-Quellcode:
procedure x;
var
  S: TStrings;
begin
  S := TStringList.Create;
  try
    DeineFunktion(S);
  finally
    S.Free;
  end;
end;

Procedure DeineFunktion(Const AList: TStrings);
Begin
  AList.Add('Whatever');
  AList.Add('you');
  AList.Add('want');
  AList.Add('him');
  AList.Add('Todo');
  AList.Add('...');
End;
Es ist eine echt widerliche Abart von manchen Programmierern sowas zu veranstalten und in einer Procedure eine Instanz anzulegen und dann zurück zu geben. Ich habe früher so einen Müll verzapft (Siehe TXMLAttributes in meiner XMLLib), aber heute bin ich um Erfahrungen reicher und würde solche schwachsinnigen Konstruktionen um jeden Preis vermeiden.

Christian Seehase 2. Jan 2007 13:49

Re: Result := Text, heißt dass @Result = @Text
 
Moin Fabian,

Zitat:

Zitat von xZise
Wenn wird jetzt "Result" wieder freigegeben?

das ist genau das Problem, wenn man Objekte als Rückgabewert einer Funktion verwendet.
Grundsätzlich müsstest Du das Objekt freibeben, wenn Du es nicht mehr brauchst, aber dies natürlich, an der Stelle, an die Du den Wert übergeben hast, nicht innerhalb der Funktion.
Da man aber nicht gezwungen ist, den Rückgabewert einer Funktion zuzuweisen, kann man sich damit wunderbar Speicherlöcher einhandeln ;-)

Einfacher wäre es in so einem Falle das Ergebnis in einem Parameter zurückzugeben, der dann einfach bereits die Instanz eines Objektes enthält, in die dann die Rückgabe geschrieben wird.

BTW:
Kennt irgendjemand eine Funktion die ein neu erzeugtes Objekt als Rückgabewert hat?

ste_ett 2. Jan 2007 13:50

Re: Result := Text, heißt dass @Result = @Text
 
Zitat:

Zitat von xZise
Aso ;)

Gut ^^ Dann ist das hier abgeschlossen ;)

PS: Eins interessiert mich noch: Wäre "Result := Text" = "@Result := @Text"?

Nein, Result und Text sind Pointer und du lässt Result auf dieselbe Stelle wie Text zeigen.
Mit @ änderst du die Speicheradresse, nicht aber den Wert der Variable.

xaromz 2. Jan 2007 13:54

Re: Result := Text, heißt dass @Result = @Text
 
Hallo,
Zitat:

Zitat von Christian Seehase
BTW:
Kennt irgendjemand eine Funktion die ein neu erzeugtes Objekt als Rückgabewert hat?

Da fällt mir spontan COM ein, bzw. Class Factories allgemein. Ist aber wohl ein anderes Thema.

Gruß
xaromz

Der_Unwissende 2. Jan 2007 13:57

Re: Result := Text, heißt dass @Result = @Text
 
Zitat:

Zitat von Christian Seehase
BTW:
Kennt irgendjemand eine Funktion die ein neu erzeugtes Objekt als Rückgabewert hat?

HI,
oh da gibt es doch einige:
  • Viele Implementierungen des Factory-Pattern
  • CreateBrush / CreateFont (etc.) bei den RaveReports
  • Add-Funktionen, die nur die Referenz auf das neue Objekt liefert (z.B. in der TListView)

Da kann man dann schon alleine jeweils ins Detail gehen. Dass einige davon dann auch verwaltet sind (also aut. einen Owner zugewiesen bekommen sollten/müssten/dürften gehört ja nicht direkt zu deiner Frage :wink:)

Gruß Der Unwissende

xZise 2. Jan 2007 18:51

Re: Result := Text, heißt dass @Result = @Text
 
So ;)

Jetzt habe ich die Hinweise so gut es ging berücksichtigt ;)

@ Create... als Namen: Habe ich nicht umgesetzt, weil jetzt ja da nichts mehr "createt" wird.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:48 Uhr.
Seite 2 von 2     12   

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-2025 by Thomas Breitkreuz