是否存在方法或编译器指令或某种确保某些组件的方法,例如查询或数据库连接在运行构建/编译时设置为active = false或断开连接?似乎经常会被其他东西打开,而且你不会注意到它为时已晚。
我的特别安装是Delphi 7
答案 0 :(得分:4)
GExperts的Set Component Properties功能可以做到这一点。
答案 1 :(得分: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组件类相同的名称,然后将自己的方法作为最后一个放在表单中interface-uses list:因此在设计时你会有库存组件,编译时它会被你自己的组件透明地替换。
或者你可以在它的形式声明上面对它进行子类化(如(对于另一个组件):
type
TPanel = class(ExtCtrls.TPanel)
private
...
TForm1 = class(TForm) ....
我想这种方法可能被视为面向方面编程的模拟,在开发人员受益的方式中使用IDE的限制。
另一种方法可能是某些脚本,它可以在保存时或构建之前清除DFM中的.Active属性,但这种方式很复杂
Active
属性的设计时间。从严谨的角度来看,这是一件正确的事情。然而,这可能不太方便。您可以在Form和DataModule的.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
单元与所有与您可能使用的与数据库相关的库和组件紧密耦合。对于大型继承项目,由不同的二进制模块组成,历史上基于不同的数据库访问库和迁移过程,从而将所有访问库拉入每个二进制模块。
答案 2 :(得分:1)
在我的应用程序中,我在设计时将连接的Tag
属性设置为1。在OnBeforeConnect
事件中,我检查Tag
,如果它等于1,我将中止连接并将其设置为0.