IPB
ЛогинПароль:

> Правила раздела!

1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!

> ООП и графический редактор
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 42
Пол: Мужской

Репутация: -  0  +


Уважаемые господа!
Проблема такая - мне было задано за семестр изучить объектно ориентированное программирование и с его помощью написать какой-нибудь графический редактор.
Что такое ООП я, в принципе, изучил (спасибо литературе на этом сайте и на borlpasc.narod.ru) и написал программу, демонстрирующую его особенности (текст прилагается). Но с редактором у меня возникли ряд вопросов, которыя я не могу решить самостоятельно.
1. Для рисования чего бы то ни было мне нужно получать координаты х,у с положения курсора. Теоретически я понимаю что это делается функцией GetX, GetY, но практически так и не въехал, как ее применять. Разъясните, пожалуйста, поподробнее. Если можно, то на примере приложенной программы.
2. Сохранение и откат. Опять таки, теоретически я предполагаю, что сохранение ведется в список (видимо односвязанный), но как?
3. Может быть кто-нибудь что то похожее делал? Если остались исходники каких-нибудь модулей (интерфейс, рисование фигур и вообще все что подходит по теме) скиньте, пожалуйста, мне на почтовый ящик. Только сложностей не надо - я еще не волшебник, я только учусь smile.gif
Вообще редактор, по моему разумению должен получиться простой, без мыши, на 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.


--------------------
Все у нас получится!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
2 страниц V < 1 2  
 Ответить  Открыть новую тему 
Ответов(20 - 35)
сообщение
Сообщение #21


Бывалый
***

Группа: Пользователи
Сообщений: 282

Репутация: -  0  +


файл EGAVGA.OBJ нужен
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #22


Четыре квадратика
****

Группа: Пользователи
Сообщений: 579
Пол: Мужской

Репутация: -  4  +


Вот что вышло у меня (неделю не было то Интернета, то компьютера sad.gif )
Код

unit Image;
interface uses stack;
 const MaxStack = 100;
 type PImage = ^TImage;

 TImage = object(TStack)
   CurrColor : integer;

   {procedure WriteToFile (var filename : string);}
   procedure ReadFromFile(const filename : string);
   procedure draw;
   procedure DrawLast;
   procedure undo;
   constructor init;
 end;

implementation uses graph;

 constructor TImage.init;
 begin
   inherited init;
   CurrColor := white;
 end;

 procedure TImage.ReadFromFile(const filename: string);
 var f: file of Integer;
 begin
   assign(f, filename);
   reset(f);
   while not EOF(f) do
   begin
     inc(top);
     read(f, stk[top])
   end;
 end;

 procedure TImage.draw;
 var currOp: byte;
 begin
   currOp:=1;
   while CurrOp < top do
   begin
     if stk[CurrOp]= -1 then begin {-1 = PutPixel}
            PutPixel(stk[CurrOp+1], stk[CurrOp+2], CurrColor);
            CurrOp:=CurrOp+3
          end else
     if stk[CurrOp] = -2 then begin {-2 = Circle}
            Circle(stk[CurrOp+1], stk[CurrOp+2], stk[CurrOp+3]);
            CurrOp:=CurrOp+4
          end else
     if stk[CurrOp] = -3 then begin
            CurrColor:=stk[CurrOp+1];
            SetColor(CurrColor);
            CurrOp:=CurrOp+2
        end;
   end;
 end;

 procedure TImage.DrawLast;
 var CurrOp: integer;
 begin
   CurrOp:=top;
   while stk[CurrOp]>0 do dec(CurrOp);
   if stk[CurrOp]= -1
       then  {-1 = PutPixel}
            PutPixel(stk[CurrOp+1], stk[CurrOp+2], CurrColor)
       else if stk[CurrOp] = -2
               then  {-2 = Circle}
                    Circle(stk[CurrOp+1], stk[CurrOp+2], stk[CurrOp+3]);
 end;

 procedure TImage.undo;
 begin
   while stk[top]>0 do dec(top);
   dec(top);
 end;

end.

Только он вроде иногда путает координаты - x и y, когда достает их из стека.

ЗЫ: Интерфейс стека:

Код

unit Stack;

interface

type TStack = object
 stk : array[1..100] of Integer;
 top : integer;

 procedure push(x: integer);
 function pop : integer;
 function GetTopElem : integer;

 constructor init;
end;


--------------------
Закон добровольного труда Зимерги:
Люди всегда согласны сделать работу, когда необходимость в этом уже отпала
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #23


Четыре квадратика
****

Группа: Пользователи
Сообщений: 579
Пол: Мужской

Репутация: -  4  +


А сама программа в простейшем случае выглядит примерно так:
Код

uses image, screen, crt, graph;
var img1   : PImage;
   scr    : PScreen;
   i, n   : integer;
   code   : string[20];
   tmpstr : string;
begin
 new(img1,init);
 new(scr, init);

 repeat
   ReadLn(code); gotoxy(1,1);
   if code = 'circle' then begin
                             img1^.push(-2);
                             for i:=1 to 3 do begin
                               Read(n); img1^.push(n);
                             end;
                             img1^.DrawLast;
                           end else
   if code = 'pixel'  then begin
                             img1^.push(-1);
                             for i:=1 to 2 do begin
                               Read(n); img1^.push(n);
                             end;
                             img1^.DrawLast;
                           end else
   if code = 'undo'   then begin
                             img1^.undo;
                             scr^.clear;
                             img1^.draw
                           end else
   if code = 'open'   then begin
                             Read(tmpstr);
                             img1^.ReadFromFile(tmpstr);
                           end else
   if code = 'color' then begin
                             img1^.push(-3);
                             Read(n); img1^.push(n);
                          end;


 until code = 'quit';

 dispose(scr, done);
end.

Пока это все рисует только точки и круги smile.gif


--------------------
Закон добровольного труда Зимерги:
Люди всегда согласны сделать работу, когда необходимость в этом уже отпала
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #24


Четыре квадратика
****

Группа: Пользователи
Сообщений: 579
Пол: Мужской

Репутация: -  4  +


Ау! Есть тут кто живой? Куда делся автор этой темы ???


--------------------
Закон добровольного труда Зимерги:
Люди всегда согласны сделать работу, когда необходимость в этом уже отпала
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #25


Новичок
*

Группа: Пользователи
Сообщений: 42
Пол: Мужской

Репутация: -  0  +


Прошу прощения за молчание - были проблемы с бесплатным интернетом.
Судя по потере и без того неважной активности, можно подводить итоги.
Спасибо всем принявшим участие, но на первые два вопроса я ответы так и не получил.
Что касается исходников, то для предложенного Sand'ом нужен некий файл egavga.obj (я даже разрешение такое вижу в первый раз), а произведение Trminator'а я не смог попробовать, так как не знаю как сделать файл *.tpu ???
Самостоятельно за это время я тоже ничего нового не изобрел sad.gif
А в сентябре сдавать :'(
Все это наводит на грустные мысли.
Модераторы, ... ... ..., кончайте свои разборки, примите посильное участие!!!


--------------------
Все у нас получится!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #26


Бывалый
***

Группа: Пользователи
Сообщений: 282

Репутация: -  0  +


сначала надо выбрать путь решения потом кодить
так какой путь ты выбрал?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #27


Новичок
*

Группа: Пользователи
Сообщений: 42
Пол: Мужской

Репутация: -  0  +


Alex'у
Все свои пожелания я уже высказал.
Твоя идея с квадратиками конечно хороща, но где ты здесь видишь ООП? А основная цель - как раз ООП.


--------------------
Все у нас получится!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #28


Пионер
**

Группа: Пользователи
Сообщений: 95
Пол: Мужской

Репутация: -  1  +


tpu - это скомпиленный модуль
egavga.bgi стандартно подключай (bgi а не obj - так норм-но сойдёт)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #29


Бывалый
***

Группа: Пользователи
Сообщений: 282

Репутация: -  0  +


да объекты куда-нибудь засунули бы для галки если бы они так не потребовались...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #30


Новичок
*

Группа: Пользователи
Сообщений: 42
Пол: Мужской

Репутация: -  0  +


tpu - это скомпиленный модуль
egavga.bgi стандартно подключай (bgi а не obj - так норм-но сойдёт)
А поподробнее нельзя?
Я пытался скомпилировать модули, но он выдает ошибку (неправильное окончание).
А стандартно подключить - это как.

Alex! Ну что ты как дите! Препод у меня не лох, а стандартный программер - с нечесанными власами и полной неспособностью что-нибудь объяснить по-русски. Он такую фишку просечет сразу и заставит переделывать.


--------------------
Все у нас получится!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #31


Бывалый
***

Группа: Пользователи
Сообщений: 282

Репутация: -  0  +


там будут объекты не бойся
хотя бы объект - стрелка  ;D
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #32


Четыре квадратика
****

Группа: Пользователи
Сообщений: 579
Пол: Мужской

Репутация: -  4  +


По поводу подключения модулей:
Ругаться он должен только на stack - там же только интерфейс модуля, т.е. что там хоть такое есть, без его реализации. Я считал, что стек ты сделаешь сам, если будет проблема - обращайся, но ИМХО сделать ты его должен сам

И еще кидаю модуль screen - совсем про него забыл...
Код

unit Screen;
interface uses graph;
 type PScreen = ^TScreen;

 TScreen = object
   maxx, maxy : integer;

   constructor init;
   destructor done;
   procedure clear;
 end;

implementation
 constructor TScreen.init;
 var d, m:integer;
 begin
   d:=0;
   initgraph(d, m, 'c:bpbgi'); {Кстати, так подключается графика}
{тут я не указываю явно, каким именно bgi-шником пользоваться,
 но он автоматически подключит тот самый egavga.bgi, используется автоопределение найболее подходящего драйвера
(в строчке d:=0)}
   maxx:=GetMaxX; maxy:=GetMaxY
 end;

 destructor TScreen.done;
 begin
   CloseGraph
 end;

 procedure TScreen.clear;
 begin
   ClearDevice;
 end;

begin
end.


--------------------
Закон добровольного труда Зимерги:
Люди всегда согласны сделать работу, когда необходимость в этом уже отпала
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #33


Бывалый
***

Группа: Пользователи
Сообщений: 282

Репутация: -  0  +


чё за бред объявлять конструкторы/деструкторы там где нет вирт-ых
и(или) дин-их методов? ;D
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #34


Четыре квадратика
****

Группа: Пользователи
Сообщений: 579
Пол: Мужской

Репутация: -  4  +


Что значит - бред? Я это делал чтобы графика автоматом подключалась, когда я инициализирую scr в главной программе (new(scr, init)).

ЗЫ Извиняюсь если что не так - на Паскале в ООП я не супер.


--------------------
Закон добровольного труда Зимерги:
Люди всегда согласны сделать работу, когда необходимость в этом уже отпала
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #35


Пионер
**

Группа: Пользователи
Сообщений: 62
Пол: Мужской

Репутация: -  1  +


Хм. А я наверное и не в состоянии объяснить как я это написал. Давно это было.  :(
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #36


Гость






Why Is Propecia So Expensive
 К началу страницы 
+ Ответить 

2 страниц V < 1 2
 Ответить  Открыть новую тему 
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 4.06.2024 10:35
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name