将文字和数字放在框中

时间:2017-06-30 15:50:30

标签: delphi delphi-10-seattle fastreport

使用FastReport,如何将TextNumbers放在数据库中,如:

|_|_|_|_|_|_|_|_|_|_|

所以“萨米”变成了:

enter image description here

对于数字也一样,我尝试用TfrxLineView来做,但我失败了。

3 个答案:

答案 0 :(得分:3)

采取简单的方法:

  • 在报告中(或根据需要)删除4个TfrxMemoView组件,如:

enter image description here

  • 在报告的OnPreview事件中,请设置代码,例如:

    procedure TForm1.frxReport1Preview(Sender: TObject);
    var Str : WideString;   I : Integer;  Mem : TfrxMemoView;
    begin
       Str := 'Sami';   // Or get it from query/table (database)
    
       // Find the TFrxMemoView Component and set in it the String you want
       for I := 1 to 4 do
         begin
           Mem := frxReport1.FindObject('M'+IntToStr(I)) as TfrxMemoView;
           Mem.Text := Str[I];
         end;
      end;
    
  • 结果将是:

enter image description here

更新:

您也可以通过以下方式编程:

var RT : TfrxBand;
    Mem : array [1..100] of TfrxMemoView ;
    i : Byte;
    Name : WideString;
begin
  // Find the band
  RT := frxReport1.FindObject('RT') as TfrxBand;
  // Set the String
  Name := 'DELPHI FAST REPORT';
  for I := 1 to Length(Name) do
    begin
      Mem[i] := TfrxMemoView.Create(RT);
      Mem[i].Text :=  Name[i];
      Mem[i].Font.Style := [fsBold];
      Mem[i].Frame.Width := 2;
      Mem[i].Height := 20;
      Mem[i].AutoWidth := False;
      Mem[i].HAlign := haCenter;
      Mem[i].Frame.Typ := [ftLeft , ftBottom , ftRight];
      Mem[i].Width := 20;
      if i =1 then
        Mem[i].Left := 0
          else
            Mem[i].Left := Mem[i-1].Left + 5 + 15;
    end;
  frxReport1.ShowReport();
end;

结果是:

enter image description here

答案 1 :(得分:1)

没有现成的控件可以按要求在框中显示字符。因此,您需要在自己选择的画布上自行绘制。

以下是如何在TPaintBox中执行此操作的示例,pbText此处是演示表单的字符串字段,并保存要在绘图框中显示的文本:

procedure TForm17.PaintBox1Paint(Sender: TObject);var
  i, n, x, y: integer;
  siz: TSize;
  pb: TPaintBox;
begin
  n := 10;  // character cells
  pb := Sender as TPaintBox;
  siz := pb.Canvas.TextExtent('Wp');

  // draw character cells
  x := 4; y := siz.cy+2;
  for i := 0 to n do
  begin
    pb.Canvas.MoveTo(i * siz.cx + x, 0);
    pb.Canvas.LineTo(i * siz.cx + x, y);
  end;
  pb.Canvas.MoveTo(x, y);
  pb.Canvas.LineTo(n * siz.cx + 4, y);

  // draw characters horizontally in center of box
  for i := 1 to Length(pbText) do
  begin
    x := (4 + (i-1)*siz.cx + (siz.cx - pb.Canvas.TextWidth(pbText[i])) div 2);
    y := 0;
    pb.Canvas.TextOut(x, y, UpperCase(pbText[i])); // force upcase
//    pb.Canvas.TextOut(x, y, pbText[i]);            // or don't
  end;
end;

并使用它

procedure TForm17.Button1Click(Sender: TObject);
begin
  pbText := 'Sami Wiim';
  PaintBox1.Invalidate;
end;

enter image description here

答案 2 :(得分:0)

非常简单,而且有点难看的方法。

  1. 快速报告:
  2. - 放置一个这样的Text对象: [TEST_STR] ;

    - 将文字样式设置为下划线;

    2.在德尔福

    -make函数将字符串转换为格式化字符串。 例如:

    输入:SAMI

    输出:| S | A | M | I |

    -in FastReport的OnGetValue事件调用此函数:

    procedure TMainForm.frxReport1GetValue(const VarName: string;
      var Value: Variant);
    begin
      if VarName = 'TEST_STR' then Value :=  MyFunctionToFormatStr('SAMI');
    
    end;
    

    就是这样。

    结果如下:

    enter image description here