Delphi XE2: возможно ли создать экземпляр формы FireMonkey в приложении VCL? - PullRequest
24 голосов
/ 06 сентября 2011

До Delphi XE2 у нас был VCL только для создания приложений с графическим интерфейсом.Delphi XE2 утверждает, что:

Внимание: FireMonkey (FMX) и библиотека визуальных компонентов (VCL) несовместимы и не могут использоваться в одном проекте или приложении.То есть приложение должно быть исключительно одно или другое, либо FireMonkey, либо VCL.Несовместимость вызвана различиями в структуре между FireMonkey (FMX) и VCL.

Мое приложение - это чистое приложение VCL, созданное с помощью пакетов времени выполнения.Все формы VCL хранятся в пакете времени выполнения.Если я собираюсь создать форму FireMonkey и сохранить ее в пакете, могу ли я создать экземпляр этой формы FireMonkey в своем приложении VCL во время выполнения?Так что я могу наслаждаться 3D или HD-эффектами FireMonkey.

Ответы [ 6 ]

25 голосов
/ 06 сентября 2011

Это вполне возможно, так как форма FMX может быть назначена панели.

Подробнее см. в этой статье блога

Просто создайтеновая форма FireMonkey (2D или 3D, не имеет значения) сохраните ее, а затем добавьте в приложение VCL (просто примите предупреждение).Вы можете создать свой экземпляр формы FMX где-нибудь и просто показать его - без проблем.Но что, если вы хотите создать какой-нибудь красивый элемент управления с анимацией или чем-то еще и вставить его в существующую форму VCL?Хорошо, поместите TPanel в форму VCL и добавьте новый блок DSharp.Windows.FMXAdapter.pas после Vcl.ExtCtrls.Затем просто создайте свою форму FMX где-нибудь и назначьте ее новому свойству Form вашей панели - и вот, пожалуйста,.

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;
6 голосов
/ 28 декабря 2013

Для более современного подхода попробуйте TFireMonkeyContainer.Это VCL-компонент с открытым исходным кодом, который вы можете поместить в форму VCL, и он может размещать / встраивать в нее форму FireMonkey.

A FMX form embedded in a VCL form using TFireMonkeyContainer

Форма FMX, встроенная вформа VCL с использованием TFireMonkeyContainer

Подробности здесь: вводная статья и продолжение с некоторыми исправлениями и дополнительными функциями .Найдите ссылку на кодовую страницу Google и источник здесь .

. Он работает с XE2 и выше, включая XE4 + (где FMX имел некоторые большие изменения).

Отказ от ответственности: это мой компонент.(Я создал его, чтобы решить эту проблему.) Он лицензирован по MPL, поэтому может свободно использоваться даже в коммерческих приложениях.Надеюсь, это поможет вам и сделает вашу жизнь проще!

3 голосов
/ 06 сентября 2011

Нет ничего страшного в том, чтобы использовать оба вида форм. Но убедитесь, что вы создаете их экземпляры без какого-либо владельца, поскольку типы владельцев не совместимы.

Я только что создал два простых тестовых проекта, 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;

Это сработало, как и ожидалось. Но в противном случае формы должны быть строго независимы друг от друга. Можно обменять только те типы, которые у них общие.

3 голосов
/ 06 сентября 2011

Я сам не пробовал, но мне известен один подтвержденный способ смешивания VCL и FireMonkey в одном приложении с использованием RemObjects Hydra и один неподтвержденный отчет о том, что вы можете иметь формы FireMonkey в приложении VCL на Колдовство Дельфи .

1 голос
/ 30 апреля 2013

Скачать и установить MonkeyMixer . Загрузите ваш проект VCL (или создайте новый), щелкните его правой кнопкой мыши в Project Explorer, и вы увидите либо «Переключиться на FireMonkey». Нажмите на нее, и вы сможете легко добавлять формы FireMonkey в ваш проект VCL. Затем вы можете переключиться обратно в режим VCL (если вы хотите добавить VCL Forms / Frames) таким же образом, за исключением того, что в пункте меню будет указано «Switch to VCL».

Наслаждайтесь!

0 голосов
/ 06 сентября 2011

Все проблемы микса FMX + VCL могут быть решены на уровне WinAPI. Но лично я не рекомендую использовать такой микс в реальных приложениях.

...