Пустой отчёт при динамическом создании страницы

отредактировано April 2017 Раздел: FastReport 4.0
Добрый день.
Подскажите, пожалуйста, что я делаю не так.

Есть отчёт, на который я динамически добавляю страницы с помощью своей процедуры CreatePage.
Если я вызываю процедуру в 1 варианте, то у меня пустая страница, показывается только ReportTitle, во 2 варианте всё отлично.
Если я вызываю процедуру в 1 варианте и присваиваю mdName.Parent := Page, то в memo вижу некоторые данные, ясное дело, не все, ну, т.е. с датасетом все ок, проблема с MasterData, только вот какая?
Версия FR 4.15

Заранее спасибо за ответ.

var    
  Page: TfrxReportPage;
  ReportTitle:TfrxReportTitle;                                                            
  mHead: TfrxMemoView;
  MasterData:TfrxMasterData;
  mdName:TfrxMemoView;

procedure CreatePage;
begin
        Page := TfrxReportPage.Create(Report);
        Page.Name := 'Page21';
        Page.Parent := Report;

        ReportTitle:= TfrxReportTitle.Create(Page);
        ReportTitle.Name := 'ReportTitle11';
        ReportTitle.SetBounds(0,20,100,20);            
        
        mHead :=TfrxMemoView.Create(ReportTitle);
        mHead.Name := 'mHead11';
        mHead.Text:=   'Статистический   отчет  ПЦР -  лаборатории';
        mHead.SetBounds(0,20,100,20);            

        MasterData:=TfrxMasterData.Create(Page);
        MasterData.Name := 'MasterData4';
        MasterData.dataset:=frxDBDataset1;
        MasterData.Visible := True;
        MasterData.SetBounds(20,20,100,20);            

        mdName:=TfrxMemoView.Create(MasterData);
        mdName.Name := 'mdName4';
        mdName.Parent := MasterData;        //!!!вот тут меняю    на mdName.Parent := Page
        mdName.dataset:=frxDBDataset1;
        mdName.datafield:= 'Name';
        mdName.SetBounds(40,20,100,20);

        frxDBDataset1.open;  
end;
  
procedure Button1OnClick(Sender: TfrxComponent);
begin
  CreatePage //1 вариант                                                                       
end;

begin  
  CreatePage //2 вариант                                                                
end.

Комментарии

  • gpigpi
    отредактировано 21:09
    mdName:=TfrxMemoView.Create(MasterData);
            mdName.Name := 'mdName4';
            mdName.Stretched := True;
            mdName.dataset:=frxDBDataset1;
            mdName.datafield:= 'Name';
            mdName.SetBounds(0,0,100,20);
    
    Для горизонтальных бэндов достаточно задавать Top, Height
    Для объектов на бэндах Top, Left задаётся относительно бэнда
  • отредактировано April 2017
    gpi написал: »
    Для горизонтальных бэндов достаточно задавать Top, Height
    Для объектов на бэндах Top, Left задаётся относительно бэнда
    Как бы я хотела, чтобы мне это помогло, но нет. Сделала так:
    ReportTitle.Top :=0;
     ReportTitle.Height:=20;
     MasterData.Top :=20;
     MasterData.Height:=20;
    

    но для memo, пока не прописала все полностью, данные не отображались
    mdName.Top :=0;
    mdName.left:=0;
    mdName.Width:=1000; // тут
    mdName.Height:=20;  //и тут
    

    По-прежнему при вызове функции в Button1OnClick MasterData таинственно исчезает, оставляя ReportTitle, а если вызывать из основного кода - все отлично отображается.
  • gpigpi
    отредактировано 21:09
    Создание страниц и бэндов на странице нужно выполнять до начала построения отчёта или в главной процедуре скрипта, чтобы эти объекты обработались для формирования дерева бэндов в TfrxEngine.Run
    var    
      Page: TfrxReportPage;
      ReportTitle:TfrxReportTitle;                                                            
      mHead: TfrxMemoView;
      MasterData:TfrxMasterData;
      mdName:TfrxMemoView;
    
    procedure CreatePage;
    begin
            mHead :=TfrxMemoView.Create(ReportTitle);
            mHead.Name := 'mHead11';
            mHead.Text:=   'Статистический   отчет  ПЦР -  лаборатории';
            mHead.SetBounds(0,20,200,20);            
    
            mdName:=TfrxMemoView.Create(MasterData);
            mdName.Name := 'mdName1';
            mdName.dataset:=Report.GetDataset('frxDBDataset1');
            mdName.datafield:= 'CustNo';
            mdName.SetBounds(40,20,100,20);
    
            Report.GetDataset('frxDBDataset1').open;
    end;                                 
      
    procedure Button1OnClick(Sender: TfrxComponent);
    begin
      CreatePage;
    end;
    
    begin  
      Page := TfrxReportPage.Create(Report);
      Page.Name := 'Page21';
    
      ReportTitle:= TfrxReportTitle.Create(Page);
      ReportTitle.Name := 'ReportTitle11';
      ReportTitle.SetBounds(0,20,100,20);
    
      MasterData:=TfrxMasterData.Create(Page);
      MasterData.Name := 'MasterData45';
      MasterData.dataset:=Report.GetDataset('frxDBDataset1');
      MasterData.Visible := True;
      MasterData.Stretched := True;             
      MasterData.SetBounds(20,20,100,20);      
    end.
    
  • отредактировано 21:09
    gpi написал: »
    Создание страниц и бэндов на странице нужно выполнять до начала построения отчёта или в главной процедуре скрипта, чтобы эти объекты обработались для формирования дерева бэндов в TfrxEngine.Run
    О, спасибо за разъяснение.
    Несколько неудобно, если количество создаваемых страниц будет известно только после того, как пользователь в диалоговом окне выберет какие-то параметры. Но хотя бы ясно куда двигаться. Спасибо)

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

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