将文本和数字放在框中
Put text and numbers in boxes
使用 FastReport
,如何将数据库中的 Text
和 Numbers
放入像 :
这样的框中
|_|_|_|_|_|_|_|_|_|_|
所以 "Sami" 变成:
数字也一样,我尝试用 TfrxLineView
来做,但我失败了。
没有现成的控件可以按照您的要求在框中显示字符。因此,您需要自己在您选择的 canvas 上绘制。
下面是如何在 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.In Delphi
-make 函数将字符串转换为格式化字符串。
例如:
输入:SAMI
输出:| 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;
结果是:
使用 FastReport
,如何将数据库中的 Text
和 Numbers
放入像 :
|_|_|_|_|_|_|_|_|_|_|
所以 "Sami" 变成:
数字也一样,我尝试用 TfrxLineView
来做,但我失败了。
没有现成的控件可以按照您的要求在框中显示字符。因此,您需要自己在您选择的 canvas 上绘制。
下面是如何在 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.In Delphi
-make 函数将字符串转换为格式化字符串。 例如:
输入:SAMI
输出:| 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;
结果是: