|
|
|
новичок
      
участник
Last Login: 10.05.2006 7:55
Сообщ.: 6,
Visits: 69
|
|
| Имеются две формы Form1, Form2. На форме 1 расположена кнопка при нажатии на которую происходит вывод на экран формы2. Form2.ShowModal; На форме2 находятся кнопка и ProgressBar. При нажатии на кнопку происходит закрытие формы2 т.е. Form2.Close; {форма закрывается} При выводе формы2 на экран происходит обработка следующего события procedure TForm2.FormActivate(Sender: TObject); var i:integer; begin for i:=1 to 10 do begin ProgressBar1.Position:=i; end; Form2.Close; {форма НЕ ЗАКРЫВАЕТСЯ} end; т.е. форма остается на экране. Почему не происходит закрытие формы? Каким образом можно закрыть форму?
|
|
|
|
|
Supreme Being
      
участник
Last Login: 18.12.2007 11:03
Сообщ.: 121,
Visits: 1 203
|
|
| Просто вроде как нельзя закрывать форму в событии onActivate, onShow и тому подобных. И еще, использовать событие onActivate для запуска какого-то действия нужно осторожно (или лучше придумтать чтонибудь другое), так как оно может срабатывать не однократно. Если его показать модально то, вроде как, событие срабатывает 1 раз. В других случаях при возвращении к твоей форм2 - снова сработает событие onActivate - и все пойдет по новой. Я конечно не претендую на правильное решение, но например можно сделать так: в Unit1 procedure TForm1.Button1Click(Sender: TObject); begin PostMessage(Form2.Handle, c_MY_FORM2_DO_WORK, 0, 0); //так как ShowModal приостанавливает выполнение, сначала говорим форме2 что нужно поработать Form2.ShowModal; //а потом показываем ее end;
Unit2 const c_MY_FORM2_DO_WORK = WM_USER + 1; type TForm2 = class(TForm) Label1: TLabel; private { Private declarations } public { Public declarations } procedure On_MyWORK_Mess(var msg:TMessage); message c_MY_FORM2_DO_WORK; end; var Form2: TForm2; implementation {$R *.dfm} { TForm2 } procedure TForm2.On_MyWORK_Mess(var msg: TMessage); var i: Integer; begin for i:= 0 to 100 do begin label1.Caption:= IntToStr(i); Sleep(100); Application.ProcessMessages; end; Form2.Close; //спокойно закрываем end; end.
|
|
|
|
|
новичок
      
участник
Last Login: 23.06.2006 15:08
Сообщ.: 4,
Visits: 9
|
|
| Эта форма только выводит прогрессбар? Так если бы это работало, то только бы мигнуло все, и закрылось. Смысл? Я бы использовал немодальную форму со свойством "поверх всех окон", и уже из Form1 сделал бы Form2.Show, а затем вызывал бы по мере надобности изменения ее градусника, а потом закрыл бы ее... Если уж так нужна модальная, то для закрытия кинь в нее таймер, выключенный по умолчанию, с интервалом, скажем 100мс, по активации включи таймер, а в его обработчике выключи таймер и закрой форму. Учти, что включенные таймеры работают даже в закрытых формах.
|
|
|
|
|
новичок
      
участник
Last Login: 15.06.2006 15:17
Сообщ.: 3,
Visits: 20
|
|
stanmarket (05.05.2006)
Имеются две формы Form1, Form2. На форме 1 расположена кнопка при нажатии на которую происходит вывод на экран формы2. Form2.ShowModal; На форме2 находятся кнопка и ProgressBar. При нажатии на кнопку происходит закрытие формы2 т.е. Form2.Close; {форма закрывается} При выводе формы2 на экран происходит обработка следующего события procedure TForm2.FormActivate(Sender: TObject); var i:integer; begin for i:=1 to 10 do begin ProgressBar1.Position:=i; end; Form2.Close; {форма НЕ ЗАКРЫВАЕТСЯ} end; т.е. форма остается на экране. Почему не происходит закрытие формы? Каким образом можно закрыть форму? Если форма открыта как модальная, то самый простой путь ее закрыть - это вернуть результат. Т.е. вместо Form2.Close написать: ... Self.ModalResult = mrOk; // или mrCancel ... А дальше пусть менеджер форм сам разбирается ;-) . Писать же Form2.Close на мой взгляд не правильно, потому как в верхней форме может создаваться форма из этого класса, но с другим именем, например Application.CreateForm(TForm2, NewForm) и тогда становится непонятным куда ссылается вызов Form2.Close поскольку нет экземпляра с именем Form2!
|
|
|
|