Autor Beitrag
b-t-o
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mo 16.04.07 13:25 
Hallo miteinander,

ich würde gerne den Inhalt eines Objektes (aus Funktionsaufruf) fest in einem Array speichern.
Meine bisherige Lösung speichert aber anscheinend nur die Referenzen, so dass alle Werte des Arrays immer gleich sind.

Hat jemand eine Idee?

Vielen Dank und viele Grüsse

Marc

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
procedure TTcpSrvForm.WSocketServer1ClientConnect(
    Sender : TObject;
    Client : TWSocketClient;
    Error  : Word);

var
  Client2 : TTcpSrvClient;
begin
   Aktuell_Request := Aktuell_Request + 1;
   requests[Aktuell_Request] := Client as TTcpSrvClient;

   requests[Aktuell_Request].LineMode            := FALSE;
   requests[Aktuell_Request].LineEdit            := FALSE;
   requests[Aktuell_Request].LineLimit           := 65535{ Do not accept long lines }
   requests[Aktuell_Request].OnDataAvailable     := ClientDataAvailable;
   requests[Aktuell_Request].OnLineLimitExceeded := ClientLineLimitExceeded;
   requests[Aktuell_Request].OnBgException       := ClientBgException;
   requests[Aktuell_Request].ConnectTime         := Now;
   requests[Aktuell_Request].Anfrage_gesendet    := FALSE;
   requests[Aktuell_Request].Anzahl_Headerlines  := 0;
   requests[Aktuell_Request].Komplette_Anfrage   := '';
   requests[Aktuell_Request].Requestno           := Aktuell_Request;
   requests[Aktuell_Request].inuse               := TRUE;
   requests[Aktuell_Request].proxy_closed        := TRUE;
   FreeandNil(requests[Aktuell_Request].Anfragesocket);
end;


Zuletzt bearbeitet von b-t-o am Mo 16.04.07 13:49, insgesamt 1-mal bearbeitet
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Mo 16.04.07 13:43 
user profile iconb-t-o hat folgendes geschrieben:
[...]speichert aber anscheinend nur die Referenzen,[...]
Um genau zu sein, speicherst du in jedes Element des Arrays einen Pointer auf den selben Speicherbereich. Ändert sich dieser, ändert sich auch das im Array gespeicherte Objekt. Du müsstest Wert für Wert kopieren, schreib dir dazu vielleicht eine Prozedur.
Soweit ich weiß, gibt's aber auch eine Funktion zum kopieren von Objekten, mal abgesehen von x := TXY.Create; x.Assign(aTXY);. Müsst ich mal nachgucken.
Für alles weitere müsste ich deinen Code lesen, der ist aber unleserlich, da er nicht von Delphi-Tags umschlossen ist! :mahn: <span class="inlineSyntax"><span class="codecomment">{PROTECTTAG5835bb34780cd3eb7377675ad9b87f37}</span></span> So muss das aussehen.

Bitte ändere das doch einfach, in dem du die user defined image-Taste (bzw. für den Inline-Editor, falls im Profil AJAX aktiviert ist, die user defined image-Taste) rechts oben neben deinem Beitrag benutzt.

Edit: Ah ja, du machst eine Zuweisung vom ArrayElement auf den Client, damit speicherst du den Pointer im Array. Dass das nicht Crasht scheint mir ein Wunder, da, zumindest IIRC, der Client eine lokale Variable ist und der Speicherbereich am Ende der Prozedur freigegeben wird, wobei in deinem Array der Pointer auf einen bereits freigegebenen Speicherbereich stehen bleibt :shock:

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
b-t-o Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mo 16.04.07 13:52 
sorry. Delphi-Tags sind nachgeholt.

Gibt es nichts, womit ich ein Objekt mit all seinem Inhalt kopieren kann?

Viele Grüsse

Marc
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Mo 16.04.07 13:58 
Leider hab ich weder die TWSocketClient noch die TTcpSrvClient Komponente, darum kann ich dir nicht sagen, ob eine von ihnen eine Assign-Methode hat. Einfach mal selbst herausfinden ;)
Zum einfachen Kopieren such ich eben was...
Du könntest versuchen, den Speicherbereich mit Move zu kopieren, hierzu die Delphi-Hilfe konsultieren. Als Count gibts du wahrscheinlich sizeof(TWSocketClient) an. Einen Versuch wärs vielleicht wert... :gruebel:

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.