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

Вниз

Модальное окно без ShowModal? Как?   Найти похожие ветки 

 
афвуд   (2004-08-04 12:20) [0]

В общем проблема выглядит так:
Мне надо Показать окно с прогрессбаром. И чтобы оно имело все свойства модального, НО вызывая его с ShowModal из процедуры моей управление как бы "передаётся" этому окну которое я ShowModal( :) ). Мне этого не надо. Мне надо сделать процесс, чтобы время от времени показывалось изменение прогрессбара, и чтобы окошко с прогрессбаром было модальным, а потом это окошко просто закрыть.

Я думаю средствами ВинАпи это возможно, но к сожалению с ним не дружен я пока.


 
begin...end ©   (2004-08-04 12:24) [1]

SetWindowPos ?


 
KSergey ©   (2004-08-04 12:28) [2]

Магическое "ВинАпи" тут совершенно ни при чем.
Модальное окно - оно по определению модально. И апишная ф-ция его отображения так же ждет его закрытия.

Выхода 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:32) [3]


> [2] KSergey ©   (04.08.04 12:28)

Мне почему-то кажется, что ему просто нужно окно StayOnTop :-)


 
KSergey ©   (2004-08-04 12:38) [4]

> [3] begin...end ©   (04.08.04 12:32)
> Мне почему-то кажется, что ему просто нужно окно StayOnTop

Нет, StayOnTop совсем не то. Пробовали.
Оно дает возможность ткнуть мышью в окно под ним (выступающую часть) - и оно будет по прежнему работать (ну, если еще и App.ProcessMess поналяпаны, а без них тут никак в некотром смысле).
Да и ненавижу я эти StayOnTop окна: они дже выше дельфи висят при отладке, раздражает и мешает.

Вообще основная фишка вт этого кода, как мне показалось при изучении TCustomForm.ShowModal - это DisableTaskWindows/EnableTaskWindows. По сути (как мне кажется) в них борландовцы повторили часть кода из виндов (ведь они сами не пользуют стандартный виндовский механизм модальных окон!)


 
Леприкон ©   (2004-08-04 12:47) [5]

Можно при показе окна с прогрессом установить у остальных форм свойство Enabled в false, а при закрытии - соотв. в true. Если, конечно, я правильно понял ситуёвину. :-)


 
KSergey ©   (2004-08-04 12:55) [6]

> [5] Леприкон ©   (04.08.04 12:47)
> Можно при показе окна с прогрессом установить у остальных
> форм свойство Enabled в false

Уже сделано
См. DisableTaskWindows/EnableTaskWindows ;)


 
афвуд   (2004-08-04 12:55) [7]

KSergey Твой код помог. Там действительно вся фишка в DisableTaskWindows/EnableTaskWindows.


> Можно при показе окна с прогрессом установить у остальных
> форм свойство Enabled в false, а при закрытии - соотв. в
> true. Если, конечно, я правильно понял ситуёвину. :-)


Очень. Очень некрасивое решение. А если форточек может быть 50, 100 :))) Я ж не знаю какая из них в данный момент у меня открыта :). А перебирать... Ну просто по-программистки некрасиво с моей точки зрения.


 
афвуд   (2004-08-04 12:57) [8]

Да. Забыл. Спасибо большое, KSergey.  :))



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

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

Наверх




Память: 0.49 MB
Время: 0.025 c
14-1091279569
vidiv
2004-07-31 17:12
2004.08.22
Вопрос про прозрачность (PNG) в php


9-1083936428
WHS
2004-05-07 17:27
2004.08.22
DelphiX or Opengl


3-1091013617
shulgin_dmitrii
2004-07-28 15:20
2004.08.22
FireBird+BLOB+Dynamic Array - не работает ...


3-1091013683
Klerk
2004-07-28 15:21
2004.08.22
Доступ к FireBird


14-1091684804
REA
2004-08-05 09:46
2004.08.22
Нашествие