![]() |
AW: RTF - Absatzhintergrund setzen
Das liest sich im MSDN aber (mal wieder) anders.
Zitat:
Delphi-Quellcode:
[/edit]
const
TestFile = 'C:\temp\Test.rtf'; TestFile2 = 'C:\temp\Test2.rtf'; procedure TFormTest.Button1Click(Sender: TObject); var fmt: TParaFormat2; begin RichEdit1.Lines.LoadFromFile(TestFile); RichEdit1.SelectAll; ZeroMemory(@fmt, SizeOf(fmt)); fmt.cbSize := SizeOf(fmt); SendMessage(RichEdit1.Handle, EM_GETPARAFORMAT, 0, lParam(@fmt)); RichEdit1.SelLength := 0; RichEdit1.SelStart := Length(RichEdit1.Lines.Text); RichEdit1.SelText := 'Dies ist die Kopie.' + sLineBreak; if SendMessage(RichEdit1.Handle, EM_SETPARAFORMAT, 0, lParam(@fmt)) = 0 then ShowMessage(SysErrorMessage(GetLastError)) else RichEdit1.Lines.SaveToFile(TestFile2); end; [edit2] GetLastError scheint auch Quatsch zu sein, wie kann ich denn nun die Fehlerursache ermitteln? [/edit2] |
AW: RTF - Absatzhintergrund setzen
Welchen Fehler?
das geht ohne Fehlermeldung:
Delphi-Quellcode:
und abgesehen von der Schönhet und ZeroMemory sollte es das gleiche sein?
format.cbSize:=sizeof(format);
format.dwMask:=PFM_SHADING; //richedit1.Perform(EM_GETPARAFORMAT,0,longint(@format)); SendMessage(richedit1.handle,EM_GETPARAFORMAT,0,lparam(@format)); application.ProcessMessages; Gruß K-H |
AW: RTF - Absatzhintergrund setzen
Du wertest ja auch den Rückgabewert nicht aus.
Zitat:
|
AW: RTF - Absatzhintergrund setzen
Ich komme gerade nicht dazu, das zu testen. Aber könnte das ungültige Handle damit zu tun haben, daß Du mit dem selben RichEdit eine andere Datei speichern willst, als Du vorher eingelesen hast ? Was ist denn, wenn Du den Inhalt in ein zweites RichEdit kopierst ? :roll: ( Nicht durch Direktzuweisung, denn dann wäre es wohl das gleiche Handle, sondern mit Assign. ) Dann kannst Du den Inhalt ja erstmal unverändert speichern und mit dem Original vergleichen und danach ändern, usw. ...
Ich habe jetzt erstmal was anderes zu tun. Bis dann ... |
AW: RTF - Absatzhintergrund setzen
Das erscheint mir zwar nicht schlüssig, aber ich probiere es heute Abend mal aus. Witzig ist, dass die mit Word erstellte Datei 10 KB groß ist, die von mir erzeugte mit der weiteren Zeile (und zumindest optisch originalem Absatzformat der ersten) aber nur noch 1 KB. Da kann man mal wieder sehen, wieviel Müll MS in Dateien produziert :lol:
|
AW: RTF - Absatzhintergrund setzen
mal abgesehen davon, daß diese Fummelei ganz interessant ist, was bringts?
Ich meine wenn Dein RTF-Interpreter (Word) mit der erzeugten RTF-Datei nichts anfangen kann (TRichEdit), ist das doch vergebliche Liebesmüh. Word knallt doch erst einmal einen Standard-Header mit mindestens 3 Fonts und xFarben darein. Zuzüglich Autor, Datum usw. das braucht halt. Gruß K-H |
AW: RTF - Absatzhintergrund setzen
Was es bringt? Abgesehen davon, dass mein ursprüngliches Problem gelöst ist, interessiert es mich jetzt einfach, wie man das anzustellen hat, wenn man eine nett formatierte Datei erzeugen möchte (auch wenn das Standard-Control das so nicht darzustellen vermag).
|
AW: RTF - Absatzhintergrund setzen
Die Meldung "Das Handle ist ungültig" ist eindeutig der Rückgabewerte von "GetLastError" !
Zusatzvariable "s" ( string ) und dann dies :
Delphi-Quellcode:
ergibt eine leere Meldung ohne Text. Also scheint doch wenigstens "GetLastError" korrekt zu funktionieren. Die Stelle, an der abgespeichert werden sollte, wird gar nicht erst erreicht. Folglich ist meine Theorie von vorhin schon deshalb falsch.
if SendMessage(RichEdit1.Handle, EM_SETPARAFORMAT, 0, lParam(@fmt)) = 0 then
begin // s:=SysErrorMessage(GetLastError); ShowMessage(s) end Wenn die Auswertung unbeachtet bleibt und man die Datei dennoch speichert, funktioniert das Anhängen nämlich. Jetzt bleibt allerdings die Frage, wieso "RichEdit1.Handle" als ungültig erachtet wird. Interessanterweise aber nur bei EM_SETPARAFORMAT und nicht bei EM_GETPARAFORMAT. Genauer : Wenn erst GET und später SET aufgerufen wird. Zweimal gleich ist egal und erst SET und danach GET ebenso. Oh ! :shock: Jetzt habe ich es mal mit einer nicht künstlich generierten, sondern von OO erzeugten RTF-Datei probiert. Stimmt ! Jede Formatierung ist weg und die Datei wird kleiner. Also ganz wie beschrieben. :shock: Oh, oh, oh ! Probier einfach mal das, ohne alles andere :
Delphi-Quellcode:
Die Formatierung ist offenbar bereits beim Laden weg. Im Klartext heißt das, die übrigen Zuweisungen werten die Datei nicht korrekt aus. Ich habe es auch mit anderen Reihenfolgen probiert.
RichEdit1.Lines.LoadFromFile(TestFile);
RichEdit1.Lines.SaveToFile(TestFile2); Wieso geht es mit selbst generierten RTF-Dateien und nicht bei anderen ? Das kann doch eigentlich nur heißen, daß andere Programme das gewünschte Ergebnis auf andere Weise erzeugen. :pale: Für heute reicht es mir. |
AW: RTF - Absatzhintergrund setzen
Es scheint, dass das MS-RichEdit (TRichEdit ist ja nur ein Wrapper dafür) bestimmten RTF-Code nicht nur ignoriert, sondern gleich mal "stinkelinkpief" entfernt. Somit komme ich zu dem Schluss, dass wir hier bei dieser Vorgehensweise wohl am Ende der Fahnenstange angekommen sind. Damit sind wir aber immer noch weiter als jeder Code, den ich im Internet finden konnte und der auch auf dem RichEdit basiert.
Aber: ignoriert man einfach den Fehlercode und speichert die Datei trotzdem ab, dann bleibt auch die ursprüngliche Absatzformatierung der Originaldatei weitestgehend erhalten (zumindest war das bei mir so). Nur leider nützt einem das gar nüscht, wenn man selbst das Füllmuster setzen möchte. Das geht dann wohl nur noch auf die harte Tour: RichEdit RichEdit sein lassen, RTF-Spezifikation auswendig lernen und per Streams direkt auf den Rohdaten operieren. Mir persönlich geht das im Moment einen Tick zu weit. |
AW: RTF - Absatzhintergrund setzen
Nun, mit "Formatierung" meinte ich gesetzte Hintergrundfarben usw., also alles, was nicht nur der Text selbst ist. Aber mal was anderes : Mit OO habe ich anscheinend keine Möglichkeit, Füllmuster zu setzen und beim neueren LibreOffice, das ich zu Testzwecken als Portable geladen habe, scheint es sowas auch nicht zu geben.
Kann es sein, daß sowas wirklich nur bei Word existiert ? :roll: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:31 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz