Разработка новых типов 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 и который имеет пользовательский дизайнер. То, что я сделал, может дать вам некоторые идеи о том, где дальше.
Вот что я сделал:
Я создал модуль, содержащий минимальный потомок 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.
Я добавил оба этих модуля в новый проект.Dpk и установил его
Requires
пункт для перечисления RTL.DCP, FMX.DCP и FMXDesigner.DCP.Я скомпилировал.Dpk и попытался установить его. У меня тот же диалог, что и вы, предлагая добавить DclFMXStd.DCP в мой список Требований. И тогда, конечно, он пожаловался, что не может его найти.
Я искал весь мой h/ диск на предмет DclFMXStd.* И, конечно, он не нашел ничего, кроме DclFMXStd230.BPL, но не нашло аналога.DCP-файла.
И тогда я подумал: "Откуда он получает имя" DclFMXStd "? Поиск в Grep моей инсталляции в Сиэтле (именно этим я и пользуюсь, хотя я установил Tokyo) обнаружил, что единственным файлом, содержащим имя, является файл пакета, DclFMXStd230.Bpl, который содержит 3 его экземпляра. Я подтвердил это, запустив утилиту Delphi TDump в.Bpl.
Тогда я подумал: "Что если я удалю DclFMXStd230.Bpl из IDE?". Я попробовал, и Presto, мой пакет теперь компилируется и устанавливается без жалоб, хотя, конечно, в IDE теперь нет поставляемых компонентов FMX.
Поэтому я думаю, что этого было бы достаточно, чтобы подать законный отчет о QP, если бы я был на вашем месте.
Если вы хотите восстановить другие компоненты FMX, я думаю, вы могли бы подумать о добавлении их в ваш пакет, хотя вы можете проверить, разрешено ли это в соответствии с условиями вашей лицензии Delphi.
Еще одна вещь, которая меня интересует: "Конечно, другие авторы FMX, должно быть, столкнулись с этой проблемой, несмотря на то, что Google только находит ваши SO сообщения? Поэтому, возможно, стоит отыскать бесплатную библиотеку FMX с исходным кодом и посмотреть, как авторы решают или избегают проблемы.
Удачи!