一共有两个Form,一个是主界面,一个是全局变量的NewForm,NewForm的初始状态Visible:=Flase;在主界面初始化时FormCreate进程内调用NewForm.Create,主界面出来后,用一个主界面上的ButtonClick进程来开启一个新的线程TestThread,在这个线程里用NewForm.Visible:=True;让副界面可见,然后这个线程就结束,接着关闭主界面,在主界面的FormClose进程里调用NewForm.Free,完了,出问题......窗口句柄无销,最奇怪的是,把线程里的NewForm.Visible:=True;屏蔽掉,做同样的操作,就没有问题,这是什么原因啊??
BTW:我的代码在公司里,家里没装delphi,如果还有疑问的话我可以把代码贴上来
BTW:我的代码在公司里,家里没装delphi,如果还有疑问的话我可以把代码贴上来
解决方案 »
- 真希望能专门开个delphi2009版 来专门学习讨论
- 怎样可以在主程序中设置一个中断,直到某个事件产生再继续。
- 一个小问题,为什么ADoQuery在BatchUpdate方式时,对于插入的多个空行后,再取消时老时会报错无法定位已删除的行?
- 请问如何用IdIPWatch监控远程客户端是否在线?
- 请各位高手为我指一条明路!!!
- 这样情况怎么用TFileStream?
- Ctrl+F9和F5,F9有什么区别?
- 用Image控件的LoadFromFile方法的问题
- 一个简单问题:关于数据库记录的查询。大家帮忙看看!
- ???看看吧
- aspack为什么能给程序减肥?
- 请教easygrid横向打印不能完全打印的问题
关键看你的form.handle是不是在线程中创建的。
你在主线程中form.Create而在子线程中form.visible := true不是一个好主意。因为你无法确定该form.handle会不会在子线程中创建(如果是在子线程中创建的话你麻烦了,首先必须在子线程中建立消息循环并分发消息--否则该form的所有消息都会丢失,包括form的刷新都不会正常,其次有无数可能产生和主线程的访问冲突并引起程序崩溃--因为delphi的form设计时就根本没有考虑在多线程下运行)。在delphi下,form对应的windows的hwnd的创建是在你第一次使用到form.handle时。所以如果你没有在form.Create时引用到form.handle的话该form不会创建handle(而引用form.handle则有无数种情况存在,比如设置form的某些属性,比如设置某个子控件的属性等等都可能引用到form.handle并创建对应的windows的hwnd)。
在子线程中设置form.visible并不一定表示该form.handle会在子线程中创建,主要看form.Create时是不是引用了form.handle.
同时,我也试过在子线程里创建一个新的NewForm,但一进线程任务就报告canvas出错,但这个调试的还不完全,不能说和上面的有关。