Передать в отчет переменную типа Tbitmap
Добрый день уважаемые форумчане.
Дублирую тему, открытую в разделе FastReport 4, т.к. вероятнее всего вопрос относится именно к скриптовой части генератора.
У меня имеется следующий вопрос:
Есть база данных, в строках оторой храниться текстовый шаблон построения рисунка, на основе которого формируется изображение.
В Delphi есть процедура вида DrawAnyItem(sShl : String; var bPic : TBitbap); где sShl - текствовый шаблон, bPic - сформированый рисунок.
Необходимо в генераторе отчетов добавить свою процедуру, либо каким-то другим методом сделать отчет, в котором
на бенде по взятым им из базы шаблону формировалось бы изображение.
Я попробывал добавить свою функцию - вида:
frxRepID.AddFunction('procedure DrawAnyItem(sShl : String; var bPic: TBitmap)'); где frxRepID объект класса TfrxReport
В событии на польз. функции указал:
И тут застопорился, т.к. присвоить variant'у тип TBipmap не представляется возможным.
Попробывал конвертировать TBitmap в variant array of byte с помощью функции:
В FastReport не представляется возможным из-за отсутствия методов работы с массивами вариантов.
Подскажите пожалуйста, как мне лучше поступить в данной ситуации.
Дублирую тему, открытую в разделе FastReport 4, т.к. вероятнее всего вопрос относится именно к скриптовой части генератора.
У меня имеется следующий вопрос:
Есть база данных, в строках оторой храниться текстовый шаблон построения рисунка, на основе которого формируется изображение.
В Delphi есть процедура вида DrawAnyItem(sShl : String; var bPic : TBitbap); где sShl - текствовый шаблон, bPic - сформированый рисунок.
Необходимо в генераторе отчетов добавить свою процедуру, либо каким-то другим методом сделать отчет, в котором
на бенде по взятым им из базы шаблону формировалось бы изображение.
Я попробывал добавить свою функцию - вида:
frxRepID.AddFunction('procedure DrawAnyItem(sShl : String; var bPic: TBitmap)'); где frxRepID объект класса TfrxReport
В событии на польз. функции указал:
function frxRepIDUserFunction(const MethodName: String; var Params: Variant): Variant;
var
bPic : TBitmap;
begin
if MethodName = 'DRAWANYITEM' then begin
if (fdsItemsITEM_FILIN.Value = '') then Exit;
try
bPic := TBitmap.Create;
bPic.Width := 150;
bPic.Height := 120;
DrawAnyItem(Params[0], bPic);
Params[1] := <bPic>????????? <- тут вопрос
finally
FreeAndNil(bPic);
end;
end;
end;
И тут застопорился, т.к. присвоить variant'у тип TBipmap не представляется возможным.
Попробывал конвертировать TBitmap в variant array of byte с помощью функции:
function SaveBitmapToVariant(Bitmap: TBitmap): OleVariant;
var
Stream: TMemoryStream;
Buffer: OleVariant;
PBuffer: pointer;
begin
Result := varEmpty;
Stream := TMemoryStream.Create;
Bitmap.SaveToStream(Stream);
Buffer := VarArrayCreate([0,Stream.Size-1],varByte);
PBuffer := VarArrayLock(Buffer);
try
Stream.Position:=0;
Stream.Read(PBuffer^, Stream.Size);
finally
VarArrayUnlock(Buffer);
Stream.Free;
end;
Result := Buffer;
end;
Но вставить соответствующую ей функцию распаковки:procedure LoadBitmapFromVariant(Bitmap: TBitmap; Buffer: OleVariant);
var
Stream: TMemoryStream;
PBuffer: pointer;
begin
if not VarIsArray(Buffer) then
Exit;
Stream := TMemoryStream.Create;
PBuffer := VarArrayLock(Buffer);
try
Stream.Write(PBuffer^, (VarArrayHighBound(Buffer, 1) -
VarArrayLowBound(Buffer, 1) + 1));
finally
VarArrayUnlock(Buffer);
end;
Stream.Position := 0;
Bitmap.LoadFromStream(Stream);
Stream.Free;
end;
В FastReport не представляется возможным из-за отсутствия методов работы с массивами вариантов.
Подскажите пожалуйста, как мне лучше поступить в данной ситуации.
Комментарии