Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС
выпущен 4 ноября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

БОЛЬШОЙ FAQ ПО DELPHI



Пример использования TPrinter

Автор: Jeff Fisher

Может ли мне кто-либо сказать, как с помощью TPrinter сделать следующее?:

  1. Замена исходного Paper Bin страницей. Создание отчета, который нужно переключать между двумя бункерами (некоторым страницам отчета нужно работать с другим бункером, например бланки писем и пр.).
  2. Печать нескольких копий отчета. Для этого желательно использовать диалог настройки принтера, но это, похоже, не работает.
То, что вы собираетесь делать, возможно с помощью структуры TDevMode, получив к которой доступ, можно делать необходимые вам изменения. Структура TDevMode имеет все необходимые для настройки принтера поля и позволяет сделать любые настройки не обращаясь к диалогу настройки принтера.

Вот пример одного из моих компонентов, инкапсулирующий вышесказанную функциональность:


 procedure TCrpePrinter.GetCurrentPrinter;
 var
   lpDevice: PChar;
   lpDriver: PChar;
   lpPort: PChar;
   Handle: THandle;
 begin
   lpDevice := StrAlloc(255);
   lpDriver := StrAlloc(255);
   lpPort := StrAlloc(255);
 
   try
     Printer.GetPrinter(lpDevice, lpDriver, lpPort, Handle);
     if Handle <> 0 then
       { если это не 0, то мы имеем указатель на структуру устройства}
     begin
       FDevMode := Ptr(Handle, 0); {Получаем дескриптор структуры устройства}
       FDevice := StrPas(lpDevice);
       FDriver := StrPas(lpDriver);
       FPort := StrPas(lpPort);
     end
     else
     begin
       Printer.PrinterIndex := Printer.PrinterIndex;
         {Этим мы пытаемся осуществить инициализацию}
       Printer.GetPrinter(lpDevice, lpDriver, lpPort, Handle);
       if Handle <> 0 then
       begin
         FDevMode := Ptr(Handle, 0);
         FDevice := StrPas(lpDevice);
         FDriver := StrPas(lpDriver);
         FPort := StrPas(lpPort);
       end
       else
       begin
         FDevMode := nil;
         raise ECrpe.Create('Ошибка загрузки драйвера принтера');
       end;
     end;
   finally
     StrDispose(lpDevice);
     StrDispose(lpDriver);
     StrDispose(lpPort);
   end;
 end;
 

Изменение лотка и количества копий:


 dmCopies := 2;
 dmDefaultSource := 2;  {Нижний лоток}
 

Как только вы получите указатель на структуру devmode, вы вправе делать изменения любых полей. Говорят, могут быть проблемы при изменении лотков во время печати, но сам я не пробовал менять эти поля в структуре DevMode.




<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ



Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS