![]() |
|
|
#1
|
|||
|
|||
|
Всем привет) такая проблема: я на панеле разместил едиты и лэйблы, мне нужно пустить на печать панель и все её содержимоё. Возился с принтдиалог, не смог распечатать.
Может кто код подскажет?)) Там мне кажется 2 строчки надо)) |
|
#2
|
||||
|
||||
|
Класс TPrinter.
|
|
#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; |