Advertisement
Swiftkill

TPU Interface

Oct 2nd, 2019
238
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 20.69 KB | None | 0 0
  1. {***************************************************************************}
  2. {*                                                                         *}
  3. {*  INTRFACE.PAS        Модуль поддержки пользовательского интерфейса      *}
  4. {*  Ярослав Стерхов 1997 МТ7-21                 Турбо-Паскаль 5.0/7.0      *}
  5. {*                                                                         *}
  6. {***************************************************************************}
  7. {$M 65520,0,655360}
  8. UNIT IntrFace;
  9. INTERFACE
  10. USES CRT,Screen;
  11. {* ОБЩИЕ СТРОКИ *}
  12. CONST
  13.   gStrings :ARRAY[1..4] OF STRING[80] = (
  14.     'Большая программа Ярослава Стерхова, 1997',
  15.     'F1 - О Программе      - Перемещение   <┘ - Выбор',
  16.     'Esc - Выход из справки                          ',
  17.     'Tab - Переключение   Esc - Выход    <┘ - Выбор  '
  18.     );
  19.  
  20. {* РАБОТА С МЕНЮ *}
  21. CONST
  22.   MaxLen     = 18;
  23.   MenuMargin = 2;                  {Поле отступа}
  24.   MenuWidth = MaxLen+MenuMargin*2; {Максимальная длина строки + поле отступа}
  25.   MenuCount = 4;                   {Кол-во элементов в меню}
  26.  
  27. {Элемент меню}
  28. TYPE
  29.   THelpType = procedure;
  30.   TMenuItem = RECORD
  31.                 Name   :String[MaxLen];  { Название }
  32.                 KeyInd :Byte;            { Номер подсвеченного символа }
  33.                 Key    :SET OF Char;     { Ключевые символы }
  34.                 Proc   :Procedure;       { Вызываемая процедура}
  35.               END;
  36.   {Индекс меню}
  37.   Index     = 1..MenuCount;
  38.   {Массив меню}
  39.   TMenuData = ARRAY[1..MenuCount] OF TMenuItem;
  40.  
  41. {Инициализация интерфейса}
  42. PROCEDURE InitInterFace;
  43. {Основная помощь}
  44. PROCEDURE HelpOnProgram;
  45. {Запуск меню}
  46. PROCEDURE DoMenu(Title:String;Data:TMenuData; HelpProc:THelpType);
  47.  
  48. {* РАБОТА С ДИАЛОГАМИ *}
  49. TYPE
  50.   {функция, контролирующая правильность ввода }
  51.   {должна возвращать FALSE, если value не соответствует нек.требованиям}
  52.   IOFunc=FUNCTION(value:Real):Boolean;
  53.  
  54. CONST
  55.   {Цвета диалоговой панели}
  56.    DialogFrame :Byte    = $70;    {Black on LightGray }
  57.    DialogButton:Byte    = $0F;    {White on Black }
  58.    DialogSelect:Byte    = $0B;    {Cyan on Black }
  59.    DialogShadow:Byte    = $78;    {DarkGray on LightGray}
  60.    DialogEdit  :Byte    = $30;    {Black on Cyan }
  61.  
  62. VAR
  63.    CurrentItem:Byte;
  64.    HelpMenu   :THelpType;
  65.  
  66. {Изготовление кнопки}
  67. PROCEDURE WriteButton(x,y:Byte; Str:String; len:Byte; High:Boolean);
  68. {Рисует окошко с сообщением указанного цвета и кнопкой Ок}
  69. PROCEDURE Message(Str:String; A:Byte);
  70. {Рисует окошко с вопросом и кнопками Да/Нет}
  71. FUNCTION Ask(Str:String):Boolean;
  72. {Создает окошко с заголовком,запросом и ред.строкой, а также с кнопками}
  73. FUNCTION AskString(Title,Str:String;Default:String;var Enter:Boolean):String;
  74. {Создает диалог с вариантами выбора (нечто вроде меню)}
  75. FUNCTION AskVariant(Title,Str:STRING; Count:Byte;
  76.                        var Variant:ARRAY OF TMenuItem):Byte;
  77. {Ввод действительного значения}
  78. FUNCTION AskReal(Title,St:String; Default:Real;
  79.                        var Entered:Boolean; AI:IOFunc):Real;
  80. {Ввод целого значения}
  81. FUNCTION AskInteger(Title,St:String; Default:Integer;
  82.                        var Entered:Boolean; AI:IOFunc):Integer;
  83. {Заглушка для AskReal и AskInteger}
  84. FUNCTION DumbCheck(val:Real):Boolean;
  85.  
  86. IMPLEMENTATION
  87.  
  88. {Инициализация экрана}
  89. PROCEDURE InitInterFace;
  90. BEGIN
  91.   GlobalON;   {Глобальный режим}
  92.   FillRect(ScreenRect,'░',Attrib(Blue,LightGray)); {Заполнить экран}
  93.   WriteChar(1,1,' ',80,Attrib(White,LightGray));   {Нижняя и верхняя полосы}
  94.   WriteChar(1,25,' ',80,Attrib(White,LightGray));
  95.   CenterString(1,gStrings[1],FALSE, Attrib(Black,LightGray));
  96.   WriteString(2,25,gStrings[2],Attrib(Black,LightGray));
  97. END;
  98.  
  99. {* РАБОТА С МЕНЮ *}
  100. CONST
  101.   MenuCursor = $0F;   {Цвет  курсора}
  102.   MenuKey    = $1E;   {Цвет подсвеченых литер}
  103.   ExitCode   = 4;     {Индекс выхода}
  104.  
  105. {Создать окно помощи}
  106. PROCEDURE HelpOnProgram;
  107. VAR W    :PWindow;
  108.     PrevW:PWindow;
  109.     a    :Byte;
  110.     c    :Char;
  111.     wr,op:Rect;
  112. BEGIN
  113.   PrevW := CurWindow;
  114.   AssignRect(wr,10,6,71,19);
  115.   AssignRect(op,11,7,70,18);
  116.   A := Attrib(Black,Cyan);
  117.   New(W);
  118.   CreateWindow(W, 'О Программе', wr,op, a,a, TRUE);
  119.   GlobalOFF;
  120.  
  121.   a := Attrib(Yellow,Cyan);
  122.   CenterString(2,'Домашнее задание Ярослава Стерхова',FALSE,a);
  123.   CenterString(3,'Группа МТ7-21',FALSE,a);
  124.   a := Attrib(Black,Cyan);
  125.   WriteString(1,6,'Для перемещения по меню можно использовать клавиши управления курсором'+
  126.      ' или клавиши с выделенными буквами.',a);
  127.   WriteString(1,WhereY+1,'Пункты главного меню:',a);
  128.   WriteString(4,WhereY+1,'''Сортировка матрицы'' по первым элементам строк',a);
  129.   WriteString(4,WhereY+1,'''Найти интеграл'' функции f(x) = Cos(x)/x',a);
  130.   WriteString(4,WhereY+1,'''Построить график'' кардиоиды',a);
  131.  
  132.   a := Attrib(Black,LightGray);
  133.   GlobalON;
  134.   WriteString(2,25,gStrings[3],a);
  135.   GlobalOff;
  136.   REPEAT
  137.     c :=ReadKey;
  138.   UNTIL c=#27;
  139.   HideWindow(W);
  140.   WriteChar(1,25,' ',80,a);
  141.   WriteString(2,25,gStrings[2],a);
  142.   GlobalOff;
  143.   CurWindow := PrevW;
  144.   DisposeWindow(W);
  145. END;
  146.  
  147. {Показать элемент}
  148. PROCEDURE WriteItem(W:PWindow; Index:Byte; var Data: TMenuItem);
  149. VAR
  150.   a  : Byte;
  151.   x  : Byte;
  152. BEGIN
  153.   IF CurrentItem = Index THEN a:=MenuCursor ELSE a:= W^.TextAttr;
  154.   WriteString(MenuMargin+1, Index+1, Data.Name, a);
  155.   IF NOT (CurrentItem = Index) THEN BEGIN  {???}
  156.     x := MenuMargin + Data.KeyInd;
  157.     WriteChar(x,Index+1,Data.Name[Data.KeyInd],1,MenuKey);
  158.   END;
  159. END;
  160.  
  161. {Показать меню}
  162. PROCEDURE MakeMenu(var MenuWin:PWindow; var Data:TMenuData;Title:String);
  163. CONST
  164.   {Эта странная вещь - формула для вычисления размеров меню(см. CONST)}
  165.   MenuRect:Rect =
  166.             (Left: (80 - (MenuWidth + 4)) div 2 + 1;                {30}
  167.               Top: (25 - (MenuCount + 4)) div 2 + 1;                {9}
  168.               Right: (80 - (MenuWidth + 4)) div 2 + 4 + MenuWidth;  {51}
  169.               Bottom:(25 - (MenuCount + 4)) div 2 + 4 + MenuCount); {16}
  170. VAR
  171.   Ind   : Byte;
  172.   op    : Rect;
  173.   PrevW : PWindow;
  174.   a     : Byte;
  175. BEGIN
  176.   PrevW := CurWindow;
  177.   CurrentItem := 1;
  178.   op := MenuRect;
  179.   Inc(op.Top); Inc(op.Left);
  180.   Dec(op.Bottom); Dec(op.Right);
  181.   a := Attrib(White,Blue);
  182.   CreateWindow(MenuWin, Title, MenuRect,op, a,a, TRUE);
  183.   GlobalOn;
  184.   WriteChar(1,25,' ',80,Attrib(White,LightGray));
  185.   WriteString(2,25,gStrings[2],Attrib(Black,LightGray));
  186.   GlobalOff;
  187.   FOR Ind := 1 TO MenuCount DO
  188.     WriteItem(MenuWin,Ind,Data[Ind]);
  189.  
  190. END;
  191.  
  192. {Получить номер выбранного элемента}
  193. FUNCTION GetChoice(var W:PWindow; Data:TMenuData;Title:String):Index;
  194. VAR
  195.   Chosed:Boolean;
  196.   c,cc  :Char;
  197.   pi, i :Index;
  198. BEGIN
  199.   Chosed := FALSE;
  200.   MakeMenu(W,Data,Title);
  201.   REPEAT
  202.     c := ReadKey;
  203.     FOR I:=1 TO MenuCount DO
  204.       IF c IN Data[i].Key THEN BEGIN
  205.          pi := CurrentItem;
  206.          CurrentItem := i;
  207.          WriteItem(W,pi,Data[pi]);
  208.          WriteItem(W,i,Data[i]);
  209.          Chosed:= TRUE;
  210.          GetChoice := i;
  211.        END;
  212.  
  213.      IF NOT Chosed THEN
  214.        CASE c OF
  215.          #27: BEGIN
  216.                 GetChoice:=ExitCode;
  217.                 Chosed:=TRUE;
  218.               END;
  219.          #13: BEGIN
  220.                 GetChoice:=CurrentItem;
  221.                 Chosed :=TRUE;
  222.               END;
  223.          #00: BEGIN
  224.                 cc := ReadKey;
  225.                 pi := CurrentItem;
  226.                 CASE cc OF
  227.                   #59        : HelpMenu;
  228.                   #71,#73,#75: CurrentItem:=1;
  229.                   #72        : IF CurrentItem=1 THEN CurrentItem:=MenuCount
  230.                                  ELSE Dec(CurrentItem);
  231.                   #80        : IF CurrentItem=MenuCount THEN CurrentItem:=1
  232.                                  ELSE Inc(CurrentItem);
  233.                   #77,#79,#81: CurrentItem:=MenuCount;
  234.                 END;
  235.                 IF pi<>CurrentItem THEN BEGIN
  236.                   WriteItem(W,pi,Data[pi]);
  237.                   WriteItem(W,CurrentItem,Data[CurrentItem]);
  238.                 END;
  239.               END;
  240.      END;
  241.   UNTIL Chosed;
  242. END;
  243.  
  244. {Запуск меню}
  245. PROCEDURE DoMenu(Title:String;Data:TMenuData;HelpProc:THelpType);
  246. VAR
  247.  W      :PWindow;
  248.  choice :Index;
  249. BEGIN
  250.   HelpMenu:=HelpProc;
  251.   New(W);
  252.   REPEAT
  253.     choice:=GetChoice(W,Data,Title);
  254.     HideWindow(W);
  255.     Data[choice].Proc;
  256.   UNTIL choice = ExitCode;
  257. END;
  258.  
  259. {* РАБОТА С ДИАЛОГАМИ *}
  260.  
  261.                             {Изготовление кнопки}
  262. {         }
  263. {   Ok   ▄}
  264. { ▀▀▀▀▀▀▀▀}
  265. PROCEDURE WriteButton(x,y:Byte; Str:String; len:Byte; High:Boolean);
  266. VAR
  267.   dx:Byte;
  268. BEGIN
  269.   WriteChar(x,y,' ',Len,DialogButton);
  270.   dx := (len - Length(Str)) div 2;
  271.   WriteString(x+dx,y,Str,DialogButton);
  272.   WriteChar(x+1,y+1,'▀',Len,DialogShadow);
  273.   WriteChar(x+Len,y,'▄',1,DialogShadow);
  274.   IF High THEN BEGIN
  275.     WriteChar(x,y,' ',1,DialogSelect);
  276.     WriteChar(x+Len-1,y,' ',1,DialogSelect);
  277.   END;
  278. END;
  279.  
  280. {Рисует окошко с сообщением указанного цвета и кнопкой Ок}
  281. PROCEDURE Message(Str:String; A:Byte);
  282. VAR
  283.   W, PrevW : PWindow;
  284.   wr,op    : Rect;
  285.   bx       : Byte;
  286.   c        : Char;
  287. BEGIN
  288.   PrevW := CurWindow;
  289.   AssignRect(wr, (76-Length(Str)) div 2 + 1,9,(76-Length(Str)) div 2 + 5 + Length(Str),15);
  290.   op := wr;
  291.   Inc(op.Top); Inc(op.Left);
  292.   Dec(op.Bottom); Dec(op.Right);
  293.   New(W);
  294.   CreateWindow(W, 'Сообщение', wr,op, A,A, TRUE);
  295.   DialogShadow:= (A AND $F0) OR $78;
  296.  
  297.   {Изменение нижней статус-строки}
  298.   GlobalOn;
  299.   WriteChar(1,25,' ',80,Attrib(Black,LightGray));
  300.   WriteString(2,25,'Enter - Продолжить',Attrib(Black,LightGray));
  301.   GlobalOFF;
  302.  
  303.   WriteString(2,2,Str,A);
  304.   bx := (W^.WinRect.Right - W^.WinRect.Left) div 2 - 4;
  305.   WriteButton(bx,4,'Ok',8,TRUE);
  306.   REPEAT
  307.     c := ReadKey;
  308.   UNTIL c=#13;
  309.   HideWindow(W);
  310.   DisposeWindow(W);
  311.   CurWindow := PrevW;
  312.   DialogShadow:=$78;
  313. END;
  314.  
  315. {Рисует окошко с вопросом и кнопками Да/Нет}
  316. FUNCTION Ask(Str:String):Boolean;
  317. VAR
  318.   W,PrevW:PWindow;
  319.   wr,op  :Rect;
  320.   i      :Byte;
  321.   Answer :Byte;
  322.   Chosed :Boolean;
  323.   Ch,Ch2 :Char;
  324. CONST
  325.    Buttons :ARRAY[1..2] OF RECORD
  326.                    x,y:Byte;
  327.                    Len:Byte;
  328.                    Name:String;
  329.                END =
  330.    ((X:7; Y:5; Len:9 ;Name:'Нет'),
  331.    (X:23; Y:5; Len:8 ;Name:'Да'));
  332.  
  333. BEGIN
  334.   PrevW := CurWindow;
  335.   Answer := 1;
  336.   AssignRect(wr,20,9,60,16);
  337.   AssignRect(op,22,10,58,15);
  338.   New(W);
  339.   CreateWindow(W, 'Вопрос', wr,op, DialogFrame,DialogFrame, TRUE);
  340.  
  341.   {Изменение нижней статус-строки}
  342.   GlobalOn;
  343.   WriteChar(1,25,' ',80,Attrib(Black,LightGray));
  344.   GlobalOFF;
  345.  
  346.   FOR I:=1 TO 2 DO BEGIN
  347.     WITH Buttons[I] DO
  348.       WriteButton(X,Y,Name,Len,FALSE);
  349.   END;
  350.  
  351.   WITH Buttons[Answer] DO WriteButton(X,Y,Name,Len,TRUE);
  352.   CenterString(2,Str,TRUE,DialogFrame);
  353.  
  354.   {Далее алгоритм ожидания выбора}
  355.   Chosed := FALSE;
  356.   REPEAT
  357.     Ch := ReadKey;
  358.     CASE Ch OF
  359.       'Y','y','Д','д': BEGIN
  360.                          Answer := 2;
  361.                          Chosed := True;
  362.                        END;
  363.       'N','n','Н','н': BEGIN
  364.                          Answer := 1;
  365.                          Chosed := True;
  366.                        END;
  367. {Enter}#13           : Chosed := TRUE;
  368. {Tab} #9             : IF Answer=2 THEN Answer:=1 ELSE Inc(Answer);
  369. {...} #00            : BEGIN
  370.                          Ch2 := ReadKey;
  371.                          CASE Ch2 OF
  372.       {Left}{Shift-Tab}    #15,#75: IF Answer=1 THEN Answer:=2
  373.                                        ELSE Dec(Answer);
  374.                 {Right}    #77    : IF Answer=2 THEN Answer:=1
  375.                                        ELSE Inc(Answer);
  376.                          END;
  377.                        END;
  378.     END;
  379.  
  380.     FOR I:=1 TO 2 DO
  381.       WITH Buttons[I] DO  WriteButton(X,Y,Name,Len,FALSE);
  382.     WITH Buttons[Answer] DO WriteButton(X,Y,Name,Len,TRUE);
  383.   UNTIL Chosed;
  384.   IF Answer=1 THEN Ask:=FALSE ELSE Ask:=TRUE;
  385.   HideWindow(w);
  386.   CurWindow:= PrevW;
  387.   DisposeWindow(W);
  388. END;
  389.  
  390. {Создает окошко с заголовком,запросом и ред.строкой, а также с кнопками}
  391. FUNCTION AskString(Title,Str:String;Default:String;var Enter:Boolean):String;
  392. VAR
  393.   W,PrevW      :PWindow;
  394.   wr,op        :Rect;
  395.   Temp,Answer  :String;
  396.   Chosed       :Boolean;
  397.   Ch,Ch2       :Char;
  398.   Cmd          :1..2;
  399.   Pos,I        :Byte;
  400. CONST
  401.   {Допустимые символы}
  402.   Letters :SET OF Char = [#32..#126,#128..#255];
  403.   {Кнопки}
  404.   Buttons :ARRAY[1..2] OF RECORD
  405.                    x,y:Byte;
  406.                    Len:Byte;
  407.                    Name:String;
  408.                END =
  409.    ((X:30; Y:4; Len:8 ;Name:'Ввод'),
  410.    (X:41; Y:4; Len:8 ;Name:'Отмена'));
  411.  
  412. BEGIN
  413.   {Создание окна}
  414.   PrevW := CurWindow;
  415.   Cmd := 1;   { Команда: 1 - ВВОД, 2 - ОТМЕНА  }
  416.   Pos := 1;   { Позиция курсора в редактируемой строке }
  417.   AssignRect(wr,14,9,67,15);
  418.   AssignRect(op,16,10,65,14);
  419.   New(W);
  420.   CreateWindow(W, Title, wr,op, DialogFrame,DialogFrame, TRUE);
  421.   Answer := Default;
  422.   {Обрезаем начальные пробелы}
  423.   WHILE Answer[Pos]=#32 DO
  424.     Inc(Pos);
  425.  
  426.   Answer:=Copy(Answer,Pos,Length(Answer)-Pos+1);
  427.   Pos:=1;
  428.   {Изменение нижней статус-строки}
  429.   GlobalOn;
  430.   WriteChar(1,25,' ',80,Attrib(Black,LightGray));
  431.   WriteString(2,25, gStrings[4],Attrib(Black,LightGray));
  432.  
  433.   {Отрисовка окна}
  434.   GlobalOFF;
  435.   FOR I:=1 TO 2 DO BEGIN
  436.     WITH Buttons[I] DO
  437.       WriteButton(X,Y,Name,Len,FALSE);
  438.   END;
  439.   WITH Buttons[Cmd] DO WriteButton(X,Y,Name,Len,TRUE);
  440.   WriteString(1,1,Str,DialogFrame);
  441.   WriteChar(1,2,' ',50,DialogEdit);
  442.   WriteString(1,2,Answer,DialogEdit);
  443.   ShowCursor;
  444.   GotoXY(Pos,2);
  445.   {Далее алгоритм ожидания выбора и редактирования строки}
  446.   Chosed := FALSE;
  447.   REPEAT
  448.     Ch := ReadKey;
  449.     IF (ch IN Letters) AND (Length(Answer)< 50) THEN BEGIN
  450.                        Temp:=Ch;
  451.                        Insert(Temp,Answer,Pos);
  452.                        Inc(Pos);
  453.                      END;
  454.     CASE Ch OF
  455. {BkSp}#8             : IF Pos>1 THEN BEGIN
  456.                          Temp:=Copy(Answer,1,Pos-2)+Copy(Answer,Pos,Length(Answer));
  457.                          Answer:=Temp;
  458.                          Dec(Pos);
  459.                        END;
  460. {Enter}#13           : BEGIN
  461.                          Chosed := True;
  462.                        END;
  463. {Esc} #27            : BEGIN
  464.                          Cmd := 2;
  465.                          Chosed := True;
  466.                          Enter:=False;
  467.                        END;
  468. {Tab} #9             : IF Cmd=2 THEN Cmd:=1 ELSE Cmd:=2;
  469. {...} #00            : BEGIN
  470.                          Ch2 := ReadKey;
  471.                          CASE Ch2 OF
  472.                    {Left}  #75   : IF Pos > 1 THEN Dec(Pos);
  473.                    {Right} #77    : IF Pos < Length(Answer) THEN Inc(Pos);
  474.                    {Del}   #83    : BEGIN
  475.                                       Temp:=Copy(Answer,1,Pos-1)+Copy(Answer,Pos+1,Length(Answer));
  476.                                       Answer:=Temp;
  477.                                     END;
  478.                          END;
  479.                        END;
  480.     END;
  481.  
  482.     FOR I:=1 TO 2 DO
  483.       WITH Buttons[I] DO  WriteButton(X,Y,Name,Len,FALSE);
  484.     WITH Buttons[Cmd] DO WriteButton(X,Y,Name,Len,TRUE);
  485.  
  486.     WriteChar(1,2,' ',50,DialogEdit);
  487.     WriteString(1,2,Answer,DialogEdit);
  488.     GlobalOff;
  489.     GotoXY(Pos,2);
  490.     ShowCursor;
  491.   UNTIL Chosed;
  492.   HideCursor;
  493.  
  494.   Enter:=(Cmd=1);
  495.   AskString:=Answer;
  496.  
  497.   HideWindow(W);
  498.   CurWindow:= PrevW;
  499.   DisposeWindow(W);
  500.   GlobalOn;
  501.   WriteChar(1,25,' ',80,Attrib(Black,LightGray));
  502.   GlobalOff;
  503. END;
  504.  
  505. {Создает диалог с вариантами выбора}
  506. FUNCTION AskVariant(Title,Str:STRING; Count:Byte;
  507.                                       var Variant:ARRAY OF TMenuItem):Byte;
  508. VAR
  509.   W,PrevW   :PWindow;
  510.   wr,op     :Rect;
  511.   Ind       :Byte;
  512.   Chosed    :Boolean;
  513.   c,cc      :Char;
  514.   pi, i     :Byte;
  515.   Choice    :Byte;
  516.   a         :Byte;
  517. BEGIN
  518.   PrevW := CurWindow;
  519.   CurrentItem := 1;
  520.   AssignRect(wr,(80 - (MenuWidth + 4)) div 2 + 1,
  521.               (25 - (Count + 4)) div 2 - 1,
  522.               (80 - (MenuWidth + 4)) div 2 + 4 + MenuWidth,
  523.               (25 - (Count + 4)) div 2 + 4 + Count);
  524.   op := wr;
  525.   Inc(op.Top); Inc(op.Left);
  526.   Dec(op.Bottom); Dec(op.Right);
  527.   a := Attrib(White,Blue);
  528.   New(W);
  529.   CreateWindow(W, Title, wr,op, a,a, TRUE);
  530.  
  531.   GlobalOn;
  532.   WriteChar(1,25,' ',80,Attrib(Black,LightGray));
  533.   WriteString(2,25,gStrings[2],Attrib(Black,LightGray));
  534.   GlobalOFF;
  535.  
  536.   WriteString(2,2,Str,Attrib(Yellow,Blue));
  537.  
  538.   op := W^.OutPut;
  539.   Inc(op.Left,1);
  540.   Inc(op.Top,3);
  541.   W^.OutPut := op;
  542.   CurWindow:=W;
  543.  
  544.   FOR Ind := 0 TO Count-1 DO
  545.     WriteItem(W,Ind,Variant[Ind]);
  546.  
  547.   Chosed := FALSE;
  548.   REPEAT
  549.     c := ReadKey;
  550.     FOR I:=0 TO Count-1 DO
  551.       IF c IN Variant[i].Key THEN BEGIN
  552.          pi := CurrentItem;
  553.          CurrentItem := i;
  554.          WriteItem(W,pi,Variant[pi]);
  555.          WriteItem(W,i,Variant[i]);
  556.          Chosed:= TRUE;
  557.          Choice := i;
  558.        END;
  559.  
  560.    IF NOT Chosed THEN
  561.        CASE c OF
  562.          #13: BEGIN
  563.                 Choice:=CurrentItem;
  564.                 Chosed :=TRUE;
  565.               END;
  566.          #00: BEGIN
  567.                 cc := ReadKey;
  568.                 pi := CurrentItem;
  569.                 CASE cc OF
  570.                   #59        : {Убрано за ненадобностью};
  571.                   #71,#73,#75: CurrentItem:=0;
  572.                   #72        : IF CurrentItem=0 THEN CurrentItem:=Count-1
  573.                                  ELSE Dec(CurrentItem);
  574.                   #80        : IF CurrentItem=Count-1 THEN CurrentItem:=0
  575.                                  ELSE Inc(CurrentItem);
  576.                   #77,#79,#81: CurrentItem:=Count-1;
  577.                 END;
  578.                 IF pi<>CurrentItem THEN BEGIN
  579.                   WriteItem(W,pi,Variant[pi]);
  580.                   WriteItem(W,CurrentItem,Variant[CurrentItem]);
  581.                 END;
  582.               END;
  583.      END;
  584.   UNTIL Chosed;
  585.   AskVariant:=Choice+1;
  586.   HideWindow(W);
  587.   CurWindow:=PrevW;
  588.  
  589.   GlobalOn;
  590.   WriteChar(1,25,' ',80,Attrib(Black,LightGray));
  591.   GlobalOff;
  592.   DisposeWindow(W);
  593. END;
  594.  
  595. {Заглушка для AskReal и AskInteger}
  596. FUNCTION DumbCheck(val:Real):Boolean;
  597. BEGIN
  598.    DumbCheck:=TRUE;
  599. END;
  600.  
  601. {Ввод действительного значения}
  602. FUNCTION AskReal(Title,St:String; Default:Real;
  603.                  var Entered:Boolean; AI:IOFunc):Real;
  604. VAR
  605.   S,def :String;
  606.   code  :Integer;
  607.   tVal  :Real;
  608.   Enter :Boolean;
  609. BEGIN
  610.  Str(Default:6:3,def);
  611.  REPEAT
  612.   S := AskString(Title,St,Def,Enter);
  613.   Val(S,tVal,code);
  614.   IF Enter THEN IF code<>0 THEN
  615.       Message('Не похоже на число!',Attrib(Yellow,Red));
  616.   IF (code=0) AND Enter THEN IF NOT AI(tVal) THEN code:=1;
  617.  UNTIL (code=0);
  618.  Entered:=Enter;
  619.  AskReal:=tVal;
  620. END;
  621.  
  622. {Ввод целого значения}
  623. FUNCTION AskInteger(Title,St:String; Default:Integer;
  624.                        var Entered:Boolean; AI:IOFunc):Integer;
  625. VAR
  626.   S,def :String;
  627.   code  :Integer;
  628.   tVal  :Integer;
  629.   Enter :Boolean;
  630. BEGIN
  631.  Str(Default,def);
  632.  REPEAT
  633.   S := AskString(Title,St,Def,Enter);
  634.   Val(S,tVal,code);
  635.   IF Enter THEN
  636.     IF code<>0 THEN
  637.       Message('Не похоже на число!',Attrib(Yellow,Red));
  638.   IF (code=0) AND Enter THEN IF NOT AI(tVal) THEN code:=1;
  639.  UNTIL (code=0);
  640.  Entered:=Enter;
  641.  AskInteger:=tVal;
  642. END;
  643.  
  644. {Инициализация}
  645. BEGIN
  646.   InitInterFace;
  647. END.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement