pmaltais
asked on
How to use records with TIdTCPClient in Delphi
Hi,
I'm using Delphi 7 and Indy 9 to send data to a Server. In my code, I use a record that I initialize first and then pass it to the WriteBuffer of WriteStream. Most of the record fields are sent normally except for the string field that seems to send garbage instead of the characters I initialized it with.
Anyone can help me with that? or Is there an example somewhere so that I can base my ork on?
Thanks
I'm using Delphi 7 and Indy 9 to send data to a Server. In my code, I use a record that I initialize first and then pass it to the WriteBuffer of WriteStream. Most of the record fields are sent normally except for the string field that seems to send garbage instead of the characters I initialized it with.
Anyone can help me with that? or Is there an example somewhere so that I can base my ork on?
Thanks
unit frmClient;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
IdTCPClient, ExtCtrls, IdAntiFreezeBase, IdAntiFreeze;
type
TProcolFrameSend = packed record
iLength: Integer;
iType: Integer;
iID: Integer;
iControl: Integer;
iNbrSeries: Integer;
iNbrParams: Integer;
iParamLength: Integer;
sParamValue: string;
end;
TForm1 = class(TForm)
// objets and procedures deleted to simplify code...
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.cmdConnectClick(Sender: TObject);
var
imgStream : TMemoryStream;
longTrame : integer;
begin
If tcpClientSkt.Connected Then
begin
mStatus.Lines.Add('Already connected to server.');
Exit;
end;
mStatus.Clear;
mStatus.Lines.Add('Connecting to server');
try
tcpClientSkt.Host := 'CMV-10001-11019';
tcpClientSkt.Port := 5001;
tcpClientSkt.Connect(5000);
mStatus.Lines.Add(tcpClientSkt.ReadLn());
except
on E: Exception do MessageDlg ('Error connecting to server'+#13+E.Message, mtError, [mbOk], 0);
end;
end;
procedure TForm1.tcpClientSktConnected(Sender: TObject);
begin
mStatus.Lines.Add('Conneted to server ' + tcpClientSkt.Host);
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
If tcpClientSkt.Connected Then
begin
mStatus.Lines.Add('Deconnecting from server');
tcpClientSkt.Disconnect();
end
end;
procedure TForm1.cmdDisconnectClick(Sender: TObject);
begin
If tcpClientSkt.Connected Then
begin
mStatus.Clear;
mStatus.Lines.Add('Deconnecting from server');
tcpClientSkt.Disconnect();
end
end;
procedure TForm1.tcpClientSktDisconnected(Sender: TObject);
begin
mStatus.Lines.Add('Disconnected from server');
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
mStatus.Clear;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
FrameSend: TProcolFrameSend;
inBuf : TMemoryStream;
i : Integer;
tempStr : AnsiString;
begin
// Control Info
FrameSend.iType := 30104;
FrameSend.iID := 0;
FrameSend.iControl := 0;
FrameSend.iNbrSeries := 1;
FrameSend.iNbrParams := 2;
// param length
FrameSend.iParamLength := StrLen(PChar(ListBox1.Items[ListBox1.ItemIndex]));
// Frame total lenght
FrameSend.iLength := 28 + FrameSend.iParamLength;
// Parameter value, the name of a file to be sent by the server
FrameSend.sParamValue := ListBox1.Items[ListBox1.ItemIndex];
If tcpClientSkt.Connected Then
begin
try
tcpClientSkt.OpenWriteBuffer(-1);
tcpClientSkt.SendBufferSize := FrameSend.iLength;
tcpClientSkt.WriteBuffer(FrameSend, FrameSend.iLength, true);
tcpClientSkt.CloseWriteBuffer();
inBuf := TMemoryStream.Create;
tcpClientSkt.ReadStream(inBuf);
inBuf.Position := 0;
mStatus.Lines.Add('Document received');
finally
if tcpClientSkt.Connected then inBuf.Free;
end;
end;
end;
end.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER