开发新的TEditButton类型需要dclfmxstd包,它不作为dcp存在

时间:2017-02-23 10:41:12

标签: delphi packages firemonkey delphi-10.1-berlin

我正在使用Delphi Berlin Enterprise,我需要扩展TClearEditButton和TDropDownEditButton的一些功能。所以我开发了自己的TMEClearEditButton和TMEDropDownListEditButton。它们是标准FireMonkey的子类,因此我使用了FMX.Edit单元。我通过代码创建按钮进行了一些测试,直到这里都没有问题。

当我决定构建一个仅限设计时的软件包以便可以直接在IDE中添加按钮进行编辑时,就会出现问题。从FMX.Editors复制一些代码,我想出了以下内容:

Unit ME.Editors;

Interface

Uses
  System.Classes,
  DesignIntf,
  FMX.Editor.Items,
  FMX.Design.Items;

Type
  TMEEditEditor = Class(TItemsEditor)
  Public
    Constructor Create(AComponent: TComponent; ADesigner: IDesigner); Override;
  End;

Implementation

Uses
  FMX.Edit,
  ME.Edit;

Constructor TMEEditEditor.Create(AComponent: TComponent; ADesigner: IDesigner);
Begin
  Inherited Create(AComponent, ADesigner);
  FAllowChild := False;
  SetLength(FItemsClasses, 10);
  FItemsClasses[0] := TItemClassDesc.Create(TEditButton);
  FItemsClasses[1] := TItemClassDesc.Create(TMEClearEditButton);
  FItemsClasses[2] := TItemClassDesc.Create(TPasswordEditButton);
  FItemsClasses[3] := TItemClassDesc.Create(TSearchEditButton);
  FItemsClasses[4] := TItemClassDesc.Create(TEllipsesEditButton);
  FItemsClasses[5] := TItemClassDesc.Create(TDropDownEditButton);
  FItemsClasses[6] := TItemClassDesc.Create(TMEDropDownListEditButton);
  FItemsClasses[7] := TItemClassDesc.Create(TMEDropDownDateEditButton);
  FItemsClasses[8] := TItemClassDesc.Create(TMEDropDownTimeEditButton);
  FItemsClasses[9] := TItemClassDesc.Create(TSpinEditButton);
End;

End.

现在编译它需要一些标准的delphi设计时包:

  • DesignIDE
  • fmxdesigner
  • dclcommon

......但这似乎还不够。它现在编译,但警告说下面的单元被隐式导入到我的包中:

  • FMX.Design.Lang
  • FmxDsnConst
  • FMX.Editor.Items
  • FMX.Design.Items

...并建议我将 dclfmxstd 包添加到需求列表中。

如果我这样做,它就不会工作,因为我的计算机上任何地方都没有dclfmxstd.dcp。我的18.0 \ bin目录中有一个dclfmxstd240.bpl包文件库,但在任何地方都没有dcp编译包。

我还尝试在我的开发目录中复制这4个单元并将它们明确地包含在我的包中......但是这不会起作用,因为它声明这些单元已经包含在 dclfmxstd240中包。

关于如何摆脱这种困境并继续前进的任何暗示?

PS - 顺便说一句......将delphi单元映射到包以便知道哪些包必须被引用...而不使用二进制搜索工具会很好在Lib的所有dcps上;)

我已报告此issue on the Embarcadero QP (RSP-17686)

1 个答案:

答案 0 :(得分:1)

我以为我会发布这个作为答案,因为虽然它不能以一种非常令人满意的方式解决你的问题,但我至少得到了一个我可以在IDE中安装的FMX组件。有一个定制设计师。我所做的可能会给你一些关于下一步的想法。

这就是我所做的:

  1. 我创建了一个包含FMX的TEdit,TMyEdit的最小后代的单元。这使用以下FMX单位:FMX.Types,FMX.Controls,FMX.Forms,FMX.Graphics,FMX.Dialogs,FMX.Controls.Presentation和FMX.Edit。 我还创建了一个包含最小组件编辑的单独单元(就像你应该的那样)。本单元仅使用System.Classes,DesignIntf​​,FMX.Editor.Items和FMX.Design.Items。

  2. 我将这两个单元添加到新的.Dpk项目中,并将其Requires子句设置为列出RTL.DCP,FMX.DCP和FMXDesigner.DCP。

  3. 我编译了.Dpk并尝试安装它。我得到了与你建议将DclFMXStd.DCP添加到我的需求列表相同的对话框。然后,当然,它抱怨它无法找到它。

  4. 我在整个h / disk中搜索了DclFMXStd。*,当然除了DclFMXStd230.BPL之外什么都没找到,但没有找到对应的.DCP文件。

  5. 然后我想知道“它从哪里获得名称'DclFMXStd'?我的西雅图安装的Grep搜索(这是我正在使用的,虽然我安装了东京)发现唯一的文件包含名称的是包文件DclFMXStd230.Bpl,其中包含3次出现。我通过在.Bpl上运行Delphi的TDump实用程序来确认这一点。

  6. 然后我想'如果我从IDE中卸载DclFMXStd230.Bpl怎么办?'。我试过,Presto,我的软件包现在编译和安装没有抱怨,当然,IDE现在没有提供的FMX组件。

  7. 所以,如果我在你的位置,我认为这足以提交合法的QP报告。

    如果您想恢复其他FMX组件,我认为您可以考虑将它们添加到您的软件包中,但您可能需要检查是否允许根据您的Delphi许可条款。

    我一直想知道的另一件事是'当然,其他FMX作者必须遇到这个问题,尽管谷歌只发现你的SO帖子?所以可能值得追踪一个带有源代码的优质免费软件FMX库并查看作者如何解决或避免这个问题。

    祝你好运!