Форум: "Начинающим";
Текущий архив: 2007.06.03;
Скачать: [xml.tar.bz2];
Внизпечать Найти похожие ветки
← →
Dmitry_177 (2007-05-11 23:52) [0]Как задать объекту Printer: TPrinter; ширину и высоту страницы, число копий да и сам выбранный принтер в PrintDialog1? Правильно ли вообще так будет?
uses
Printers
procedure TForm1.Button1Click(Sender: TObject);
var
Printer: TPrinter;
begin
if PrintDialog1.Execute then
try
Printer := TPrinter.Create;
Printer.Copies := PrintDialog1.Copies;
Printer.PageHeight := // незнаю что тут писать из PrintDialog1
finally
Printer.Free;
end;
end;
← →
{RASkov} © (2007-05-12 00:12) [1]> [0] Dmitry_177 (11.05.07 23:52)
> Printer := TPrinter.Create;
Не обязательно объявлять свою переменную типа TPrinter и далее создавать ее. Достаточно пользовать уже объявленную и созданную в Printers.pas.
> Printer.PageHeight :=
ReadOnly свойство. Ничего здесь писать не надо это все в диалоге настраивается. See also TPrinterSetupDialog.
← →
Dmitry_177 (2007-05-12 00:41) [2]а еще мне не очень понятно чем лучше пользоваться PrintDialog1 или PrinterSetupDialog?
← →
Dmitry_177 (2007-05-12 01:02) [3]а как при печати делать перенос строки? просто если печатать Printer.Canvas.TextOut(...) и если строка будет длинной(длиннее чем ширина бумаги, то часть строки не распечатается и уйдет за край)
← →
{RASkov} © (2007-05-12 01:12) [4]> [3] Dmitry_177 (12.05.07 01:02)
У тебя есть Rect страницы (Printer.Canvas.ClipRect) и ширина строки (Printer.Canvas.TextWidth()) вот и учитывай все это при выводе на канву принтера... Вообщем все в ручки, автоматом не получится.... Посмотри также DrawText(API) и параметр DT_WORDBREAK....
← →
Германн © (2007-05-12 01:29) [5]
> Dmitry_177 (11.05.07 23:52)
>
> Как задать объекту Printer: TPrinter; ширину и высоту страницы,
> число копий да и сам выбранный принтер в PrintDialog1?
А о печати чего тут вообще идёт речь?
← →
{RASkov} © (2007-05-12 03:38) [6]> [5] Германн © (12.05.07 01:29)
> А о печати чего тут вообще идёт речь?
? По всей видимости.... длинной строки.... ;)
> [3] Dmitry_177 (12.05.07 01:02)
Попробуй вот этот пример, для канвы принтера аналогичноprocedure TForm.FormResize(Sender: TObject);
var S: String; N: Integer; R: Trect;
begin
for N:= 0 to 50 do S:=S+"Длинная строка - много слов ";
R:=Canvas.ClipRect; Canvas.FillRect(R);
N:=DrawText(Canvas.Handle, PChar(S), -1, R, DT_WORDBREAK);
INC(R.Top, N+10);
DrawText(Canvas.Handle, PChar(S), -1, R, DT_WORDBREAK or DT_RIGHT);
end;
← →
Dmitry_177 (2007-05-12 03:39) [7]попробовал так:
procedure TForm1.Button1Click(Sender: TObject);
var
str: string;
Rect: TRect;
begin
str := "1234567890123456789012345678901234567890123456789012345678901234567890123456789 01234567890123456789012345678901234567890123456789012345678901234567890123456789 0123456789012345678901234567890123456789012345678901234567890";
Form1.Canvas.Font.Size := 12;
if Form1.Canvas.TextWidth(str) > Form1.Canvas.ClipRect.Right then
begin
Rect := Form1.Canvas.ClipRect;
DrawText(Form1.Canvas.Handle, PChar(str), Length(str), Rect, DT_WORDBREAK);
end;
end;
и всеравно у меня в одну строку выводится текст..
← →
Dmitry_177 (2007-05-12 03:40) [8]Form1.Canvas для эксперимента, чтоб бумагу не портить =)
← →
{RASkov} © (2007-05-12 03:41) [9]> [8] Dmitry_177 (12.05.07 03:40)
См [6] :)
← →
{RASkov} © (2007-05-12 03:45) [10]> [7] Dmitry_177 (12.05.07 03:39)
Если у тебя ширина слова будет больше ширины листа, как нечто похожее в [7], то этот способ не пойдет....:(
← →
{RASkov} © (2007-05-12 03:50) [11]> [7] Dmitry_177 (12.05.07 03:39)
> и всеравно у меня в одну строку выводится текст..
Странно.... Тут либо у тебя хватает ширины канвы для строки, либо должно в 2 или 3 строки, но часть "слова(в)" будут "обрезаны" правым краем канвы.
← →
{RASkov} © (2007-05-12 03:53) [12]> правым краем канвы
Т.е. у канвы краев нет.... в данном случае я хотел сказать правым краем формы. А точнее - Form1.Canvas.ClipRect.Right :^)
← →
Dmitry_177 (2007-05-12 03:56) [13]я уже разобрался.. действительно не подумал о том что переносится то по словам...=)
← →
Dmitry_177 (2007-05-12 13:19) [14]У меня опять небольшая загвоздка.. Функция DrawText возвращает то она высоту уже после того как выведет текст, а как тогда определять влезет ли он на текущую страницу или в противном случае нужно какую-то часть текста распечатать до конца текущей страницы, и остальную на новой?
Попробовал создавать еще один Canvas и на нем выводить и делать все расчеты, чтобы потом перенести его в Printer.Canvas, не знаю правильное ли решение или есть другое? Попробовал сделать так:
var
Canv: TCanvas;
begin
try
Canv := TCanvas.Create;
// рисуем-считаем..
finally
Canv.Free;
end;
end;
Но так у меня AV выскакивает..
← →
{RASkov} © (2007-05-12 15:24) [15]> [14] Dmitry_177 (12.05.07 13:19)
> а как тогда определять влезет ли он на текущую страницу
> или в противном случае нужно какую-то часть текста распечатать
> до конца текущей страницы, и остальную на новой?
> Попробовал создавать еще один Canvas
Не нужен еще один канвас, посмотри все параметры DrawText и вчасности DT_CALCKRECT (помоему правильно написал) вообщем с этим параметром идет расчет области вывода текста без его "рисования"....
← →
{RASkov} © (2007-05-12 15:28) [16]*DT_CALCRECT
← →
Dmitry_177 (2007-05-12 19:28) [17]Что-то ерунда какая-то... После выполнения функции с флагами:
DrawText(Printer.Canvas.Handle, PChar(strData), Length(strData), prRect, DT_WORDBREAK or DT_MODIFYSTRING or DT_WORD_ELLIPSIS);
никакой нулевой символ не вставляется в strData.. а сам текст уходит вниз за пределы prRect
← →
{RASkov} © (2007-05-12 19:51) [18]> DT_WORD_ELLIPSIS
В справке D7 такой константы нет, хотя в модуле Windows определена константа DT_WORD_ELLIPSIS = $40000;
Код из [17] генерит ошибку. Я на канве формы пробывал...
Access violation at address 7C913088 in module "ntdll.dll". Write of address 00471BD0.
← →
Dmitry_177 (2007-05-12 20:00) [19]странно, у меня без ошибок все.. а про DT_WORD_ELLIPSIS я как понял это для того, чтобы если в поле prRect не влазиет весь текст, то сколько влазиет он выводит, а в строке strData остаются символы те которые были выведены, точнее вставляется нулевой символ к конце тех символов которые были выведены..
← →
{RASkov} © (2007-05-12 20:53) [20]> [19] Dmitry_177 (12.05.07 20:00)
Для этого достаточно флага DT_END_ELLIPSIS текст, что не влезет в Rect, обрежется и в конец текста добавятся (...), без скобок.
← →
Dmitry_177 (2007-05-12 21:10) [21]мне не надо какраз точки вставлять..
← →
{RASkov} © (2007-05-12 21:32) [22]> [21] Dmitry_177 (12.05.07 21:10)
>мне не надо как раз точки вставлять..
С учетом
> [14] Dmitry_177 (12.05.07 13:19)
> [17] Dmitry_177 (12.05.07 19:28)
> [19] Dmitry_177 (12.05.07 20:00)
Я не пойму что тебе надо :( Зачем тебе тогда DT_END[WORD]_ELLIPSIS ? См [15,16]
← →
Dmitry_177 (2007-05-13 00:05) [23]вобщем мне нужно так что если длинная строка, она распечатываламь в несколько строк и так что если дошел конец страницы, то печать продо жалась на новой странице..
← →
Dmitry_177 (2007-05-13 00:15) [24]вобщем мне нужно так что если длинная строка, она распечатываламь в несколько строк и так что если дошел конец страницы, то печать продо жалась на новой странице..
← →
{RASkov} © (2007-05-13 00:35) [25]> [23] Dmitry_177 (13.05.07 00:05)
DrawText в этом плане в полную тебе не поможет, либо разбивай такую строку на две(три,...), либо начинай всю строку на новой странице....
С новой строки проще начать(но... см дальше в предложении), а если хочешь разбивать, то тут нужно придумать алгоритм, который будет вычислять сколько теста поместится в заданном Rect"е и возвратить текст в двух частях(который поместился и который остался) и тоже самое проделать с остатком(т.к. остаток тоже может быть больше всей страницы, :) что будет косяком если переносить на новую страницу :)
Еще вот этот пример посмотри на вский случай:procedure TForm1.Button1Click(Sender: TObject);
var S: String; N: Integer; R: Trect;
begin
for N:= 0 to 50 do S:=S+""Длинная строка - много слов ";
Canvas.Pen.Width:=2;
R:=Canvas.ClipRect; Canvas.FillRect(R); Canvas.Brush.Style:=bsClear;
Canvas.Pen.Color:=clBlue; Canvas.Rectangle(R);
INC(R.Left, 4); INC(R.Top, 4);
N:=DrawText(Canvas.Handle, PChar(S), -1, R, DT_CALCRECT or DT_WORDBREAK); //изменяем/рассчитываем перемен. R без вывода текста
Canvas.Pen.Color:=clRed; Canvas.Rectangle(R);
DrawText(Canvas.Handle, PChar(S), -1, R, DT_WORDBREAK);
R:=Canvas.ClipRect; INC(R.Top, N+30); INC(R.Left, 4); DEC(R.Right, 4); DEC(R.Bottom, 4);
Canvas.Pen.Color:=clGreen; Canvas.Rectangle(R);
DrawText(Canvas.Handle, PChar(S), -1, R, DT_WORDBREAK);
end;
← →
{RASkov} © (2007-05-13 02:35) [26]> DrawText в этом плане в полную тебе не поможет,
Хотя... как раз она может и поможет :)
Вот посмотри:unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function GetLongStr: String;
var N: Integer;
begin
for N:= 0 to 50 do Result:=Result+"Длинная строка - много слов ";
end;
function DivStr(var S: String; R: TRect): String;
begin
InflateRect(R, -4, -4);
Result:=Copy(S, 1, Length(S));
DrawText(Form1.Canvas.Handle, PChar(S), -1, R, DT_WORDBREAK or DT_MODIFYSTRING or DT_EDITCONTROL or DT_END_ELLIPSIS);
S:=StrPas(PChar(S));
if Length(Result)>=(Length(S)+3) then Delete(Result, 1, Length(S)-3) else Result:="";
end;
procedure TForm1.Button1Click(Sender: TObject);
procedure ModifRect(var R: TRect);
var W, H: Integer;
begin
W:=R.Right-R.Left; H:=R.Bottom-R.Top;
if (R.Right+W>ClientWidth-10) then begin
INC(R.Top, H+10);
R.Bottom:=R.Top+H;
R.Left:=10;
R.Right:=130;
end else begin
INC(R.Left, W+10);
R.Right:=R.Left+W;
end;
end;
var PS: String; R: TRect;
begin
PS:=GetLongStr;
R:=Rect(10, 35, 130, 230);
Canvas.Brush.Style:=bsSolid;
Canvas.Brush.Color:=Color;
Canvas.FillRect(Canvas.ClipRect);
repeat
Canvas.Brush.Style:=bsSolid;
Canvas.Brush.Color:=clWhite;
Canvas.Rectangle(R);
Canvas.Brush.Style:=bsClear;
PS:=DivStr(PS, R);
ModifRect(R);
until PS="";
end;
end.
Может и не так красиво, чисто для примера....
← →
Dmitry_177 (2007-05-15 20:41) [27]как то странно, у меня DrawText с флагом DT_WORDBREAK(без всяких других) почему-то немного недорисовывает строки, т.е. половина или целая последняя буква в строках не прорисовывается, если слово впритык влазиет в ширину..
← →
Dmitry_177 (2007-05-15 20:46) [28]может немного не так выразился, последнее слово в строках обрезаются на букву или на пол буквы.. это если последнее слово в строке очень близко расположено к правому краю..
← →
{RASkov} © (2007-05-15 22:12) [29]> [28] Dmitry_177 (15.05.07 20:46)
Покажи свой код....
← →
Dmitry_177 (2007-05-15 22:36) [30]Я только что разобрался.. я перед тем как печатать смотрел в предварительном просмотре(в программе для принтера) что из этого получится, чтобы не тратить бумаги, так вот в этом предварительном просмотре нерисовывается последняя буква, а вот сам принтер печатает все ОК =) Честно говоря не ожидал как-то это-то..
← →
{RASkov} © (2007-05-15 22:50) [31]> [30] Dmitry_177 (15.05.07 22:36)
> Честно говоря не ожидал как-то это-то..
Разрешение монитора и принтера разные, вот отсюда и нестыковка;) экономист :)
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.06.03;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.052 c