急急!高手请进,共同探讨:动态设置字段显示宽度和页面的宽度。(200分)

  • 主题发起人 主题发起人 myyzg
  • 开始时间 开始时间
M

myyzg

Unregistered / Unconfirmed
GUEST, unregistred user!
我在设计报表中遇到了这样二个问题:
一、如何在动态生成报表中,根据数据表的字段宽度,计算报表在对应的dblabel和dbtext的宽度,数据表中字段的宽度与报表中显示的宽度的单位不同一,如何比较?
二、如何根据数据表中字段的宽度总和计算报表页面的宽度?
以上问题可能还涉及到字体的大小,假如定为宋体8号,字段度为字符型,显示框为数字型,页面为MM,如何统一计算、比较?
特别急,还请帮忙!
 
可以利用相对宽度,按比例分配
 
这个问题比较简单,tlabe/tdblabel/tdbtext等等都是tgraphicControl类型,
他们都有Canvas,而TCanvas类型有TextWidth方法,恰恰可以知道一个字符串
在当前的Canvas属性下的长度:

例如:你的一个字段为8位字符,则可以:
realLength:=label1.canvas.textwidth('12345678');
这个textwidth就是根据label1的字体算出来的,
因此也就不必考虑任何与字体相关的内容。

但是有一点要注意,那就是在宋体(中文字体)情况下,
各字符的宽度是一样的,因此这种办法无误差,而英文
字体情况下,最好用实际的内容来计算,才准确,或者估计一个最大值。
 
有上点不明白:像素、字符串及毫米(英寸)之间如何换算。
 
我上面的方法可以得到像素长度,要把像素与毫米(英寸)之间转换,
再用tfont.pixelsperinch就可以了,返回的恰好是与打印机相关的长度。
 
能否具体点吗,我的意思是根据数据表中的字段度,动态地产生编辑框的长度。
 
fieldlength:=10;//字段为10个字符
edit1.width:=edit1.canvas.textwidth(StringOfChar('A', fieldlength));
其他问题见我前面的说明
 
温柔一刀的基本思路正确,但Edit是窗口控制,没有Canvas属性。

以下用DBText关联Table1字段列举实现思路。
procedure XXXXX;
var
icol: integer;
sName: string;
cSize: integer;
begin

for icol:=0 to Table1.fieldcount-1do

begin

sName:= 'DBText'+IntToStr(iCol+1);
cSize:= Table1.Fields[iCol].datasize;
(Self.FindComponent(sName) as TDBText).width:=
(Self.FindComponent(s) as TDBText).Canvas.TextWidth(StringOfChar('A',csize));
end;

end;

需要说明的是:
1、对于真实字体,'A'与'a'的宽度不同,对于'宋体'等则相同,所以字体的不同对于显示宽度的精确性有影响,最好设置等宽字体;
2、如果字段设置了显示格式,以上代码不能正确显示,需要编写得到显示格式宽度的代码;
3、如果用DBGrid显示数据,可利用预设的字段宽度。

希望共同探讨。
我的mail:caowei@ms.xjb.ac.cn
 
感谢曹炜的纠正,edit确实没有canvas属性,
我一时疏忽了,我的程序里都是用一个tlabel,
设置成与edit同样字体,然后用tlabel的canvas来计算的。 :-)
 
温柔一刀:
顺便请教F1Book中“ColWidthTwips”,我总是无法根据字段动态设置cell的精确宽度以及字段的显示格式。
 
太高深了……
 
to myyzg:
accept 怎么没见动静了?

to 曹炜:
没用过F1Book
 
不好意思,网路太忙,一时连不上。。。。。。。。
十分度吧!
 
接受答案了.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部