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

  1. Unit ODialWin;
  2. { Unité définissant :
  3.   - 2 fenêtres de dialogue : une fenêtre de message et une
  4.   fenêtre de lecture d'une chaine de caractères.
  5.   - des fenêtres de sélection }
  6. { KB mai-novembre 1994 }
  7.  
  8. {$IFDEF debug}
  9.  {$A+,B-,D+,E-,F-,I+,L+,N-,R+,S+,V-,W+,X+}
  10. {$ELSE}
  11.  {$A+,B-,D-,E-,F-,I+,L-,N-,R-,S-,V-,W+,X+}
  12. {$ENDIF}
  13.  
  14. INTERFACE
  15.  
  16. Uses Dos,UDrivers,UTextScr,
  17.      OChamp,OTableau,OFDirTab,
  18.      OGenView,OTxtView;
  19.  
  20. Const
  21.  erMenuItems=200;
  22.  erDirTab=201;
  23.  
  24. Type
  25.  TStr12=String[12];
  26.  TStr30=String[30];
  27.  TStr80=String[80];
  28.  
  29.  PMessageWin=^TMessageWin;
  30.  TMessageWin=object(TWindow)
  31.   Txt:String;
  32.   Constructor Init(Msg:String);
  33.   Procedure DrawInterior;virtual;
  34.   Procedure HandleEvent(Var Event:TEvent);virtual;
  35.   End;
  36.  
  37.  PDialWin=^TDialWin;
  38.  TDialWin=object(TWindow)
  39.   Champ:PChamp;
  40.   Constructor Init(l:Integer;Tit:TStr30);
  41.   Destructor Done;virtual;
  42.   Procedure DrawInterior;virtual;
  43.   Procedure Select; virtual;
  44.   Procedure HandleEvent(Var Event:TEvent);virtual;
  45.   Procedure SetData(Var Rec);virtual;
  46.   Procedure GetData(Var Rec);virtual;
  47.   Function DataSize:Integer;virtual;
  48.   End;
  49.  
  50.  PPassWordWin=^TPassWordWin;
  51.  TPassWordWin=object(TWindow)
  52.   Mot:TStr12;
  53.   MotDePasse:TStr12;
  54.   XPos:Byte;
  55.   Constructor Init(M:TStr12);
  56.   Procedure HandleEvent(Var Event:TEvent);virtual;
  57.   Procedure DrawInterior;virtual;
  58.   Function IsOk:Boolean;
  59.   End;
  60.  
  61.  PSelWin=^TSelWin;
  62.  TSelWin=object(TWindow)
  63.   Choix:Integer;
  64.   L1:Integer;
  65.   Constructor Init(x,y,l,h:Integer;T:String);
  66.   Function Ligne(n:Integer):String;virtual;
  67.   Function NombreItems:Integer;virtual;
  68.   Procedure Avancer(n:Integer);
  69.   Function DonneChoix:Integer;
  70.   Procedure DrawInterior;virtual;
  71.   Procedure HandleEvent(Var Event:TEvent);virtual;
  72.   End;
  73.  
  74.  PMenuWin=^TMenuWin;
  75.  TMenuWin=object(TSelWin)
  76.   Items:TTableau;
  77.   Constructor Init(xi,yi:Integer);
  78.   Destructor Done;virtual;
  79.   Function GetErrorMsg:String;virtual;
  80.   Function Ligne(n:Integer):String;virtual;
  81.   Function NombreItems:Integer;virtual;
  82.   Procedure HandleEvent(Var Event:TEvent);virtual;
  83.   Procedure AjouterItem(N:TStr30;K:Word);
  84.   End;
  85.  
  86.  PDirWin=^TDirWin;
  87.  TDirWin=object(TSelWin)
  88.   DirTab:TFileTab;
  89.   Constructor Init(xi,yi,h:Byte;CheminMasque:PathStr);
  90.   Destructor Done;virtual;
  91.   Function  GetErrorMsg:String;virtual;
  92.   Function  NombreItems:Integer;virtual;
  93.   Function  Ligne(n:Integer):String;virtual;
  94.   Procedure HandleEvent(Var Event:TEvent);virtual;
  95.   Function  FichierChoisi:String;
  96.   end;
  97.  
  98. Function  GetFile(Mask:PathStr):PathStr;
  99. Procedure Message(S:String);
  100. Procedure WinRead(Var S:String; Tit:String);
  101. Function  PassWord(S:TStr12):Boolean;
  102.  
  103. IMPLEMENTATION
  104.  
  105. Procedure Scrute(S:String;Var h,l:Integer);
  106. { renvoie dans l la largeur de S et dans h sa hauteur en lignes }
  107. Var i,lt:Byte;
  108. Begin
  109.  h:=1;
  110.  l:=0;
  111.  lt:=0;
  112.  for i:=1 to length(S) do
  113.   begin
  114.    if S[i]=#13
  115.       then begin
  116.             inc(h);
  117.             if lt>l
  118.                then l:=lt;
  119.             lt:=0;
  120.            end
  121.       else inc(lt);
  122.   end;
  123.  if lt>l
  124.     then l:=lt;
  125. End;
  126.  
  127. { objet TMessageWin }
  128.  
  129. Constructor TMessageWin.Init(Msg:String);
  130. Var x,y,h,l:Integer;
  131. Begin
  132.  Scrute(Msg,h,l);
  133.  if l>70
  134.     then l:=70;
  135.  if l<10
  136.     then l:=10;
  137.  x:=(80-l-4) div 2;
  138.  y:=(25-h-2) div 2;
  139.  TWindow.Init(x,y,l+2,h+2,' INFO ');
  140.  Ident:='MSGWIN';
  141.  PalOffset:=pVert;
  142.  Txt:=Msg;
  143. End;
  144.  
  145. Procedure TMessageWin.DrawInterior;
  146. Var x,y,i:Byte;
  147. Begin
  148.  x:=1;
  149.  y:=1;
  150.  for i:=1 to length(Txt) do
  151.   begin
  152.    case Txt[i] of
  153.     #13: begin
  154.           inc(y);
  155.           x:=1;
  156.          end;
  157.     #10:;
  158.     else begin
  159.           Ecrire(Txt[i],x,y,0);
  160.           inc(x);
  161.          end;
  162.    end;
  163.   end;
  164. End;
  165.  
  166. Procedure TMessageWin.HandleEvent(Var Event:TEvent);
  167. Begin
  168.  TWindow.HandleEvent(Event);
  169.  if (Event.What=evKeyDown) or (Event.What=evMouseLDown)
  170.     then ExitCode:=exAnnule;
  171. End;
  172.  
  173. { objet TDialWin }
  174.  
  175. Constructor TDialWin.Init(l:Integer;Tit:TStr30);
  176. Var x:Integer;
  177. Begin
  178.  if l>70 then l:=70;
  179.  x:=(80-l) div 2;
  180.  TWindow.Init(x,10,l+2,3,Tit);
  181.  Etat:=Etat or stCurseur;
  182.  PalOffset:=pGris;
  183.  Champ:=new(PChamp,Init('',80,Largeur));
  184. End;
  185.  
  186. Destructor TDialWin.Done;
  187. Begin
  188.  dispose(Champ,Done);
  189.  TWindow.Done;
  190. End;
  191.  
  192. Procedure TDialWin.Select;
  193. Var P : TPoint;
  194. Begin
  195.  TWindow.Select;
  196.  if Champ<>nil
  197.     then begin
  198.           MakeGlobal(Origin,P);
  199.           SetCursorPos(P.X+Champ^.XScr,P.Y+1);
  200.          end;
  201. End;
  202.  
  203. Procedure TDialWin.DrawInterior;
  204. Var Temp:String;
  205.     P : TPoint;
  206. Begin
  207.  Temp:=Champ^.GetDrawString;
  208.  Ecrire(Temp,1,1,0);
  209.  MakeGlobal(Origin,P);
  210.  SetCursorPos(P.X+Champ^.XScr,P.Y+1);
  211. End;
  212.  
  213. Procedure TDialWin.HandleEvent(Var Event:TEvent);
  214. Var r:Word;
  215. Begin
  216.  TWindow.HandleEvent(Event);
  217.  if ExitCode=exAnnule
  218.     then Champ^.Txt:='';
  219.  if Event.What=evKeyDown
  220.     then begin
  221.           r:=Champ^.Exec(Event.KeyCode);
  222.           if r=Ret
  223.              then ExitCode:=exOk;
  224.          end
  225.     else exit;
  226.  Event.What:=evNothing;
  227.  DrawInterior;
  228. End;
  229.  
  230. Procedure TDialWin.GetData(Var Rec);
  231. Begin
  232.  String(Rec):=Champ^.Renvoi;
  233. End;
  234.  
  235. Procedure TDialWin.SetData(Var Rec);
  236. Begin
  237.  Dispose(champ,done);
  238.  Champ:=New(PChamp,Init(String(Rec),80,Largeur));
  239. End;
  240.  
  241. Function TDialWin.DataSize:Integer;
  242. Begin
  243.  DataSize:=256;
  244. End;
  245.  
  246. { objet TPassWordWin }
  247.  
  248. Constructor TPassWordWin.Init(M:TStr12);
  249. Begin
  250.  TWindow.Init(29,10,19,3,'Mot de passe');
  251.  Etat:=Etat or stCurseur;
  252.  PalOffset:=pRouge;
  253.  MotDePasse:=M;
  254.  Mot:='';
  255.  XPos:=1;
  256. End;
  257.  
  258. Procedure TPassWordWin.HandleEvent(Var Event:TEvent);
  259. Begin
  260.  TWindow.HandleEvent(Event);
  261.  if ExitCode=exAnnule
  262.     then Mot:='';
  263.  case Event.What of
  264.   evKeyDown:
  265.    case Event.KeyCode of
  266.     BSP:if xpos>1
  267.            then begin
  268.                  Ecrire(' ',xpos-1,1,0);
  269.                  dec(xpos);
  270.                  DrawInterior;
  271.                 end;
  272.     Ret: ExitCode:=exOk;
  273.     32..255: if XPos<12
  274.                 then begin
  275.                       Mot:=Mot+chr(Event.KeyCode);
  276.                       Ecrire('X',xpos,1,0);
  277.                       inc(xpos);
  278.                       DrawInterior;
  279.                      end;
  280.     else exit;
  281.     end;
  282.   else exit;
  283.  end;
  284.  Event.What:=evNothing;
  285.  Event.InfoPtr:=@self;
  286. End;
  287.  
  288. Procedure TPassWordWin.DrawInterior;
  289. Begin
  290.  SetCursorPos(Origin.X+xpos,Origin.Y+1);
  291. End;
  292.  
  293. Function TPassWordWin.IsOk:Boolean;
  294. Begin
  295.  if Mot=MotDePasse
  296.     then IsOk:=true
  297.     else IsOk:=false;
  298. End;
  299.  
  300. { objet TSelWin }
  301.  
  302. Constructor TSelWin.Init(x,y,l,h:Integer;T:String);
  303. Begin
  304.  TWindow.Init(x,y,l,h,T);
  305.  Ident:='SELWIN';
  306.  PalOffset:=pGris;
  307.  Choix:=1;
  308.  L1:=1;
  309. End;
  310.  
  311. Function TSelWin.Ligne(n:Integer):String;
  312. Begin
  313.  Ligne:='';
  314. End;
  315.  
  316. Function TSelWin.NombreItems:Integer;
  317. Begin
  318.  NombreItems:=0;
  319. End;
  320.  
  321. Procedure TSelWin.Avancer(n:Integer);
  322. Begin
  323.  Choix:=Choix+n;
  324.  if Choix<1
  325.     then Choix:=1;
  326.  if Choix>NombreItems
  327.     then Choix:=NombreItems;
  328.  if Choix<L1
  329.     then L1:=Choix;
  330.  if Choix>L1+Hauteur-1
  331.     then L1:=Choix-Hauteur+1;
  332. End;
  333.  
  334. Function TSelWin.DonneChoix:Integer;
  335. Begin
  336.  DonneChoix:=Choix;
  337. End;
  338.  
  339. Procedure TSelWin.DrawInterior;
  340. Var i:Byte;
  341.     temp:Byte;
  342.     S:String;
  343. Begin
  344.  for i:=1 to Hauteur do
  345.   begin
  346.    S:=Ligne(L1+i-1);
  347.    Ajuste(S,largeur);
  348.    if L1+i-1=Choix
  349.         then Ecrire(S,1,i,1)
  350.         else Ecrire(S,1,i,0);
  351.   end;
  352. End;
  353.  
  354. Procedure TSelWin.HandleEvent(Var Event:TEvent);
  355. Var i:Byte;
  356.     delta:Integer;
  357.     P : TPoint;
  358. Begin
  359.  TWindow.HandleEvent(Event);
  360.  if (ExitCode<>0) and (ExitCode<>exOk)
  361.     then Choix:=0;
  362.  MakeGlobal(Origin,P);
  363.  case Event.What of
  364.    evMouseAuto:
  365.      if Event.LButton and SurCadre(Event.Where)
  366.         then begin
  367.               if Event.Where.Y>P.Y+hauteur div 2
  368.                  then Avancer(1)
  369.                  else Avancer(-1);
  370.               wait(1);
  371.              end
  372.         else exit;
  373.    evDoubleClic:
  374.      begin
  375.       if (not MouseInView) or (Etat and stSelected=0)
  376.          then exit;
  377.       if not SurCadre(Event.Where)
  378.          then begin
  379.                delta:=Event.Where.Y-P.Y-1;
  380.                if L1+delta=Choix
  381.                   then SetCommand(cmOk)
  382.                   else if L1+delta<=NombreItems
  383.                           then Choix:=L1+delta;
  384.               end
  385.          else exit;
  386.      end;
  387.    evMouseLDown:
  388.      begin
  389.       if (not MouseInView) or (Etat and stSelected=0)
  390.          then exit;
  391.       if not SurCadre(Event.Where)
  392.          then begin
  393.                delta:=Event.Where.Y-P.Y-1;
  394.                if L1+delta<=NombreItems
  395.                   then Choix:=L1+delta
  396.                   else exit;
  397.               end
  398.          else exit;
  399.      end;
  400.    evKeyDown:
  401.      case Event.KeyCode of
  402.       ret : SetCommand(cmOk);
  403.       csup: Avancer(-1);
  404.       csdn: Avancer(1);
  405.       pgup: Avancer(-10);
  406.       pgdn: Avancer(10);
  407.       else exit;
  408.       end;
  409.    evCommand:
  410.      case Event.Command of
  411.       cmOk: ExitCode:=exOk;
  412.       else exit;
  413.       end;
  414.    else exit;
  415.    end;
  416.  DrawInterior;
  417.  Event.What:=evNothing;
  418. End;
  419.  
  420. { objet TMenuWin }
  421.  
  422. Constructor TMenuWin.Init(xi,yi:Integer);
  423. Begin
  424.  TSelWin.Init(xi,yi,10,2,' Menu ');
  425.  Items.Init(5,5,sizeof(TMenuItem));
  426.  if not Items.IsValid
  427.     then ErrorFlag:=erMenuItems;
  428. End;
  429.  
  430. Destructor TMenuWin.Done;
  431. Begin
  432.  Items.Done;
  433.  TSelWin.Done;
  434. End;
  435.  
  436. Function TMenuWin.GetErrorMsg:String;
  437. Begin
  438.  case ErrorFlag of
  439.   erMenuItems: GetErrorMsg:=Items.GetErrorMsg;
  440.   else GetErrorMsg:=TSelWin.GetErrorMsg;
  441.   end;
  442. End;
  443.  
  444. Function TMenuWin.Ligne(n:Integer):String;
  445. Var V:TMenuItem;
  446.     S:String;
  447. Begin
  448.  if (n<1) or (n>NombreItems)
  449.     then S:=''
  450.     else begin
  451.           Items.Lire(V,n);
  452.           S:=V.Nom;
  453.          end;
  454.  Ligne:=S;
  455. End;
  456.  
  457. Function TMenuWin.NombreItems:Integer;
  458. Begin
  459.  NombreItems:=Items.NombreItems;
  460. End;
  461.  
  462. Procedure TMenuWin.HandleEvent(Var Event:TEvent);
  463. Var V:TMenuItem;
  464. Begin
  465.  TSelWin.HandleEvent(Event);
  466.  if (ExitCode=exOk) and (Choix>0) and (Choix<=NombreItems)
  467.     then begin
  468.           Items.Lire(V,Choix);
  469.           SetCommand(V.Touche);
  470.          end;
  471. End;
  472.  
  473. Procedure TMenuWin.AjouterItem(N:TStr30;K:Word);
  474. Var V : TMenuItem;
  475.     P : TPoint;
  476. Begin
  477.  MakeMenuItem(V,N,K);
  478.  MakeLocal(Origin,P);
  479.  Items.Ajouter(V);
  480.  if P.Y+Size.Y<21
  481.     then inc(Size.Y);
  482.  if length(N)>largeur
  483.     then Size.X:=length(N)+2;
  484. End;
  485.  
  486. { objet TDirWin }
  487.  
  488. Constructor TDirWin.Init(xi,yi,h:Byte;CheminMasque:PathStr);
  489. Begin
  490.  TSelWin.Init(xi,yi,22,h+1,' Fichiers ');
  491.  DirTab.Init(CheminMasque);
  492.  if not DirTab.Isvalid
  493.     then ErrorFlag:=erDirtab
  494.     else if DirTab.NombreItems=0
  495.             then Choix:=0;
  496. End;
  497.  
  498. Destructor TDirWin.Done;
  499. Begin
  500.  DirTab.Done;
  501.  TSelWin.Done;
  502. End;
  503.  
  504. Function TDirWin.GetErrorMsg:String;
  505. Begin
  506.  if ErrorFlag=erDirTab
  507.     then GetErrorMsg:=DirTab.GetErrorMsg
  508.     else GetErrorMsg:=TSelWin.GetErrorMsg;
  509. End;
  510.  
  511. Function TDirWin.NombreItems:Integer;
  512. Begin
  513.  NombreItems:=DirTab.NombreItems;
  514. End;
  515.  
  516. Function TDirWin.Ligne(n:Integer):String;
  517. Var P:PSearchFileRec;
  518.     S1,S2:String;
  519.     t:LongInt;
  520. Begin
  521.  if (n<1) or (n>NombreItems)
  522.     then begin
  523.           Ligne:='';
  524.           exit;
  525.          end;
  526.  DirTab.Lire(P,n);
  527.  S1:=NomFichier(P);
  528.  if AttributFichier(P) and Directory <> 0
  529.     then S2:='<REP>'
  530.     else begin
  531.           t:=TailleFichier(P) div 1024;
  532.           str(t:4,S2);
  533.           S2:=S2+' Ko';
  534.          end;
  535.  Ajuste(S1,13);
  536.  S1:=S1+S2;
  537.  Ligne:=S1;
  538. End;
  539.  
  540. Procedure TDirWin.HandleEvent(Var Event:TEvent);
  541. Var P:PSearchFileRec;
  542. Begin
  543.  TSelWin.HandleEvent(Event);
  544.  if ExitCode=exOk
  545.     then begin
  546.           DirTab.Lire(P,Choix);
  547.           if AttributFichier(P) and Directory <> 0
  548.              then begin
  549.                    with DirTab do
  550.                     ChangeDir(DonneRepertoire+NomFichier(P));
  551.                    if not DirTab.IsValid
  552.                       then begin
  553.                             ErrorFlag:=erDirTab;
  554.                             ExitCode:=exAnnule;
  555.                             Choix:=0;
  556.                             Event.What:=evNothing;
  557.                             exit;
  558.                            end;
  559.                    ExitCode:=0;
  560.                    if DirTab.NombreItems>=1
  561.                       then Choix:=1
  562.                       else Choix:=0;
  563.                    L1:=1;
  564.                    DrawInterior;
  565.                    Event.What:=evNothing;
  566.                   end;
  567.          end;
  568. End;
  569.  
  570. Function TDirWin.FichierChoisi:String;
  571. Var P:PSearchFileRec;
  572. Begin
  573.  if (Choix<1) or (Choix>NombreItems)
  574.     then FichierChoisi:=''
  575.     else begin
  576.           DirTab.Lire(P,Choix);
  577.           FichierChoisi:=DirTab.DonneRepertoire+NomFichier(P);
  578.          end;
  579. End;
  580.  
  581. { procédures et fonctions utilisant les objets définis }
  582.  
  583. Procedure Message(S:String);
  584. Var W:PMessageWin;
  585.     b:Byte;
  586.     C:TCursorState;
  587. Begin
  588.  {GetCursorState(C);}
  589.  W:=New(PMessageWin,Init(S));
  590.  Application^.Insert(W);
  591.  b:=W^.Exec;
  592.  dispose(W,Done);
  593.  {SetCursorState(C);}
  594. End;
  595.  
  596. Procedure WinRead(Var S:String; Tit:String);
  597. Var W:PDialWin;
  598.     b:Byte;
  599.     C:TCursorState;
  600. Begin
  601.  {GetCursorState(C);}
  602.  W:=New(PDialWin,Init(40,Tit));
  603.  Application^.Insert(W);
  604.  b:=W^.Exec;
  605.  if b=exOk
  606.     then W^.GetData(S)
  607.     else S:='';
  608.  dispose(W,Done);
  609.  {SetCursorState(C);}
  610. End;
  611.  
  612. Function PassWord(S:TStr12):Boolean;
  613. Var W:PPassWordWin;
  614.     b:Byte;
  615.     C:TCursorState;
  616. Begin
  617.  {GetCursorState(C);}
  618.  W:=New(PPassWordWin,Init(S));
  619.  Application^.Insert(W);
  620.  b:=W^.Exec;
  621.  PassWord:=W^.IsOk;
  622.  dispose(W,Done);
  623.  {SetCursorState(C);}
  624. End;
  625.  
  626. Function GetFile(Mask:PathStr):PathStr;
  627. Var W:PDirWin;
  628.     b:Byte;
  629.     C:TCursorState;
  630. Begin
  631.  {GetCursorState(C);}
  632.  W:=New(PDirWin,Init(1,2,20,Mask));
  633.  Application^.Insert(W);
  634.  b:=W^.Exec;
  635.  if W^.IsValid
  636.     then GetFile:=W^.FichierChoisi
  637.     else GetFile:='';
  638.  Dispose(W,Done);
  639.  {SetCursorState(C);}
  640. End;
  641.  
  642. END.
  643.  
  644. {                        Fin du fichier ODialWin.Pas                        }
  645.