怎么样把pointer所指向的数据转换成record数据.就是那做到类似Tbutton(d^)这样的功能.(30分)

  • 主题发起人 主题发起人 talent002
  • 开始时间 开始时间
T

talent002

Unregistered / Unconfirmed
GUEST, unregistred user!
type
myrecord=record
username:string[20];
passwd:string[20];
end;

...
...
var
p:pointer
st:string;
begin
st:=idtcpclient1.readln();
if st='login' then
begin
p:=getmem(40);
idtcpclient1.readbuffer(p^,40);
//请问这里用什么方法能把p的类型转换成myrecord类型?
end;
if st=其它.. then
begin
p:=getmem(XX);<<如果不是登陆就转换为其它的record类型.
freemem(p);
 
var
d:myrecord;
st:string;
begin
st:=idtcpclient1.readln();
if st='login' then
begin
idtcpclient1.readbuffer(d,sizeof(d))
//其实这个长度是42,不要以为是40;你在服务器端发数据也做相应处理……
end;
if st=其它.. then
begin
 
我不是这个意思。其实我真正的意思是想这样。从服务器读出要接收多少信息,然后再读取,如果按楼上的写法,那么login有login的类型,reg有reg的类型。那么一个过程就要为每个类型都定义变量了。所以我想用pointer来接收。然后根据st来转换类型。怎么才能做到?

var
p:pointer
st:string;
size:integer;
begin
st:=idtcpclient1.readln();
size:=idtcpclient1.readinteger();
if st='login' then
begin
p:=getmem(40);
idtcpclient1.readbuffer(p^,size);
//请问这里用什么方法能把p的类型转换成myrecord类型?
end;
if st=其它.. then
begin
p:=getmem(XX);<<如果不是登陆就转换为其它的record类型.
freemem(p);
 
var
p:pointer
st:string;
size:integer;
begin
st:=idtcpclient1.readln();
size:=idtcpclient1.readinteger();
if st='login' then
begin
p:=getmem(size)
//不能是40!可以是sizeof(myrecord)
idtcpclient1.readbuffer(p^,size);
//按myrecord访问
showmessage(myrecord(p^).username)
//这样就可以
end;
if st=其它.. then
begin
p:=getmem(XX);<<如果不是登陆就转换为其它的record类型.
freemem(p);
 
接受答案了.
 
后退
顶部