Поддержка / Donate
 

WebMoney

Яндекс.Деньги

SMS.Копилка
Деньги@Mail.ru
Rupay
E-gold
PayPal

 

Благодарю за поддержку!

Лента RSS - Новости сайта Новости сайта
Лента RSS - Новости форума Новости форума
Добавить в закладки и поделиться Bookmark and Share

 

Архив исходников

 


Automatic translation

 
English German French
Italian Spanish Portuguese
Greece Japan Chinese
  Korean  

  

 

  Форум  

Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Google  
 

Пример использования 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.




Источник - Проект "Delphi World" © Выпуск 2002 - 2004
Автор проекта: Акулов Николай



   Rambler's Top100             Яндекс цитирования