Since TRawPrinter is declared as "object" rather than "class", I'm guessing the 
code is a hold over from Turbo Pascal for Windows/Borland Pascal 7 and OWL, 
which didn't have the TPrinter object. 

Interesting code nonetheless: A real "bare-bones" wrapper for the Windows 
Printer API; though it doesn't do "raw" printing in the sense of bypassing the 
Printer API to talk directly to the port.

Thanks for posting.

Stephen Posey
stephenlpo...@earthlink.net 

-----Original Message-----
>From: Andre van Zuydam <an...@spiceware.co.za>
>Sent: Oct 4, 2012 12:53 PM
>To: Delphi-Talk Discussion List <delphi-talk@elists.org>
>Subject: Re: Printing Labels
>
>Hi K2RFP
>
>Just occured to me I had a similar problem, my client had pages of vouchers
>that needed to be printed, minimum of 5 per line, each page has 20
>vouchers, much like labels.
>You probably won't get away from the end doc feed, but changing the page
>size to be one row of labels will help you.
>
>In other words, keep the width of you label page but make the page height
>the height of the 1 row of labels, this will spool line by line.
>
>I also created  a basic printer object to help me with what I wanted to do,
>not sure why I did not use TPrinter, perhaps I didn't want to use Canvas or
>wanted to use the default printer fonts
>
>TRawPrinter = object
>    N : DWORD;
>    DocInfo : TDocInfo1;
>    function  RWOpenPrinter (APrinter : String; ADocName: String = 'print')
>: THandle;
>    procedure RWStartPage (AHandle: THandle);
>    procedure RWWriteLine (AHandle : THandle; ALine: String = #13#10);
>    procedure RWClosePage (AHandle: THandle);
>    procedure RWEndDoc (AHandle: THandle);
>    procedure RWClosePrinter (AHandle: THandle);
>  end;
>
>{ TRawPrinter }
>
>procedure TRawPrinter.RWClosePage(AHandle: THandle);
>begin
>  EndPagePrinter(AHandle);
>end;
>
>procedure TRawPrinter.RWClosePrinter(AHandle: THandle);
>begin
>  EndDocPrinter(AHandle);
>  ClosePrinter(AHandle);
>end;
>
>procedure TRawPrinter.RWEndDoc(AHandle: THandle);
>begin
>  EndDocPrinter(AHandle);
>end;
>
>function TRawPrinter.RWOpenPrinter(APrinter, ADocName: String): CARDINAL;
>var
>  Handle : THandle;
>begin
>  if not OpenPrinter(PChar(APrinter), Handle, nil) then
>  begin
>    Handle := 0;
>  end;
>  if (Handle <> 0) then
>  begin
>    DocInfo.pDocName := PChar(ADocName);
>    DocInfo.pOutputFile := nil;
>    DocInfo.pDataType := 'RAW';
>  end;
>  StartDocPrinter(Handle, 1, @DocInfo);
>  Result := Handle;
>end;
>
>procedure TRawPrinter.RWStartPage(AHandle: THandle);
>begin
>  StartPagePrinter(AHandle);
>end;
>
>procedure TRawPrinter.RWWriteLine(AHandle: THandle; ALine: String);
>begin
>  ALine := Aline+#13#10;
>  WritePrinter(AHandle, PChar(ALine), Length(ALine), N);
>end;
>
>Anyway I hope this may provide you with a solution.
>
>On Wed, Oct 3, 2012 at 4:32 PM, K2RFP <rn...@verizon.net> wrote:
>
>> Steve:
>> Writing a procedure to handle a batch of labels is
>> not a problem but that is not what I want. As a ham
>> radio operator I have, from time to time, to send
>> a postcard to someone in my log book. So it is an
>> individual label and the procedure is not called for
>> every time I run the logbook program. So it doesn't
>> make sense for the printer to do a form feed to a
>> new page after printing one or two labels.
>>
>> I did some google searching and found out that
>> EndDoc always results in a form feed and a way
>> around it is to do a raw printing to the printer
>> port. I haven't tried that. Another way I'll try
>> is to set the physical size of the printer's page
>> to the height of the label. You would think there
>> would be an EndDoc2 procedure that does what EndDoc
>> does but stops the printer in its tracks so I would
>> not have to jump through hoops to do what I want.
>>
>>
>>
>> On 10/3/2012 9:55 AM, Stephen Posey wrote:
>>
>>> I'm not sure I understand the question here.
>>>
>>> Normally you don't call Printer.EndDoc until you're done printing. If you
>>> have multiple labels to print, then you'll want to handle them as a "batch"
>>> and compose them all onto your label page(s) before calling Printer.EndDoc.
>>>
>>> If the number of labels you have to print is more than will fit on a page
>>> of labels, then you'll call Printer.NewPage between page batches.
>>>
>>> If that doesn't clarify the situation then I'll need you to describe your
>>> setup and exactly what you're trying accomplish in more detail.
>>>
>>> Stephen Posey
>>> stephenlpo...@earthlink.net
>>>
>>> -----Original Message-----
>>>
>>>> From: -K2RFP- <rn...@verizon.net>
>>>> Sent: Oct 2, 2012 1:25 PM
>>>> To: Delphi-Talk Discussion List <delphi-talk@elists.org>
>>>> Subject: Printing Labels
>>>>
>>>> I want to print individual 1-inch labels on fan-fold
>>>> tractor feed paper. The label prints okay but the
>>>> EndDoc statement causes thepaper to move to the next
>>>> page. How do I get it tomove to the next label?
>>>>
>>>> The printer does not have any setting for labels.
>>>>
>>>>
>>>>
>>>> ______________________________**____________________
>>>> Delphi-Talk mailing list -> Delphi-Talk@elists.org
>>>> http://lists.elists.org/cgi-**bin/mailman/listinfo/delphi-**talk<http://lists.elists.org/cgi-bin/mailman/listinfo/delphi-talk>
>>>>
>>> ______________________________**____________________
>>> Delphi-Talk mailing list -> Delphi-Talk@elists.org
>>> http://lists.elists.org/cgi-**bin/mailman/listinfo/delphi-**talk<http://lists.elists.org/cgi-bin/mailman/listinfo/delphi-talk>
>>>
>>>
>> ______________________________**____________________
>> Delphi-Talk mailing list -> Delphi-Talk@elists.org
>> http://lists.elists.org/cgi-**bin/mailman/listinfo/delphi-**talk<http://lists.elists.org/cgi-bin/mailman/listinfo/delphi-talk>
>>
>
>
>
>-- 
><http://spiceware.co.za>
>__________________________________________________
>Delphi-Talk mailing list -> Delphi-Talk@elists.org
>http://lists.elists.org/cgi-bin/mailman/listinfo/delphi-talk

__________________________________________________
Delphi-Talk mailing list -> Delphi-Talk@elists.org
http://lists.elists.org/cgi-bin/mailman/listinfo/delphi-talk

Reply via email to