При работе с модальными формами в Delphi может возникнуть проблема, когда необходимо закрыть первую модальную форму без закрытия второй. В этой статье мы рассмотрим, как решить эту проблему, используя примеры кода на Object Pascal (Delphi).
Описание проблемы
При использовании двух отдельных модальных форм в приложении VCL Forms в Delphi может возникнуть ситуация, когда первая модальная форма не закрывается, пока не будет закрыта вторая. Это происходит из-за того, что модальные формы блокируют пользовательский интерфейс до тех пор, пока они не будут закрыты.
Решение проблемы
Чтобы разрешить закрытие первой модальной формы без закрытия второй, можно воспользоваться альтернативным подходом, который заключается в отказе от использования модальных форм. Вместо этого можно показать формы без модальности, используя Show вместо ShowModal. Это позволит пользователю работать с обеими формами независимо.
Пример кода, демонстрирующий этот подход:
DFM-файл:
object frm: Tfrm
Left = 0
Top = 0
Caption = 'frm'
ClientHeight = 194
ClientWidth = 283
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object btnShow: TButton
Left = 104
Top = 132
Width = 75
Height = 25
Caption = 'Show'
TabOrder = 0
OnClick = btnShowClick
end
object txt: TEdit
Left = 8
Top = 40
Width = 121
Height = 21
TabOrder = 1
end
end
Единица:
unit Unit1;
interface
uses
System.SysUtils, System.Variants, System.Classes,
Vcl.Controls, Vcl.Forms, Vcl.StdCtrls;
type
Tfrm = class(TForm)
btnShow: TButton;
txt: TEdit;
procedure btnShowClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
protected
procedure CreateParams(var Params: TCreateParams); override;
public
end;
var
frm: Tfrm;
implementation
{$R *.dfm}
procedure Tfrm.CreateParams(var Params: TCreateParams);
var
Lfrm: TForm;
begin
inherited CreateParams(Params);
Lfrm := nil;
if Owner is TControl then
Lfrm := (GetParentForm(Owner as TControl, false) as TForm);
if not Assigned(Lfrm) then
Lfrm := Application.MainForm;
if Assigned(Lfrm) and (Lfrm <> Self) then
// Привязываем дочернее окно к родительскому окну.
Params.WndParent := Lfrm.Handle;
end;
procedure Tfrm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if Self <> Application.MainForm then
// Action caHide -> caFree
Action := caFree;
end;
procedure Tfrm.btnShowClick(Sender: TObject);
var
Lfrm: Tfrm;
begin
Lfrm := Tfrm.Create(Self);
Lfrm.Top := Top + 10;
Lfrm.Left := Left + 10;
// Так как вы хотите работать в родительском окне, дочернее окно не должно отображаться модально!
Lfrm.Show;
end;
end.
Вывод
В этой статье мы рассмотрели проблему закрытия первой модальной формы в Delphi без закрытия второй и предложили альтернативный подход, заключающийся в отказе от использования модальных форм. Используя примеры кода на Object Pascal (Delphi), мы продемонстрировали, как показать формы без модальности, используя Show вместо ShowModal. Это позволяет пользователю работать с обеими формами независимо, разрешая закрытие первой модальной формы без закрытия второй.
В статье рассматривается проблема закрытия первой модальной формы в Delphi без закрытия второй и предлагается альтернативный подход, состоящий в отказе от использования модальных форм, чтобы пользователь мог работать с обеими формами н
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS