| 
| 
 | Вопрос # 1 741/ вопрос открыт / | 
 |  Доброго времени суток, уважаемые эксперты!Недавно я же  поднимал вопрос о печати изображения по частям. Благодаря Вашим ответам сгондобил такую бяку(прикреплена ниже). Беда в следующем: когда кртинка меньше листа, её растягивает до его размера. если больше (пробовал исходную картинку ресайзить в асдси до 4000*чегото там), то выдаёт ошибку... подскажите, пожалуйста. про первую проблему я только догадываюсь, а вот что делать со второй, совсем никаких идей :(
 К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса) 
|  |   Вопрос задал: red_88 (статус: Посетитель)Вопрос отправлен: 1 июля 2008, 15:01
 Состояние вопроса: открыт, ответов: 1.
 |  Ответ #1. Отвечает эксперт: Мережников Андрей Здравствуйте, red_88!Убери переменную myPrinter совсем. Убери строку myPrinter:=TPrinter.create; Везде, где стоит myPrinter поставь просто Printer. Ошибки тогда нет, если имелось ввиду "Access violation...". Только картинка печатается уменьшенной. Проверь алгоритм вычисления масштаба.
 
|  | Ответ отправил: Мережников Андрей (статус: Абитуриент)Время отправки: 1 июля 2008, 17:05
 
 |  
 Мини-форум вопросаВсего сообщений: 8; последнее сообщение — 2 июля 2008, 14:19; участников в обсуждении: 4. 
|   | Мережников Андрей (статус: Абитуриент), 1 июля 2008, 16:03 [#1]:какой из двух проектов смотреть: kish или kish_main? И для чего в архиве exe файл? |  
|   | red_88 (статус: Посетитель), 1 июля 2008, 16:07 [#2]:проект там только kish. а про ехешник, пардон, забыл удалить из архива, просто как есть проект, так и скинул всю папку |  
|   | Шичко Игорь (статус: 9-ый класс), 1 июля 2008, 16:57 [#3]:Какую именно ошибку выдает программа. У себя я проверил с размером картинки 4000 * 3600: нормально разбивается на 4 части.
 |  
|   | red_88 (статус: Посетитель), 1 июля 2008, 17:05 [#4]:project kish.exe raised exception class EAccessViolation with message 'Access violation at address 004256E4 in module "kish.exe'. Read of address 0000001D'. Потом останавливается на строчке myPrinter.Canvas.CopyRect(rect_print,buf_bitmap.Canvas,rect_image);
 а на 4 разбивает не растягивая, или куски до страницы тянет всё равно?
 |  
|   | red_88 (статус: Посетитель), 1 июля 2008, 17:35 [#5]:buf_bitmap:=TBitmap.Create; buf_bitmap.LoadFromFile('11112.bmp');
 image1.picture.LoadFromFile('11112.bmp');
 form1.Canvas.Draw(0,0,buf_bitmap);
 myprinter:=TPrinter.Create;
 x:=myprinter.PageWidth;
 dx:=x/a4_w;
 y:=myprinter.PageHeight;
 dy:=y/a4_h;
 x:=x-30;
 y:=y-30;
 x:=round(dx*a4_p_w);
 y:=round(dy*a4_p_h);
 koli:=buf_bitmap.Width div x +1;
 kolj:=buf_bitmap.Height div y +1;
 myPrinter.BeginDoc;
 for i:=1 to koli do
 for j:=1 to kolj do
 begin
 if (i>1) or (j>1) then myprinter.NewPage;
 shir:=x;vis:=y;
 if i=koli then
 shir:=buf_bitmap.Width-buf_bitmap.Width div x * x;
 if j=kolj then
 vis:=buf_bitmap.Height-buf_bitmap.Height div y * y;
 rect_print:=Bounds(round(dx*1.5),round(dy*1.5),shir,vis);
 rect_image:=bounds(x*(i-1),y*(j-1),shir-1,vis-1);
 myprinter.Canvas.Rectangle(rect_print);
 myPrinter.Canvas.CopyRect(rect_print,buf_bitmap.Canvas,rect_image);
 end;
 myPrinter.EndDoc;
 
 теперь печатает не растягивая, но вот после двух кусочков выскакивает таже ошибка
   |  
|   | Вадим К (статус: Академик), 1 июля 2008, 23:15 [#6]:Не решите вы таким образом задачу. Дело в том, что в любом предложенном решении всё упирается в класс TBitmap, который уходит корнями к HBITMAP. А он имеет ограничения на размер. Точно не помню, где то в районе 16 тысяч пикселей. Под 98 и того меньше было. Как выход - использовать свой класс.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Шичко Игорь (статус: 9-ый класс), 2 июля 2008, 07:59 [#7]:Во втором варианте кода тоже работает. 1 вариант растягивал сраницы до полной.
 2 вариант бьет на страницы в реальных размерах (т.е. страницы 2, 3, 4) заполнены не полностью.
 Попробуйте отладить используя в качестве принтера Microsoft Office Document Image Writer
 |  
|   | red_88 (статус: Посетитель), 2 июля 2008, 14:19 [#8]:проблема была решена по подсказке Мережникова Андрея путём замены myprinter на printer (мало что понял, но заработало  ) по поводй 16 тысяч учту, сапсибо. думаю, с учётом масштабирования хватит
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |