![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Курсор и блокировка формы
Кодер © (2008-04-02 19:58:00)Приветствую всех, столкнулся с небольшой проблемой. После нажатия пользователем кнопки на форме запускается долговременный процесс (скажем секунд на 10), в это время курсор должен измениться на crHourGlass, а форма заблокироваться, после завершения выполнения долговременного процесса, должны произойти обратные действия. Использую следующий код:
try
Screen.Cursor := crHourGlass;
EnableWindow(Handle, FALSE);
...
finally
EnableWindow(Handle, TRUE);
Screen.Cursor := crDefault;
end;
Проблема в том, что как только я вызываю EnableWindow(Handle, FALSE), то курсор сразу же "сбрасывается" на дефолтный. Не подскажете как побороть проблему? Спасибо.
sniknik (2008-04-03 21:34:00) [1]> немного напрягает такой стиль общения
аналогично. только меня "напрягает" когда спрашивают одно, а решением считают совсем другое. совсем не связанное с "проблемой".
не у всех здесь хорошие телепаторы.
(в вопросе совершенно четко прописано, что должно происходить
> ... курсор должен измениться на crHourGlass, а форма заблокироваться, ...
, и в чем заключается проблема.
> курсор сразу же "сбрасывается" на дефолтный
что и подкупило... думал хоть ктото адекватный. но видимо не судьба.)
> подобный форум и существует для того
и это еще одно, что тоже немного "напрягает".
все спрашивающие почемуто точно знают для чего существует форум, и как другим для них нужно отвечать.
а вот сами использовать эти знания "как нужно", для других, почемуто не спешат.
> Еще раз спасибо за обращение своего внимания на мою проблему.
да не за что. буквально. проблема так и не была решена.
Кодер (2008-04-03 20:20:00) [2]to sniknik: при блокировке кнопок, меню и т.д. все работает как и требуется, плюс сохраняется подвижность формы, ее перерисовка, т.е. приложение не кажется в этот момент умершим.
> как многозначительно... и глупо.
А вообще, если честно, немного напрягает такой стиль общения, может я и выразился неверно или вопрос не самый интересный задал, но подобный форум и существует для того, чтобы на нем задавали вопросы и помогали решать проблемы. Не привык (к сожалению, а может и нет) если честно к такому стилю общения за свои годы.
Еще раз спасибо за обращение своего внимания на мою проблему.
sniknik (2008-04-03 20:02:00) [3]> У меня при работе с сокетами используются потоки...
как многозначительно... и глупо.
потоки сами по себе курсор не меняют, сделай проверку с пустым потоком (тот же слип внутри), и в коде замени слип в проверке на него, + ожидание его завершения, будет тоже ->
> работает как нужно.
> Но вот совет Игоря Шевченко мне более по душе.
более чем что? я тебе советов не давал, я пытался помочь разобраться в чем же собственно причина глюка.
и совет Игоря тебе от проблемы избавиться не поможет, если ты вместо блокирования окна будеш "дизейблить" его содержимое курсор все одно будет меняться пока не найдешь(/уберешь) причину.
хотя, подозреваю, что ты воспринял его совет как вообще, замену установке курсору "часиков". и попросту спрятал глюк. мелкий но всеже.
т.е. ты его не переставляешь и получается не видно как он возвращается. дело твое, более не вмешиваюсь.
Кодер (2008-04-03 18:12:00) [4]to sniknik: да, действительно, при использовании
Sleep(10000); //типа полезный, долговременный процесс (скажем секунд на 10)работает как нужно. У меня при работе с сокетами используются потоки...
Но вот совет Игоря Шевченко мне более по душе.
Всем спасибо за ответы и советы.
sniknik (2008-04-03 10:41:00) [5]> "Неприведенный" кусок кода содержит работу с сокетами, никаких команд работы с курсором не содержит.
это ты так думаешь... а проверь, и замени весь "Неприведенный" (кстати почему в кавычках? ведь он реально не приведен) код на sleep как у меня. ???
и кстати исключи влияние потоков, чегонибудь асинхронного, что имеет потоки внутри (всего параллельно выполняющегося кода в общем) буде оно у тебя там есть. иначе эксперимент не будет чистым. а лучше вообще новый проект для проверки только с этим кодом.
Игорь Шевченко (2008-04-03 10:25:00) [6]Не надо блокировать онко, надо блокировать кнопки, меню, Actions и т.д.
Кодер (2008-04-03 10:23:00) [7]Вот у тут происходит нечто подобное, при блокировке окна именно над блокируемым окном курсор становится снова дефолтным.
tesseract (2008-04-03 10:06:00) [8]
> чтото ее выполняет, чтото, но не приведенный в [0] код.
> чтото в "волшебных пузырьках").
Вроде винда должна его сбрасывать если софт не отвечает, у меня по жизни как 1с-ка уйдёт в шамбалу, так курсор на дефолтный меняеться.
Кодер (2008-04-03 09:41:00) [9]
> курсор рисуется аппаратными средствами, ему зависшее окно
> пофигу, главное чтобы команда на смену прошла. а она прошла
> (и не одна... судя по тому что у него дефаултный курсор
> возвращается, проходит еще и возвратная команда, чтото ее
> выполняет, чтото, но не приведенный в [0] код. чтото в "волшебных
> пузырьках").
"Неприведенный" кусок кода содержит работу с сокетами, никаких команд работы с курсором не содержит. EnableWindow(Handle, FALSE) как и Screen.Cursor:= crHourGlass есстественно нужно вынести перед try ... finally, это мой недогляд - не корректно привел пример. Но согласившись с {RASkov} Screen.Cursor := crDefault внести в finally ... end все-таки нужно. А какие еще есть способы блокировки окна, чтобы сохранить к примеру его перерисовку, чтобы достичь цели - просто не дать шаловливым рукам юзера нажать что-нибудь пока идет "долговременный процесс (скажем секунд на 10)"?
sniknik (2008-04-02 23:30:00) [10]> Курсор над "зависшим " окном особо не перерисовываеться.
курсор рисуется аппаратными средствами, ему зависшее окно пофигу, главное чтобы команда на смену прошла. а она прошла (и не одна... судя по тому что у него дефаултный курсор возвращается, проходит еще и возвратная команда, чтото ее выполняет, чтото, но не приведенный в [0] код. чтото в "волшебных пузырьках").
tesseract (2008-04-02 22:21:00) [11]
> немного не с той оперы. он же не хочет чтобы интерфейс оставался
> "живым" на время работы процесса, наоборот, он его специально
> блокирует.
Курсор над "зависшим " окном особо не перерисовываеться. Да и пользователь может стулом запустить в экран.
{RASkov} (2008-04-02 21:55:00) [12]Восстановление курсора как бы тоже нужно в секцию finally поместить.... мало ли... бывает :)
sniknik (2008-04-02 21:36:00) [13]> Проблема в том, что как только я вызываю EnableWindow(Handle, FALSE), то курсор сразу же "сбрасывается" на дефолтный.
нет такой проблемы... здесь. она у тебя гдето в другом месте.
хотя код неправильный, не изза того на что "грешишь" но тем не менее. правильнее так
EnableWindow(Handle, FALSE);;
try
Screen.Cursor:= crHourGlass;
Sleep(10000); //типа полезный, долговременный процесс (скажем секунд на 10)
Screen.Cursor:= crDefault;
finally
EnableWindow(Handle, TRUE);
end
> Использовать потоки
немного не с той оперы. он же не хочет чтобы интерфейс оставался "живым" на время работы процесса, наоборот, он его специально блокирует.
tesseract (2008-04-02 20:41:00) [14]
> Не подскажете как побороть проблему? Спасибо.
Использовать потоки.