Top.Mail.Ru
Ответы
Аватар пользователя
12лет
Изменено
Аватар пользователя
Аватар пользователя
Аватар пользователя
Программирование
+4

Курсор в Delphi

Ребят, очень большая просьба выдержать, прочитать и помочь. Это я пишу курсовую - вопрос жизни и смерти.

Сразу скажу: КУРСОР, т. е. непосредственно указатель мыши а НЕ события мыши.

Так вот: есть такая задача.. . Нужно спрятать курсор спустя три секунды его неподвижности.

Первое, что полезло в голову - совмещение таймера и функции ShowCursor.
Интервал таймера = 3000 мс, по истечении сего интервала ShowCursor(False) и остановка таймера. Событие MouseMove возвращает курсор, включает таймер.
Курсор не спрятался, хотя таймер изменил Application.Title (это я добавил для визуального наблюдения за таймером) .

Вторая мысль - добавить переменную, и с каждой секундой увеличивать эту переменную на единицу, а при условии 'переменная'=3 - ShowCursor(False) и остановка таймера, при этом событие MouseMove "сбивает" значение переменной на 0, и если таймер не активирован, тогда активировать его; таким образом, пока курсор двигается, переменная не может добраться до значения для выполнения условия, а таймер работает до тех пор, пока курсор не остановится и не пройдёт три секунды. Вывод - курсор не скрывается, а визуальные наблюдения за таймером дают положительный результат его работоспособности.

Третья мысль - следить за разностью координат курсора - полнейший абсурд, в общем, три секунды одинаковых координат > ShowCursor(False) и остановка таймера, событие MouseMove возвращает курсор и включает таймер. Курсор не скрылся, а визуально всё вроде бы было нормально.

Четвёртая мысль - SetCursorPos(Screen.Width+1,Screen.Height div 2), в придачу переменная, которая принимает значение false. В таком случае событие MouseMove проверяет эту переменную, если false > SetCursorPos(x1,y1), где x1 и y1 - последние координаты, а сама переменная принимает значение true. Собственно тут тоже не без таймера с интервалом в 3000 мс, которое "сбивается" событием MouseMove.
Сразу отвечу на вопрос, почему прятал по середине ширины - у меня две панели сверху и снизу формы, которые появляются, если курсор в пределах этих панелей.
При сохранении координат ДО восстановления курсора по условию, курсор никуда не девается, ПОСЛЕ - курсор дёргается при попытке его сдвинуть, но всё равно не прячется. Включение таймера, в случае, если он отключён - курсор убирается, но его видно с краю. В таком случае ЭТОТ МЕТОД ПРОВАЛИВАЕТСЯ, даже если курсор правильно будет убираться и восстанавливаться.

Всё сводится к тому, что в таймере события происходят, все КРОМЕ ShowCursor.

Посоветуйте пожалуйста рабочий способ.

По дате
По рейтингу
Аватар пользователя
Новичок
12лет

procedure TForm1.Timer1Timer(Sender: TObject);
begin
ShowCursor(false);
Timer1.enabled:=false;
Timer1.tag:=1;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
begin
Timer1.enabled:=false;
Timer1.enabled:=true;
if Timer1.tag=1 then begin
ShowCursor(true);
Timer1.tag:=0;
end;
end;

Аватар пользователя
Мыслитель
12лет

Судя по вот этой: www. delphisources. ru/pages/faq/base/hide_mouse_cursor.html статье, его скрывать надо, пока он не скроется - то есть в цикле.