Передать в отчет переменную типа Tbitmap

отредактировано 16:49 Раздел: FastScript
Добрый день уважаемые форумчане.


Дублирую тему, открытую в разделе 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 не представляется возможным из-за отсутствия методов работы с массивами вариантов.


Подскажите пожалуйста, как мне лучше поступить в данной ситуации.

Комментарии

  • отредактировано 16:49
    Всем спасибо вопрос закрыт.

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.