1

在运行构建/编译时,是否有方法或编译器指令或某种方式确保某些组件(例如查询或数据库连接)设置为 active=false 或断开连接?似乎这些东西经常被其他东西打开,直到为时已晚你才注意到它。

我的特定安装是 Delphi 7

4

3 回答 3

5

GExperts的设置组件属性功能可以做到这一点。

于 2013-04-30T07:45:49.787 回答
3

我认为最好的选择是对股票连接组件进行子类化,并使用您自己的一种覆盖.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 属性,但这种方式对于

  • 我可能更难与独立构建服务器集成(尝试了每个不同 CI 框架的新脚本)
  • 它也会重置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 库并在迁移过程中,从而将所有访问库拉入每个二进制模块中。
    1. 它可以通过 ad hoc DI 框架来克服,但相反的情况可能会发生:您可能会面临交付不足的风险,您可能只是忘记将一些库或组件处理程序注入到实际使用它或被修改以使用它的项目中。
  • 如果你的表单有一些组件,它们的连接不应该被重置(对象数组作为数据集、内存中的表、内存中的 NexusDB 或 SQLite 数据库等),你必须想出特别的非显而易见的约定选择他们退出。
于 2013-04-30T06:17:56.537 回答
1

在我的应用程序中,我Tag在设计时将连接的属性设置为 1。在这种情况OnBeforeConnect下,我检查Tag,如果它等于 1,我中止连接并将其设置为 0。

于 2013-04-30T10:15:00.263 回答