Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
1 / 1 / 1
Регистрация: 21.08.2014
Сообщений: 6

Печать рисунка на две страницы (разрезая пополам)

02.03.2016, 12:37. Показов 615. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ошибка возникает при длительной работе клиента (более недели не выключался компьютер), после перезагрузки ОС ошибка не проявляется, за исключением того, что на некоторых принтерах получаем пустые листы (нет рисунка). В режиме отладки, если ставить BreakPoint на строчку с PixelsPerInch, то менеджер не может прочитать значение по адресу, хотя сам указатель не испорчен, если BreakPoint поставить строчкой выше, то весь код отрабатывает без ошибок, и распечатывает пустые листы. Программа в любой момент времени занимает не более 50 мб.
Опции компилятора:
Delphi
1
2
3
4
{$A8,B-,C+,D+,E-,F-,G+,H+,I+,J-,K-,L+,M-,N+,O-,P+,Q+,R+,S-,T-,U-,V+,W-,X+,Y+,Z1}
{$MINSTACKSIZE $00004000}
{$MAXSTACKSIZE $01000000}
{$IMAGEBASE $00400000}
код
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
var
  PageNo: Integer;
  ImageFull, ImageR, ImageL:TImage;
 
  Dev, Dri, Por : array [0..256] of char;
  HPrinter: THandle;
  pr2 :pchar;
begin      
 
  if PrintDialog1.Execute then
  begin
    Printer.GetPrinter(Dev,Dri,Por,HPrinter);
    pr2:=PChar(Trim(Printer.Printers.Strings[Printer.PrinterIndex]));
    printer.SetPrinter(pr2,'WINSPOOL',' ',Hprinter);
  end
  else
    Exit;
 
  screen.cursor := crHourglass;
  Printer.Title := 'Печать рисунка';
 
  if not Landscape then
    Printer.Orientation:=poPortrait
  else
    Printer.Orientation:=poLandscape;
 
  ImageFull:=TImage.Create(nil);
  Printer.BeginDoc;
  try
    ImageFull.Width:=Printer.PageWidth;
    ImageFull.Height:=Printer.PageHeight div 2;
   // ImageFull.Canvas.Font.PixelsPerInch:=Printer.Canvas.Font.PixelsPerInch;
   // ImageFull.Width:=GetDeviceCaps(Printer.Handle,PHYSICALWIDTH);
   // ImageFull.Height:=GetDeviceCaps(Printer.Handle,PHYSICALHEIGHT) div 2;
 
   ImageFull.Canvas.Font.PixelsPerInch:=GetDeviceCaps(Printer.Handle,LOGPIXELSX); // Тут ошибка !!!
// raised exception class EOleSysError with message 'Недостаточно памяти для завершения операции'
    PageNo := 1;
 
    rvh.Init(Printer.Canvas, ImageFull.Width); 
 
    Printer.NewPage;
    while rvh.FormatNextPage(ImageFull.Width) do
    begin
      if PageNo>1 then 
        Printer.NewPage;
 
      rvh.DrawPage(PageNo, ImageFull.Canvas, False, ImageFull.Height);
      ImageL:=TImage.Create(nil);
      try
        ImageL.Width:=ImageFull.Width div 2;
        ImageL.Height:=ImageFull.Height;
        ImageL.Canvas.CopyRect(Rect(0, 0, ImageL.Width , ImageL.Height),ImageFull.Canvas,Rect(0, 0, ImageFull.Width div 2 , ImageFull.Height));
        DrawImage(Printer.Canvas, Rect(0, 0, ImageFull.Width, ImageFull.Height*2), ImageL.Picture.Bitmap);
      finally
        FreeAndNil(ImageL);
      end;
      ImageR:=TImage.Create(nil);
      try
        ImageR.Width:=ImageFull.Width div 2;
        ImageR.Height:=ImageFull.Height;
        ImageR.Canvas.CopyRect(Rect(0, 0, ImageR.Width , ImageR.Height),ImageFull.Canvas,Rect(ImageFull.Width div 2, 0, ImageFull.Width , ImageFull.Height));
        Printer.NewPage;
        DrawImage(Printer.Canvas, Rect(0, 0, ImageFull.Width , ImageFull.Height*2), ImageR.Picture.Bitmap);
      finally
        FreeAndNil(ImageR);
      end;
      inc(PageNo);
    end;
  finally
    Printer.EndDoc;
    FreeAndNil(ImageFull);
    screen.cursor := crDefault;
  end;  
end;
Добавлено через 2 часа 29 минут
Используется delphi7. Такое чувство, что ОС выделяет мало памяти для программы(или не расширяет). Может проблемы в TImage, у какого компонента canvas так же совместим с printer-ом?

Добавлено через 15 часов 12 минут


Добавлено через 53 минуты
пробовал полностью отказаться от TImage.
Delphi
1
2
3
4
5
6
B.Width:=Printer.PageWidth;
    B.Height:=Printer.PageHeight; // тут та же ошибка
.....
rvh.DrawPage(PageNo, B.Canvas, False, B.Height);
BitBlt(Printer.Canvas.Handle,0,0,Printer.PageWidth,Printer.PageHeight,
        B.Canvas.Handle,0,0,SRCCOPY);
Добавлено через 1 час 25 минут
После того как начинает выходить ошибка, даже простой код
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
procedure Tf_print_journal.Button3Click(Sender: TObject);
var
  PageNo: Integer;
  ImageFull, ImageR, ImageL:TImage;
 
  Dev, Dri, Por : array [0..256] of char;
  HPrinter: THandle;
  pr2 :pchar;
  RR: TRect;
  B : TBitmap; 
begin
 
  B:=TBitmap.Create;
  try
    B.Width:=Printer.PageWidth;
    B.Height:=Printer.PageHeight; // тут все таже ошибка
  finally
    FreeAndNil(B);
  end;  
end;
выдает данную ошибку. При чем не важно перезагружал ли я IDE или это новый это проект.

Добавлено через 4 часа 24 минуты
Частично заработало...
Delphi
1
2
3
4
5
6
myPrinter   := TPrinter.Create;
....
SetPrinter(myPrinter);
Printer.BeginDoc;
....
myPrinter.Free;
Теперь после выхода из процедуры выходит ошибка доступа к памяти (видимо срабатывает деструктор)
FreeAndNil(myPrinter); не помог..., теперь пытаюсь понять, почему память после печати не подчищается(или не до конца очищается). Но факт остается, как только я начал сам удалять настройки принтера, то первая ошибка сразу же исчезла... Кто знает ткните меня, как нужно пользоваться принтером??? Судя по исходному коду для переменных типа Tprinter можно не вызывать конструктор...
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.03.2016, 12:37
Ответы с готовыми решениями:

Как вывести на печать две и более страницы подряд
Здравствуйте! Столкнулся с проблемой, кажется до ужаса элементарной, но голову уже поломал: Имеется dataGridView, который имеет большое...

Фон страницы пополам
Всем доброго дня! В общем нужно чтобы фон с одной стороны был изображением, а с другой просто белый. Сверстал страницу, но все на костылях...

Печать рисунка из picturebox с переносом на следующую страницу
Перерыла весь интернет в поисках подобной проблемы и ничего не нашла :( Проблема следующая: Есть picturebox в нем какая-то картинка,...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.03.2016, 12:37
Помогаю со студенческими работами здесь

Вывод страницы на печать с заданными параметрами страницы
Подскажите, каким образом можно произвести вывод страницы на печать с заданными параметрами страницы. И если можно, вывод на экран сразу в...

Координаты рисунка (номер страницы) ворд
Здравствуйте, Коллеги! Прошу помощи в следующем вопросе. Есть файл он содержит 5 стр. на страницах 2 и 4 (к примеру) есть рисунки...

Как разбить одномерный массив строк пополам, или практически пополам
Доброго времени суток друзья. Задался таким вопросом. Как мне разбить одномерный массив строк по полам. Или практически пополам,если...

Написать функцию разбиения строки s пополам на две строки s1 и s2
Написать функцию разбиения строки s пополам на две строки s1 и s2 Сделал в обратном порядке, а теперь нужно сделать задание выше не знаю...

Печать чисел в две колонки
Задача: Дан текстовый файл f, содержащий целые числа от 1 до 100. Подготовить новый файл для печати этих чисел в две колонки. В левой...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
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
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru