![]() |
|
#1
|
|||
|
|||
![]() Всем привет) такая проблема: я на панеле разместил едиты и лэйблы, мне нужно пустить на печать панель и все её содержимоё. Возился с принтдиалог, не смог распечатать.
Может кто код подскажет?)) Там мне кажется 2 строчки надо)) |
#2
|
||||
|
||||
![]() Класс TPrinter.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#3
|
|||
|
|||
![]() Что класс TPrinter?))
|
#4
|
|||
|
|||
![]() Цитата:
Код:
Panel1.PaintTo(Printer.Canvas) |
#5
|
|||
|
|||
![]() Канваса не в одном свойстве нету, его тоже на форму кидать надо? Просто мало в этой теме шарю, а прогу сделать надо((
|
#6
|
||||
|
||||
![]() Попробуйте этот код (у себя не испытывал - пока не имею возможности):
Код:
procedure TForm1.ButtonClick(Sender: TObject); Var x1, y1, x2, y2: Integer; PointsX, PointsY: Double; Bitmap: TBitmap; begin If Not(PrintDialog.Execute) Then Exit; BitMap:=TBitmap.Create; Bitmap.Width:=Panel.Width; Bitmap.Height:=Panel.Height; Panel.PaintTo(Bitmap.Canvas, 0, 0); Printer.BeginDoc; Printer.Canvas.Refresh; // Получаю данные о разрешении принтера (* число 70 - коэффициент масштабирования (для разных принтеров может быть разный) *) PointsX:=GetDeviceCaps(Printer.Canvas.Handle,LOGPIXELSX)/70; PointsY:=GetDeviceCaps(Printer.Canvas.Handle,LOGPIXELSY)/70; // Рассчитываю размеры изображения x1:=Round((Printer.PageWidth - Bitmap.Width*PointsX)/2); y1:=Round((Printer.PageHeight - Bitmap.Height*PointsY)/2); x2:=Round(x1 + Bitmap.Width*PointsX); y2:=Round(y1 + Bitmap.Height*PointsY); // Вывожу изображение на печать Printer.Canvas.CopyRect(Rect(x1, y1, x2, y2), Bitmap.Canvas, Rect(0, 0, Bitmap.Width, Bitmap.Height)); Printer.EndDoc; Bitmap.Free; end; Надеюсь, что модуль Printers Вы подключить не забыли. И ещё, не забудьте поменять названия компонентов PrintDialog и Panel. Чем больше знаешь, тем сильнее осознаёшь, что знаешь гораздо меньше, чем не знаешь!.. |
#7
|
|||
|
|||
![]() Код:
procedure TForm1.Button1Click(Sender: TObject); var tmpform:TForm; l,t,h,w:integer; begin if print.Execute then //Вибираем принтер компонент TPrintDialog с вкладки Dialogs begin tmpform:=Tform.Create(nil); //Создаем новую форму //Копируем всю джигурду панели с которой будет таскать изображение l:=panel1.Left; //Записали в l положение по Left t:=panel1.Top; //Записали в t положение по Top h:=panel1.Height; //Записали в h положение по Height w:=panel1.Width; //Записали в w положение по Width //Колдуем над формой tmpform.Height:=h; //Делаем ее высоту такую же как и у панели tmpform.Width:=w; //Делаем ее ширину такую же как и у панели //В верхний левый угол суем нашу панель(суем временно) panel1.Left:=0; panel1.Top:=0; tmpform.visible:=true; //Делаем нашу новоиспеченную форму видимой form1.Visible:=false; //Скрываем нашу основную форму(этот трюк можно и убрать) //И теперь Самое Гениальное! windows.SetParent(panel1.Handle,tmpform.Handle); //Тупо перерисовываем нашу панель в новую форму //А как известно для формы есть свойсво Print да и ваще с формаой проще печататься showmessage('Панель в печать!'); ///Вместо етого суйте че хотите..настройки отступы и т д..ну и спосна саму команду на печать windows.SetParent(panel1.Handle,Handle);///Как толлько печать выведена суем форму сами в себя)))Ну по коду так выходит) tmpform.visible:=false; //Делаем новую форму НЕвидимой tmpform.Destroy;//Убиваем нашу новую форму form1.Visible:=true; //Делаем нашу форму видимой //Восстанавливаем панель де она ии росла до Печати panel1.Top:=t; panel1.Left:=l; end; end; ///Саму процедуру печати я не расписываю, тут просто идея печати панели, что ты и просил. Пиши если уж не сообразишь как вывести на печать. ![]() |
#8
|
||||
|
||||
![]() Цитата:
Цитата:
Цитата:
Цитата:
После моих исправлений получился следующий код: Код:
procedure TForm1.Button1Click(Sender: TObject); var tmpform: TForm; SavedRect, NewRect: TRect; begin if Print.Execute then begin SavedRect := Panel1.BoundsRect; NewRect := SavedRect; OffsetRect(NewRect, -NewRect.Left, -NewRect.Top); tmpform := TForm.Create(nil); try tmpform.BorderStyle := bsNone; tmpform.BoundsRect := NewRect; Panel1.Parent := tmpform; Panel1.BoundsRect := NewRect; tmpform.Visible := True; tmpform.Print; Panel1.Parent := Self; Panel1.BoundsRect := SavedRect; finally tmpform.Free; end; end; end; p.s. Кстати при печати методом TForm.Print у меня почему-то не распечатываются заголовки у TListView... |
#9
|
|||
|
|||
![]() Тут главное идея представления панели формой, про перерисовку согласен, хотел описать как проще.
Честно признаться код не тестировал пока не прочел комментарий, код на вид был рабочий, я ему коменты тока добавил. Про родителя бы и не подумал. Признаю косяк=) |
#10
|
|||
|
|||
![]() Код:
procedure TForm1.Button1Click(Sender: TObject); var tmpform: TForm; SavedRect, NewRect: TRect; begin if printeres.Execute then begin SavedRect := Panel1.BoundsRect; NewRect := SavedRect; OffsetRect(NewRect, -NewRect.Left, -NewRect.Top); tmpform := TForm.Create(nil); try tmpform.BorderStyle := bsNone; tmpform.BoundsRect := NewRect; Panel1.Parent := tmpform; Panel1.BoundsRect := NewRect; tmpform.Visible := True; tmpform.Print; Panel1.Parent := Self; Panel1.BoundsRect := SavedRect; finally SetCurrentDir(ExtractFilePath(Application.ExeName));///На всякий случай tmpform.Free; end; end; end; |