Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.04.27;
Скачать: CL | DM;

Вниз

Модальная форма параллельно с обычной   Найти похожие ветки 

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

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

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

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

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


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


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

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


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

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


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


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

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


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

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


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


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

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


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

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


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

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


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

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


 
{RASkov} ©   (2008-03-26 09:30) [9]

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

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


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

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

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


 
Kolan ©   (2008-03-26 14:54) [11]

> Смысл в том,

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


 
Amoeba ©   (2008-03-26 15:32) [12]

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


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

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

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

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


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


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

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


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

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


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


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

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


 
Kolan ©   (2008-03-27 10:31) [17]

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

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


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


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


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


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

Стояла аналогичная [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-29 17:53) [20]

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

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

..

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

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



Страницы: 1 вся ветка

Текущий архив: 2008.04.27;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.012 c
2-1207032743
asdf2
2008-04-01 10:52
2008.04.27
Как в InterBase6.5 сделать select Length(MyField) from MyTable?


2-1207227850
XRMiPO
2008-04-03 17:04
2008.04.27
приложение поверх полноэкранных приложений


2-1207227283
Alex_C
2008-04-03 16:54
2008.04.27
Совместное использование TTable


15-1205496245
Jeer
2008-03-14 15:04
2008.04.27
Хронология вычислительных машин


15-1205171023
NaRuTo
2008-03-10 20:43
2008.04.27
www.keygen.ru