Delphi 将文本和数字放入框中

Delphi 将文本和数字放入框中,delphi,delphi-10-seattle,fastreport,Delphi,Delphi 10 Seattle,Fastreport,使用FastReport,如何将数据库中的文本和数字放入如下框中: |_|_|_|_|_|_|_|_|_|_| 所以萨米变成了: 对于数字也是一样,我尝试使用TfrxLineView来实现这一点,但失败了。没有现成的控件来按照您的要求在框中显示字符。因此,您需要在您选择的画布上自己绘制 下面是一个如何在TPaintBox中执行此操作的示例,pbText是演示表单的字符串字段,并保存要在绘制框中显示的文本: procedure TForm17.PaintBox1Paint(Sender: TOb

使用FastReport,如何将数据库中的文本和数字放入如下框中:

|_|_|_|_|_|_|_|_|_|_|
所以萨米变成了:


对于数字也是一样,我尝试使用TfrxLineView来实现这一点,但失败了。

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

下面是一个如何在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;

这是一个非常简单而且有点丑陋的方法

在快速报告中: -像这样放置一个文本对象:[TEST_STR]

-将文本样式设置为下划线

2.在德尔菲

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

输入:萨米

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

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

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

end;
就这些

结果如下:

采取简单的方法:

在报告中或根据需要删除4个TfrxMemoView组件: 在报告的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;
结果将是:

更新:

您还可以通过以下方式以编程方式执行此操作:

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;
结果是:


你可以为此付出代价。或者从现有控件分别为每个字符或数字动态生成它。@Victoria如果我不知道如何创建它呢?还有别的办法吗?我想是的。例如,您可以获取文本对象,调整其大小,编写单个字母,将文本居中,设置其框架,并从Frame.Typ属性中排除ftTop标志。这将产生一个您想要的框。如果您在运行时通过迭代字符串中的所有字符并将其放置在迭代器移动的水平位置来创建这样的框,那么就完成了。@Victoria是的,这是一个好主意,谢谢。在报告中,还可以考虑缩放因子。但这取决于最终需要。做得好!嘿,汤姆,顺便说一句,我是什么意思@萨米不再确定了,但可能我只是测试了不同的字符是如何水平居中的,对我来说,这些字符没有任何意义。你是不是花了三个月才注意到我回答了你的问题@汤姆布伦伯格没有,只是没有关注WIIM这个词,我有点忙,但很快就想起问你它的意思:。谢谢你的回答;如果希望代码更灵活,甚至可以在运行时创建它们。从Delphi或FR代码,您可以创建报表可视对象。唯一有点困难的问题是如何在报告中定位它们。@Victoria是的,我知道,这就是为什么我选择这个解决方案,至少现在是因为我试图在运行时创建它们,并且在定位时遇到问题。