home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 19 / CD_ASCQ_19_010295.iso / dos / prg / pas / ktools / source / kmenu.pas < prev    next >
Pascal/Delphi Source File  |  1994-11-02  |  15KB  |  656 lines

  1. Program KMenu2;
  2. { Lanceur d'applications à partir d'un fichier Batch. }
  3. { K.B. mai-novembre 1994 }
  4.  
  5. {.$DEFINE debug}
  6.  
  7. {$IFDEF debug}
  8.  {$A+,B-,D+,E-,F-,I+,L+,N-,R+,S+,V-,W+,X+}
  9. {$ELSE}
  10.  {$A+,B-,D-,E-,F-,I+,L-,N-,R-,S-,V-,W+,X+}
  11. {$ENDIF}
  12.  
  13. Uses Dos,
  14.      UDrivers,UTextScr,UMem,
  15.      OTableau,
  16.      OGenView,OTxtView,ODialWin;
  17.  
  18. Const
  19.  NomFichierBatch='ktmp!!!!.bat';
  20.  nbrNiv=5;
  21.  MaxLenItem=35;
  22.  DelaiRepos=60;
  23.  
  24.  cmKMenu=$200;   {évènement charge fenêtre menu}
  25.  cmAbout=$201;
  26.  cmPassWord=$202;
  27.  cmRepos=$203;
  28.  
  29. Type
  30.  
  31.  PKMenuItem=^TKmenuItem;
  32.  TKmenuItem=object(TStrTab)
  33.   Titre:String[MaxLenItem];
  34.   Constructor Init(T:String);
  35.   Procedure FaireFichierBatch;
  36.   Function GetNewMenu:TStr12;
  37.   Function IsNewMenu:Boolean;
  38.   End;
  39.  
  40.  PKMenuTab=^TKMenuTab;
  41.  TKMenuTab=object(TTabPtr)
  42.   Constructor Init;
  43.   Procedure Effacer(p:Pointer);virtual;
  44.   Function DonneItem(n:Integer):PKMenuItem;
  45.   Function DonneTitre(n:Integer):String;
  46.   End;
  47.  
  48.  PKMenuWin=^TKmenuWin;
  49.  TKMenuWin=object(TWindow)
  50.   Items:TKmenuTab;
  51.   Choix:Integer;
  52.   Constructor Init(NomFichier:PathStr);
  53.   Destructor Done;virtual;
  54.   Procedure HandleEvent(Var Event:TEvent);virtual;
  55.   Procedure DrawInterior;virtual;
  56.   Procedure LireDatas(NomFichier:PathStr);
  57.   Procedure SauverDatas(NomFichier:PathStr);
  58.   Function Ligne(n:Integer):String;
  59.   Function NombreItems:Integer;
  60.   Function NumeroChoisi(P:TPoint):Integer;
  61.   End;
  62.  
  63.  PKMenuApp=^TKmenuApp;
  64.  TKMenuApp=object(TTextApp)
  65.   MotDePasse:TStr12;
  66.   TabNiv: array[1..nbrNiv] of TStr12;
  67.   Niveau:Byte;
  68.   TimeCount:LongInt;
  69.   Constructor Init;
  70.   Procedure HandleEvent(Var Event:TEvent); virtual;
  71.   Procedure TempsMort; virtual;
  72.   Procedure ChangeWin;
  73.   Function TestPassWord:Boolean;
  74.   Procedure LireNiveau;
  75.   Procedure EcrireNiveau;
  76.   Function ConfirmExit:Boolean;
  77.   Procedure SetTimeCount;
  78.   Procedure MiseEnRepos;
  79.   End;
  80.  
  81. Const
  82.  EndCode:Byte=1;
  83.  
  84. { objet TKmenuItem }
  85. { objet contenant les données relatives à un choix du menu }
  86.  
  87. Constructor TKMenuItem.Init(T:String);
  88. Begin
  89.  TStrTab.Init(4,4);
  90.  Titre:=T;
  91. End;
  92.  
  93. Procedure TKMenuItem.FaireFichierBatch;
  94. Var f:Text;
  95.     S:String;
  96.     i:Integer;
  97. Begin
  98.  assign(f,NomFichierBatch);
  99.  {$I-}
  100.  rewrite(f);
  101.  {$I+}
  102.  if IOResult<>0
  103.     then begin
  104.           Message(' Erreur pendant la création du fichier BAT. ');
  105.           exit;
  106.          end;
  107.  For i:=1 to NombreItems do
  108.   begin
  109.    S:=Ligne(i);
  110.    writeln(f,S);
  111.   end;
  112.  close(f);
  113. End;
  114.  
  115. Function TKMenuItem.IsNewMenu:Boolean;
  116. Var S:String;
  117.     i:Byte;
  118. Begin
  119.  S:=Ligne(1);
  120.  For i:=1 to length(S) do
  121.   S[i]:=upcase(S[i]);
  122.  if copy(S,1,5)='KMENU'
  123.     then IsNewMenu:=true
  124.     else IsNewMenu:=false;
  125. End;
  126.  
  127. Function TKMenuItem.GetNewMenu:TStr12;
  128. Var S:String;
  129. Begin
  130.  S:=Ligne(1);
  131.  while S[length(S)]=' ' do dec(S[0]);
  132.  GetNewMenu:=copy(S,7,length(S)-6);
  133. End;
  134.  
  135. { objet TKMenuTab }
  136. { tableau de pointeurs sur des tableaux de caractères }
  137.  
  138. Constructor TKMenuTab.Init;
  139. Begin
  140.  TTabPtr.Init(20,5);
  141. End;
  142.  
  143. Procedure TKMenuTab.Effacer(p:Pointer);
  144. Var W:PKMenuItem;
  145. Begin
  146.  W:=PKMenuItem(p);
  147.  if W<>nil
  148.     then dispose(W,done);
  149. End;
  150.  
  151. Function TKMenuTab.DonneTitre(n:Integer):String;
  152. Var W:PKMenuItem;
  153.     S:String;
  154. Begin
  155.  W:=DonneItem(n);
  156.  if W=nil
  157.     then S:=''
  158.     else S:=W^.Titre;
  159.  DonneTitre:=S;
  160. End;
  161.  
  162. Function TKMenuTab.DonneItem(n:Integer):PKMenuItem;
  163. Var W:PKMenuItem;
  164. Begin
  165.  if (n<1) or (n>NombreItems)
  166.     then W:=nil
  167.     else Lire(W,n);
  168.  DonneItem:=W;
  169. End;
  170.  
  171. { objet TKMenuWin }
  172.  
  173. Constructor TKMenuWin.Init(NomFichier:PathStr);
  174. Begin
  175.  TWindow.Init(3,2,72,22,'');
  176.  Ident:='KMENU';
  177.  Items.Init;
  178.  LireDatas(NomFichier);
  179.  Choix:=0;
  180. End;
  181.  
  182. Destructor TKMenuWin.Done;
  183. Begin
  184.  Items.Done;
  185.  TWindow.Done;
  186. End;
  187.  
  188. Function TKMenuWin.Ligne(n:Integer):String;
  189. Var S:String;
  190.     W:PKMenuItem;
  191. Begin
  192.  if (n<1) or (n>NombreItems)
  193.     then S:=''
  194.     else S:=Items.DonneTitre(n);
  195.  S:='['+chr(ord('A')+n-1)+'] '+S;
  196.  Ajuste(S,35);
  197.  Ligne:=S;
  198. End;
  199.  
  200. Procedure TKMenuWin.DrawInterior;
  201. Var x,y:Byte;
  202.     i:Integer;
  203.     S,V:String;
  204. Begin
  205.  V:=' ';
  206.  Ajuste(V,35);
  207.  x:=1;
  208.  y:=1;
  209.  for i:=1 to 10 do
  210.   begin
  211.    Ecrire(V,x,y,0);
  212.    inc(y);
  213.    S:=Ligne(i);
  214.    Ecrire(S,x,y,0);
  215.    inc(y);
  216.   end;
  217.  x:=36;
  218.  y:=1;
  219.  for i:=11 to 20 do
  220.   begin
  221.    Ecrire(V,x,y,0);
  222.    inc(y);
  223.    S:=Ligne(i);
  224.    Ecrire(S,x,y,0);
  225.    inc(y);
  226.   end;
  227. End;
  228.  
  229. Function TKMenuWin.NumeroChoisi(P:TPoint):Integer;
  230. Begin
  231.  NumeroChoisi:=0;
  232.  case P.X of
  233.   1..3:
  234.    if P.Y mod 2 =0
  235.       then NumeroChoisi:=P.Y div 2;
  236.   36..38:
  237.    if P.Y mod 2 =0
  238.       then NumeroChoisi:=10+P.Y div 2;
  239.   end;
  240. End;
  241.  
  242. Procedure TKMenuWin.HandleEvent(Var Event:TEvent);
  243. Var P:TPoint;
  244.     n:Integer;
  245. Begin
  246.  if Event.What=evKeyDown
  247.     then if Event.KeyCode=Echap
  248.             then begin
  249.                   ExitCode:=exAnnule;
  250.                   Event.What:=evNothing;
  251.                   exit;
  252.                  end;
  253.  if Event.What=evMouseRDown
  254.     then begin
  255.           ExitCode:=exAnnule;
  256.           Event.What:=exAnnule;
  257.           exit;
  258.          end;
  259.  TWindow.HandleEvent(Event);
  260.  case Event.What of
  261.   evKeyDown:
  262.    case Event.KeyCode of
  263.     ord('A')..ord('T'):
  264.      begin
  265.       Choix:=Event.KeyCode-ord('A')+1;
  266.       ExitCode:=exOk;
  267.      end;
  268.     ord('a')..ord('t'):
  269.      begin
  270.       Choix:=Event.KeyCode-ord('a')+1;
  271.       ExitCode:=exOk;
  272.      end;
  273.     else exit;
  274.     end;
  275.   evMouseLDown:
  276.    begin
  277.     repeat
  278.      GetMouseEvent(Event);
  279.     until Event.What=evMouseLUp;
  280.     MakeLocal(Event.Where,P);
  281.     P.X:=P.X-Origin.X;
  282.     P.Y:=P.Y-Origin.Y;
  283.     n:=NumeroChoisi(P);
  284.     if n<>0
  285.        then begin
  286.              Choix:=n;
  287.              ExitCode:=exOk;
  288.             end
  289.        else exit;
  290.    end;
  291.   else exit;
  292.   end;
  293.  Event.What:=evNothing;
  294. End;
  295.  
  296. Function TKMenuWin.NombreItems:Integer;
  297. Begin
  298.  NombreItems:=Items.NombreItems;
  299. End;
  300.  
  301. Procedure TKMenuWin.LireDatas(NomFichier:PathStr);
  302. Var f:Text;
  303.     S:String;
  304.     Tst:String[3];
  305.     W:PKMenuItem;
  306.     ErrNum:Word;
  307. Begin
  308.  ErrNum:=0;
  309.  Assign(f,NomFichier);
  310.  {$I-}
  311.  Reset(f);
  312.  {$I+}
  313.  if IOResult<>0
  314.     then begin
  315.           Message(' Pas de fichier de données !!! ');
  316.           ErrorFlag:=3;
  317.           Exit;
  318.          end;
  319.  {$I-}
  320.  ReadLn(f,Titre);
  321.  W:=nil;
  322.  while not EOF(f) and (ErrNum=0) do
  323.   begin
  324.    Readln(f,S);
  325.    ErrNum:=IOResult;
  326.    if copy(S,1,7)='Palette'
  327.       then begin
  328.             PalOffset:=3*(ord(S[9])-ord('1'))+1;
  329.             Readln(f,S);
  330.            end;
  331.    Tst:=copy(S,1,3);
  332.    if Tst='***'
  333.       then begin
  334.             if W<>nil
  335.                then begin
  336.                      Items.Ajouter(W);
  337.                      W:=nil;
  338.                     end;
  339.             if ErrNum=0
  340.                then begin
  341.                      Readln(f,S);
  342.                      ErrNum:=IOResult;
  343.                      if (ErrNum=0) and (S<>'')
  344.                         then begin
  345.                               while S[length(S)]=' '
  346.                                do dec(S[0]);
  347.                               W:=new(PKMenuItem,Init(S));
  348.                              end;
  349.                     end;
  350.            end
  351.       else begin
  352.             if W<>nil
  353.                then W^.AjouterLigne(S);
  354.            end;
  355.   end;
  356.  Close(f);
  357.  {$I+}
  358. End;
  359.  
  360. Procedure TKmenuWin.SauverDatas(NomFichier:PathStr);
  361. Var f:Text;
  362.     S:String;
  363.     W:PKMenuItem;
  364.     i,j:Integer;
  365. Begin
  366.  Assign(f,NomFichier);
  367.  {$I-}
  368.  Rewrite(f);
  369.  {$I+}
  370.  if IOResult<>0
  371.     then begin
  372.           Message(' Création de fichier impossible !!! ');
  373.           ErrorFlag:=3;
  374.           Exit;
  375.          end;
  376.  { titre }
  377.  Writeln(f,Titre);
  378.  { palette de la fenêtre }
  379.  i:=PalOffSet div 3 +1;
  380.  str(i,S);
  381.  Writeln(f,S);
  382.  { choix }
  383.  For i:=1 to Items.NombreItems do
  384.   begin
  385.    Str(i,S);
  386.    S:='***Choix '+S+'***';
  387.    writeln(f,S);
  388.    W:=Items.DonneItem(i);
  389.    writeln(f,W^.Titre);
  390.    for j:=1 to W^.NombreItems do
  391.     writeln(f,W^.Ligne(j));
  392.   end;
  393.  Writeln(f,'***Fin du fichier***');
  394.  Close(f);
  395. End;
  396.  
  397. { objet TKMenuApp }
  398.  
  399. Constructor TKMenuApp.Init;
  400. Var i:Byte;
  401. Begin
  402.  TTextApp.Init;
  403.  SetTimeCount;
  404.  if paramcount>0
  405.     then begin
  406.           MotDePasse:=paramstr(1);
  407.           for i:=1 to length(MotDePasse)
  408.            do MotDePasse[i]:=upcase(MotDePasse[i]);
  409.           SetCommand(cmPassWord);
  410.          end
  411.     else MotDePasse:='';
  412.  LireNiveau;
  413.  if MotDePasse=''
  414.     then SetCommand(cmKMenu);
  415. End;
  416.  
  417. Procedure TKMenuApp.LireNiveau;
  418. Var f:Text;
  419.     S:String;
  420. Begin
  421.  { recherche du fichier de données actuel }
  422.  Niveau:=0;
  423.  assign(f,'KMENU.CFG');
  424.  {$I-}
  425.  reset(f);
  426.  {$I+}
  427.  if IOResult<>0
  428.     then begin
  429.           Titre:='KMENU 2.1  (K.B. 1994)';
  430.           Niveau:=1;
  431.           TabNiv[Niveau]:='KMENU.DAT';
  432.           EcrireNiveau;
  433.          end
  434.     else begin
  435.           readln(f,Titre);
  436.           while not EOF(f) do
  437.            begin
  438.             readln(f,S);
  439.             if S<>''
  440.                then begin
  441.                      inc(Niveau);
  442.                      TabNiv[Niveau]:=S;
  443.                     end;
  444.            end;
  445.           close(f);
  446.          end;
  447. End;
  448.  
  449. Procedure TKMenuApp.EcrireNiveau;
  450. Var f:Text;
  451.     i:Byte;
  452. Begin
  453.  assign(f,'KMENU.CFG');
  454.  rewrite(f);
  455.  writeln(f,Titre);
  456.  For i:=1 to Niveau do
  457.   writeln(f,TabNiv[i]);
  458.  close(f);
  459. End;
  460.  
  461. Procedure TKMenuApp.HandleEvent(Var Event:TEvent);
  462. Var W      : PKMenuWin;
  463.     CurWin : PGenView;
  464. Begin
  465.  if (Event.What=evCommand) and (Event.Command=cmQuit) and (EndCode=1)
  466.     then if not ConfirmExit
  467.             then begin
  468.                   Event.What:=evNothing;
  469.                   exit;
  470.                  end;
  471.  TTextApp.HandleEvent(Event);
  472.  CurWin:=FindSelect;
  473.  if (CurWin<>nil) and (CurWin^.Ident='KMENU') and (CurWin^.ExitCode<>0)
  474.     then begin
  475.           ChangeWin;
  476.           exit;
  477.          end;
  478.  case Event.What of
  479.   evCommand:
  480.    case Event.Command of
  481.     cmAbout: begin
  482.               Message(chr(13)+
  483.                       '      KMENU 2.1       '+chr(13)+
  484.                       '   Kostrzewa Bruno    '+chr(13)+
  485.                       '    novembre 1994     '+chr(13));
  486.              end;
  487.     cmKMenu: begin
  488.               Patience('Chargement du menu en cours...');
  489.               W:=new(PKMenuWin,Init(TabNiv[Niveau]));
  490.               FinPatience;
  491.               if W^.IsValid
  492.                  then begin
  493.                        if CurWin<>nil
  494.                           then dispose(CurWin,Done);
  495.                        Insert(W);
  496.                        W^.Show;
  497.                       end
  498.                  else begin
  499.                        dispose(W,Done);
  500.                        if Niveau>1
  501.                           then begin
  502.                                 dec(Niveau);
  503.                                 EcrireNiveau;
  504.                                 SetCommand(cmKMenu);
  505.                                end
  506.                           else begin
  507.                                 Message(' Fin du programme. ');
  508.                                 EndCode:=2;
  509.                                 SetCommand(cmQuit);
  510.                                end;
  511.                        end;
  512.               end;
  513.      cmRepos: MiseEnRepos;
  514.      cmPassWord:
  515.       if PassWord(MotDePasse)
  516.          then SetCommand(cmKMenu)
  517.          else begin
  518.                EndCode:=2;
  519.                SetCommand(cmQuit);
  520.               end;
  521.     else exit;
  522.    end;
  523.   evKeyDown:
  524.    case Event.KeyCode of
  525.     {F2: if (Curwin<>nil) and (CurWin^.Ident=nKMenuWin)
  526.            then begin
  527.                  Patience('Sauvegarde du menu en cours...');
  528.                  W:=PKMenuWin(CurWin);
  529.                  W^.SauverDatas(TabNiv[Niveau]);
  530.                  FinPatience;
  531.                 end;}
  532.     F7: SetCommand(cmRepos);
  533.     F9: SetCommand(cmAbout);
  534.     else exit;
  535.    end;
  536.  end;
  537.  SetTimeCount;
  538.  Event.What:=evNothing;
  539. End;
  540.  
  541. Procedure TKMenuApp.SetTimeCount;
  542. Var h,m,s,c : Word;
  543. Begin
  544.  GetTime(h,m,s,c);
  545.  TimeCount:=3600*h+60*m+s;
  546. End;
  547.  
  548. Procedure TKMenuApp.TempsMort;
  549. Var h,m,s,c : Word;
  550.     tmp     : LongInt;
  551. Begin
  552.  TTextApp.TempsMort;
  553.  GetTime(h,m,s,c);
  554.  tmp:=3600*h+60*m+s;
  555.  if tmp-TimeCount>=DelaiRepos
  556.     then MiseEnRepos;
  557. End;
  558.  
  559. Procedure TKMenuApp.MiseEnRepos;
  560. Var E : TEvent;
  561. Begin
  562.  MouseHide;
  563.  SetActivePage(1);
  564.  FillScreen(32+256*7);
  565.  repeat
  566.   ReadEvent(E);
  567.  until E.What<>evNothing;
  568.  SetActivePage(0);
  569.  MouseShow;
  570.  SetTimeCount;
  571. End;
  572.  
  573. Procedure TKMenuApp.ChangeWin;
  574. Var CW : PKMenuWin;
  575.     W  : PKMenuItem;
  576. Begin
  577.  CW:=PKMenuWin(FindSelect);
  578.  if CW^.Choix<>0
  579.     then begin
  580.           W:=CW^.Items.DonneItem(CW^.Choix);
  581.           if not W^.IsNewMenu
  582.              then begin
  583.                    Patience('Création du fichier Batch...');
  584.                    W^.FaireFichierBatch;
  585.                    FinPatience;
  586.                    EndCode:=0;
  587.                    SetCommand(cmQuit);
  588.                    end
  589.              else begin
  590.                    if Niveau<nbrNiv
  591.                       then begin
  592.                             inc(Niveau);
  593.                             TabNiv[Niveau]:=W^.GetNewMenu;
  594.                             EcrireNiveau;
  595.                             SetCommand(cmKMenu);
  596.                            end;
  597.                   end;
  598.          end
  599.     else begin
  600.           if Niveau>1
  601.              then begin
  602.                    dec(Niveau);
  603.                    EcrireNiveau;
  604.                    SetCommand(cmKMenu);
  605.                   end
  606.              else begin
  607.                    if ConfirmExit
  608.                       then begin
  609.                             SetCommand(cmQuit);
  610.                             EndCode:=2;
  611.                            end
  612.                   end;
  613.          end;
  614.  CW^.ExitCode:=0;
  615. End;
  616.  
  617. Function TKMenuApp.TestPassWord:Boolean;
  618. Begin
  619.  if MotDePasse=''
  620.     then TestPassWord:=true
  621.     else TestPassWord:=PassWord(MotDePasse);
  622. End;
  623.  
  624. Function TKMenuApp.ConfirmExit:Boolean;
  625. Var S:String;
  626.     i:Byte;
  627. Begin
  628.  WinRead(S,' Quitter ? ');
  629.  if S<>''
  630.     then for i:=1 to length(S) do
  631.           S[i]:=upcase(S[i]);
  632.  if S='OUI'
  633.     then ConfirmExit:=true
  634.     else ConfirmExit:=false;
  635. End;
  636.  
  637. {---------------------------------------------------------------------------}
  638.  
  639. Var MonApp:PKMenuApp;
  640.  
  641. BEGIN
  642. {$IFDEF DEBUG}
  643.  InitMem;
  644. {$ENDIF}
  645.  QuitMsg:='';
  646.  MonApp:=New(PKMenuApp,Init);
  647.  MonApp^.Exec;
  648.  dispose(MonApp,Done);
  649. {$IFDEF DEBUG}
  650.  diagmem;
  651. {$ENDIF}
  652.  halt(EndCode);
  653. END.
  654.  
  655. {                         Fin du Fichier KMenu2.Pas                         }
  656.