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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 14.05.2012, 16:36
Kramarty Kramarty вне форума
Прохожий
 
Регистрация: 28.03.2012
Сообщения: 17
Репутация: 10
Вопрос Как печатать ДВА CopyRect(a)

Господа, такая проблема:
Подаю на печать такой код:

Код:
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;
Bargest: оформляем код тегами!

У меня нет принтера, потому печатает один раз в файл *.xps.
Если тут же подаю на печать второй раз, то он перезагружает компьютер!!!
А печать на компе с принтером перезагружает сразу не печатая вообще!

Причину я понял: Потому что в коде между Printer.BeginDoc; и Printer.EndDoc;
Два раза стоят Printer.Canvas.CopyRect().
Когда один Printer.Canvas.CopyRect() закомментирую, то перезагрузки не происходит!

Как сделать, чтоб печатал оба КОПИРЕКТА???

Последний раз редактировалось Bargest, 14.05.2012 в 16:46.
Ответить с цитированием
  #2  
Старый 14.05.2012, 18:05
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Ну простейшее решение, не работать с канвой принтера напрямую, а выводить в нее уже готовый битмап. Сделай временный битмап размером в канву принтера и уже над ним глумись сколько влезет.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение:
Kramarty (16.05.2012)
  #3  
Старый 15.05.2012, 08:59
Kramarty Kramarty вне форума
Прохожий
 
Регистрация: 28.03.2012
Сообщения: 17
Репутация: 10
По умолчанию

Цитата:
Сообщение от Страдалецъ
Ну простейшее решение, не работать с канвой принтера напрямую, а выводить в нее уже готовый битмап. Сделай временный битмап размером в канву принтера и уже над ним глумись сколько влезет.

Не представляю как это сделать!
1.Как узнать заранее размер канвы принтера?
2.В этот временный Битмап надо впечатывать с клавиатуры или открывать из файла: Имя, Фамилию, номер!!!
Разве это возможно???
Допустим, я растяну во всю форму битмап, натыкаю поверх компонентов Edit,
а как потом их растеризовать?
В общем надо как-то напечатать 4 бейджика, вставляя туда 4 фотки…
Как-то же это делает прога PrintStudio.
Ответить с цитированием
  #4  
Старый 15.05.2012, 17:56
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

С битмапом работают точно так-же как и с принтером в вашем примере:
Вот простенький пример:
Код:
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  
Старый 16.05.2012, 18:58
Kramarty Kramarty вне форума
Прохожий
 
Регистрация: 28.03.2012
Сообщения: 17
Репутация: 10
По умолчанию

Цитата:
Сообщение от Страдалецъ
С битмапом работают точно так-же как и с принтером в вашем примере:
Вот простенький пример:
Код:
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;

Это интересный поворот, Спасибо!
С Printer.Canvas.Draw() я ещё не пробовал.
………….
Теперь ещё одна проблема:
Нужно сочинить прогу чтоб перекодировала Jpeg в BMP гуртом, штук по 100 сразу,
Так как фотки будут приносить в формате Jpeg, их будет штук 500, надо сделать бейджики быстро!
Ответить с цитированием
  #6  
Старый 16.05.2012, 21:19
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Это уже совсем просто. Грузим в невизуальный TImage jpeg и сохраняем как битмап. Не забываем подключить юнит Jpeg. Прогу можно сделать консольной и обрабатывать входные параметры.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Этот пользователь сказал Спасибо angvelem за это полезное сообщение:
Kramarty (18.05.2012)
  #7  
Старый 18.05.2012, 18:42
Kramarty Kramarty вне форума
Прохожий
 
Регистрация: 28.03.2012
Сообщения: 17
Репутация: 10
По умолчанию

Цитата:
Сообщение от angvelem
Это уже совсем просто. Грузим в невизуальный TImage jpeg и сохраняем как битмап. Не забываем подключить юнит Jpeg. Прогу можно сделать консольной и обрабатывать входные параметры.

Невизуальный TImage – это что-нибудь такое: Jpg:= TImage.Create; ???
А как обрабатывать входные параметры?

Что-то у меня не получается с Принтер.КопиРект, - комп всё равно перезагружается.
Наверное скривилась Delphi – только с третьего раза установился DSPack, среда запортилась надо переставлять всю систему.
Ответить с цитированием
  #8  
Старый 18.05.2012, 22:15
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Kramarty
Невизуальный TImage – это что-нибудь такое: Jpg:= TImage.Create; ???
А как обрабатывать входные параметры?
1. Да.
2. ParamStr, ParamCount.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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