AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

RTF - Absatzhintergrund setzen

Ein Thema von DeddyH · begonnen am 5. Jul 2011 · letzter Beitrag vom 18. Jul 2011
Antwort Antwort
Seite 6 von 8   « Erste     456 78      
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#51

AW: RTF - Absatzhintergrund setzen

  Alt 12. Jul 2011, 09:35
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]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen

Geändert von DeddyH (12. Jul 2011 um 10:15 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#52

AW: RTF - Absatzhintergrund setzen

  Alt 12. Jul 2011, 11:15
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#53

AW: RTF - Absatzhintergrund setzen

  Alt 12. Jul 2011, 11:47
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]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen

Geändert von DeddyH (12. Jul 2011 um 12:14 Uhr)
  Mit Zitat antworten Zitat
delnu
(Gast)

n/a Beiträge
 
#54

AW: RTF - Absatzhintergrund setzen

  Alt 12. Jul 2011, 12:14
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 ? ( 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 ...
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#55

AW: RTF - Absatzhintergrund setzen

  Alt 12. Jul 2011, 12:20
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
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#56

AW: RTF - Absatzhintergrund setzen

  Alt 12. Jul 2011, 12:41
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#57

AW: RTF - Absatzhintergrund setzen

  Alt 12. Jul 2011, 12:43
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).
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
delnu
(Gast)

n/a Beiträge
 
#58

AW: RTF - Absatzhintergrund setzen

  Alt 12. Jul 2011, 13:57
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 ! 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.

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. Für heute reicht es mir.

Geändert von delnu (12. Jul 2011 um 14:45 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#59

AW: RTF - Absatzhintergrund setzen

  Alt 12. Jul 2011, 18:59
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
delnu
(Gast)

n/a Beiträge
 
#60

AW: RTF - Absatzhintergrund setzen

  Alt 13. Jul 2011, 09:02
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 ?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 6 von 8   « Erste     456 78      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:38 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz