Delphi-PRAXiS
Seite 6 von 8   « Erste     456 78      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   RTF - Absatzhintergrund setzen (https://www.delphipraxis.net/161467-rtf-absatzhintergrund-setzen.html)

DeddyH 12. Jul 2011 09:35

AW: RTF - Absatzhintergrund setzen
 
Das liest sich im MSDN aber (mal wieder) anders.
Zitat:

The EM_GETPARAFORMAT message retrieves the paragraph formatting of the current selection in a rich edit control.
...
If more than one paragraph is selected, the structure receives the attributes of the first paragraph, and the dwMask member specifies which attributes are consistent throughout the entire selection.
[edit] So, wieder einen Schritt weiter. Ich hatte vergessen, den Rückgabewert von EM_SETPARAFORMAT auszuwerten. Nun ist die Frage, wieso dieser Testcode "Das Handle ist ungültig" ausspuckt.
Delphi-Quellcode:
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;
[/edit]

[edit2] GetLastError scheint auch Quatsch zu sein, wie kann ich denn nun die Fehlerursache ermitteln? [/edit2]

p80286 12. Jul 2011 11:15

AW: RTF - Absatzhintergrund setzen
 
Welchen Fehler?
das geht ohne Fehlermeldung:
Delphi-Quellcode:
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;
und abgesehen von der Schönhet und ZeroMemory sollte es das gleiche sein?

Gruß
K-H

DeddyH 12. Jul 2011 11:47

AW: RTF - Absatzhintergrund setzen
 
Du wertest ja auch den Rückgabewert nicht aus.
Zitat:

The EM_SETPARAFORMAT message sets the paragraph formatting for the current selection in a rich edit control.
...
Return Value

If the operation succeeds, the return value is a nonzero value.

If the operation fails, the return value is zero.
[edit] Sry, bei GET ist das ja die Maske, bei SET eben die 0, wenn ein Fehler auftritt. [/edit]

delnu 12. Jul 2011 12:14

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 ...

DeddyH 12. Jul 2011 12:20

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:

p80286 12. Jul 2011 12:41

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

DeddyH 12. Jul 2011 12:43

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).

delnu 12. Jul 2011 13:57

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:
  if SendMessage(RichEdit1.Handle, EM_SETPARAFORMAT, 0, lParam(@fmt)) = 0 then
  begin
//  s:=SysErrorMessage(GetLastError);
    ShowMessage(s)
  end
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.

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:
  RichEdit1.Lines.LoadFromFile(TestFile);
  RichEdit1.Lines.SaveToFile(TestFile2);
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.

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.

DeddyH 12. Jul 2011 18:59

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.

delnu 13. Jul 2011 09:02

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.
Seite 6 von 8   « Erste     456 78      

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