-
Приветствую всех, столкнулся с небольшой проблемой. После нажатия пользователем кнопки на форме запускается долговременный процесс (скажем секунд на 10), в это время курсор должен измениться на crHourGlass, а форма заблокироваться, после завершения выполнения долговременного процесса, должны произойти обратные действия. Использую следующий код:
try
Screen.Cursor := crHourGlass;
EnableWindow(Handle, FALSE);
...
finally
EnableWindow(Handle, TRUE);
Screen.Cursor := crDefault;
end; Проблема в том, что как только я вызываю EnableWindow(Handle, FALSE), то курсор сразу же "сбрасывается" на дефолтный. Не подскажете как побороть проблему? Спасибо.
-
> Не подскажете как побороть проблему? Спасибо.
Использовать потоки.
-
> Проблема в том, что как только я вызываю EnableWindow(Handle, FALSE), то курсор сразу же "сбрасывается" на дефолтный. нет такой проблемы... здесь. она у тебя гдето в другом месте. хотя код неправильный, не изза того на что "грешишь" но тем не менее. правильнее так EnableWindow(Handle, FALSE);
try
Screen.Cursor:= crHourGlass;
Sleep(10000);
Screen.Cursor:= crDefault;
finally
EnableWindow(Handle, TRUE);
end ; > Использовать потоки немного не с той оперы. он же не хочет чтобы интерфейс оставался "живым" на время работы процесса, наоборот, он его специально блокирует.
-
Восстановление курсора как бы тоже нужно в секцию finally поместить.... мало ли... бывает :)
-
> немного не с той оперы. он же не хочет чтобы интерфейс оставался > "живым" на время работы процесса, наоборот, он его специально > блокирует.
Курсор над "зависшим " окном особо не перерисовываеться. Да и пользователь может стулом запустить в экран.
-
> Курсор над "зависшим " окном особо не перерисовываеться. курсор рисуется аппаратными средствами, ему зависшее окно пофигу, главное чтобы команда на смену прошла. а она прошла (и не одна... судя по тому что у него дефаултный курсор возвращается, проходит еще и возвратная команда, чтото ее выполняет, чтото, но не приведенный в [0] код. чтото в "волшебных пузырьках").
-
> курсор рисуется аппаратными средствами, ему зависшее окно > пофигу, главное чтобы команда на смену прошла. а она прошла > (и не одна... судя по тому что у него дефаултный курсор > возвращается, проходит еще и возвратная команда, чтото ее > выполняет, чтото, но не приведенный в [0] код. чтото в "волшебных > пузырьках").
"Неприведенный" кусок кода содержит работу с сокетами, никаких команд работы с курсором не содержит. EnableWindow(Handle, FALSE) как и Screen.Cursor:= crHourGlass есстественно нужно вынести перед try ... finally, это мой недогляд - не корректно привел пример. Но согласившись с {RASkov} Screen.Cursor := crDefault внести в finally ... end все-таки нужно. А какие еще есть способы блокировки окна, чтобы сохранить к примеру его перерисовку, чтобы достичь цели - просто не дать шаловливым рукам юзера нажать что-нибудь пока идет "долговременный процесс (скажем секунд на 10)"?
-
> чтото ее выполняет, чтото, но не приведенный в [0] код. > чтото в "волшебных пузырьках").
Вроде винда должна его сбрасывать если софт не отвечает, у меня по жизни как 1с-ка уйдёт в шамбалу, так курсор на дефолтный меняеться.
-
Вот у тут происходит нечто подобное, при блокировке окна именно над блокируемым окном курсор становится снова дефолтным.
-
Не надо блокировать онко, надо блокировать кнопки, меню, Actions и т.д.
-
> "Неприведенный" кусок кода содержит работу с сокетами, никаких команд работы с курсором не содержит. это ты так думаешь... а проверь, и замени весь "Неприведенный" (кстати почему в кавычках? ведь он реально не приведен) код на sleep как у меня. ??? и кстати исключи влияние потоков, чегонибудь асинхронного, что имеет потоки внутри (всего параллельно выполняющегося кода в общем) буде оно у тебя там есть. иначе эксперимент не будет чистым. а лучше вообще новый проект для проверки только с этим кодом.
-
to sniknik: да, действительно, при использовании Sleep(10000); //типа полезный, долговременный процесс (скажем секунд на 10) работает как нужно. У меня при работе с сокетами используются потоки...
Но вот совет Игоря Шевченко мне более по душе.
Всем спасибо за ответы и советы.
-
> У меня при работе с сокетами используются потоки... как многозначительно... и глупо.
потоки сами по себе курсор не меняют, сделай проверку с пустым потоком (тот же слип внутри), и в коде замени слип в проверке на него, + ожидание его завершения, будет тоже -> > работает как нужно.
> Но вот совет Игоря Шевченко мне более по душе. более чем что? я тебе советов не давал, я пытался помочь разобраться в чем же собственно причина глюка. и совет Игоря тебе от проблемы избавиться не поможет, если ты вместо блокирования окна будеш "дизейблить" его содержимое курсор все одно будет меняться пока не найдешь(/уберешь) причину. хотя, подозреваю, что ты воспринял его совет как вообще, замену установке курсору "часиков". и попросту спрятал глюк. мелкий но всеже. т.е. ты его не переставляешь и получается не видно как он возвращается. дело твое, более не вмешиваюсь.
-
to sniknik: при блокировке кнопок, меню и т.д. все работает как и требуется, плюс сохраняется подвижность формы, ее перерисовка, т.е. приложение не кажется в этот момент умершим.
> как многозначительно... и глупо. А вообще, если честно, немного напрягает такой стиль общения, может я и выразился неверно или вопрос не самый интересный задал, но подобный форум и существует для того, чтобы на нем задавали вопросы и помогали решать проблемы. Не привык (к сожалению, а может и нет) если честно к такому стилю общения за свои годы.
Еще раз спасибо за обращение своего внимания на мою проблему.
-
> немного напрягает такой стиль общения аналогично. только меня "напрягает" когда спрашивают одно, а решением считают совсем другое. совсем не связанное с "проблемой".
не у всех здесь хорошие телепаторы. (в вопросе совершенно четко прописано, что должно происходить > ... курсор должен измениться на crHourGlass, а форма заблокироваться, ... , и в чем заключается проблема. > курсор сразу же "сбрасывается" на дефолтный что и подкупило... думал хоть ктото адекватный. но видимо не судьба.)
> подобный форум и существует для того и это еще одно, что тоже немного "напрягает". все спрашивающие почемуто точно знают для чего существует форум, и как другим для них нужно отвечать. а вот сами использовать эти знания "как нужно", для других, почемуто не спешат.
> Еще раз спасибо за обращение своего внимания на мою проблему. да не за что. буквально. проблема так и не была решена.
|