Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > Объекты в паскале. Глубже!


Автор: sh_iv 10.4.2007, 14:18
Сделал такой модуль:
Код

uses crt;

type
    TMenu = object
          X,Y: integer;
          Color: word;
          Name: string;
          Deystvie: string;
          MType: char;
          Nomber: integer;
          Constructor Init (aX,aY: integer; aColor: word);
          Procedure AddPunct (aName: string; aDeystvie: string);
          Procedure ViewPunct(aNomber: integer);
          Procedure ViewAll(aMType: char);
          Procedure ViewPunctAction(aNomber: integer);
    end;

    PtrRec = ^Rec;
    Rec = record
        Element : string;    {поле данных}
        pNext : PtrRec;    {прямой указатель}
        pPrev : PtrRec;    {обратный указатель}
      End;

    PtrRecD = ^RecD;
    RecD = record
        Deystv : string;    {поле данных}
        pNextD : PtrRecD;    {прямой указатель}
        pPrevD : PtrRecD;    {обратный указатель}
      End;

var pBegin,pEnd : PtrRec;
    pBeginD,pEndD : PtrRecD;
    x,y:integer;

Implementation

Constructor TMenu.Init;

begin
x:=aX;
y:=aY;
TextColor(aColor);

New (pBegin);
pBegin^.pNext := Nil;
pBegin^.pPrev := Nil;
pEnd := pBegin;

New (pBeginD);
pBeginD^.pNextD := Nil;
pBeginD^.pPrevD := Nil;
pEndD := pBeginD;

end;


Procedure TMenu.AddPunct;

begin

New (pEnd^.pNext);
pEnd^.pNext^.pPrev := pEnd;
pEnd := pEnd^.pNext;
pEnd^.pNext := Nil;
pEnd^.Element := aName;

New (pEndD^.pNextD);
pEndD^.pNextD^.pPrevD := pEndD;
pEndD := pEndD^.pNextD;
pEndD^.pNextD := Nil;
pEndD^.Deystv := aDeystvie;

end;

Procedure TMenu.ViewPunct;
var pAux : PtrRec;
    i:integer;
begin
 i:=0;

 if aNomber = 0 then Write ('0 is a wrong nomber. [1..n] expected');


 if aNomber = 1 then
    begin
         pAux := pBegin^.pNext;
         Write (pAux^.Element:10);
    end
  else
      begin
      pAux := pBegin^.pNext;
      for i:=1 to aNomber-1 do
          begin
               pAux := pAux^.pNext;
               if pAux = Nil then
                  begin
                       writeln('ERROR: Nomber is too large');
                       i:=0;
                       break;
                  end;
          end;
      if i <> 0 then Write (pAux^.Element:10);
      end;

 readln;
end;

Procedure TMenu.ViewPunctAction;
var pAuxD : PtrRecD;
    i:integer;
begin
 i:=0;

 if aNomber = 0 then Write ('0 is a wrong nomber. [1..n] expected');


 if aNomber = 1 then
    begin
         pAuxD := pBeginD^.pNextD;
         Write (pAuxD^.Deystv:10);
    end
  else
      begin
      pAuxD := pBeginD^.pNextD;
      for i:=1 to aNomber-1 do
          begin
               pAuxD := pAuxD^.pNextD;
               if pAuxD = Nil then
                  begin
                       writeln('ERROR: Nomber is too large');
                       i:=0;
                       break;
                  end;
          end;
      if i <> 0 then Write (pAuxD^.Deystv:10);
      end;

 readln;
end;

Procedure TMenu.ViewAll;
var pAux : PtrRec;
    i:integer;

begin
 i:=0;
 gotoxy(x,y);
 pAux := pBegin^.pNext;
 Write (pAux^.Element:10);
 pAux := pAux^.pNext;
 While pAux <> Nil do
     Begin
        if aMType = '1' then
           begin
                i:=i+1;
                gotoxy(x,y+i);
           end;
        Write (pAux^.Element:10);
        pAux := pAux^.pNext;
     End;

 readln;
end;

end.


Вместо ViewAll(aMType: char); нужна конструкция ViewAll.Horizontal; или ViewAll.Vertical;

Ребят, подскажите как...

Автор: ama_kid 10.4.2007, 17:26
Цитата
Вместо ViewAll(aMType: char); нужна конструкция ViewAll.Horizontal; или ViewAll.Vertical;
Прям напрямую через точку? Имхо, так нельзя - синтаксис не позволит...
Выхода я вижу два:
1) Ввести в объект приватный член TypeOfView:TTypeOfView = (tovHorizontal, tovVertical). Ввести метод SetViewType(Type:TTypeOfView), который будет устанавливать текущий режим просмотра. Ну и сначала вызывать этот метод , а затем просто вызывать ViewAll без параметров, а внутри этой функции проверять значение данного приватного параметра и выводить в соответствии с ним. На мой взгляд это самое правильное, но кому как... smile 
2) Реализовать в объекте две дополнительные функции ViewAsHorizontal и ViewAsVertical, которые будут обращаться к функции ViewAll с соответствующим параметром. Тогда вызов будет MyMenu.ViewAsHorizontal и MyMenu.ViewAsVertical

P.S. Ну и никто не мешает совместить эти два способа... smile 

Автор: sh_iv 11.4.2007, 11:28
Забыл еще написать, что эти две функции (вывода горизонтального и вертикального меню) нужно в отдельный модуль запихнуть...

Автор: sh_iv 12.4.2007, 12:28
решил. Спасибо

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