Советы по Delphi

         

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


Может ли мне кто-либо сказать, как с помощью 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.

- Jeff Fisher [000822]



Содержание раздела