home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 19 / CD_ASCQ_19_010295.iso / dos / prg / pas / ktools / source / ochamp.pas < prev    next >
Pascal/Delphi Source File  |  1994-10-31  |  3KB  |  133 lines

  1. Unit OChamp;
  2. { Unité définissant un champ d'édition d'une ligne. }
  3. { Il s'agit d'un champ abstrait qui nécessite une procédure d'affichage. }
  4. { K.B. mai-novembre 1994 }
  5.  
  6. {$IFDEF debug}
  7.  {$A+,B-,D+,E-,F-,I+,L+,N-,R+,S+,V-,W+,X+}
  8. {$ELSE}
  9.  {$A+,B-,D-,E-,F-,I+,L-,N-,R-,S-,V-,W+,X+}
  10. {$ENDIF}
  11.  
  12. INTERFACE
  13.  
  14. Uses UDrivers;
  15.  
  16. Type
  17.  PChamp=^TChamp;
  18.  TChamp=object
  19.   Txt:String;         { contenu d'édition }
  20.   MaxLen:Byte;        { longueur maxi de la réponse }
  21.   ScrLen:Byte;        { longueur maxi d'affichage }
  22.   XStr:Byte;          { position dans la chaine }
  23.   XScr:Byte;          { position à l'écran }
  24.   Col1:Byte;          { 1er caractère affiché }
  25.   Constructor Init(S:String;MLStr,MLScr:Byte);
  26.   { S donne le contenu initial du champ }
  27.   Destructor Done;virtual;
  28.   Procedure  Avance;
  29.   Procedure  Recule;
  30.   Function   Exec(code:Word):Word;
  31.   { répond à la frappe de la touche code }
  32.   Function   GetDrawString:String;
  33.   { renvoie la chaine à afficher }
  34.   Function   Renvoi:String;
  35.   End;
  36.  
  37. IMPLEMENTATION
  38.  
  39. { objet TChamp }
  40.  
  41. Constructor TChamp.Init(S:String;MLStr,MLScr:Byte);
  42. { S donne le contenu initial du champ }
  43. Begin
  44.  Txt:=S;
  45.  MaxLen:=MLStr;
  46.  ScrLen:=MLScr;
  47.  if length(Txt)>MaxLen
  48.     then Txt[0]:=chr(MaxLen);
  49.  Col1:=1;
  50.  XScr:=1;
  51.  XStr:=1;
  52.  while XStr<=length(Txt) do Avance;
  53. End;
  54.  
  55. Destructor TChamp.Done;
  56. Begin
  57. End;
  58.  
  59. Procedure TChamp.Avance;
  60. Begin
  61.  if XStr>length(Txt)
  62.     then exit;
  63.  inc(XStr);
  64.  if XStr-Col1+1>ScrLen
  65.     then inc(Col1)
  66.     else inc(XScr);
  67. End;
  68.  
  69. Procedure TChamp.Recule;
  70. Begin
  71.  if XStr=1
  72.     then exit;
  73.  dec(XStr);
  74.  if XStr<Col1
  75.     then dec(Col1)
  76.     else dec(XScr);
  77. End;
  78.  
  79. Function TChamp.Exec(code:Word):Word;
  80. Var r:Word;
  81. Begin
  82.  r:=0;
  83.  case code of
  84.   Echap: begin
  85.           Txt:='';
  86.           r:=Echap;
  87.          end;
  88.     Ret: r:=Ret;
  89.    CsRg: Avance;
  90.    CsLf: Recule;
  91.    Home: begin
  92.           Col1:=1;
  93.           XStr:=1;
  94.           XScr:=1;
  95.          end;
  96.     Fin: while XStr<=length(Txt)
  97.            do Avance;
  98.   Suppr: if XStr<=length(Txt)
  99.             then system.delete(Txt,XStr,1);
  100.     BSP: if XStr>1
  101.             then begin
  102.                   Recule;
  103.                   system.delete(Txt,XStr,1);
  104.                  end;
  105.   32..255: if length(Txt)<MaxLen
  106.               then begin
  107.                     system.insert(chr(code),Txt,XStr);
  108.                     Avance;
  109.                    end;
  110.   end;
  111.  Exec:=r;
  112. End;
  113.  
  114. Function TChamp.GetDrawString:String;
  115. Var S:String;
  116. Begin
  117.  S:=copy(Txt,Col1,length(Txt)-col1+1);
  118.  if length(S)>ScrLen
  119.     then S[0]:=chr(ScrLen)
  120.     else while length(S)<ScrLen
  121.           do S:=S+' ';
  122.  GetDrawString:=S;
  123. End;
  124.  
  125. Function TChamp.Renvoi:String;
  126. Begin
  127.  Renvoi:=Txt;
  128. End;
  129.  
  130. END.
  131.  
  132. {                         Fin du fichier OChamp.Pas                        }
  133.