AGB  ·  Datenschutz  ·  Impressum  







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

Procedure Parameter in Pointer sichern

Ein Thema von ozz · begonnen am 5. Jan 2007 · letzter Beitrag vom 6. Jan 2007
Antwort Antwort
Seite 1 von 2  1 2      
ozz

Registriert seit: 26. Jun 2005
131 Beiträge
 
#1

Procedure Parameter in Pointer sichern

  Alt 5. Jan 2007, 21:45
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);
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Procedure Parameter in Pointer sichern

  Alt 5. Jan 2007, 21:55
TStringStream ist eine Klasse. Eine Instanz einer Klasse/eines Objectes ist gleichzeitig ein Pointer so das du es direkt in die Liste packen kannst.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#3

Re: Procedure Parameter in Pointer sichern

  Alt 5. Jan 2007, 22:01
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.
  Mit Zitat antworten Zitat
ozz

Registriert seit: 26. Jun 2005
131 Beiträge
 
#4

Re: Procedure Parameter in Pointer sichern

  Alt 5. Jan 2007, 22:17
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?
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Procedure Parameter in Pointer sichern

  Alt 5. Jan 2007, 22:19
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
ozz

Registriert seit: 26. Jun 2005
131 Beiträge
 
#6

Re: Procedure Parameter in Pointer sichern

  Alt 5. Jan 2007, 22:52
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);
  Mit Zitat antworten Zitat
ozz

Registriert seit: 26. Jun 2005
131 Beiträge
 
#7

Re: Procedure Parameter in Pointer sichern

  Alt 6. Jan 2007, 09:18
Ich habe noch vergessen zu erwähnen, das es keine Assign Funktion gibt. Dies wäre ein Ansatz gewesen.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Procedure Parameter in Pointer sichern

  Alt 6. Jan 2007, 10:04
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#9

Re: Procedure Parameter in Pointer sichern

  Alt 6. Jan 2007, 10:12
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
  Mit Zitat antworten Zitat
ozz

Registriert seit: 26. Jun 2005
131 Beiträge
 
#10

Re: Procedure Parameter in Pointer sichern

  Alt 6. Jan 2007, 10:29
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 14:47 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