Subject:
奇怪的<包函结构体>自动赋值同步问题..
[Print This Page]
Author:
jxydhzw
Time:
2008-7-22 11:39
Subject:
奇怪的<包函结构体>自动赋值同步问题..
先贴些代码吧. 其实就是TRecB结构包函 TRecA结构)
TRecA = Record
AMeber1:Variant;
AMeber3:Integer;
AMeber4:Boolean;
AMeber5:string;
end;
TRecB = Record
BMeber1:Variant;
BMeber3:Integer;
BMeber4:Boolean;
BMeber5:string;
BMeberArray : array of TRecA; //注意:动态数组结构
end;
Tmp,Old,New:TRecB; //设定为全局性的
初使化时.假设设定
Tmp在成员值.并设定其动态数据为4维.设定动态数据中一些数据.
然后使三个结构都相等
Old := Tmp;
New := Tmp;
使用的原理为:
在业务逻辑中.初合化的时候使三个结构体相同,当某些业务属性变动之后,先对应在Tmp结构中变动一些成员的数据.然后对比Tmp,和Old结构有中对应成员数据异动.并将异动值同步至New中对应的成员上.
现在我程序中发现个问题.初使化三个结构体(Old := Tmp; New := Tmp;)后.当业务有变后.假设我手动的更改 Tmp.BMeber3:= 2; Tmp.BMeber1 := '2-3-4';
并没有显示设定(如:
Old.BMeber3:= 2; Old.BMeber1 := '2-3-4';
New.BMeber3:= 2; New.BMeber1 := '2-3-4';
或者
Old := Tmp;
New := Tmp;
)但是程序当中就自动将值同步到New和Old结构体对应的成员值中去了.
郁闷极了.程序我检查一下.除了在初使化的时候有显式的
Old := Tmp;
New := Tmp; 赋值操作外.其他地方除了我手动改Tmp成员的值外.没有类似的赋值语句了.奇怪.为什么为三个结构体值老是自动同步呢?
怀疑
1.初使中的 Old := Tmp; New := Tmp; 语句是不是将其中二个结构体的指针指向第三人结构体了,而不是更改其对应的值? 但是不应该啊.我只是赋值操作.不应该出现指针指向操作呀!!
2.TRecB中存在动态数组结构.(BMeberArray : array of TRecA; )不知道是不是因为这个的原因.
这里有不用类.是因业务不需要对应的事件方法.因为业务逻辑比较复杂.复杂的运算都是另写方法实现.使用结构体就是起缓存下数据而已.有点像使用变量的感觉罢了.
使用类其实也一样.但就是也起个保存数据作用.反而多了二个Create的Destory方法.没啥用.感觉捌扭.
郁闷..不知道还有其他朋友遇到过这个问题没有.请牛人帮忙看看.看看为啥这样.有啥解决方法没?谢谢
Author:
Passion
Time:
2008-7-22 12:09
照理只要不是使用指针,是不会出现这样的情况的。可以跟踪一下是不是变成指针操作了。
Author:
jxydhzw
Time:
2008-7-22 12:33
没有,但我也很纳闷啊。......
Author:
jxydhzw
Time:
2008-7-22 16:03
看了别人的建议.好像是我的Record中有动态数组问题引起的.当记录中有动态数组,Old := Tmp;
这样复制.除了数组外.其他的是传值.数组是传地址,郁闷.不知道有啥解决方法没?
Author:
不得闲
Time:
2008-7-23 13:17
把赋值得改一下
改成CopyMemory
Author:
jxydhzw
Time:
2008-7-31 18:30
我之前也用过CopyMemory,但是我写的这个方法.经常调用.然后会报错的...郁闷
Welcome to CnPack Forum (http://bbs.cnpack.org/)
Powered by Discuz! 5.0.0