Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 339

Раздел: Delphi » Прочее
/ вопрос открыт /

Приветствую, уважаемые эксперты!Как сделать чтобы программа выходила либо при движении курсора, либо при нажатии клавиши Esc ?

Аксион Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Аксион (статус: 4-ый класс)
Вопрос отправлен: 14 февраля 2008, 17:39
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Dron

Здравствуйте, Блазер!
1. Закрытие программы при движении курсора можно запрограммировать разными способами. Можно обрабатывать событие формы OnMouseMove(), но это не лучший вариант, ведь курсор может находиться и вне формы. Вот ещё один способ.
Заведём глобальные переменные X и Y с начальными значениями -1:

var
  Form1: TForm1;
  X: Integer = -1;
  Y: Integer = -1;
А во время работы программы по таймеру будем проверять, не изменились ли координаты курсора. У таймера (TTimer, System) следует установить Interval меньше секунды - например 100 мс. А обработчик прост - если позиция курсора изменилась, закрываем программу:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if (Mouse.CursorPos.X <> X) and (X <> -1) then
    Close
  else
    X:=Mouse.CursorPos.X;
  if (Mouse.CursorPos.Y <> Y) and (Y <> -1) then
    Close
  else
    Y:=Mouse.CursorPos.Y
end;
Значения -1 введены только как стартовые. Значения переменным X и Y можно присвоить и во время запуска программы.

2. Выход при нажатии Escape - проще простого. У формы ставим KeyPreview = True и обрабатываем событие OnkeyDown():
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key = VK_ESCAPE then
    Close
end;
Удачи!

Ответ отправил: Dron (статус: Студент)
Время отправки: 14 февраля 2008, 20:49
Оценка за ответ: 5

Комментарий к оценке: Спс

Мини-форум вопроса

Всего сообщений: 5; последнее сообщение — 2 марта 2008, 19:53; участников в обсуждении: 3.
Nikolas

Nikolas (статус: Посетитель), 16 февраля 2008, 16:41 [#1]:

Привет ВСЕМ. Могу посоветовать еще один способ решения проблемы

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
case key of
#27:form1.Close;
end;
end;

#27 - является аналогом "VK_ESCAPE".
Dron

Dron (статус: Студент), 16 февраля 2008, 17:26 [#2]:

Nikolas: а зачем делать case ради одного значения? И лучше всё же не код (27) писать, а именно VK_ESCAPE - потом проще будет понять...
С уважением.
Nikolas

Nikolas (статус: Посетитель), 17 февраля 2008, 17:57 [#3]:

согласен.
Вадим К

Вадим К (статус: Академик), 17 февраля 2008, 23:46 [#4]:

Цитата:

#27 - является аналогом "VK_ESCAPE".

Не совсем правильно сказано. Просто нужно посмотреть объявление
const
VK_ESCAPE = #27;
Галочка "подтверждения прочтения" - вселенское зло.
Nikolas

Nikolas (статус: Посетитель), 2 марта 2008, 19:53 [#5]:

Странно, зачем из-за этого затевать такую дискуссию.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 27 марта 2023, 07:34
Выполнено за 0.03 сек.
Рейтинг@Mail.ru