2012-04-07 15 views
0

Ich versuche Textzeilen mit diesem Codeanhängen Text Memo mit Win API

SendMessage(Form1.log.Handle, WM_SETTEXT, 0, Integer(PChar(textLog))); 

// TextLog sind einige Linien zB 'Programm begann um xxx' etc

anhängen, aber es funktioniert nicht anhängen , nur neuen Text eingeben

Antwort

0

gefunden Komplettlösung

procedure appendLog(const S: string); 
var 
    SelStart, LineLen: Integer; 
    Line: string; 
begin 

    SelStart := SendMessage(Form1.log.Handle, EM_LINEINDEX, 0, 0); 
    if SelStart >= 0 then Line := S + #13#10 else 
    begin 
     SelStart := SendMessage(Form1.log.Handle, EM_LINEINDEX, -1, 0); 
     if SelStart < 0 then Exit; 
     LineLen := SendMessage(Form1.log.Handle, EM_LINELENGTH, SelStart, 0); 
     if LineLen = 0 then Exit; 
     Inc(SelStart, LineLen); 
     Line := #13#10 + s; 
    end; 

    SendMessage(Form1.log.Handle, EM_SETSEL, SelStart, SelStart); 
    SendMessage(Form1.log.Handle, EM_REPLACESEL, 0, Longint(PChar(Line))); 

end; 
4

WM_SETTEXT ersetzt den gesamten Inhalt; entweder lese den aktuellen Inhalt, füge deinen neuen Text an & setze das Los oder stelle sicher, dass das Caret an dem Punkt ist, an den du anhängen möchtest und füge den neuen Text mit EM_REPLACESEL hinzu.

+2

EM_SETSEL das Einfügemarke an das Ende zu setzen und dann EM_REPLACESEL –

1

Es wird empfohlen, dass Sie verwenden EM_SETSEL oder EM_REPLACESEL nicht. Da auf neueren Betriebssystemen wie Vista und Windows 7, die UAC, verhindert werden Sie diese Nachrichten zu senden. Ich schlage vor, Sie zu. 1. Laden Sie das Handle des Fensterelements 2. eine SetFocus tun, dieses Sie den Cursor im Textbereich 3. Dann sollten Sie Send verwenden zu positionieren, dies mit UAC keine Probleme

Hoffe, es hilft haben.

0

Oder besser:

SendMessage(Form1.log.Handle, EM_SETSEL, 0, -1); 
SendMessage(Form1.log.Handle, EM_SETSEL, (WPARAM)-1, -1); 
SendMessage(Form1.log.Handle, EM_REPLACESEL, 0, (LPARAM)Msg); //add a text 
//SendMessage(Form1.log.Handle, EM_REPLACESEL, 0, (LPARAM)L"\r\n"); //add a new line