Вопрос
Исходные данные:
Есть главная форма, которая вызывает доченюю, скажем Form2.Show;
В дочерней форме на событии OnShow висит обработчик, который в процессе каких-то вычислений может выяснить, что показ формы не имеет смысла.
Вопрос, значит такой: Как прекратить загрузку дочернего окна из него же?
Просто Form2.Close; не работает.
Предвижу ответ: «Сначала проверяй, потом вызывай Show»
Обработчик занимает более 2000 строк и выяснится, что грузиться не надо может в любом месте обработчика, а переносить код из дочерней формы в главную — таких дочерних форм 43 штуки, на 2000 умножить? :) Как быть?
Ответ
А как ты создаешь дочерние окна???
Дочерние окна лучше создавать динамически во время работы программы, напримкр так:
В модуле для дочернего окна:
type TFrmChild = class(TForm) procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Private declarations } public { Public declarations } end; procedure ActivateFrmChild; var FrmChild: TFrmChild; implementation {$R *.dfm} … procedure ActivateFrmChild; begin FrmChild := TFrmChild.Create(Application); end; … procedure TFrmChild.FormClose(Sender: TObject; var Action: TCloseAction); begin Action:=caFree; // Это уничтожит дочернее окно end; end.
В главной форме где надо вызываешь ActivateFrmChild. Т.е. там, где твой огромный обработчик это разрешит. Также необходимо убрать дочерние окна из списка автосоздаваемых форм. Это значительно экономит ресурсы…
Из конференции Expert_FAQ
Copyright 2000-2004 Сообщество Чайников
Контактная информация