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

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

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

Delphi.int.ru Expert

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

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

#   

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


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

Подробнее »



Вопрос # 1 695

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

Приветствую, уважаемые эксперты! Подскажите пожалуйста, можно ли вывести текст (например, из ListBox) на печать с указанием отступов, исключив лишние пробелы и др., чтобы на других компьютерах не надо было заново всё настраивать? Если да, то как примерно это может выглядеть? Заранее благодарю!

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

Вопрос задала: Dess (статус: Посетитель)
Вопрос отправлен: 16 июня 2008, 00:40
Состояние вопроса: открыт, ответов: 2.

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

Здравствуйте, Dess!
Самый простой и быстрый способ - это использовать класс 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:21

Ответ #2. Отвечает эксперт: ilyasich

Здравствуйте, Dess!
Данная проблема решается просто если вы занете какая бумага используется принтером А4 или А3 и тп
Просто опишите функцию перевода Пиксели в ММ то есть
function MMToPixelsX(mm:integer):integer;
begin
MMToPixelsX:=mm*Round(Printer.PageWidth/210);//ширина бумаги А4 210мм соотвественно коефициент получаем реальная ширина пикселях поделив на реальную ширину бумаги
end;
так же для Y отдельно. Так же надо учитывать границы области печати. (У любого принтера есть место где он реально печатать не может). Определить это тоже можно погуглите:)

Ответ отправил: ilyasich (статус: 1-ый класс)
Время отправки: 11 августа 2011, 12:28


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

Всего сообщений: 1; последнее сообщение — 16 июня 2008, 05:45; участников в обсуждении: 1.
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 16 июня 2008, 05:45 [#1]:

Настройка параметров вывода на печать производится пользователем или при разработке программы? Может быть Memo или RichEdit, а не ListBox?

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

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