[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]