2012-03-18 18 views
5

Ho bisogno di scorrere un RichEdit fino alla fine dopo aver aggiunto una riga. Ho questo RichEdit in un modulo separato, che non voglio assolutamente focalizzarmi. Ho provato la soluzione spesso suggerita:Scorri RichEdit senza che abbia lo stato attivo

RichEdit.Lines.Add(someText); 
RichEdit.SelStart:=RichEdit.GetTextLen; 
SendMessage(RichEdit.handle, EM_SCROLLCARET, 0, 0); 

Ma questo non funziona per me. Tuttavia, quando focalizzo RichEdit prima di chiamare lo SendMessage utilizzando RichEdit.SetFocus;, funziona perfettamente. Ciò, tuttavia, rovina le mie altre esigenze per l'app.

Sto usando XE2. Grazie

risposta

11

Questo è quello che faccio:

SendMessage(RichEdit.Handle, WM_VSCROLL, SB_BOTTOM, 0); 
+1

FWIW, che lavora per saltare alla fine, laddove il cursore potrebbe essere. Tuttavia per saltare all'attuale posizione del cursore, devi eseguire il trucco HideSelection. –

8

Vedere questo post del blog di François Gaillard: richedit-on-scrolling-strike.

appearently un bug, ecco la soluzione soluzione:

procedure ScrollToEnd(ARichEdit: TRichEdit); 
var 
    isSelectionHidden: Boolean; 
begin 
    with ARichEdit do 
    begin 
    SelStart := Perform(EM_LINEINDEX, Lines.Count, 0);//Set caret at end 
    isSelectionHidden := HideSelection; 
    try 
     HideSelection := False; 
     Perform(EM_SCROLLCARET, 0, 0); // Scroll to caret 
    finally 
     HideSelection := isSelectionHidden; 
    end; 
    end; 
end; 
Problemi correlati