如何将一个记录类型变量COPY到一个BUFFER(PCHAR)中?(100分)

H

huizhang

Unregistered / Unconfirmed
GUEST, unregistred user!
纪录类型的变量可以肯很轻松地复制到一个PCHAR指向的Buffer中去, 因为纪录变量
在内存中的存储也是连续的. 下面是一个例子:

procedure TForm1.Button1Click(Sender: TObject);
type
pMyRec = ^MyRec;
MyRec = Record
a: integer;
b: double;
c: string[8];
end;
var
arecord: MyRec;
pBuffer: PChar;
aBuffer: array [0..SizeOf(MyRec)] of char
//动态分配pBuffer时,可去掉此行
begin
pBuffer := @aBuffer;
//pBuffer := AllocMem(sizeof(MyRec));
with pMyRec(pBuffer)^ do
begin
a := 12345;
b := pi;
c := 'Hello!!';
end;
aRecord := pMyRec(pBuffer)^;
showmessage(format('a: %d, b: %f, c: %s',
[aRecord.a,
aRecord.b,
aRecord.c]));
//FreeMem(pBuffer,SizeOf(MyRec));
end;

例子中的aBuffer也可以动态分配
 
A

ACE

Unregistered / Unconfirmed
GUEST, unregistred user!
Answer huizhang:

问题是如何得到PBuffer?,比如 :EDIT1.text :=StrPas(PBuffer)
Or EDIT1.text :=StrPas(aBuffer)
 
H

huizhang

Unregistered / Unconfirmed
GUEST, unregistred user!
你的纪录是什么?如果不是字符型的纪录是不可能直接Copy给Edit的, 必须经过转换,
也不可将一个纪录直接复制给一个字符串.

EDIT1.text :=String(PBuffer)
在语法上是对的, 但可能是不可显示字符,无意义.
 
A

ACE

Unregistered / Unconfirmed
GUEST, unregistred user!
其实并不要显示,实际问题是:
我要将一个TABLE中的 N 条记录加上包头通过SOCKET,SEND TO CLIENT,现在是
一个FIELD一个FIELD往BUFFER里加,我的想法是:先读到TRECORD中,然后用什么方法(不是
一个记录域一个记录域)一次性将TRECORD加到BUFFER中?谢谢
 
C

CJ

Unregistered / Unconfirmed
GUEST, unregistred user!
和我的问题差不多,不过你的好象我知道点,
1.SELECT出记录到临时表
2.发送出去
3.接收
 
Z

zhaoyipeng

Unregistered / Unconfirmed
GUEST, unregistred user!
试试这个。
type
TMyRecord = record
//...
end;
var
ARec: TMyRecord;
Buf: array [0..SizeOf(TMyRecord)-1] of Char;
begin
Move(Buf, ARec, SizeOf(TMyRecord));
end;

 
A

ACE

Unregistered / Unconfirmed
GUEST, unregistred user!
谢谢各位,我的问题已经解决.
 
顶部