![]() |
|
|
|
|
#1
|
|||
|
|||
|
Скажите мне, умные люди, ВСЕГДА ли при разрушении формы случается событие OnDestroy для этой формы? У меня оно как-то не случается, если форма разрушается косвенно(при разрушении формы-владельца).
Подробнее это выглядит так: На главной форме есть кнопка, при нажатии на которую создаётся другая форма, собственником которой является главная, т.е. Код:
Form2 := TForm2.Create(self) И вот какая засада - если пользователь закрывает приложение (стандартным крестиком на главной форме), не закрыв перед этим Form2(ведь таких неаккуратных - пруд пруди!), то событие TForm2.FormDestroy не наступает А какое событие второй формы наступает, если закрывается только форма, которая ею владеет? Куда запихнуть сохранение данных? |
|
#2
|
||||
|
||||
|
Ничё не понял.
Если я таки понял тебя, то просто при "косвенном" закрытии вызови событие Form2.Destroy или как там оно называется. И будет тебе счастье. Если неправильно я понял, то поясни ещё раз. |
|
#3
|
|||
|
|||
|
ни разу не вызывала событие принудительно. Ты не покажешь, как это сделать? Нижеприведенный вариант, наверное, совсем того ?
Код:
procedure TMainForm.FormDestroy(Sender: TObject);
begin
Form2.FormDestroy(Sender);
{большие сомнения касательно того, что пихать в качестве параметра обработчика}
end; |
|
#4
|
||||
|
||||
|
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses Unit2;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
with TForm2.Create(Application) do
begin
Show;
end;
end;
end.Код:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm2 = class(TForm)
procedure FormDestroy(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm2.FormDestroy(Sender: TObject);
begin
Windows.Beep(1000, 100);
end;
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caFree;
end;
end. |
|
#5
|
||||
|
||||
|
В качестве параметра пихай тот объект, который должен вызвать событие. В данном случае ты ждешь ОнДестрой от Форм2. Ну вот и пихай вместо Сендер твой Форм2.
|
|
#6
|
|||
|
|||
|
Спасибо, запихнула. Работает!
Попутно вопрос - у меня в последнее время уже при закрытии Delphi часто возникает "Access violation at adress... in dcc70.dll///", причём нервный такой - многократно повторяющийся - множащийся окошками. И его никак, кроме как перезагрузившись, не успокоить. Подозреваю, что это может происходить из-за неправильной организации работы с формами. Может кто сталкивался с такой штукой и даст совет - хотя бы как проверить? У меня в приложении 4 формы с обычным шоу и три - с модальным. Те, которые с модальным, организованы по стандартному(где-то здесь вычитанному) шаблону: Код:
if Form1 = nil then
Form1 := TForm1.Create(nil);
try
Form1.onAddNewExam := OnAddNewExam;//присвоение конкретной процедуры свойству
if Form1.WindowState = wsMinimized then
Form1.WindowState := wsNormal;
if Form1.ShowModal = mrCancel then
exit; { может здесь собака зарыта? - она ж в этом случае остаётся висеть, так? хотя я по этой ветке и не ходила ещё ((, а ошибка лезет }
finally
Form1.Free;
Form1 := nil;
end;Формы, которые с обычным Show, создаются через TFormCreate(self), где self - это вышеупомянутая Form1. В каждой форме есть свойство типа TNotifyEvent, которое вызывается в CloseForm и сообщает форме-собственнику (ну, той самой Form1), что можно вызываемую рушить (а просто использовать Release в самой процедуре закрытия каждой формы вместо всех этих наворотов нельзя? ). Может непонятно объясняю, лучше код выкладывать? Но он такой... длинновастенький ![]() |