3 / 3 / 0
Регистрация: 17.12.2011
Сообщений: 493
1

Печать в формате А4, с предварительным просмотром

04.07.2019, 12:55. Показов 2826. Ответов 16
Метки нет (Все метки)

Здравствуйте!
Подскажите пожалуйста, почему картинка не полностью видна на предварительным просмотре?
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
procedure TForm2.Browse;
var
  rect: TRect;
begin
  rect.Top:= 10;
  rect.Left:= 10;
  rect.Right:= 10 + Trunc(Form1.Image1.Picture.Graphic.Width*4) div 10;
  rect.Bottom:= 10 + Trunc(Form1.Image1.Picture.Graphic.Height*4) div 10;
  Image1.Canvas.Pen.Mode:= pmWhite;
  Image1.Canvas.Rectangle(0, 0, Image1.Width, Image1.Height);
  Image1.Canvas.Draw(rect.Left, rect.Top, Form1.Image1.Picture.Graphic);
end;
 
procedure TForm2.btnCloseClick(Sender: TObject);
begin
  Close;
end;
 
procedure TForm2.btnPrintClick(Sender: TObject);
var
  rect: TRect;
begin
  if PrintDialog1.Execute then
  begin
    Close;
    rect.Top:= 10;
    rect.Left:= 10;
    rect.Right:= 10 + Trunc(Form1.Image1.Picture.Graphic.Width);
    rect.Bottom:= 10 + Trunc(Form1.Image1.Picture.Graphic.Height);
    Printer.BeginDoc;
    Printer.Canvas.Draw(rect.Left, rect.Top, Form1.Image1.Picture.Graphic);
    Printer.EndDoc;
  end;
end;
 
procedure TForm2.FormActivate(Sender: TObject);
var
  x, y: Word;
begin
  Image1.Width:= Printer.PageWidth div 10;
  Image1.Height:= Printer.PageHeight div 10;
  y:= round((ScrollBox1.Height - Image1.Height)/2);
  x:= round((ScrollBox1.Width - Image1.Width)/2);
  Image1.Left:= x;
  Image1.Top:= y;
  Browse;
end;
Миниатюры
Печать в формате А4, с предварительным просмотром   Печать в формате А4, с предварительным просмотром  
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.07.2019, 12:55
Ответы с готовыми решениями:

Печать с предварительным просмотром
Добрый вечер. Возник такой вопрос. На форме есть DBGrid и еще куча всего. Нужно распечатать только...

Проблема с предварительным просмотром печати
Принтер старый, но использовался редко - многофункциональный принтер HP Deskjet F380, состояние...

Хочу написать свой OpenFileDialog с предварительным просмотром...
Непонятно, как реализовать окно списка файлов, чтобы работала кнопка: "Вид", соответственно в виде...

поиск с выводом полученных результатов на другом листе и предварительным просмотром PDF файла
Всех приветствую! Нуждаюсь в помощи гуру, ибо у самого пока ничего не выходит. Исходное: Имеется...

16
3075 / 1816 / 594
Регистрация: 29.05.2013
Сообщений: 7,955
04.07.2019, 13:54 2
А вы возьмите лист бумаги A4 и приложите к монитору. Если лист не вписался в монитор, то все нормально, а вот если вписался, значит вы неправильно что-то делаете.
0
5282 / 4128 / 1349
Регистрация: 14.04.2014
Сообщений: 18,820
Записей в блоге: 18
04.07.2019, 14:47 3
а что Picture.Graphic содержит не исходный а растянутый битмап ?
0
3 / 3 / 0
Регистрация: 17.12.2011
Сообщений: 493
04.07.2019, 15:30  [ТС] 4
Цитата Сообщение от Пытливый Посмотреть сообщение
..., а вот если вписался, значит вы неправильно что-то делаете.
Дак, я знаю что, что-то неправильно делаю, но не могу понять что именно я ни так делаю.......
Картинка 2481х3508, я загружаю ее в image.picture, image делаю 1000х1414, чтоб картинку видеть. Или нужно, перед выводом на принтер, какой- то размер image ставить?
0
5282 / 4128 / 1349
Регистрация: 14.04.2014
Сообщений: 18,820
Записей в блоге: 18
04.07.2019, 17:04 5
пусть у вас картинка 100*100
если вывести ее на экран 1000*1000
она от этого и сама больше не станет и на принтер напечатается тоже 100*100 если использовать печать 1:1 как у вас
думаю, вам нужно использовать Canvas.CopyRect
0
3 / 3 / 0
Регистрация: 17.12.2011
Сообщений: 493
04.07.2019, 19:18  [ТС] 6
Вот, посмотрите, пожалуйста, проект: https://yadi.sk/d/I2Qs2SaFjwvHVQ
Как там настроить пред просмотр?
0
5282 / 4128 / 1349
Регистрация: 14.04.2014
Сообщений: 18,820
Записей в блоге: 18
04.07.2019, 20:21 7
https://www.cyberforum.ru/delp... ment3.html
4.11
0
3075 / 1816 / 594
Регистрация: 29.05.2013
Сообщений: 7,955
04.07.2019, 20:27 8
Надо было еще и дистрибутив Delphi с Windows прикрепить. Проект это только dpr,pas,dfm файлы, а вы зафигачили в архив 56 метров мусора.
0
3 / 3 / 0
Регистрация: 17.12.2011
Сообщений: 493
04.07.2019, 20:32  [ТС] 9
Цитата Сообщение от krapotkin Посмотреть сообщение
https://www.cyberforum.ru/delphi-beginners/announcement3.html
4.11
Да, не загружается сюда архив, ошибку выдаёт:
Не удается получить доступ к сайту Веб-страница по адресу https://www.cyberforum.ru/newa... eattach&p=, возможно, временно недоступна или постоянно перемещена по новому адресу.
ERR_CONNECTION_ABORTED


Добавлено через 2 минуты
Цитата Сообщение от Пытливый Посмотреть сообщение
Надо было еще и дистрибутив Delphi с Windows прикрепить. Проект это только dpr,pas,dfm файлы, а вы зафигачили в архив 56 метров мусора.
Ну, удалось посмотреть?
0
3075 / 1816 / 594
Регистрация: 29.05.2013
Сообщений: 7,955
04.07.2019, 20:43 10
Принтеры они же как и мониторы имеют разные разрешения и размер одной страницы A4 в пикселях тоже будет разный. Это необходимо учитывать для масштабирования картинки, а вы напрямую рисуете. Надо делать примерно так:
Delphi
1
2
3
4
5
6
    D := Min(Printer.PageWidth/Bmp.Width, Printer.PageHeight/Bmp.Height);
    W := Round(Bmp.Width * D);
    H := Round(Bmp.Height * D);
    Printer.BeginDoc;
    Printer.Canvas.StretchDraw(Rect(0, 0, W, H), Bmp);
    Printer.EndDoc;
0
3 / 3 / 0
Регистрация: 17.12.2011
Сообщений: 493
04.07.2019, 21:55  [ТС] 11
Цитата Сообщение от Пытливый Посмотреть сообщение
Принтеры они же как и мониторы имеют разные разрешения и размер одной страницы A4 в пикселях тоже будет разный. Это необходимо учитывать для масштабирования картинки, а вы напрямую рисуете. Надо делать примерно так:

Delphi
1
2
3
4
5
6
* * D := Min(Printer.PageWidth/Bmp.Width, Printer.PageHeight/Bmp.Height);
* * W := Round(Bmp.Width * D);
* * H := Round(Bmp.Height * D);
* * Printer.BeginDoc;
* * Printer.Canvas.StretchDraw(Rect(0, 0, W, H), Bmp);
* * Printer.EndDoc;
Разрешение 600х600. Проверял так:
Delphi
1
2
3
PixelsX:=GetDeviceCaps(printer.Handle,LogPixelsX);
PixelsY:=GetDeviceCaps(printer.Handle,LogPixelsY);
Label1.Caption:=IntToStr(PixelsX)+'x'+IntToStr(PixelsY);
Как применить полученные значения?
0
3075 / 1816 / 594
Регистрация: 29.05.2013
Сообщений: 7,955
04.07.2019, 22:25 12
Так это вы точек на дюйм получили, а не размерность страницы. Размер страницы я в примере показал как получить.
0
5282 / 4128 / 1349
Регистрация: 14.04.2014
Сообщений: 18,820
Записей в блоге: 18
04.07.2019, 22:46 13
предпросмотр нужно "настраивать" ручками, а не как бог положит

и предпросмотр НИЧЕМ не отличается от печати
вы так же должны вывести что-то на какой-то Canvas
будь это Bitmap.Canvas или Printer.Canvas
для этого вам нужно рассчитать масштаб, используя данные о разрешении принтера и разрешении экрана, и возможно еще что-нибудь.
а все ваши исходные координаты при выводе на Canvas пересчитывать в соответствии с нужным масштабом

дальше вообще задача концептуальная пойдет
какие единицы будут главными - сантиметры или пиксели?
потому что при печати обычно важны именно сантиметры, а на экране - пиксели
если вы собрались выводить картинку, ее всяко нужно отмасштабировать
представим что бумага 210*297мм а картинка 200*100 px
есть аж 4 варианта только для того, чтобы МАКСИМАЛЬНО вошла ваша картинка на лист
2 портрет + 2 альбом
при этом либо по двум сторонам останутся белые полосы, либо наоборот, пропадет часть картинки
печать вообще штука капец какая неприятная
поэтому все у кого не безвыходная ситуация, пользуются генераторами отчетов, где все проблемы за вас уже порешали
0
3 / 3 / 0
Регистрация: 17.12.2011
Сообщений: 493
05.07.2019, 06:49  [ТС] 14
Цитата Сообщение от krapotkin Посмотреть сообщение
...поэтому все у кого не безвыходная ситуация, пользуются генераторами отчетов, где все проблемы за вас уже порешали
А как добавлять картинку в QuickAbstractRep? Вы про такой отчет говорите?
0
5282 / 4128 / 1349
Регистрация: 14.04.2014
Сообщений: 18,820
Записей в блоге: 18
05.07.2019, 08:44 15
Я говорю про FastReport
это современный де-факто стандарт
0
3 / 3 / 0
Регистрация: 17.12.2011
Сообщений: 493
05.07.2019, 19:42  [ТС] 16
Цитата Сообщение от Пытливый Посмотреть сообщение
Принтеры они же как и мониторы имеют разные разрешения и размер одной страницы A4 в пикселях тоже будет разный. Это необходимо учитывать для масштабирования картинки, а вы напрямую рисуете. Надо делать примерно так:

* *
Delphi
1
2
3
4
5
6
D := Min(Printer.PageWidth/Bmp.Width, Printer.PageHeight/Bmp.Height);
* * W := Round(Bmp.Width * D);
* * H := Round(Bmp.Height * D);
* * Printer.BeginDoc;
* * Printer.Canvas.StretchDraw(Rect(0, 0, W, H), Bmp);
* * Printer.EndDoc;
Подскажите пожалуйста, что такое Bmp? Это Bitmap изображения? Т.е. переменная с картинкой?

Добавлено через 34 минуты
Почему то ругается на эту строку:
Delphi
1
Printer.Canvas.StretchDraw(Rect(0, 0, W, H), Bmp);
dcc32 Error] Unit2.pas(70): E2066 Missing operator or semicolon
0
Модератор
2913 / 1606 / 584
Регистрация: 15.11.2015
Сообщений: 6,486
06.07.2019, 10:46 17
Цитата Сообщение от DDim1000 Посмотреть сообщение
dcc32 Error] Unit2.pas(70): E2066 Missing operator or semicolon
Отсутствует оператор или разделитель. Странно, тут всё хватает вроде, на D7 компилируется.

Цитата Сообщение от DDim1000 Посмотреть сообщение
что такое Bmp? Это Bitmap изображения? Т.е. переменная с картинкой?
Да.
Delphi
1
2
3
4
5
6
var
  bmp: TBitmap;
  W, H: integer;
begin
  Printer.Canvas.StretchDraw(Rect(0, 0, W, H), Bmp);
end;
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.07.2019, 10:46
Помогаю со студенческими работами здесь

Печать в формате А5 с оборотом
Так и не понимаю как печатать в формате А5 с оборотом (т.е использовать обе стороны листа бумаги)....

Печать текста в формате RTF
День добрый! Столкнулся с задачей, которая на первый взгляд показалась простой, а вот справиться с...

Печать отчетов в определенном формате
Добрый Всем день. В базе много отчетов А4 и А6 форматов.При смене принтера все переходит в А4....

Brother DCP-1512R печать на формате а5
Здравствуйте, имею принтер brother DCP-1512R. Есть необходимость печатать на листах формата а5...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru