Не знаю проблемы у меня или в модуле Wingraph или еще в чем-то, но не всегда получается отловить нажатие кнопки мыши, а после readkey графическое окно вообще перестает реагировать на другие события.
Как я пытаюсь работать с мышой:
repeat if PollMouseEvent(MEvent) then begin GetMouseEvent(MEvent); MouseX:=MEvent.x; MouseY:=MEvent.y; if (MouseX <> x0) or (MouseY <> y0) then begin x0:=MouseX; y0:=MouseY; if (MEvent.action=MouseActionDown) or (keypressed) then Arrow.StartNew else Arrow.ChangePosition(round(MouseX/step)*step, round(MouseY/step)*step); end; Delay(1); end; until CloseGraphRequest; CloseGraph;
Полный исходник: PolDevelop.rar ( 1.06 килобайт )
Кол-во скачиваний: 678
При каждом нажатии любой кнопки мыши шарик, который постоянно бегает за курсором, должен оставаться на том месте, где была нажата клавиша, но это происходит далеко не всегда . Если проблемы в коде укажите, пожалуйста, ошибку, в противном случае - подскажите другие модуле с такими же функциями или другие способы работы с мышой в граф. режиме. Отдельно интересует такая возможность используя WinApi.
--------------------
Лао-Цзы : Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
Эта функция проверяет есть ли новые события, а GetMouseEvent уже читает их. Почему не использовать просто GetMouseEvent? Потому что она не отдаст управление программе пока сама не выполнится, т.е. пока не считает Event:
procedure GetMouseEvent(out MouseEvent:MouseEventType); begin while (nr_readmouse = nr_inputmouse) do Sleep(10);<---!!!!! EnterCriticalSection(protect_mouse); PollMouseEvent(MouseEvent); IncMouseCyclic(nr_readmouse); LeaveCriticalSection(protect_mouse); end;
Цитата
Насколько я помню, можно просто вот по такому шаблону
Имена процедур действительны или ты просто привел для примера?
uses WinCrt, WinMouse, Graph;
Может wingraph? Volvo, ты пробовал запускать мою прогу? Если да, то у тебя такие же проблемы как и у меня?
--------------------
Лао-Цзы : Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
не привожу, и если я написал GetMouseState, значит, я имел в виду именно ее, а не GetMouseEvent... А во-вторых, WinGraph в стандартной поставке FPC не присутствует, а я не пользуюсь чьими-то дополнительными костылями... Именно Graph
Да, я запускал твою программу, и она у меня просто не всегда определяет нажатие кнопки мыши, а в логике работы я не разобрался, еще не совсем отошел от 3-х дневной температуры 39.5, как смогу - попробую написать точнее, что можно сделать...
А можно поинтересоваться- почему стандартный модуль mouse не работает со стандартным модулем graph?
Цитата
еще не совсем отошел от 3-х дневной температуры 39.5
Давай выздоравливай!
--------------------
Лао-Цзы : Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
Ну, модуль Graph я тоже не знаю, зачем поддерживается в FPC... Можно было и забыть уже про него - это ж только для совместимости с TP/BP, а так есть же GL/GLUT в стандартной поставке (согласись, то, что можно создать в GLUT обычному Графу и не снилось)...
А вообще-то я в FreePascal Community наткнулся на интересный способ работы с мышью - от некоего Sampsa Seppälä, который предлагал вот такое:
uses windows; var mpos: tpoint;
... getcursorpos(mpos); write(mpos.x, mpos.y); { mouse cordinates } if getasynckeystate(1) < 0 then { mouse button pressed } ...
Работает! Можно ссылочку на полное описание процедуры? А где модуль windows описан?
Цитата
а так есть же GL/GLUT в стандартной поставке (согласись, то, что можно создать в GLUT обычному Графу и не снилось).
А как они называются? Ибо у себя (ни в папке units, ни в документации) найти их не могу.
--------------------
Лао-Цзы : Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
Нет, мед - правильный, это у меня что-то неправильно..
Цитата
У тебя в папке "FPC\units\i386-win32\opengl" нет файлов GL.*, GLU.*, GLUT.*
А документация по нему отдельно идет или как?
--------------------
Лао-Цзы : Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
Лучше всего - в виде "OpenGL Programming Guide (Addison-Wesley Publishing Company) RedBook: Second Edition (The Official Guide to Learning OpenGL)" - довольно полное и понятное (по-английски, разумеется) описание основных функций с примерами использования...
По форуму пошерсти, по-моему тоже что-то на тему OpenGL проскальзывало...
Тема обработки событий уже жевалась, и не на одном форуме. http://www.freepascal.ru/forum/viewtopic.p...38ff0c577841999 SDL - в нём и видео и обработка событий. Сейчас забросил в каталог файл sdl.dll и заработало под виндовсом. Всё просто. Функцией SDL_PollEvent записываем в переменную события а потом вытаскиваем нужное. И клик мышкой и координаты курсора, всё сразу записано в одной переменной.
SKVOZNJAK, можешь чуть подробнее объяснить? Почему ты мне даешь модуль с видеорежимом? Мне же просто графический надо.. какая разница между ними? Пробовал запустить твой код с последнего месседжа - не вышло: компиляция проходит успешно, но потом, во время выполнения, вылетает с 309 ошибкой.
--------------------
Лао-Цзы : Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
Да, наверно никакой, так назвалось. И последний и предпоследний пример в 2.0.2 версии у меня запустились. Спешил, не было времени другую демку делать. Версий причин неполадок у меня 3: 1 Пример выводит на экран картинку BMP. Программа могла не найти в текущем каталоге графический файл указанного разрешения и имени файла. 2
Последний параметр в функции, сумма констант, маска. Она определяет многое, можно убирать лишние и прибавлять дополнительные константы. Если убрать SDL_FULLSCREEN, окно будет не полноэкранным. SDL_SWSURFACE - тип используемой видеорежимом памяти, можно использовать другой, прибавить константы - двойная буферизация, опенгл. Но с последней константой у меня не работало. Попробуй использовать другой тип памяти. 3 У тебя железо тянет глубину цветности 32 бита? Можно и 16 и 8 поставить.
Пример с пояснениями, без картинок. Кодировка перепуталась, но в иде норм видно.
program demo;
uses SDL, SDL_Video, SDL_Events, SDL_Mouse, crt;
const width = 800; height = 600;
{Ј«гЎЁ 梥в®бвЁ} colordepth = 32;
var screen: PSDL_Surface; event: PSDL_Event; done: Boolean; XX,YY,q,w : word;
{Ґб«Ё Ј«гЎЁ 梥в®бвЁ 16 ЎЁв, ЁбЇ®«м§®ў вм вЁЇ word, 8 - byte} Type Pixel = cardinal ; { Must have colordepth bits }
Type {ЎгдҐа ў Є®в®а®¬ Ўг¤Ґ¬ аЁб®ў вм Ја дЁЄг} { This type mimics the pixel surface srtucture: 'height' sequential rows of 'width' pixels each. } TpixelBuf = Array [0..height-1, 0..width-1] of Pixel ;
if q=1 then writeln('x Ї®§ЁжЁп Єгаб®а ', xx,', y Ї®§ЁжЁп Єгаб®а ',yy); if w=1 then writeln('Ўл« ¦ в Є« ў , Ґс бЄ Є®¤ ',xx);
delay(5000);
writeln('rfrjq tynj dsvjhf;bdf.obq vfhfpv nsrfnm d dbylt vbrhjcrjgbxtcrbt cbvdjks');
end.
Ни одного гото не используется, почти подвиг В принципе, поправить кодировочку и можно на хранение в фак, в рунете с примерами к SDL - совсем не густо.
Нет, ты не угадал. А дело было так: наверное, Fpc не проверяет существование dll-ок на этапе компиляции и по-этому не сообщает о их отсутствии, что приводит к ошибки время выполнения.
Цитата
В принципе, поправить кодировочку и можно на хранение в фак, в рунете с примерами к SDL - совсем не густо.
А сам изменить кодировку не хочешь?
Большое спасибо за пример, все работает отлично.
P.S. первому варианту можно давать любую bmp-шку? P.P.S. в документации (user.pdf - Run Time errors) не нашёл 309-ой. Откуда она взялась? P.P.P.S может действительно начать делать Faq по FreePascal?
Сообщение отредактировано: Bokul -
--------------------
Лао-Цзы : Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
С твоих слов, например, непонятно, ошибка ли это FPC/SDL/Windows?
Ухты, а я и не знал что их может быть так много. Как выяснить какая?
volvo, что думаешь насчет Faq?
--------------------
Лао-Цзы : Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
Что именно ты хочешь чтобы было в FAQ-е? Кое-какие вещи уже описывались, если есть что-то что интересует больше десятка людей (пока я не вижу особенного интереса к FPC, в основном те, кто приходит хотят программу на TP, потому что "именно на TP у него будут принимать", а делать просто так, чтобы было, не очень-то охота), и этого нельзя найти в доках - можно и написать...
Кое-какие вещи уже описывались, если есть что-то что интересует больше десятка людей
Действительно, большой аудитории заинтересованной в этом пока нет, но мы сделаем почву чтобы она появилась.
Цитата
кто приходит хотят программу на TP, потому что "именно на TP у него будут принимать", а делать просто так, чтобы было, не очень-то охота
А те кто остаются встречаются с проблемой нехватки информации о FPC. Обычно на TP программируют люди, которым программирование ** не надо или которые еще не попробовали FPC, но достаточно хорошо знают TP. Так для последних и надо сделать.
Цитата
и этого нельзя найти в доках - можно и написать...
В доках есть, наверно, все (ну почти все), но если тема не стандартная, то я думаю человек обрадуется найти немного примеров на русском.
Цитата
Что именно ты хочешь чтобы было в FAQ-е?
Продолжить уже начатую тобой Altair-ом работу, создать отдельный раздел. Ну пока можно ограничиться составлением списка вопросов. Если хочешь можно создать тему, где все это обговорим?
--------------------
Лао-Цзы : Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
Практически, хоть ХХХ Я скачивал прикольные каринки, смотрел в паинте разрешение, сохранял как bmp и подставлял в исходник нужное разрешение и имя файла.