如何把 RECORD 转成 Variant 类型,Record 包含 string (100分)

  • 主题发起人 主题发起人 gwbasic
  • 开始时间 开始时间
G

gwbasic

Unregistered / Unconfirmed
GUEST, unregistred user!
我想把 Record 转成 Variant 在三层中传送
我的 Record 是这样的
TestRecord Record
a:string;
b:string;
c:integer;
end
请问如何把他转成 Variant,
因为 sizeof(TestRecord) = 12
所以不能简单的拷贝内存
 
1、定义
{ 职员基本信息结构 }
TClerkBasicInformation=record
ENO:string[8];
//编号
NAM:string[20];
//姓名
ROT:string[10];
//籍贯
SEX:string[1];
//性别
IDN:string[20];
//身份证号
FAD:string[30];
//家庭地址
ZIP:string[6];
//邮政编码
FTL:string[15];
//家庭电话
NAD:string[30];
//现在住址
NTL:string[15];
//联系电话
BTH:string[14];
//出生日期
CPL:string[6];
//婚姻状况
FDY:string[14];
//到职日期
TYP:string[8];
//上班方式
HIS:string[200];
//个人经历
end;
2、设置
{设置要提交的职员基本信息}
procedure SetClerkBasicInformation;
begin
with ClerkManageForm,ClerkBasicInformationdo
begin
ENO:=edtENO.Text;
NAM:=edtNAM.Text;
ROT:=edtROT.Text;
SEX:=inttostr(cbSEX.Items.IndexOf(cbSEX.Text));
IDN:=edtIDN.Text;
FAD:=edtFAD.Text;
ZIP:=edtZIP.Text;
FTL:=edtFTL.Text;
NAD:=edtNAD.Text;
NTL:=edtNTL.Text;
BTH:=edtBTH.Text;
CPL:=cbCPL.Text;
FDY:=datetostr(dtpFDY.Date);
TYP:=cbTYP.Text;
HIS:=mmHIS.Text;
end;
end;
3、提交
var
V:OleVariant;
P:Pointer;
RMSG:string;
begin
SetClerkBasicInformation;
if ClerkBasicInformation.ENO<>'' then
begin
V:=VarArrayCreate([0,SizeOf(ClerkBasicInformation)-1],varByte);
P:=VarArrayLock(V);
try
Move(ClerkBasicInformation,P^,SizeOf(ClerkBasicInformation));
finally
VarArrayUnLock(V);
end;
RMSG:=dmClient.DCOMConnection1.AppServer.AddClerkBasicInformation(V)
MessageBox(Handle,Pchar(RMSG),'提示',Mb_IconInformation);
end
else
MessageBox(Handle,'编号不能为空','提示',Mb_IconInformation);
服务端获取如下:
function TKLPOS.AddClerkBasicInformation(
SClerkInfo: OleVariant): WideString;
var
P:Pointer;
ClerkBasicInformation: TClerkBasicInformation;
ENO:string;
NAM:string;
ROT:string;
SEX:string;
IDN:string;
FAD:string;
ZIP:string;
FTL:string;
NAD:string;
NTL:string;
BTH:string;
CPL:string;
FDY:string;
TYP:string;
HIS:string;
SQL:widestring;
begin
P:=VarArrayLock(SClerkInfo);
try
Move(P^,ClerkBasicInformation,SizeOf(ClerkBasicInformation));
ENO:=ClerkBasicInformation.ENO;
NAM:=ClerkBasicInformation.NAM;
ROT:=ClerkBasicInformation.ROT;
SEX:=ClerkBasicInformation.SEX;
IDN:=ClerkBasicInformation.IDN;
FAD:=ClerkBasicInformation.FAD;
FTL:=ClerkBasicInformation.FTL;
ZIP:=ClerkBasicInformation.ZIP;
NAD:=ClerkBasicInformation.NAD;
NTL:=ClerkBasicInformation.NTL;
BTH:=ClerkBasicInformation.BTH;
CPL:=ClerkBasicInformation.CPL;
FDY:=ClerkBasicInformation.FDY;
TYP:=ClerkBasicInformation.TYP;
HIS:=ClerkBasicInformation.HIS;
//准备SQL语句
SQL:='insert into BMAN(BNENO,BNNAM,BNROT,BNSEX,BNIDN,BNFAD,BNZIP,BNFTL,BNNAD,BNNTL';
SQL:=SQL+',BNBTH,BNCPL,BNFDY,BNTYP,BNHIS) values('+ENO+','+Quotedstr(NAM)+','+Quotedstr(ROT)+',';
SQL:=SQL+Quotedstr(SEX)+','+Quotedstr(IDN)+','+Quotedstr(FAD)+','+Quotedstr(ZIP)+','+Quotedstr(FTL)+','+Quotedstr(NAD)+','+Quotedstr(NTL)+','+Quotedstr(BTH)+','+Quotedstr(CPL)+','+Quotedstr(FDY)+',';
SQL:=SQL+Quotedstr(TYP)+','+Quotedstr(HIS)+')';
fnOpenSQL('Select BNENO from BMAN where BNENO='+Quotedstr(ENO));
if adoOpenSQL.RecordCount>0 then
begin
result:='编号已存在,请重新指定!';
exit;
end;
try
fnExecSQL(SQL);
result:='操作成功';
except
result:='出现错误';
end;
finally
VarArrayUnLock(SClerkInfo);
end;
end;
 
谢谢 康凌,
但如果几个字段的长度最长是64K的
有时却是一个字节的,要传送这一个字节数据,难道每次都必须传 64K吗?
 
(1):服務器端:
procedure TKLPOS.AddInformaiton(SClerkInfo: OleVariant);
var
No,Name,Tel:string;
begin
No:=SClerkInfo[0];
Name:=SClerkInfo[1];
Tel:=SClerkInfo[2];
end;
客戶端;
var
V:OleVariant;
begin
No:='123';
Name:='Lison';
Tel:='12345678';
V:=VarArrayOf([No,Name,Tel]);
SocketConnection1.AppServer.AddInformaiton(V);
end;
 
接受答案了.
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
931
SUNSTONE的Delphi笔记
S
后退
顶部