晕死了,各位给我看看

MEFULEU 2006-11-09 11:17:07
//.h
TScrollBox *CtrlBox;

//.cpp
void __fastcall TAnalyseForm::LoadControl(TMemoryStream *pms)
{
//清除上次的控件
TWinControl *ctrobj,*DelObj;
int iCount;
ctrobj=(TWinControl *)CtrlBox;
try
{
iCount=ctrobj->ComponentCount;
for (int i=0;i<iCount;i++)
{
DelObj=(TWinControl *)ctrobj->Components[0];
delete DelObj;
DelObj=NULL;
}
}
__finally
{
pms->ReadComponentRes(CtrlBox);
}
}


执行完毕 CtrlBox竟然变成了NULL;

我把它放置在TPageControl控件上,单独放在Form时没有异行,什么原因搞的鬼阿~~~~~~~~~~
...全文
250 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
痞子酷 2006-11-10
  • 打赏
  • 举报
回复
//一般删除item采用如下方法:
iCount=ctrobj->ComponentCount;
for (int i=iCount-1;i>=0;i--)
{
DelObj=(TWinControl *)ctrobj->Components[i];
delete DelObj;
DelObj=NULL;
}
ccrun.com 2006-11-10
  • 打赏
  • 举报
回复
咦,这个帖子又自己跑到前面来了,好神奇的说。
MEFULEU 2006-11-10
  • 打赏
  • 举报
回复
to:老妖:

把我那个文件中的TScrollBox类名称更改为ScrollBox试一下吧~

原来还以为什么名字都可以~~~~~~~~~~~
MEFULEU 2006-11-10
  • 打赏
  • 举报
回复
呵呵,终于发现了问题


保存时,父句柄名称为:ScrollBox

读取时,对应的句柄名称必须一致才可以~

我看了一个我那个流文件才发现这个古怪的问题~


总结~:
使用WriteComponentRes保存的留文件,在读取时必须使用一样的控件名称;
我在保存时使用:WriteComponentRes(ScrollBox->Name,ScrollBox);
ScrollBox->Name其实就是ScrollBox,
所以在读取时必须使用ReadComponentRes(ScrollBox);才行~

似乎有些古怪吧~~~~~~~~~~~~~~

还是对这些过程不了解~~~~~~~~555555~~~~~~`好好学习,天天向上



MEFULEU 2006-11-10
  • 打赏
  • 举报
回复
to:uygg(痞子酷)

不好意思,没有看清楚~~~~~
MEFULEU 2006-11-10
  • 打赏
  • 举报
回复
to:ccrun(老妖)(www.ccrun.com)

邮件已经发送完毕~都是简化过的东西,呵呵,没啥保密的;

jiangshx 2006-11-10
  • 打赏
  • 举报
回复
ouygg(痞子酷)的方法是由后向前删除,语句没问题
ccrun.com 2006-11-10
  • 打赏
  • 举报
回复
我现在也很晕。如果你的工程不保密的话,可以做一个演示的代码发到我信箱,我研究一下。
cbfans at 163.com
MEFULEU 2006-11-10
  • 打赏
  • 举报
回复
to:ccrun(老妖)(www.ccrun.com)


老大阿,说话阿,有什么好的解决方法?

现在我只好暂时判断一下了;重新的把指针赋回去;真是晕死了~~~~~~
if (CtrlBox==NULL)
{
CtrlBox=ctrobj;
}

MEFULEU 2006-11-10
  • 打赏
  • 举报
回复
to:ouygg(痞子酷);

嘿嘿,。你试一下吧.呵呵;

Components[i]减少一个,它的队列自动往前缩进

假设10个对象,删除了6个只剩下了4个,这个时候你访问Components[6];

那就是益出了,实际上,这时候ctrobj->ComponentCount=4了;

ccrun.com 2006-11-09
  • 打赏
  • 举报
回复
恩。判断一下流的Postion和Length,看看流中的数据是否有误。
勉励前行 2006-11-09
  • 打赏
  • 举报
回复
TMemoryStream pms 其position位置對不對啊.

關注一下。
MEFULEU 2006-11-09
  • 打赏
  • 举报
回复
厄,厄,笔误:

上边应该是ctrobj有值,但是CtrlBox变成了NULL
MEFULEU 2006-11-09
  • 打赏
  • 举报
回复
ctrobj跟CtrlBox地址是一样的;

但是执行pms->ReadComponentRes(CtrlBox);

完毕,CtrlBox有值,但是CtrlBox变成了NULL

原来我在这里判断一下,
if (CtrlBox==NULL)
{
CtrlBox=ctrobj;
}
但是这样子后边就又触发其他的问题了~~~~~~~~~


另外:Components存放的是一个控件列表;
删除一个后会自动的缩小,所以只能够使用
(TWinControl *)ctrobj->Components[0];
而不是(TWinControl *)ctrobj->Components[i];

谢谢各位捧场~~~~~~~
jiangshx 2006-11-09
  • 打赏
  • 举报
回复
FFSB(搞点小资)批评的是!
FFSB 2006-11-09
  • 打赏
  • 举报
回复
LS:
while(iCount--) for(int i=0;i<iCount;i++)
{ {
;;; ;;;
} }
这应该没什么差别...
jiangshx 2006-11-09
  • 打赏
  • 举报
回复
-_-| ,没仔细看,偶是来学习的
jiangshx 2006-11-09
  • 打赏
  • 举报
回复
for (int i=0;i<iCount;i++)
{
DelObj=(TWinControl *)ctrobj->Components[0];
delete DelObj;
DelObj=NULL;
}
学习楼上,多嘴一句,i没用上
ccrun.com 2006-11-09
  • 打赏
  • 举报
回复

pms->ReadComponentRes(CtrlBox);
这一行处加个断点,看看未执行这一行前CtrlBox的值为多少。
FFSB 2006-11-09
  • 打赏
  • 举报
回复
很明显它调用ReadRootComponent
单独放在Form时是Root
否则不是.
加载更多回复(2)

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧