Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Pascal] Объекты


Автор: neic 25.12.2009, 16:22
Вот код программы:
Код

PROGRAM Objects_Varl3;
USES Graph,Crt;
 TYPE
TLOCATION=OBJECT
        x,y:INTEGER;
        CONSTRUCTOR Init (initx,inity:integer);
        DESTRUCTOR Done;
    END;
TPOINT=OBJECT (TLOCATION)
    PROCEDURE Show (color:BYTE); VIRTUAL;
    PROCEDURE Hide;VIRTUAL;
    PROCEDURE MoveTo (newx, newy: INTEGER;color:BYTE) ;
       END;
TTREUG=OBJECT(TPOINT)
    a,b: INTEGER;
    CONSTRUCTOR Init (initx, inity: INTEGER) ;
    PROCEDURE Show (color: BYTE) ; VIRTUAL;
    PROCEDURE Hide; VIRTUAL;
       END;
TGRAPH=OBJECT
    grdriver:INTEGER;
    grmode:INTEGER;
    PROCEDURE Init (gb, gm: INTEGER;path:STRING) ;
    PROCEDURE Fin;
       END;
CONSTRUCTOR TLOCATION. Init (initx, inity: INTEGER) ;
BEGIN
    x:=initx;
    y:=inity;
END;
DESTRUCTOR TLOCATION.Done;
BEGIN
  WriteLn;
end;
PROCEDURE TPOINT.Show(color:BYTE);
Begin
      PutPixel(x,y,color);
END;
PROCEDURE TPOINT.Hide;
Begin
    PutPixel (x, y, GetBkColor);
end;
PROCEDURE TPOINt.Moveto(newx,newy:integer;color:BYTE);
BEGIN
hide;
X:=newx;
y:=newy;
Show(color);
End;
Procedure Tgraph.init(gb,gm:integer;path:string);
BEGIN
    grdriver:=gb;
    grmode:=gm;
    IniTGraph(grdriver,grmode, path);
END;
PROCEDURE TGRAPH.Fin;
BEGIN
    CloseGraph;
END;
CONSTRUCTOR TTREUG.Init (initx, inity: INTEGER);
BEGIN
    TPOINT.Init(initx,inity);
END;

PROCEDURE TTREUG.Show(color:BYTE);
BEGIN
    SetColor(Color);
    SetFillStyle(1,color);
    circle(x,y,20);
    FloodFill(x+2,y+2,color);
END;
PROCEDURE TTREUG.Hide;
BEGIN
    SetColor (GetBkColor);
    SetFillStyle(1,GetBkColor);
    circle(x,y,20);
    FloodFill(x+2,y+2,GetBkColor);
    SetColor(GetColor);
END;
VAR
    pt:TTREUG;
    world:TGRAPH;
    x,y:INTEGER;
    col:BYTE;
    ax,bx,ay,by,rad:INTEGER;
    px,py,v:byte;
    alf:REAL;
Begin
  CLRSCR;
  WriteLn('DVIZENIE ZAKRASHENNOGO KRUGA PO KRAJU EKRANA');
  col:=12;
  Write('ENTER');
  readln;
  World.Init(DETECT,DETECT,'C: \TP7\BGI');
  Delay(1000);
  X:=20;
  Y:=20;
  pt.Init(x,y);
  rad:=20;
  pt.Show(col);
  Delay(10000);
  readkey;
  ax:=20;
  bx:=640;
  ay:=20;
  by:=480;
  px:=5;
  py:=5;
  v:=1;
  REPEAT
    Delay(800);
    x:=Round(ax);
    Y:=Round(ay);
    if v=1 then
    begin
        ax:=ax+px;
        if ax>=bx-20 then
        begin
            v:=2;
        end;
    end;

    if v=2 then
    begin
        ay:=ay+py;
        if ay>=by-20 then
        begin
            v:=3;
        end;
    end;

    if v=3 then
    begin
        ax:=ax-px;
        if ax<=20 then
        begin
            v:=4;
        end;
    end;

    if v=4 then
    begin
        ay:=ay-py;
        if ay<=20 then
        begin
            v:=1;
        end;
    end;


    pt.MoveTo(x,y,col);
  UNTIL KeyPressed;
  World.Fin;
END.


Не могу понять как передать из программы объекту радиус.

Нужно сделать с использованием динамической и оперативной памяти.

Автор: volvo877 25.12.2009, 17:46
neic, 
1) почему объект с названием TTreug занимается перемещением круга? Только мне кажется, что название больше подходит для треугольника?
2) измени конструктор этого самого объекта, добавь в него еще и радиус, и будешь иметь возможность передать его объекту.

Автор: neic 25.12.2009, 19:22
Код

TTREUG=OBJECT(TPOINT)
    a,b: INTEGER;
    CONSTRUCTOR Init (initx, inity,radius: INTEGER) ;
    PROCEDURE Show (color: BYTE; radius:INTEGER) ; VIRTUAL;
....

CONSTRUCTOR TTREUG.Init (initx, inity,radius: INTEGER);
BEGIN
    TPOINT.Init(initx,inity);
END;

PROCEDURE TTREUG.Show(color:BYTE; radius:Integer);
BEGIN
    SetColor(Color);
    SetFillStyle(1,color);
    circle(x,y,radius);
    FloodFill(x+2,y+2,color);
END;

PROCEDURE TTREUG.Hide;
BEGIN
    SetColor (GetBkColor);
    SetFillStyle(1,GetBkColor);
    circle(x,y,radius);
    FloodFill(x+2,y+2,GetBkColor);
    SetColor(GetColor);
END;
....
pt.Show(col,rad); {rad = радиус, объявляется в VAR самой программы}
....

Всё правильно исправил? Просто с компа гостей вышел.

Цитата(volvo877 @  25.12.2009,  17:46 Найти цитируемый пост)
1) почему объект с названием TTreug занимается перемещением круга? Только мне кажется, что название больше подходит для треугольника?

Это лишь название взято из примера =) Просто лень было менять.

Автор: volvo877 25.12.2009, 20:37
Цитата(neic @  25.12.2009,  18:22 Найти цитируемый пост)
Всё правильно исправил?

И чего ты добился? Менять - так уж вот так:

Код
type
TTREUG=OBJECT(TPOINT)
    a,b: INTEGER;
    r: integer;
    CONSTRUCTOR Init (initx, inity, radius: INTEGER) ;

CONSTRUCTOR TTREUG.Init (initx, inity, radius: INTEGER);
BEGIN
    TPOINT.Init(initx,inity);
    R := radius;
END;
PROCEDURE TTREUG.Show(color:BYTE);
BEGIN
    SetColor(Color);
    SetFillStyle(1,color);
    circle(x,y,R);
    FloodFill(x+2,y+2,color);
END;
Твой вариант компилироваться не будет: ты меняешь сигнатуру виртуального метода. Тебе этого делать никто не разрешит...

Автор: neic 25.12.2009, 21:19
volvo877
спасибо, понял.

Ещё одни вопрос по заданию, можно ли как-то в паскале узнать его максимально разрешение.

Почему задаю такой вопрос? Просто на моём компе оно 640 на 480, на нетбуках 1024 на 768.

Автор: volvo877 25.12.2009, 21:50
Цитата(neic @  25.12.2009,  20:19 Найти цитируемый пост)
Просто на моём компе оно 640 на 480
А если попробовать использовать не EGAVGA.BGI, а какой-нибудь другой драйвер, у тебя что, программа не запустится? Запустится, и 800*600 и 1024*768 из-под Турбо-Паскаля запускали.

Тебе надо после инициализации граф. режима определить максимальные значения по X и по Y? Для этого существует GetMaxX/GetMaxY:
Код
  pt.Show(col);
  Delay(10000);
  readkey;
  ax:=20;
  bx:=GetMaxX; { <--- Раз }
  ay:=20;
  by:=GetMaxY; { <--- Два }
, и работаешь хоть на 320*200, хоть на 1024*768

Автор: neic 26.12.2009, 01:13
volvo877
ещё раз спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)