Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Strings senden (https://www.delphipraxis.net/82406-strings-senden.html)

halinchen 12. Dez 2006 17:21


Strings senden
 
Hi!

Also ich möchte einen Record übers Netzwerk schicken.
Der sieht in der 1.Version so aus:
Delphi-Quellcode:
Type TMessageRec = Record
             Code    : shortstring;
             Nickname : shortstring;
             CName   : shortstring;
             Mail    : shortstring;
             end;
aber ich will mehr als 255 Zeichen schicken!
Delphi-Quellcode:
Type TMessageRec = Record
             Code    : string;
             Nickname : string;
             CName   : string;
             Mail    : string;
             end;
Ich mach da mit WriteBuffer
Delphi-Quellcode:
var
Rec:TMessageRec;
...
try
   try
   Client.Connect(TimeO);
   Client.WriteBuffer(Rec,SizeOf(Rec));
   finally
   Client.Disconnect;
   Client.Free;
   end;
except
Error := true;
end;
...
Nun kommt es zu einem Laufzeitfehler!!!
Die Indy-Komponente erzeugt den. (Also der Fehler kommt nicht immer, aber im Debug-Modus immer so wenns bei einem Memo was einfügt. Der Cursor springt dann aber in den Quelltext der Indy-Kompo)

http://www.delphipraxis.net/internal...strings+senden
Da steht das man keine Strings senden kann. Kann man das irgentwie umgehen? Ich würde gerne mehr als 255 Zeichen senden! :wink:

Hoffentlich könnt ihr mir helfen! Wäre echt nett :-)

Zacherl 12. Dez 2006 17:40

Re: Strings senden
 
Guck dir mal mein Protokoll an ... zu finden in der CodeLib ...

http://www.delphipraxis.net/internal...ight=protokoll

marabu 12. Dez 2006 17:45

Re: Strings senden
 
Hi,

du erhältst einen Fehler, wenn du etwas in ein Memo einfügen willst, aber den Code dazu hast du gar nicht gezeigt.

Mit den langen Strings ist das so eine Sache. Woher soll der Empfänger wissen, wielange dieser String ist? Beim ShortString sind das 256 Byte, ein Byte Längeninformation und 255 Byte für den Zeichen-Puffer. Bei langen Strings musst du die Länge zuerst als Integer schicken, damit der Empfänger einen Puffer anlegen kann und danach die Zeichen des Strings. Dann hat der Empfänger eine Chance - wenn er weiß, dass zuerst die Längeninformation kommt. Die String-Variable ist bei langen Strings intern nichts anderes als ein Zeiger auf den Puffer.

Freundliche Grüße

halinchen 13. Dez 2006 15:27

Re: Strings senden
 
Erstmal Danke für eure Hilfe. :-D

Ich hab den Code nicht gezeigt, da ich dachte wenn der Cursor zur Indy-Kompo springt liegt der Fehler nicht an mir. Ich wollte das Problem nur so genau wie möglich beschreiben.

Das mit dem Zeiger habe ich mir schon gedacht.
Wie groß ist denn aber nun 1 Zeichen in einem String? 1 Byte oder 2 Byte? Ich glaube da gibt es Zeichentypen mit 2 Byte pro Zeichen. :?:

marabu 13. Dez 2006 16:04

Re: Strings senden
 
Hi,

Zitat:

Zitat von halinchen
Wie groß ist denn aber nun 1 Zeichen in einem String? 1 Byte oder 2 Byte?

kommt drauf an. Bei deinen ShortStrings oder den AnsiStrings ist ein Zeichen in der Regel ein Byte. Nur wenn du DBCS bzw. MBCS verwendest sind es zwei oder mehr Bytes pro Zeichen. Ist aber kein Problem für die Übermittlung der Puffergröße. Bei WideStrings muss der Empfänger halt wissen, dass er die Daten wieder als WideString ablegen soll. Alles andere kann wieder in einem AnsiString untergebracht werden.

Freundliche Grüße

halinchen 13. Dez 2006 17:30

Re: Strings senden
 
Danke!
Jetzt weiß ich wie ichs machen muss.

:dancer:

halinchen 17. Dez 2006 09:20

Re: Strings senden
 
Hi!

Ich bins nochmal.
Ich glaube was wir besprochen habe ist total quatsch.
Denn ich hab mal einen langen String als Test in einen MemoryStream geschrieben. Das geht nur mit SizeOf.
Außerdem nochmal mein Prog durch getestet: Der Fehler kommt ja nicht immer. Und wenn keiner kommt kommen auch mehr als 255 Zeichen an.

Ich glaube die Zugriffsverletzung komm wo anders her.
Und da ich nur "Bei Exception anhalten" aktiviert hat, hats mit der nächsten Anweisung weitergemacht, also im Thread von Indy. Sorry :-(

Naja, trotzdem nochmal vielen Danke. :cheers:

halinchen

P.S. Kann man das Thema hier löschen? Ist ja eigentlich sinnlos das stehen zu lassen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:09 Uhr.

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