Report Builder中打印中文折行时经常出现乱码,请问如何解决?谢谢!! 急!急!急!急!急!急!急!急!急!急!急!急!急!急!急!急!急!急!急!急

  • 主题发起人 主题发起人 wangwei200208
  • 开始时间 开始时间
W

wangwei200208

Unregistered / Unconfirmed
GUEST, unregistred user!
Report Builder中打印中文折行时经常出现乱码,请问如何解决?谢谢!! 急!急!急!急!急!急!急!急!急!急!急!急!急!急!急!急!急!急!急!急!急!急! (200分)<br />Report Builder 7.02 for D7
 
定个邮件,别给分。
 
可能是字体的问题,换成宋体试试
 
不是字体的问题,任何字体都有这种错误!!
 
修改 Source目录下的ppUtils.pas
以下仅供参考:
{------------------------------------------------------------------------------}
{ ppGetWord }

function ppGetWord(Text: PChar;
var CharPos: Longint): String;
const
lcSpace = ' ';
lcLF = #10;
lcNull = #0;
lcTab = #9;


var
lStartText: PChar;
lFindText: PChar;
lFindNull: PChar;
lFindSpace: PChar;
lFindCRLF: PChar;
lFindTab: PChar;
liLength: Integer;
lsWord: String;
lWord: PChar;
liNewCharPos: Integer;
liWordLength: Integer;
lbEndOfText: Boolean;
liBytePos:integer;
begin

lbEndOfText := False;

lsWord := '';

lFindText := nil;

{create a PChar of text to be searched}
liLength := StrLen(Text) + 1;

{move to begin
ning of words not yet wrapped}
lStartText := Text;
lStartText := lStartText + CharPos;

{find occurance of a space}
lFindSpace := lStartText;
lFindSpace := StrScan(lFindSpace, lcSpace);

{find occurance of a carriage return}
lFindCRLF := lStartText;
lFindCRLF := StrScan(lFindCRLF, lcLF);

lFindNull := lStartText;
lFindNull := StrScan(lFindNull, lcNull);

lFindTab := lStartText;
lFindTab := StrScan(lFindTab, lcTab);


if lFindSpace <> nil then
lFindText := lFindSpace;

if (lFindTab <> nil) and ( (lFindText = nil) or (lFindTab < lFindText) ) then
lFindText := lFindTab;

if (lFindCRLF <> nil) and ( (lFindText = nil) or (lFindCRLF < lFindText) ) then
lFindText := lFindCRLF;

if (lFindText = nil) and (lFindNull <> nil) then
begin
lFindText := lFindNull;
lbEndOfText := True;
end;

{was a space or carriage return found?}
if lFindText <> nil then
begin
{calculate new character position}
if lbEndOfText then
liNewCharPos := liLength
else
liNewCharPos := liLength - Integer(StrLen(lFindText));

liWordLength := liNewCharPos - CharPos;


(******************************************)
{添加正确处理双字节字符(如汉字)的代码}
{Lighttop ,2000.4.10}
{用StrByteType 函数检查第一个字节的类型}
//如为mbSingleByte ,则截取到下一个不为mbSingleByte的字节(如果存在的话)
//如为mbLeadByte ,则截取到下一个为mbTrailByte的字节
//如为mbTrailByte (正常情况下不会出现这种情况)
(******************************************)
liBytePos:=0;
if StrByteType(lStartText,0) = mbSingleByte then
begin
liBytePos:=liBytePos + 1;
while (liBytePos < liWordLength) and (StrByteType(lStartText,liBytePos) = mbSingleByte)do
Inc(liBytePos);
end
else
if StrByteType(lStartText,0) = mbLeadByte then
begin
liBytePos:= 2;
//双字节字符.
end;

if liBytePos <> 0 then
begin
liNewCharPos := liNewCharPos - (LiWordLength - liBytePos);
liWordLength := liBytePos;

end;
{添加的代码结束}
(******************************************)

lWord := StrAlloc(liWordLength + 1);

lWord := StrLCopy(lWord, lStartText, liWordLength);

lsWord := StrPas(lWord);

if Assigned(lWord) then
StrDispose(lWord);

{return new char pos to calling procedure}
if lbEndOfText then
CharPos := -1
else
CharPos := liNewCharPos;

end;

Result := lsWord;

end;
{function, ppGetWord}
 
重新编译后,覆盖 Windows/system 和安装目录下的 *.bpl 文件。
 
to bkfx
找不到你给的函数名!!
 
楼主:
知道哪里有Report Builder的中文手册吗?
 
不好意思,借你的贵地问一个问题,report builder 有否支持DBCHAR,
报错是EDITCHAR.DCU找不到,希望哪位用过能指点一下,回答之后我另开分。
 
TO bkfx:
你给出的方法是我写的。[:D]这是修改RB 5.0X的,对6.0以上
是没用的。现在我很少用RB了,没有再研究。对楼主爱莫能助了。
 
只好做参考用了。。。
 
wangwei200208:
把邮件地址留下,我给发个pas邮件。
Sdelphi_fu:
那需要Treechar源码,如你需要请留邮件地址,这个可很难找呀。
 
发过去了,请收。
 
没有收到!!可以发到下列地址
 
我前面贴过用quickreport实现换行的方法,不知道在buildreport里是不是也管用,你试试吧
就是处理qrlabel的onprint事件
const
MAXLEN=40;
var
i_ins,i,j:integer;
begin
i_ins:=0;
j:=length(value) div MAXLEN;
for i:=1 to jdo
begin
if Windows.IsDBCSLeadByte(byte(value[i*MAXLEN-1+i_ins])) and Windows.IsDBCSLeadByte(byte(value[i*MAXLEN+i_ins])) then
begin
insert(#13,value,i*MAXLEN+1+i_ins);
inc(i_ins);
end
else
begin
insert(#13,value,i*MAXLEN+i_ins);
inc(i_ins);
end;
end;
 
我还是给你贴出来吧,其时这也是在DFW上抄一位兄弟的贴子。
ppPlainText单元
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;
 
老兄不用给我分了,要给给Lighttop
 
非常感谢!!!!!!
 
后退
顶部