如何把一个 类型->流->发送->接受->类型 ? ( 积分: 200 )

  • 主题发起人 主题发起人 xebaobei
  • 开始时间 开始时间
X

xebaobei

Unregistered / Unconfirmed
GUEST, unregistred user!
TPlayerInfo=Record
ip:pchar;
port:integer;
UserID:pchar;
CharName:pchar;
Job:Integer;
ab:TAbility;
Gold:Integer;
X,Y:integer;
dir:integer;
Map:pchar;
server:pchar;
end;

这个只是一个类型,类型有很多!
想有个通用的函数将他们保存成流并发送转回类型
 
TPlayerInfo=Record
ip:pchar;
port:integer;
UserID:pchar;
CharName:pchar;
Job:Integer;
ab:TAbility;
Gold:Integer;
X,Y:integer;
dir:integer;
Map:pchar;
server:pchar;
end;

这个只是一个类型,类型有很多!
想有个通用的函数将他们保存成流并发送转回类型
 
通过TCP发送!
发送不用写!
就告诉我怎么把类型保存成流!
然后再反回来!
 
保存成内存流进行发送吧。
 
用RECORD很难做通用的函数,用类要好些。可以利用DELPHI的运行时类型信息做成通用函数。
TPlayerInfo=class
private
Fip:pchar;
port:integer;
UserID:pchar;
CharName:pchar;
Job:Integer;
ab:TAbility;
Gold:Integer;
X,Y:integer;
dir:integer;
Map:pchar;
server:pchar;
published
property ip:Pchar read FIp write FIP
.......
end;

保存时先保存类名,然后通过通用函数遍历属性保存数据,读取时根据类名,动态生成类,
通过通用函数读取属性

 
能否写的详细点呢!
其实不保存流也可以!
字符串最好!
我只是想发送过去!
 
在此非常感谢 NoSound,cash,ABCDE 对我的帮助与指导

procedure Datatostr(const Data:pointer;const size:integer;var str:string);
begin
SetLength(str,size);
copymemory(pchar(str),Data,size);
end;

procedure strtoData(const Str: String;Data:pointer);
begin
copymemory(Data,pchar(Str),length(Str));
end;

上边的代码是很短,但是用到了指针与内存COPY 写一些平常的数据库程序很少用到的东西。
受益非浅啊!
上边的代码可以把任何类型转换成字符并转换回去。

TTest = packed record
a:char;
x, y: Integer;
z:string;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
str:string;
a,b:TTest;
begin
a.a:='a';
a.x:=5;
a.y:=4;
a.z:='我爱你我的大宝贝';

Datatostr(@a,sizeof(a),str);
showmessage('length:'+inttostr(length(str))+#13+str);

strtoData(str,@b);
ShowMessage(b.a+#13+inttostr(b.x)+#13+inttostr(b.y)+#13+b.z);
end;
 

Similar threads

后退
顶部