С Новым годом! Форум программистов, компьютерный форум, киберфорум
Delphi
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/21: Рейтинг темы: голосов - 21, средняя оценка - 4.90
-46 / 3 / 0
Регистрация: 17.12.2011
Сообщений: 609

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

04.07.2019, 12:55. Показов 4212. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.07.2019, 12:55
Ответы с готовыми решениями:

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

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

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

16
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
04.07.2019, 13:54
А вы возьмите лист бумаги A4 и приложите к монитору. Если лист не вписался в монитор, то все нормально, а вот если вписался, значит вы неправильно что-то делаете.
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,656
Записей в блоге: 21
04.07.2019, 14:47
а что Picture.Graphic содержит не исходный а растянутый битмап ?
0
-46 / 3 / 0
Регистрация: 17.12.2011
Сообщений: 609
04.07.2019, 15:30  [ТС]
Цитата Сообщение от Пытливый Посмотреть сообщение
..., а вот если вписался, значит вы неправильно что-то делаете.
Дак, я знаю что, что-то неправильно делаю, но не могу понять что именно я ни так делаю.......
Картинка 2481х3508, я загружаю ее в image.picture, image делаю 1000х1414, чтоб картинку видеть. Или нужно, перед выводом на принтер, какой- то размер image ставить?
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,656
Записей в блоге: 21
04.07.2019, 17:04
пусть у вас картинка 100*100
если вывести ее на экран 1000*1000
она от этого и сама больше не станет и на принтер напечатается тоже 100*100 если использовать печать 1:1 как у вас
думаю, вам нужно использовать Canvas.CopyRect
0
-46 / 3 / 0
Регистрация: 17.12.2011
Сообщений: 609
04.07.2019, 19:18  [ТС]
Вот, посмотрите, пожалуйста, проект: https://yadi.sk/d/I2Qs2SaFjwvHVQ
Как там настроить пред просмотр?
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,656
Записей в блоге: 21
04.07.2019, 20:21
https://www.cyberforum.ru/delp... ment3.html
4.11
0
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
04.07.2019, 20:27
Надо было еще и дистрибутив Delphi с Windows прикрепить. Проект это только dpr,pas,dfm файлы, а вы зафигачили в архив 56 метров мусора.
0
-46 / 3 / 0
Регистрация: 17.12.2011
Сообщений: 609
04.07.2019, 20:32  [ТС]
Цитата Сообщение от 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
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
04.07.2019, 20:43
Принтеры они же как и мониторы имеют разные разрешения и размер одной страницы 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
-46 / 3 / 0
Регистрация: 17.12.2011
Сообщений: 609
04.07.2019, 21:55  [ТС]
Цитата Сообщение от Пытливый Посмотреть сообщение
Принтеры они же как и мониторы имеют разные разрешения и размер одной страницы 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
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
04.07.2019, 22:25
Так это вы точек на дюйм получили, а не размерность страницы. Размер страницы я в примере показал как получить.
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,656
Записей в блоге: 21
04.07.2019, 22:46
предпросмотр нужно "настраивать" ручками, а не как бог положит

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

дальше вообще задача концептуальная пойдет
какие единицы будут главными - сантиметры или пиксели?
потому что при печати обычно важны именно сантиметры, а на экране - пиксели
если вы собрались выводить картинку, ее всяко нужно отмасштабировать
представим что бумага 210*297мм а картинка 200*100 px
есть аж 4 варианта только для того, чтобы МАКСИМАЛЬНО вошла ваша картинка на лист
2 портрет + 2 альбом
при этом либо по двум сторонам останутся белые полосы, либо наоборот, пропадет часть картинки
печать вообще штука капец какая неприятная
поэтому все у кого не безвыходная ситуация, пользуются генераторами отчетов, где все проблемы за вас уже порешали
0
-46 / 3 / 0
Регистрация: 17.12.2011
Сообщений: 609
05.07.2019, 06:49  [ТС]
Цитата Сообщение от krapotkin Посмотреть сообщение
...поэтому все у кого не безвыходная ситуация, пользуются генераторами отчетов, где все проблемы за вас уже порешали
А как добавлять картинку в QuickAbstractRep? Вы про такой отчет говорите?
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,656
Записей в блоге: 21
05.07.2019, 08:44
Я говорю про FastReport
это современный де-факто стандарт
0
-46 / 3 / 0
Регистрация: 17.12.2011
Сообщений: 609
05.07.2019, 19:42  [ТС]
Цитата Сообщение от Пытливый Посмотреть сообщение
Принтеры они же как и мониторы имеют разные разрешения и размер одной страницы 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
Модератор
4115 / 2347 / 807
Регистрация: 15.11.2015
Сообщений: 9,346
06.07.2019, 10:46
Цитата Сообщение от 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.07.2019, 10:46
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru