![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Модальная форма параллельно с обычной
Андрей Молчанов © (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 модальной. Какой смысл в модальности, если не нужно запрещать доступ ко всем прочим формам приложения?