Как закрыть форму
Релиб
Форумы       Участники    Календарь    Кто он-лайн?
Добро пожаловать, гость ( Вход | Регистрация )
        



Как закрыть форму Expand / Collapse
Автор
Сообщение
05.05.2006 9:51
новичок

новичокновичокновичокновичокновичокновичокновичокновичок

участник
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;

т.е. форма остается на экране. Почему не происходит закрытие формы? Каким образом можно закрыть форму?

Сообщ. #896571
11.05.2006 16:03
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme 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.

Сообщ. #896871
14.06.2006 14:47
новичок

новичокновичокновичокновичокновичокновичокновичокновичок

участник
Last Login: 23.06.2006 15:08
Сообщ.: 4, Visits: 9
Эта форма только выводит прогрессбар? Так если бы это работало, то только бы мигнуло все, и закрылось. Смысл?

Я бы использовал немодальную форму со свойством "поверх всех окон", и уже из Form1 сделал бы Form2.Show, а затем вызывал бы по мере надобности изменения ее градусника, а потом закрыл бы ее...

Если уж так нужна модальная, то для закрытия кинь в нее таймер, выключенный по умолчанию, с интервалом, скажем 100мс, по активации включи таймер, а в его обработчике выключи таймер и закрой форму. Учти, что включенные таймеры работают даже в закрытых формах.

Сообщ. #898720
15.06.2006 9:17
новичок

новичокновичокновичокновичокновичокновичокновичокновичок

участник
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!

Сообщ. #898795
« пред. тема | след. тема »


Эту тему читают Expand / Collapse
Посетители: 0 (0 гостей, 0 участников, 0 скрыт.участников)
Сейчас нет участников, просматривающих тему.
Модераторы: Alexey, boombastik, bazile, pl

Время GMT +3:00, Сейчас 6:10