| « Поставить закладку » « Сделать стартовой » | |||
|
|||
| Статьи:: Delphi :: Разные статьи :: Секреты печати из программы на Delphi
Секреты печати из программы на DelphiЗдравствуйте дорогие читатели. Сегодня мы разберем механизмы печати в программах Делфи. TPrinterДля упрощенного доступа к принтеру Delphi имеет стандартный объектTPrinter который находится в модуле Printers, в этом же модуле имеется функция Printer: function Printer: TPrinter; begin if FPrinter = nil then FPrinter := TPrinter.Create; Result := FPrinter; end; Как видно из листинга она проверяет был ли создан экземпляр объекта FPrinter:TPrinter, если нет, то создает и возвращает ссылку на него, что избвляет разработчика от необходимости создавать объект самому. Вот основные методы и свойства объекта TPtinter. Свойства:
Методы:
Простейший пример печати: procedure TForm1.Button1Click(Sender: TObject); begin Printer.BeginDoc; Printer.Canvas.TextOut(200,200,'Delphi is cool'); Printer.EndDoc; end; Настройки принтераДля чтения настроек принтера можно пользоваться функциией GetDeviceCaps(DC:HDC,Index:integer):Integer, для ее вызова нам потребуется DC принтера (Printer.Handle). Второй параметр функии - это код того параметра настроек принтера который необходимо получить, его можно задать одной из констант:
Теперь имея все эти данные мы можем распечатать документ с учетом полей и размеров шрифта. И так поля практически у любого принтера имеется непечатаемая область (границы печати) и при установке полей печати документа необходимо учитывать эту непечатаемую область. Вот процедура вычисления границ печати: var PixPerInchX,PixPerInchY,PageWidthInMM,PageHeightInMM,PhysOffsetX,PhysOffsetY, PageResX,PageResY,PhysPageWidth,PhysPageHeigth:integer; Margins:TRect; procedure GetPrinterInfo; var DC:HDC; begin DC:=Printer.Handle; PixPerInchX:=GetDeviceCaps(DC,LOGPIXELSX); PixPerInchY:=GetDeviceCaps(DC,LOGPIXELSY); PageWidthInMM:=GetDeviceCaps(DC,HORZSIZE); PageHeightInMM:=GetDeviceCaps(DC,VERTSIZE); PhysOffsetX:=GetDeviceCaps(DC,PHYSICALOFFSETX); PhysOffsetY:=GetDeviceCaps(DC,PHYSICALOFFSETY); PhysPageWidth:=GetDeviceCaps(DC,PHYSICALWIDTH); PhysPageHeigth:=GetDeviceCaps(DC,PHYSICALHEIGHT); PageResX:=GetDeviceCaps(DC,HORZRES); PageResY:=GetDeviceCaps(DC,VERTRES); // границы печати Margins.Top:=round(PhysOffsetY/PixPerInchY*25.4); Margins.Left:=round(PhysOffsetX/PixPerInchX*25.4); Margins.Bottom:=round((PhysPageHeigth-PageResY-PhysOffsetY)/PixPerInchY*25.4); Margins.Right:=round((PhysPageWidth-PageResX-PhysOffsetX)/PixPerInchX*25.4); end; Теперь попробуем распечатать лист на котором будет рамка по периметру с отступами один сантиметр слева, справа и сверху и 1.5 см снизу. procedure PrintMargins;
begin
GetPrinterInfo;
Printer.BeginDoc;
Printer.Canvas.MoveTo(MilimetersToPixelsX(10-Margins.Left),
MilimetersToPixelsY(10-Margins.Top));
Printer.Canvas.LineTo(MilimetersToPixelsX(10-Margins.Left),
MilimetersToPixelsY(PageHeightInMM-15+Margins.Bottom));
Printer.Canvas.LineTo(MilimetersToPixelsX(PageWidthInMM-10+Margins.Right),
MilimetersToPixelsY(PageHeightInMM-15+Margins.Bottom));
Printer.Canvas.LineTo(MilimetersToPixelsX(PageWidthInMM-10+Margins.Right),
MilimetersToPixelsY(10-Margins.Top));
Printer.Canvas.LineTo(MilimetersToPixelsX(10-Margins.Left),
MilimetersToPixelsY(10-Margins.Top));
Printer.EndDoc;
end;
А вот код процедуры печати текста обрамленного прямоугольником: procedure TForm1.Button1Click(Sender: TObject);
var
TextWidthMM:integer;
TextHeightMM:integer;
begin
GetPrinterInfo;
Printer.BeginDoc;
Printer.Canvas.Font.PixelsPerInch:=PixPerInchX;
TextWidthMM:=round((Printer.Canvas.TextWidth('Печать')/PixPerInchX)*25.4);
TextHeightMM:=round((Printer.Canvas.TextHeight('Печать')/PixPerInchY)*25.4);
Printer.Canvas.Rectangle(MilimetersToPixelsX(19),MilimetersToPixelsY(19),
MilimetersToPixelsX(19+TextWidthMM+2),
MilimetersToPixelsY(19+TextHeightMM+2));
Printer.Canvas.TextOut(MilimetersToPixelsX(20),MilimetersToPixelsY(20),'Печать');
Printer.EndDoc;
end;
На этом пока все. Рубрика: Разные статьи
Trac + Subversion @ Ubuntu: Revisited.
Задача: Установить на только что инсталлированный Ubuntu последнюю версию Trac, создать репозитории для нескольких проектов и настроить окружение соответственно. Структура проектов должна быть полностью корректной, установка максимально быстрой при минимальном количестве пакетов. Авторизация в репозитории и окружения Trac может быть общей, но позволяющей индивидуальную настройку для каждого проекта. Также, установка должна быть максимально независима от версий.
Подробнее... |
Рубрика: Ubuntu
| Добавлено: 30.08.2008
[g]Vim в режиме Python: Рекомпиляция в Windows.
Редактор Vim наиболее известен среди разработчиков в системах Unix — конкурент emacs, что-то вроде консольного IDE — этот редактор при должной сноровке и настройке (мне кажется, сноровке несколько меньшей и настройке более очевидной чем в emacs, но у последнего также есть мощная мультифункциональность — выбор за программистом) способен убыстрить и упростить многие процессы на этапах разработки не в ущерб таким удобствам как, например, авто-дополнение и навигация по проекту.
Подробнее... |
Рубрика: Статьи
| Добавлено: 30.08.2008
Java + JSON. Пути к дружбе.
Спешу поделиться результатами небольшого исследования, оказавшегося необходимым для текущего проекта. Рассматривается возможность связки Java и JSON, её преимущества и недостатки. Я расскажу о практической части, о теории больше поведают нижеприведённые ссылки (англ.).
Подробнее... |
Рубрика: Технология JAVA
| Добавлено: 30.08.2008
Остальные статьи:
Драйвер SQL Server 2005 для PHP
Типы данных в MySQL (сжатый справочник для PHP программиста)
PHP класс для работы с Яндекс.XML
Ошибки начинающих PHP разработчиков
Наследование шаблонов в Smarty
Особенности хранения сессий PHP в memcached
Internet Explorer 8 beta 2
9 правил для начинающего Ajax-разработчика
ExtJS 2.2 - полная поддержка Firefox 3, новые виджеты и другие нововведения
Windows 7: под покровом тайны
Apache mod_ndb - MySQL кластер с доступом через HTTP и Ajax
Поиск уязвимостей в программах с помощью анализаторов кода
Как появилась библиотека VivaCore
Это сложно
ASP.NET и немного поисковой оптимизации
Protocol buffers: библиотека обмена данными для C++, Java, Python от Google |
Цитата дня (все,добавить):
|
Realcoding.NET
© 2003-2008 |
Контакты |
Реклама на сайте
|