F
FreeAndNil
Unregistered / Unconfirmed
GUEST, unregistred user!
我想把一个结构体变量的值拷贝到另外一个结构体,用move过程,结果发现很奇怪的现象。
定义一个结构体变量,和定义一个结构体指针变量,然后new,有什么区别?move过程有哪些要注意?如果要复制结构体内容的代码在dll中会怎样?用sharemem和不用有区别吗?请高手帮忙解下惑,谢谢,只有300大富翁币。
type
TTestFunc =function (Arec: pointer):boolean
stdcall;
TA = record
sD1: string;
sD2: string;
sD3: string;
sD4: integer;
sD5: integer;
sD6: integer;
sD7: string;
end;
TB = record
sD1: string;
sD2: string;
sD3: string;
sD4: integer;
sD5: integer;
end;
procedure TForm1.btn3Click(Sender: TObject);
var
a: TA;
b: Tb;
begin
a.sD1 := edt1.Text ;
a.sD2 := edt2.Text ;
a.sD3 := edt3.Text ;
a.sD4 := ud1.Position;
a.sD5 := ud2.Position;
a.sD6 := ud3.Position;
a.sD7 := edt7.Text ;
move(a, b, sizeof(TB))
//用这句代码,代码只能执行一次,第二次就直接关程序
// b := TB((@a)^)
//用这句代码,edt的内容怎么折腾都不会出错
with b do
ShowMessage('sD1:' + sD1 + ',sD2:'+sD2+',sD3:'+sD3+',sD4:'+IntToStr(sD4)+',sD5:'+IntToStr(sD5));
end;
procedure TForm1.btn4Click(Sender: TObject);
var
a: TA;
b: ^Tb;
begin
a.sD1 := edt1.Text ;
a.sD2 := edt2.Text ;
a.sD3 := edt3.Text ;
a.sD4 := ud1.Position;
a.sD5 := ud2.Position;
a.sD6 := ud3.Position;
a.sD7 := edt7.Text ;
new(b);
move(a, b^, sizeof(TB))
//用指针,再new,然后edt的内容怎么折腾都不会出错,why?
with b^ do
ShowMessage('sD1:' + sD1 + ',sD2:'+sD2+',sD3:'+sD3+',sD4:'+IntToStr(sD4)+',sD5:'+IntToStr(sD5));
// dispose(b)
//奇怪的是,如果不释放指针,代码没有任何问题,一旦加入这句话,第一次,没问题,第二次,什么也不提示,直接关闭程序。
end;
定义一个结构体变量,和定义一个结构体指针变量,然后new,有什么区别?move过程有哪些要注意?如果要复制结构体内容的代码在dll中会怎样?用sharemem和不用有区别吗?请高手帮忙解下惑,谢谢,只有300大富翁币。
type
TTestFunc =function (Arec: pointer):boolean
stdcall;
TA = record
sD1: string;
sD2: string;
sD3: string;
sD4: integer;
sD5: integer;
sD6: integer;
sD7: string;
end;
TB = record
sD1: string;
sD2: string;
sD3: string;
sD4: integer;
sD5: integer;
end;
procedure TForm1.btn3Click(Sender: TObject);
var
a: TA;
b: Tb;
begin
a.sD1 := edt1.Text ;
a.sD2 := edt2.Text ;
a.sD3 := edt3.Text ;
a.sD4 := ud1.Position;
a.sD5 := ud2.Position;
a.sD6 := ud3.Position;
a.sD7 := edt7.Text ;
move(a, b, sizeof(TB))
//用这句代码,代码只能执行一次,第二次就直接关程序
// b := TB((@a)^)
//用这句代码,edt的内容怎么折腾都不会出错
with b do
ShowMessage('sD1:' + sD1 + ',sD2:'+sD2+',sD3:'+sD3+',sD4:'+IntToStr(sD4)+',sD5:'+IntToStr(sD5));
end;
procedure TForm1.btn4Click(Sender: TObject);
var
a: TA;
b: ^Tb;
begin
a.sD1 := edt1.Text ;
a.sD2 := edt2.Text ;
a.sD3 := edt3.Text ;
a.sD4 := ud1.Position;
a.sD5 := ud2.Position;
a.sD6 := ud3.Position;
a.sD7 := edt7.Text ;
new(b);
move(a, b^, sizeof(TB))
//用指针,再new,然后edt的内容怎么折腾都不会出错,why?
with b^ do
ShowMessage('sD1:' + sD1 + ',sD2:'+sD2+',sD3:'+sD3+',sD4:'+IntToStr(sD4)+',sD5:'+IntToStr(sD5));
// dispose(b)
//奇怪的是,如果不释放指针,代码没有任何问题,一旦加入这句话,第一次,没问题,第二次,什么也不提示,直接关闭程序。
end;