![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
||||
|
||||
|
Собственно задача в следующем: есть 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
|
||||
|
||||
|
используй метафайл для создания страницы и отображай его на нужном контексте.
|
| Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
Помидоркин (02.11.2013)
| ||
|
#3
|
||||
|
||||
|
Цитата:
Можно немного подробней. Я так понимаю метафайл это не конкретный файл на диске а объект типа TFile, не обязательно ассоциированный с каким то файлом на компе. И кажется это что-то типа векторной графики. Если можно небольшой пример. |
|
#4
|
||||
|
||||
|
Код:
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)
| ||