Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 699

/ вопрос открыт /

Здравствуйте, уважаемые эксперты!
У меня такой вопрос, программа рисует на Form.Canvas прямоугольники, они накладываются друг на друга, это перекрытие и является важным моментом(координаты задаются на Форме в тексовом поле). Как распечатать эти рисунки с Формы? Данные текстовых полей печатаются, а рисунок на печать не выходит(

Камилла Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задала: Камилла (статус: Посетитель)
Вопрос отправлен: 16 июня 2008, 20:54
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Feniks

Здравствуйте, Камилла!
Самый простой и быстрый способ - это использовать класс TPrinter.
Delphi имеет стандартный объект для доступа к принтеру - TPRINTER,
находящийся в модуле PRINTERS. В этом модуле имеется
переменная Printer:Tpinter, что избавляет от необходимости описывать свою.
Он позволяет выводить данные на печать и управлять процессом печати.
Правда, в некоторых версиях Delphi 1 он имеет "глюк" - не работают
функции 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,'Это тест принтера !!!'); { Печатаем текст }
      EndDoc; { Конец печати }
   end;
end;
Более подробно смотрите в Приложении...
Желаю удачи.

Приложение:
  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  
  14.  
  15.  
  16.  
  17.  
  18.  
  19.  
  20.  
  21.  
  22.  
  23.  
  24.  
  25.  
  26.  
  27.  
  28.  
  29.  
  30.  
  31.  
  32.  
  33.  
  34.  
  35.  
  36.  
  37. begin
  38. PixelsX:=GetDeviceCaps(printer.Handle,LogPixelsX);
  39. PixelsY:=GetDeviceCaps(printer.Handle,LogPixelsY);
  40. end;
  41.  
  42.  
  43. begin
  44. PrinterCoordX:=round(PixelsX/25.4*x);
  45. end;
  46.  
  47.  
  48. begin
  49. PrinterCoordY:=round(PixelsY/25.4*Y);
  50. end;
  51. GetPrinterInfo;
  52.  
  53. Printer.Canvas.TextOut(PrinterCoordX(30), PrinterCoordY(55),
  54.  
  55.  
  56.  
  57.  
  58.  
  59.  
  60.  
  61.  
  62.  
  63.  
  64.  
  65.  
  66. procedure TForm6.SpeedButton1Click(Sender: TObject);
  67. var
  68. PRect: Trect;
  69. PBitMap: TBitmap;
  70. begin
  71. PBitmap := TBitMap.Create;
  72. PBitmap.LoadFromFile('C:1.bmp');
  73. with PRect do
  74. begin
  75. left := 0;
  76. top := 0;
  77. right := Printer.PageWidth;
  78. Bottom := Printer.PageHeight;
  79. end;
  80. with printer do
  81. begin
  82. BeginDoc;
  83. font.name := 'Times New Roman';
  84. Canvas.StretchDraw(PRect, Bitmap);
  85. EndDoc;
  86. end;
  87. PBitmap.Free;
  88.  
  89. end;


Ответ отправил: Feniks (статус: Бакалавр)
Время отправки: 17 июня 2008, 18:24
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 1; последнее сообщение — 17 июня 2008, 09:00; участников в обсуждении: 1.
min@y™

min@y™ (статус: Доктор наук), 17 июня 2008, 09:00 [#1]:

Если координаты, параметры (Brush, Pen) и очерёдность отрисовки каждого прямоугольника известны, то можно их рисовать прямо сразу и на Printer.Canvas (естественно, учитывая PixelsPerInch канваса формы и размер страницы принтера в пикселах этого принтера).
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:33
Выполнено за 0.02 сек.