在运行构建/编译时,是否有方法或编译器指令或某种方式确保某些组件(例如查询或数据库连接)设置为 active=false 或断开连接?似乎这些东西经常被其他东西打开,直到为时已晚你才注意到它。
我的特定安装是 Delphi 7
在运行构建/编译时,是否有方法或编译器指令或某种方式确保某些组件(例如查询或数据库连接)设置为 active=false 或断开连接?似乎这些东西经常被其他东西打开,直到为时已晚你才注意到它。
我的特定安装是 Delphi 7
GExperts的设置组件属性功能可以做到这一点。
我认为最好的选择是对股票连接组件进行子类化,并使用您自己的一种覆盖.Loaded
方法
if not csDesigning in Self.ComponentState then
if not Self.ActiveInDFM {new boolean published property} then
if Self.Active then Self.Active := false;
inherited;
通过(ab)使用 Delphi Form Designer 愚蠢,即使没有将新组件实际安装到 IDE Palette 中,您也可以使用它 - 只需将其命名为与 stock 组件类相同的名称,然后将您自己的方法作为最后一个放在表单的界面中使用list:因此在设计时您将拥有库存组件,并且在编译时将透明地替换为您自己的组件。
或者您可以在表单声明的正上方对其进行子类化,例如(对于另一个组件):
type
TPanel = class(ExtCtrls.TPanel)
private
...
TForm1 = class(TForm) ....
我想这种方法可能被视为类似于面向方面的编程,以有利于开发人员的方式使用 IDE 的限制。
另一种方法可能是一些脚本,它在保存或构建之前清除 DFM 中的 .Active 属性,但这种方式对于
Active
设计时的属性。从严谨的角度来看,这是一件正确的事情。然而,这可能不是很方便。您可以在您的表单和数据模块中使用类似的代码.Loaded method
(然后您必须覆盖它而不是连接的方法)。
您可以将相同的代码复制粘贴到每个 Form 的 Loaded 方法中。
procedure TMyForm.Loaded; // override
var c: TComponent; i: integer;
begin
try
for i := 0 to Self.ComponentsCount - 1 do begin
c := Self.Components[i];
if c is TCustomConnection then
with TCustomConnection(c) do // Hate those redundant typecasts!
if Connected then Connected := false;
if c is TDataSet then
with TDataSet(c) do // Delphi could took a lesson from Component Pascal
if Active then Active := false;
if c is ... // transactions, stored procedures, custom libriaries...
end;
finally
inherited;
end;
end;
这似乎是不那么狡猾的方式 - 因此最可靠。但是,如果复制粘贴,那就很多了,并且如果您以后要添加一些新组件或库,则可能会要求修改所有表单中的复制粘贴代码。
您可以将此代码集中在某个 MyDBUtils 单元中的全局过程中,例如Disconnect(const owner: TComponent);
然后
procedure TMyForm.Loaded; // override
var c: TComponent; i: integer;
begin
try
MyDBUtils.Disconnect(Self);
finally
inherited;
end;
end;
这种方法也有缺点:
MyDBUtils
紧密耦合。对于大型继承项目,由不同的二进制模块组成,历史上基于不同的 db-access 库并在迁移过程中,从而将所有访问库拉入每个二进制模块中。
在我的应用程序中,我Tag
在设计时将连接的属性设置为 1。在这种情况OnBeforeConnect
下,我检查Tag
,如果它等于 1,我中止连接并将其设置为 0。