![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Господа, такая проблема:
Подаю на печать такой код: Код:
procedure TForm0.Print1Click(Sender: TObject); var K,A1,B1,A2,B2,A3,B3,A4,B4, X01,Y01,X02,Y02,X03,Y03,X04,Y04, X1,X2,X3,X4,Y1,Y2,Y3,Y4, X1T,Y1T,X2T,Y2T,X3T,Y3T,X4T,Y4T, X1L,Y1L,X2L,Y2L,X3L,Y3L,X4L,Y4L, X1T1,Y1T1,X2T1,Y2T1,X3T1,Y3T1,X4T1,Y4T1, X1L1,Y1L1,X2L1,Y2L1,X3L1,Y3L1,X4L1,Y4L1:Integer; begin Printer.BeginDoc; Printer.Canvas.Refresh; PointsX:=GetDeviceCaps(Printer.Canvas.Handle,LOGPIXELSX)/120; PointsY:=GetDeviceCaps(Printer.Canvas.Handle,LOGPIXELSY)/120; //Первый Badge>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> X1:=round(Form1.ClientWidth*PointsX); Y1:=round(500*PointsY); Printer.Canvas.CopyRect(Rect(100,100,X1+100,Y1+100),Form1.Canvas, Rect(0,0,Form1.ClientWidth,500)); X1T:=round(Form1.Edit1.Left*PointsX+100); Y1T:=round(Form1.Edit1.Top*PointsY+100); X2T:=round(Form1.Edit2.Left*PointsX+100); Y2T:=round(Form1.Edit2.Top*PointsY+100); X3T:=round(Form1.Edit3.Left*PointsX+100); Y3T:=round(Form1.Edit3.Top*PointsY+100); X4T:=round(Form1.Edit4.Left*PointsX+100); Y4T:=round(Form1.Edit4.Top*PointsY+100); K:= round(Form1.Edit1.Height*PointsY/10); Printer.Canvas.Font.Size:= 14; Printer.Canvas.Font.Name:= 'Arial'; Printer.Canvas.TextOut(X1T+K, Y1T+K, Form1.Edit5.Text); Printer.Canvas.TextOut(X2T+K, Y2T+K, Form1.Edit6.Text); Printer.Canvas.TextOut(X3T+K, Y3T+K, Form1.Edit7.Text); Printer.Canvas.TextOut(X4T+K, Y4T+K, Form1.Edit8.Text); X01:=round(Form1.Image1.Width*PointsX); Y01:=round(Form1.Image1.Height*PointsY); A1:=round(Form1.Shape1.Width*PointsX/3); B1:=round(Form1.Shape1.Height*PointsY/10); Printer.Canvas.CopyRect(Rect(A1+100,B1+100,A1+X01+100,B1+Y01+100), Form1.Image1.Picture.Bitmap.Canvas, Rect(0,0,Form1.Image1.Picture.Bitmap.Width,Form1.Image1.Picture.Bitmap.Height)); Printer.EndDoc; end; У меня нет принтера, потому печатает один раз в файл *.xps. Если тут же подаю на печать второй раз, то он перезагружает компьютер!!! А печать на компе с принтером перезагружает сразу не печатая вообще! Причину я понял: Потому что в коде между Printer.BeginDoc; и Printer.EndDoc; Два раза стоят Printer.Canvas.CopyRect(). Когда один Printer.Canvas.CopyRect() закомментирую, то перезагрузки не происходит! Как сделать, чтоб печатал оба КОПИРЕКТА??? Последний раз редактировалось Bargest, 14.05.2012 в 16:46. |
#2
|
||||
|
||||
![]() Ну простейшее решение, не работать с канвой принтера напрямую, а выводить в нее уже готовый битмап. Сделай временный битмап размером в канву принтера и уже над ним глумись сколько влезет.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение: | ||
Kramarty (16.05.2012)
|
#3
|
|||
|
|||
![]() Цитата:
Не представляю как это сделать! 1.Как узнать заранее размер канвы принтера? 2.В этот временный Битмап надо впечатывать с клавиатуры или открывать из файла: Имя, Фамилию, номер!!! Разве это возможно??? Допустим, я растяну во всю форму битмап, натыкаю поверх компонентов Edit, а как потом их растеризовать? В общем надо как-то напечатать 4 бейджика, вставляя туда 4 фотки… Как-то же это делает прога PrintStudio. |
#4
|
||||
|
||||
![]() С битмапом работают точно так-же как и с принтером в вашем примере:
Вот простенький пример: Код:
Var Bmp: TBitmap; begin Bmp := TBitmap.Create; Bmp.Width := Printer.PageWidth; Bmp.Height := Printer.PageHeight; Bmp.Canvas.Pen.Color := clBlack; Bmp.Canvas.Pen.Width := 4; Bmp.Canvas.Ellipse(50,50,200,200); Bmp.Canvas.Font.Name := 'Times New Roman'; Bmp.Canvas.Font.Size := 24; Bmp.Canvas.TextOut(500,500,'Привет!'); Printer.BeginDoc; Printer.Canvas.Draw(0, 0, Bmp); Printer.EndDoc; Bmp.Free; end; Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение: | ||
Kramarty (16.05.2012)
|
#5
|
|||
|
|||
![]() Цитата:
Это интересный поворот, Спасибо! С Printer.Canvas.Draw() я ещё не пробовал. …………. Теперь ещё одна проблема: Нужно сочинить прогу чтоб перекодировала Jpeg в BMP гуртом, штук по 100 сразу, Так как фотки будут приносить в формате Jpeg, их будет штук 500, надо сделать бейджики быстро! ![]() |
#6
|
||||
|
||||
![]() Это уже совсем просто. Грузим в невизуальный TImage jpeg и сохраняем как битмап. Не забываем подключить юнит Jpeg. Прогу можно сделать консольной и обрабатывать входные параметры.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
Kramarty (18.05.2012)
|
#7
|
|||
|
|||
![]() Цитата:
Невизуальный TImage – это что-нибудь такое: Jpg:= TImage.Create; ??? А как обрабатывать входные параметры? Что-то у меня не получается с Принтер.КопиРект, - комп всё равно перезагружается. Наверное скривилась Delphi – только с третьего раза установился DSPack, среда запортилась надо переставлять всю систему. |
#8
|
||||
|
||||
![]() Цитата:
2. ParamStr, ParamCount. Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |