Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.02.2010, 19:02   #1
SkAndrew
Форумчанин
 
Регистрация: 05.04.2008
Сообщений: 244
По умолчанию Как закрыть форму индикатора процесса после завершения цикла?

Добрый вечер!

Подскажите почему не работает конструкция?

Создаю две формы, первая главная, вторая для индикатора процесса. Кнопка включает цикл и вызывает форму с индикатором процесса. Когда значение в цикле достигает заданного форма индикатора процесса должна исчезнуть (закрыться). Но приложение зависает. Почему? Где ошибка?

Код:

Форма №1
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

const
  WM_MYBUFFERINGSHOW = WM_USER + 102;

type
  TfrmMain = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    procedure MyBufferShow(var Msg : TMessage); message WM_MYBUFFERINGSHOW;
  public
    { Public declarations }
  end;

var
  frmMain: TfrmMain;

implementation

uses Unit2;

{$R *.dfm}

procedure TfrmMain.Button1Click(Sender: TObject);
      var i : Integer;
begin
  PostMessage(Handle, WM_MYBUFFERINGSHOW, 0, 0);
  i := 0;
  repeat
    Inc(i);
  until i>30;
  if i>30 then  
    Form2.Close;
end;

procedure TfrmMain.MyBufferShow(var Msg : TMessage);
begin
  Form2.ShowModal;
end;

end.
Форма№2
Код:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm2 = class(TForm)
  private
    { Private declarations }
  protected
   { Protected declarations }
    procedure CreateParams(var Params : TCreateParams); override;
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

uses Unit1;

{$R *.dfm}

procedure TForm2.CreateParams(var Params : TCreateParams);
begin
  inherited Createparams(Params); 
  with Params do 
    Style := (Style or WS_POPUP) and not WS_DLGFRAME;
end;

end.
Спасибо
SkAndrew вне форума Ответить с цитированием
Старый 01.02.2010, 23:50   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Ну, во-первых, совершенно лишняя строка:
Код:
 until i>30;
  if i>30 then  
    Form2.Close;
Во-вторых, после строки
Код:
Form2.ShowModal;
должна следовать строка
Код:
Form2.Free;
Вот тогда у вас все будет нормально закрываться...
mihali4 вне форума Ответить с цитированием
Старый 02.02.2010, 00:10   #3
SkAndrew
Форумчанин
 
Регистрация: 05.04.2008
Сообщений: 244
По умолчанию

К сожалению, подсказки не привели к успеху. Вторая форма после завершения цикла не закрывается! Еще есть какие идеи. Спасибо
SkAndrew вне форума Ответить с цитированием
Старый 02.02.2010, 00:55   #4
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Враки !
Комплект
Код:
Form2.ShowModal;
Form2.Free;
работает всегда и везде...
mihali4 вне форума Ответить с цитированием
Старый 02.02.2010, 01:10   #5
SkAndrew
Форумчанин
 
Регистрация: 05.04.2008
Сообщений: 244
По умолчанию

Я же привет полный код. все заменил и несколько раз проверил на Делфи 2007 не закрывается! Есть еще идеи? Спасибо.
SkAndrew вне форума Ответить с цитированием
Старый 02.02.2010, 08:23   #6
Kotofff
Участник клуба
 
Аватар для Kotofff
 
Регистрация: 11.01.2009
Сообщений: 1,917
По умолчанию

А почему не закрывать форму из нее же ?
Т.е. не с Form1 давать команды, а в самой Form2 выполнять Close когда индикатор достигнет "нужного" значения. Потому как после Form2.ShowModal внимание системы к Form1 вообще пропадает напрочь. И все нужно делать в Form2.
"Заряженному танку в дуло не смотрят" @Dekmer in WoT
Kotofff вне форума Ответить с цитированием
Старый 02.02.2010, 14:50   #7
SkAndrew
Форумчанин
 
Регистрация: 05.04.2008
Сообщений: 244
По умолчанию

Спасибо за идею, но мне нужно чтобы сам процесс из первой формы управлял закрытием модальной формы. Может еще есть какие-нибудь идеи? Спасибо всем!
SkAndrew вне форума Ответить с цитированием
Старый 02.02.2010, 15:01   #8
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Только если показывать вторую форму немодально:
Код:
Form2.Show;
mihali4 вне форума Ответить с цитированием
Старый 02.02.2010, 15:25   #9
SkAndrew
Форумчанин
 
Регистрация: 05.04.2008
Сообщений: 244
По умолчанию

Но мне нужна именно такая конструкция. спасибо.
SkAndrew вне форума Ответить с цитированием
Старый 02.02.2010, 16:49   #10
Andrei
Форумчанин
 
Регистрация: 20.06.2007
Сообщений: 270
По умолчанию

Цитата:
Сообщение от SkAndrew Посмотреть сообщение
Спасибо за идею, но мне нужно чтобы сам процесс из первой формы управлял закрытием модальной формы. Может еще есть какие-нибудь идеи? Спасибо всем!
Нуу... я думаю, можно запустить ваш процесс отдельным потоком, затем вызвать ShowModal, а по окончании процесса, из потока закрыть модальную форму. Как-то так.

PS: Сам я такого не делал. Просто сейчас потихоньку присматриваюсь к потокам и прикидываю что к чему. О потоках я нашел неплохую статью здесь: http://forum.vingrad.ru/forum/s/1afb...pic-60076.html.
-Кукушка, кукушка! Накукуй мне сто лет!
-А накукуй тебе столько?

(с) Библия. Вольный перевод с древнееврейского.
Andrei вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Восстановление видеорежима после завершения программы Marsel737 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 10.12.2009 23:11
Как закрыть форму при показе RIO Общие вопросы Delphi 4 28.08.2009 07:54
Как закрыть MDIChild форму по нажатию на кнопку AndreyF Общие вопросы Delphi 4 11.07.2009 16:26
Использование метода free после завершения потока Denager Общие вопросы Delphi 4 29.08.2008 10:13
Ждать завершения чужого процесса ERASERROR Win Api 2 04.02.2008 08:23