Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi TClientSocket - SendText (AnsiString), ReceiveText (String) (https://www.delphipraxis.net/149622-tclientsocket-sendtext-ansistring-receivetext-string.html)

XoRiC 25. Mär 2010 13:44


TClientSocket - SendText (AnsiString), ReceiveText (String)
 
Hi,

ich habe noch kleinere Schwierigkeiten mit der Umstellung eines älteren Projekts auf UniCode seit ich Delphi 2009 verwende. Ich sende mit einer TClientSocket Komponente Text an einen Server. Die SendText Prozedur im Client verlangt dabei als Parameter const S: AnsiString, was mir ganz recht ist, da ich ausschließlich Ascii-Zeichen sende und in meinem Projekt eigentlich keinen Unicode brauche. Hier ein Minimalbeispiel:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
  var D: AnsiString;
begin
  D := 'Hallo!';
  ClientSocket1.Socket.SendText(D); { SendText(const S: AnsiString) }
end;
Daraufhin empfängt der Server den Text. Die ReceiveText Funktion des Sockets liefert jedoch keinen AnsiString, sondern einen String zurück, was ja nun UniCode sein sollte.

Delphi-Quellcode:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);
  var D: String;
begin
  D := Socket.ReceiveText; { ReceiveText: String }
  showmessage(D); // gibt Mist aus (chinesische Zeichen wenn ich mich nicht irre)
  showmessage(AnsiString(D)); // gibt auch Mist aus ('???ton' oder so ähnlich)
end;
Lediglich die Länge des Strings stimmt. Ich habe ein bisschen rumprobiert, aber auch so klappt es nicht:

Delphi-Quellcode:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);
  var D: AnsiString;
begin
  D := AnsiString(Socket.ReceiveText);
  showmessage(D); // gibt wie oben auch Mist aus
end;
Daraufhin habe ich mal die Strings als CharArray ausgeben lassen:
- Der Client sendet 72, 97, 108, 108, 111, 33 ('Hallo!').
- Der Server empfängt 24904, 27756, 8559, 116, 111, 110.

Kann jemand sagen was ich falsch mache, bzw wo ich den Code abändern muss um in der TServerSocket Komponente den originalen Text 'Hallo!' zu bekommen? Am besten gleich als AnsiString ;)

Viele Grüße und Danke für Tipps,
Xoric

samso 25. Mär 2010 18:29

Re: TClientSocket - SendText (AnsiString), ReceiveText (Stri
 
Also, ich würde denken, da hat CG einen kleinen Bug eingebaut. Bei Delphi 2010 ist TCustomWinSocket.ReceiveText ein AnsiString. Vielleicht geht ja folgendes:

Delphi-Quellcode:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);
  var D: AnsiString;
begin
  SetLength(D, Socket.ReceiveLength);
  SetLength(D, Socket.ReceiveBuf(Pointer(D)^, Length(D)));
  showmessage(D); // gibt hoffentlich keinen Mist aus
end;

XoRiC 25. Mär 2010 20:01

Re: TClientSocket - SendText (AnsiString), ReceiveText (Stri
 
'Hallo!'

Das freut mich fast ein bisschen, dass es mal nicht an mir liegt.
Vielen Dank für den Hinweis und insbesondere den Trick, wie ich das Problem umgehen kann!

Wie du oben siehst funktioniert es wunderbar ;)

Viele Grüße
Xoric

mjustin 26. Mär 2010 17:47

Re: TClientSocket - SendText (AnsiString), ReceiveText (Stri
 
Zitat:

Zitat von samso
Also, ich würde denken, da hat CG einen kleinen Bug eingebaut. Bei Delphi 2010 ist TCustomWinSocket.ReceiveText ein AnsiString.

Was auch daran liegen könnte, dass TClient/TServerSocket seit vielen Delphi Versionen als 'deprecated' bezeichnet wird, und vermutlich nur noch für die eher "abenteuerlustigen" Entwickler weiterhin enthalten ist :P


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