Delphi XE2: возможно ли создать экземпляр формы FireMonkey в приложении VCL?

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

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

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


person Chau Chee Yang    schedule 06.09.2011    source источник
comment
Это интересный вопрос, я думаю, это должно быть возможно (я еще не пробовал XE2), хотя я слышал, что он довольно глючный, я предлагаю вам оставаться на месте до XE3 / 4 - если вы не хотите клиент, чтобы иметь плохой опыт.   -  person    schedule 06.09.2011
comment
Я сомневаюсь, что это когда-нибудь станет возможным, и зачем вам это делать? VCL - это растровая графика для Windows с элементами управления с дескрипторами Windows, а FireMonkey - это кроссплатформенная векторная графика с элементами управления без дескрипторов. Рамки приложения для обоих довольно разные. Выберите то или другое.   -  person Misha    schedule 06.09.2011
comment
@Dorin Duminica: Ошибки в новой кроссплатформенной библиотеке FireMonkey (о которой я в основном слышал отчеты об ошибках) были в некоторой степени неизбежны. Насколько я могу судить, компилятор Win32 и VCL как никогда надежны. Конечно, я бы дождался одного или двух пакетов обновлений, прежде чем выпускать приложение FireMonkey для ваших клиентов, но лично я использую это время, чтобы освоить FireMonkey, используя последний и лучший компилятор Win32 и VCL для моих существующих приложений.   -  person LachlanG    schedule 06.09.2011
comment
Я поражен тем, как быстро распространяется модное словечко о HD-маркетинге ...   -  person jpfollenius    schedule 06.09.2011
comment
ISTM, что это решается на единице за единицей. Я не понимаю, почему у вас не может быть обоих видов модулей в одном приложении, то есть того, который определяет форму FMX, другого, который определяет форму VCL. Однако использование их вместе, в одно и то же время, может быть проблемой. Теперь, возможно, возникнут проблемы с проектированием.   -  person Rudy Velthuis    schedule 06.09.2011
comment
Как насчет глобальных классов, таких как TApplication? Я предполагаю, что у FireMonkey есть собственный экземпляр TApplication. Они могут не смешиваться.   -  person Lars Truijens    schedule 06.09.2011
comment
@ Ларс, это тоже мое предположение. Во времена Delphi.NET это было также применимо к приложениям WinForms (которые использовали System.Windows.Forms.Application, а не класс VCL TApplication). Вы должны были выбрать один или другой, потому что базовая платформа приложения, которая подключала формы, была другой.   -  person Misha    schedule 06.09.2011
comment
Попробовать это в XE7 не так уж и много. Конечно, я могу создать и использовать форму FMX в приложении VCL. Очень простой пустой. Но потом, закрывая мою заявку. Я получаю бесконечные нарушения доступа и другие исключения, а также серьезные утечки памяти.   -  person Jerry Dodge    schedule 23.11.2015


Ответы (6)


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

Дополнительные сведения см. В этой статье блога:

Просто создайте новую форму FireMonkey (2D или 3D, не имеет значения), сохраните ее, а затем добавьте в свое приложение VCL (просто примите предупреждение). Вы можете где-нибудь создать свой экземпляр формы FMX и просто показать его - без проблем. Но что, если вы хотите создать хороший элемент управления с анимацией или чем-то еще и встроить его в существующую форму VCL? Хорошо, поместите TPanel в свою форму VCL и включите новый модуль 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;
person Arnaud Bouchez    schedule 06.09.2011
comment
Как указано в этой статье [обзор блога XE2], даже IDE, кажется, встраивает некоторые компоненты FireMonkey в свои формы VCL: Spy ++ говорит, что все это только одно окно класса FMTStyleDesigner. Так что это однозначно ДА. - person Arnaud Bouchez; 07.09.2011
comment
@Arnaud: ссылка не работает - она ​​должна была перейти на itinerantdeveloper.blogspot.com/2011/09/c-builder-xe2.html? - person David; 15.09.2011

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

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

Форма FMX, встроенная в форму VCL с помощью TFireMonkeyContainer

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

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

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

person David    schedule 27.12.2013
comment
Я использовал это в Delphi XE7, и он отлично работал. Теперь, когда я получил последнюю версию Delphi 10 Seattle, она, к сожалению, не работает. Сначала кажется, что работает, потом я что-то нажимаю, и все зависает. - person Jerry Dodge; 13.04.2016
comment
Пока что, похоже, это связано с щелчком по объектам, которые вызывают TChangeTabAction. Щелчок в другом месте пока работает нормально. Будем тестировать еще. - person Jerry Dodge; 13.04.2016
comment
Это именно то, что вызывает это. Эта форма отлично работает, когда помещена в чистое приложение FMX, но внутри этого контейнера запуск этих TChangeTabActions приводит к зависанию всего. - person Jerry Dodge; 13.04.2016
comment
Задан новый вопрос: stackoverflow.com/questions/36585316/ - person Jerry Dodge; 13.04.2016
comment
@JerryDodge Проблема решена. Пожалуйста, попробуйте последнюю версию на github. - person David; 14.04.2016

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

person LachlanG    schedule 06.09.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;

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

person Rudy Velthuis    schedule 06.09.2011

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

Наслаждаться!

person LaKraven    schedule 29.04.2013

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

person Torbins    schedule 06.09.2011