Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.08.22;
Скачать: [xml.tar.bz2];

Вниз

Модальное окно без 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.037 c
1-1091481675
QuestionX
2004-08-03 01:21
2004.08.22
Рисование на форме поверх всех компонентов


14-1091273567
ruslan
2004-07-31 15:32
2004.08.22
dll i res


14-1091463976
Мазут Береговой
2004-08-02 20:26
2004.08.22
Вот такая музыка у меня вышла.


14-1091619964
Гость
2004-08-04 15:46
2004.08.22
Загрузка XML на SQL Server с помощью Delphi 7


1-1091770949
Loki3D
2004-08-06 09:42
2004.08.22
перенос данных из Grid в MSWord документ





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский