Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.01.27;
Скачать: CL | DM;

Вниз

Проблема с печатью формы   Найти похожие ветки 

 
ggg   (2007-10-23 03:56) [0]

Просто пытаюсь отправить форму на печать. На некоторых компьютерах - всё нормально, а на некоторых - вместо Image/StringGrid/Memo выводятся черные прямоугольники. Причем панели и лаблы выводятся как положено.

const
PrintMargin = 120;
var
 bmp: TBitmap;
 r2: TRect;
begin
if PrintDialog1.Execute then
  begin
     bmp := GetFormImage;
     bmp.Transparent := true;
     bmp.TransparentColor := Color;
     bmp.Height := ClientHeight - pnlBottomMenu.Height - 2;

     r2 := Rect(
      0, 0,
       Printer.PageWidth - PrintMargin * 2,
       Printer.PageHeight - PrintMargin
     );

     r2 := GetCenterScaledSize(r2, bmp.Width, bmp.Height);

   Printer.BeginDoc;
     try
    Printer.Canvas.Brush.Color := clWhite;
       r2.Left := PrintMargin;
       r2.Top := PrintMargin;
       r2.Right := r2.Left + r2.Right;
       r2.Bottom := r2.Top + r2.Bottom;
    Printer.Canvas.StretchDraw(
    r2,
        bmp
      );
     finally
    Printer.EndDoc;
     end;
     bmp.Free;
   end;

Проблема возникла при печати на одном из ч/б принтеров. Причем, если имадж содержит монохромный рисунок, то он выводится нормально, а вот если цветной - прямоугольник.
Хотя если выбрать печатать в файл, а потом этот файл открыть и распечатать - все нормально.
Как исправить?


 
REA   (2007-10-23 10:57) [1]

Не использовать StretchDraw. См. исходники TCustomForm.Print


 
homm ©   (2007-10-23 11:28) [2]

> [0] ggg   (23.10.07 03:56)
> bmp := GetFormImage;

Код GetFormImage в студию.


 
ggg   (2007-10-23 14:21) [3]

> REA [1]
Спс, попробую.

> homm [2]
эм... Forms.pas из состава BDS2006

function TCustomForm.GetFormImage: TBitmap;
var
 Ofs: Integer;
begin
 Result := TBitmap.Create;
 try
   Result.Width := ClientWidth;
   Result.Height := ClientHeight;
   Result.Canvas.Brush := Brush;
   Result.Canvas.FillRect(ClientRect);
   Result.Canvas.Lock;
   try
     if GetWindowLong(Handle, GWL_STYLE) and WS_BORDER <> 0 then
       Ofs := -1  // Don"t draw form border
     else
       Ofs := 0;  // There is no border
     PaintTo(Result.Canvas.Handle, Ofs, Ofs);
   finally
     Result.Canvas.Unlock;
   end;
 except
   Result.Free;
   raise;
 end;
end;


 
homm ©   (2007-10-23 14:27) [4]

> [3] ggg   (23.10.07 14:21)
> эм... Forms.pas из состава BDS2006

А ты проверяешь, без отправки на печать, всегда ли эта функция возвращает верные картинки?


 
ggg   (2007-10-23 17:48) [5]

> homm [4]
Однозначно правильно. При печати в файл форма отображается верно.

Сейчас нет доступа к тому принтеру, не могу проверить решение с Form.Print;


 
homm ©   (2007-10-23 18:04) [6]

> [5] ggg   (23.10.07 17:48)
> Однозначно правильно. При печати в файл форма отображается
> верно.

Ага, а при блитинге на канву принтера, вдруг пропадают именно прамоугольники, где должны быть Image/StringGrid/Memo???
То, что возвращает GetFormImage — это битмэп, на нем уже нет ни Image ни StringGrid ни Memo, все что там есть сплошной набор битов, формирующих изображения, если ошибка не в этой функции, значит либо пропадает все, либо ничего. Но я склонен полагать, что ошибка все-же в ней.


 
ggg   (2007-10-24 15:14) [7]

> homm ©   (23.10.07 18:04) [6]
Боюсь, что нет ))
Проблема действительно решилась использованием кода из TForm.Print, в частности заменой StretchDraw на StretchDIBits.
Спасибо, REA.



Страницы: 1 вся ветка

Текущий архив: 2008.01.27;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.015 c
2-1198537496
Max
2007-12-25 02:04
2008.01.27
TColor


2-1198663138
trubin
2007-12-26 12:58
2008.01.27
Отличие дисков


15-1197987450
ПЛОВ
2007-12-18 17:17
2008.01.27
Учет техники на предприятии (в електронном виде)


2-1198533584
Александр1
2007-12-25 00:59
2008.01.27
Вопрос по синтаксису


2-1198778448
art36
2007-12-27 21:00
2008.01.27
Как реализовать процесс вставки данных в браузер? Точнее...