Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Печать таблицы


Автор: Mick Winder 15.10.2004, 15:18
Как распечатать содержимое таблицы DBGrid на принтер (для пользователя)? qstn.gif

Автор: VIY 15.10.2004, 15:22
Формируй QuickReport или что-нибудь подобное.

Автор: Mick Winder 15.10.2004, 15:41
Нет, я имел в виду с помощью объекта TPrinter... thumbs-up.gif

Автор: VIY 15.10.2004, 16:04
Краткое описание и примеры использования TPrinter можешь помотреть на www.delphiworld.narod.ru

Но тебе прийдётся в этом случае расчитывать все координаты и отрисовывать вручную разделители.
Помоему проще динамически генерить QuickReport.

Автор: Akella 15.10.2004, 16:20
поставь себе библиотеку 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;


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)