首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >德尔福TForm OnCreate多次被调用

德尔福TForm OnCreate多次被调用
EN

Stack Overflow用户
提问于 2012-04-30 02:15:29
回答 2查看 829关注 0票数 2

我希望我能很好地解释这个问题!

我正在尝试将ReWire音频设备实现为Delphi .dll。如果你不知道ReWire是什么,不要担心它。重要的是,我的代码编译成一个.dll,我收到来自ReWire系统的调用到我的.dll中,打开一个显示器,检查显示器是否打开,然后再次关闭它。

当我接到启动电话时,我会做以下几件事:

代码语言:javascript
复制
  if not Assigned(form) then
    form := TMyForm.Create(nil);
  form.Show;

在我的Delphi库中,form是一个全局变量(可能是个问题?)我连接了MyFormOnCreate事件来做一些有趣的事情,比如准备一组我想要处理的东西。

到目前为止一切都很好。我的表单中有一个小按钮,可以打开一个TOpenDialog。我发现一旦对话框关闭,OnCreate事件就会以我的形式再次触发!

我检查过OnDestroy没有被调用,所以我不知道为什么要再次调用OnCreate

不幸的是,我并不确定哪些信息是相关的,但是下面是第一次调用堆栈(当表单第一次设置时):

正如预期的那样,ReWire正在调用我的.dll来启动Panel应用程序,所以我创建了我的表单。很好,一切看起来都很好。

然后在表单中打开一个小对话框,选择一个文件,并执行一些操作。在左侧字段中,再次调用OnCreate,下面是调用堆栈:

这是个疯狂的电话派对!Reaper (在底部)是我用来测试我的应用程序的ReWire主机,但是我不知道堆栈跟踪中发生了什么,因为没有一个是我的代码。突然间,当我认为不应该这样做的时候,这个事件就会被调用,因为OnDestroy甚至没有被调用。

我唯一能想到的另一件重要的事情是,如果我打印出Sender的地址,每次都是不同的,所以它是以某种方式再次创建的,但是我检查了一下,我只调用了一次MyForm.Create。

对于这类事情的发生有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-30 04:30:15

在第一个堆栈跟踪中,OnCreate调用前面是对TCustomForm.Create()的调用,这是正确的行为。在第二个堆栈跟踪中,OnCreate调用前面是对TObject.Create()的调用,这是不正确的行为。这导致我认为,按钮OnClick事件处理程序中的某些内容要么是用错误的VMT构造对象,要么是以其他方式破坏内存,从而导致错误地跳入刚好被TForm类占用的代码。无论哪种方式,都要检查您的OnClick逻辑是否存在bug。

票数 4
EN

Stack Overflow用户

发布于 2012-04-30 02:50:48

检查将表单变量设置为零的(任意)。可能是在没有释放所指向的表单的情况下将其设置为零,因此下次调用启动代码时,它将创建表单的另一个实例。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10377786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档