问题在于,作为我的第一个可执行语句,我想检查是否可以从数据库中读取。如果我不能,请致电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()
之后将Application.Run();
放在我的[应用] .pas中?
(旁白:1)其他人通常如何以这种方式处理应用程序启动? 2)有人有申请骨架吗?我想创建一个带有选项来处理最小化到系统托盘,只允许一个实例,最近的文件菜单等等) - 尽管这可能更好作为一个单独的问题
答案 0 :(得分:8)
Halt
程序不是我们有时会误认为它的直接过程杀手。它调用所有程序单元的单元定型部分,因此您的程序可能会陷入其中一个部分,可能等待表单发生某些事情,这是不会发生的,因为您的OnCreate
处理程序没有还没回来。
您可以使用调试器找出您的程序正在执行或等待的内容。
要真的尽快退出计划,请跳过Halt
并直接转到ExitProcess
。这是Halt
调用的最后一件事。
Application.Terminate
实际上更远从任何实际终止发生的地方开始,因为它实际上只是一个咨询命令;应用程序在到达消息循环之前不会终止。
更好的是,找到一种更优雅的方式退出程序。例如,在创建表单之前测试你的数据库,这样你就不会处于一个你不想要的半创建表单的尴尬境地。