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

  1. Unit OFiches;
  2. { unité créant un objet bloc-notes indexé sur des titres }
  3. { le bloc-notes est dans un fichier texte,
  4.   chaque titre de fiche est précédé d'un # }
  5. { K.B. novembre 1994 }
  6.  
  7. INTERFACE
  8.  
  9. Uses Dos,UDrivers,
  10.      OTableau,OTEdit,
  11.      OEdWin,ODialWin,OGenView,OTxtView;
  12.  
  13. Const
  14.  cmLoadEdit    = $400;
  15.  cmBascule     = $401;
  16.  erTabFiches   = 200;
  17.  
  18. Type PFiche=^TFiche;
  19.      TFiche=Record
  20.       Titre:String[40];
  21.       Texte:PEdObj;
  22.       end;
  23.  
  24.      PTabFiches=^TTabFiches;
  25.      TTabFiches=object(TTabPtr)
  26.       FileName  : String[80];
  27.       Constructor Init;
  28.       Constructor Load(NomDeFichier:String);
  29.       Procedure Effacer(p:Pointer); virtual;
  30.       Function GetErrorMsg:String; virtual;
  31.       Procedure SauverSous(NomDeFichier:String);
  32.       End;
  33.  
  34.      PLFWin=^TLFWin;
  35.      TLFWin=object(TSelWin)
  36.       TabFiches : PTabFiches;
  37.       Constructor Init(x,y,l,h:Integer);
  38.       Constructor Load(x,y,l,h:Integer;NomDeFichier:String);
  39.       Destructor Done; virtual;
  40.       Function  Ligne(n:Integer):String;virtual;
  41.       Function  NombreItems:Integer;virtual;
  42.       Procedure HandleEvent(Var Event:TEvent);virtual;
  43.       Function  GetErrorMsg:String; virtual;
  44.       Procedure AjouteFiche(Tit:String);
  45.       Procedure InsereFiche(Tit:String);
  46.       Procedure SupprimeFiche;
  47.       End;
  48.  
  49.      PEdFiche=^TEdFiche;
  50.      TEdFiche=object(TEdWin)
  51.       Modified  : Boolean;
  52.       Constructor Init(x,y,l,h:Integer;PF:PFiche);
  53.       Destructor Done; virtual;
  54.       Procedure HandleEvent(var Event:TEvent); virtual;
  55.       End;
  56.  
  57. IMPLEMENTATION
  58.  
  59. { objet TTabFiches }
  60.  
  61. Constructor TTabFiches.Init;
  62. Var PF : PFiche;
  63. Begin
  64.  TTabPtr.Init(20,20);
  65.  FileName:='';
  66.  New(PF);
  67.  PF^.Titre:='sans titre';
  68.  PF^.Texte:=New(PEdObj,Init(25,80));
  69.  Ajouter(PF);
  70. End;
  71.  
  72. Constructor TTabFiches.Load(NomDeFichier:String);
  73. Var f:Text;
  74.     S:String;
  75.     PF:PFiche;
  76.     ok:Boolean;
  77. Begin
  78.  TTabPtr.Init(20,20);
  79.  FileName:=NomDeFichier;
  80.  assign(f,NomDeFichier);
  81.  {$I-}
  82.  reset(f);
  83.  {$I+}
  84.  if IOResult<>0
  85.     then begin
  86.           ErrorFlag:=erOpenFile;
  87.           exit;
  88.          end;
  89.  PF:=nil;
  90.  ok:=true;
  91.  {$I-}
  92.  readln(f,S);
  93.  {$I+}
  94.  if IOResult=0
  95.     then begin
  96.           if S[1]<>'#'
  97.              then begin
  98.                    ErrorFlag:=erFormatFile;
  99.                    ok:=false;
  100.                   end;
  101.          end
  102.     else begin
  103.           ErrorFlag:=erReadFile;
  104.           ok:=false;
  105.          end;
  106.  while ok and not(eof(f)) do
  107.    begin
  108.     if (S<>'') and (S[1]='#')
  109.        then begin
  110.              if PF<>nil
  111.                 then Ajouter(PF);
  112.              New(PF);
  113.              PF^.Titre:=copy(S,2,length(S)-1);
  114.              PF^.Texte:=New(PEdObj,Init(25,80));
  115.              if not EOF(f)
  116.                 then begin
  117.                       {$I-}
  118.                       readln(f,S);
  119.                       {$I+}
  120.                       if IOResult<>0
  121.                          then begin
  122.                                ErrorFlag:=erReadFile;
  123.                                ok:=false;
  124.                               end
  125.                          else PF^.Texte^.ChangerLigne(1,S);
  126.                      end;
  127.             end
  128.        else if PF<>nil
  129.                then PF^.Texte^.AjouterLigne(S);
  130.     {$I-}
  131.     readln(f,S);
  132.     {$I+}
  133.     if IOResult<>0
  134.        then begin
  135.              ErrorFlag:=erReadFile;
  136.              ok:=false;
  137.             end;
  138.    end;
  139.  close(f);
  140.  if PF<>nil
  141.     then Ajouter(PF)
  142.     else ErrorFlag:=erFormatFile;
  143. End;
  144.  
  145. Procedure TTabFiches.Effacer(p:Pointer);
  146. Var W : PFiche;
  147. Begin
  148.  if p=nil then exit;
  149.  W:=PFiche(p);
  150.  if W^.Texte<>nil
  151.     then dispose(W^.Texte,done);
  152.  freemem(p,sizeof(TFiche));
  153. End;
  154.  
  155. Function TTabFiches.GetErrorMsg:String;
  156. Begin
  157.  case ErrorFlag of
  158.   erOpenFile   : GetErrorMsg:='Ouverture du fichier impossible.';
  159.   erFormatFile : GetErrorMsg:='Format de fichier incorrect.';
  160.   erReadFile   : GetErrorMsg:='Erreur en lecture du fichier.';
  161.   else GetErrorMsg:=TTabPtr.GetErrorMsg;
  162.   end;
  163. End;
  164.  
  165. Procedure TTabFiches.SauverSous(NomDeFichier:String);
  166. Var S  : String;
  167.     f  : Text;
  168.     n,i : Integer;
  169.     PF : PFiche;
  170. Begin
  171.  assign(f,NomDeFichier);
  172.  {$I-}
  173.  rewrite(f);
  174.  {$I+}
  175.  if IOResult<>0
  176.     then begin
  177.           ErrorFlag:=erOpenFile;
  178.           exit;
  179.          end;
  180.  for n:=1 to NombreItems do
  181.   begin
  182.    Lire(PF,n);
  183.    writeln(f,'#'+PF^.Titre);
  184.    if (PF^.Texte=nil) or (PF^.Texte^.NombreItems=0)
  185.       then writeln(f,'')
  186.       else for i:=1 to PF^.Texte^.NombreItems do
  187.              writeln(f,PF^.Texte^.Ligne(i));
  188.   end;
  189.  close(f);
  190.  FileName:=NomDeFichier;
  191. End;
  192.  
  193. { objet TLFWin }
  194.  
  195. Constructor TLFWin.Init(x,y,l,h:Integer);
  196. Begin
  197.  TSelWin.Init(x,y,l,h,'NOUVEAU');
  198.  Ident:='LISTE';
  199.  PalOffset:=pCyan;
  200.  Etat:=Etat and not(stOmbre);
  201.  TabFiches:=New(PTabFiches,Init);
  202.  if not TabFiches^.IsValid
  203.     then ErrorFlag:=erTabFiches;
  204. End;
  205.  
  206. Constructor TLFWin.Load(x,y,l,h:Integer;NomDeFichier:String);
  207. Var D : DirStr;
  208.     N : NameStr;
  209.     E : ExtStr;
  210. Begin
  211.  FSplit(NomDeFichier,D,N,E);
  212.  TSelWin.Init(x,y,l,h,N+E);
  213.  Ident:='LISTE';
  214.  PalOffset:=pCyan;
  215.  Etat:=Etat and not(stOmbre);
  216.  TabFiches:=New(PTabFiches,Load(NomDeFichier));
  217.  if not TabFiches^.IsValid
  218.     then ErrorFlag:=erTabFiches;
  219. End;
  220.  
  221. Destructor TLFWin.Done;
  222. Begin
  223.  if TabFiches<>nil
  224.     then dispose(TabFiches,Done);
  225.  TSelWin.Done;
  226. End;
  227.  
  228. Function TLFWin.GetErrorMsg:String;
  229. Begin
  230.  case ErrorFlag of
  231.   erTabFiches : GetErrorMsg:=TabFiches^.GetErrorMsg;
  232.   else GetErrorMsg:=TSelWin.GetErrorMsg;
  233.   end;
  234. End;
  235.  
  236. Function TLFWin.Ligne(n:Integer):String;
  237. Var PF : PFiche;
  238. Begin
  239.  if (n<1) or (n>TabFiches^.NombreItems)
  240.     then begin
  241.           Ligne:='';
  242.           exit;
  243.          end;
  244.  TabFiches^.Lire(PF,n);
  245.  if PF<>nil
  246.     then Ligne:=PF^.Titre
  247.     else Ligne:='';
  248. End;
  249.  
  250. Function TLFWin.NombreItems:Integer;
  251. Begin
  252.  NombreItems:=TabFiches^.NombreItems;
  253. End;
  254.  
  255. Procedure TLFWin.AjouteFiche(Tit:String);
  256. Var PF : PFiche;
  257. Begin
  258.  New(PF);
  259.  PF^.Titre:=Tit;
  260.  PF^.Texte:=New(PEdObj,Init(25,80));
  261.  TabFiches^.Ajouter(PF);
  262.  Choix:=NombreItems;
  263.  DrawInterior;
  264. End;
  265.  
  266. Procedure TLFWin.InsereFiche(Tit:String);
  267. Var PF : PFiche;
  268. Begin
  269.  New(PF);
  270.  PF^.Titre:=Tit;
  271.  PF^.Texte:=New(PEdObj,Init(25,80));
  272.  TabFiches^.Intercaler(PF,Choix);
  273.  DrawInterior;
  274. End;
  275.  
  276. Procedure TLFWin.SupprimeFiche;
  277. Begin
  278.  if NombreItems>1
  279.     then begin
  280.           TabFiches^.Eliminer(Choix);
  281.           if Choix>NombreItems
  282.              then Choix:=NombreItems;
  283.           DrawInterior;
  284.          end;
  285. End;
  286.  
  287. Procedure TLFWin.HandleEvent(Var Event:TEvent);
  288. Var E : TEvent;
  289. Begin
  290.  if (Event.What=evMouseLDown) and (MouseInView) and (Etat and stSelected=0)
  291.     then Select;
  292.  TSelWin.HandleEvent(Event);
  293.  if ExitCode=exOk
  294.     then begin
  295.           ExitCode:=0;
  296.           E.What:=evCommand;
  297.           E.Command:=cmLoadEdit;
  298.           TabFiches^.Lire(E.InfoPtr,Choix);
  299.           SetEvent(E);
  300.          end;
  301. End;
  302.  
  303. { objet TEdFiche }
  304. { éditeur de fiche }
  305.  
  306. Constructor TEdFiche.Init(x,y,l,h:Integer;PF:PFiche);
  307. Begin
  308.  TWindow.Init(x,y,l,h,PF^.Titre);
  309.  Ident:='EDWIN';
  310.  PalOffset:=pCyan;
  311.  Etat:=Etat or stCurseur;
  312.  Etat:=Etat and not(stOmbre);
  313.  Modified:=false;
  314.  EdObj:=PF^.Texte;
  315.  EdObj^.NbLines:=h-2;
  316.  EdObj^.NbCols:=l-2;
  317. End;
  318.  
  319. Destructor TEdFiche.Done;
  320. Begin
  321.  TWindow.Done;
  322. End;
  323.  
  324. Procedure TEdFiche.HandleEvent(var Event:TEvent);
  325. Begin
  326.  if not Modified
  327.     then Modified:=EdObj^.TextChanged;
  328.  { empêcher la fermeture héritée }
  329.  if (Event.What=evKeyDown) and (Event.KeyCode=Echap)
  330.     then Event.What:=evNothing;
  331.  if (Event.What=evMouseRUp) and (Etat and stSelected<>0)
  332.     then Event.What:=evNothing;
  333.  { sélection à la souris }
  334.  if (Event.What=evMouseLDown) and MouseInView and (Etat and stSelected=0)
  335.     then begin
  336.           SetCommand(cmBascule);
  337.           exit;
  338.          end;
  339.  { gestion éditeur }
  340.  TEdWin.HandleEvent(Event);
  341. End;
  342.  
  343. END.
  344.  
  345. {                         Fin du Fichier OFiches.Pas                        }
  346.