﻿<?xml version='1.0' encoding='UTF-8'?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>Релиб / Программирование / Delphi  / Как закрыть форму / Latest Posts</title><generator>InstantForum.NET v4.1.4</generator><description>Релиб</description><link>http://relib.com/forums/</link><webMaster>robot@relib.com</webMaster><lastBuildDate>Sun, 23 Nov 2008 00:59:22 GMT</lastBuildDate><ttl>20</ttl><item><title>RE: Как закрыть форму</title><link>http://relib.com/forums/Topic896571-8-1.aspx</link><description>[quote][b]stanmarket (05.05.2006)[/b][hr]Имеются две формы Form1, Form2. На форме 1 расположена кнопка при нажатии на которую происходит вывод на экран формы2. Form2.ShowModal;&lt;P&gt;На форме2 находятся кнопка и ProgressBar. При нажатии на кнопку происходит закрытие формы2 т.е. &lt;/P&gt;&lt;P&gt;Form2.Close; {форма закрывается}&lt;/P&gt;&lt;P&gt;При выводе формы2 на экран происходит обработка следующего события&lt;/P&gt;&lt;P&gt;procedure TForm2.FormActivate(Sender: TObject);&lt;/P&gt;&lt;P&gt;var i:integer;&lt;BR&gt;begin&lt;BR&gt;   for i:=1 to 10 do&lt;BR&gt;      begin&lt;BR&gt;         ProgressBar1.Position:=i;&lt;BR&gt;      end;&lt;/P&gt;&lt;P&gt;   Form2.Close; {форма НЕ ЗАКРЫВАЕТСЯ}&lt;BR&gt;end;&lt;/P&gt;&lt;P&gt;т.е. форма остается на экране. Почему не происходит закрытие формы? Каким образом можно закрыть форму?[/quote]&lt;P&gt;Если форма открыта как модальная, то самый простой путь ее закрыть - это вернуть результат. &lt;P&gt;Т.е. вместо Form2.Close написать:&lt;/P&gt;&lt;P&gt;...&lt;/P&gt;&lt;P&gt;    Self.ModalResult = mrOk;   // или mrCancel&lt;/P&gt;&lt;P&gt;...&lt;/P&gt;&lt;P&gt;А дальше пусть менеджер форм сам разбирается ;-) .&lt;/P&gt;&lt;P&gt;Писать же Form2.Close на мой взгляд не правильно, потому как в верхней форме может создаваться форма из этого класса, но с другим именем, например&lt;/P&gt;&lt;P&gt;Application.CreateForm(TForm2, NewForm)&lt;/P&gt;&lt;P&gt;и тогда становится непонятным куда ссылается вызов Form2.Close поскольку нет экземпляра с именем Form2!</description><pubDate>Thu, 15 Jun 2006 09:17:58 GMT</pubDate><dc:creator>igova</dc:creator></item><item><title>RE: Как закрыть форму</title><link>http://relib.com/forums/Topic896571-8-1.aspx</link><description>Эта форма только выводит прогрессбар? Так если бы это работало, то только бы мигнуло все, и закрылось. Смысл? &lt;/P&gt;&lt;P&gt;Я бы использовал немодальную форму со свойством "поверх всех окон", и уже из Form1 сделал бы Form2.Show, а затем вызывал бы по мере надобности изменения ее градусника, а потом закрыл бы ее...&lt;/P&gt;&lt;P&gt;Если уж так нужна модальная, то для закрытия кинь в нее таймер, выключенный по умолчанию, с интервалом, скажем 100мс, по активации включи таймер, а в его обработчике выключи таймер и закрой форму. Учти, что включенные таймеры работают даже в закрытых формах.</description><pubDate>Wed, 14 Jun 2006 14:47:32 GMT</pubDate><dc:creator>Gizmah</dc:creator></item><item><title>RE: Как закрыть форму</title><link>http://relib.com/forums/Topic896571-8-1.aspx</link><description>Просто вроде как нельзя закрывать форму в событии onActivate, onShow и тому подобных.&lt;/P&gt;&lt;P&gt;И еще, использовать событие onActivate для запуска какого-то действия нужно осторожно (или лучше придумтать чтонибудь другое), так как оно может срабатывать не однократно. Если его показать модально то, вроде как, событие срабатывает 1 раз. В других случаях при возвращении к твоей форм2 - снова сработает событие onActivate -  и все пойдет по новой.&lt;/P&gt;&lt;P&gt;Я конечно не претендую на правильное решение, но например можно сделать так:&lt;/P&gt;&lt;P&gt;в Unit1&lt;/P&gt;&lt;P&gt;[code]&lt;/P&gt;&lt;P&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;BR&gt;begin&lt;BR&gt;  PostMessage(Form2.Handle, c_MY_FORM2_DO_WORK, 0, 0);  //так как ShowModal приостанавливает выполнение, сначала говорим форме2 что нужно поработать&lt;BR&gt;  Form2.ShowModal;  //а потом показываем ее&lt;BR&gt;end;&lt;/P&gt;&lt;P&gt;[/code]&lt;/P&gt;&lt;P&gt;Unit2&lt;/P&gt;&lt;P&gt;[code]&lt;/P&gt;&lt;P&gt;const&lt;BR&gt;  c_MY_FORM2_DO_WORK = WM_USER + 1;&lt;/P&gt;&lt;P&gt;type&lt;BR&gt;  TForm2 = class(TForm)&lt;BR&gt;    Label1: TLabel;&lt;BR&gt;  private&lt;BR&gt;    { Private declarations }&lt;BR&gt;  public&lt;BR&gt;    { Public declarations }&lt;BR&gt;    procedure On_MyWORK_Mess(var msg:TMessage); message c_MY_FORM2_DO_WORK;&lt;BR&gt;  end;&lt;/P&gt;&lt;P&gt;var&lt;BR&gt;  Form2: TForm2;&lt;/P&gt;&lt;P&gt;implementation&lt;/P&gt;&lt;P&gt;{$R *.dfm}&lt;/P&gt;&lt;P&gt;{ TForm2 }&lt;/P&gt;&lt;P&gt;procedure TForm2.On_MyWORK_Mess(var msg: TMessage);&lt;BR&gt;var&lt;BR&gt;  i: Integer;&lt;BR&gt;begin&lt;BR&gt;  for i:= 0 to 100 do&lt;BR&gt;  begin&lt;BR&gt;    label1.Caption:= IntToStr(i);&lt;BR&gt;    Sleep(100);&lt;BR&gt;    Application.ProcessMessages;&lt;BR&gt;  end;&lt;/P&gt;&lt;P&gt;  Form2.Close;  //спокойно закрываем&lt;BR&gt;end;&lt;/P&gt;&lt;P&gt;end.&lt;/P&gt;&lt;P&gt;[/code]</description><pubDate>Thu, 11 May 2006 16:03:34 GMT</pubDate><dc:creator>ambarka2</dc:creator></item><item><title>Как закрыть форму</title><link>http://relib.com/forums/Topic896571-8-1.aspx</link><description>Имеются две формы Form1, Form2. На форме 1 расположена кнопка при нажатии на которую происходит вывод на экран формы2. Form2.ShowModal;&lt;/P&gt;&lt;P&gt;На форме2 находятся кнопка и ProgressBar. При нажатии на кнопку происходит закрытие формы2 т.е. &lt;/P&gt;&lt;P&gt;Form2.Close; {форма закрывается}&lt;/P&gt;&lt;P&gt;При выводе формы2 на экран происходит обработка следующего события&lt;/P&gt;&lt;P&gt;procedure TForm2.FormActivate(Sender: TObject);&lt;/P&gt;&lt;P&gt;var i:integer;&lt;BR&gt;begin&lt;BR&gt;   for i:=1 to 10 do&lt;BR&gt;      begin&lt;BR&gt;         ProgressBar1.Position:=i;&lt;BR&gt;      end;&lt;/P&gt;&lt;P&gt;   Form2.Close; {форма НЕ ЗАКРЫВАЕТСЯ}&lt;BR&gt;end;&lt;/P&gt;&lt;P&gt;т.е. форма остается на экране. Почему не происходит закрытие формы? Каким образом можно закрыть форму?</description><pubDate>Fri, 05 May 2006 09:51:29 GMT</pubDate><dc:creator>stanmarket</dc:creator></item></channel></rss>