请问有人能有简单解决办法没有?

解决方案 »

  1.   

    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 }
      

  2.   

    强,支持下
    ------------------------------------
    体验速度,体验CSDN论坛助手:http://community.csdn.net/Expert/TopicView.asp?id=4700683