Подтвердить что ты не робот

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.

4b9b3361

Ответ 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. Но лично я не рекомендую вам использовать такой микс в реальном мире.