Проблемы с Модальными Формами в Delphi: Использование CreateParented и CreateParams
При разработке приложений на Delphi и Pascal часто возникают ситуации, когда необходимо динамически загружать и открывать плагины. В этих случаях может потребоваться открытие модальных форм из динамически загружаемых библиотек. Однако, при использовании метода CreateParented для создания форм могут возникать проблемы, связанные с их модальностью и взаимодействием с элементами управления.
Описание Проблемы
В вашем приложении есть код, который загружает плагин и вызывает функцию VitoRunPlugin для открытия формы. Однако, несмотря на успешное открытие формы, элементы управления на ней становятся неактивными и форма не закрывается обычным способом, требуется использовать комбинацию клавиш Alt+F4.
Пример Кода
Код в основном форме для загрузки плагина выглядит следующим образом:
procedure TfrmMain.PluginClick(Sender: TObject);
var
DllFileName: String;
DllHandle: THandle;
VitoRunPlugin: procedure (AppHandle, FormHandle: HWND);
begin
// ...
if DllHandle <> 0 then
begin
@VitoRunPlugin := GetProcAddress(DllHandle, 'VitoRunPlugin');
VitoRunPlugin(Application.Handle, Self.Handle);
end;
// ...
end;
В плагине определена функция VitoRunPlugin, которая создаёт форму и кнопку:
procedure VitoRunPlugin(AppHandle, FormHandle: HWND);
var
F: TForm; B: TButton;
begin
F := TForm.CreateParented(FormHandle);
// ...
B := TButton.Create(F);
// ...
F.ShowModal;
F.Free;
end;
Анализ Проблемы
Использование метода CreateParented приводит к тому, что форма становится дочерней оконной структурой, и модальное отображение такой формы становится невозможным. Это может вызвать непредсказуемое поведение при попытке отображения формы.
Подтверждённое Решение
Измените создание формы следующим образом, чтобы она не была дочерней оконной структурой:
F := TForm.Create(nil);
Для установления правильного владельца формы переопределите метод CreateParams следующим образом:
procedure TMyForm.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.WndParent := FormHandle;
end;
Затем необходимо создать производный класс TMyForm с соответствующей логикой.
Дополнительные Решения
Для того чтобы кнопка выполняла какое-либо действие, необходимо настроить обработчик события OnClick или установить свойство ModalResult кнопки в значение, отличное от mrNone.
Заключение
При динамическом открытии форм из плагинов важно правильно использовать методы создания форм и настройки их свойств. Это позволит избежать проблем с модальностью и взаимодействием с элементами управления.
Проблема заключается в некорректном использовании метода `CreateParented` при создании модальных форм в Delphi, что приводит к их неправильному поведению и невозможности закрытия через обычные средства.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.