2010-09-03 5 views
3

Y at-il un moyen d'obtenir les données RTF à partir d'un richedit sans utiliser SaveToStream comme dansObtenir richtext d'un richedit à Delphes

strStream := TStringStream.Create('') ; 
try 
    RichEdit.Lines.SaveToStream(strStream); 
    Text := strStream.DataString; 
    strStream.CleanupInstance; 
finally 
    strStream.Free 
+2

Ne pas appeler explicitement 'CleanupInstance', il est appelé alors que le courant est détruit. –

+0

En d'autres termes, utilisez 'Free()' au lieu de 'CleanupInstance()'. Et vous devriez utiliser 'try/finally' dans le cas où' SaveToStream() 'déclencherait une exception. –

Répondre

4

Tim la seule façon d'obtenir les données RTF à partir d'un contrôle RichEdit utilise un Flux car le message Windows (EM_STREAMOUT) qui récupère les données RTF nécessite une structure EditStreamCallback, c'est la façon dont Windows utilise le transfert des données rtf dans ou hors d'un contrôle richedit.

Vous pouvez donc utiliser votre propre exemple de code ou implémenter l'appel au message Windows EM_STREAMOUT.

+1

La méthode SaveToStream() utilise 'EM_STREAMOUT' en interne. Pourquoi ne pas utiliser 'SaveToStream()'? –

2
function RichTextToStr(red : TRichEdit) : string; 

var ss : TStringStream; 

begin 
    ss := TStringStream.Create(''); 

    try 
    red.Lines.SaveToStream(ss); 
    Result := ss.DataString; 
    finally 
    ss.Free; 
    end; 
end; 

procedure CopyRTF(redFrom,redTo : TRichEdit); 

var s : TMemoryStream; 

begin 
    s := TMemoryStream.Create; 

    try 
    redFrom.Lines.SaveToStream(s); 
    s.Position := 0; 
    redTo.Lines.LoadFromStream(s); 
    finally 
    s.Free; 
    end; 
end; 

Je peux attester écart par rapport aux résultats de motif de frustration ....

Questions connexes