Delphi 如何处理非设计组件初始化错误?

Delphi 如何处理非设计组件初始化错误?,delphi,Delphi,首先,让我们举一个例子: 在Delphi中创建一个新的VCL应用程序项目,并放置一个TIBDataBase,然后键入数据库文件的路径和名称,扩展名为.IBok 现在,如果您只放置example.ib并保留路径,当您在没有Delphi的情况下执行应用程序时,如果.EXE与.ib位于同一路径中,它将正常打开数据库,但如果您从Delphi运行应用程序,它将引发错误,因为它找不到数据库文件,因为Delphi更改了工作目录 有时,您希望在开发时将该组件的Active属性设置为True,然后将其设置为Fal

首先,让我们举一个例子:

在Delphi中创建一个新的VCL应用程序项目,并放置一个
TIBDataBase
,然后键入数据库文件的路径和名称,扩展名为
.IB
ok

现在,如果您只放置
example.ib
并保留路径,当您在没有Delphi的情况下执行应用程序时,如果
.EXE
.ib
位于同一路径中,它将正常打开数据库,但如果您从Delphi运行应用程序,它将引发错误,因为它找不到数据库文件,因为Delphi更改了工作目录

有时,您希望在开发时将该组件的
Active
属性设置为
True
,然后将其设置为
False
,并在应用程序启动时向客户交付时对其进行更改。所有这些都是因为他/她可能希望安装在不同的路径中,并且您的应用程序必须在打开数据库之前找到数据库的正确位置

当你已经交付给你的客户,仍然每天对代码做一些修改时,问题就来了。然后,您必须每天至少部署一次,有时您会忘记将该属性设置回
False
,当客户端收到更新并尝试运行时,他/她会收到一个找不到的数据库错误


问题是,如果在内存中加载组件时自动打开,并且数据库的激活不是在我自己的代码中进行的,那么我如何处理该错误?

我认为您不会找到一个通用的解决方案来防止在不修改组件或数据库的情况下从设计时属性设置中出现运行时异常衍生后代的

对于
TIBDatabase
,将属性
AllowStreamedConnected
设置为
False
。当设计时
Connected
True
时,这将停止
TIBDataBase
在运行时自动连接到数据库
TIBQuery
使用此
TIBDatabase
将不会打开,即使它在设计时被设置为活动状态


其他一些数据库连接组件具有类似的属性。

仅关于数据库问题:如果我理解正确,我的解决方案要求您为“BeforeConnect”事件编写事件处理程序,如下所示:

procedure TDM.SQLConnection1BeforeConnect(Sender: TObject);
var
 dir: string;

begin
 with TRegIniFile.create (regpath) do  // I keep my database locations in the registry
  begin                          // but you can use any method of getting the location
   dir:= ReadString ('firebird', progname, '');
   free
  end;

 with sqlconnection1 do
  begin
   close;
   params.values['database']:= dir;
   loginprompt:= false;
  end;
end;

这样,您可以在数据库中存储一个位置供本地使用,但对于不同的用户有不同的位置。

正确的答案是,在部署之前,请记住将
Active
设置为false。如果这还不够,那么可能构建事件,弹出一条消息提醒您禁用它?我的意思是,这就像询问如何让您的程序在您犯错误时识别并修复它。我错了吗?建议:在您的问题中不要提及任何关于您的特定数据库场景的内容。关于在表单创建期间从控件捕获异常,请保持简单和切中要害;stdcall外部“kernel32.dll”是供我们开发人员使用的工具,用于处理我刚才解释的这个场景。我们在用户仍在操作时制作或更正的项目非常常见。忘记关闭我们的一些工具并不罕见(这也不是一种罪恶),并且可能会对用户造成偏见,例如,当用户在麦当劳收到客户订单时。在你判断我的问题之前,你考虑过了吗?听起来好像你需要把你的发布过程正式化。自动化:编写一个脚本来更改属性值并调用编译器。如果这没有给你一个可发布的软件,那么你还没有准备好发布。您的客户不会特别关心您的发布过程是否自动化,但当您停止向他们发送DOA更新时,他们会注意到并感激您。没有“通用方法”这样的东西。如果您的范围是活动数据库标志,我可以发布该问题的答案。