【发布时间】:2012-08-30 02:18:34
【问题描述】:
问题是,作为我的第一个可执行语句,我想检查是否可以从数据库中读取。如果我不能,我打电话给MessageDlg解释,然后我Halt;。
但是,关闭对话框后,我仍然在 tak 管理器中看到应用程序(如果我停止它并重新运行应用程序,也会发生同样的事情)。
知道我做错了什么吗?
Global.ADQuery1 是一个 AnyDac 数据库访问组件。我通过 IP 地址访问 d/b。当我将我的 PC 地址设置为 d/b 地址时,代码可以正常工作,并在我更改我的 IP 地址时给出报告的问题(因此,无法访问 d/b,这会引发异常)。
procedure TMainForm.FormCreate(Sender: TObject);
begin
try
Global.ADQuery1.Open('SHOW DATABASES');
except
On E: Exception do
begin
MessageDlg('Database access problem', mtError, [mbOK], 0);
Halt;
end;
end;
[更新]当我在 IDE 中运行时,捕获后
(EMySQLNativeException) : "[AnyDAC][Phys][MySQL] Can't connect to MySQL server on '10.21.18.211' (10060)"
我捕获了一个EIdWinSockStubError either the program has not called wsastartup or wsastartup failed - 但我不知道它是如何抛出的......我猜Application.Terminate 调用可能是主窗体的FormClose,它对我的 Indy 组件没有任何作用,但我猜测当父窗体被销毁时,它的子窗体也会被销毁。
[进一步更新]
我的TMainForm.FormCreate 现在只说
Sleep(1000);
PostMessage(Handle, UM_PROGRAM_START, 0, 0);
然后我将所有代码移到了处理它的函数的 stat 中。确定一切都是在那个时候创造的吗?那么,为什么我的 Indy 组件会抛出异常呢?
也许我应该将PostMessage() 放在我的[应用程序].pas 中Application.Run(); 之后?
(旁白:1)其他人通常如何以这种方式处理应用程序启动? 2)有人有应用程序框架吗?我正在考虑创建一个选项来处理最小化到系统托盘,只允许一个实例,最近的文件菜单等) - 尽管作为一个单独的问题可能会更好
【问题讨论】:
-
试试
Application.Terminate吧? -
首先,调用
Halt;这应该是最后的手段。其次,不要在您的问题中发布任何源代码;如果你不展示你在做什么,就不可能说出你做错了什么。 -
+1 两者。啊,Ken,你总是想看代码 ;-) 好的,更新了……而且 Application.Terminate 似乎没有改变任何东西
-
使用调试器。暂停您的程序并查看调用堆栈,看看您的程序仍在做什么以及它在等待什么。
-
+1 但我没有看到堆栈???也许一个线程还在运行???