[Back to PRINTING SWAG index] [Back to Main SWAG index] [Original]

    {In a following message, the Complete Turbo Pascal source code For DJENV.PAS
    is presented For all who may be interested in what it does, or illustrates.

    The Program prints the "return" and "to:" addresses on a long ("#10")
    business sized envelope in a HP DeskJet series Printer.

    Along the way it illustrates:

      1) How to test For existence of a specific File

      2) How to Read from a structured-Type File

      3) How to Write to a structured-Type File

      4) How to do Text-Type output to any of: LPT1...LPT3, NUL, or a disk File
         With the same code.

      5) How to change fonts in PCL 3 (although this is not explained, it is
         done to give small print For the return address and larger print
         For the to: address.)

      6) How to use TechnoJock's Turbo toolkit For "full-screen I/O".  There are
         three Procedures in the Program which REQUIRE the toolkit to Compile.
         These routines could be modified For non-Full-Screen action which
         would allow you to not use the TT toolkit.  if you don't want to make
         the modifications, and don't have the TT toolkit, you may File request

         DJENV.ZIP

         from my system at 1:106/100.  It has both the source code presented here
         and a Compiled .EXE File, ready to roll.

      if you'd like to play With it, but don't have a DJ or LASERJET-Compatible
    Printer, then you may tell the Program to print to a disk File or even NUL
    instead of LPT1, etc.

      Whatever addresses you enter, plus the name of the "print device" you
    use, will be saved in the File DJENV.CFG .  With a little work, DJENV.CFG
    could easily become a mini-database and allow you to retrieve from any
    number of previous envelope setups, instead of just the last one you used.
    I may eventually do this, but no time frame is currently anticipated For
    it's Completion.

      You may print 1 to many copies of the setup after you have entered it's
    info. The Program paUses beFore each envelope and gently nudges you to
    prepare an envelope For printing and then to hit Return.  (Any key
    returning a key code will do as well as Return.)

      Loading the envelopes is a Complete MANUAL operation.  While the DJ
    has a software command to load envelopes, you must still manually
    position the envelope For loading.  if the envelope doesn't load cleanly
    (and in my experience, about 1 in every 10 or 15 will go in crooked...), I
    felt it would be better to deal With that BEForE attempting to print.  After
    the envelope is in position to load, then it is necessary to hit two of the
    panel buttons together to have the DJ500 to pull the envelope into
    position.  When that is acComplished correctly, then hit Return to print to
    the envelope.

    Hope some of you find this useful/interesting/maybe even helpful!
    }

    Program DJ_Envelopes;

    {  This Program illustrates how to Program For envelope printing
       With the HP DeskJet series of Printer.  It would possibly work
       For any PCL 3 (or better) Printer which can load envelopes.

       note:  Loading envelopes on the DJ Printers *IS* a bit tricky
              and requires cooperative envelopes.  Be sure to read the
              part in your manual about use of envelopes, selecting good
              Printer-use envelopes, and especially about LOADinG them
              manually.  I have used the following inexpensive envelopes
              With some degree of success.  They were purchased at a
              discount business/office supply store, BIZMART, but as the
              brand is national, you can probably find them most anywhere:

                 MEAD Management Series, no. 75604
                 Number 10 size, 4-1/8" x 9-1/2"
                 BARCODE#   43100 75064

                 (100 of them cost about $2.00)

       This Program is PUBLIC doMAin and may be freely distributed, modified,
       even SOLD. (if you can find somebody stupid enough to pay For a PD
       Program, MorE POWER to YOU! I would ask that you at least send me
       their names....)

       The author is: Justin Marquez FidoNet 1:106/100  Houston, TX  USA
    }

    Uses
       FASTTTT5, {Requires TechnoJock's Turbo toolkit Ver 5 or higher }
       WinTTT5,  {Requires TechnoJock's Turbo toolkit Ver 5 or higher }
       IOTTT5,   {Requires TechnoJock's Turbo toolkit Ver 5 or higher }
       Crt,      { Crt Unit For ClrScr }
       Dos;      { Req'd to be able to use the EXIST Procedure as I wrote it }

    Const
        Return_Size   = #27+'&l0O'+ #27+'(10U' +#27+'(s1p6v0s41010bt2Q';
        Addressee_Size = #27+'&l0O'+ #27+'(10U' +#27+'(s1p12v0s4103b1t2Q';
        Config_File = 'DJENV.CFG';

    Type
        Add_Strg = String[60];

        Address_Data = Record { this is the Format of the "config File" }
          Who_from: Array[1..5] of Add_Strg;
          Last_to : Array[1..5] of Add_Strg;
          PRN_DEV : String;
        end;

    Var
        Return_Address,
        Address : Array[1..5] of Add_Strg;

        lst     : Text;

        Last_Data : Address_Data;
        CF_Data   : File of Address_Data; { going to be the config File }

        Print_to: String;

        n,
        Counter,
        How_Many : Integer;

    Function EXIST(Filename :String): Boolean;
    {  Determines if a File exists or not.  NO WILDCARDS!
       Main Program or Unit MUST have "Uses Dos;" in it!
    }
    Var
       Attr : Word;
       f    : File;
    begin
      Assign(f,Filename);
      GetFAttr(f,Attr);
      if Attr = 0 then
        Exist := False else
        Exist := True;
    end; { of exist Function }

    Procedure DrawScreen1;
      {Requires TechnoJock's toolkit, Used to set up For the full-screen I/O}
    begin
      ClrScr;
      WriteCenter(1,Blue,White,' Enter Address Info, and hit F10 when done ...');
      WriteCenter(2,Blue,White,' (Use CURSor keys For up & dn, RETURN For left &
    right) ');
      WriteAt( 1, 5, White,Blue,'RETURN ADDRESS inFO...');
      WriteAt( 3, 6, White,Blue,'             Line #1 :');
      WriteAt( 3, 7, White,Blue,'             Line #2 :');
      WriteAt( 3, 8, White,Blue,'             Line #3 :');
      WriteAt( 3, 9, White,Blue,'             Line #4 :');
      WriteAt( 3,10, White,Blue,'             Line #5 :');
      WriteAt( 1,13, White,Blue,'ADDRESSEE inFO ....   ');
      WriteAt( 3,14, White,Blue,'             Line #1 :');
      WriteAt( 3,15, White,Blue,'             Line #2 :');
      WriteAt( 3,16, White,Blue,'             Line #3 :');
      WriteAt( 3,17, White,Blue,'             Line #4 :');
      WriteAt( 3,18, White,Blue,'             Line #5 :');
      WriteAt( 3,20, White,Blue,'Send Output to :');
      WriteAt( 3,21, White,Blue,'[ Ex: LPT1  or  LPT2 or NUL (For testing) ]');
      WriteAt( 3,23, White,Blue,'Print How Many?:');
    end; { of pvt Procedure drawscreen1 }

    Procedure FS_IO;
    { Requires TechnoJock's Turbo toolkit }
    Var
      counter : Integer;
    begin
      Create_Fields(12);
      {          #  U  D  L  R  x  y   }
      Add_Field( 1,12, 2,12, 2,27, 6);
      Add_Field( 2, 1, 3, 1, 3,27, 7);
      Add_Field( 3, 2, 4, 2, 4,27, 8);
      Add_Field( 4, 3, 5, 3, 5,27, 9);
      Add_Field( 5, 4, 6, 4, 6,27,10);
      Add_Field( 6, 5, 7, 5, 7,27,14);
      Add_Field( 7, 6, 8, 6, 8,27,15);
      Add_Field( 8, 7, 9, 6, 9,27,16);
      Add_Field( 9, 8,10, 8,10,27,17);
      Add_Field(10, 9,11, 9,11,27,18);
      Add_Field(11,10,12,10,12,27,20);
      Add_Field(12,11, 1,11, 1,27,23);

      For n := 1 to 5 Do

    String_Field(n,Return_Address[n],'**********************************************
    ****');
      For n := 1 to 5 Do

    String_Field(n+5,Address[n],'**************************************************'
    );

    String_Field(11,Print_to,'**************************************************');
      Integer_Field(12,How_Many,'',0,0);
      PROCESS_inPUT(1);
      Dispose_Fields;
    end; { of Procedure FS_IO }

    Procedure Init;
    begin
      if ParamCount < 1
      then
        Print_to := 'LPT1'
      else
        Print_to := ParamStr(1);
      if Exist(config_File)
      then
        begin
          Assign(CF_Data,ConFig_File);  { How to READ a Record from a File }
          ReSet(CF_Data);
          Seek(CF_Data,0);
          Read(CF_DATA,Last_Data);
          Close(CF_Data);
          With Last_Data do
          begin
            For n := 1 to 5 do
            begin
              Return_Address[n] := Who_From[n] ;
              Address[n]        := Last_to[n];
            end;
            Print_to := PRN_DEV;
          end;
        end
      else
        begin
          Return_Address[1] :='';
          Return_Address[2] :='';
          Return_Address[3] :='';
          Return_Address[4] :='';
          Return_Address[5] :='';
          Address[1] := '';
          Address[2] := '';
          Address[3] := '';
          Address[4] := '';
          Address[5] := '';
        end;
      How_Many := 1;
    end;

    Procedure OutPut_to_DJ500;
    begin
      Assign(lst,Print_to);
      ReWrite(lst);
      Write(Lst,#27+'&l8D');
      Write(lst,Return_Size);
      For n := 1 to 5 Do
        WriteLn(lst,Return_Address[n]);
      Write(Lst,#27+'&l5D');
      Write(lst,Addressee_Size);
      For n := 1 to 3 Do Writeln(lst);
      For n := 1 to 5 Do
        WriteLn(lst,'
            ',Address[n]);
      WriteLn(lst,#12);
      WriteLn(lst,#27+'E');
      close(lst)
    end;

    Procedure Save_Config_File;
    begin
      Assign(CF_Data,ConFig_File);      { How to Write a Record to a File }
      ReWrite(CF_Data);
      With Last_Data do
      begin
        For n := 1 to 5 do
        begin
          Who_From[n] := Return_Address[n];
          Last_to[n]  := Address[n];
        end;
        PRN_DEV := Print_to;
      end;
      Seek(CF_Data,0);
      Write(CF_DATA,Last_Data);
      Close(CF_Data);
    end;

    Procedure Pause;
    { Requires TechnoJock's Turbo toolkit }
    begin
      TempMessageBOX(20,10,Green,Blue,2,'Load an envelope (manually) and Hit
    RETURN.');
    end;

    Procedure PRinT_ENVELOPES;
    begin
      ClrScr;
      GotoXY(2,1);
      Write('Printing Envelope #:');
      Counter := 1;
      if How_Many > 1
      then
        begin
        For Counter := 1 to How_Many Do
          begin
            WriteLn('  ',Counter);
            Pause;
            OutPut_to_DJ500;
          end;
        end
      else
        begin
          WriteLn('  ',Counter,' ( and only 1 ...)');
          Pause;
          OutPut_to_DJ500;
        end;
    end;

    begin
      Init;
      DrawScreen1;
      FS_IO;
      PRinT_ENVELOPES;
      Save_Config_File;
    end.

[Back to PRINTING SWAG index] [Back to Main SWAG index] [Original]