|
6 / 6 / 3
Регистрация: 14.11.2015
Сообщений: 21
|
||||||
GraphABC Обработчик событий нажатия кнопок мыши внутри цикла. Не работает14.11.2015, 15:40. Показов 13940. Ответов 20
Метки нет (Все метки)
Товарищи, подскажите. Уже весь мозг сломал. Проблема в следующем:
я использую модуль graphABC, который с помощью цикла (for, repeat, while - без разницы) выводит на экран какое-то изображение. Необходимо по нажатию либо клавиши с клавиатуры, либо кнопки мыши закончить этот цикл. Чтобы было понятее, приведу тестовую программу:
Если внутри данной процедуры нет цикла, то всё работает (например, если внутри этой процедуры будет какой-нибудь if m=2 then WriteLn('Нажата правая кнопка мыши'); То есть, программа запускается, срабатывает обработчик события нажатия кнопки мыши, который запускает процедуру MouseDown, внутри которой при условии, что нажата правая кнопка, будет выведено сообщение о нажатии правой кнопки). А вот если присутствует цикл, то пока он не завершится, не сможет сработать обработчик события нажатия кнопки мыши, и, соответственно, ничего не будет происходить. И даже если внутри цикла добавить OnMouseDown := MouseDown, то это никак не изменит ситуацию... Так как же мне сделать выход из цикла??
0
|
||||||
| 14.11.2015, 15:40 | |
|
Ответы с готовыми решениями:
20
Обработчик событий нажатия кнопок мыши внутри цикла
|
|
9 / 9 / 11
Регистрация: 22.10.2015
Сообщений: 81
|
||||||
| 15.11.2015, 16:04 | ||||||
0
|
||||||
|
6 / 6 / 3
Регистрация: 14.11.2015
Сообщений: 21
|
|
| 15.11.2015, 20:35 [ТС] | |
|
Так ничего не изменилось. Добавлен ещё один цикл (зачем?), но выйти из цикла во время его выполнения нажатием кнопки мыши всё также невозможно...
0
|
|
|
9 / 9 / 11
Регистрация: 22.10.2015
Сообщений: 81
|
|
| 15.11.2015, 20:40 | |
|
Ну программа то заканчивается.
0
|
|
|
6 / 6 / 3
Регистрация: 14.11.2015
Сообщений: 21
|
|
| 16.11.2015, 00:22 [ТС] | |
|
Так смысл не в том, чтобы закончить программу. Можно было после Until указать условие, которое приекратит программу через какое-то количество итераций.
Мне нужно закончить цикл в любое время нажатием какой-нибудь кнопки. Не получается... По крайней мере, при использовании модуля GraphABC... Такое чувство, что глюк в этом модуле.
0
|
|
|
Почетный модератор
64315 / 47611 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
|
||||||
| 16.11.2015, 08:20 | ||||||
1
|
||||||
|
Супер-модератор
|
||||||
| 16.11.2015, 10:15 | ||||||
|
Даже больше того, не нужно в цикле присвоение обработчика:
1
|
||||||
|
6 / 6 / 3
Регистрация: 14.11.2015
Сообщений: 21
|
||||||
| 16.11.2015, 13:36 [ТС] | ||||||
|
Спасибо! Из цикла уже выходит, дальше буду соображать!
Добавлено через 12 минут Всё равно есть заминка... Дело в том, что процедура, в которой есть цикл, у меня сама должна вызываться нажатием кнопки мыши. То есть вот типа такого:
0
|
||||||
|
Почетный модератор
64315 / 47611 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
|
|
| 16.11.2015, 13:57 | |
|
А ты напиши точно, что хочешь получить, а какие-то сопли по стене..
0
|
|
|
6 / 6 / 3
Регистрация: 14.11.2015
Сообщений: 21
|
|
| 16.11.2015, 14:49 [ТС] | |
|
Почему сопли - вполне конкретно всё. А если бы хотел получить именно это?..
Суть в том, что изначально на экране есть меню с кнопками. Меню - отдельная процедура. При нажатии соответствующей кнопки (из тела программы вызывается OnMouseDown := Menu, и в Menu проверяются координаты x, y) из Menu запускается процедура отрисовки графика (пишу программу - гармонограф. Задаются 3 частоты и выводится их "взаимодействие". Иногда очень красивые рисунки получаются. Можно вращать получившийся график). Этот график должен рисоваться непрерывно (анимация), но в определённый момент должна быть возможность выйти из анимации (чтобы задать другие частоты, например). Получается, что основная программа вызывает Menu (OnMouseDown := Menu) и передаёт в Menu координаты нажатия кнопки мыши; Menu при совпадении координат нажатия с координатами кнопки вызывает процедуру анимации графика (в которой, конечно, есть циклы). И уже из процедуры анимации не выйти. Никакие OnMouseDown := [процедура с выходом] не работают из неё.
0
|
|
|
Почетный модератор
64315 / 47611 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
|
|
| 16.11.2015, 14:54 | |
|
Ну сделай их на разные кнопки мыши или выход на OnKeyPress
0
|
|
|
6 / 6 / 3
Регистрация: 14.11.2015
Сообщений: 21
|
|
| 16.11.2015, 15:04 [ТС] | |
|
В том и дело, что если внутри цикла прописать OnMouseDown (и обрабатывать потом другую кнопку мыши) или OnKeyPress тоже пробовал - ничего не работает. Как будто бы не работает только из процедур, которые сами были вызваны обработчиком событий. Глюк это или моё незнание чего-то?..
0
|
|
|
Супер-модератор
|
||
| 16.11.2015, 15:09 | ||
|
0
|
||
|
6 / 6 / 3
Регистрация: 14.11.2015
Сообщений: 21
|
|||||||||||
| 16.11.2015, 15:51 [ТС] | |||||||||||
|
Ну а как же мне тогда быть? Ведь:
1) Menu, по идее, должно вызываться обработчиком событий OnMouseDown из тела программы. Так ведь? 2) В процедуре, которая запускается изнутри Menu мне тоже нужен обработчик событий мыши. Но внутри Menu (которая уже была вызвана обработчиком событий) не работают уже никакие другие обработчики событий. И если в Menu встречается цикл, то из него уже не выйти при помощи обработчика, т.к. он не работает. Не работает вот такой код (смысл - чтобы цикл был не в самой процедуре, вызванной обработчиком событий):
Почему при написании консольного приложения при помощи модуля CRT, вообще никаких проблем не было бы - там есть хорошие функции Keypressed, ReadKey, которые работают всегда, везде, в любом цикле, делая выход из цикла вообще не проблемой. А в GraphABC подобных функций нет, только дурацкие обработчики, работающие один раз на всю программу... P.S. модуль CRT в совокупности с GraphABC использовать не представляется возможным, т.к. функции ReadKey и Keypressed считывают нажатия из консольного окна, а не из графического.
0
|
|||||||||||
|
Супер-модератор
|
||
| 16.11.2015, 17:17 | ||
|
Событийное программирование имеет свою специфику, и ее нужно понимать, прежде, чем браться писать программы. Она отличается от специфики процедурного программирования.
0
|
||
|
6 / 6 / 3
Регистрация: 14.11.2015
Сообщений: 21
|
||
| 16.11.2015, 17:25 [ТС] | ||
|
Когда учился в универе, то не было PascalABC, программировали на Turbo Pascal-е. Там только под DOS. Сейчас возникла необходимость написать программу, работающую в Windows, к моей радости оказалось, что есть PascalABC, предоставляющий такую возможность. Но в процессе столкнулся с трудностями. volvo, если вы понимаете основы событийного программирования, то скажите, что мне сделать, чтобы реализовать то, что нужно? Как из тела программы по событию вызвать процедуру, а в ней по событию выходить из цикла? Или что нужно сделать с программой, чтобы реализовать задумку? Меню сделать не вызываемой процедурой, а в теле программы? Но тогда как нажимать на кнопки в меню, ведь нужна OnMouseDown, чтобы определить координаты клика мышки.
0
|
||
|
0 / 0 / 3
Регистрация: 10.03.2017
Сообщений: 39
|
|||||||||||
| 22.03.2017, 09:06 | |||||||||||
|
Всю прорисовку вынес в отдельную процедуру в новом потоке, благодаря чему она никому не мешает.
Процедура считывания клика мыши изменяет межпроцедурную переменную, которая постоянно считывается циклом while в процедуре prnt
Цитата Меню сделать не вызываемой процедурой, а в теле программы? Но тогда как нажимать на кнопки в меню, ведь нужна OnMouseDown, чтобы определить координаты клика мышки. вот так?
0
|
|||||||||||
|
5095 / 2661 / 2355
Регистрация: 10.12.2014
Сообщений: 10,060
|
|||||||||||
| 22.03.2017, 10:17 | |||||||||||
|
Тривиальный пример:
1
|
|||||||||||
|
0 / 0 / 3
Регистрация: 10.03.2017
Сообщений: 39
|
||
| 22.03.2017, 21:53 | ||
|
Нас просили разобраться с кодом и самого первого сообщения, а не писать свой!
0
|
||
|
5095 / 2661 / 2355
Регистрация: 10.12.2014
Сообщений: 10,060
|
|
| 23.03.2017, 07:07 | |
|
Nikita2007, это всё к тому, что
— ТС изначально не правильно стал использовать метод — перед вашим ответом ТС пишет „я начал писать программу в надежде в процессе разобраться с тонкостями.“ — далее вы приводите пример программы, но не используете объектную модель, которую не смогли довести до логического конца
0
|
|
| 23.03.2017, 07:07 | |
|
Помогаю со студенческими работами здесь
20
Обработчик событий динамически созданных кнопок
Обработчик событий для нескольких кнопок
Обработчик событий нажатия на мыш/клавиатуру Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
|
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2.
Данный документ берёт данные из другого нетипового документа. . .
|
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
|
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2.
Задача: реализовать программный контроль на предмет проведения документа. . .
|
|
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2.
Задача:
1. Реализовать контроль заполнения реквизита. . .
|
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение:
DISM / Online / Add-Capability / CapabilityName:WMIC~~~~
Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
|
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2.
Задача: при создании документов установить период списания автоматически. . .
|
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2.
Задача: вывести данные из ТЧ нетипового документа. . .
|