发送包含对象类型的数据包 ( 积分: 100 )

  • 主题发起人 主题发起人 wzwcn
  • 开始时间 开始时间
W

wzwcn

Unregistered / Unconfirmed
GUEST, unregistred user!
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3188558
------------------------------------
我用INDY的IdUDPServer控件写个测试程序;
数据包:
type
DataPake=packed record
a,b:string[10];
Lab:Tlabel;
mylist:tstringlist;
end;
发送:
procedure TForm1.Button2Click(Sender: TObject);
var data:DataPake;
lab:Tlabel;
begin
data.a:='aaaa';
data.b:='bbbb';

data.Lab:=Tlabel.Create(nil);
data.Lab.Caption:='ok';
data.Lab.Font.Color:=rgb(255,0,0);
data.Lab.Left:=50;
data.lab.Top:=50;
data.Lab.Font.Size:=50;

data.mylist:=Tstringlist.Create;
data.mylist.Add('dskfj');
data.mylist.Add('sdklfjls');
data.mylist.Add('dsflsdjfl');
client.Sendbuffer('127.0.0.1',2005,data,sizeof(data));
end;
接收:
procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var data:DataPake;
begin
Adata.Read(data,Adata.size);
label1.Caption:=data.a;
label2.Caption:=data.b;
data.Lab.Parent:=self;
memo1.Lines:=data.mylist;
end;
请问各位大侠我的代码错在哪里。或者如何实现;
谢谢
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3188558
------------------------------------
我用INDY的IdUDPServer控件写个测试程序;
数据包:
type
DataPake=packed record
a,b:string[10];
Lab:Tlabel;
mylist:tstringlist;
end;
发送:
procedure TForm1.Button2Click(Sender: TObject);
var data:DataPake;
lab:Tlabel;
begin
data.a:='aaaa';
data.b:='bbbb';

data.Lab:=Tlabel.Create(nil);
data.Lab.Caption:='ok';
data.Lab.Font.Color:=rgb(255,0,0);
data.Lab.Left:=50;
data.lab.Top:=50;
data.Lab.Font.Size:=50;

data.mylist:=Tstringlist.Create;
data.mylist.Add('dskfj');
data.mylist.Add('sdklfjls');
data.mylist.Add('dsflsdjfl');
client.Sendbuffer('127.0.0.1',2005,data,sizeof(data));
end;
接收:
procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var data:DataPake;
begin
Adata.Read(data,Adata.size);
label1.Caption:=data.a;
label2.Caption:=data.b;
data.Lab.Parent:=self;
memo1.Lines:=data.mylist;
end;
请问各位大侠我的代码错在哪里。或者如何实现;
谢谢
 
client.Sendbuffer('127.0.0.1',2005,@data,sizeof(data));
试试
 
问题出在这里
tstringlist;
 
String只是个指针你发个指针过去了内容并没有发过去啊
 
不要tstringlist,只发label一样不行~~
 
晕~
没看见还有个label

原理是一样的
那也只是一个指针

用流来实现
 
iamy兄可不可以给一个简单的例子
 
procedure TForm1.Button1Click(Sender: TObject);
var
M:TMemoryStream;
begin
M:=TMemoryStream.Create;
M.WriteComponent(Self);
M.Position:=0;
.
.
M.Destroy;
end;
 
假我接收后放到一个流里面,我怎么把它再转换成一个对象?
比如我接收一个label到一个叫M的流,我怎么把M转成label??
 
噢,知道了。。。。
m.readcomponent....
谢谢iamy兄
=========================
郁闷。。不行
 
http://www.delphibbs.com/keylife/iblog_show.asp?xid=14383

作者?: wuchunhua
标题?: Delphi的“动态窗体”技术实际应用 (抄)

希望对你有用
 
//把控件Component以字符串表示,和dfm窗体文件组件表示方法一样,默认属性不写进来。
function TfrmInputForm.ComponentToString(Component: TComponent): string;
var
BinStream:TMemoryStream;
StrStream: TStringStream;
s: string;
begin
BinStream := TMemoryStream.Create;
try
StrStream := TStringStream.Create(s);
try
BinStream.WriteComponent(Component);
BinStream.Seek(0, soFromBeginning);
ObjectBinaryToText(BinStream, StrStream);
StrStream.Seek(0, soFromBeginning);
Result:= StrStream.DataString;
finally
StrStream.Free;
end;
finally
BinStream.Free
end;
end;

//把字符串Value表示的控件属性赋给控件Control,注意:Control控件必须已经创建
//如果窗体是空的,读出控件信息要自己分析,取出类名和控件名,动态创建后,再应用以下函数设置控件
function TfrmInputForm.StringToComponent(Value:string;Control:TComponent): TComponent;
var
StrStream:TStringStream;
BinStream: TMemoryStream;
begin
StrStream := TStringStream.Create(Value);
try
BinStream := TMemoryStream.Create;
try
ObjectTextToBinary(StrStream, BinStream);
BinStream.Seek(0, soFromBeginning);
Result := BinStream.ReadComponent(Control);
finally
BinStream.Free;
end;
finally
StrStream.Free;
end;
end;
 
多人接受答案了。
 
后退
顶部