Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Модальная форма параллельно с обычной


Андрей Молчанов ©   (2008-03-26 01:16:00) 

Приветствую.

Ситуация следующая.

Есть три формы - frmMain, frmParr, frmModal.

Вначале главная открывает frmParr через Show. Затем она же открывает frmModal через ShowModal. Однако при этом frmParr также блокируется. Как избежать этого?


Андрей Молчанов   (2008-03-29 17:53:00) [1]

Сейчас сделал так - в форме, которую не надо отключать написал:

procedure WMEnable(var Msg: TWMEnable); message WM_ENABLE;

..

procedure TfrmBackup.WMEnable(var Msg: TWMEnable);
begin
 inherited;
 EnableWindow(Handle, True);
end;

Вроде бы работает.


Игорь Шевченко   (2008-03-27 11:02:00) [2]

Стояла аналогичная [18] задача, решена была примерно так:

unit main;

interface

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

type
 TForm1 = class(TForm)
   btnStart: TButton;
   procedure btnStartClick(Sender: TObject);
 end;

var
 Form1: TForm1;

implementation
uses
 ProgressForm;

{$R *.dfm}

procedure TForm1.btnStartClick(Sender: TObject);
var
 I: Integer;
 AProgressBar: TForm2;
begin
 AProgressBar := TForm2.Create(Application);
 AProgressBar.StartProgress(1000);
 try
   AProgressBar.Show;
   for I := 1 to 1000 do
   begin
     AProgressBar.StepProgress(I);
     Sleep(100);
   end;
 finally
   AProgressBar.EndProgress;
 end;
end;

end.


unit ProgressForm;

interface

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

type
 TForm2 = class(TForm)
   Button1: TButton;
   ProgressBar1: TProgressBar;
   procedure Button1Click(Sender: TObject);
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
 private
   FWindowList: Pointer;
 public
   procedure StartProgress (MaxValue: Integer);
   procedure StepProgress (Value: Integer);
   procedure EndProgress;
 end;

implementation

{$R *.dfm}

{ TForm2 }

procedure TForm2.Button1Click(Sender: TObject);
begin
 EnableTaskWindows(FWindowList);
 Close;
end;

procedure TForm2.EndProgress;
begin
 Button1.Enabled := true;
end;

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 Action := caFree;
end;

procedure TForm2.StartProgress(MaxValue: Integer);
begin
 ProgressBar1.Max := maxValue;
 ProgressBar1.Min := 0;
 ProgressBar1.Position := 0;
 FWindowList := DisableTaskWindows(Handle);
 Button1.Enabled := false;
end;

procedure TForm2.StepProgress (Value: Integer);
begin
 ProgressBar1.Position := Value;
 Application.ProcessMessages;
end;

end.


Надеюсь, поможет


Игорь Шевченко   (2008-03-27 10:46:00) [3]


> Смысл в том, что frmParr - форма, показавающая прогресс
> выполнения действий потока. А остальное приложение должно
> продолжать работать при этом в обычном режиме. Например,
>  запрещая доступ к frmMain при вызове frmModal.


Я правильно понимаю, что прогресс отображается себе отдельной формой, действие, чей прогресс надо отображать, происходят в главной форме (допустим), при этом контролы главной формы недоступны для тыкания,
а потом, когда действие завершается, на форме прогресса появляется кнопка "закрыть", и до тех пор, пока ее не нажмешь, дальше никуда ?


Kolan   (2008-03-27 10:31:00) [4]

> Имхо, эта форма настроек — окно другого процесса.

Тоже так подумал. В любом случае там как-то хтро сделано…


Германн   (2008-03-26 20:08:00) [5]


> Андрей Молчанов   (26.03.08 19:32) [15]
>
> В любом случае это не отдельный процесс - по крайней мере,
>  так говорит Process Explorer.
>

Ну тебе виднее. У меня Касперского нет.


Андрей Молчанов   (2008-03-26 19:32:00) [6]

В любом случае это не отдельный процесс - по крайней мере, так говорит Process Explorer.


Германн   (2008-03-26 19:05:00) [7]


> Антивирусе Касперского можно открыть форму настроек

Имхо, эта форма настроек - окно другого процесса.


Андрей Молчанов   (2008-03-26 18:20:00) [8]

>> Германн
Несмотря на возраст, пожалуйста, соблюдайте уважение. Поток действительно ни на что не влияет и выполняется отдельно.

Итак, пример того, что я хочу получить - в Антивирусе Касперского можно открыть форму настроек (для меня она была бы frmMain), а в ней какую-нибудь дополнительную форму (frmModal). При этом главное окно антивируса (frmParr) не будет заблокировано модальной формой.

( http://www.doublesafety.com/personal/sample.jpg)


Amoeba   (2008-03-26 15:32:00) [9]

Может такое нужно?
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1169


Kolan   (2008-03-26 14:54:00) [10]

> Смысл в том,

Так а третья зачем?


Семеныч   (2008-03-26 13:00:00) [11]

> Андрей Молчанов   (26.03.08 01:16)  

Желаемого можно добиться, если сделать frmParr не формой VCL, а чистым окном Windows и запускать ее в отдельном потоке.


{RASkov}   (2008-03-26 09:30:00) [12]

> [0] Андрей Молчанов   (26.03.08 01:16)

Модальная форма - она для того и модальная, что бы только с одной с ней работать....
Если желаешь другого, то не показывай модально форму....


Германн   (2008-03-26 03:01:00) [13]

Да. Ещё и ник автора сабжа очень подходит!


Германн   (2008-03-26 02:57:00) [14]

Какой простор для телепатов!


Андрей Молчанов   (2008-03-26 02:39:00) [15]

Поток ни на что не влияет.


Германн   (2008-03-26 02:21:00) [16]


> ндрей Молчанов   (26.03.08 02:03) [4]
>
> Смысл в том, что frmParr - форма, показавающая прогресс
> выполнения действий потока.

А тут ещё и допоток?


Андрей Молчанов   (2008-03-26 02:03:00) [17]

Смысл в том, что frmParr - форма, показавающая прогресс выполнения действий потока. А остальное приложение должно продолжать работать при этом в обычном режиме. Например, запрещая доступ к frmMain при вызове frmModal.


Германн   (2008-03-26 01:47:00) [18]


> Андрей Молчанов   (26.03.08 01:32) [2]
>
> 1. Нужно запрещать доступ ко все, кроме одной.
> 2. Нужно приостанавливать выполнение.
>

1.Так может стоит именно эту одну сделать модальной?
2. Выполнение чего "нужно приостанавливать"?
Может стоит в вопросе озвучить саму задачу?


Андрей Молчанов   (2008-03-26 01:32:00) [19]

1. Нужно запрещать доступ ко все, кроме одной.
2. Нужно приостанавливать выполнение.


Германн   (2008-03-26 01:24:00) [20]


> Модальная форма параллельно с обычной
>
> Андрей Молчанов   (26.03.08 01:16)
>
> Приветствую.
>
> Ситуация следующая.
>
> Есть три формы - frmMain, frmParr, frmModal.
>
> Вначале главная открывает frmParr через Show. Затем она
> же открывает frmModal через ShowModal. Однако при этом frmParr
> также блокируется. Как избежать этого?
>

Не делать  frmModal модальной. Какой смысл в модальности, если не нужно запрещать доступ ко всем прочим формам приложения?


Наверх

Титульная страница Поиск, карта сайта Написать письмо