Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Ist es sinnvoll einen Record zu versenden? (https://www.delphipraxis.net/89706-ist-es-sinnvoll-einen-record-zu-versenden.html)

Goldesel 4. Apr 2007 14:41


Ist es sinnvoll einen Record zu versenden?
 
Hallo,

ich habe folgendes Problem. Ich möchte gern drei Strings über Indy 9 versenden. Der erste String soll im Server ein Ereigniss auslösen. Dann soll der Server einen Record empfangen, in dem die anderen drei (oder auch mehr) Strings entahlten sind. Meine Frage ist jetzt, ob das wirklich sinnvoll ist, oder ob es andere Möglichkeiten gibt, dies zu realisieren.

Vielen Dank
Jannik

SirThornberry 4. Apr 2007 14:43

Re: Ist es sinnvoll einen Record zu versenden?
 
ein normaler String in Delphi ist intern ein Pointer. Wenn du also einen Record mit Strings versendest werden nur Pointer verschickt.

TeronG 4. Apr 2007 14:48

Re: Ist es sinnvoll einen Record zu versenden?
 
Zitat:

Zitat von SirThornberry
ein normaler String in Delphi ist intern ein Pointer. Wenn du also einen Record mit Strings versendest werden nur Pointer verschickt.

Und wie währe es mit einem non-generischem String!? (ShortString, String[30], ...)

Goldesel 4. Apr 2007 14:55

Re: Ist es sinnvoll einen Record zu versenden?
 
Und gibt es dann vielleicht eine andere Möglichkeit?

halinchen 4. Apr 2007 15:02

Re: Ist es sinnvoll einen Record zu versenden?
 
Wenn du einen Memorystream nimmst, schreibst du am Anfang die Länge des Strings und dann die einzelnen Chars nacheinander.

Delphi-Quellcode:
var
String:String //Dein String
MS:TMemoryStream;
i:Integer;
C:Char;
begin
MS := TMemoryStream.Create;
i:= length(String);
MS.WriteBuffer(i,sizeof(i));
For i := 1 to length(String) do begin
    C := String[i];
    MS.WriteBuffer(c,sizeof(c));
end;
MS.Free;
end;
so mach ich das immer

Goldesel 4. Apr 2007 16:32

Re: Ist es sinnvoll einen Record zu versenden?
 
Ist es nicht in irgendeiner Art möglich, das über eine Stringlist oder so zu realisieren. Das wäre für mich wesentlich einfacher ... ;)

Matze 4. Apr 2007 17:29

Re: Ist es sinnvoll einen Record zu versenden?
 
@halinchen: Gewöhne dir generell die Nutzung von Resourcenschutzblöcken an:

Delphi-Quellcode:
MS := TMemoryStream.Create;
try
  ...
finally
  FreeAndNil(MS);
end;
Sonst kann es sein, dass es kracht und der Speicher somit nicht freigegeben wird.

@Jannik: Ich weiß nicht genau, was du vorhast, aber du könntest die Daten über IdHTTP.Post() an den Server schicken, auf dem ein PHP-Skript diese auswerten kann, falls das bei dir möglich ist.

Neutral General 4. Apr 2007 17:32

Re: Ist es sinnvoll einen Record zu versenden?
 
Zitat:

Zitat von halinchen
Wenn du einen Memorystream nimmst, schreibst du am Anfang die Länge des Strings und dann die einzelnen Chars nacheinander.

Delphi-Quellcode:
var
String:String //Dein String
MS:TMemoryStream;
i:Integer;
C:Char;
begin
MS := TMemoryStream.Create;
i:= length(String);
MS.WriteBuffer(i,sizeof(i));
For i := 1 to length(String) do begin
    C := String[i];
    MS.WriteBuffer(c,sizeof(c));
end;
MS.Free;
end;
so mach ich das immer

Es geht auch einfacher

:arrow:

Delphi-Quellcode:
var Str:String
    MS:TMemoryStream;
    l:Integer;
begin
  MS := TMemoryStream.Create;
  try
    l:= length(Str);
    MS.Write(l,SizeOf(Integer)); // nicht SizeOf(l) !!
    MS.Write(Str[1],l);
    // Stream speichern/laden/was auch immer
  finally
    MS.Free; // jaaa k FreeAndNil(MS) is noch besser... is es eigentlich "schlimm" wenn man nur .Free benutzt ?
  end;
end;
EDIT: Damit Matze zufrieden ist noch Resourcenschutzblöcke hinzugefügt^^

Gruß
Neutral General

halinchen 4. Apr 2007 17:35

Re: Ist es sinnvoll einen Record zu versenden?
 
@Matze: Ich hab das nur hier im Forum getippt. Wenn ich das "richtig" schreibe mache ich das natürlich. Hätte ich dazuschreiben müssen, ich geb's zu...

@Neutral General: Stimmt, kannte ich nicht. :wink:

Goldesel 4. Apr 2007 20:27

Re: Ist es sinnvoll einen Record zu versenden?
 
OK, es kann sein, dass ich grad ein totales Black-Out hab, aber ich würde mich freuen, wenn mir jemand kurz einmal erklären könnte (gerne auch mit Beispielcode) wie ich einen Record so über den Indy TCP Server/Client verschicke, dass alles ankommt und das auch klappt. Bin so langsam am verzweifeln ... ;)

Danke schonmal


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:07 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