FASTREPORT 在报表脚本中动态添加对象

FASTREPORT Adding objects dynamically in report script

我尝试将 TLineView 对象添加到报表中。 行数取决于某个数字,由报告数据集检索。

我已将我的代码放入脚本初始化部分,在一个非常实验性的测试版本中它看起来像这样:

var nol, i: integer;
child, newChild: TfrxChild;
noteLine1, noteLine2: TfrxLineView;
page: TfrxPage;                                 
begin
  page := ReportName;                                                                 
  nol := <DS_MAIN."VOLUME"> /2;
  nol := nol + <DS_MAIN."VOLUME"> mod 2;
  child3.child := TfrxChild.create(nil);
  newchild := child3.child;
  newChild.Visible := true;                                                        
  noteLine1 := TfrxLineView.create(newChild);
  noteLine1.name := 'nl1000';                                                
  noteLine1.Top := 0.73;
  noteLine1.Width := 7.5;
  noteLine1.Left := 3;
  noteLine1.Visible := true;                                                          
  noteLine1.Parent.Objects.Remove(noteLine1);                                                                                                     
  noteLine1.Parent.Objects.Add(noteLine1);                                                                                                     
//  newChild.Objects.Add(noteLine1);
  noteLine2 := TfrxLineView.create(newChild);
  noteLine2.name := 'nl1001';                                                
  noteLine2.Top := 0.73;
  noteLine2.Width := 7.5;
  noteLine2.Left := 11.2;
  newChild.Objects.Add(noteLine2);                                                                                          
  noteLine2.Visible := true;                                                          

  for i := 1 to nol do begin
    Child := TfrxChild.create(nil);
    NewChild.child := Child;
    newChild := child;                                            
  end;
end.

我得到的不是并排的两条线,它们之间有间隙,而是一条长度约为 3-4 毫米的短线。

上面的代码只是我反复试验的一部分。 现在希望有人能给我一些线索。

如果我正确理解你的问题,你至少需要考虑以下几点:

  • 通过 for 循环,您可以创建条带,而不是线条。您可以尝试更改逻辑并创建 objects(备忘录、线条、形状),并将乐队作为所有者。
  • objects的坐标和大小是以像素为单位设置的,所以需要额外计算。

来自文档:

Objects’ coordinates and sizes are set in pixels. Since the «Left,» «Top,» «Width,» and «Height» properties of all objects have the «Extended» type, you can point out non-integer values. The following constants are defined for converting pixels into centimeters and inches:

fr01cm = 3.77953;
fr1cm = 37.7953;
fr01in = 9.6;
fr1in = 96;

以下工作示例生成五个 TfrxLineView objects。只需在您的表单上放置一个空报告并添加报告标题栏:

procedure TfrmMain.btnPreviewClick(Sender: TObject);
var
   nol, i: integer;
   left: Extended;
   band: TfrxReportTitle;
   line: TfrxLineView;
begin
   // Band
   band := (report.Report.FindObject('ReportBand') as TfrxReportTitle);
   // Lines generation
   left := 3;
   nol := 5;
   for i := 1 to nol do begin
      line := TfrxLineView.Create(band);
      line.CreateUniqueName;
      line.Top   := 0.73;
      line.Width := fr1cm * 2;
      line.Left  := left;
      left := left + line.Width + 30;
   end;
   // Report preview
   report.ShowReport(False);
end;

这是我的最终解决方案:

procedure Child8OnBeforePrint(Sender: TfrxComponent);
var nol, i: integer;
left1, left2: extended;                               
child, newChild: TfrxChild;
noteLine1, noteLine2, line: TfrxLineView;
page: TfrxPage;
band: TfrxChild;                                   
begin
  nol := <DS_MAIN."VOLUME"> /2;
  nol := nol + <DS_MAIN."VOLUME"> mod 2;
   band := TfrxChild(TRP_ORDER_NOTE.FindObject('Child9'));
   // Lines generation
   left1 := 3*fr1cm;
   left2 := 11.2*fr1cm;
   for i := 1 to nol do begin
      line := TfrxLineView.Create(band);
      line.Name := 'noteLine'+intToStr(1+2*(i-1+trunc(random*1000000))); //Panic solution
      line.Top   := fr1cm*(0.73 + (i-1)*0.75);
      line.Width := 7.5*fr1cm;
      line.Left  := left1;
      if (<DS_MAIN."VOLUME"> mod 2 > 0 ) and (i = nol) then
        exit                                   
      else 
      begin
        line := TfrxLineView.Create(band);
        line.Name := 'noteLine'+intToStr(2*i+trunc(random*1000000));
        line.Top   := fr1cm*(0.73 + (i-1)*0.75);
        line.Width := 7.5*fr1cm;
        line.Left  := left2;
      end;                
   end;

end;