希望不是cb的bug?

qingyuwork 2002-07-17 11:01:17
我想动态生成一个frame。在工程中包含form1和frame2.form1有一button1。在form1的头文件中的pubic添加TFrame2 * frame1;form1的cpp文件中添加:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
frame1 = new TFrame2(this);
frame1->Parent = Form1;
frame1->BitBtn1->OnClick = aaa;
}
//------------------------------------------------------------------------

void __fastcall TForm1::aaa(TObject * Sender)
{
//TODO: Add your source code here
delete frame1;
frame1=0;
}


问题就是:当frame1上的bitbtn控件数目大于2时,(环境为cb5+win2000,或cb6+win2000或cb6+win98)当按button1创建frame,再删除frame后,第二次创建frame再删除时,将出错。错误信息为"access violation at address 40003c89 in module "vcl50.bpl"(cb6为vcl60.bpl").利用中断跟踪在执行aaa中的frame1=0;之后。而bitbtn少于3个或其他控件(如label、button等)都不会出错。cb5+win98偶尔出现错误。
这是怎么回事?恳请各位老大告诉我。

...全文
52 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
A_Yu 2002-07-24
  • 打赏
  • 举报
回复
你这段代码肯定有问题! 因为你的
frame1->BitBtn1->OnClick把frame1释放了,这样等于BitBtn也释放了,而BitBtn在执行完Click事件之后要返回BitBtn,但是BitBtn又没有了,所以要出问题。
qingyuwork 2002-07-24
  • 打赏
  • 举报
回复
那么,在frame上就不能删除frame了?
jishiping 2002-07-24
  • 打赏
  • 举报
回复
首先,我们先看一下,事件OnClick是怎么产生的。先看一下VCL的源程序:
procedure TControl.WMLButtonUp(var Message: TWMLButtonUp);
begin
inherited;
if csCaptureMouse in ControlStyle then MouseCapture := False;
if csClicked in ControlState then
begin
Exclude(FControlState, csClicked);
if PtInRect(ClientRect, SmallPointToPoint(Message.Pos)) then Click;
end;
DoMouseUp(Message, mbLeft);
end;

procedure TControl.Click;
begin
if Assigned(FOnClick) and (Action <> nil) and (@FOnClick <> @Action.OnExecute) then
FOnClick(Self)
else if not (csDesigning in ComponentState) and (ActionLink <> nil) then
ActionLink.Execute
else if Assigned(FOnClick) then
FOnClick(Self);
end;
从上面可以看出,OnClick事件是被函数 TControl.Click 调用的,而
Click又是被TControl.WMLButtonUp调用的。请注意:在WMLButtonUp
中,执行完Click之后,还要执行 DoMouseUp(Message, mbLeft); 现在
你明白没有,如果在事件OnClick里,已经将自身删除了,那么再执行
DoMouseUp(Message, mbLeft); 时,就是非法访问内存了。当然了,不
是每次非法访问时,程序都会立刻出错的。所以说,你不能在OnClick
里,删除控件本身,否则就会出错。在你这儿,执行Button1的OnClick
时,删除Frame2,而删除Frame2时,又会删除Frame2上的Button1。
qingyuwork 2002-07-19
  • 打赏
  • 举报
回复
照各位老大说的用this后效果一样。有没有谁知道究竟是怎么回事?
qingyuwork 2002-07-19
  • 打赏
  • 举报
回复
照各位老大说的用this后效果一样。有没有谁知道究竟是怎么回事?
superaf 2002-07-18
  • 打赏
  • 举报
回复
这样写就应当可以:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
frame1 = new TFrame2(this);
frame1->Parent = this; //将Form1改成this。养成习惯,用this是最安全的
frame1->BitBtn1->OnClick = aaa;
}

奇怪,我试了你的代码,在我这里没有问题啊,我放了三个bitbtn,还有几个label都没有问题的,(cb5 +win200 pro)
================================================================

CSDN 论坛助手 Ver 1.0 B0402提供下载。 改进了很多,功能完备!

★ 浏览帖子速度极快![建议系统使用ie5.5以上]。 ★ 多种帖子实现界面。
★ 保存帖子到本地[html格式]★ 监视您关注帖子的回复更新。
★ 可以直接发贴、回复帖子★ 采用XML接口,可以一次性显示4页帖子,同时支持自定义每次显示帖子数量。可以浏览历史记录!
★ 支持在线检测程序升级情况,可及时获得程序更新的信息。

★★ 签名 ●
可以在您的每个帖子的后面自动加上一个自己设计的签名哟。

Http://www.ChinaOK.net/csdn/csdn.zip
Http://www.ChinaOK.net/csdn/csdn.rar
Http://www.ChinaOK.net/csdn/csdn.exe [自解压]

qingyuwork 2002-07-18
  • 打赏
  • 举报
回复
不知各位老大是否运行出现了我所说的现象。
jishiping 2002-07-17
  • 打赏
  • 举报
回复
void __fastcall TForm1::Button1Click(TObject *Sender)
{
frame1 = new TFrame2(this);
frame1->Parent = this; //将Form1改成this。养成习惯,用this是最安全的
frame1->BitBtn1->OnClick = aaa;
}
cdws222 2002-07-17
  • 打赏
  • 举报
回复
对,对于要运态new和delete的东东最好用this
pp616 2002-07-17
  • 打赏
  • 举报
回复
那有那么多bug啊。???
钛哥 2002-07-17
  • 打赏
  • 举报
回复
这样很不安全,
delete frame1;
frame1=0;
这些代码虽然放在From2中,但在form1中调用,等于form1 要删除他自己,这样是不妥的。
qingyuwork 2002-07-17
  • 打赏
  • 举报
回复
季老大:还是一样。
希望是因为D版缘故。可是我找了3个cb5,1个cb6,都一样。代码好象没错吧。

13,873

社区成员

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

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