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