- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试编写一个从 obj 文件加载 3D 对象的组件。我正在为 GetActiveProject.FileName
使用 ToolsAPI 库。我将designide.dcp添加到bpl中的Requiers部分。我注册了我的对象,并在设计中将这个对象的实例放在 TViewPort3D 上,然后一切正常,我可以看到 obj 文件中的对象已加载到场景中,但是当我尝试编译项目时,我收到一条错误消息,指出未找到 ToolsAPI.dcu。
我用于加载 obj 文件的过程是(模型变量的类型是 TModel3D):
procedure TMyObject.LoadModel(fileName: string);
begin
if(csDesigning in ComponentState)then
Model.LoadFromFile(IncludeTrailingPathDelimiter(ExtractFilePath(GetActiveProject.FileName))+'Obj\'+filename)
else
Model.LoadFromFile(IncludeTrailingPathDelimiter(ExtractFilePath(ParamStr(0)))+'Obj\'+filename);
end;
这个过程在构造函数中使用如下(TMyObject继承自TDummy):
constructor TMyObject.Create(AOwner:TComponent)
begin
inherited;
Model:=TModel3D.Create(Self);
Model.Parent:=Self;
LoadModel('Object1.obj');
end;
当组件的宿主项目即将编译时,是否有办法阻止使用 ToolsAPI 库?
我只是在考虑如下指令之类的东西。
{$IFDEF DESIGNTIME}
uses ToolsAPI;
{$ENDIF}
但是这样的事情可能吗?
最佳答案
听起来好像您正在尝试将设计时代码编译到运行时项目中。运行时包或可执行文件。这是不允许的。您根本无法将任何 ToolsAPI 单元编译到不是设计时包的项目中。
您当然可以使用条件编译来排除 ToolsAPI 单元,但您必须定义自己的条件定义。没有内置条件可以满足您的需求。
但是使用条件编译可能不是最好的解决方案。通常,您会将使用 Tools API 的代码分成不同的单元,并且仅将这些单元包含在设计时项目中。
因此,组件的代码将被分成两个单元。例如,第一个单元 uMyComp.pas
包含大部分代码。该单元声明组件并提供其实现。 uMyComp.pas
中没有任何内容引用 ToolsAPI。第二个单元,uMyCompReg.pas
,执行组件注册和任何其他需要 ToolsAPI 的任务。这些单元之间存在依赖关系,因为 uMyCompReg.pas
使用 uMyComp.pas
。然后,您的设计时包将包含这两个单元,而任何其他非设计时项目将仅包含 uMyComp.pas
。
您可以使用条件达到相同的效果。设计时间项目将定义一个条件来指示这是设计时间。因此,项目设置可能包含名为 DESIGNTIME
的条件的定义。然后,组件的所有代码都将驻留在名为 uMyComp.pas
的单元中。任何与设计时间相关的代码都以 DESIGNTIME
为条件。包含 uMyComp.pas
的任何其他项目都不会定义 DESIGNTIME
,因此将省略仅设计时的代码。
虽然这是可能的,但在我看来,这并不是解决问题的最佳方法。事实上,如果您查看大量组件开发的开源示例,如果您发现任何使用条件处理设计时代码与运行时代码分离的示例,我会感到惊讶。
<小时/>如何将 ToolsAPI 代码分成设计时间单元?问题方法如下:
procedure TMyObject.LoadModel(fileName: string);
begin
if csDesigning in ComponentState then
Model.LoadFromFile(IncludeTrailingPathDelimiter(
ExtractFilePath(GetActiveProject.FileName))+'Obj\'+filename)
else
Model.LoadFromFile(IncludeTrailingPathDelimiter(
ExtractFilePath(ParamStr(0)))+'Obj\'+filename);
end;
首先我们看一下这段代码的共性。首先要观察的是,对 LoadFromFile
的调用的外部是相同的。只有在中间,目录的选择,才有变化。那么我们就这样写:
procedure TMyObject.LoadModel(fileName: string);
var
ModelDir: string;
begin
if csDesigning in ComponentState then
ModelDir := ExtractFilePath(GetActiveProject.FileName)
else
ModelDir := ExtractFilePath(ParamStr(0));
Model.LoadFromFile(IncludeTrailingPathDelimiter(ModelDir)+'Obj\'+filename);
end;
您面临的问题是如何将 GetActiveProject.FileName
移至设计时代码中。您需要使用依赖注入(inject) (DI) 来执行此操作。允许其他方提供逻辑。您需要让 TMyObject
忽略这个特定的细节。您可以为此使用 DI 框架,但这对于这一项任务来说可能有点重量级。因此,让我们声明一个包含函数指针的类变量:
type
TMyObject = class(...)
...
public
class var GetModelDir: TFunc<string>;
end;
此功能点允许类外部的其他方指定模型目录的位置。现在 LoadModel
变为:
procedure TMyObject.LoadModel(fileName: string);
var
ModelDir: string;
begin
if Assigned(GetModelDir) then
ModelDir := GetModelDir()
else
ModelDir := ExtractFilePath(ParamStr(0));
Model.LoadFromFile(IncludeTrailingPathDelimiter(ModelDir)+'Obj\'+filename);
end;
此时,您的代码现在可以在设计时包之外使用。下一步是添加代码以在设计时指定 GetModelDir
。该代码仅进入也注册组件的设计时单元。代码的明显位置是该单元的初始化部分。它看起来像这样:
initialization
TMyObject.GetModelDir :=
function: string
begin
Result := GetActiveProject.FileName;
end;
我在这里使用了匿名方法,但您同样可以使用对象方法或普通的旧函数类型,具体取决于您的 Delphi 版本。
关于delphi - 是否可以在delphi中仅在设计时使用库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23783993/
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 4年前关闭。 Improve this questi
.NET 框架:4.5.1 我在 Blend for visual studio 2015 中遇到一个奇怪的错误,我找不到它的来源。 如果我在 VS 中打开我的 WPF 解决方案,它会加载并运行良好。
我经常遇到这样的问题,与 Hierarchical RESTful URL design 非常相似 假设该服务仅提供用户上传文档。 POST, GET /accounts PUT, DELETE /a
在 Rails 应用程序中,我使用 devise 来管理我的用户,而我用来销毁 session 的链接不再有效。它正在工作,现在我添加了事件管理员,但没有。 我的链接是 :delete, :clas
我已经坚持了超过 24 小时,试图按照此处发布的其他解决方案进行操作,但我无法使其正常工作。我是 Rails 新手,需要帮助! 我想让我的/users/edit 页面正常工作,以便我可以简单地更改用户
Devise 在以下情况下不会使用户超时: 用户登录,关闭选项卡,然后在超时 + X 分钟内重新访问该 URL。用户仍处于登录状态。 如果选项卡已打开并且稍后刷新/单击,则超时可以正常工作。这意味着
我想使用这样的 slider 我希望该 slider 根据提供给它的值进行相应调整。到目前为止,我只能应用具有渐变效果的背景,但无法获得这种效果。请通过提供样式代码来帮助我。
您应该为每种方法创建一个请求/响应对象,还是应该为每个服务创建一个? 如果我在所有方法中使用它,我的服务请求对象中将只有 5 个不同的东西,因为我对几乎所有方法使用相同的输入。 响应对象将只有一个字典
我正在尝试在 REST 中对实体的附件进行建模。假设一个缺陷实体可以附加多个附件。每个附件都有描述和一些其他属性(上次修改时间、文件大小...)。附件本身是任何格式的文件(jpeg、doc ...)
我有以下表格: Blogs { BlogName } BlogPosts { BlogName, PostTitle } 博客文章同时建模一个实体和一个关系,根据 6nf(根据第三个宣言)这是无效的。
如果 A 类与 B、C 和 D 类中的每一个都有唯一的交互,那么交互的代码应该在 A 中还是在 B、C 和 D 中? 我正在编写一个小游戏,其中许多对象可以与其他对象进行独特的交互。例如,EMP点击
关于如何记住我与 Omniauth 一起工作似乎有些困惑。 根据这个wiki ,您需要在 OmniauthCallbacksController 中包含以下内容: remember_me(user)
设计问题: 使用 非线程安全 组件(集合,API,...)在/带有 多线程成分 ... 例子 : 组件 1 :多线程套接字服务器谁向消息处理程序发送消息... 组件 2 :非线程安全 消息处理程序 谁
我们目前正在设计一个 RESTful 应用程序。我们决定使用 XML 作为我们的基本表示。 我有以下关于在 XML 中设计/建模应用程序数据的问题。 在 XML 中进行数据建模的方法有哪些?从头开始然
我正在设计一个新的 XSD 来从业务合作伙伴那里获取积分信息。对于每笔交易,合作伙伴必须提供至少一种积分类型的积分值。我有以下几点:
设计支持多个版本的 API 的最佳方法是什么。我如何确保即使我的数据架构发生更改(微小更改),我的 api 的使用者也不会受到影响?任何引用架构、指南都非常有用。 最佳答案 Mark Nottingh
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
我想用 php 创建一个网站,其工作方式与 https://www.bitcoins.lc/ 相同。确实,就每个页面上具有相同布局但内容会随着您更改链接/页面而改变而言,我如何在 php 中使用lay
我有一个关于编写 Swing UI 的问题。如果我想制作一个带有某些选项的软件,例如在第一个框架上,我有三个按钮(新建、选项、退出)。 现在,如果用户单击新按钮,我想将框架中的整个内容更改为其他内容。
我正在尝试找出并学习将应用程序拥有的一堆Docker容器移至Kubernetes的模式和最佳实践。诸如Pod设计,服务,部署之类的东西。例如,我可以创建一个其中包含单个Web和应用程序容器的Pod,但
我是一名优秀的程序员,十分优秀!