Процедуры для работы с мышью в PascalABC
| |
AKukuruz | Дата: Четверг, 07 Июля 2016, 19:56 | Сообщение # 1 |
был не раз
Сейчас нет на сайте
| Где взять их список? MouseMove, MouseDown и тд Если с текстом, то есть crt многое понятно, то с мышью не так... И вообще какие есть путевые книги по АБС?
Допустим надо мышкой ввести координаты путпиксела или вывести их в поле textout.
Вроде понял что они принадлежат модулю Events, но как-то видел в яндексе что есть и модуль Mouse, хотя сейчас нагуглить его не могу... Может это от невнимательности... С вводом-выводом текста и графики все понятно, а мышиные процедуры найти не могу...
p.s.: да я гуглил.
Добавлено (07 июля 2016, 19:56) --------------------------------------------- там где присваиваю значение а и б в mousedown что-то не так...
Код uses GraphABC;
var a,b: integer; //координаты мышки
procedure MouseDown(x,y,mb: integer); begin if mb=1 then // передаем координаты мышки в переменные а и б a : = x; b := y; end;
begin SetWindowTitle('123'); Setwindowsize(800,600); //размер окна
OnMouseDown:=MouseDown; //1 клик, передаем координаты мышки в начальные координаты лайна x1: = a; y1: = b;
OnMouseDown:=MouseDown; //2 клик, передаем тоже самое только в конечные x2 : = a; y2 : = b;
Line(x1,y1,x2,y2); //рисуем
end.
Сообщение отредактировал AKukuruz - Четверг, 07 Июля 2016, 19:58 |
|
| |
Gudleifr | Дата: Четверг, 07 Июля 2016, 20:12 | Сообщение # 2 |
почти ветеран
Сейчас нет на сайте
| Присваивание OnMouseDown:=MouseDown это не вызов, а присвоение обработчика. Примерно так: "Теперь, всякий раз, когда когда случиться событие OnMouseDown, выполнить ф-ию MouseDown".
Т.е Ваша программа работает так:
Теперь, всякий раз, когда когда случиться событие OnMouseDown, выполнить ф-ию MouseDown. Присваеваем x1 и y1 мусор (т.к. мышку еще никто не кликал). Теперь, всякий раз, когда когда случиться событие OnMouseDown, выполнить ф-ию MouseDown. Присваеваем x2 и y2 мусор (т.к. мышку все еще никто не кликал). Рисуем мусор...
А MouseDown так никто и не вызвал, т.к. OnMouseDown так и не случмлось.
Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.
|
|
| |
1nt3g3r | Дата: Четверг, 07 Июля 2016, 20:18 | Сообщение # 3 |
почетный гость
Сейчас нет на сайте
| Цитата OnMouseDown:=MouseDown; //1 клик, передаем координаты мышки в начальные координаты лайна x1: = a; y1: = b;
OnMouseDown:=MouseDown; //2 клик, передаем тоже самое только в конечные x2 : = a; y2 : = b;
Меня смущает этот код. Судя по всему, у тебя постоянно присваиваются значения к x2, y2. Как мне кажется - делай немного не так. Сохраняй последние координаты мышки в (oldX, oldX). Потом считывай координаты мышки в (x, y) и рисуй линию от (oldX, oldY) до (a, b). Примерный код:
Цитата uses GraphABC;
var oldX, oldY: integer; //координаты мышки
procedure MouseDown(x,y,mb: integer); begin if mb=1 then begin if (oldX <> 0 and oldY <> 0) then Line(oldX, oldY, x, y);
oldX = x; oldY = y; end end
begin SetWindowTitle('123'); Setwindowsize(800,600); //размер окна
OnMouseDown:=MouseDown; end.
Добавлено (07 июля 2016, 20:18) --------------------------------------------- Gudleifr, почему это - OnMouseDown как раз и случилось (случится, вернее). То, что оно не приведет к желанному результату - это другое дело.
Нужно писать такие игры, чтобы в них было интересно играть самому
Сообщение отредактировал 1nt3g3r - Четверг, 07 Июля 2016, 20:19 |
|
| |
Gudleifr | Дата: Четверг, 07 Июля 2016, 20:27 | Сообщение # 4 |
почти ветеран
Сейчас нет на сайте
| Цитата 1nt3g3r ( ) почему это - OnMouseDown как раз и случилось (случится, вернее) Насколько я понимаю, программа отработает до начала полноценной работы окна.
Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.
|
|
| |
1nt3g3r | Дата: Четверг, 07 Июля 2016, 20:32 | Сообщение # 5 |
почетный гость
Сейчас нет на сайте
| Gudleifr, нет, вы понимаете неверно - при использовании модуля GraphABC автоматически будет создано графическое окно. Программа завершит работу лишь тогда, когда пользователь закроет окно. А пока оно открыто, он вполне может несколько раз щелкнуть мышкой где-то в окне, и что-то нарисуется (предполагаю, что будут точки рисоваться).
Нужно писать такие игры, чтобы в них было интересно играть самому
|
|
| |
Gudleifr | Дата: Четверг, 07 Июля 2016, 20:41 | Сообщение # 6 |
почти ветеран
Сейчас нет на сайте
| Цитата 1nt3g3r ( ) Программа завершит работу лишь тогда, когда пользователь закроет окно. Формально, да. Но отработает она "до". Иначе бы некоторые On... не успели бы загрузиться. Возможно, в Pascal ABC и есть какие-либо дополнительные средства синхронизации окна с программой, но в их отсутствие с окном работают только обработчики событий. Программный курсор стоит на "end". Это азбука любых программ, работающих с окнами.
Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.
|
|
| |
1nt3g3r | Дата: Четверг, 07 Июля 2016, 20:44 | Сообщение # 7 |
почетный гость
Сейчас нет на сайте
| Цитата Цитата 1nt3g3r () Программа завершит работу лишь тогда, когда пользователь закроет окно. Формально, да. Но отработает она "до". Иначе бы некоторые On... не успели бы загрузиться. Возможно, в Pascal ABC и есть какие-либо дополнительные средства синхронизации окна с программой, но в их отсутствие с окном работают только обработчики событий. .
Вы пишете что-то не то. Создастся отдельный поток событий, привязанный к окну. Этот поток будет завершен лишь при закрытии окна. Пока окно не закрыто - программа работает.
Цитата Программный курсор стоит на "end". Это азбука любых программ, работающих с окнами Вы о чем? Какая азбука? "Програмный курсор" - что за новое понятие в информатике? Наверное, вы хотели сказать, что код между Begin и End выполнится ДО создания окна?
Нужно писать такие игры, чтобы в них было интересно играть самому
|
|
| |
Gudleifr | Дата: Четверг, 07 Июля 2016, 20:51 | Сообщение # 8 |
почти ветеран
Сейчас нет на сайте
| Цитата 1nt3g3r ( ) "Програмный курсор" - что за новое понятие в информатике? Наоборот, видимо, слишком старое.
Цитата 1nt3g3r ( ) Наверное, вы хотели сказать, что код между Begin и End выполнится ДО создания окна? Именно. Как Вы иначе сможете отметить в программе границу между "окна еще нет" и "окно уже есть"? И гарантировать, что все присвоения On... будут сделаны до этой границы?
Впрочем, вижу, Вам понравилось разбираться с этой задачкой (и этим коллегой). Вот Вы его дальше и курируйте. А то все я, да я. И ругаю, и подсказываю... Будьте "добрым полицейским".
Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.
|
|
| |
AKukuruz | Дата: Четверг, 07 Июля 2016, 21:18 | Сообщение # 9 |
был не раз
Сейчас нет на сайте
| Цитата Gudleifr ( ) А MouseDown так никто и не вызвал, т.к. OnMouseDown так и не случмлось.
Когда писал программу рисующую точку при MouseDown все работало. Тыкнули мышкой - нарисовали точку, тыкнули еще раз нарисовали еще раз... Соответственно событие произошло.
Цитата 1nt3g3r ( ) Gudleifr, почему это - OnMouseDown как раз и случилось (случится, вернее). То, что оно не приведет к желанному результату - это другое дело. Да я тоже уверен что случится, но при присваивании а и б координат что-то не так...
Я даже скомпилировать не могу. В строке a: = x; ругается что "Встречено ':', а ожидалось ';'"... А почему я не могу понять, язык изучаю недели две, сильно путаюсь в расстановках. Если бы кто-то обьяснил почему ругается было бы понятней что делать... То есть я понимаю что ошибка а в чем именно не понимаю.
Команда рисующая точку обьявляется в процедуре клика мышки. Для лайна нужно 2 клика... То есть я не могу засунуть line в mousedown, что логично. События ведь два.
Код procedure mousedown(x,y,mb: integer); begin if mb=1 then PutPixel(x, y, clRed); //красим пиксель end;
Сообщение отредактировал AKukuruz - Четверг, 07 Июля 2016, 21:27 |
|
| |
1nt3g3r | Дата: Четверг, 07 Июля 2016, 21:45 | Сообщение # 10 |
почетный гость
Сейчас нет на сайте
| AKukuruz, Цитата В строке a: = x; ругается что "Встречено ':', а ожидалось ';'" - это потому, что вы пишете двоеточие отдельно от знака равно - ": =" (между ними пробел). Нужно писать слитно, без пробела.
Нужно писать такие игры, чтобы в них было интересно играть самому
|
|
| |
AKukuruz | Дата: Четверг, 07 Июля 2016, 22:02 | Сообщение # 11 |
был не раз
Сейчас нет на сайте
| Цитата 1nt3g3r ( ) Gudleifr, нет, вы понимаете неверно - при использовании модуля GraphABC автоматически будет создано графическое окно. Программа завершит работу лишь тогда, когда пользователь закроет окно. А пока оно открыто, он вполне может несколько раз щелкнуть мышкой где-то в окне, и что-то нарисуется (предполагаю, что будут точки рисоваться).
А окно разве не часть программы? В программе может быть графическое окно + консольщина для команд. Это вроде и есть программа... Даже пустое окно - все равно программа.
Сообщение отредактировал AKukuruz - Четверг, 07 Июля 2016, 22:20 |
|
| |
1nt3g3r | Дата: Четверг, 07 Июля 2016, 22:15 | Сообщение # 12 |
почетный гость
Сейчас нет на сайте
| AKukuruz, не пишите "a : = x", пишите - "a := x". Пробел между двоеточием и знаком равно - его там не должно быть.
Нужно писать такие игры, чтобы в них было интересно играть самому
|
|
| |
AKukuruz | Дата: Четверг, 07 Июля 2016, 22:20 | Сообщение # 13 |
был не раз
Сейчас нет на сайте
| Исправил. Программа запускается, но ничего не происходит... Ятп координаты или не хранятся или не передаются в переменные Line. пробовал обьвлять x1,x2,y1,y2 - не помогает...
Наверное теперь что-то в том месте где обработчик события не правильно... А на ваш вариант программа тоже ругается при запуске... "Операция '<>' не применима к типам boolean и integer".
Сообщение отредактировал AKukuruz - Четверг, 07 Июля 2016, 22:23 |
|
| |
1nt3g3r | Дата: Четверг, 07 Июля 2016, 22:30 | Сообщение # 14 |
почетный гость
Сейчас нет на сайте
| AKukuruz, да, в моем варианте есть некоторые моменты. Верный код будет примерно таким:
Цитата uses GraphABC;
var oldX, oldY: integer; //координаты мышки
procedure MouseDown(x,y,mb: integer); begin if mb=1 then begin if ((oldX <> 0) and (oldY <> 0)) then Line(oldX, oldY, x, y);
oldX := x; oldY := y; end end
begin SetWindowTitle('123'); Setwindowsize(800,600); //размер окна
OnMouseDown:=MouseDown; end.
Мой основной язык сейчас - Java, синтаксис Pascal-я уже немного подзабылся...
Нужно писать такие игры, чтобы в них было интересно играть самому
|
|
| |
AKukuruz | Дата: Четверг, 07 Июля 2016, 22:41 | Сообщение # 15 |
был не раз
Сейчас нет на сайте
| Нагуглил что-то похожее.
Рисуем линию, но начальные координаты в точке 0,0... Буду думать как ее задать при первом клике.
Код uses GraphABC;
procedure MouseDown(x,y,mb: integer); begin if mb=1 then LineTo(x,y); end;
begin SetWindowTitle('Графическое окно'); Setwindowsize(800,600); //размер окна
OnMouseMove:=MouseDown;
end. Добавлено (07 июля 2016, 22:41) ---------------------------------------------
Цитата 1nt3g3r ( ) Мой основной язык сейчас - Java, синтаксис Pascal-я уже немного подзабылся... Да) Всеравно спасибо за помощь.
|
|
| |
1nt3g3r | Дата: Четверг, 07 Июля 2016, 22:51 | Сообщение # 16 |
почетный гость
Сейчас нет на сайте
| AKukuruz, код, что вы нагуглили - фактически, тот код, что привел вам я. Только в моем варианте как раз и учтено рисовать линию лишь после первого клика.
Нужно писать такие игры, чтобы в них было интересно играть самому
|
|
| |
AKukuruz | Дата: Пятница, 08 Июля 2016, 02:27 | Сообщение # 17 |
был не раз
Сейчас нет на сайте
| Вообще ее надо бы рисовать после второго клика когда мы узнали конечные координаты... А при первом только начальные указать.
А как дать понять программе что я делаю второй клик? Вот через moveto... Тоже не работает...
Код uses GraphABC;
procedure mousedown(x,y,mb: integer); begin if mb=1 then MoveTo(x, y); begin if mb=1 then Lineto(x, y); end; end;
begin SetWindowTitle('Графическое окно'); Setwindowsize(800,600); //размер окна
OnMousedown:=Mousedown;
end.
|
|
| |
1nt3g3r | Дата: Пятница, 08 Июля 2016, 09:52 | Сообщение # 18 |
почетный гость
Сейчас нет на сайте
| AKukuruz, не понимаю сути вашей проблемы) Специально поставил PascalABC, проверил свой код:
(прямая ссылка, если не видно картинку - https://www.dropbox.com/s/6oxpbld3wxvzw87/Скриншот 2016-07-08 09.46.13.png?dl=0)
Единственная ошибка в моем коде - я забыл поставить точку с запятой перед end.
Цитата uses GraphABC;
var oldX, oldY: integer; //координаты мышки
procedure MouseDown(x,y,mb: integer); begin if mb=1 then begin if ((oldX <> 0) and (oldY <> 0)) then Line(oldX, oldY, x, y);
oldX := x; oldY := y; end end;
begin SetWindowTitle('123'); Setwindowsize(800,600); //размер окна
OnMouseDown:=MouseDown; end.
Это полностью рабочий вариант (скопированный прямо из PascalABC). Как мы избегаем рисования линии при первом нажатии - мы смотрим на (oldX, oldY). Если они оба равны нулю (а такое может быть лишь при первом клике) - мы ничего не делаем. А начиная со второго клика - начинается рисование.
Нужно писать такие игры, чтобы в них было интересно играть самому
|
|
| |
Gudleifr | Дата: Пятница, 08 Июля 2016, 12:04 | Сообщение # 19 |
почти ветеран
Сейчас нет на сайте
| Цитата 1nt3g3r ( ) не понимаю сути вашей проблемы Дык, я же объяснил.
Цитата 1nt3g3r ( ) я забыл поставить точку с запятой перед end Наоборот, точка с запятой перед end - это ошибка.
Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.
|
|
| |
1nt3g3r | Дата: Пятница, 08 Июля 2016, 12:12 | Сообщение # 20 |
почетный гость
Сейчас нет на сайте
| Gudleifr,
Цитата Цитата 1nt3g3r () не понимаю сути вашей проблемы Дык, я же объяснил.
Я обращался не к вам, но вы все обьяснили за человека. Вы очень проницательны и умеете отвечать за других. Отличная привычка!
Цитата Цитата 1nt3g3r () я забыл поставить точку с запятой перед end Наоборот, точка с запятой перед end - это ошибка. Да - после end, спасибо за подсказку, точно подмечено, сразу видно, что у человека большой, я бы сказал, ДРЕВНИЙ, опыт в программировании!
Нужно писать такие игры, чтобы в них было интересно играть самому
Сообщение отредактировал 1nt3g3r - Пятница, 08 Июля 2016, 12:12 |
|
| |
|