2014-02-20 32 views
0

我是新的德爾福,我想弄清楚如何加載特定行(而不是完整的文本)從一個richtextbox到另一個。如何將特定行從一個TRichEdit控件複製到另一個?

procedure TForm1.richedit1change(Sender: TObject); 
var 
    ms: TMemoryStream; 
begin 
    ms := TMemoryStream.Create; 
    try 
    RichEdit1.Lines.SaveToStream(ms); 
    ms.Seek(0, soFromBeginning); 

    RichEdit2.Lines.LoadFromStream(ms); 
    finally 
    ms.Free; 
    end; 
end; 
+1

爲了在將一個TRichEdit複製到另一個時保持格式化,請參見Zarko Gajic示例['RichEdit Append'](http://delphi.about.com/od/tmemotrichedit/a/richedit-append.htm)。 –

回答

2

您不需要流就可以將文本行從TRichEdit傳輸到另一個。只需使用Lines屬性。 LinesTStrings類型,因此請使用其方法來操作TRichEdit文本。

procedure TForm1.richedit1change(Sender: TObject); 
var 
    i: Integer; 
begin 
    RichEdit2.Lines.Clear; 
    for i := 0 to Pred(RichEdit1.Lines.Count) do 
    begin 
    if YourSpecificTestFunction(i) then 
     RichEdit2.Lines.Add(RichEdit1.Lines[i]); 
    end; 
end; 

如果您想保留RTF格式,您可以使用由扎克Gajic,Append or Insert RTF from one RichEdit to Another描述的技術。

另一個簡單的辦法是使用Windows剪貼板和TRichEdit.Selection:

procedure CopyRichEditSelection(Source,Dest: TRichEdit); 
begin 
    // Copy Source.Selection to Dest via ClipBoard. 
    Dest.Clear; 
    if (Source.SelLength > 0) then 
    begin 
    Source.CopyToClipboard;   
    Dest.PasteFromClipboard; 
    end; 
end; 

這也將保留您的格式,複製選定部分。

如果您想要在沒有用戶控制的情況下控制選區,請使用TRichEdit.SelStart將插入符定位到選區開始的字符處,對於選區長度則使用SelLength。要定位在特定的行插入符號,使用方法:

RichEdit1.SelStart := RichEdit1.Perform(EM_LINEINDEX, Line, 0); 

如果你不想使用Windows剪貼板複製/粘貼操作,一個流可以用於:

Uses RichEdit; 

function EditStreamOutCallback(dwCookie: DWORD_PTR; pbBuff: PByte; cb: Longint; 
    var pcb: LongInt): LongInt; stdcall; 
begin 
    pcb := cb; 
    if cb > 0 then 
    begin 
    TStream(dwCookie).WriteBuffer(pbBuff^, cb); 
    Result := 0; 
    end 
    else 
    Result := 1; 
end; 

procedure GetRTFSelection(aRichEdit: TRichEdit; intoStream: TStream); 
type 
    TEditStreamCallBack = function (dwCookie: DWORD_PTR; pbBuff: PByte; 
    cb: Longint; var pcb: Longint): Longint; stdcall; 

    TEditStream = packed record // <-- Note packed !! 
    dwCookie: DWORD_PTR; 
    dwError: Longint; 
    pfnCallback: TEditStreamCallBack; 
    end; 

var 
    editstream: TEditStream; 
begin 
    with editstream do 
    begin 
    dwCookie := DWORD_PTR(intoStream); 
    dwError := 0; 
    pfnCallback := EditStreamOutCallBack; 
    end; 
    aRichedit.Perform(EM_STREAMOUT, SF_RTF or SFF_SELECTION, LPARAM(@editstream)); 
end; 

procedure CopyRichEditSelection(Source,Dest: TRichEdit); 
var 
    aMemStream: TMemoryStream; 
begin 
    Dest.Clear; 
    if (Source.SelLength > 0) then 
    begin 
    aMemStream := TMemoryStream.Create; 
    try 
     GetRTFSelection(Source, aMemStream); 
     aMemStream.Position := 0; 
     Dest.Lines.LoadFromStream(aMemStream); 
    finally 
     aMemStream.Free; 
    end; 
    end; 
end; 
+0

雖然 –

+1

@DavidHeffernan將會失去格式,但爲保留格式添加了一個解決方案的鏈接,以及使用剪貼板執行相同操作的解決方案。 –

+0

+1,但我無法欣賞殺死用戶剪貼板的版本。非常調皮! ;-) –

相關問題