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

  1. Program WriRead;
  2. { lecture de fichiers *.WRI produits par Write pour Windows;
  3.   utilisation de l'objet TTextFile et des unités de fenêtrage }
  4. { KB août-novembre 1994 }
  5.  
  6. {.$DEFINE debug}
  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. Uses Dos,Printer,
  15.      UMem,UDrivers,
  16.      OGenView,OTxtView,ODialWin,OHelpWin,OFWrite;
  17.  
  18. Const
  19.  cmFile=$300;
  20.  cmInit=$301;
  21.  cmOpen=$302;
  22.  cmCherche=$303;
  23.  cmDialCherche=$304;
  24.  cmChercheEncore=$305;
  25.  cmMenu=$306;
  26.  cmHelp=$307;
  27.  cmImprimer=$308;
  28.  cmAbout=$309;
  29.  
  30.  erFile       = 10;
  31.  NbSpCar      = 26;
  32.  
  33.  TableASCII:String[NbSpCar] =
  34.    'àâäéèêëîïôöùûüç²°─Éǽ¼«»º ' ;
  35.  TableANSI:String[NbSpCar] =
  36.    #224#226#228#233#232#234#235#238#239#244#246#249#251#252#231+
  37.    #178#176#151#201#199#189#188#171#187#186#9;
  38.  
  39. Type
  40.  PSelWriWin=^TSelWriWin;
  41.  TSelWriWin=object(TDirWin)
  42.   Constructor Init;
  43.   Procedure HandleEvent(Var Event:TEvent); virtual;
  44.   End;
  45.  
  46.  PWriWin=^TWriWin;
  47.  TWriWin=object(TWindow)
  48.   Fichier  : PWriFile;
  49.   Ligne1   : Integer;
  50.   Marge    : Integer;
  51.   Constructor Init(xi,yi,xf,yf:Byte;NomFichier:PathStr);
  52.   Destructor Done;virtual;
  53.   Function  GetErrorMsg:String;virtual;
  54.   Procedure HandleEvent(Var Event:TEvent);virtual;
  55.   Procedure DrawInterior;virtual;
  56.   Procedure Scroll(x,y:integer);
  57.   Function  Trouve(S:String):Boolean;
  58.   Procedure Imprime;
  59.   End;
  60.  
  61.  PWriApp=^TWriApp;
  62.  TWriApp=object(TTextApp)
  63.   SearchText    : String[80];
  64.   Constructor Init;
  65.   Procedure InitStatusLine;virtual;
  66.   Procedure HandleEvent(Var Event:TEvent);virtual;
  67.   Procedure MakeTextWin(S:PathStr);
  68.   Function InitMenu:PMenuWin;
  69.   End;
  70.  
  71. Procedure StrAnsiToAsci(Var S:String);
  72. Var i,l:Byte;
  73. Begin
  74.  For i:=1 to length(S) do
  75.   begin
  76.    l:=pos(S[i],TableAnsi);
  77.    if l<>0
  78.       then S[i]:=TableASCII[l];
  79.   end;
  80. End;
  81.  
  82. Procedure StrAsciToAnsi(Var S:String);
  83. Var i,l:Byte;
  84. Begin
  85.  For i:=1 to length(S) do
  86.   begin
  87.    l:=pos(S[i],TableASCII);
  88.    if l<>0
  89.       then S[i]:=TableANSI[l];
  90.   end;
  91. End;
  92.  
  93. Function PrinterOK: boolean;
  94. { Vérifie si l'imprimante est prête et transmet le résultat True ou False. }
  95. Var Reg:registers;
  96. Begin
  97.  Reg.ax:=$0200;
  98.  Reg.dx:=0;
  99.  intr($17,Reg);
  100.  if Reg.ah=144
  101.     then PrinterOk:=True
  102.     else PrinterOk:=False;
  103. End;
  104.  
  105. { Objet TSelWriWin }
  106.  
  107. Constructor TSelWriWin.Init;
  108. Begin
  109.  TDirWin.Init(1,2,19,'*.WRI');
  110. End;
  111.  
  112. Procedure TSelWriWin.HandleEvent(Var Event:TEvent);
  113. Begin
  114.  TDirWin.HandleEvent(Event);
  115.  if ExitCode=exOk
  116.     then begin
  117.           ExitCode:=0;
  118.           SetCommand(cmOpen);
  119.          end;
  120. End;
  121.  
  122. { Objet TWriWin }
  123.  
  124. Constructor TWriWin.Init(xi,yi,xf,yf:Byte;NomFichier:PathStr);
  125. Var D:DirStr;
  126.     N:NameStr;
  127.     E:ExtStr;
  128.     t:Word;
  129. Begin
  130.  TWindow.Init(xi,yi,xf,yf,'');
  131.  Ident:='WRIWIN';
  132.  Marge:=1;
  133.  Ligne1:=1;
  134.  Fichier:=new(PWriFile,Init(NomFichier));
  135.  if not Fichier^.IsValid
  136.     then begin
  137.           ErrorFlag:=erFile;
  138.           exit;
  139.          end;
  140.  FSplit(FExpand(Nomfichier),D,N,E);
  141.  Titre:=N+E;
  142. End;
  143.  
  144. Destructor TWriWin.Done;
  145. Begin
  146.  dispose(Fichier,Done);
  147.  TWindow.Done;
  148. End;
  149.  
  150. Function TWriWin.GetErrorMsg:String;
  151. Begin
  152.  case ErrorFlag of
  153.   erFile    : GetErrorMsg:=Fichier^.GetErrorMsg;
  154.   else GetErrorMsg:=TWindow.GetErrorMsg;
  155.   end;
  156. End;
  157.  
  158. Procedure TWriWin.DrawInterior;
  159. Var n:Word;
  160.     S:String;
  161. Begin
  162.  for n:=Ligne1 to Ligne1+Hauteur-1 do
  163.   begin
  164.    S:=Fichier^.DonneLigne(n);
  165.    if length(S)>Marge
  166.       then s:=copy(s,Marge,length(s)-Marge+1)
  167.       else s:='';
  168.    Ajuste(S,Largeur);
  169.    StrAnsiToAsci(S);
  170.    Ecrire(S,1,n-Ligne1+1,0);
  171.   end;
  172. End;
  173.  
  174. Procedure TWriWin.Scroll(x,y:integer);
  175. Var p : LongInt;
  176. Begin
  177.  if x<>0  { déplacement horizontal }
  178.     then begin
  179.           Marge:=Marge+x;
  180.           if Marge>Largeur then Marge:=Largeur;
  181.           if Marge<1 then Marge:=1;
  182.          end;
  183.  if y<>0  { déplacement vertical }
  184.     then begin
  185.           Ligne1:=Ligne1+y;
  186.           if Ligne1<1 then Ligne1:=1;
  187.           Fichier^.TabLigne.Lire(p,Fichier^.TabLigne.NombreItems);
  188.           if (p>=Fichier^.PosFin) and (Ligne1>Fichier^.TabLigne.NombreItems)
  189.              then Ligne1:=Fichier^.TabLigne.NombreItems;
  190.          end;
  191. End;
  192.  
  193. Procedure TWriWin.HandleEvent(Var Event:TEvent);
  194. Begin
  195.  TWindow.HandleEvent(Event);
  196.  case Event.What of
  197.   evMouseAuto:
  198.     begin
  199.      if Event.LButton and SurCadre(Event.Where)
  200.         then begin
  201.               if Event.Where.Y>Origin.Y+hauteur div 2
  202.                  then scroll(0,1)
  203.                  else scroll(0,-1);
  204.              end
  205.         else exit;
  206.     end;
  207.   evKeyDown:
  208.    case Event.KeyCode of
  209.     csdn:scroll(0,1);
  210.     csup:scroll(0,-1);
  211.     pgdn:scroll(0,Hauteur);
  212.     pgup:scroll(0,-Hauteur);
  213.     csrg:scroll(1,0);
  214.     cslf:scroll(-1,0);
  215.     home:Marge:=1;
  216.     cpgup: Ligne1:=1;
  217.     cpgdn: begin
  218.             Ligne1:=Fichier^.NumLigne(Fichier^.PosFin)-Hauteur+1;
  219.             if Ligne1<1 then Ligne1:=1;
  220.            end;
  221.     else exit;
  222.    end;
  223.   else exit;
  224.   end;
  225.  DrawInterior;
  226.  Event.What:=evNothing;
  227. End;
  228.  
  229. Function TWriWin.Trouve(S:String):Boolean;
  230. Var p  : LongInt;
  231. Begin
  232.  StrAsciToAnsi(S);
  233.  p:=Fichier^.PosLigne(Ligne1+1);
  234.  Fichier^.SetFilePosit(p);
  235.  if Fichier^.Find(S)
  236.     then begin
  237.           Ligne1:=Fichier^.NumLigne(Fichier^.GetFilePosit);
  238.           Trouve:=true;
  239.          end
  240.     else Trouve:=false;
  241. End;
  242.  
  243. Procedure TWriWin.Imprime;
  244. Var  UneLigne: string;
  245.      k:Integer;
  246.      p:LongInt;
  247. Begin
  248.  writeln(LST,'');
  249.  with Fichier^ do
  250.   UneLigne:='   '+FDir+FName+FExt;
  251.  writeln(LST,UneLigne);
  252.  write(LST,'   ');
  253.  For k:=1 to length(UneLigne)-3 do
  254.   write(LST,'─');
  255.  writeln(LST,'');
  256.  writeln(LST,'');
  257.  k:=1;
  258.  repeat
  259.   p:=Fichier^.PosLigne(k);
  260.   UneLigne:=Fichier^.DonneLigne(k);
  261.   StrAnsiToAsci(UneLigne);
  262.   writeln(LST,'   '+UneLigne);
  263.   inc(k);
  264.  until p>=Fichier^.PosFin;
  265.  write(LST,#12);
  266. End;
  267.  
  268. { objet TWriApp }
  269.  
  270. Constructor TWriApp.Init;
  271. Var S:String;
  272. Begin
  273.  TTextApp.Init;
  274.  Titre:='Afficheur de fichiers WRITE';
  275.  SearchText:='';
  276.  if paramcount>0
  277.     then SetCommand(cmInit)
  278.     else SetCommand(cmFile);
  279. End;
  280.  
  281. Procedure TWriApp.InitStatusLine;
  282. Begin
  283.  StatusLine:=New(PStatusLine,Init);
  284.  with StatusLine^ do
  285.   begin
  286.    AjouterItem('F1 Aide',F1);
  287.    AjouterItem('F2 Fichier',F2);
  288.    AjouterItem('F10 Menu',F10);
  289.    AjouterItem('AltX Quitter',AltX);
  290.   end;
  291. End;
  292.  
  293. Function TWriApp.InitMenu:PMenuWin;
  294. Var MenuWin:PMenuWin;
  295. Begin
  296.  MenuWin:=New(PMenuWin,Init(10,4));
  297.  MenuWin^.Ident:='MENU';
  298.  if MenuWin^.IsValid
  299.     then begin
  300.           with MenuWin^ do
  301.            begin
  302.             AjouterItem('Fichier...        ',cmFile);
  303.             AjouterItem('Aide...         F1',cmHelp);
  304.             AjouterItem('Imprimer      AltI',cmImprimer);
  305.             AjouterItem('Chercher...     F3',cmDialCherche);
  306.             AjouterItem('Chercher encore F4',cmCherche);
  307.             AjouterItem('A Propos...      ?',cmAbout);
  308.             AjouterItem('Quitter       AltX',cmQuit);
  309.            end;
  310.           InitMenu:=MenuWin;
  311.          end
  312.     else begin
  313.           Message(MenuWin^.GetErrorMsg);
  314.           dispose(MenuWin,Done);
  315.           InitMenu:=nil;
  316.          end;
  317. End;
  318.  
  319. Procedure TWriApp.MakeTextWin(S:PathStr);
  320. Var W:PWriWin;
  321. Begin
  322.  if S=''
  323.     then exit;
  324.  Patience('Chargement en cours...');
  325.  W:=New(PWriWin,Init(1,2,77,20,S));
  326.  FinPatience;
  327.  if W^.IsValid
  328.     then begin
  329.           Insert(W);
  330.           W^.Show
  331.          end
  332.     else begin
  333.           Message(W^.GetErrorMsg);
  334.           dispose(W,Done);
  335.          end;
  336. End;
  337.  
  338. Procedure TWriApp.HandleEvent(Var Event:TEvent);
  339. Var S : String;
  340.     W : PMenuWin;
  341.     H : PHelpWin;
  342.     CurWin : PGenView;
  343.     FileSelector : PDirWin;
  344. Begin
  345.  TTextApp.HandleEvent(Event);
  346.  case Event.What of
  347.   evCommand:
  348.    case Event.Command of
  349.     cmInit: MakeTextWin(ParamStr(1));
  350.     cmOpen:
  351.       begin
  352.        FileSelector:=PDirWin(Event.InfoPtr);
  353.        MakeTextWin(FileSelector^.FichierChoisi);
  354.       end;
  355.     cmFile:
  356.       begin
  357.        ClearDeskTop;
  358.        FileSelector:=New(PSelWriWin,Init);
  359.        FileSelector^.Ident:='FICHIERS';
  360.        Insert(FileSelector);
  361.        FileSelector^.Show;
  362.       end;
  363.     cmMenu:
  364.       begin
  365.        W:=InitMenu;
  366.        if W<>nil
  367.           then begin
  368.                 Insert(W);
  369.                 W^.Exec;
  370.                 dispose(W,Done);
  371.                end;
  372.       end;
  373.     cmHelp:
  374.       begin
  375.        H:=new(PHelpWin,Init(AppPath+'wriread.hlp'));
  376.        if H^.IsValid
  377.           then begin
  378.                 H^.Ident:='AIDE';
  379.                 Insert(H);
  380.                 H^.Exec;
  381.                 dispose(H,Done);
  382.                end
  383.           else begin
  384.                 Message(H^.GetErrorMsg);
  385.                 dispose(H,done);
  386.                end;
  387.       end;
  388.     cmAbout:
  389.       Message(chr(13)
  390.               +'      W R I R E A D   V 1.2          '+chr(13)
  391.               +'         Kostrzewa Bruno             '+chr(13)
  392.               +'         (novembre 1994)             '+chr(13));
  393.     cmImprimer:
  394.       begin
  395.        CurWin:=FindSelect;
  396.        if (CurWin=nil) or (CurWin^.Ident<>'WRIWIN')
  397.           then Message(' Rien à imprimer !!! ')
  398.           else begin
  399.                 if not PrinterOK
  400.                    then Message(' Allumez l''imprimante, SVP... ');
  401.                 if not PrinterOK
  402.                    then Message(' Imprimante hors ligne. '+chr(13)+
  403.                                 '        Abandon.        ')
  404.                    else begin
  405.                          Patience('Impression en cours...');
  406.                          PWriWin(CurWin)^.Imprime;
  407.                          FinPatience;
  408.                         end;
  409.                end;
  410.       end;
  411.     cmDialCherche:
  412.       begin
  413.        CurWin:=FindSelect;
  414.        if (CurWin<>nil) and (CurWin^.Ident='WRIWIN')
  415.           then begin
  416.                 WinRead(SearchText,' Chercher ');
  417.                 if SearchText<>''
  418.                    then SetCommand(cmCherche);
  419.                end
  420.           else Message(' Pas de texte pour chercher ! ');
  421.       end;
  422.     cmCherche:
  423.       begin
  424.        CurWin:=FindSelect;
  425.        if (CurWin<>nil) and (CurWin^.Ident='WRIWIN')
  426.           then begin
  427.                 if SearchText<>''
  428.                    then begin
  429.                          Patience('Recherche de '+SearchText+' en cours...');
  430.                          if not PWriWin(CurWin)^.Trouve(SearchText)
  431.                             then Message(' Recherche terminée. ')
  432.                             else PWriWin(CurWin)^.DrawInterior;
  433.                          FinPatience;
  434.                         end
  435.                    else Message(' Pas de chaine à chercher ! ');
  436.                end
  437.           else Message(' Pas de texte pour chercher ! ');
  438.       end;
  439.     else exit;
  440.    end;
  441.   evKeyDown:
  442.    case Event.KeyCode of
  443.     AltI : SetCommand(cmImprimer);
  444.       F1 : SetCommand(cmHelp);
  445.       F2 : SetCommand(cmFile);
  446.       F3 : SetCommand(cmDialCherche);
  447.       F4 : SetCommand(cmCherche);
  448.      ord('?') : SetCommand(cmAbout);
  449.      F10 : SetCommand(cmMenu);
  450.      else exit;
  451.    end;
  452.   else exit;
  453.  end;
  454.  Event.What:=evNothing;
  455. End;
  456.  
  457. Var MonApp:PWriApp;
  458.  
  459. BEGIN
  460.  {$ifdef debug}
  461.  initmem;
  462.  {$endif}
  463.  MonApp:=New(PWriApp,Init);
  464.  MonApp^.Exec;
  465.  dispose(MonApp,Done);
  466.  {$ifdef debug}
  467.  diagmem;
  468.  {$endif}
  469. END.
  470.  
  471. {                         Fin du fichier WRIREAD.PAS                        }
  472.