поставь себе библиотеку EhLib, там есть такая возможность Добавлено @ 16:24 к сожалению распечатывать DBGrid через TPrinter доаольно умоемкий процесс, мне кажется.
вот несколько примеров
| Код | Может ли мне кто-либо сказать, как с помощью 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. |
1. После команды BeginDoc шрифт у Canvas принтера сбрасывается и его необходимо задавать заново
2. Все координаты даны в пикселах, а для нормальной работы необходимы миллиметры (по двум очевидным причинам: очень трудно произвести разметку страницы в пикселах (особенно если необходима точность), и , главное, при изменении разрешающей способности принтера будет изменяться число точек на дюйм, и все координаты "поедут".
3. У TPrinter информация о принтере, по видимому, определяются один раз - в момент запуска программы (или смены принтера). Поэтому изменение настроек принтера в процессе работы программы может привести к некорректной работе, например, неправильной печать шрифтов True Type.
| Код | Delphi имеет стандартный объект для доступа к принтеру - TPRINTER, находящийся в модуле PRINTERS. В этом модуле имеется переменная Printer:Tpinter, что избавляет от необходимости описывать свою. Он позволяет выводить данные на печать и управлять процессом печати. Правда, в некоторых версиях Delphi1 он имеет "глюк" - не работают функции Draw и StrethDraw. Но эта проблема поправима - можно использовать функции API. Далее приведены основные поля и методы объекта Printers :
PROPERTY
Aborted:boolean - Показывает, что процесс печати прерван Canvas:Tcanvas - Стандартный Canvas, как у любого графического объекта. Он позволяет рисовать на листе бумаге графику, выводить текст ... . Тут есть несколько особенностей, они описаны после описания объекта. Fonts:Tstrings - Возвращает список шрифтов, поддерживаемых принтером Handle:HDS - Получить Handle на принтер для использования функций API (см. Далее) Orientation:TprinterOrientation - Ориентация листа при печати : (poPortrait, poLandscape) PageHeight:integer - Высота листа в пикселах PageNumber:integer - Номер страницы, увеличивается на 1 при каждом NewPage PageWidth:integer - Ширина листа в пикселах PrinterIndex:integer - Номер используемого принтера по списку доступных принтеров Printers Printers:Tstrings - Список доступных принтеров Printing:boolean - Флаг, показывающий, что сейчас идет процесс печати Title:string - Имя документа или приложения. Под этим именем задание на печать регистрируется в диспетчере печати METODS
AssignPrn(f:TextFile) - Связать текстовый файл с принтером. Далее вывод информации в этот файл приводит к ее печати. Удобно в простейших случаях. Abort - Сбросить печать BeginDoc - Начать печать NewPage - Начать новую страницу EndDoc - Завершить печать. Пример :
Procedure TForm1.Button1Click(Sender: TObject); Begin With Printer do Begin // Начало печати BeginDoc; // Задали шрифт Canvas.Font:=label1.font; // Печатаем текст Canvas.TextOut(100,100,'Delphi World - лучше всех !!! :) '); // Конец печати EndDoc; end; end;
|
как установить кол-во точек на дюйм
| Код | uses Printers;
var MyFile: TextFile; begin Printer.PrinterIndex := 2; AssignPrn(MyFile); Rewrite(MyFile); Printer.Canvas.Font.Name := 'Courier New'; Printer.Canvas.Font.Style := [fsBold]; Printer.Canvas.Font.PixelsPerInch := GetDeviceCaps(Printer.Canvas.Handle, LOGPIXELSY); Writeln(MyFile, 'Print this text'); System.CloseFile(MyFile); end;
| |