Lazreport. Картинка не грузятся.

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
zozuliar
новенький
Сообщения: 35
Зарегистрирован: 09.02.2014 21:56:58

Lazreport. Картинка не грузятся.

Сообщение zozuliar »

Создал в отчёте переменную picture. В отчёте на датабенд поместил компонент picture2. В Memo объекта picture2 поместил переменную picture так:

Код: Выделить всё

[[picture]]

Рядом положил Memo и в него тоже прописал

Код: Выделить всё

[[picture]]

Значение пременной picture присваиваю в коде вызывающей отчёт формы так:

Код: Выделить всё

fn := 'd:\projects\images\' + qProject.ParamByName('id').AsString + '.jpg';
  if (fileexists(fn)) then
  begin
     frVariables['picture']:=fn;
  end
  else
     frVariables['picture']:='d:\projects\images\0.jpg';     

В результате в поле Мемо отчёта попадает значение
d:\projects\images\606.jpg

А картинка не отображfется вообще.
Обратите внимание. что сам jpg-файл есть и он виден моей программе. иначе бы в мемо попадало значение 'd:\projects\images\0.jpg'.
Что я делаю не так?
Lazarus 1.0.14
FPC 2.6.2
Win7 32-bit
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Он так не умеет пока.
Я буквально сегодня решал аналогичную задачу - отображение изображений, которые находятся не в БД (для картинок из таблиц всё просто).
Пока решение таково:
У frReport перепределяешь событие OnEnterRect и в нём определяешь загрузку изображения в объект:

Вот мой код:

Код: Выделить всё

procedure TMainDM.frMainReportEnterRect(Memo: TStringList; View: TfrView);
var
  S:string;
  ID:integer;
  MS: TStream;
begin
  if Assigned(View) and (View is TfrPictureView)  then
  begin
    S:=Trim(Memo.Text);
    if UTF8Copy(S, 1, 6) = 'PASPQ_' then
    begin
      UTF8Delete(S, 1, 6);
      id:=frParser.Calc(S);

      MS:=ImageLib.OpenImage(3, 0, ID);
      if not Assigned(MS) then exit;


      try
        if MS.Size > 0 then
        begin
          try
            TfrPictureView(View).Picture.Graphic:=TJPEGImage.Create;
            (TfrPictureView(View).Picture.Graphic as TJPEGImage).LoadFromStream(MS);
          except
            TfrPictureView(View).Picture.Graphic:=nil;
            MS.Position:=0;
            TfrPictureView(View).Picture.Bitmap.LoadFromStream(MS);
          end;
        end;
      finally
        MS.Free;
      end;
    end;
  end;
end;


А из отчёта в свойстве объекте TfrPictureView.Memo я передаю уже параметры изображения.
ImageLib.OpenImage - у меня хралище, которое возвращает поток с изображением.
В твёом случае вместо этого поставь TFileStream.Create
zozuliar
новенький
Сообщения: 35
Зарегистрирован: 09.02.2014 21:56:58

Сообщение zozuliar »

А в каком файле я должен прописать этот код. чтобы переопределить событие OnEnterRect? В Unit2, где у меня описана форма, из которой вызывается отчёт? Или нужно что менять в исходниках lazreport'а и потом его пересобирать?

Добавлено спустя 3 минуты 47 секунд:
Просто непонятно, что такое
Аватара пользователя
Little_Roo
энтузиаст
Сообщения: 639
Зарегистрирован: 27.02.2009 18:56:36
Откуда: Санкт-Петербург

Сообщение Little_Roo »

zozuliar писал(а):Просто непонятно, что такое

Код: Выделить всё
TMainDM


видимо DataModule
zozuliar
новенький
Сообщения: 35
Зарегистрирован: 09.02.2014 21:56:58

Сообщение zozuliar »

понятно, что дата модуль. Непонятно, в какой он программе или в каком пакете.
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Это обработчи на твой frReport.OnEnterRect
У меня frMainReport находится в модуле TMainDM. Соответсвенно и код такой.
zozuliar
новенький
Сообщения: 35
Зарегистрирован: 09.02.2014 21:56:58

Сообщение zozuliar »

alexs писал(а):А из отчёта в свойстве объекте TfrPictureView.Memo я передаю уже параметры изображения.

А это как? Имя файла прописано руками в свойствах изображения? Или я что-то не понял?

Добавлено спустя 2 минуты 22 секунды:
Возникла проблема в том, что у меня в переменную S попадает значение "[[picture]]", а не значение переменной picture :(

Добавлено спустя 7 минут 37 секунд:
А-а-а-а-а. Понял.
Вместо

Код: Выделить всё

S:=Trim(Memo.Text)

нужно было писать

Код: Выделить всё

S:=frVariables['picture'];
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Я вычисляю код изображения следующей строкой:

Код: Выделить всё

id:=frParser.Calc(S);
Ответить