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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 27.05.2012, 22:50
Huligan76 Huligan76 вне форума
Прохожий
 
Регистрация: 27.05.2012
Сообщения: 3
Репутация: 10
По умолчанию Печать Panel

Всем привет) такая проблема: я на панеле разместил едиты и лэйблы, мне нужно пустить на печать панель и все её содержимоё. Возился с принтдиалог, не смог распечатать.
Может кто код подскажет?)) Там мне кажется 2 строчки надо))
Ответить с цитированием
  #2  
Старый 27.05.2012, 22:58
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Класс TPrinter.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #3  
Старый 27.05.2012, 23:00
Huligan76 Huligan76 вне форума
Прохожий
 
Регистрация: 27.05.2012
Сообщения: 3
Репутация: 10
По умолчанию

Что класс TPrinter?))
Ответить с цитированием
  #4  
Старый 27.05.2012, 23:52
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,096
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от Huligan76
Что класс TPrinter?))

Код:
Panel1.PaintTo(Printer.Canvas)
Проверь, может надо Panel1.Canvas.PaintTo(). Ну и параметры могут быть дополнительные. Ну и обкладку, типа Printer.BeginDoc и Printer.EndDoc, надо.
Ответить с цитированием
  #5  
Старый 28.05.2012, 18:26
Huligan76 Huligan76 вне форума
Прохожий
 
Регистрация: 27.05.2012
Сообщения: 3
Репутация: 10
По умолчанию

Канваса не в одном свойстве нету, его тоже на форму кидать надо? Просто мало в этой теме шарю, а прогу сделать надо((
Ответить с цитированием
  #6  
Старый 30.05.2012, 17:02
Аватар для DelphiM0ZG
DelphiM0ZG DelphiM0ZG вне форума
Новичок
 
Регистрация: 22.10.2011
Сообщения: 62
Репутация: 666
Сообщение

Попробуйте этот код (у себя не испытывал - пока не имею возможности):

Код:
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  
Старый 19.10.2012, 12:16
Heneken Heneken вне форума
Новичок
 
Регистрация: 11.09.2011
Сообщения: 73
Версия Delphi: Delphi XE6
Репутация: 10
По умолчанию Сопсна можно и так

Код:
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  
Старый 19.10.2012, 13:29
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Heneken
Код:
tmpform:=Tform.Create(nil); //Создаем новую форму
//Копируем всю джигурду панели с которой будет таскать изображение
    l:=panel1.Left; //Записали в l положение по Left
    t:=panel1.Top;  //Записали в t положение по Top
    h:=panel1.Height; //Записали в h положение по Height
    w:=panel1.Width; //Записали в w положение по Width
Здесь вместо этого проще сохранить panel1.BoundsRect;
Цитата:
Сообщение от Heneken
Код:
    //И теперь Самое Гениальное!
    windows.SetParent(panel1.Handle,tmpform.Handle); //Тупо перерисовываем нашу панель в новую форму
Это никакая не тупая перерисовка панели - это перемещение панели из одной формы в другую, да ещё и в обход VCL.
Цитата:
Сообщение от Heneken
Код:
    //А как известно для формы есть свойсво Print да и ваще с формаой проще печататься
    showmessage('Панель в печать!'); ///Вместо етого суйте че хотите..настройки отступы и т д..ну и спосна саму команду на печать
Если здесь подразумевается вызов tmpform.Print, то это не сработает - можешь проверить - печатает пустую форму.
Цитата:
Сообщение от Heneken
Код:
    tmpform.visible:=false; //Делаем новую форму НЕвидимой
    tmpform.Destroy;//Убиваем нашу новую форму
Нет смысла делать форму невидимой перед тем как её разрушить. Да и разрушать рекомендуется с помощью Free, а не Destroy.

После моих исправлений получился следующий код:
Код:
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  
Старый 19.10.2012, 14:21
Heneken Heneken вне форума
Новичок
 
Регистрация: 11.09.2011
Сообщения: 73
Версия Delphi: Delphi XE6
Репутация: 10
По умолчанию =)

Тут главное идея представления панели формой, про перерисовку согласен, хотел описать как проще.
Честно признаться код не тестировал пока не прочел комментарий, код на вид был рабочий, я ему коменты тока добавил. Про родителя бы и не подумал.
Признаю косяк=)
Ответить с цитированием
  #10  
Старый 19.10.2012, 15:47
Heneken Heneken вне форума
Новичок
 
Регистрация: 11.09.2011
Сообщения: 73
Версия Delphi: Delphi XE6
Репутация: 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;
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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