Delphi32.com - Home!
| Home/News | Downloads | Forums | D32 Magazine | Resources | Info and Facts |  
 
 Simultaneous printing to multiple printers


Is it possible to print to more than one printer at a given time?   

    Yes! The following example demonstrates how to print to more than one printer at a given time. The exmple does not use TPrinter, since TPrinter does not support printing to multiple printers at a given time.

    Example:

    unit multiprn;

    interface

    {$IFDEF WIN32} uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; {$ELSE} uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; {$ENDIF} type TForm = class(TForm) Button : TButton; ListBox : TListBox; ListBox2: TListBox; ListBox3: TListBox; procedure FormCreate(Sender: TObject); procedure ListBox Click(Sender: TObject); procedure ListBox2Click(Sender: TObject); procedure ListBox3Click(Sender: TObject); procedure Button Click(Sender: TObject); private { Private declarations } procedure GetTheListOfPrinters; public { Public declarations } end;

    var Form : TForm ;

    implementation

    {$R *.DFM}

    type PdcArray = ^TdcArray; TdcArray = array[0..0] of hdc;

    procedure TForm .GetTheListOfPrinters; var p : pChar; p2 : pChar; i : integer; sDriver : string; sPort : string; begin GetMem(p, 32767); p2 := p; {Get a list of the printer names from the win.ini file.} {The list will be a buffer filled with strings, each seperated} {by a null character, with the final string terminated with} {a two null characters} if GetProfileString('devices', nil, '',p, 32767) <> 0 then begin {loop though the null terminated strings. We know we} {have reached the end when p2 equals a null character} while p2^ <> #0 do begin ListBox .Items.Add(StrPas(p2)); {increment the pointer past the null to get the next string} p2 := @p2[lStrLen(p2) + ]; end; end; GetMem(p2, 32767); {Get the driver and port names for each printer found} for i := 0 to (ListBox .Items.Count - ) do begin StrPCopy(p2, ListBox .Items[i]); if GetProfileString('devices', p2, '',p, 32767) <> 0 then begin sDriver := StrPas(p); sPort := sDriver; {The driver is the portion of the string before the comma} Delete(sDriver, Pos(',', sDriver), Length(sDriver)); {The port is the portion of the string after the comma} Delete(sPort, , Pos(',', sPort)); ListBox2.Items.Add(sDriver); ListBox3.Items.Add(sPort); end; end; FreeMem(p2, 32767); FreeMem(p, 32767); end;

    procedure TForm .FormCreate(Sender: TObject); begin GetTheListOfPrinters; {Allow the user to select multiple printers} ListBox .MultiSelect := true; ListBox2.MultiSelect := true; ListBox3.MultiSelect := true; end;

    procedure TForm .ListBox Click(Sender: TObject); var i : integer; begin {Select same indexes in ListBoxs 2 and 3 as are selected in Listbox } for i := 0 to ListBox .Items.Count - do begin ListBox2.Selected[i] := ListBox .Selected[i]; ListBox3.Selected[i] := ListBox .Selected[i] end; end;

    procedure TForm .ListBox2Click(Sender: TObject); var i : integer; begin {Select same indexes in ListBoxs and 3 as are selected in Listbox2} for i := 0 to ListBox2.Items.Count - do begin ListBox .Selected[i] := ListBox2.Selected[i]; ListBox3.Selected[i] := ListBox2.Selected[i] end; end;

    procedure TForm .ListBox3Click(Sender: TObject); var i : integer; begin {Select same indexes in ListBoxs and 2 as are selected in Listbox3} for i := 0 to ListBox3.Items.Count - do begin ListBox .Selected[i] := ListBox3.Selected[i]; ListBox2.Selected[i] := ListBox3.Selected[i] end; end;

    procedure TForm .Button Click(Sender: TObject); var dcs : PdcArray; {a pointer to an array of hdc's} dcsCount : integer; {count of valad hdc's} dc : hdc; {test hdc} i : integer; {couning variable} pPrinter : pChar; {pointer to a printer name} pDriver : pChar; {pointer to a printer driver filename} pPort : pChar; {pointer to a port} DocInfo: TDocInfo; {document information for the spooler} {$IFDEF WIN32} osv : TOSVERSIONINFO; {to test for Windows NT} {$ENDIF} begin {If there are no printers selected then exit} if ListBox .SelCount = 0 then exit; {If Range Checking is on then rember the setting and turn it off} {This will allow use to access the dcs[i] array past element zero} {without a compiler or runtime error} {$IFOPT R+} {$DEFINE CKRANGE} {$R-} {$ENDIF} {Allocate the array of dcs} GetMem(dcs, sizeof(hdc) * ListBox .SelCount); dcsCount := 0; {Loop though the printers that are selected and create dc's for each} for i := 0 to (ListBox .Items.Count - ) do begin {Loop through the list box to find the selected printers} if ListBox .Selected[i] then begin {Allocate and get the Printer, Driver and port from the listboxs} {in the form of a null terminated string} GetMem(pPrinter, Length(ListBox .Items[i]) + ); GetMem(pDriver, Length(ListBox2.Items[i]) + ); GetMem(pPort, Length(ListBox3.Items[i]) + ); StrPCopy(pPrinter, ListBox .Items[i]); StrPCopy(pDriver, ListBox2.Items[i]); StrPCopy(pPort, ListBox3.Items[i]); {Attempt to create a dc - notes ) Not all printers can} {support multiple dc's at one time. 2) CreateDc requires} {different parameters if Win32 andor Win32 under NT.} {Sixteen bit win apps get standard handling} {$IFDEF WIN32} GetVersionEx(osv); if osv.dwPlatformId = VER_PLATFORM_WIN32_NT then dc := CreateDc(pDriver, pPrinter, nil, nil) else dc := CreateDc(nil, pPrinter, nil, nil); {$ELSE} dc := CreateDc(pDriver, pPrinter, pPort, nil); {$ENDIF} FreeMem(pPrinter, Length(ListBox .Items[i])); FreeMem(pDriver, Length(ListBox2.Items[i])); FreeMem(pPort, Length(ListBox3.Items[i])); {If the dc is valid, then lets save it to our array} {and increment our count} if dc <> 0 then begin dcs^[dcsCount] := dc; inc(dcsCOunt); end; end; end; {If we ended up with a valid array of dc's then let's print} if dcsCount > 0 then begin

    {Fill Out the DocInfo structure for the spooler} {and start a document for each printer} GetMem(DocInfo.lpszDocName, 32); for i := 0 to (dcsCount - ) do begin FillChar(DocInfo, sizeof(DocInfo), #0); DocInfo.cbSize := SizeOf(DocInfo); StrPCopy(DocInfo.lpszDocName, 'Test Doc' + IntToStr(i)); StartDoc(dcs^[i], DocInfo); end; FreeMem(DocInfo.lpszDocName, 32);

    {Start a page for each printer} for i := 0 to (dcsCount - ) do StartPage(dcs^[i]); {Print something} for i := 0 to (dcsCount - ) do TextOut(dcs^[i], 200, 200, 'Test', 4);

    {End a page for each printer} for i := 0 to (dcsCount - ) do EndPage(dcs^[i]);

    {End the document for each printer} for i := 0 to (dcsCount - ) do EndDoc(dcs^[i]);

    {Delete the dc for each printer} for i := 0 to (dcsCount - ) do DeleteDc(dcs^[i]);

    end; {dcsCount} {Free our array of printers} FreeMem(dcs, sizeof(hdc) * ListBox .SelCount);

    {If range checking was on when we started then turn it back on} {$IFDEF CKRANGE} {$UNDEF CKRANGE} {$R+} {$ENDIF} end;

    end. 4/2/99 :23: 8 AM

     



  << Previous Faq     Complete List     Next Faq >>  



 
 Hits/month  2,500,000+ 
 Downloads
 (Since May 2000)
 7,393,709 
 Total Files  6,023 
 Forum msgs  7,670 
 Articles/FAQs  70+/900+ 
Kylix
Tips n Tricks
FAQs
Knowledge Base
Bug Listings
Articles
Books
Newsgroups
Links
Submissions
Testimonials
Advertising
Contact Us
About Us
Search Amazon:
Top Selling Software at Amazon

| Home/News | Downloads | Forums | Resources | Info and Facts | Testimonials |
  Site Search:
 


Comments/Problems: Webmaster@delphi32.com
Copyright © 1998-2006, Delphi32.com. All rights reserved.
Terms of Use