Проблема такая - мне было задано за семестр изучить объектно ориентированное программирование и с его помощью написать какой-нибудь графический редактор.
Что такое ООП я, в принципе, изучил (спасибо литературе на этом сайте и на 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.
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.