Передача рисунков в Fr

отредактировано 13:56 Раздел: FastReport 4.0
Добрый день! Подскажите пожалуйста вариант решения следующей проблемы:
При составлении отчета на странице все данные(по изделию) выбираються с бд кроме чертежа. В базе ханится только шаблон чертежа, а сам чертеж строиться с помощью ряда процедур в Delphi. Как мне передать построенные в приложении чертежи в отчет, если в отчете выводится например около 5 различных изделий?

Комментарии

  • Lizard~Lizard~ Тольятти
    отредактировано August 2009
    Dimkin написал: »
    Как мне передать построенные в приложении чертежи в отчет, если в отчете выводится например около 5 различных изделий?

    Как вариант, можно попробовать добавить дополнительное поле в набор данных, по которому строится отчет, и заносить туда подготовленный чертёж.
    Типа:
    var
      bmp: TBitmap;
      vstream: TStream;
    begin
      bmp := TBitmap.Create;
      vstream := TStream.Create;
      try
        bmp.SaveToStream(vstream);
        //Рисуем на битмапе
        ...
        ...
        ....
        //заполнение поля готовым чертежом
        vstream.Position := 0;
        cds.Edit;
        (cds.FieldByName('pictur') as TBlobField).LoadFromStream(vstream);
        cds.Post;
      finally
        bmp.Free;
        vstream.Free;
      end;
    end;
    
  • отредактировано 13:56
    LizarD написал: »
    Как вариант, можно попробовать добавить дополнительное поле в набор данных, по которому строится отчет, и заносить туда подготовленный чертёж.
    Типа:
    var
      bmp: TBitmap;
      vstream: TStream;
    begin
      bmp := TBitmap.Create;
      vstream := TStream.Create;
      try
        bmp.SaveToStream(vstream);
        //Рисуем на битмапе
        ...
        ...
        ....
        //заполнение поля готовым чертежом
        vstream.Position := 0;
        cds.Edit;
        (cds.FieldByName('pictur') as TBlobField).LoadFromStream(vstream);
        cds.Post;
      finally
        bmp.Free;
        vstream.Free;
      end;
    end;
    

    Возникли попутно вопросы: а куда именно добавлять дополнительное поле? В наборе данных у меня содержатся только frxBDEQuery, и по этим запросам заполняеться формы отчёта - добавить дополнительное поле к запросу, но как? И еще можно вопрос - Как организовать так, что бы для конкретного изделия выводился конкретный чертёж? Надо привязывать поле к данным из BDEquery?
  • Lizard~Lizard~ Тольятти
    отредактировано August 2009
    Dimkin написал: »
    Возникли попутно вопросы: а куда именно добавлять дополнительное поле? В наборе данных у меня содержатся только frxBDEQuery, и по этим запросам заполняеться формы отчёта - добавить дополнительное поле к запросу, но как?

    Отказаться от frxBDEQuery. Использовать TClientDataSet. В TClientDataSet добавить поле типа TBlobField.
    В это поле и грузить картинку чертежа. Т.е. в результате в TClientDataSet получим часть отчета с описанием детали и в дополнително созданом поле TBlobField чертеж.

    Dimkin написал: »
    И еще можно вопрос - Как организовать так, что бы для конкретного изделия выводился конкретный чертёж? Надо привязывать поле к данным из BDEquery?
    Так как в записи со спецификацией детали содержиться поле с чертежом, они и будут связаны.
  • отредактировано 13:56
    LizarD написал: »
    Отказаться от frxBDEQuery. Использовать TClientDataSet. В TClientDataSet добавить поле типа TBlobField.
    В это поле и грузить картинку чертежа. Т.е. в результате в TClientDataSet получим часть отчета с описанием детали и в дополнително созданом поле TBlobField чертеж.
    Так как в записи со спецификацией детали содержиться поле с чертежом, они и будут связаны.

    А как подключить TClientDataSet к frxReport? В набор данных можно подключить только TfrxUserDataSet..
  • Lizard~Lizard~ Тольятти
    отредактировано 13:56
    Dimkin написал: »
    А как подключить TClientDataSet к frxReport? В набор данных можно подключить только TfrxUserDataSet..
    Стандартно.
    TfrxDBDataset у него в свойство DataSet указать нужный TClientDataSet
    TfrxDBDataset будет видно в отчете. Его связать с нужным MasterData бендом.
  • отредактировано August 2009
    LizarD написал: »
    Стандартно.
    TfrxDBDataset у него в свойство DataSet указать нужный TClientDataSet
    TfrxDBDataset будет видно в отчете. Его связать с нужным MasterData бендом.

    Спасибо за помощь, буду пробовать!
  • Lizard~Lizard~ Тольятти
    отредактировано August 2009
    Dimkin написал: »
    Спасибо за помощь, буду пробовать!

    Можно предложить ещё один самый элементарный вариант.
    Пред печатью подготавливать картинки и складывать на диск. Потом в событии OnBeforePrint указывать, какую картинку выводить. После печати картинки удалять.
    procedure Picture1OnBeforePrint(Sender: TfrxComponent);
    begin
     Picture1.picture.LoadFromFile(IntToStr(<Line>) + '.bmp');
    end;
    
  • отредактировано 13:56
    LizarD написал: »
    Можно предложить ещё один самый элементарный вариант.
    Пред печатью подготавливать картинки и складывать на диск. Потом в событии OnBeforePrint указывать, какую картинку выводить. После печати картинки удалять.
    procedure Picture1OnBeforePrint(Sender: TfrxComponent);
    begin
     Picture1.picture.LoadFromFile(IntToStr(<Line>) + '.bmp');
    end;
    

    Спасибо, но как кажеться это не очень оптимально, но тоже интересный вариант..
    А можно вопрос по ходу дела - я вывожу данные в клиент ClientDataSet, но не могу добавить к нему картинку( Как это правильно сделать не поскажите?
    Если я пыьаюсь добавить чертеж в запросе на AfterScroll(в query который вытягивает данные из БД) или как-либо еще он мне выдает - EDatabaseError 'ClientDataSet1: dataset not in edit or insert mode'((
  • Lizard~Lizard~ Тольятти
    отредактировано 13:56
    Dimkin написал: »
    Спасибо, но как кажеться это не очень оптимально, но тоже интересный вариант..
    А можно вопрос по ходу дела - я вывожу данные в клиент ClientDataSet, но не могу добавить к нему картинку( Как это правильно сделать не поскажите?
    Если я пыьаюсь добавить чертеж в запросе на AfterScroll(в query который вытягивает данные из БД) или как-либо еще он мне выдает - EDatabaseError 'ClientDataSet1: dataset not in edit or insert mode'((
    Правильно говорит.
    После того, как получен набор данных с сервера БД, при перегрузке в TClientDataSet. Т.е. нужно просто пробежаться по
    Главному набору данных, перегружая данные в TClientDataSet, при этом структура полей в TClientDataSet должно соответствовать главному набору + Blob поле для картинки.
    begin
      dsMain.First;
      cds.CreateDataSet;
      with dsMain do
      begin
        //Заполнение полей из основного набора данных в TClientDataSet
        cds.Insert;
        cds.Fields[0].Value := dsMain.Fields[0].Value; //Можно в цикле все поля перебрать, если лень перечислять....
    
        //заполнение поля готовым чертежом. В vstream находится готовый чертеж
        vstream.Position := 0;
        (cds.FieldByName('pictur') as TBlobField).LoadFromStream(vstream);
    
        cds.Post;
        Next;
      end;
    end;
    
  • отредактировано 13:56
    LizarD написал: »
    Правильно говорит.
    После того, как получен набор данных с сервера БД, при перегрузке в TClientDataSet. Т.е. нужно просто пробежаться по
    Главному набору данных, перегружая данные в TClientDataSet, при этом структура полей в TClientDataSet должно соответствовать главному набору + Blob поле для картинки.
    begin
      dsMain.First;
      cds.CreateDataSet;
      with dsMain do
      begin
        //Заполнение полей из основного набора данных в TClientDataSet
        cds.Insert;
        cds.Fields[0].Value := dsMain.Fields[0].Value; //Можно в цикле все поля перебрать, если лень перечислять....
    
        //заполнение поля готовым чертежом. В vstream находится готовый чертеж
        vstream.Position := 0;
        (cds.FieldByName('pictur') as TBlobField).LoadFromStream(vstream);
    
        cds.Post;
        Next;
      end;
    end;
    

    Сделал так
    begin
      Query1.Active:=true;
      Query1.First;
      cds.CreateDataSet;
      with Query1 do
      while not query1.Eof do
      begin
        //Заполнение полей из основного набора данных в TClientDataSet
        cds.Insert;
        for i := 0 to 12 do
        begin
        cds.Fields[i].Value := Query1.Fields[i].Value; //Можно в цикле все поля перебрать, если лень перечислять....
        end;
        (cds.FieldByName('my') as TStringField).Value := '12345';
        ShowMessage((cds.FieldByName('my') as TStringField).Value);
        cds.Post;
        Next;
      end;
    
    ShowMessage выдает корректно значение поля, однако в FastReport значения эти не попадают( Попадают только выбранные из БД. Хотя настроил вроде правильно Query -> DataSetProvider -> cds -> frxDBDataSet. Или это не верно?
  • отредактировано August 2009
    Думал уже может сделать так:
    Данные по изделию передавать из приложения через frDBDataSet, а в query, которое выбирает эти данные, на событие onAfterScroll сгенерировать чертеж и передать его параметром в FastReport. А вуже в FastReporte на данных перед чертежом на событие onAfterData сделать присвоения picture в FR переменной из приложения. Но смотриться как-то неоптимально(
  • отредактировано 13:56
    Спасибо Lizard~! Вроде разобрался! Если кому интересно сделал следующим образом(описано на простом примере):
    procedure TForm1.Query2CalcFields(DataSet: TDataSet);
    var
     bmp: TBitmap;
    begin
      bmp := TBitmap.Create;
     //Строим чертеж и сохраняем в bmp
      -
      -
      // В дополнительное поле в Query(создаем поле типа integer) передаем адрес рисунка
     Query2my.Value:=integer(bmp);
    end;
    

    B FastReporte добавляем следующую функцию:
    procedure Memo2OnAfterData(Sender: TfrxComponent);
    var P: TPicture;                                  
    begin
         P:=TPicture.Create;
         P:=TPicture(<frxDBDataset2."my">);
         Picture1.Picture:=P;                                                                                                
    end;
    

    Если есть предложения лучше - пишите, буду рад посмотреть!

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

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