delphi7所附Rave5之Memo控件,在中文一行不能打印完时能够自动断行,但不能按整字来断行,有时一个中文字会被截断,造成下行的混乱。 请下载 Nevrona Rave V5.1.2 BEX Full Sources For Delphi BCB。 先卸载原来delphi7中的Rave V5.0.8,然后通过运行Rave V5.1.2 BEX Full Sources中的SETUP来安装,安装后从组件中包中再将其卸载,再打开C:\Rave5\Source\dclRave.dpk重 新编译安装。
请把RpMemo.pas文件中的TMemoBuf.GetLine函数进行如下的修改。然后重新编译RvCore.dpk包。把编译获得的RvCore50.bpl拷贝到Rave.exe对应的目录即可!function TMemoBuf.GetLine( Width: longint; var Eol: boolean): string; var TestWidth: longint; SavePos: longint; NewWord: string; S1: string; S2: string; StartPos: longint; FormatState: TFormatState; StartState: string; AdjWidth: longint; FirstLine: boolean;//SCYANGYU ************** Start ************** Function CurLineEndHalfCHS(Const CurLineStr:String):Boolean; Var bIsDBCS:Boolean; jLength,jFor:Integer; Begin bIsDBCS := False; jLength:=Length(CurLineStr); for jFor := 1 to jLength do begin if bIsDBCS then bIsDBCS := False else Begin if Windows.IsDBCSLeadByte(byte(CurLineStr[jFor])) then bIsDBCS := True; End; end; //end of for Result:=bIsDBCS; End; //SCYANGYU ************** End **************begin { GetLine } { Get a line of text that will fit within PrintStart to PrintEnd } EOL := false; NewLine := true; StartPos := -1; S1 := ''; S2 := ''; StartState := ''; Result := ''; FirstLine := NewParagraph; AdjWidth := Width;repeat SavePos := FPos; { Save off current position} NewWord := GetWord; { Get next word }if StartPos < 0 then begin { Initial run through } StartPos := NonSpacePos; if HasRPTF then begin { Get state of line start } FormatState := GetStateAtPos(SavePos); StartState := StateToRPTF(FormatState); if FirstLine then begin LeftIndent := FormatState.Para.FirstIndent + FormatState.Para.LeftIndent; end else begin LeftIndent := FormatState.Para.LeftIndent; end; { else } RightIndent := FormatState.Para.RightIndent; AdjWidth := Width - Round((LeftIndent + RightIndent) * BaseReport.XDPI); if AdjWidth < BaseReport.XDPI then begin { Don't allow width less than 1" } AdjWidth := BaseReport.XDPI; end; { if } end; { if } end; { if }if (NewWord = #13) or (NewWord = '') then begin { Finish off line } EOL := true; if Result = '' then begin Result := StartState; end; { if } Break; end else begin { Test width with new word } S2 := S2 + NewWord; S1 := StartState + FillRPTF(S2,StartPos);if System.Pos(RPTFPrefix,S1) = 0 then begin TestWidth := SimpleTextWidth(BaseReport,S1,0); end else begin TestWidth := RPTFTextWidth(BaseReport,S1); end; { else }if TestWidth <= AdjWidth then begin { Add new word } Result := S1; end else begin { Reset position to before this word} FPos := SavePos; end; { else }if TestWidth >= AdjWidth then begin if UnformatLen(Result) = 0 then begin { First word was too long, cut it down } repeat { Add on characters until enough width } S1 := Result; while FBuffer^[FPos] = RPTFPrefix do begin { Add on RPTF stuff } repeat S1 := S1 + FBuffer^[FPos]; Inc(FPos); until FBuffer^[FPos] = RPTFSuffix; S1 := S1 + FBuffer^[FPos]; Inc(FPos); end; { while } S1 := S1 + FBuffer^[FPos];if System.Pos(RPTFPrefix,S1) = 0 then begin TestWidth := SimpleTextWidth(BaseReport,S1,0); end else begin TestWidth := RPTFTextWidth(BaseReport,S1); end; { else } if TestWidth <= AdjWidth then begin if S1 = ' ' then begin Result := ''; end else begin Result := S1; end; { else } Inc(FPos); end; { if } until (TestWidth >= AdjWidth) or (FPos >= FSize); end; { if } Break; end; { if } end; { else } until false;//SCYANGYU ************** Start ************** If CurLineEndHalfCHS(Result) Then Begin System.Delete(Result,Length(Result),1); Dec(FPos); End; //SCYANGYU ************** End **************end; { GetLine }
Memo显示很正常的
只是字段用EN没问题可以自己Debug Rave内部的VCL代码的,一定能解决的
请下载 Nevrona Rave V5.1.2 BEX Full Sources For Delphi BCB。
先卸载原来delphi7中的Rave V5.0.8,然后通过运行Rave V5.1.2 BEX Full Sources中的SETUP来安装,安装后从组件中包中再将其卸载,再打开C:\Rave5\Source\dclRave.dpk重
新编译安装。
var Eol: boolean): string;
var
TestWidth: longint;
SavePos: longint;
NewWord: string;
S1: string;
S2: string;
StartPos: longint;
FormatState: TFormatState;
StartState: string;
AdjWidth: longint;
FirstLine: boolean;//SCYANGYU ************** Start **************
Function CurLineEndHalfCHS(Const CurLineStr:String):Boolean;
Var
bIsDBCS:Boolean;
jLength,jFor:Integer;
Begin
bIsDBCS := False;
jLength:=Length(CurLineStr);
for jFor := 1 to jLength do
begin
if bIsDBCS then
bIsDBCS := False
else
Begin
if Windows.IsDBCSLeadByte(byte(CurLineStr[jFor])) then
bIsDBCS := True;
End;
end; //end of for
Result:=bIsDBCS;
End;
//SCYANGYU ************** End **************begin { GetLine }
{ Get a line of text that will fit within PrintStart to PrintEnd }
EOL := false;
NewLine := true;
StartPos := -1;
S1 := '';
S2 := '';
StartState := '';
Result := '';
FirstLine := NewParagraph;
AdjWidth := Width;repeat
SavePos := FPos; { Save off current position}
NewWord := GetWord; { Get next word }if StartPos < 0 then
begin { Initial run through }
StartPos := NonSpacePos;
if HasRPTF then
begin { Get state of line start }
FormatState := GetStateAtPos(SavePos);
StartState := StateToRPTF(FormatState);
if FirstLine then
begin
LeftIndent := FormatState.Para.FirstIndent + FormatState.Para.LeftIndent;
end
else
begin
LeftIndent := FormatState.Para.LeftIndent;
end; { else }
RightIndent := FormatState.Para.RightIndent;
AdjWidth := Width - Round((LeftIndent + RightIndent) * BaseReport.XDPI);
if AdjWidth < BaseReport.XDPI then
begin { Don't allow width less than 1" }
AdjWidth := BaseReport.XDPI;
end; { if }
end; { if }
end; { if }if (NewWord = #13) or (NewWord = '') then
begin { Finish off line }
EOL := true;
if Result = '' then
begin
Result := StartState;
end; { if }
Break;
end
else
begin { Test width with new word }
S2 := S2 + NewWord;
S1 := StartState + FillRPTF(S2,StartPos);if System.Pos(RPTFPrefix,S1) = 0 then
begin
TestWidth := SimpleTextWidth(BaseReport,S1,0);
end
else
begin
TestWidth := RPTFTextWidth(BaseReport,S1);
end; { else }if TestWidth <= AdjWidth then
begin { Add new word }
Result := S1;
end
else
begin
{ Reset position to before this word}
FPos := SavePos;
end; { else }if TestWidth >= AdjWidth then
begin
if UnformatLen(Result) = 0 then
begin { First word was too long, cut it down }
repeat { Add on characters until enough width }
S1 := Result;
while FBuffer^[FPos] = RPTFPrefix do
begin { Add on RPTF stuff }
repeat
S1 := S1 + FBuffer^[FPos];
Inc(FPos);
until FBuffer^[FPos] = RPTFSuffix;
S1 := S1 + FBuffer^[FPos];
Inc(FPos);
end; { while }
S1 := S1 + FBuffer^[FPos];if System.Pos(RPTFPrefix,S1) = 0 then
begin
TestWidth := SimpleTextWidth(BaseReport,S1,0);
end
else
begin
TestWidth := RPTFTextWidth(BaseReport,S1);
end; { else }
if TestWidth <= AdjWidth then
begin
if S1 = ' ' then
begin
Result := '';
end
else
begin
Result := S1;
end; { else }
Inc(FPos);
end; { if }
until (TestWidth >= AdjWidth) or (FPos >= FSize);
end; { if }
Break;
end; { if }
end; { else }
until false;//SCYANGYU ************** Start **************
If CurLineEndHalfCHS(Result) Then
Begin
System.Delete(Result,Length(Result),1);
Dec(FPos);
End;
//SCYANGYU ************** End **************end; { GetLine }