![]() |
|
|
#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.
Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. |
#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 в самой процедуре закрытия каждой формы вместо всех этих наворотов нельзя? ). Может непонятно объясняю, лучше код выкладывать? Но он такой... длинновастенький ![]() |