Как печатать сгенерированные изображения?

BIGITBIGIT Рига
отредактировано 14:13 Раздел: FastReport 2.xx VCL
У меня имеется такая задача:

Печатать в отчёт картинку которая зависит от текущих данных, и соответственно должна генерироваться для каждого MasterData банда.

Никак не получается сделать... ;) Вызов глобальной функции в OnBeforePrint - не работает. Наверняка что то не так делаю. Помогите?

begin
if View.Name="Picture2"
then AssignUserDrawing(TfrPictureView(View).Picture.Bitmap, [Pos."ORDPOS"]);
end

Комментарии

  • SemSem
    отредактировано 14:13
    Я с картинками работаю так:

    В OnBeforePrinе:
    if View.Name = 'Picture1' then
       TfrPictureView(View).Picture.Bitmap.Assign(MyBitMap)
    

    Перед этим можно подогнать размеры:
    View.dy:= MyBitmap.Height
    
  • отредактировано 14:13
    Картинки читаю из базы, храню в MemoryStream - объекты в StringList'e:

    // Изображения---
    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;
    // ---Изображения
  • SemSem
    отредактировано 14:13
    to umnix

    Ну что ты выпендривешся? Смысл тот же (нужно использовать TfrPictureView(View).Picture.Bitmap.Assign, а не некий AssignUserDrawing)
    ;)
  • BIGITBIGIT Рига
    отредактировано 14:13
    Спасибо и sem и umnix.

    Assign сделать то несложно, но ассайнить нечего.
    Объясню ситуацию:
    Есть заказ, у заказа может быть много позиций.
    И для каждой позиции должен генерироваться некий собственный чертёж. Он то и должен выводиться в отчёт (на мастер-бэнд). К тому же пользователь может выбрать для распечатки произвольные позиции заказа.
    Ассайн битмапа сделать можно, а вот функции - не выходит.
    Конечно есть выход - сгенерить перед печатью все битмэпы, а потом по надобности их выводить... Но как то это некрасиво ;)
  • SemSem
    отредактировано 14:13
    написал:
    Ассайн битмапа сделать можно, а вот функции - не выходит.
    Мне не совсем понятна эта фраза.
    написал:
    Конечно есть выход - сгенерить перед печатью все битмэпы, а потом по надобности их выводить... Но как то это некрасиво
    А почему бы не генерить их по надобност?
  • BIGITBIGIT Рига
    отредактировано 14:13
    написал:
    Ассайн битмапа сделать можно, а вот функции - не выходит.

    Мне не совсем понятна эта фраза.

    А почему бы не генерить их по надобност?

    В этом и суть проблемы: как вызвать внешнюю функцию из OnBeforePrint, которая бы генерировала необходимый битмэп?

  • отредактировано 14:13
    Лично я писал в примере код из OnBeforePrint - в Дельфе, а не в генераторе отчетов. В данном случае проблемы не вижу никакой.
  • BIGITBIGIT Рига
    отредактировано 14:13
    umnix написал:
    Лично я писал в примере код из OnBeforePrint - в Дельфе, а не в генераторе отчетов. В данном случае проблемы не вижу никакой.
    Спасибо большое umnix! Твой вариант действительно годится. Сейчас разобрался что к чему.
  • BIGITBIGIT Рига
    отредактировано 14:13
    umnix написал:
    Лично я писал в примере код из OnBeforePrint - в Дельфе, а не в генераторе отчетов. В данном случае проблемы не вижу никакой.
    Я написал так (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 вытянуть из отчёта текущее значение поля БД?
  • отредактировано 14:13
    В принципе из отчета можно "вытянуть" все, что хочешь. Только у меня пока подобных задач не было - все делал в проге, а потом пихал в отчеты. Посмотри по форуму - там что-то про переменные Variables. Да и в хелпе, вроде, есть.

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

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