|
Вопрос # 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;
Более подробно смотрите в Приложении...
Желаю удачи.
Приложение: Переключить в обычный режим-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- begin
- PixelsX:=GetDeviceCaps(printer.Handle,LogPixelsX);
- PixelsY:=GetDeviceCaps(printer.Handle,LogPixelsY);
- end;
-
-
- begin
- PrinterCoordX:=round(PixelsX/25.4*x);
- end;
-
-
- begin
- PrinterCoordY:=round(PixelsY/25.4*Y);
- end;
- GetPrinterInfo;
-
- Printer.Canvas.TextOut(PrinterCoordX(30), PrinterCoordY(55),
-
-
-
-
-
-
-
-
-
-
-
-
- procedure TForm6.SpeedButton1Click(Sender: TObject);
- var
- PRect: Trect;
- PBitMap: TBitmap;
- begin
- PBitmap := 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?
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|