谁能帮我解决我的DELPHI6。0折行问题我送他200分!!!!!(200分)

  • 主题发起人 主题发起人 闲云野鹤
  • 开始时间 开始时间

闲云野鹤

Unregistered / Unconfirmed
GUEST, unregistred user!
我新装的DELPHI 6。0 在做报表的时候数据不能折行,有谁有办法,
控件也行但要我试成功了才行,急需!!!!
 
Enlib 2.1
www.51delphi.com中有下载
 
下载一个带源码的quickreport 3.5,安装后删除.../Delphi6/lib目录下的qrctrls.dcu,
将.../Delphi6/quickrpt目录下的qrctrls.pas和qrdefs.inc两个文件copy到.../Delphi6
/lib目录下,然后将qrdefs.inc中的 //{$DEFINE VER100}一句改为 {$DEFINE VER100},
在qrctrls.pas中找到TQRCustomLabel.FormatLines过程,将带{}的行注释掉就行了.我也
是今天刚试成功.
 
装ReportBuilder 吧, 在www.51delphi.com 中有6.02版, 然后修改它的
ppPlainText.pas 这个文件中的GetNextWord函数, 注意我加的几行代码。
{TppPlainTextParser.GetNextWord}
function TppPlainTextParser.GetNextWord: String;
var
lbEndOfWord: Boolean;
lCharacter: Char;
lsWord: String;
begin

lsWord := '';
lbEndOfWord := False;
while not(lbEndOfWord) and not(FAllWordsParsed)do
begin
{move to next position in the text}
Inc(FCharPos);
{reached end of the text}
if (FCharPos > FTextLength) then
FAllWordsParsed := True
else
begin

lCharacter := FText[FCharPos];
(*-----------------Lighttop添加于2001年6月12日 ---*)
if StrByteType(Pchar(FText),FCharPos-1) = mbTrailByte then
begin
lbEndOfWord := True;
if (lsWord <> '') then
lsWord := lsWord + lCharacter;
end
(*-----------------------------------------------*)
else
if (lCharacter = TppTextMarkups.Null) then
FAllWordsParsed := True
else
if (lCharacter = TppTextMarkups.Space) then
begin
lbEndOfWord := True;
if (lsWord = '') then
lsWord := TppTextMarkups.Space
else
Dec(FCharPos);
end
else
if (lCharacter = TppTextMarkups.CR) then
begin
lbEndOfWord := True;
if (lsWord <> '') then
Dec(FCharPos)
else
begin

if ((FCharPos + 1) <= FTextLength) and (FText[FCharPos + 1] = TppTextMarkups.LF) then
Inc(FCharPos);
{skip over the LF char since it was found immediately following CR}
if (FCharPos <= FTextLength) then
lsWord := TppTextMarkups.CRLF;
end;

end
else
if (lCharacter = TppTextMarkups.LF) then
begin
lbEndOfWord := True;
if (lsWord <> '') then
Dec(FCharPos)
else
if (FCharPos <= FTextLength) then
lsWord := TppTextMarkups.CRLF;
end
else
if (lCharacter = TppTextMarkups.Tab) then
begin
lbEndOfWord := True;
if (lsWord = '') then
lsWord := TppTextMarkups.Tab
else
Dec(FCharPos);
end
else
if ((FCharPos + 1) <= FTextLength) and (lCharacter + FText[FCharPos + 1] = TppTextMarkups.EOP) then
begin
lbEndOfWord := True;
if (lsWord <> '') then
Dec(FCharPos)
else
begin
Inc(FCharPos);
lsWord := TppTextMarkups.CRLF;
end;

end
else
lsWord := lsWord + lCharacter;
end;

end;

Result := lsWord;
end;
 
呵呵!
你是要不定列宽的折行还是定列宽的折行?
不定列宽的折行就只有找控件了,
定列宽的折行好办!
算一下一行想写N个字,在N-1个字后加一个空格就折行了!
 
FASTREPORT2.43,非常好的报表控件,支持中文折行!
想要的话我可以给你发一个,才800多K!
 
delphi5.0中的折行问题 怎么办呀.我都快急死了.
 
我试过不同的控件,但都无法达到我的要求。
我单位要求打印出的表格如
|日期   |时间 |    事  件     |当事人|
|------------------------------------------------------|
|2001.10.28|10:04| 检查1#机、2#机、1#测试|吴 明 |
|------------------------------------------------------|
|     |   |仪正常          |   |
|------------------------------------------------------|  
请问这样的表格该用什么控件???
 
to zhang12321:
到http://delphi.mychangshu.com/dispdoc.asp?id=223下载qr306
to 闲云野鹤:
你的EMail? 我发给你一个qrctrls.dcu,你copy到d6的lib目录试试吧
to 风中的狼:
用QR就可以啊,哪里有问题贴出来看看
 
谢谢 liuly ,yangjj 我的是dhno1@163.net 希望尽快,我都快受不了了
 
呵呵,好!
 
liuly
我也要一个qrctrls.dcu,
jiao_he@sina.com
 
中文折行简单办法:
下面是QUICKREPORT的一个简单技巧:
因为外国人是用英文的,所以换行要必须是不能把一个单词分开,那就是说用空格分开的
字符串被认为是一个单词了,只要在你的中文句子里的恰当地方增加一个空格,看看有什么
效果?再不行的话,每个字之间加上一个空格,能自动换行了!!!!!!

如果试过行的话,UP!
 
谢谢 liuly ,yangjj 我的是dhno1@163.net 希望尽快发来
 
好像上面的方法不能解决吧, 我曾经为这个问题费过好大的劲,因为要连接数据库,直接加一个空格
不行,qr对中文支持很差,在两个汉字中加一个空格是不行的,好像必须有一个半角字符挨着空格才换, 还有有时字段本身有英文加空格,它也会再不改换的时候换行, 我的做法是建立两个计算字段,在计算字段事件中把你要截的前一段赋给他,后一段付给另一个
并且把其中不必要的空格和'-'删掉
 
另外,
adv 老兄, 带源码的quickreport 3.5 在哪下载,我倒是想好好改一个这个问题
 
to 闲云野鹤:
我的办法已经在我的项目中用了, 效果还可以,只是oncalcfields事件中代码要麻烦一些,你要考虑
如果字段中有奇数个半角符,截断字段时不要把一个汉字截开
你先试别的方法吧,不行的话找我
 
karxios
阁下我不大明白你的说法,请你说的详细点,最好是举个例资。谢谢
 
我只说思路,比如120字分2行,每行60字
比如有一个字段 xmmc 最多120个字,你在qr中不要直接用,先在table (或query) 上加两个计算
字段,xmmc1,xmmc2,在qr上用两个dbtext1,2分别连接这两个字段,一个在上,一个在下,然后在table
的 onCalcFields 事件中写类似下面的代码
var strxmmc,strxmmc1,strxmmc2:string;
strxmmc:=table1.fieldbyname('xmmc'),asstring;
if length(strxmmc)>120 then
begin
strxmmc1:=截取strxmmc的前60个字;
strxmmc2:=截取strxmmc的后60个字;
table1xmmc1.asstring:=strxmmc1;
table1xmmc2.asstring:=strxmmc2;
****.dbtext1.top:=偏上一点位置;
****.dbtext2.top:=偏下一点位置;
end
else
begin
table1xmmc1.astring:=strxmmc;
***.dbtext1.top:=居中的位置;
***.dbtext2.top:=看不见的位置;
end;

上面只是思路,你还要注意截时不要把一个汉字截开,那样会乱码, 还有要考虑 xmmc字段本身
含有空格的情况
我的qq:7764977
 
报表问题真磨人。
 

Similar threads

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