PDA

View Full Version : ارسال پرینت به چند چاپگر به طور همزمان



anbardaran
چهارشنبه 08 فروردین 1386, 11:48 صبح
سلام
برای ارسال پرینت همزمان برای چند چاپگر از روشی استفاده کردم که زیاد مورد قبول نیست.

اون هم ذخیره مشخصات چاپگرها در بانک اطلاعاتی و فرستادن ترتیبی پرینت مورد نظر به هر کدام از آنها با عوض کردن Set As Default ویندوز (کدهای لازم برای اینکار در ذیل مطلب آمده است).

این روش بدلیل عوض نمودن چاپگر پیش فرض ویندوز هم کند است و هم پرشهایی در تصویر ایجاد میکند.

راه حل دیگری به نظرتان میرسد.

با تشکر
انبارداران



*********** روال ثبت چاپگر در Registry *************

unit PrinterSetting;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ADODB, SettingDetail;
type
TfrmPrinterSetting = class(TFSettingDetail)
Label1: TLabel;
Label2: TLabel;
Slave2Printer_L: TLabel;
Label3: TLabel;
MasterPrinterCombo: TComboBox;
Slave1PrinterCombo: TComboBox;
Slave2PrinterCombo: TComboBox;
A4PrinterCombo: TComboBox;
procedure FormShow(Sender: TObject);
procedure MasterPrinterComboChange(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
Driver: array [0..Max_Path] of String;
SaveChange_Printer : Boolean;
DefMasterPrinter, DefA4Printer, DefSlave1Printer, DefSlave2Printer: Integer;
procedure FillPrinterCombo;
procedure LoadDefaultPrinter;
procedure SavePrinter;
procedure CancelPrinter;
end;
var
frmPrinterSetting: TfrmPrinterSetting;
implementation
uses Main, ADO, DM_U, Login, Dongle, SystemUnit;
{$R *.dfm}


procedure TfrmPrinterSetting.FillPrinterCombo;
var
p , p2: PChar;
i : integer;
sDriver, sPort: String;
begin
MasterPrinterCombo.Items.Clear;
A4PrinterCombo .Items.Clear;
Slave1PrinterCombo.Items.Clear;
Slave2PrinterCombo.Items.Clear;
GetMem(p, 32767);
{GetMem : Creates a dynamic variable and a pointer to the address of the block.}
p2 := p;
if GetProfileString('devices', nil, '', p, 32767) <> 0 then
{
The GetProfileString function retrieves the string associated with the
specified key in the given section of the WIN.INI file. This function is
provided for compatibility with 16-bit Windows-based applications.
Win32-based applications should store initialization information in the
registry.
}
begin
while p2^<> #0 do
begin
MasterPrinterCombo.Items.Add(StrPas(p2));
{StrPas : Converts null-terminated string to an AnsiString (long string).}
A4PrinterCombo .Items.Add(StrPas(p2));
Slave1PrinterCombo.Items.Add(StrPas(p2));
Slave2PrinterCombo.Items.Add(StrPas(p2));
p2 := @p2[lstrlen(p2)+1];
{
The lstrlen function returns the length in bytes (ANSI version) or
characters (Unicode version) of the specified string (not including the
terminating null character).
}
end;
end;
GetMem(p2, 32767);
for i := 0 to (MasterPrinterCombo.Items.Count-1) do
begin
StrPCopy(p2, MasterPrinterCombo.Items[i]);
if GetProfileString('devices', p2, '', p, 32767) <> 0 then
begin
sDriver := StrPas(p);
sPort := sDriver;
Driver[i] := sPort;
Delete(sDriver, pos(',', sDriver), length(sDriver));
Delete(sPort, 1, pos(',', sPort));
end;
end;
FreeMem(p2, 32767);
FreeMem(p, 32767);
end;


procedure TfrmPrinterSetting.LoadDefaultPrinter;
var
I: Integer;
Master, A4, Slave1, Slave2 : String;
begin
Master := _MSTR_PRNTR;
if MasterPrinterCombo.Items.Strings[i]+','+Driver[i] = Master then
MasterPrinterCombo.ItemIndex := I;
DefMasterPrinter := MasterPrinterCombo.ItemIndex;
end;


procedure TfrmPrinterSetting.FormShow(Sender: TObject);
begin
inherited;
FillPrinterCombo;
LoadDefaultPrinter;
SaveChange_Printer := False;
end;


procedure TfrmPrinterSetting.SavePrinter;
begin
inherited;
if MasterPrinterCombo.ItemIndex = -1 then
begin
ShowMessage('�&Ccedil;��&Ntilde; &Ccedil;&Otilde;&aacute;&iacute; &Ntilde;&Ccedil; &Ccedil;&auml;&Ecirc;&Icirc;&Ccedil;&Egrave; &auml;&atilde;&Ccedil;&iacute;&iacute;&Iuml;');
Exit;
end;
if (R.OpenKey(REG_FIELD, True)) then
begin
if MasterPrinterCombo.ItemIndex <> DefMasterPrinter then
R.WriteString('MSTR_PRNTR', MasterPrinterCombo.Text+','+Driver[MasterPrinterCombo.ItemIndex]);
R.CloseKey;
end;
LoadPrinters;
end;
end;

end.


**************** عوض نمودن set as Default چاپگر ویندوز ****************
procedure ChangeDefaultPrinter(Printer: String);
var
winIniFileName : array [0..MAX_PATH] of char;
s: array [0..64] of char;
begin
GetWindowsDirectory(winIniFileName, SizeOf(winIniFileName));
StrCat(winIniFileName,'\win.ini');
with TIniFile.Create(winIniFileName)do
// TIniFile stores and retrieves application-specific information and settings
// from INI files.
try
WriteString('Windows', 'device', Printer);
finally
Free;
end;
StrCopy(s,'windows');
SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0, LongInt(@s));
end;

Developer Programmer
پنج شنبه 09 فروردین 1386, 20:36 عصر
من مدتهاست که برای یه پروژه تجاری، دنبال این کار هستم.
قراره وقتی مسئول پذیرش، پرینت کرد... در آشپزخونه هم پرینت بشه. ( FastReport)
اما هیچوقت به راه حل منطقی، کامل و جامع نرسیدم.

anbardaran
شنبه 11 فروردین 1386, 09:30 صبح
سلام
این پرو‍ژه شما مگه رستورانیه؟


قراره وقتی مسئول پذیرش، پرینت کرد... در آشپزخونه هم پرینت بشه. ( FastReport)

mzjahromi
شنبه 11 فروردین 1386, 09:35 صبح
من خودم با کوئیک ریپورت توی قسمت PrinterSetting خاصیت پرینتر ایندکس رو عوض میکنم مشکلی هم نداره

Developer Programmer
شنبه 11 فروردین 1386, 10:29 صبح
من خودم با کوئیک ریپورت توی قسمت PrinterSetting خاصیت پرینتر ایندکس رو عوض میکنم مشکلی هم نداره
یعنی، چاپگر پذیرش و چاپگر آشپرخونه رو share کنم بعد با ایندکس، به تمام چاپگرها، یه نسخه بفرستم؟

anbardaran
شنبه 11 فروردین 1386, 14:53 عصر
من خودم با کوئیک ریپورت توی قسمت PrinterSetting خاصیت پرینتر ایندکس رو عوض میکنم مشکلی هم نداره

آیا QuickRep1.PrinterSettings.PrinterIndex در حالتی که بیش از دو چاپگر به دستگاه هم متصل باشد، به راحتی جواب می دهد؟ (از این نظر که پیدا کردن Index مربوط به چاپگر پذیرش و آشپزخانه دردسر ساز است )

در صورت امکان یک Sample در مورد نحوه دسترسی به Index چاپگر مورد نظر از بین بیش از 2 چاپگر ارسال نمایید.

با تشکر فراوان
انبارداران