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



是否有任何编译器定义或函数/常量/变量可用于判断某些代码是为设计时包构建的还是从 IDE 内部执行的?

我们有一些代码钩子,我们在初始化作为包一部分的单元时设置了这些代码钩子。我们不希望在 IDE 中安装包时执行此代码,只在包作为应用程序的一部分运行时执行。

现在,我已经在设计时包中添加了一个编译器定义,它去除了代码,但我想知道是否有一个内置的编译器定义表明这是设计时包的一部分,或者是否有一些函数/常量可以检查以查看代码是否在 IDE 中运行。类似于人们从内部组件使用的旧if csDesigning in ComponentState then

是否有任何编译器定义或函数/常量/变量可用于判断某些代码是为设计时包构建的还是从 IDE 内部执行的?

不。

我们有一些代码钩子,

我们在初始化作为包一部分的单元时设置了这些代码钩子。我们不希望在 IDE 中安装包时执行此代码,只在包作为应用程序的一部分运行时执行。

然后,该代码根本不属于单元的initialization部分。 将其移动到应用程序代码可以在启动期间调用的单独函数。

现在,我已经在设计时包中添加了一个编译器定义,该包去除了代码

这意味着您的设计时包直接编译您的运行时代码,它根本不应该这样做。 运行时代码和设计时代码需要位于单独的包中。 运行时代码不属于设计时包,设计时代码不属于运行时包。

我想知道是否有一个内置的编译器定义表明这是设计时包的一部分

没有。 但是,如果创建单独的运行时包和设计时包(应该如此),则钩子代码仅属于运行时包。 设计时包可以require运行时包(因此它有权访问运行时组件),并且运行时包可以公开设计时包可以设置的全局变量。 然后,运行时代码可以忽略设置该变量时需要忽略的任何内容。

理想情况下,您应该遵循 Remy 答案中写的实践,但现实生活中的代码往往更复杂。

有一种方法可以通过检查命令行参数是否包含bds.exe来检查 IDE 是否加载了包。这是相当粗糙的解决方案,但它仍然工作正常。

您可以创建一个将执行检查的函数。

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移动到另一个单元。

在这种情况下,您还可以将初始化移动到类构造函数,但根据代码的不同,可能更难保证类构造函数的调用顺序,并且您还需要确保首先调用适当的类构造函数。

最新更新