Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.11.2013, 09:35
Аватар для Помидоркин
Помидоркин Помидоркин вне форума
Начинающий
 
Регистрация: 07.10.2012
Адрес: Дедовск
Сообщения: 110
Версия Delphi: Rio 10.3
Репутация: 10
По умолчанию Размер шрифта, разрешение при печати и предпросмотр

Собственно задача в следующем: есть StringList, его нужно вывести на печать с минимальными полями, в несколько колонок , заполнив весю страницу. Написал процедуру, которая выводит на канву текст:
Код:
begin
...
 while i3<Kod.Count-1 do //Kod - Стринглист
 begin
  for i2 := 0 to RowOfClmn-1 do //Строк в колонке
  begin
   //W+ClmnInt - ширина строки + расстояне между колонками
  //H+RowInt - высота строки + расстояне между строками
   Printer.Canvas.TextOut((W+ClmnInt)*ClmnCount, (H+RowInt)*i2,Kod[i3]);
   i3:=i3+1;
   if i3 = Kod.Count then Break;
  end;
  ClmnCount:= ClmnCount+1; //номер колонки
 end;
end;
Страницу заполняю, изменяя размер шрифта и растояния между колонками и строками. На канве принтера все отрисовывается правильно, но я не вижу что делаю, пока не напечатаю страницу.
Отрисовать канву принтера (например в PainBox) нельзя, для StretchDraw нужен TGraphic.
Пытался вывести текст сначала на другую канву (PainBox, BitMap: TBitMap).
И вот тут начинаются проблеммы со шрифтами. С принтером все ясно у страницы есть физические размеры в милиметрах, шрифт задается в дюймах (размер шрифта / 72 * inch) и при LOGPIXELSX = 600 (или 1200, или какой другой) имеем вполне определенный размер в пикселях.
Есть конечно - BitMap.Canvas.Font.PixelsPerInch равное 96, только толку от него мало, 600/96 = 6,25 а разность высоты текста у канвы принтера и канвы битмэпа при разных размерах шрифта плавает вокруг этого числа. В общем то что выводится на принтер и на битмэп не совпадает,а использовать Printer.Canvas.StretchDraw не лучшее решение шрифты размазываются.
Пробовал вот с этим разобратся http://www.sql.ru/forum/477567/predv...-pered-pechatu подчти ни чего не понял.
Ответить с цитированием
  #2  
Старый 02.11.2013, 10:45
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

используй метафайл для создания страницы и отображай его на нужном контексте.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
Помидоркин (02.11.2013)
  #3  
Старый 02.11.2013, 13:20
Аватар для Помидоркин
Помидоркин Помидоркин вне форума
Начинающий
 
Регистрация: 07.10.2012
Адрес: Дедовск
Сообщения: 110
Версия Delphi: Rio 10.3
Репутация: 10
По умолчанию

Цитата:
Сообщение от NumLock
используй метафайл для создания страницы и отображай его на нужном контексте.
да да да, где то я видел, когда искал инфу по предпросмотру перед печатью, сейчас найти немогу.
Можно немного подробней. Я так понимаю метафайл это не конкретный файл на диске а объект типа TFile, не обязательно ассоциированный с каким то файлом на компе. И кажется это что-то типа векторной графики. Если можно небольшой пример.
Ответить с цитированием
  #4  
Старый 02.11.2013, 20:07
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure FormResize(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    Metafile: TMetafile;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  MetafileCanvas: TMetafileCanvas;
begin
  Metafile:=TMetafile.Create;
  Metafile.Width:=1000;
  Metafile.Height:=1000;
  MetafileCanvas:=TMetafileCanvas.Create(Metafile, 0);
  MetafileCanvas.Brush.Color:=clCream;
  MetafileCanvas.Pen.Color:=clBlue;
  MetafileCanvas.Pen.Width:=2;
  MetafileCanvas.FillRect(Rect(0, 0, 1000, 1000));
  MetafileCanvas.Rectangle(10, 10, 990, 990);
  MetafileCanvas.Font.Name:='Tahoma';
  MetafileCanvas.Font.Size:=12;
  MetafileCanvas.TextOut(20, 20, 'MetafileCanvas');
  MetafileCanvas.Free;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Metafile.Free;
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
  Canvas.StretchDraw(Rect(0, 0, ClientWidth, ClientHeight), Metafile);
end;

procedure TForm1.FormResize(Sender: TObject);
begin
  Invalidate;
end;

end.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
Помидоркин (02.11.2013)
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:20.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter