如何实现把一个TRecord的值赋个一个stirng变量?(100分)

  • 主题发起人 主题发起人 lanfeng
  • 开始时间 开始时间
L

lanfeng

Unregistered / Unconfirmed
GUEST, unregistred user!
type
TSerAndClientPacketUDP=record
Version:array[1..2] of Char;
Command:array[1..2] of Char;
Seq_Num:array[1..2] of Char;
FreeICQ_ID:array[1..4] of Char;
Para:string;
end;
type
TLoginPara=Record
Port:array[1..4] of Char;
NameLength:array[1..2] of Char;
Name:string;
PasswordLength:array[1..2] of Char;
Password:string;
end;
如上述之结构,如何将TLoginPara的值赋给TSerAndClientPacketUDP.Para?
 
我觉得可能你的结构设计的有点牵强。
因为Para:String,这样Para无法直接指向一个记录。
如果Para是Pointer就可以。

如果将TLoginPara中的所有成员转化为字符存入Para中到是也可以,
但因为TLoginPara中又包括了String,
因为无法确定最大长度,
(而实际上用户名及密码的最大长度是可以确定的)
这样,在转化为字符串过程中,
你得把Name及Password这两个成员的长度信息也包括在字符串中,
而正好,
你设计的结构中包括了它们的长度:
NameLength:array[1..2] of Char;
PasswordLength:array[1..2] of Char;
这样,
你到是可以这样,
复制到Para的字符串组成如下:
1..4:Port
5..6: NameLength
7..(由NameLenght+7-1确定): Name
(NameLenght+7)..(NameLenght+7+1): Passwordlength
(NameLenght+7+2)..(NameLenght+7+2+PasswordLength-1): Password
我想你设计这样的结构可能也是这种意思吧。

不过如果设计成这样可能会方便一些:
type
TSerAndClientPacketUDP=record
Version:array[1..2] of Char;
Command:array[1..2] of Char;
Seq_Num:array[1..2] of Char;
FreeICQ_ID:array[1..4] of Char;
Para:array[1..38]of char;
end;
type
TLoginPara=Record
Port:array[1..4] of Char;
Name:array[1..20]of char;//名字一般不超过20个字符
Password:array[1..14]of char
//密码一般有14个字符就足够了
end;//三个成员的总长度是4+20+14=38 (xixi)
就不需要上面那么麻烦了。

 
SetLength(SerAndClientPacketUDP, SizeOf(TLoginPara))

Move(LoginPara.Port[1], SerAndClientPacketUDP.Para[1], SizeOf(TLoginPara))


<font color="red">注意:</font>

不能将SerAndClientPacketUDP直接存盘或传送, 否SerAndClientPacketUDP.Para
和LoginPara.Password都无法保存或传送(如果不一个一个元素地保存或传递的话),
因为它们都不是固定长度, 具体内容并不在结构中, 结构中只是一个指针(AnsiString
也是指针, 只是比较特殊的指针而已)
 
我认为应该将Para定义为TLoginPara类型:
Para:TLoginPara;
然后,直接赋值就可以了.
 
yunshang言之有理!
但应该还有更好的办法,我认为是设计成类,
type
TLoginPara=class
public
Port: Integer;
function NameLength: Integer;// 或去掉,直接用Length(Name)
Name: string;
function PasswordLength: Integer;// 再次建议去掉
Password: string;
end;
type
TSerAndClientPacketUDP = class
Version: string;
Command: string;
Seq_Num: Integer;
FreeICQ_ID: Integer;
Para: TLoginPara;
end;
再添加一些对公开属性、数据和方法的特殊的控制要求,
尽量把与其他类无关的处理封装好,对今后的使用也是
一件好事嘛!
 
各位 如何把一个TRecord的值保存到一个相应长度的byte数组中?.
 
多人接受答案了。
 

Similar threads

后退
顶部