delphi 为设计时包或代码定义编译器以检查IDE中执行情况

oalqel3c  于 2022-11-04  发布在  其他
关注(0)|答案(2)|浏览(224)

是否有任何编译器定义或函数/常量/变量可用于判断某些代码是为设计时包生成的还是从IDE内部执行的?
我们有一些代码挂钩,我们在初始化一个单元时设置,它是包的一部分。我们不希望在IDE中安装包时执行这些代码,只有当它作为应用程序的一部分运行时才执行。
现在我已经在设计时包中添加了一个编译器定义,它可以剥离代码,但我想知道是否有一个内置的编译器定义,它可以指示这是设计时包的一部分,或者是否有一些函数/常量可以检查代码是否在IDE中运行。类似于人们在组件内部使用的旧的if csDesigning in ComponentState then

carvr3hs

carvr3hs1#

是否有任何编译器定义或函数/常量/变量可用于判断某些代码是为设计时包生成的还是从IDE内部执行的?
不,不,不
我们有一些代码挂钩,我们在初始化一个单元时设置,它是包的一部分。我们不希望在IDE中安装包时执行这些代码,只有当它作为应用程序的一部分运行时才执行。
那么这段代码就根本不属于单元的initialization部分。将它移到一个单独的函数中,以便应用程序代码在启动时可以调用它。
现在,我已经在设计时包中添加了一个编译器定义,它剥离了代码
这表示您的设计阶段封装会直接编译您的执行阶段程式码,但它根本不应该这样做。执行阶段程式码和设计阶段程式码必须位于不同的封装中。执行阶段程式码不属于设计阶段封装,而设计阶段程式码也不属于执行阶段封装。
我想知道是否有一个内置的编译器定义,表明这是设计时包的一部分
但是,如果您创建单独的运行时包和设计时包,(你应该这样做),那么你的钩子代码只属于运行时包。(因此它可以访问您的运行时组件),并且运行时包可以公开设计时包可以设置的全局变量。如果设置了该变量,则时间代码可以忽略它需要忽略任何内容。

5lwkijsr

5lwkijsr2#

理想情况下,您应该遵循Remy's answer中编写的实践,但真实的的代码往往更复杂。
有一种方法可以检查IDE是否加载了包,方法是检查命令行参数是否包含bds.exe。这是一个相当粗糙的解决方案,但它仍然工作得很好。
您可以创建一个函数来执行检查。

function IsDesignTime: Boolean;
begin
  Result := ParamStr(0).EndsWith('\bds.exe', True);
end;

如果您需要在代码中调用该函数,而该函数不仅在应用程序初始化期间调用,而且在性能很重要的情况下,您可以初始化布尔标志,从而避免在每次执行检查时都解析命令行。

function IsDesignTime: Boolean;

implementation

var
  DesignTime: Boolean;

function IsDesignTime: Boolean;
begin
  Result := DesignTime;
end;

initialization

  DesignTime := ParamStr(0).EndsWith('\bds.exe', True);

end.

**注意:**初始化布尔标志取决于单元初始化顺序,因此请确保将该函数放在某个基本单元中,该基本单元不具有可能更改初始化顺序的循环单元依赖项。

由于该单元内的类构造函数将在单元初始化部分之前运行,因此DesignTime将不会在那时被初始化,并且如果需要从该单元内的任何类构造函数调用函数,则必须将IsDesignTime移动到另一个单元。
在这种情况下,您也可以将初始化移至类构造函数,但根据代码的不同,可能更难保证类构造函数的调用顺序,并且您还需要确保首先调用适当的类构造函数。

相关问题