Задача тривиальна - надо при нажатии на SpeedButton создать немодальную форму, и пока SpeedButton не будет отжата эта форма существует, когда кнопку отжали - форму надо уничтожить.
Весь вопрос в том, как это организовать максимально грамотно, чтобы не происходила утечка памяти и не возникло никаких других неприятностей.
Я конечно, написал свой вариант, так что если кому не лень посмотрите - чего здесь не хватает, а что лишнее.
Модуль главной формы
| Код | unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Buttons;
type TForm1 = class(TForm) SpeedButton1: TSpeedButton; procedure SpeedButton1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1;
implementation
uses Unit2;
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); begin Form2:=nil; end;
procedure TForm1.SpeedButton1Click(Sender: TObject); begin // кнопка в нажатом положении if SpeedButton1.Down then begin // если экземпляр формы не создан, создаем if not Assigned(Form2) then begin Form2:=TForm2.Create(Form1); Form2.Show; end else // по каким- то причинам форма уже существует // переводим ее на передний план begin Form2.Enabled:=True; Form2.BringToFront; end; end else // кнопка в отжатом положении begin Form2.Release; Form2.Free; Form2:=nil; end; end;
end.
|
Модуль создаваемой формы
| Код | unit Unit2;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs;
type TForm2 = class(TForm) procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Private declarations } public { Public declarations } end;
var Form2: TForm2;
implementation uses Unit1;
{$R *.dfm}
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction); begin Form1.SpeedButton1.Down:=False; Form2:=nil; end;
end.
|
В методе TForm2.FormClose инструкция Form2:=nil меня смущает, хотя как иначе сделать, не знаю, может в OnDestroy ее переместить, и можно ли без этой иструкции обойтись, почему-то метод Free не сбрасыает переменную в nil. |