Конференция "Основная" » Курсор и блокировка формы
 
  • Кодер © (02.04.08 19:58) [0]
    Приветствую всех, столкнулся с небольшой проблемой. После нажатия пользователем кнопки на форме запускается долговременный процесс (скажем секунд на 10), в это время курсор должен измениться на crHourGlass, а форма заблокироваться, после завершения выполнения долговременного процесса, должны произойти обратные действия. Использую следующий код:


    try
     Screen.Cursor := crHourGlass;
     EnableWindow(Handle, FALSE);
    ...
    finally
      EnableWindow(Handle, TRUE);
      Screen.Cursor := crDefault;
    end;



    Проблема в том, что как только я вызываю EnableWindow(Handle, FALSE), то курсор сразу же "сбрасывается" на дефолтный. Не подскажете как побороть проблему? Спасибо.
  • tesseract © (02.04.08 20:41) [1]

    >  Не подскажете как побороть проблему? Спасибо.


    Использовать потоки.
  • sniknik © (02.04.08 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} © (02.04.08 21:55) [3]
    Восстановление курсора как бы тоже нужно в секцию finally поместить.... мало ли... бывает :)
  • tesseract © (02.04.08 22:21) [4]

    > немного не с той оперы. он же не хочет чтобы интерфейс оставался
    > "живым" на время работы процесса, наоборот, он его специально
    > блокирует.


    Курсор над "зависшим " окном особо не перерисовываеться. Да и пользователь может стулом запустить в экран.
  • sniknik © (02.04.08 23:30) [5]
    > Курсор над "зависшим " окном особо не перерисовываеться.
    курсор рисуется аппаратными средствами, ему зависшее окно пофигу, главное чтобы команда на смену прошла. а она прошла (и не одна... судя по тому что у него дефаултный курсор возвращается, проходит еще и возвратная команда, чтото ее выполняет, чтото, но не приведенный в [0] код. чтото в "волшебных пузырьках").
  • Кодер © (03.04.08 09:41) [6]

    > курсор рисуется аппаратными средствами, ему зависшее окно
    > пофигу, главное чтобы команда на смену прошла. а она прошла
    > (и не одна... судя по тому что у него дефаултный курсор
    > возвращается, проходит еще и возвратная команда, чтото ее
    > выполняет, чтото, но не приведенный в [0] код. чтото в "волшебных
    > пузырьках").

    "Неприведенный" кусок кода содержит работу с сокетами, никаких команд работы с курсором не содержит. EnableWindow(Handle, FALSE) как и Screen.Cursor:= crHourGlass есстественно нужно вынести перед try ... finally, это мой недогляд - не корректно привел пример. Но согласившись с {RASkov} Screen.Cursor := crDefault внести в finally ... end все-таки нужно. А какие еще есть способы блокировки окна, чтобы сохранить к примеру его перерисовку, чтобы достичь цели - просто не дать шаловливым рукам юзера нажать что-нибудь пока идет "долговременный процесс (скажем секунд на 10)"?
  • tesseract © (03.04.08 10:06) [7]

    > чтото ее выполняет, чтото, но не приведенный в [0] код.
    > чтото в "волшебных пузырьках").


    Вроде винда должна его сбрасывать если софт не отвечает, у меня по жизни как 1с-ка уйдёт в шамбалу, так курсор на дефолтный меняеться.
  • Кодер © (03.04.08 10:23) [8]
    Вот у тут происходит нечто подобное, при блокировке окна именно над блокируемым окном курсор становится снова дефолтным.
  • Игорь Шевченко © (03.04.08 10:25) [9]
    Не надо блокировать онко, надо блокировать кнопки, меню, Actions и т.д.
  • sniknik © (03.04.08 10:41) [10]
    > "Неприведенный" кусок кода содержит работу с сокетами, никаких команд работы с курсором не содержит.
    это ты так думаешь... а проверь, и замени весь "Неприведенный" (кстати почему в кавычках? ведь он реально не приведен) код на sleep как у меня. ???
    и кстати исключи влияние потоков, чегонибудь асинхронного, что имеет потоки внутри (всего параллельно выполняющегося кода в общем) буде оно у тебя там есть. иначе эксперимент не будет чистым. а лучше вообще новый проект для проверки только с этим кодом.
  • Кодер © (03.04.08 18:12) [11]
    to sniknik: да, действительно, при использовании
    Sleep(10000); //типа полезный, долговременный процесс (скажем секунд на 10) работает как нужно. У меня при работе с сокетами используются потоки...

    Но вот совет Игоря Шевченко мне более по душе.

    Всем спасибо за ответы и советы.
  • sniknik © (03.04.08 20:02) [12]
    > У меня при работе с сокетами используются потоки...
    как многозначительно... и глупо.

    потоки сами по себе курсор не меняют, сделай проверку с пустым потоком (тот же слип внутри), и в коде замени слип в проверке на него, + ожидание его завершения, будет тоже ->
    > работает как нужно.

    > Но вот совет Игоря Шевченко мне более по душе.
    более чем что? я тебе советов не давал, я пытался помочь разобраться в чем же собственно причина глюка.
    и совет Игоря тебе от проблемы избавиться не поможет, если ты вместо блокирования окна будеш "дизейблить" его содержимое курсор все одно будет меняться пока не найдешь(/уберешь) причину.
    хотя, подозреваю, что ты воспринял его совет как вообще, замену установке курсору "часиков". и попросту спрятал глюк. мелкий но всеже.
    т.е. ты его не переставляешь и получается не видно как он возвращается. дело твое, более не вмешиваюсь.
  • Кодер © (03.04.08 20:20) [13]
    to sniknik: при блокировке кнопок, меню и т.д. все работает как и требуется, плюс сохраняется подвижность формы, ее перерисовка, т.е. приложение не кажется в этот момент умершим.

    > как многозначительно... и глупо.
    А вообще, если честно, немного напрягает такой стиль общения, может я и выразился неверно или вопрос не самый интересный задал, но подобный форум и существует для того, чтобы на нем задавали вопросы и помогали решать проблемы. Не привык (к сожалению, а может и нет) если честно к такому стилю общения за свои годы.

    Еще раз спасибо за обращение своего внимания на мою проблему.
  • sniknik © (03.04.08 21:34) [14]
    > немного напрягает такой стиль общения
    аналогично. только меня "напрягает"  когда спрашивают одно, а решением считают совсем другое. совсем не связанное с "проблемой".

    не у всех здесь хорошие телепаторы.
    (в вопросе совершенно четко прописано, что должно происходить
    > ... курсор должен измениться на crHourGlass, а форма заблокироваться, ...
    , и в чем заключается проблема.
    > курсор сразу же "сбрасывается" на дефолтный
    что и подкупило... думал хоть ктото адекватный. но видимо не судьба.)

    > подобный форум и существует для того
    и это еще одно, что тоже немного "напрягает".
    все спрашивающие почемуто точно знают для чего существует форум, и как другим для них нужно отвечать.
    а вот сами использовать эти знания "как нужно", для других, почемуто не спешат.

    > Еще раз спасибо за обращение своего внимания на мою проблему.
    да не за что. буквально. проблема так и не была решена.
 
Конференция "Основная" » Курсор и блокировка формы
Есть новые Нет новых   [134484   +49][b:0][p:0.001]