Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как сделать задумчивый курсор? 
V
    Опции темы
Kbl4AH
Дата 8.12.2008, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: 4
Всего: 15



Здравствуйте.
Подскажите, плиз.
У меня по нажатию кнопок в окне программа довольно долго думает.
Мне бы хотелось, чтоб во время раздумий был курсор - песочные часики.
Делаю:
Код

procedure TFMain.Button1Click(Sender: TObject);
begin
  Cursor := crHourGlass;
  ...
  ...
  ...
  Cursor := crDefault;
end;
, но ничего не происходит. Почему так?

PM MAIL ICQ   Вверх
CodeMonkey
Дата 8.12.2008, 17:40 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



Как насчёт:
Код
procedure TFMain.Button1Click(Sender: TObject);
begin
  Screen.Cursor := crHourGlass;
  try
    Application.ProcessMessages;
    ...
  finally
    Screen.Cursor := crDefault;
  end;
end;

?


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Kbl4AH
Дата 10.12.2008, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: 4
Всего: 15



CodeMonkey, спасибо, все хорошо.
А можно пояснить, что это: 
Код

Application.ProcessMessages;
?


Это сообщение отредактировал(а) Kbl4AH - 10.12.2008, 15:40
PM MAIL ICQ   Вверх
Poseidon
Дата 10.12.2008, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



ProcessMessages позволяет выполнить очередь сообщений, которые накапливаются для приложения.


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Kbl4AH
Дата 10.12.2008, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: 4
Всего: 15



Ага, это я понял.
Код

Многие начинающие программисты не знают о методе Application.ProcessMessages() и сталкиваются
с проблемами, которых не могут объяснить. Например хотим написать что-то на форме и через 5 секунд стереть.
Нужно сделать так:
--------------------------------------------------------------------------------
Procedure TForm1.Button1Click(SEnder: TObject);
Begin
Label1.Caption:='Started';
Application.ProcessMessages();
sleep(1000);
Label1.Caption:='Finished';
End;
Попробуйте убрать Application.ProcessMessages() и 'Started' вы никогда не увидите,
это связано с тем, что Windows ждет пока накопятся задачи в очереди
а не выполняет их сразу, Application.ProcessMessages() заставляет выполнить
все задачи которые накопились в данный момент.
Подробнее читайте в Help.
Это также можно применить в таком примере:
--------------------------------------------------------------------------------
Procedure TForm1.Button1Click(SEnder: TObject);
Var i: integer;
Begin
For i:=1 to 100000 do Application.ProcessMessages();
End;
если не будет ProcessMessages() то пока крутится цикл мы не сможем сдвинуть или свернуть форму.

Только мне не понятен 2-й пример? Почему так?
И что, теперь Application.ProcessMessages после каждой конструкции писать нужно?
И зачем в примере CodeMonkey вставлен try finally?

Это сообщение отредактировал(а) Kbl4AH - 10.12.2008, 16:00
PM MAIL ICQ   Вверх
Poseidon
Дата 10.12.2008, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



Цитата(Kbl4AH @  10.12.2008,  15:57 Найти цитируемый пост)
Только мне не понятен 2-й пример? Почему так?
В примере просто показывается, что даже когда работает цикл (читай, выполняются ресурсоемкие действия) сообщения для приложения обрабатываются. Т.е. его можно "тягать", жмакать на кнопочки. А если ProcessMessages убрать, то пока цикл не выполнится, приложение не будет отвечать, т.е. появится ощущение что программа зависла.

Цитата(Kbl4AH @  10.12.2008,  15:57 Найти цитируемый пост)
И зачем в примере CodeMonkey вставлен try finally?
А вдруг у тебя там ошибка времени выполнения. Что тогда будет, без try finally? Курсор обратно кто менять будет? А с try finally есть гарантия, что даже при ошибках курсор будет изменен на crDefault



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Kbl4AH
Дата 10.12.2008, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: 4
Всего: 15



Цитата(Poseidon @ 10.12.2008,  17:07)
А вдруг у тебя там ошибка времени выполнения.

Что значит вдруг? Я для этого программу и отлаживаю, чтоб их не было...
Получается - 
с одной стороны, везде нужно втыкать Application.ProcessMessages и try..finally,
а с другой, они усложняют программу.
Нужно искать золотую середину?
PM MAIL ICQ   Вверх
CodeMonkey
Дата 10.12.2008, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



А книжу в руки не проще взять? 
Или хотя-бы электронный вариант? Мануал-там?


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Kbl4AH
Дата 10.12.2008, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: 4
Всего: 15



Цитата(CodeMonkey @ 10.12.2008,  17:16)
А книжу в руки не проще взять? 
Или хотя-бы электронный вариант?

Да я уж почитал про try..except..finally в нете...
Только не понял зачем это в конкретном примере?
Ведь для того, что бы ситуаций не возникало не нужных, защита от дураков и делается...
А то читаю форум и везде на этот try..finally натыкаюсь...
Создается чувство, что это какая-то дань модному стилю...
Хотя, наверняка, я ошибаюсь...

Добавлено через 3 минуты и 54 секунды
Цитата(CodeMonkey @  10.12.2008,  17:16 Найти цитируемый пост)
 Мануал-там

Отдельное спасибо!

PM MAIL ICQ   Вверх
Kbl4AH
Дата 10.12.2008, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: 4
Всего: 15



Фишка была в том, чтобы написать не Cursor :=;
а именно Screen.Cursor.
PM MAIL ICQ   Вверх
THandle
Дата 10.12.2008, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 50
Всего: 372



Цитата(Kbl4AH @  10.12.2008,  16:23 Найти цитируемый пост)
А то читаю форум и везде на этот try..finally натыкаюсь...
Создается чувство, что это какая-то дань модному стилю...


Ошибка может возникнуть где угодно, надо предохраняться.
PM   Вверх
MetalFan
Дата 11.12.2008, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



Цитата(Kbl4AH @  10.12.2008,  15:57 Найти цитируемый пост)
Procedure TForm1.Button1Click(SEnder: TObject);
Begin
Label1.Caption:='Started';
Application.ProcessMessages();
sleep(1000);
Label1.Caption:='Finished';
End;
Попробуйте убрать Application.ProcessMessages() и 'Started' вы никогда не увидите,

кста, можно наверняка менее ресурсоемко "перерисоваться". например так:
Код

Label1.Caption:='Started';
Label1.Update;
sleep(1000);
Label1.Caption:='Finished';



--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Poseidon
Дата 11.12.2008, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



Цитата(Kbl4AH @  10.12.2008,  16:16 Найти цитируемый пост)
Что значит вдруг? Я для этого программу и отлаживаю, чтоб их не было...
Мне вот интересно, как отладкой выловить, к примеру, "Out of memory"? Они на то и "времени выполенния", что возникают не постоянно. Вот случится у тебя такое и что тогда? Придется перегружать программу, что бы вернуть курсор в начальное значение.



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Kbl4AH
Дата 11.12.2008, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: 4
Всего: 15



Цитата(Poseidon @  11.12.2008,  17:34 Найти цитируемый пост)
Мне вот интересно, как отладкой выловить, к примеру, "Out of memory"? Они на то и "времени выполенния", что возникают не постоянно. Вот случится у тебя такое и что тогда? Придется перегружать программу, что бы вернуть курсор в начальное значение.

каюсь
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0651 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.