Как печатать сгенерированные изображения?
BIGIT
Рига
У меня имеется такая задача:
Печатать в отчёт картинку которая зависит от текущих данных, и соответственно должна генерироваться для каждого MasterData банда.
Никак не получается сделать... Вызов глобальной функции в OnBeforePrint - не работает. Наверняка что то не так делаю. Помогите?
begin
if View.Name="Picture2"
then AssignUserDrawing(TfrPictureView(View).Picture.Bitmap, [Pos."ORDPOS"]);
end
Печатать в отчёт картинку которая зависит от текущих данных, и соответственно должна генерироваться для каждого MasterData банда.
Никак не получается сделать... Вызов глобальной функции в OnBeforePrint - не работает. Наверняка что то не так делаю. Помогите?
begin
if View.Name="Picture2"
then AssignUserDrawing(TfrPictureView(View).Picture.Bitmap, [Pos."ORDPOS"]);
end
Комментарии
В OnBeforePrinе:
Перед этим можно подогнать размеры:
// Изображения---
if View.Name='Picture2'
then try
i:=View.Parent.DataSet.RecNo;
view.dy:=TfrView(fr_Price.FindObject('Memo13')).dy;
TfrPictureView(View).Picture.Bitmap.FreeImage;
TfrPictureView(View).Picture.Bitmap.Dormant;
if (Gd_list<>nil)
and (Gd_list.Count>i)
and (Tgood(Gd_list.Objects).rec.gd_Pimg.Size>0)
then begin
try
TBMP:= TBitMap.Create;
TGIF:= TGifImage.Create;
TJPG:= TJpegImage.Create;
try
Tgood(Gd_list.Objects).rec.gd_Pimg.Position:=0;
TGIF.LoadFromStream(Tgood(Gd_list.Objects).rec.gd_Pimg);
type_:=2;
except
try
Tgood(Gd_list.Objects).rec.gd_Pimg.Position:=0;
TJPG.LoadFromStream(Tgood(Gd_list.Objects).rec.gd_Pimg);
type_:=1;
except
Tgood(Gd_list.Objects).rec.gd_Pimg.Position:=0;
TBMP.LoadFromStream(Tgood(Gd_list.Objects).rec.gd_Pimg);
type_:=3;
end;
end;
case type_ of
1:TfrPictureView(View).Picture.Bitmap.Assign(TJPG);
2:TfrPictureView(View).Picture.Bitmap.Assign(TGIF);
3:TfrPictureView(View).Picture.Bitmap.Assign(TBMP);
end;
// if TfrPictureView(View).Picture.Bitmap.Height>View.dy
// then View.parent.dy:=TfrPictureView(View).Picture.Bitmap.Height;
finally
if TBMP<>nil
then begin
TBMP.free;
TBMP:=nil;
end;
if TJPG<>nil
then begin
TJPG.free;
TJPG:=nil;
end;
if TGIF<>nil
then begin
TGIF.free;
TGIF:=nil;
end;
end;
end
else TfrPictureView(View).Picture.Assign(nil);
except
end;
// ---Изображения
Ну что ты выпендривешся? Смысл тот же (нужно использовать TfrPictureView(View).Picture.Bitmap.Assign, а не некий AssignUserDrawing)
Assign сделать то несложно, но ассайнить нечего.
Объясню ситуацию:
Есть заказ, у заказа может быть много позиций.
И для каждой позиции должен генерироваться некий собственный чертёж. Он то и должен выводиться в отчёт (на мастер-бэнд). К тому же пользователь может выбрать для распечатки произвольные позиции заказа.
Ассайн битмапа сделать можно, а вот функции - не выходит.
Конечно есть выход - сгенерить перед печатью все битмэпы, а потом по надобности их выводить... Но как то это некрасиво
А почему бы не генерить их по надобност?
В этом и суть проблемы: как вызвать внешнюю функцию из OnBeforePrint, которая бы генерировала необходимый битмэп?
procedure TDATA.frCustRepBeforePrint(Memo: TStringList; View: TfrView);
var BM: TBitMap;
begin
if View.Name='Picture2'
then try
TfrPictureView(View).Picture.Bitmap.FreeImage;
TfrPictureView(View).Picture.Bitmap.Dormant;
BM:= TBitMap.Create;
BM.Width:=round(689*1.5);
BM.Height:=round(519*1.5);
BM.PixelFormat:=pf4bit;
BM.Canvas.Brush.Color:=clWhite;
BM.Canvas.FillRect(BM.Canvas.ClipRect);
MoveDrawingToCanvas(BM.Canvas,
View.Parent.DataSet.RecNo+1,
BM.Width{MaxX}, BM.Height{MaxY},
true{DrawSizes}, false{DrawNumbers}, false{ColorDrawing},
0 {BevelWidth},
false{DrawSprosSizes},
false{DrawGlassNames},
false{TemplatesDraw},
0{DrawWholeWindow});
TfrPictureView(View).Picture.Bitmap.Assign(BM);
finally
if BM<>nil
then begin
BM.free;
BM:=nil;
end;
end;
end;
Замечательно работает, только... Если в dataset какая нибудь позиция будет пропущена - чертёж будет неправильный, с другой позиции заказа.
Можно ли вместо View.Parent.DataSet.RecNo вытянуть из отчёта текущее значение поля БД?