Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Не печатаются изображения на принтере [D6, WinXP]


Циркуль ©   (2008-10-29 18:03:00) 

Задача - распечатать несколько файлов изображений (сканы неких документов). Файлы в формате JPEG.

Делаю так:
В стринглисте SL  - список имен файлов этих самых изображений.


TmpImage: TImage;
SL: TStringList;

....

       TmpImage := TImage.Create(nil);
       try
         Printer.BeginDoc;
         try
           for I := 0 to SL.Count - 1 do
           begin
             TmpImage.Picture.LoadFromFile(SL[I]);
               Printer.Canvas.StretchDraw(Rect(0, 0, Printer.PageWidth, Printer.PageHeight), TmpImage.Picture.Graphic);
             if I < SL.Count - 1 then
               Printer.NewPage;
           end;
         finally
           Printer.EndDoc;
         end;
       finally
         TmpImage.Free;
       end;


Код отрабатывает, принтер выплевывает нужное количество чистых листочков. Не пойму где тут грабли :(


Циркуль   (2008-10-30 09:26:00) [1]

Спасибо, работает :)


Цитатник   (2008-10-30 08:05:00) [2]

Цитата:
LongIsland ©   (08.05.03 10:53)
procedure TfmMain.bnPrintClick(Sender: TObject);
var
 Info: PBitmapInfo;
 InfoSize, ImageSize: DWord;
 Image: Pointer;
begin
 if not dgPrint.Execute then Exit;
 Printer.BeginDoc;
 GetDIBSizes(imMain.Picture.Bitmap.Handle, InfoSize, ImageSize);
 Info:=AllocMem(InfoSize);
 try
   Image:=AllocMem(ImageSize);
   try
     GetDIB(imMain.Picture.Bitmap.Handle, 0, Info^, Image^);
     StretchDIBits(Printer.Canvas.Handle,
                   0, 0, Printer.PageWidth, Printer.PageHeight,
                   0, 0, imMain.Width, imMain.Height,
                   Image, Info^, DIB_RGB_COLORS, SRCCOPY);
   finally
     FreeMem(Image, ImageSize);
   end;
 finally
   FreeMem(Info, InfoSize);
 end;
 Printer.EndDoc;
end;
Таким образом у меня печатает на любой принтер и любые картинки, а StretchDraw может глючить


Цитатник   (2008-10-30 08:00:00) [3]

Цитата:
Sandman25   (08.05.03 16:10)
Из хелпа по Delphi6.
Note: Delphi canvases use device-dependent bitmaps to implement the Draw, StretchDraw, or CopyRect methods. Because of this, you can't use these methods with most printers. Instead, to create graphic images on the printer's canvas, create a device-independent bitmap and draw it directly to the canvas's Handle property.
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Navi ©   (11.05.03 08:02)
To Sandman25 - спасибо, раскопал. Мне было лень - я допер методом проб и ошибок.


tesseract   (2008-10-29 20:08:00) [4]


> Если бы он не был выбран, он бы не "печатал" чистые листки
> :)


Помню такое было с термопринтерами, вроде решал через API - отрисовывал именно через DIB всё. StretchDraw не работал 100%.


Циркуль   (2008-10-29 20:02:00) [5]

Если бы он не был выбран, он бы не "печатал" чистые листки :)

PageWidth <> 0


tesseract   (2008-10-29 19:55:00) [6]

Гм, а принтер выбран ? Printer.PageWidth какое значение показывает ?


www   (2008-10-29 18:34:00) [7]

вообще-то область печати не с нуля начинается...


Наверх

Титульная страница Поиск, карта сайта Написать письмо