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

  1. Unit UIMPRIM;
  2. { Gestion de l'imprimante en mode texte }
  3. { Cette unité permet de gérer l'impression de textes avec des imprimantes
  4.   IBM, Epson, DeskJet500, Canon BJ10E }
  5. { L'impression se fait avec marge, numérotation des pages et titre/entête.}
  6. { Des options permettent d'imprimer la date, les numéros de ligne et le
  7.   nom du fichier. }
  8. { Pour obtenir un résultat correct dans la numération des pages, il
  9.   faut indiquer une valeur correcte pour la variable HauteurPage qui est
  10.   ici initialisée à 11 pouces, soit 66 lignes pour 6 lignes par pouces.
  11.   Si la hauteur est donnée en nombre de lignes par page, il faut donc la
  12.   diviser par 6. }
  13.  
  14. { Kostrzewa Bruno }
  15. { septembre 1994 }
  16.  
  17. {$IFDEF debug}
  18.  {$A+,B-,D+,E-,F-,I+,L+,N-,R+,S+,V-,W+,X+}
  19. {$ELSE}
  20.  {$A+,B-,D-,E-,F-,I+,L-,N-,R-,S-,V-,W+,X+}
  21. {$ENDIF}
  22.  
  23. INTERFACE
  24.  
  25. Uses Printer,
  26.      Dos;
  27.  
  28. Const
  29.  { numéro maximal pour une imprimante }
  30.  impMax     = 4;
  31.  { numéros d'imprimantes }
  32.  impASCII   = 0;    { pour toutes les imprimantes }
  33.  impBJ10E   = 1;    { Canon BJ 10E }
  34.  impIBM     = 2;    { émulation IBM }
  35.  impEpson   = 3;    { émulation Epson }
  36.  impDeskjet = 4;    { Deskjet 500 }
  37.  
  38.  { codes valables pour toutes les imprimantes }
  39.  SautDeLigne = #$0D#$0A;
  40.  SautDePage  = #$0C;
  41.  
  42.  { polices }
  43.  pol10CPI = 0;      { 10 caractères par pouce }
  44.  pol12CPI = 1;      { 12 caractères par pouce }
  45.  pol17CPI = 2;      { 17 caractères par pouce }
  46.  { interlignes }
  47.  int8LPI  = 0;      { 8 lignes par pouce, interligne réduit }
  48.  int6LPI  = 1;      { 6 lignes par pouce, interligne normal }
  49.  { modefrappe }
  50.  mBrouillon = 0;    { qualité brouillon }
  51.  mCourrier  = 1;    { qualité courrier }
  52.  
  53. Const
  54.  { nombre de codes gérés }
  55.  NbCodes = 20;
  56.  { numéros d'ordre }
  57.  code10CPI            = 1;
  58.  code12CPI            = 2;
  59.  code17CPI            = 3;
  60.  codeDoubleLargeur    = 4;
  61.  codeFinDoubleLargeur = 5;
  62.  code6LPI             = 6;
  63.  code8LPI             = 7;
  64.  codeBrouillon        = 8;
  65.  codeCourrier         = 9;
  66.  codeDoubleFrappe     = 10;
  67.  codeFinDoubleFrappe  = 11;
  68.  codeGras             = 12;
  69.  codeFinGras          = 13;
  70.  codeIndice           = 14;
  71.  codeFinIndice        = 15;
  72.  codeExposant         = 16;
  73.  codeFinExposant      = 17;
  74.  codeSouligne         = 18;
  75.  codeFinSouligne      = 19;
  76.  codeInit             = 20;
  77.  
  78. Type
  79.  TCodeStr  = String[6];
  80.  TImpCodes = array[1..NbCodes] of TCodeStr;
  81.  
  82. Const
  83.  EpsonCodes:TImpCodes=
  84.   (
  85.    #18#27#80,         { code10CPI }
  86.    #18#27#77,         { code12CPI }
  87.    #18#27#80#15,      { code17CPI }
  88.    #14,               { codeDoubleLargeur }
  89.    #20,               { codeFinDoubleLargeur }
  90.    #27#50,            { code6LPI }
  91.    #27#48,            { code8LPI }
  92.    #27#120#48,        { codeBrouillon }
  93.    #27#120#49,        { codeCourrier }
  94.    #27#71,            { codeDoubleFrappe }
  95.    #27#72,            { codeFinDoubleFrappe }
  96.    #27#69,            { codeGras }
  97.    #27#70,            { codeFinGras }
  98.    #27#83#49,         { codeIndice }
  99.    #27#84,            { codeFinIndice }
  100.    #27#83#48,         { codeExposant }
  101.    #27#84,            { codeFinExposant }
  102.    #27#45#49,         { codeSouligne }
  103.    #27#45#48,         { codeFinSouligne }
  104.    #27#64             { codeInit }
  105.    );
  106.  
  107.  IBMCodes:TImpCodes=
  108.   (
  109.    #18 ,              { code10CPI }
  110.    #18#27#58,         { code12CPI }
  111.    #18#27#15,         { code17CPI }
  112.    #14,               { codeDoubleLargeur }
  113.    #20,               { codeFinDoubleLargeur }
  114.    #27#50,            { code6LPI }
  115.    #27#48,            { code8LPI }
  116.    #27#73#0,          { codeBrouillon }
  117.    #27#73#2,          { codeCourrier }
  118.    #27#71,            { codeDoubleFrappe }
  119.    #27#72,            { codeFinDoubleFrappe }
  120.    #27#69,            { codeGras }
  121.    #27#70,            { codeFinGras }
  122.    #27#83#49,         { codeIndice }
  123.    #27#84,            { codeFinIndice }
  124.    #27#83#48,         { codeExposant }
  125.    #27#84,            { codeFinExposant }
  126.    #27#45#49,         { codeSouligne }
  127.    #27#45#48,         { codeFinSouligne }
  128.    #24                { codeInit }
  129.    );
  130.  
  131.  DeskJetCodes:TImpCodes=
  132.   (
  133.    #27#40#115'10'#72,      { code10CPI }
  134.    #27#40#115'12'#72,      { code12CPI }
  135.    #27#40#115'17'#72,      { code17CPI }
  136.    #27#40#115'5'#72,       { codeDoubleLargeur }
  137.    #27#40#115'10'#72,      { codeFinDoubleLargeur }
  138.    #27#38#108'6'#68,       { code6LPI }
  139.    #27#38#108'8'#68,       { code8LPI }
  140.    '',                     { codeBrouillon }
  141.    '',                     { codeCourrier }
  142.    '',                     { codeDoubleFrappe }
  143.    '',                     { codeFinDoubleFrappe }
  144.    #27#40#115#51#66,       { codeGras }
  145.    #27#40#115#48#66,       { codeFinGras }
  146.    '',                     { codeIndice }
  147.    '',                     { codeFinIndice }
  148.    '',                     { codeExposant }
  149.    '',                     { codeFinExposant }
  150.    #27#38#100#49#68,       { codeSouligne }
  151.    #27#38#100#64,          { codeFinSouligne }
  152.    #27#69                  { codeInit }
  153.    );
  154.  
  155. Type
  156.  TPrinterConfig=Record   { paramètres de configuration de l'imprimante }
  157.   Police     : Byte;     { 10, 12 ou 17 CPI }
  158.   Interligne : Byte;     { 6 ou 8 lignes par pouce }
  159.   ModeFrappe : Byte;     { brouillon ou courrier }
  160.   End;
  161.  
  162.  TPrinterFormat=Record   { choix d'impression }
  163.   NomFichier : Boolean;
  164.   NoLigne    : Boolean;
  165.   Date       : Boolean;
  166.   Titre      : String[30];
  167.   End;
  168.  
  169.  TStr10=String[10];
  170.  
  171. Const
  172.  CurConfig:TPrinterConfig=
  173.       (Police     : 1;
  174.        Interligne : 0;
  175.        ModeFrappe : 0);
  176.  
  177.  PrinterFormat:TPrinterFormat=
  178.       (NomFichier : false;
  179.        NoLigne    : false;
  180.        Date       : true;
  181.        Titre      : '');
  182.  
  183.  { paramètres d'impression sous forme de constantes initialisées }
  184.  HauteurPage    : Real    = 11;        { Hauteur de page en pouces }
  185.  LargeurPage    : Real    = 8;         { Largeur de page en pouces }
  186.  DeltaY         : Real    = 1/6;       { Espacement vertical }
  187.  DeltaX         : Real    = 1/10;      { Espacement horizontal }
  188.  PrintErrorFlag : Word    = 0;         { Indicateur d'erreurs }
  189.  PrintFileName  : PathStr = '';        { Nom du fichier à imprimer }
  190.  NumPrinter     : Byte    = impASCII;  { Imprimante sélectionnée }
  191.  Marge          : Byte    = 6;         { Marge gauche }
  192.  
  193. Procedure NewLine;
  194. { passer à la ligne }
  195.  
  196. Procedure StartLine;
  197. { commencer une nouvelle ligne }
  198.  
  199. Procedure NewPage;
  200. { nouvelle page }
  201.  
  202. Procedure Page1;
  203. { première page }
  204.  
  205. Procedure PrintCode(S:String);
  206. { envoie une chaine de codes à l'imprimante sans tenir compte des problèmes
  207.   de positionnement et décompte de lignes ou de pages }
  208.  
  209. Procedure PrintStr(S:String);
  210. { envoie une chaine de caractères en tenant compte des sauts de ligne et
  211.   sauts de page }
  212.  
  213. Procedure PrintCar(Car:Char);
  214. { imprime un caractère en tenant compte des problèmes de sauts de ligne et
  215.   sauts de page }
  216.  
  217. Function PrinterOK:Boolean;
  218. { teste si l'imprimante est prête }
  219.  
  220. Procedure PrintFile(NomDeFichier:PathStr);
  221. { impression d'un fichier texte }
  222.  
  223. Procedure StartPrint;
  224. { commence une impression }
  225.  
  226. Procedure EndPrint;
  227. { termine une impression }
  228.  
  229.  
  230. IMPLEMENTATION
  231.  
  232. Var NumPage  : Integer;        { Numérotation de pages du texte }
  233.     NumLigne : Integer;        { Numérotation de lignes du texte }
  234.     XPage    : Real;           { abscisse dans la page }
  235.     YPage    : Real;           { ordonnée dans la page }
  236.  
  237. { utilitaires date }
  238. Function Jour:TStr10;
  239. { retourne le nom du jour }
  240. Var Year,Month,Day,DayOfWeek : Word;
  241. Begin
  242.  getdate(Year,Month,Day,DayOfWeek);
  243.  case DayOfWeek of
  244.    0: jour:= 'Dimanche';
  245.    1: jour:= 'Lundi';
  246.    2: jour:= 'Mardi';
  247.    3: jour:= 'Mercredi';
  248.    4: jour:= 'Jeudi';
  249.    5: jour:= 'Vendredi';
  250.    6: jour:= 'Samedi';
  251.   end; { case }
  252. End;
  253.  
  254. Function Date:TStr10;
  255. { retourne la date actuelle au format JJ.MM.AAAA }
  256. Var Day,Month,Year,DayOfWeek : Word;
  257.     S  : String;
  258.     WS : TStr10;
  259. Begin
  260.  getdate(Year,Month,Day,DayOfWeek);
  261.  str(Day:2,S);
  262.  if S[1]=' ' then S[1]:='0';
  263.  WS:=S+'.';
  264.  str(Month:2,S);
  265.  if S[1]=' ' then S[1]:='0';
  266.  WS:=WS+S+'.';
  267.  str(Year:4,S);
  268.  WS:=WS+S;
  269.  Date:=WS;
  270. End;
  271.  
  272. { utilitaire de transformation d'un entier en chaine de caractères }
  273. Function IntToString(n:Longint):String;
  274. Var S:String;
  275. Begin
  276.  Str(n,S);
  277.  IntToString:=S;
  278. End;
  279.  
  280. Function GetUserCode(num:Byte):TCodeStr;
  281. Begin
  282.  case NumPrinter of
  283.   impBJ10E : GetUserCode:=IBMCodes[num];
  284.   impIBM   : GetUserCode:=IBMCodes[num];
  285.   impEpson : GetUserCode:=EpsonCodes[num];
  286.   impDeskJet : GetUserCode:=DeskJetCodes[num];
  287.   else GetUserCode:='';
  288.   end;
  289. End;
  290.  
  291. Procedure FixeInterLigne(num:Byte);
  292. { Interligne réduit (num=0) ou normal (num=1).                              }
  293. Begin
  294.  if (PrintErrorFlag<>0) or (NumPrinter=impASCII)
  295.     then begin
  296.           DeltaY:=1/6;
  297.           exit;
  298.          end;
  299.  case num of
  300.   0 : begin
  301.        PrintCode(GetUserCode(code8LPI));
  302.        DeltaY:=1/8;
  303.       end;
  304.   1 : begin
  305.        PrintCode(GetUserCode(code6LPI));
  306.        DeltaY:=1/6;
  307.       end;
  308.   end;
  309. End;
  310.  
  311. Procedure FixePolice(NumPolice:Byte);
  312. { Fixe la police utilisée selon numpolice :      }
  313. {     numpolice=0 donne 10cpi                    }
  314. {     numpolice=1 donne 12cpi                    }
  315. {     numpolice=2 donne 17cpi                    }
  316. Begin
  317.  if (PrintErrorFlag<>0) or (NumPrinter=impASCII)
  318.     then begin
  319.           DeltaX:=1/10;
  320.           exit;
  321.          end;
  322.  case NumPolice of
  323.   pol10CPI : begin
  324.               PrintCode(GetUserCode(code10CPI));
  325.               DeltaX:=1/10;
  326.              end;
  327.   pol12CPI : begin
  328.               PrintCode(GetUserCode(code12CPI));
  329.               DeltaX:=1/12;
  330.              end;
  331.   pol17CPI : begin
  332.               PrintCode(GetUserCode(code17CPI));
  333.               DeltaX:=1/17;
  334.              end;
  335.   end;
  336. End;
  337.  
  338. Procedure DoubleLargeur(num:Byte);
  339. { num=0 pour finir et num=1 pour commencer }
  340. Begin
  341.  if (PrintErrorFlag<>0) or (NumPrinter=impASCII)
  342.     then begin
  343.           DeltaX:=1/10;
  344.           exit;
  345.          end;
  346.  case num of
  347.   0 : begin
  348.        PrintCode(GetUserCode(codeFinDoubleLargeur));
  349.        DeltaX:=1/10;
  350.       end;
  351.   1 : begin
  352.        PrintCode(GetUserCode(codeDoubleLargeur));
  353.        DeltaX:=2/10;
  354.       end;
  355.   end;
  356. End;
  357.  
  358. Function PrinterOK:Boolean;
  359. { Vérifie si l'imprimante est prête et transmet le résultat True ou False. }
  360. Var Reg:registers;
  361. Begin
  362.  Reg.ax:=$0200;
  363.  Reg.dx:=0;
  364.  intr($17,Reg);
  365.  if Reg.ah=144
  366.     then PrinterOk:=True
  367.     else PrinterOk:=False;
  368. End;
  369.  
  370. Procedure NewLine;
  371. Begin
  372.  if PrintErrorFlag<>0 then exit;
  373.  YPage:=YPage+DeltaY;
  374.  XPage:=0;
  375.  if YPage >= HauteurPage  { changement de page ? }
  376.     then NewPage
  377.     else PrintCode(SautDeLigne);
  378. End;
  379.  
  380. Procedure MargeVide;
  381. Var i : Byte;
  382. Begin
  383.  if PrintErrorFlag<>0 then exit;
  384.  for i:=1 to Marge do
  385.   PrintCar(' ');
  386. End;
  387.  
  388. Procedure StartLine;
  389. { commence une ligne de texte en mettant la marge ou le numéro de ligne }
  390. Var S : String;
  391. Begin
  392.  if NumPrinter<>impASCII
  393.     then FixePolice(pol10CPI);
  394.  { numéro de ligne }
  395.  Inc(NumLigne);
  396.  if PrinterFormat.NoLigne
  397.     then S:=IntToString(NumLigne)+' : '
  398.     else S:='';
  399.  if length(S)>Marge then S[0]:=chr(Marge);
  400.  while length(S)< Marge do S:=' '+S;
  401.  PrintStr(S);
  402.  if NumPrinter<>impAscii
  403.     then FixePolice(CurConfig.Police);
  404. End;
  405.  
  406. Procedure NewPage;
  407. { commence une nouvelle page, sauf la première }
  408. Var S : String;
  409. Begin
  410.  PrintCode(SautDePage);
  411.  Inc(NumPage);
  412.  YPage:=0;
  413.  XPage:=0;
  414.  FixePolice(pol10CPI);
  415.  FixeInterligne(int6LPI);
  416.  { passer une ligne }
  417.  NewLine;
  418.  MargeVide;
  419.  { imprimer le titre }
  420.  S:=PrinterFormat.Titre;
  421.  while length(S)+Marge<60 do S:=S+' ';
  422.  S:=S+ ' Page : '+IntToString(NumPage);
  423.  PrintStr(S);
  424.  NewLine;
  425.  MargeVide;
  426.  { tirer un trait }
  427.  S:='';
  428.  while length(S)+Marge<78 do S:=S+chr(196);
  429.  PrintStr(S);
  430.  NewLine;
  431.  { reprendre la configuration choisie et passer une ligne }
  432.  FixePolice(CurConfig.Police);
  433.  FixeInterligne(CurConfig.Interligne);
  434.  NewLine;
  435. End;
  436.  
  437. Procedure Page1;
  438. { entête de la première page }
  439. Var S : String;
  440. Begin
  441.  if PrintErrorFlag<>0 then exit;
  442.  FixePolice(pol10CPI);
  443.  FixeInterligne(int6LPI);
  444.  YPage:=0;
  445.  XPage:=0;
  446.  { passer une ligne }
  447.  NewLine;
  448.  MargeVide;
  449.  { titre en double largeur }
  450.  if PrinterFormat.Titre <> ''
  451.     then begin
  452.           DoubleLargeur(1);
  453.           PrintStr(PrinterFormat.Titre);
  454.           DoubleLargeur(0);
  455.           NewLine;
  456.          end;
  457.  NewLine;
  458.  MargeVide;
  459.  { nom de fichier }
  460.  if PrinterFormat.NomFichier
  461.     then begin
  462.           S:='Nom du fichier : '+ PrintFileName;
  463.           PrintStr(S);
  464.           NewLine;
  465.           MargeVide;
  466.          end;
  467.  { date d'impression }
  468.  if PrinterFormat.Date
  469.     then begin
  470.           S:='Imprimé le     : '+jour+' '+Date;
  471.           PrintStr(S);
  472.           NewLine;
  473.           MargeVide;
  474.          end;
  475.  { tirer un trait }
  476.  S:='';
  477.  While length(S)+Marge<78 do S:=S+chr(196);
  478.  PrintStr(S);
  479.  NewLine;
  480.  { établir la configuration choisie et passer une ligne }
  481.  FixePolice(CurConfig.Police);
  482.  FixeInterligne(CurConfig.Interligne);
  483.  NewLine;
  484.  StartLine;
  485. End;
  486.  
  487. Procedure PrintCode(S:String);
  488. { impression d'une chaine de caractères }
  489. Begin
  490.  if (S='') or (PrintErrorFlag<>0) then exit;
  491.  {$I-}
  492.  write(lst,S);
  493.  {$I+}
  494.  PrintErrorFlag:=IOResult;
  495. End;
  496.  
  497. Procedure PrintCar(Car:Char);
  498. { impression d'un caractère avec prise en compte des retours chariots }
  499. Begin
  500.  if PrintErrorFlag<>0 then Exit;
  501.  if XPage>LargeurPage
  502.     then begin
  503.           NewLine;
  504.           MargeVide;
  505.           PrintCode(car);
  506.           XPage:=XPage+DeltaX;
  507.          end;
  508.  case Car of
  509.   #10: begin
  510.         NewLine;
  511.         StartLine;
  512.        end;
  513.   #12: NewPage;
  514.   #13: begin end;
  515.   else begin
  516.         PrintCode(car);
  517.         XPage:=XPage+DeltaX;
  518.        end;
  519.   end;
  520. End;
  521.  
  522. Procedure PrintStr(S:String);
  523. { imprime une chaine de caractères }
  524. Var i : Byte;
  525. Begin
  526.  if (PrintErrorFlag<>0) or (S='') then exit;
  527.  For i:=1 to length(S) do
  528.   PrintCar(S[i]);
  529. End;
  530.  
  531. Procedure StartPrint;
  532. { début d'impression }
  533. Begin
  534.  PrintCode(GetUserCode(codeInit));
  535.  case CurConfig.ModeFrappe of
  536.   mBrouillon : PrintCode(GetUserCode(codeBrouillon));
  537.   mCourrier  : PrintCode(GetUserCode(codeCourrier));
  538.   end;
  539.  FixePolice(pol10CPI);
  540.  FixeInterligne(int6LPI);
  541.  NumPage:=1;
  542.  NumLigne:=0;
  543.  YPage:=0;
  544.  XPage:=0;
  545.  Page1;
  546. End;
  547.  
  548. Procedure EndPrint;
  549. { fin d'impression }
  550. Begin
  551.  PrintCode(SautDePage);
  552.  PrintCode(GetUserCode(codeInit));
  553. End;
  554.  
  555. Procedure PrintFile(NomDeFichier:PathStr);
  556. Var  f        : Text;           { Fichier texte }
  557.      UneLigne : String;         { Une ligne de texte lue }
  558.      N        : NameStr;
  559.      D        : DirStr;
  560.      E        : ExtStr;
  561.      k        : Byte;
  562. Begin
  563.  if PrintErrorFlag<>0 then Exit;
  564.  PrintFileName:=NomDeFichier;
  565.  Assign(f,NomDeFichier);
  566.  {$I-}
  567.  Reset(f);    {Ouvrir le fichier}
  568.  {$I+}
  569.  PrintErrorFlag:=IOResult;
  570.  FSplit(NomDeFichier,D,N,E);
  571.  with PrinterFormat do
  572.   begin
  573.    Titre:=N+E;
  574.    for k:=1 to length(Titre) do Titre[k]:=UpCase(Titre[k]);
  575.    Date:=true;
  576.    NomFichier:=false;
  577.    NoLigne:=false;
  578.   end;
  579.  StartPrint;
  580.  While (not Eof(f)) and (PrintErrorFlag=0) do
  581.   begin
  582.    Readln(f,UneLigne);
  583.    PrintStr(UneLigne);
  584.    NewLine;
  585.    StartLine;
  586.   end;
  587.  {$I-}
  588.  Close(f);
  589.  {$I+}
  590.  EndPrint;
  591. End;
  592.  
  593. END.
  594.  
  595. {                        Fin du fichier UImprim.PAS                         }
  596.