Как реализовать следующий механизм?

отредактировано 04:41 Раздел: FastReport 3.0
Есть 1000 графических файлов с именами 1.bmp,2.bmp........999.bmp,1000.bmp

Как сформировать отчет, если на листе должно быть 4 фотографии?

Комментарии

  • gpigpi
    отредактировано 04:41
    Используйте frxUserDataSet. MasterData (с двумя столбцами) с высотой на половину страницы
    Памяти в компьютер, да и в принтер побольше. На 98 может и не сформироваться. Ну и чем нибудь себя занять на время формирования отчёта ;)
  • отредактировано 04:41
    А вот такой конструкцией?
    frxreport1.PrepareReport(false);

    C учетом того, что файлы генерятся в самом приложении. Т.е. набиваю отчет, а затем frxreport1.ShowPreparedReport;



    Вроде бы должно работать. Но вот только цикл в котором я готовлю каждую страницу, почемуто на втором проходе вываливает ошибку: 'Access violation at address 00000000. Read of address 00000000.'
  • gpigpi
    отредактировано 04:41
    написал:
    Но вот только цикл в котором я готовлю каждую страницу
    Поподробнее можно?
    написал:
    А вот такой конструкцией?
    frxreport1.PrepareReport(false);
    C учетом того, что файлы генерятся в самом приложении. Т.е. набиваю отчет, а затем frxreport1.ShowPreparedReport;
    frxreport1.PrepareReport(false);
    frxreport1.ShowPreparedReport;
    эквивалентно
    frxreport1.ShowReport(false);
    И что значит "набиваю"? После frxreport1.PrepareReport(false) отчёт уже сформирован
  • отредактировано 04:41
    В общем у меня есть компонента ActiveX: ActiveBarcode. У нее есть свойство picture. Соответственно с помощью нее у меня получаются графические файлы. Которые по четыре мне нужно распечатать на необходимом кол-ве листов.
    написал:
    frxreport1.PrepareReport(false);
    frxreport1.ShowPreparedReport;
    эквивалентно
    frxreport1.ShowReport(false);

    А почему эквивалентно? Насколько я понимаю мне необходимо указать с помощью frxreport1.PrepareReport(false); что лист закончен. И так с каждым листом. А затем подготовленные листы вывести в preview с помощью frxreport1.ShowPreparedReport;


    P.S. Если помнишь ты недавно помогал решить аналогичную проблему, за что тебе большое спасибо. Ту программу я доделал, но вот некоторые нюансы формирования ШК меня не устроили, поэтому снова парюсь.


  • gpigpi
    отредактировано February 2006
    А чем тебя frxBarCodeView не устраивает? Внеси изменения в frxBarcode.pas
    TfrxBarCodeView = class(TfrxView)
      private
        FColorBar: TColor;          // fix
        FBarCode: TfrxBarCode;
    ...
    published
        property BarType: TfrxBarcodeType read FBarType write FBarType;
        property BrushStyle;
        property CalcCheckSum: Boolean read FCalcCheckSum write FCalcCheckSum default False;
        property Color;
        property ColorBar: TColor read FColorBar write FColorBar;    // fix
        property Cursor;
    ...
    procedure TfrxBarCodeView.Draw(Canvas: TCanvas; ScaleX, ScaleY, OffsetX,
      OffsetY: Extended);
    var
      SaveWidth: Extended;
      ErrorText: String;
      DrawRect: TRect;
    begin
      FBarCode.Angle := FRotation;
      FBarCode.Checksum := FCalcCheckSum;
      FBarCode.Typ := FBarType;
      FBarCode.Ratio := FWideBarRatio;
      if Color = clNone then
        FBarCode.Color := clWhite else
        FBarCode.Color := Color;
    
      if ColorBar = clNone then                 // fix
        FBarCode.ColorBar := clWhite else // fix
        FBarCode.ColorBar := ColorBar;    // fix
    ...
    
    и задавай цвет штрихкода
    Для того, чтобы убрать скругление штрихов, положи на верхнюю и нижнюю границы штрихкода Мемо с той же заливкой, что и цвет фона
    С использованием ActiveX:
    во время обработки Next в frxUserDataset выгружаешь 4 bmp в файлы, а при формировании страницы считываешь bmp через Picture1.Picture.LoadFromFile('myfile.bmp')
  • отредактировано 04:41
    Если честно, то со скруглением так и борюсь, но мне кажется что это достаточно корявый метод. Поскольку с увеличением высоты ШК необходимо менять положение закрашивающего элемента. А насчет ActiveX, можно ли обойтись без frxUserDataset? Ведь мне нужно только лишь как-то добавлять листы в отчет.
  • gpigpi
    отредактировано February 2006
    Если в цикле вызывать PrepareReport(false) для каждой червёрки штрихкодов, то можно обойтись и без frxUserDataset
  • отредактировано 04:41
    Точно, именно так я и думал сделать, но почему-то первый раз цикл проходит на ура, а во второй выдает ошибку 'Access violation at address 00000000. Read of address 00000000.'
  • gpigpi
    отредактировано 04:41
    А второй цикл - это второй проход или повторное формирование отчёта?
    Приведи код цикла.
  • отредактировано 04:41
    for i:=1 to 2 do //первый проход делает великолепно
    begin
    barcode1.Text:=edit1.Text;
    Barcode1.picture.pictureadapter := nil;
    Barcode1.createpicturebysize(bc_width,bc_height);
    reportpicture1.Picture:=barcode1.Picture; // на втором на этой строке дает ошибку

    barcode1.Text:=edit1.Text;
    Barcode1.picture.pictureadapter := nil;
    Barcode1.createpicturebysize(bc_width,bc_height);
    reportpicture2.Picture:=barcode1.Picture;

    barcode1.Text:=edit1.Text;
    Barcode1.picture.pictureadapter := nil;
    Barcode1.createpicturebysize(bc_width,bc_height);
    reportpicture3.Picture:=barcode1.Picture;

    barcode1.Text:=edit1.Text;
    Barcode1.picture.pictureadapter := nil;
    Barcode1.createpicturebysize(bc_width,bc_height);
    reportpicture4.Picture:=barcode1.Picture;

    frxreport1.PrepareReport(false);
    end;

    frxreport1.ShowPreparedReport;
  • gpigpi
    отредактировано 04:41
    У меня вот такой код работает
         TfrxPictureView(frxReport1.FindObject('Picture1')).Picture:=Image1.Picture;
         TfrxPictureView(frxReport1.FindObject('Picture2')).Picture:=Image2.Picture;
         frxReport1.PrepareReport(False);
         TfrxPictureView(frxReport1.FindObject('Picture1')).Picture:=Image2.Picture;
         TfrxPictureView(frxReport1.FindObject('Picture2')).Picture:=Image1.Picture;
         frxReport1.PrepareReport(False);
         frxReport1.ShowPreparedReport;
    
    Может, проблема в ActiveX?
    написал:
    reportpicture1.Picture:=barcode1.Picture; // на втором на этой строке дает ошибку
    - поставь на эту строку точку останова и пройдись F7.
    А с frxBarCodeView так ничего и не получилось?
  • отредактировано 04:41
    УРА! Что-то стало получаться!
    А в чем разница:
    picture1:=frxreport1.FindObject('Picture1') as TfrxPictureView;
    picture1.Picture:=BarCode1.Picture; // так у меня
    и
    TfrxPictureView(frxReport1.FindObject('Picture1')).Picture:=BarCode1.Picture; // ты прислал



    Вот еще один вопросик. Как можно очистить prepearedreport?
  • gpigpi
    отредактировано 04:41
    написал:
    А в чем разница:
    picture1:=frxreport1.FindObject('Picture1') as TfrxPictureView;
    picture1.Picture:=BarCode1.Picture; // так у меня
    и
    TfrxPictureView(frxReport1.FindObject('Picture1')).Picture:=BarCode1.Picture; // ты прислал
    Вроде бы никакой, по-моему...
    написал:
    Как можно очистить prepearedreport?
    frxReport1.PreviewPages.Clear;

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

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