如何从Delphi的开放工具API中检索新的单元名称

7
我已经在Delphi XE中编写了一个向导程序,它运行得很好。然而,我还没有弄清楚如何访问Delphi OTA可以创建的生成默认单元名称(或表单名称或项目名称)。
在我的旧式向导程序中,我能够调用ToolServices.GetNewModuleName来发现可用的单元和表单名称,以便在生成相关源文件时使用。在今天的开放工具API中,相当于什么呢?
根据ToolsAPI单元的注释,我应该从IOTAModuleCreator.GetImplFileName方法返回一个空白以让Delphi生成文件名。我正在从此方法返回一个空字符串,但仍然看不到我可以访问Delphi正在生成的文件名的地方。

我仍然没有弄清楚为什么在某些情况下 Delphi 不会生成默认单元名称,但我相信它与您实现的接口有关。虽然 Marco 的解决方案允许您直接向 Delphi 请求名称,但此时出现的另外两个答案也是正确的,因为 ModuleIdent(和类似的参数)通常包含此信息。这三个答案都应被认为是正确的。我学到更多后会发布跟进。 - Cary Jensen
3个回答

4

获取新表单和单元名称的特定方法如下:

(BorlandIDEServices as IOTAModuleServices).GetNewModuleAndClassName( '', UnitIdent, FormName, FileName);

我在几个示例中使用过它,似乎效果很好。


谢谢,Marco!这种技术肯定有效。我也相信适当使用IOTACreators也可以做到这一点,我正在修改我的向导以创建一个项目,而不仅仅是一个单元模块,看看这是否会影响Delphi自动生成默认名称的时间。根据我的发现,最终可能会将这三个答案都标记为正确。 - Cary Jensen

2

IOTAModuleCreator.NewImplSource方法有一个“ModuleIdent”参数,它是单元名称。


这是我实现的方法,返回一个返回单元源代码的IOTAFile实现。然而,传递给NewImplSource的ModuleIdent参数值为空白。我的假设是,如果从GetImplFileName返回空白,Delphi会生成单元名称并将其传递给NewImplSource。然而,ModuleIdent为空白。 - Cary Jensen

2
在我的测试中,它按照你的期望工作(NewImplSource方法中的ModuleIdent参数接收新单元名称)。请再次检查你的实现,特别是确保:
  • IOTACreator.GetUnnamed返回True
  • IOTACreator.GetExisting返回False
  • IOTACreator.GetCreatorType返回适当的标识符(sUnitsForm等)- 我不确定这点,但这也可能很重要
这里有一个可行的示例。我刚刚检查了它,在Delphi XE中代码似乎仍然按照预期工作。

感谢您的输入。我从GetUnnamed返回True,从GetExisting返回False,从GetCreator返回ToolsAPI.sUnit(因为我正在创建一个单元)。这是我的IOTACreator decl。您是否实现了其他接口?TCompEditorAppModuleCreator = class(TInterfacedObject, IOTACreator, IOTAModuleCreator)。此外,您是否还在其中一个实现中拥有IOTAProjectCreator(和IOTAProjectCreate50)的实现?我的向导没有,因为我只创建了一个单位,而不是一个项目。我想知道这会不会有什么影响。 - Cary Jensen
也许实现 IOTAModuleCreator.GetOwner 很重要?我的实现返回当前活动项目。在最近的 Delphi 版本中,你可以使用 IOTAModuleServices.GetActiveProject 来获取它。 - Ondrej Kelle
我将在我的向导中添加一个IOTAProjectCreator,以创建整个项目,而不仅仅是一个模块,并且我会看看这是否会影响Delphi的默认名称生成。稍后会发布结果。 - Cary Jensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接