Delphi XE2: Возможно ли создать экземпляр формы FireMonkey в приложении VCL?
До Delphi XE2 у нас есть VCL только для создания графических приложений. Delphi XE2 утверждает, что:
Внимание: FireMonkey (FMX) и Visual Component Library (VCL) являются несовместимы и не могут использоваться в одном проекте или выражение. То есть, приложение должно быть исключительно одним или другие - FireMonkey или VCL. Несовместимость обусловлена каркасные различия между FireMonkey (FMX) и VCL.
Мое приложение является чистым VCL-приложением, созданным с использованием пакетов времени исполнения. Все формы VCL хранятся в пакете времени исполнения. Если я собираюсь создать форму FireMonkey и сохранить ее в пакете, могу ли я создать экземпляр этой формы FireMonkey в своем приложении VCL во время выполнения? Поэтому я могу наслаждаться 3D или HD эффектами FireMonkey.
Ответы
Ответ 1
Это вполне возможно, так как форма FMX может быть назначена панели.
Подробнее о этой статье в блоге:
Просто создайте новую форму FireMonkey (2D или 3D, не имеет значения) сохраните ее а затем добавьте его в приложение VCL (просто примите предупреждение). Вы может создать экземпляр формы FMX где-нибудь и просто показать его - нет проблема. Но что, если вы хотите создать хороший контроль с анимации или что-то еще и встроить его в существующую форму VCL? Ну, положите TPanel на свою форму VCL и включите brandnew unit DSharp.Windows.FMXAdapter.pas после Vcl.ExtCtrls. Затем просто создайте вашу форму FMX и назначьте ее новому свойству Form вашего Панель - и стрела, там вы идете.
Фактически, код FMXAdapter.pas очень короткий:
procedure TPanel.Resize;
begin
inherited;
ResizeForm();
end;
procedure TPanel.ResizeForm;
begin
if Assigned(FForm) then
Platform.SetWindowRect(FForm, RectF(BorderWidth, BorderWidth,
ClientWidth + BorderWidth, ClientHeight + BorderWidth));
end;
procedure TPanel.SetForm(const AForm: TCommonCustomForm);
begin
FForm := AForm;
FForm.BorderIcons := [];
FForm.BorderStyle := TFmxFormBorderStyle.bsNone;
ResizeForm();
FForm.Visible := True;
Winapi.Windows.SetParent(FmxHandleToHWND(FForm.Handle), Handle);
end;
Ответ 2
Для более современного подхода попробуйте TFireMonkeyContainer
. Это компонент VCL с открытым исходным кодом, который вы можете разместить в форме VCL, и он может размещать/вставлять в него форму FireMonkey.
![A FMX form embedded in a VCL form using TFireMonkeyContainer]()
Форма FMX, встроенная в форму VCL с использованием TFireMonkeyContainer
Подробности здесь: статья о публикации и followup с некоторыми исправлениями и больше возможностей. Найдите ссылку Страница и источник кода Google здесь.
Он работает с XE2 и выше, включая XE4 + (где FMX имеет некоторые большие изменения.)
Отказ от ответственности: это мой компонент. (Я создал его, чтобы решить это проблема.) Лицензия MPL, которую можно использовать, может быть использована даже в коммерческих приложениях. Надеюсь, это поможет вам и облегчит вашу жизнь!
Ответ 3
Я не пробовал себя, но я знаю один подтвержденный способ смешать VCL и FireMonkey в том же приложении, используя RemObjects Hydra и один неподтвержденный сообщите, что вы можете иметь формы FireMonkey в приложении VCL в Delphi Sorcery.
Ответ 4
На самом деле это неважно, использовать оба вида форм. Но убедитесь, что вы создаете их без какого-либо владельца, так как типы владельцев несовместимы.
Я только что создал два простых тестовых проекта Project46 и Project47. Project46 содержит Unit25 с формой VCL. Проект 47 содержит Unit26 с формой FMX. В Form25 я добавил кнопку с обработчиком OnClick:
procedure TForm25.Button1Click(Sender: TObject);
var
F: Unit26.TForm26;
begin
F := TForm26.Create(nil);
try
F.ShowModal;
finally
F.Free;
end;
end;
Это сработало, как ожидалось. Но формы в противном случае должны быть строго независимыми друг от друга. Только общие типы могут быть заменены.
Ответ 5
Загрузите и установите MonkeyMixer. Загрузите проект VCL (или создайте новый), щелкните его правой кнопкой мыши в Project Explorer, затем вы увидите "Переключиться на FireMonkey". Нажмите это, и вы сможете легко добавлять формы FireMonkey в свой проект VCL. Затем вы можете переключиться обратно в режим VCL (если вы хотите добавить VCL Forms/Frames) таким же образом, за исключением того, что в пункте меню будет указано "Switch to VCL".
Наслаждайтесь!
Ответ 6
Все проблемы смешивания FMX + VCL могут быть разрешены на уровне WinAPI. Но лично я не рекомендую вам использовать такой микс в реальном мире.