![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Модальное окно без ShowModal? Как? [D6, WinXP]
афвуд © (2004-08-04 12:20:00)В общем проблема выглядит так:
Мне надо Показать окно с прогрессбаром. И чтобы оно имело все свойства модального, НО вызывая его с ShowModal из процедуры моей управление как бы "передаётся" этому окну которое я ShowModal( :) ). Мне этого не надо. Мне надо сделать процесс, чтобы время от времени показывалось изменение прогрессбара, и чтобы окошко с прогрессбаром было модальным, а потом это окошко просто закрыть.
Я думаю средствами ВинАпи это возможно, но к сожалению с ним не дружен я пока.
афвуд (2004-08-04 12:57:00) [1]Да. Забыл. Спасибо большое, KSergey. :))
KSergey (2004-08-04 12:55:00) [2]> [5] Леприкон © (04.08.04 12:47)
> Можно при показе окна с прогрессом установить у остальных
> форм свойство Enabled в false
Уже сделано
См. DisableTaskWindows/EnableTaskWindows ;)
афвуд (2004-08-04 12:55:00) [3]KSergey Твой код помог. Там действительно вся фишка в DisableTaskWindows/EnableTaskWindows.
> Можно при показе окна с прогрессом установить у остальных
> форм свойство Enabled в false, а при закрытии - соотв. в
> true. Если, конечно, я правильно понял ситуёвину. :-)
Очень. Очень некрасивое решение. А если форточек может быть 50, 100 :))) Я ж не знаю какая из них в данный момент у меня открыта :). А перебирать... Ну просто по-программистки некрасиво с моей точки зрения.
Леприкон (2004-08-04 12:47:00) [4]Можно при показе окна с прогрессом установить у остальных форм свойство Enabled в false, а при закрытии - соотв. в true. Если, конечно, я правильно понял ситуёвину. :-)
KSergey (2004-08-04 12:38:00) [5]> [3] begin...end © (04.08.04 12:32)
> Мне почему-то кажется, что ему просто нужно окно StayOnTop
Нет, StayOnTop совсем не то. Пробовали.
Оно дает возможность ткнуть мышью в окно под ним (выступающую часть) - и оно будет по прежнему работать (ну, если еще и App.ProcessMess поналяпаны, а без них тут никак в некотром смысле).
Да и ненавижу я эти StayOnTop окна: они дже выше дельфи висят при отладке, раздражает и мешает.
Вообще основная фишка вт этого кода, как мне показалось при изучении TCustomForm.ShowModal - это DisableTaskWindows/EnableTaskWindows. По сути (как мне кажется) в них борландовцы повторили часть кода из виндов (ведь они сами не пользуют стандартный виндовский механизм модальных окон!)
begin...end (2004-08-04 12:32:00) [6]
> [2] KSergey © (04.08.04 12:28)
Мне почему-то кажется, что ему просто нужно окно StayOnTop :-)
KSergey (2004-08-04 12:28:00) [7]Магическое "ВинАпи" тут совершенно ни при чем.
Модальное окно - оно по определению модально. И апишная ф-ция его отображения так же ждет его закрытия.
Выхода 2:
а) организовать действия в обдельном кодовом потоке (в общем-то самое грамотное)
б) или сделать так: (я уже приводил здесь этот код)
procedure TProgressForm.InitializeProgress(...);
begin
// проверка - индикатор уже инициализирован?
if Visible then Exit; // уже и так индикатор активен - выход
// настраиваем параметры отображения
...
//--- дальнейший код взят из TCustomForm.ShowModal и несколько урезан
CancelDrag;
if GetCapture <> 0 then SendMessage(GetCapture, WM_CANCELMODE, 0, 0);
ReleaseCapture;
Include(FFormState, fsModal);
FActiveWindow := GetActiveWindow;
FSaveCursor := Screen.Cursor;
Screen.Cursor := crDefault;
FWindowList := DisableTaskWindows(0);
Show;
SendMessage(Handle, CM_ACTIVATE, 0, 0);
//-- конец кода из TCustomFirm.ShowModal
Application.ProcessMessages;
end;
procedure TProgressForm.EndProgress(...);
begin
...
//--- дальнейший код взят из TCustomForm.ShowModal и несколько урезан
if GetActiveWindow <> Handle then FActiveWindow := (0);
Hide;
Screen.Cursor := FSaveCursor;
EnableTaskWindows(FWindowList);
if FActiveWindow <> 0 then SetActiveWindow(FActiveWindow);
Exclude(FFormState, fsModal);
//--- конец кода, взятого из TCustomForm.ShowModal
end;
Соответственно и пльзуемся таким индикатором просто:
ProgressForm.InitializeProgress(...);
// какие-то действия
ProgressForm.EndProgress(...);
begin...end (2004-08-04 12:24:00) [8]SetWindowPos ?