| 
| 
 | Вопрос # 1 695/ вопрос открыт / | 
 |  Приветствую, уважаемые эксперты! Подскажите пожалуйста, можно ли вывести текст (например, из ListBox) на печать с указанием отступов, исключив лишние пробелы и др., чтобы на других компьютерах не надо было заново всё настраивать? Если да, то как примерно это может выглядеть? Заранее благодарю! 
|  |   Вопрос задала: 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;Более подробно смотрите в Приложении...Желаю удачи.
 Приложение:Переключить в обычный режим                                     beginPixelsX:=GetDeviceCaps(printer.Handle,LogPixelsX);PixelsY:=GetDeviceCaps(printer.Handle,LogPixelsY);end;  beginPrinterCoordX:=round(PixelsX/25.4*x);end;  beginPrinterCoordY:=round(PixelsY/25.4*Y);end;GetPrinterInfo; Printer.Canvas.TextOut(PrinterCoordX(30), PrinterCoordY(55),            procedure TForm6.SpeedButton1Click(Sender: TObject);varPRect: Trect;PBitMap: TBitmap;beginPBitmap := TBitMap.Create;PBitmap.LoadFromFile('C:1.bmp');with PRect do   begin     left := 0;     top := 0;     right := Printer.PageWidth;     Bottom := Printer.PageHeight;   end;with printer do   begin     BeginDoc;     font.name := 'Times New Roman';     Canvas.StretchDraw(PRect, Bitmap);     EndDoc;   end;PBitmap.Free; 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? |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |