Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 977

/ вопрос открыт /

Здравствуйте!
Хотел бы у вас попросить по такому вопросам:
1) Можно ли определить из delphi активность подключенного принтера?
2) Как установить программно формат бумаги у принтера в соответствии с выбранным форматом например конверта?

seryoga Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: seryoga (статус: 1-ый класс)
Вопрос отправлен: 8 октября 2008, 12:59
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Feniks

Здравствуйте, seryoga!
Держите несколь примеров в приложении. И пускай они натолкнут вас на путь истенный ;-)
1. Как найти все форматы бумаги, поддерживаемые принтером.
2. Список форматов бумаги для принтера, установленного по умолчанию.
3. Как получить статус принтера.
4. Установить размеры бумаги.

P.S. Желаю удачи.

Приложение:
  1.  
  2. uses
  3. Printers, WinSpool;
  4.  
  5. procedure GetPapernames(sl: TStrings);
  6. type
  7. TPaperName = array [0..63] of Char;
  8. TPaperNameArray = array [1..High(Word) div SizeOf(TPaperName)] of TPaperName;
  9. PPapernameArray = ^TPaperNameArray;
  10. var
  11. Device, Driver, Port: array [0..255] of Char;
  12. hDevMode: THandle;
  13. i, numPaperformats: Integer;
  14. pPaperFormats: PPapernameArray;
  15. begin
  16. Printer.PrinterIndex := -1; // Standard printer
  17. Printer.GetPrinter(Device, Driver, Port, hDevmode);
  18. numPaperformats := WinSpool.DeviceCapabilities(Device, Port, DC_PAPERNAMES, nil, nil);
  19. if numPaperformats 0 then
  20. begin
  21. GetMem(pPaperformats, numPaperformats * SizeOf(TPapername));
  22. try
  23. WinSpool.DeviceCapabilities(Device, Port, DC_PAPERNAMES,
  24. PChar(pPaperFormats), nil);
  25. sl.Clear;
  26. for i := 1 to numPaperformats do sl.Add(pPaperformats^[i]);
  27. finally
  28. FreeMem(pPaperformats);
  29. end;
  30. end;
  31. end;
  32.  
  33. procedure TForm1.Button1Click(Sender: TObject);
  34. begin
  35. GetPapernames(memo1.Lines);
  36. end;
  37.  
  38.  
  39. procedure TForm1.Button2Click(Sender: TObject);
  40. type
  41.  
  42. TPaperName = array[0..63] of Char;
  43. TPaperNameArray = array[1..High(Cardinal) div Sizeof(TPaperName)] of
  44. TPaperName;
  45. PPapernameArray = ^TPaperNameArray;
  46. var
  47.  
  48. Device, Driver, Port: array[0..255] of Char;
  49. hDevMode: THandle;
  50. i, numPaperformats: Integer;
  51. pPaperFormats: PPapernameArray;
  52. begin
  53.  
  54. Printer.PrinterIndex := -1;
  55. Printer.GetPrinter(Device, Driver, Port, hDevmode);
  56. numPaperformats :=
  57. WinSpool.DeviceCapabilities(Device, Port, DC_PAPERNAMES, nil, nil);
  58. if numPaperformats > 0 then
  59. begin
  60. GetMem(pPaperformats, numPaperformats * Sizeof(TPapername));
  61. try
  62. WinSpool.DeviceCapabilities(Device, Port, DC_PAPERNAMES,
  63. Pchar(pPaperFormats), nil);
  64. memo1.clear;
  65. for i := 1 to numPaperformats do
  66. memo1.lines.add(pPaperformats^[i]);
  67. finally
  68. FreeMem(pPaperformats);
  69. end;
  70. end;
  71. end;
  72.  
  73.  
  74. function TestPrinterStatus(LPTPort: Word): Byte;
  75. var
  76. Status: byte;
  77. CheckLPT: word;
  78. begin
  79. Status := 0;
  80. if (LPTPort >= 1) and (LPTPort <= 3) then
  81. begin
  82. CheckLPT := LPTPort - 1;
  83. asm
  84. mov dx, CheckLPT;
  85. mov al, 0;
  86. mov ah, 2;
  87. int 17h;
  88. mov &Status, ah;
  89. end;
  90. end;
  91. Result := Status;
  92. end;
  93.  
  94.  
  95. {
  96. Pass in the LPT port number you want to check & get the following back:
  97. 01h - Timeout
  98. 08h - I/O Error
  99. 10h - Printer selected
  100. 20h - Out of paper
  101. 40h - Printer acknowledgement
  102. 80h - Printer not busy (0 if busy)
  103.  
  104. Note:
  105. This function doesn't work under NT, it gives an access violation
  106. from the DOS interrupt call.
  107. }
  108.  
  109.  
  110. var
  111. Device, Driver, Port: array[0..80] of Char;
  112. DevMode: THandle;
  113. pDevmode: PDeviceMode;
  114. begin
  115. // Get printer device name etc.
  116. Printer.GetPrinter(Device, Driver, Port, DevMode);
  117. // force reload of DEVMODE
  118. Printer.SetPrinter(Device, Driver, Port, 0) ;
  119. // get DEVMODE handle
  120. Printer.GetPrinter(Device, Driver, Port, DevMode);
  121. If Devmode <> 0 Then Begin
  122. // lock it to get pointer to DEVMODE record
  123. pDevMode := GlobalLock( Devmode );
  124. If pDevmode <> Nil Then
  125. try
  126. With pDevmode^ Do Begin
  127. // modify paper size
  128. dmPapersize := DMPAPER_B5;
  129. // tell printer driver that dmPapersize field contains
  130. // data it needs to inspect.
  131. dmFields := dmFields or DM_PAPERSIZE;
  132. End;
  133. finally
  134. // unlock devmode handle.
  135. GlobalUnlock( Devmode );
  136. end;
  137. End; { If }
  138. end;


Ответ отправил: Feniks (статус: Бакалавр)
Время отправки: 8 октября 2008, 14:45
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 3; последнее сообщение — 8 октября 2008, 14:33; участников в обсуждении: 2.
Вадим К

Вадим К (статус: Академик), 8 октября 2008, 13:03 [#1]:

Активность принтера -это то, что он печатает в данный момент или просто его наличие?
а установить формат - это просто. Главное что бы принтер поддерживал нужный формат.
Галочка "подтверждения прочтения" - вселенское зло.
seryoga

seryoga (статус: 1-ый класс), 8 октября 2008, 14:30 [#2]:

Активность - это значит включен он или нет
Вадим К

Вадим К (статус: Академик), 8 октября 2008, 14:33 [#3]:

только обратившись к драйверу напрямую. Хотя иногда и драйвера не в курсе.
По этому, самый надёжный способ - посмотреть.
Галочка "подтверждения прочтения" - вселенское зло.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 19 октября 2017, 14:07
Выполнено за 0.05 сек.
Рейтинг@Mail.ru