Разработка новых типов TEditButton требует пакета dclfmxstd, который не существует как dcp

Я использую 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 Designtime:

  • 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 на пакеты, чтобы знать, на какие пакеты нужно ссылаться... без использования инструмента двоичного поиска по всем многочисленным dcps в Lib;)

Я сообщил об этой проблеме на Embarcadero QP (RSP-17686)

1 ответ

Я решил опубликовать это как ответ, потому что, хотя это не решит вашу проблему очень удовлетворительным образом, я по крайней мере дошел до получения компонента FMX, который я могу установить в IDE и который имеет пользовательский дизайнер. То, что я сделал, может дать вам некоторые идеи о том, где дальше.

Вот что я сделал:

  1. Я создал модуль, содержащий минимальный потомок TEdit FMX, 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/ диск на предмет DclFMXStd.* И, конечно, он не нашел ничего, кроме DclFMXStd230.BPL, но не нашло аналога.DCP-файла.

  5. И тогда я подумал: "Откуда он получает имя" DclFMXStd "? Поиск в Grep моей инсталляции в Сиэтле (именно этим я и пользуюсь, хотя я установил Tokyo) обнаружил, что единственным файлом, содержащим имя, является файл пакета, DclFMXStd230.Bpl, который содержит 3 его экземпляра. Я подтвердил это, запустив утилиту Delphi TDump в.Bpl.

  6. Тогда я подумал: "Что если я удалю DclFMXStd230.Bpl из IDE?". Я попробовал, и Presto, мой пакет теперь компилируется и устанавливается без жалоб, хотя, конечно, в IDE теперь нет поставляемых компонентов FMX.

Поэтому я думаю, что этого было бы достаточно, чтобы подать законный отчет о QP, если бы я был на вашем месте.

Если вы хотите восстановить другие компоненты FMX, я думаю, вы могли бы подумать о добавлении их в ваш пакет, хотя вы можете проверить, разрешено ли это в соответствии с условиями вашей лицензии Delphi.

Еще одна вещь, которая меня интересует: "Конечно, другие авторы FMX, должно быть, столкнулись с этой проблемой, несмотря на то, что Google только находит ваши SO сообщения? Поэтому, возможно, стоит отыскать бесплатную библиотеку FMX с исходным кодом и посмотреть, как авторы решают или избегают проблемы.

Удачи!

Другие вопросы по тегам