Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Пример использования 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 - 2024
Автор проекта: USU Software
Вы можете выкупить этот проект.