GraphABC Обработчик событий нажатия кнопок мыши внутри цикла. Не работает - PascalABC.NET

Узнай цену своей работы

Формулировка задачи:

Товарищи, подскажите. Уже весь мозг сломал. Проблема в следующем: я использую модуль graphABC, который с помощью цикла (for, repeat, while - без разницы) выводит на экран какое-то изображение. Необходимо по нажатию либо клавиши с клавиатуры, либо кнопки мыши закончить этот цикл. Чтобы было понятее, приведу тестовую программу:
Листинг программы
  1. program Test;
  2. uses
  3. GraphABC;
  4. procedure MouseDown(x, y, m: integer);
  5. begin
  6. repeat
  7. SetPixel(round(random(600)), round(random(400)), clBlack);
  8. until m = 2; // m=2 при нажатии правой кнопки мыши
  9. end;
  10. begin
  11. OnMouseDown := MouseDown;
  12. end.
То есть обработчик событий управляет процедурой MouseDown с 3 параметрами (x, y - координаты курсора, m - код нажатой кнопки мыши (0-не нажата, 1 - лкм, 2-пкм). Если внутри данной процедуры нет цикла, то всё работает (например, если внутри этой процедуры будет какой-нибудь if m=2 then WriteLn('Нажата правая кнопка мыши'); То есть, программа запускается, срабатывает обработчик события нажатия кнопки мыши, который запускает процедуру MouseDown, внутри которой при условии, что нажата правая кнопка, будет выведено сообщение о нажатии правой кнопки). А вот если присутствует цикл, то пока он не завершится, не сможет сработать обработчик события нажатия кнопки мыши, и, соответственно, ничего не будет происходить. И даже если внутри цикла добавить OnMouseDown := MouseDown, то это никак не изменит ситуацию... Так как же мне сделать выход из цикла??

Решение задачи: «GraphABC Обработчик событий нажатия кнопок мыши внутри цикла. Не работает»

textual
Листинг программы
  1. program Test;
  2.  
  3. uses
  4.   GraphABC;
  5.  
  6. procedure Cicle(a, b, c:integer);
  7. begin
  8. halt;
  9.   end;
  10.  
  11. procedure MouseDown(x, y, m: integer);
  12. begin
  13.   repeat
  14.   MouseDown:=Cicle;
  15.     SetPixel(round(random(600)), round(random(400)), clBlack);
  16.   until false;
  17.  
  18. end;
  19.  
  20. begin
  21.   OnMouseDown := MouseDown;
  22. end.

Объяснение кода листинга программы

  1. Объявлены три процедуры: Cicle, MouseDown, OnMouseDown.
  2. Cicle - не принимает аргументов, выполняет операцию halt.
  3. MouseDown - принимает три аргумента (x, y, m), выполняет операцию repeat, которая зацикливает выполнение кода внутри себя, пока условие не станет ложным.
  4. Внутри цикла repeat выполняется вызов функции Cicle с передачей ей аргументов (a, b, c).
  5. После выполнения цикла repeat выполняется вывод пикселя на экран с помощью функции SetPixel, аргументами которой являются координаты x и y, а также цвет пикселя, заданный константой clBlack.
  6. OnMouseDown - не принимает аргументов, устанавливает обработчик событий мыши на функцию MouseDown.
  7. Код не содержит вызовов функций Cicle, MouseDown, OnMouseDown, кроме их объявления.
  8. Значения переменных a, b, c, x, y, m не определены и не используются в коде.
  9. Значение переменной random не определено и не используется в коде.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.333 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут