C.Ю.Соловьев

Методические материалы
по курсу
"Алгоритмы и алгоритмические языки"

Программа курса  >>  Пример "большой" программы  >>  Модуль DESK_FMS

(* DESK_FMS использует: MENU_FMS  *)
(*                      TYPE_FMS  *)

{$A+,B-,D-,E+,F-,G-,I+,L+,N-,O-,R+,S+,V+,X-}
{$M 16384,0,65536}
Unit DESK_FMS;

                   INTERFACE

Uses  MENU_FMS, TYPE_FMS;

VAR     FirstWork : integer;  {                - первый    рабочий элемент }
        mLastWork : integer;  { Kall-mLastWork - последний рабочий элемент }

    FIS : array [1..2] of integer;  { Селектор строки }
          { FIS[1] = 0 | номер в BDS                  }
          { FIS[2] = 0 | номер в BDS - второго уровня }

    CKEY : String;      { Для хранения значений ключевых полей }

    LaLa : String[80];  { Последняя, 25-я строка редактора- Меню функций }

procedure WherElt(E : integer; var F,D : integer);

procedure    HOPMA(O : pMenuRec);
procedure SearCurs(O : pMenuRec);

                   IMPLEMENTATION

procedure HOPMA(O : pMenuRec);
begin   with O^ do begin
           if (Curs = 1) and (0 < Base) then begin
               Inc(Curs);
               Dec(Base);
               Exit
            end;
            if (Curs = Kscr) and (Base+Curs < Kall) then begin
               Dec(Curs);
               Inc(Base)
            end
         end                                               end;

procedure WherElt(E : integer; var F,D : integer);
   var I,J,L : integer;
begin   L:=0;
        F:=1;
        D:=1;
        with MEAD^ do
        for I:=1 to HSF do
        for J:=1 to BDS[I].CR_FRX do begin
           L:=L+1;
           if TSTMAP(L) then begin
              E:=E-1;
              if E = 0 then begin
                 F:=I;
                 D:=J;
                 Exit
              end
           end
        end                                   end;

function KOMMEHTA(E : integer) : boolean;
   var F,N : integer;
begin   WherElt(E,F,N);
        KOMMEHTA:=(MEAD^.BDS[F].DTL = NIL)   end;

procedure SearCurs(O : pMenuRec);
   var I : integer;
   function Lucru(C : integer) : boolean;
   begin  Lucru:=false;
          if        C < 1        then Exit;
          if O^.OnScr < C        then Exit;
          if KOMMEHTA(O^.Base+C) then Exit;
          Lucru:=true;
          O^.Curs:=C;
          HOPMA(O)
   end;
begin   with O^ do begin
           if not KOMMEHTA(Base+Curs) then Exit;
           for I:=1 to Kscr-1 do begin
              if Lucru(Curs-I) then Exit;
              if Lucru(Curs+I) then Exit
           end
        end                                 end;

end.

Вопросы?