Главная страница
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.034 c
14-1091585711
Думкин
2004-08-04 06:15
2004.08.22
С днем рождения! 4 августа


3-1090616137
saNat
2004-07-24 00:55
2004.08.22
Ускорение выполнения SQL - запросов


1-1092106071
Марат
2004-08-10 06:47
2004.08.22
Перенос label


14-1091421475
Kerk
2004-08-02 08:37
2004.08.22
Толковый словарь женского политкорректного языка


1-1092116702
Aldor_
2004-08-10 09:45
2004.08.22
Запускающий мое приложение bat-ник "виснет"