如果不能同时那么陆续打印又如何实现?
请赐教,谢谢

解决方案 »

  1.   

    动态选择当前打印机,然后一个打印机发送一个打印任务,关于如何选择当前打印机,参看FAQ!
      

  2.   

    我想在QR预览后立即打印而不用在printdialogl里设置
      

  3.   

    QR没有用过!
    一般是在[开始打印]按钮的事件里先选择一个打印机,然后print,然后再选择一个打印机,然后print;就是系统做了两次Print,但是在用户的眼力,就是点击了一次[开始打印]按钮!
      

  4.   

    楼上说的有道理,我知道可以通过设置Printer.PrinterIndex 来选择不同的打印机,但是一旦其中一台开始打印后必须等它打完以后我才可以修改Printer.PrinterIndex值是吧?
      

  5.   

    同时打印到多台打印机 Yes! The following example demonstrates how to print to more thanone printer at a given time. The exmple does not use TPrinter, sinceTPrinter does not support printing to multiple printers at a giventime.Example:unit multiprn;interface{$IFDEF WIN32}usesWindows, Messages, SysUtils, Classes, Graphics, Controls,Forms, Dialogs, StdCtrls;{$ELSE}usesSysUtils, WinTypes, WinProcs, Messages, Classes, Graphics,Controls, Forms, Dialogs, StdCtrls;{$ENDIF} typeTForm1 = class(TForm)Button1: TButton;ListBox1: TListBox;ListBox2: TListBox;ListBox3: TListBox;procedure FormCreate(Sender: TObject);procedure ListBox1Click(Sender: TObject);procedure ListBox2Click(Sender: TObject);procedure ListBox3Click(Sender: TObject);procedure Button1Click(Sender: TObject);private{ Private declarations }procedure GetTheListOfPrinters;public{ Public declarations }end;varForm1: TForm1;implementation{$R *.DFM}typePdcArray = ^TdcArray;TdcArray = array[0..0] of hdc;procedure TForm1.GetTheListOfPrinters;varp : pChar;p2 : pChar;i : integer;sDriver : string;sPort : string;beginGetMem(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 beginListBox1.Items.Add(StrPas(p2));{increment the pointer past the null to get the next string}p2 := @p2[lStrLen(p2) + 1];end;end;GetMem(p2, 32767);{Get the driver and port names for each printer found}for i := 0 to (ListBox1.Items.Count - 1) do beginStrPCopy(p2, ListBox1.Items[i]);if GetProfileString('devices', p2, '',p, 32767) <> 0 then beginsDriver := 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, 1, Pos(',', sPort));ListBox2.Items.Add(sDriver);ListBox3.Items.Add(sPort);end;end;FreeMem(p2, 32767);FreeMem(p, 32767);end;procedure TForm1.FormCreate(Sender: TObject);beginGetTheListOfPrinters;{Allow the user to select multiple printers}ListBox1.MultiSelect := true;ListBox2.MultiSelect := true;ListBox3.MultiSelect := true;end;procedure TForm1.ListBox1Click(Sender: TObject);vari : integer;begin{Select same indexes in ListBoxs 2 and 3 as are selected in Listbox1}for i := 0 to ListBox1.Items.Count - 1 do beginListBox2.Selected[i] := ListBox1.Selected[i];ListBox3.Selected[i] := ListBox1.Selected[i]end;end;procedure TForm1.ListBox2Click(Sender: TObject);vari : integer;begin{Select same indexes in ListBoxs 1 and 3 as are selected in Listbox2}for i := 0 to ListBox2.Items.Count - 1 do beginListBox1.Selected[i] := ListBox2.Selected[i];ListBox3.Selected[i] := ListBox2.Selected[i]end;end;procedure TForm1.ListBox3Click(Sender: TObject);vari : integer;begin{Select same indexes in ListBoxs 1 and 2 as are selected in Listbox3}for i := 0 to ListBox3.Items.Count - 1 do beginListBox1.Selected[i] := ListBox3.Selected[i];ListBox2.Selected[i] := ListBox3.Selected[i]end;end;procedure TForm1.Button1Click(Sender: TObject);vardcs : 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 ListBox1.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) * ListBox1.SelCount);dcsCount := 0;{Loop though the printers that are selected and create dc's for each}for i := 0 to (ListBox1.Items.Count - 1) do begin{Loop through the list box to find the selected printers}if ListBox1.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(ListBox1.Items[i]) + 1);GetMem(pDriver, Length(ListBox2.Items[i]) + 1);GetMem(pPort, Length(ListBox3.Items[i]) + 1);StrPCopy(pPrinter, ListBox1.Items[i]);StrPCopy(pDriver, ListBox2.Items[i]);StrPCopy(pPort, ListBox3.Items[i]);{Attempt to create a dc - notes 1) 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 thendc := CreateDc(pDriver, pPrinter, nil, nil) elsedc := CreateDc(nil, pPrinter, nil, nil);{$ELSE}dc := CreateDc(pDriver, pPrinter, pPort, nil);{$ENDIF}FreeMem(pPrinter, Length(ListBox1.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 begindcs^[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 - 1) do beginFillChar(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 - 1) doStartPage(dcs^[i]);{Print something}for i := 0 to (dcsCount - 1) doTextOut(dcs^[i], 200, 200, 'Test', 4);{End a page for each printer}for i := 0 to (dcsCount - 1) doEndPage(dcs^[i]);{End the document for each printer}for i := 0 to (dcsCount - 1) doEndDoc(dcs^[i]);{Delete the dc for each printer}for i := 0 to (dcsCount - 1) doDeleteDc(dcs^[i]);end; {dcsCount}{Free our array of printers}FreeMem(dcs, sizeof(hdc) * ListBox1.SelCount);{If range checking was on when we started then turn it back on}{$IFDEF CKRANGE}{$UNDEF CKRANGE}{$R+}{$ENDIF}end;end.
     
      

  6.   

    但是这样的方法略为复杂,各位有更简单的方法没?
    我是用QUICKREPORT来打印报表,这样来执行可不可以
    quickrep1.print; //默认打印机先打印
    printer.printindex:=1; //选择第二台打印机
    printer.begindoc;我试过这样来做,默认打印机打印正常,而第二台共享的打印机无法正确打印,但是可以看见打印的文档已经发送过去了,显示打印任务正在继续
    求教!!