CnPack Forum


 
Subject: 奇怪的<包函结构体>自动赋值同步问题..
jxydhzw
普通灌水员
Rank: 2



UID 3904
Digest Posts 1
Credits 64
Posts 19
点点分 64
Reading Access 10
Registered 2006-12-26
Status Offline
Post at 2008-7-22 11:39  Profile | Blog | P.M. 
奇怪的<包函结构体>自动赋值同步问题..

先贴些代码吧. 其实就是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方法.没啥用.感觉捌扭.
   
     郁闷..不知道还有其他朋友遇到过这个问题没有.请牛人帮忙看看.看看为啥这样.有啥解决方法没?谢谢
Top
Passion (LiuXiao)
管理员
Rank: 9Rank: 9Rank: 9


UID 359
Digest Posts 19
Credits 6776
Posts 3563
点点分 6776
Reading Access 102
Registered 2004-3-28
Status Offline
Post at 2008-7-22 12:09  Profile | Blog | P.M. 
照理只要不是使用指针,是不会出现这样的情况的。可以跟踪一下是不是变成指针操作了。
Top
jxydhzw
普通灌水员
Rank: 2



UID 3904
Digest Posts 1
Credits 64
Posts 19
点点分 64
Reading Access 10
Registered 2006-12-26
Status Offline
Post at 2008-7-22 12:33  Profile | Blog | P.M. 
没有,但我也很纳闷啊。......
Top
jxydhzw
普通灌水员
Rank: 2



UID 3904
Digest Posts 1
Credits 64
Posts 19
点点分 64
Reading Access 10
Registered 2006-12-26
Status Offline
Post at 2008-7-22 16:03  Profile | Blog | P.M. 
看了别人的建议.好像是我的Record中有动态数组问题引起的.当记录中有动态数组,Old   := Tmp;
这样复制.除了数组外.其他的是传值.数组是传地址,郁闷.不知道有啥解决方法没?
Top
不得闲
灌水科科长
Rank: 3Rank: 3



UID 40680
Digest Posts 3
Credits 118
Posts 33
点点分 118
Reading Access 10
Registered 2008-7-23
Status Offline
Post at 2008-7-23 13:17  Profile | Blog | P.M. 
把赋值得改一下
改成CopyMemory
Top
jxydhzw
普通灌水员
Rank: 2



UID 3904
Digest Posts 1
Credits 64
Posts 19
点点分 64
Reading Access 10
Registered 2006-12-26
Status Offline
Post at 2008-7-31 18:30  Profile | Blog | P.M. 
我之前也用过CopyMemory,但是我写的这个方法.经常调用.然后会报错的...郁闷
Top
 




All times are GMT++8, the time now is 2024-6-25 16:47

    本论坛支付平台由支付宝提供
携手打造安全诚信的交易社区 Powered by Discuz! 5.0.0  © 2001-2006 Comsenz Inc.
Processed in 0.006355 second(s), 8 queries , Gzip enabled

Clear Cookies - Contact Us - CnPack Website - Archiver - WAP