Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> Длительный процесс в новой форме, как ее открыть, показать и закрыть 
V
    Опции темы
MacTep
Дата 9.2.2007, 13:19 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1292
Регистрация: 4.8.2003
Где: г. Самара

Репутация: 4
Всего: 4



Привет всем. Ситуация такая. У меня есть длительный процесс. Хотелось бы его визуализировать, то есть показать пользователю, насколько он уже выполнен. В одном окне с этим проблем нет, но хотелось бы сделать красиво. То есть нажимается кнопка, открывается вторая форма, в ней происходит выполнение процесса, а после завершения данного процесса форма сама закрывается, отдав управление главной форме.

Вот мой код.

В первой форме:
Код

procedure TForm1.Button1Click(Sender: TObject);
begin
  form2.Showmodal;
end;


Во второй форме:
Код

procedure TForm2.FormShow(Sender: TObject);
var i:integer;
begin
  pb.Position:=0;
  for i:=0 to 100 do
    begin
      Application.ProcessMessages;
      pb.Position:=pb.Position+1;
      sleep(5);
    end;
  Form2.Close;
end;


Программа моя не работает так, как надо мне. Во-первых, не вижу самого состояния процесса - форма вторая открывается только после завершения его. Во-вторых, форма вторая не закрывается почему-то... Что неправильно? И как изменить, чтобы было правильно? Спасибо заранее.


--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
Rennigth
Дата 9.2.2007, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 49
Всего: 76



Потому что ShowModal, сделай AlwaysOnTop а контролы главной формы дизейбли.


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Yanis
Дата 9.2.2007, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



Код
procedure TForm1.Button1Click(Sender: TObject);
begin
  form2.Show;
  form2.Start;
end;

procedure TForm2.Start;
var i:integer;
begin
  pb.Position:=0;
  for i:=0 to 100 do
    begin
      Application.ProcessMessages;
      pb.Position:=pb.Position+1;
      sleep(5);
    end;
  Form2.Close;
end;

мона так. А вообще это логика.... Кидировать-то тут нечего особо.


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
RomanEEP
Дата 9.2.2007, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 424
Регистрация: 18.5.2006
Где: Коломна

Репутация: 5
Всего: 8



Нужно выполнять твою процедуру не OnShow() а он OnActivate()
PM MAIL   Вверх
MacTep
Дата 9.2.2007, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1292
Регистрация: 4.8.2003
Где: г. Самара

Репутация: 4
Всего: 4



Yanis, ваш вариант очень мне подходит. Но нельзя ли при этом сделать так, чтобы все формы, которые были открыты до этой второй формы стали неактивны, то есть на них нельзя было бы переключиться... А то у вас Show. И переключиться можно... Что совсем не желательно...


--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
Rennigth
Дата 9.2.2007, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 49
Всего: 76



Цитата(MacTep @  9.2.2007,  13:48 Найти цитируемый пост)
Но нельзя ли при этом сделать так, чтобы все формы, которые были открыты до этой второй формы стали неактивны, то есть на них нельзя было бы переключиться... А то у вас Show. И переключиться можно... Что совсем не желательно... 

или
Цитата(Rennigth @  9.2.2007,  13:31 Найти цитируемый пост)
а контролы главной формы дизейбли. 

или лови активирование и получение фокуса на других формах и активируй свою 




--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
MacTep
Дата 9.2.2007, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1292
Регистрация: 4.8.2003
Где: г. Самара

Репутация: 4
Всего: 4



Попутный вопрос: как ловить активирование и получение фокуса???


--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
Rennigth
Дата 9.2.2007, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 49
Всего: 76



Цитата(MacTep @  9.2.2007,  13:58 Найти цитируемый пост)
Попутный вопрос: как ловить активирование и получение фокуса??? 

WM_ACTIVATE +  WM_SETFOCUS



--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
MacTep
Дата 9.2.2007, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1292
Регистрация: 4.8.2003
Где: г. Самара

Репутация: 4
Всего: 4



Спасибо, подумаю. smile


--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
MacTep
Дата 9.2.2007, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1292
Регистрация: 4.8.2003
Где: г. Самара

Репутация: 4
Всего: 4



Form1
Код

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    procedure OnAct(var Msg:TMessage); message WM_ACTIVATE;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  bl:boolean;
  
implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.OnAct(var Msg:TMessage);
begin
  if bl then
    SetForegroundWindow(Form2.Handle);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  form2.Show;
  bl:=true;
  form2.start;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  bl:=false;
end;

end.


Form2
Код

unit Unit2;

interface

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

type
  TForm2 = class(TForm)
    pb: TProgressBar;
    procedure Start;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

uses Unit1;

{$R *.dfm}

procedure TForm2.Start;
var i:integer;
begin
  pb.Position:=0;
  for i:=0 to 100 do
    begin
      Application.ProcessMessages;
      pb.Position:=pb.Position+1;
      sleep(25);
    end;
  bl:=false;
  Form2.Close;
end;

end.


Вроде как все работает с таким раскладом, и активность отдается второй форме. Но.... Если схватить первую за заголовок, то можно таскать. Надо сделать, чтобы был такой же эффект, как будто форма вторая модальная. Это возможно?


--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
aktuba
Дата 9.2.2007, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 16
Всего: 38



Делай все во второй форме (весь длительный процесс) и открывай ее ShowModal. ВОт и все...



--------------------
user posted image
PM MAIL WWW Skype   Вверх
MacTep
Дата 9.2.2007, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1292
Регистрация: 4.8.2003
Где: г. Самара

Репутация: 4
Всего: 4



aktuba, так у меня первый пример так и был сделан. Ты читал вообще? Не работает так... Или я туплю? Если да, то объясни, где я не прав?


--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
aktuba
Дата 9.2.2007, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 16
Всего: 38



Цитата

aktuba, так у меня первый пример так и был сделан. Ты читал вообще? Не работает так... Или я туплю? Если да, то объясни, где я не прав?


В твоем пример весь основной процесс происходит в первой форме, а я предложил перенести его во вторую. Это раз.
Не работает у тебя по той причине, что сначала запускается сам длительный процесс, а уже потом ты пытаешься его визуализировать. Тебе надо примерно та:

Код

procedure TForm1.Button1Click(Sender: TObject);
begin
  form2.Showmodal;
end;


Код

procedure TForm2.DoProcess;
var Idx, i:integer;
begin
  pb.Position:=0;
  i := 0;
  for Idx := 0 to MaxInt - 1 do// Здесь начало самого процесса
    begin
      Application.ProcessMessages;
      Inc(i);
      if i > 1000 then i := 0;
      pb.Position:=i div 10;
      // Здесь выполнение шага процесса
    end; // Здесь окончание процесс
  Form2.ModalResult := mrOk;
end;

procedure TForm2.FormShow(Sender: TObject);
begin
  DoProcess;
end;


Примерно так. Писал на коленке, но должно работать. Хотя сам я обычно делаю немного по-другому. Я визуализацию вывожу в отдельный процесс, в котором при изменении шага посылаю сообщение главной форме, на которой лежит ProgressBar...

P.S.: Прежде чем отвечать на вопрос - я всегда стараюсь прочесть не только сам вопрос, но и все ответы, которые на него даны! ПОэтому не стоит так набрасываться. Ты сам не прочел мой ответ, в котором четко написано "Делай все во второй форме (весь длительный процесс)"!!!

Это сообщение отредактировал(а) aktuba - 9.2.2007, 19:18


--------------------
user posted image
PM MAIL WWW Skype   Вверх
MacTep
Дата 9.2.2007, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1292
Регистрация: 4.8.2003
Где: г. Самара

Репутация: 4
Всего: 4



Код

procedure TForm2.DoProcess;
procedure TForm2.FormShow(Sender: TObject);
var Idx, i:integer;
begin
  pb.Position:=0;
  i := 0;
  for Idx := 0 to MaxInt - 1 do// Здесь начало самого процесса
    begin
      Application.ProcessMessages;
      Inc(i);
      if i > 1000 then i := 0;
      pb.Position:=i div 10;
      // Здесь выполнение шага процесса
    end; // Здесь окончание процесс
  Form2.ModalResult := mrOk;
end;
procedure TForm2.FormShow(Sender: TObject);
begin
  DoProcess;
end;

Извини, но ничего не понял. Почему FormShow для второй формы описан два раза?


--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
aktuba
Дата 9.2.2007, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 16
Всего: 38



Цитата

Извини, но ничего не понял. Почему FormShow для второй формы описан два раза? 


Просто ошибся =). Уже поправил...


--------------------
user posted image
PM MAIL WWW Skype   Вверх
Закрытая темаСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0822 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.