|
Вопрос # 1 977/ вопрос открыт / |
|
Здравствуйте!
Хотел бы у вас попросить по такому вопросам:
1) Можно ли определить из delphi активность подключенного принтера?
2) Как установить программно формат бумаги у принтера в соответствии с выбранным форматом например конверта?
 |
Вопрос задал: seryoga (статус: 1-ый класс)
Вопрос отправлен: 8 октября 2008, 12:59
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: Feniks
Здравствуйте, seryoga!
Держите несколь примеров в приложении. И пускай они натолкнут вас на путь истенный ;-)
1. Как найти все форматы бумаги, поддерживаемые принтером.
2. Список форматов бумаги для принтера, установленного по умолчанию.
3. Как получить статус принтера.
4. Установить размеры бумаги.
P.S. Желаю удачи.
Приложение: Переключить в обычный режим-
- uses
- Printers, WinSpool;
-
- procedure GetPapernames(sl: TStrings);
- type
- TPaperName = array [0..63] of Char;
- TPaperNameArray = array [1..High(Word) div SizeOf(TPaperName)] of TPaperName;
- PPapernameArray = ^TPaperNameArray;
- var
- Device, Driver, Port: array [0..255] of Char;
- hDevMode: THandle;
- i, numPaperformats: Integer;
- pPaperFormats: PPapernameArray;
- begin
- Printer.PrinterIndex := -1; // Standard printer
- Printer.GetPrinter(Device, Driver, Port, hDevmode);
- numPaperformats := WinSpool.DeviceCapabilities(Device, Port, DC_PAPERNAMES, nil, nil);
- if numPaperformats 0 then
- begin
- GetMem(pPaperformats, numPaperformats * SizeOf(TPapername));
- try
- WinSpool.DeviceCapabilities(Device, Port, DC_PAPERNAMES,
- PChar(pPaperFormats), nil);
- sl.Clear;
- for i := 1 to numPaperformats do sl.Add(pPaperformats^[i]);
- finally
- FreeMem(pPaperformats);
- end;
- end;
- end;
-
- procedure TForm1.Button1Click(Sender: TObject);
- begin
- GetPapernames(memo1.Lines);
- end;
-
-
- procedure TForm1.Button2Click(Sender: TObject);
- type
-
- TPaperName = array[0..63] of Char;
- TPaperNameArray = array[1..High(Cardinal) div Sizeof(TPaperName)] of
- TPaperName;
- PPapernameArray = ^TPaperNameArray;
- var
-
- Device, Driver, Port: array[0..255] of Char;
- hDevMode: THandle;
- i, numPaperformats: Integer;
- pPaperFormats: PPapernameArray;
- begin
-
- Printer.PrinterIndex := -1;
- Printer.GetPrinter(Device, Driver, Port, hDevmode);
- numPaperformats :=
- WinSpool.DeviceCapabilities(Device, Port, DC_PAPERNAMES, nil, nil);
- if numPaperformats > 0 then
- begin
- GetMem(pPaperformats, numPaperformats * Sizeof(TPapername));
- try
- WinSpool.DeviceCapabilities(Device, Port, DC_PAPERNAMES,
- Pchar(pPaperFormats), nil);
- memo1.clear;
- for i := 1 to numPaperformats do
- memo1.lines.add(pPaperformats^[i]);
- finally
- FreeMem(pPaperformats);
- end;
- end;
- end;
-
-
- function TestPrinterStatus(LPTPort: Word): Byte;
- var
- Status: byte;
- CheckLPT: word;
- begin
- Status := 0;
- if (LPTPort >= 1) and (LPTPort <= 3) then
- begin
- CheckLPT := LPTPort - 1;
- asm
- mov dx, CheckLPT;
- mov al, 0;
- mov ah, 2;
- int 17h;
- mov &Status, ah;
- end;
- end;
- Result := Status;
- end;
-
-
- {
- Pass in the LPT port number you want to check & get the following back:
- 01h - Timeout
- 08h - I/O Error
- 10h - Printer selected
- 20h - Out of paper
- 40h - Printer acknowledgement
- 80h - Printer not busy (0 if busy)
-
- Note:
- This function doesn't work under NT, it gives an access violation
- from the DOS interrupt call.
- }
-
-
- var
- Device, Driver, Port: array[0..80] of Char;
- DevMode: THandle;
- pDevmode: PDeviceMode;
- begin
- // Get printer device name etc.
- Printer.GetPrinter(Device, Driver, Port, DevMode);
- // force reload of DEVMODE
- Printer.SetPrinter(Device, Driver, Port, 0) ;
- // get DEVMODE handle
- Printer.GetPrinter(Device, Driver, Port, DevMode);
- If Devmode <> 0 Then Begin
- // lock it to get pointer to DEVMODE record
- pDevMode := GlobalLock( Devmode );
- If pDevmode <> Nil Then
- try
- With pDevmode^ Do Begin
- // modify paper size
- dmPapersize := DMPAPER_B5;
- // tell printer driver that dmPapersize field contains
- // data it needs to inspect.
- dmFields := dmFields or DM_PAPERSIZE;
- End;
- finally
- // unlock devmode handle.
- GlobalUnlock( Devmode );
- end;
- End; { If }
- end;
 |
Ответ отправил: Feniks (статус: Бакалавр)
Время отправки: 8 октября 2008, 14:45
Оценка за ответ: 5
|
Мини-форум вопроса
Всего сообщений: 3; последнее сообщение — 8 октября 2008, 14:33; участников в обсуждении: 2.
|
Вадим К (статус: Академик), 8 октября 2008, 13:03 [#1]:
Активность принтера -это то, что он печатает в данный момент или просто его наличие?
а установить формат - это просто. Главное что бы принтер поддерживал нужный формат.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
seryoga (статус: 1-ый класс), 8 октября 2008, 14:30 [#2]:
Активность - это значит включен он или нет
|
|
Вадим К (статус: Академик), 8 октября 2008, 14:33 [#3]:
только обратившись к драйверу напрямую. Хотя иногда и драйвера не в курсе.
По этому, самый надёжный способ - посмотреть.
Галочка "подтверждения прочтения" - вселенское зло.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|