Пример использования TPrinter
Автор: Jeff Fisher
Может ли мне кто-либо сказать, как с помощью TPrinter сделать
следующее?:
- Замена исходного Paper Bin страницей. Создание отчета, который нужно
переключать между двумя бункерами (некоторым страницам отчета нужно работать с
другим бункером, например бланки писем и пр.).
- Печать нескольких копий отчета. Для этого желательно использовать диалог
настройки принтера, но это, похоже, не работает.
То, что вы
собираетесь делать, возможно с помощью структуры 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.
|