Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Procedure Parameter in Pointer sichern (https://www.delphipraxis.net/83685-procedure-parameter-pointer-sichern.html)

ozz 5. Jan 2007 20:45


Procedure Parameter in Pointer sichern
 
Hallo zusammen,
ich möchte gerne den Parameter ContentStream in einen Pointer sichern, damit ich diesen mit TList verwenden kann. Das das Beispiel unten falsch ist weiß ich, jedoch weiß ich nicht, wie ich es richtig machen kann. Hat jemand noch eine Idee?

Besten Dank!

Delphi-Quellcode:
Type PStringStream = ^TStringStream;
....
FResultlist: TList;
....
procedure ThreadResult(ContentStream: TStringStream;);
var P:PStringStream;
begin
  New(p);
  p^:=ContentStream; //<-- Ich weiß, daß dies falsch ist!
  FResultlist.Add(p);

SirThornberry 5. Jan 2007 20:55

Re: Procedure Parameter in Pointer sichern
 
TStringStream ist eine Klasse. Eine Instanz einer Klasse/eines Objectes ist gleichzeitig ein Pointer so das du es direkt in die Liste packen kannst.

jbg 5. Jan 2007 21:01

Re: Procedure Parameter in Pointer sichern
 
Zitat:

Zitat von SirThornberry
Eine Instanz einer Klasse/eines Objectes ist gleichzeitig ein Pointer

Falsch. Objekte sind keine Zeiger. Referenzen auf Objekte sind Zeiger.

Das heißt übrigens: Objekte sind Instanzen einer Klasse.

ozz 5. Jan 2007 21:17

Re: Procedure Parameter in Pointer sichern
 
Hallo SirThornberry,
Danke für den Hinweis!
Noch ein kleine Frage zum den Problem.
Was passiert, wenn ich nach dem dem Verlassen dieser Procedure in die aufrufende Procedure ContentStream.free ausführe. Sind dann noch aller Daten in der TList?

SirThornberry 5. Jan 2007 21:19

Re: Procedure Parameter in Pointer sichern
 
nein. Da eine Objectreferenz wie ein Pointer ist bzw. nichts anderes als ein Pointer auf die Daten zeigt die Objectreferenz in der Liste dann auf den Speicher der durch .Free frei gegeben wurde.

ozz 5. Jan 2007 21:52

Re: Procedure Parameter in Pointer sichern
 
Hallo SirThornberry,
Ok, und wie mache es das, damit die Daten trotzdem in der TList bleiben, ich aber nach dem Verlassen meiner Procudure ThreadResult die Var ContentStream in der aufrufenden Procedure wieder freigebenen kann? Ich versuche mal den Hintergrund zu bleuchten,vielleicht mache ich ja einen Fehler.

Ich habe eine Schleife, die diese Streams einsammelt.
Delphi-Quellcode:
...
 ContentStream:= TStringStream.Create(toEOF);
  while ((JobQueue.Joblist.Count>0)) do
  begin;
   FURL:=JobQueue.Joblist.Strings[0];
   JobQueue.Joblist.Delete(0);
   IdHTTP.Get(FURL,ContentStream);
   JobQueue.ThreadResult(ContentStream,Handle);
   ContentStream.Free;
  end;
...
Diese ruft dann die besagte procedure ThreadResult(ContentStream: TStringStream;) auf. Nach jedem Schleifedurchlauf muß ich den ContentStream leeren, sonst konkateniert sich das Ergebnis. Daher muß ich die Daten umkopieren und zwar in meine FResultlist. Daran scheitere ich momentan. Danke für die Hilfe.



Delphi-Quellcode:
Type PStringStream = ^TStringStream;
....
FResultlist: TList;
....
procedure ThreadResult(ContentStream: TStringStream;);
var P:PStringStream;
begin
  New(p);
  p^:=TStringStream.Create(toEOF);
  irgendetwas mit ContentStream und p
  FResultlist.Add(p);

ozz 6. Jan 2007 08:18

Re: Procedure Parameter in Pointer sichern
 
Ich habe noch vergessen zu erwähnen, das es keine Assign Funktion gibt. Dies wäre ein Ansatz gewesen.

SirThornberry 6. Jan 2007 09:04

Re: Procedure Parameter in Pointer sichern
 
Ein Stream macht nichts anderes als Daten zu halten. Du kannst also einfach einen MemoryStream oder zweiten ContentStream zu erstellen (TMemoryStream.Create etc.) und mit der Methode CopyFrom die Daten in den anderen Stream zu kopieren.

Der_Unwissende 6. Jan 2007 09:12

Re: Procedure Parameter in Pointer sichern
 
Hi,
mal ganz nebenbei (habe es vielleicht auch nur übersehen?), statt einer TList kannst du für Objekte einfach auf die Klasse TObjectList (Unit Contnrs) zurückgreifen.
Diese Liste verhält sich ziemlich analog zur normalen TList, allerdings können hier nur Objekt-Referenzen gespeichert werden (also alle Variablen, deren Typ eine Klasse ist). Der Vorteil besteht eigentlich nur darin, dass du so sicherstellst, dass hier nur Objekt-Referenzen gespeichert werden. Zudem kann diese Liste die Objekte auf gleich freigeben, wenn diese aus der Liste entfernt werden (oder die Liste freigegeben wird). Bei einer TList musst du dich hingegen selbst darum kümmern (sonst bleiben die von dir neu erzeugten und in der TList abgelegten Streams bis zum Programmende im Speicher).

Gruß Der Unwissende

ozz 6. Jan 2007 09:29

Re: Procedure Parameter in Pointer sichern
 
Hallo SirThornberry,
danke. Die *.CopyFrom hatte ich schon gesehen. Delphi IDE schmiert aber einfach ab.

Delphi-Quellcode:
  New(p);
  p^:=TStringStream.Create(toEOF);
  TStringStream(p^).CopyFrom(ContentStream,ContentStream.Size);

@Der_Unwissende
Danke für den Hinweis mit der Tobjectlist. Ich habe sie nicht genommen, da an der Liste noch einige Records daranhängen. Die habe ich der Einfachheit halber weggelassen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:29 Uhr.
Seite 1 von 2  1 2      

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