![]() |
1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!
![]() ![]() |
![]() |
demon9999 |
![]()
Сообщение
#1
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 42 Пол: Мужской Репутация: ![]() ![]() ![]() |
Уважаемые господа!
Проблема такая - мне было задано за семестр изучить объектно ориентированное программирование и с его помощью написать какой-нибудь графический редактор. Что такое ООП я, в принципе, изучил (спасибо литературе на этом сайте и на borlpasc.narod.ru) и написал программу, демонстрирующую его особенности (текст прилагается). Но с редактором у меня возникли ряд вопросов, которыя я не могу решить самостоятельно. 1. Для рисования чего бы то ни было мне нужно получать координаты х,у с положения курсора. Теоретически я понимаю что это делается функцией GetX, GetY, но практически так и не въехал, как ее применять. Разъясните, пожалуйста, поподробнее. Если можно, то на примере приложенной программы. 2. Сохранение и откат. Опять таки, теоретически я предполагаю, что сохранение ведется в список (видимо односвязанный), но как? 3. Может быть кто-нибудь что то похожее делал? Если остались исходники каких-нибудь модулей (интерфейс, рисование фигур и вообще все что подходит по теме) скиньте, пожалуйста, мне на почтовый ящик. Только сложностей не надо - я еще не волшебник, я только учусь ![]() Вообще редактор, по моему разумению должен получиться простой, без мыши, на hot key's. Типа "ручки-ножки-огуречик". Заранее благодарен. Код Program OPP1; Uses Crt, Graph; Var gd,gm:integer; Ch: Char; S: Boolean; Const Instr = 'УПРАВЛЕНИЕ ДВИЖЕНИЕМ - СТРЕЛКИ, ПЕРЕХОД - END, ВЫХОД - ESC'; Type Tp=Object {объект - точка} X,y,c : integer; Constructor Init(ax,ay:integer;ac:word); Procedure Show; Virtual; Procedure Hide; Virtual; Procedure Moveto(dx: integer); End; Constructor Tp.Init; Begin X:=ax; y:=ay; c:=ac; End; Procedure Tp.Show; Begin Putpixel(x,y,c); End; Procedure Tp.Hide; Begin Putpixel(x,y,Getbkcolor) End; Procedure Tp.Moveto; Begin repeat s:=true; Ch := ReadKey; Case Ch of #27: begin CloseGraph; Halt end; { выход по клавише ESC } #75: begin Hide; X := X-dx end; {изменение координат x, y нажатием стрелок} #77: begin Hide; X := X+dx end; {"влево", "вправо", "вверх", "вниз" } #72: begin Hide; Y := Y-dx end; #80: begin Hide; Y := Y+dx end; #79: S := false; {переход кнопкой END} end; Show; until s = false; Hide; End; Type Tc=Object(Tp) {объект - круг (наследник)} r : integer; Constructor Init(ax,ay,ar:integer;ac:word); Procedure Show; Virtual; Procedure Hide; Virtual; End; Constructor Tc.Init; Begin Inherited Init(ax,ay,ac); {наследование инициализации} R:=ar End; Procedure Tc.Show; {рисование круга} Begin Setcolor( c ); Circle(x,y,r); SetFillStyle(solidfill, red); FloodFill(x,y, red); End; Procedure Tc.Hide; Begin Setcolor(GetBkColor); Circle(x,y,r); SetFillStyle(solidfill, GetBkColor); FloodFill(x,y, GetBkColor); End; Var T: Tp; C: Tc; Begin gd:=detect; initgraph(gd,gm,'c:tpbgi'); SetBkColor(White); SetColor(blue); Rectangle(50, 425, 600, 460); {рисование рамки} OutTextXY(90, 440, Instr); T.Init(125,125,Magenta); {инициализация 1 объекта} T.Show; {прорисовка объекта} T.MoveTo(15); {движение объекта} C.Init(125,125,15,red); {инициализация объекта 2} C.Show; {прорисовка объекта 2} While True do begin C.Moveto(15); {движение объекта 2 } end; end. -------------------- Все у нас получится!
|
___ALex___ |
![]()
Сообщение
#2
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 282 Репутация: ![]() ![]() ![]() |
чё-то я себе не больно представляю рисование без мыши?
как это? или он должен работать так неудобно типа: выбрал режим - линия, указываешь две точки - нажимаешь ещё что-нить он тебе рисует линию через две точки, выбрал режим круг - указал центр - нажал "нажимаешь ещё что-нить" - нарисовался круг такой примитив тебе нужен? а с ООП тебе ещё надо разбираться и разбираться... |
demon9999 |
![]()
Сообщение
#3
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 42 Пол: Мужской Репутация: ![]() ![]() ![]() |
Alex'у
Во-первых, мне действительно нужен примитив, т.к. я не в состоянии быстро разобраться с мышом и программами под мыша в Паскале. А для студента-заочника, по непрофильному курсу, хватит и примитива. Во-вторых, мне еще многов чем разбираться, я и не хвастаю мастерством. И, в-третьих, а по существу вопроса ты что-нибудь можешь сказать? -------------------- Все у нас получится!
|
___ALex___ |
![]()
Сообщение
#4
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 282 Репутация: ![]() ![]() ![]() |
давай всё по порядку:
графдрайвер, а вместе с ним и графрежим автоматически (Detect), то использовать в программе абсолютные координаты не нужно, так как режим может "выставиться" какой угодно и твоя программа будет выводить графику неправильно. Используй GetMaxX, GetMaxY либо выбирай конкретный режим. |
demon9999 |
![]()
Сообщение
#5
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 42 Пол: Мужской Репутация: ![]() ![]() ![]() |
Alex'у по порядку:
-------------------- Все у нас получится!
|
___ALex___ |
![]()
Сообщение
#6
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 282 Репутация: ![]() ![]() ![]() |
лучше б ты на Delphi писал проблем бы заметно поубавилось
кстати щас вроде вся учёба закончилась?( у меня винт недавно полетел, так что щас Турбо Паскаля нет пришли мне его по почте(только всё самое необходимое)там "покумекаем" в архиве зашли вот мыло ___ALex___@inbox.ru |
Noname |
![]()
Сообщение
#7
|
Гость ![]() |
скачать можно тут
http://pascal.dax.ru/?go&id=9 |
AlaRic |
![]()
Сообщение
#8
|
... ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 347 Пол: Мужской Репутация: ![]() ![]() ![]() |
Интересная тема! Пишите, а мы подкорректируем, если конечно сможем ;)
|
___ALex___ |
![]()
Сообщение
#9
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 282 Репутация: ![]() ![]() ![]() |
ну чё Паскаль я добыл(
AlaRic подключайся? :D |
AlaRic |
![]()
Сообщение
#10
|
... ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 347 Пол: Мужской Репутация: ![]() ![]() ![]() |
Я сейчас правда сайтом занят, но постараюсь помочь!
|
trminator |
![]()
Сообщение
#11
|
Четыре квадратика ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 579 Пол: Мужской Репутация: ![]() ![]() ![]() |
В работе. Делаю наподобие PostScript (основано на стеке) - следовательно, векторное и простой откат любой глубины
-------------------- Закон добровольного труда Зимерги:
Люди всегда согласны сделать работу, когда необходимость в этом уже отпала |
___ALex___ |
![]()
Сообщение
#12
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 282 Репутация: ![]() ![]() ![]() |
автор сабжа пропал давно
|
AlaRic |
![]()
Сообщение
#13
|
... ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 347 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата автор сабжа пропал давно Не сказал бы. Кажется у него некоторые трудности: http://pascal.dax.ru/?gb |
demon9999 |
![]()
Сообщение
#14
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 42 Пол: Мужской Репутация: ![]() ![]() ![]() |
Я не пропал, я просто терпеливо жду, когда в обсуждении появится какой-нибудь ответ на какой-либо из моих вопросов.
Мы просто приходим на форум в разное время из за разницы в часовых поясах (весьма большой, кстати) ![]() -------------------- Все у нас получится!
|
demon9999 |
![]()
Сообщение
#15
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 42 Пол: Мужской Репутация: ![]() ![]() ![]() |
Да. И не надо все усложнять. Если подключить мышь, проработать интерфейс, сделать все очень красиво и векторно, то получится что-то вроде http://pascal.hop.ru/Arhives/Edit.zip
Только я не в состоянии понять, как это работает :'( А я не могу (и не хочу) сдавать то, что я несмогу объяснить. Стар я уже стал краснеть перед преподавателем, который лет на 10 меня моложе ;) -------------------- Все у нас получится!
|
___ALex___ |
![]()
Сообщение
#16
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 282 Репутация: ![]() ![]() ![]() |
ты по малу спрашивай что нужно!(
![]() а то каждый раз на форум заходить... |
___ALex___ |
![]()
Сообщение
#17
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 282 Репутация: ![]() ![]() ![]() |
а если хочешь хороший интерфейс, то надо писать на Delphi или в какой-нибудь другой визуальной среде с ООП языком
|
demon9999 |
![]()
Сообщение
#18
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 42 Пол: Мужской Репутация: ![]() ![]() ![]() |
В своем первом сообщении (см.выше) я поставил, по-моему, вполне конкретные вопросы.
Я ведь не прошу написать за меня программу, я постараюсь сделать это сам. Просто в процессе работы столкнулся с трудностями, которые не могу сам разрешить, поэтому обратился на форум. Я не слишком уж туп, как мне кажется ;) и вполне смогу сообразить что к чему, если популярно объяснят. Но пока, за 10 дней, ничего по-существу. Alex, ты меня извини, но по-моему я и так расписал уже, подробней некуда. -------------------- Все у нас получится!
|
___ALex___ |
![]()
Сообщение
#19
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 282 Репутация: ![]() ![]() ![]() |
может быть сделаем так!?:
разобьём экран (площадку вывода графики) на квадратики (создадим сетку) - размер квадратика - выбирает юзер. Создаём объект - стрелку - типа как в винде пользователь с помощью неё будет управлять позицией вывода соответственно указав на нужный квадратик этой стрелкой и выбрав соответствующий цвет и нажав клавишу какую-нибудь этот квадратик закрашивается в этот цвет. Так будет строится изображение. Достаточно примитивно, но это же учебный пример!!! К тому же насколько я понял в условии задачи не сказано что этот редактор должен рисовать круги и тд рисовать-то круги (и окружности) с помощью него можно будет, но они будут "квадратными", но опять повторяясь говорю - это же учебный пример! Зато мы сможешь легко сохранить изображение в файле - точнее то, как его заново нарисовать - будем сохранять координаты квадратиков (в соответствии с выбранным масштабом, он тоже будет храниться в файле) и соответствующие им цвета, так из этого файла мы сможем легко восстановить изображение. И откаты в проге тоже будет легко делать - будем сохранять координаты квадратиков (либо номера, но это щас не суть, в ходе реализации решим) с цветами в динамическом массиве соответственно сможем легко делать откат любой глубины. Одно осталось в стороне - "Сохранение должно быть векторным" что это значит я точно сам не знаю(с графикой немного работал) но предлагаю на это забить как такой вариант? |
sandman |
![]()
Сообщение
#20
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 101 Пол: Мужской Репутация: ![]() ![]() ![]() |
есть наработки в этой области. может быть кому-нибудь будет интересно... :)
http://www.sandman.by.ru/pas/src.html -------------------- Плавают разными стилями, тонут-одним (ц) Кирпичи
|
![]() ![]() |
![]() |
Текстовая версия | 27.07.2025 11:09 |