![]() |
RTF - Absatzhintergrund setzen
Ich habe ein kleines Tool geschrieben, das aus einem bestimmten Forum (nein, nicht die DP *g*) neue Einträge ermittelt und diese dann in einem RichEdit darstellt. Dabei wird der ggf. vorhandene phpBB-Code geparsed und in RTF umgewandelt. Das klappt auch alles prima, nur beiße ich mir an einem Problem die Zähne aus: da ich auch die Möglichkeit biete, das RTF als Datei abzuspeichern, würde ich Zitate dort gern mit einem hellgrauen Absatzhintergrund versehen, falls jemand diese Datei später mit Word öffnet. Die bisherige Absatzformatierung gestalte ich mittels EM_SETPARAFORMAT und einem PARAFORMAT2-Record. Dieser enthält ja auch die Felder wShadingWeight und wShadingStyle. Zu wShadingStyle sagt das MSDN:
Zitat:
Delphi-Quellcode:
Damit wird der Absatz aber nicht hellgrau, sondern schwarz. Shiftet man etwas weiter, kommen andere Farben heraus (einen weiter nach links z.B. wird es Magenta). Ich habe noch kein Muster erkennen können, weiß somit auch nicht, wo mein Denkfehler liegt. Kann mich mal jemand erhellen?
ParaFormat.wShadingWeight := 50;
ParaFormat.wShadingStyle := $0F shl 4 or $0F shl 8; //oder auch gleich $FF shl 4 [edit] @Mods: wegen TRichEdit (das ja irgendwie damit zu tun hat) habe ich das Thema in dieser Sparte erstellt, falls das aber unter Win32-API besser aufgehoben ist, bitte verschieben. Danke [/edit] |
AW: RTF - Absatzhintergrund setzen
Warum machst Du es nicht so:
Delphi-Quellcode:
Und gefühlt ist $0770 eher Grau oder vllt. $00F0 ?
ParaFormat.wShadingStyle := $0FF0;
Ich hab es nicht so mit den Farben. Gruß K-H |
AW: RTF - Absatzhintergrund setzen
Nunja, das kommt ja auf dasselbe heraus. Das Problem sind weniger die Zahlwerte an sich, sondern, dass das Setzen nicht das Ergebnis bringt, das ich aus der MSDN-Hilfe herauslese. Laut Tabelle ist der ColorIndex für Hellgrau 15, ich müsste also Nibble 1 und 2 (wenn man konsequenterweise bei 0 zu zählen beginnt) auf 15 setzen, das tun ja alle von Dir und mir beschriebenen Wege. Nur das Ergebnis ist eben nicht das erwartete.
Trotzdem Danke |
AW: RTF - Absatzhintergrund setzen
Mach es doch so wie Word über
Zitat:
Hellgrau(5%) --> \cbpat17 bei dieser Colortable:
Code:
Gruß
{\colortbl;
\red0\green0\blue0; \red0\green0\blue255; \red0\green255\blue255; \red0\green255\blue0; \red255\green0\blue255; \red255\green0\blue0; \red255\green255\blue0; \red255\green255\blue255; \red0\green0\blue128; \red0\green128\blue128; \red0\green128\blue0; \red128\green0\blue128; \red128\green0\blue0; \red128\green128\blue0; \red128\green128\blue128; \red192\green192\blue192; \red243\green243\blue243;} K-H |
AW: RTF - Absatzhintergrund setzen
Und wie bekomme ich das hin, ohne auf die Rohdaten zurückzugreifen?
|
AW: RTF - Absatzhintergrund setzen
Zitat:
Ich hatte es so verstanden, daß Du den RTF-File generierst. Gruß K-H |
AW: RTF - Absatzhintergrund setzen
Nein, ich benutze ein TRichEdit zur Anzeige und möchte lediglich für das Speichern als Datei den Absatzhintergrund setzen (RichEdit unterstützt ja eine derartige Anzeige leider nicht, Word schon).
|
AW: RTF - Absatzhintergrund setzen
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo, ich sah den Hilferuf bei lima-city - wo ich leider gesperrt bin - und habe mich darum hier angemeldet, um antworten zu können.
Also, das mit den Hintergrundfarben geht durchaus mit TRichEdit, vorausgesetzt man weiß wie. Ich habe das auch schon mit Delphi 5 unter Windows XP eingesetzt. Aus PDF-Datei extrahiert ( Toolbox 5/2005, Seite 91 ) : Erweiterte Formate im Richeditfeld Mit der Struktur TCharFormat lassen sich beim RichEdit- Feld in Delphi weitere Text-Formatierungen einstellen: PROCEDURE TForm1.SetCharFormat(CharacterFormat: INTEGER); Icon.Free; // Subscript / Superscript // ... VAR Format: TCharFormat; BEGIN FillChar(Format, SizeOf(Format), 0); WITH Format DO BEGIN cbSize := SizeOf(Format); dwMask := CFM_OFFSET; CASE CharacterFormat OF CFE_Superscript: yOffset := 40; CFE_Subscript : yOffset := -40; 0 : yOffset := 0; END; END; Unter Windows XP ist die von der Komponente genutzte RICHED32.DLL (Version 1) nur noch ein Wrapper für RICHED20.DLL (Version 3). Dadurch werden Formatie- rungen mit der Struktur CHARFORMAT2 ermöglicht: Hintergrundfarbe PROCEDURE TForm1.SetBColor(AColor: TColor); VAR Format: CHARFORMAT2; BEGIN FillChar(Format, SizeOf(Format), 0); WITH Format DO BEGIN cbSize := SizeOf(Format); dwMask := CFM_BACKCOLOR; crBackColor := AColor; RE.Perform(EM_SETCHARFORMAT, SCF_SELECTION, LongInt(@Format)); END; END; Die einzelnen Funktionen zeigt das Beispielprogramm auf der CD-ROM im Zusammenhang. (Wolfgang Beintvogl) Wie ich gerade sehe, sind Anhänge möglich. Also packe ich doch gleich mal das Beispielprogramm dazu. Viel Glück. |
AW: RTF - Absatzhintergrund setzen
Liste der Anhänge anzeigen (Anzahl: 1)
Herzlichen Dank, vor allem, dass Du Dich extra für diese Antwort angemeldet hast. Ich habe das Projekt nicht ausprobiert, aber anhand des Quelltextes scheint es dort um den Zeichenhintergrund zu gehen. Das ist leider nicht das, was ich möchte, mir geht es um den Absatz. Zur Verdeutlichung ein Screenshot anbei.
Trotzdem Danke für Deine Mühe |
AW: RTF - Absatzhintergrund setzen
Schade ! Anhand der Grafik sah ich jetzt den erheblichen Unterschied. Mich würde es auch stören, wenn man dann extra die Zeilen mit Leerzeichen auffüllen müßte.
Nunja, extra anmelden ... Das kann doch für die Zukunft nur nützlich sein. Ich werde mal meine alten Quellen ( ich habe eine Weile nichts mit Delphi gemacht ) noch weiter durchsehen und auch bei Gelegenheit gezielt im Internet recherchieren. Das RTF-Format hatte mich auch schon immer gereizt. Anhand der Angaben von Beintvogl lassen sich mit Sicherheit noch andere Erweiterungen nutzen, sobald man deren Bezeichnungen kennt. Wenn ich was gefunden ( und vorher erprobt ) habe, melde ich mich wieder. Ansonsten liest man sich wohl irgendwann mal wieder hier im Forum. Mal gucken, wo und wie ich da aktiv werde. Viele Grüße und viel Erfolg beim Suchen nach des Rätsels Lösung. Wenn Du was gefunden hast, denke ich mal, daß Du es andere wissen läßt. |
AW: RTF - Absatzhintergrund setzen
Zitat:
|
AW: RTF - Absatzhintergrund setzen
Ich habe einmal etwas herum gespielt, mit folgendem Code kann man durchaus Farbmanipulationen durchführen:
Delphi-Quellcode:
Das ist dann das Ergebnis:
var
format:tparaformat2; begin richedit1.SelStart:=11; richedit1.SelLength:=40; memo1.Lines.Text:=richedit1.seltext; format.cbSize:=sizeof(format); format.dwMask:=PFM_SHADING; richedit1.Perform(EM_GETPARAFORMAT,0,longint(@format)); application.ProcessMessages; format.dwMask:=PFM_SHADING; format.cbSize:=sizeof(format); format.wShadingWeight:=50; // format.wShadingStyle:=$0FF0; // format.wShadingStyle:=$0700; format.wShadingStyle:=$0800; richedit1.Perform(EM_SETPARAFORMAT,0,longint(@format)); application.ProcessMessages; richedit1.Lines.SaveToFile('c:\temp\test.rtf'); end;
Code:
Wobei sich je nach eingegebenem wert die colortbl ändert.
{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fnil Tahoma;}}
{\colortbl ;\red0\green0\blue0;} \viewkind4\uc1\pard\f0\fs16 RichEdit1 \par \pard\cbpat1\shading50 das ist der zweite Absatz \par dies ist der der dritte \par \pard und das ist nummero4 \par \par } Aber wenn
Delphi-Quellcode:
gesetzt wird, dann hat man einen schwarz hinterlegten Absatz in der Word-Anzeige. Ist dieses Bit nicht gesetzt, dann gibt es keine Farben und auch sonst nichts zu sehen.
wShadingStyle:=$x8xx;
(Word2003) Gruß K-H |
AW: RTF - Absatzhintergrund setzen
Danke für Deine Mühen. Aber das widerspricht doch auch der Beschreibung im MSDN, oder täusche ich mich? Wieso enthält die Colortable nur eine Farbe, und die ist schwarz? Hätten es nicht Schwarz(Vordergrund) und Dunkelblau(Hintergrund) sein müssen?
|
AW: RTF - Absatzhintergrund setzen
Das ist eine gute Frage!
das
Code:
ist das Ergebnis von $0800.
{\colortbl ;\red0\green0\blue0;}
wenn ich mich nicht irre ergibt $0F00
Code:
Aber es wird nichts angezeigt!
{\colortbl ;\red192\green0\blue192;}
Die RTF-Doku schreibt Zitat:
Gruß K-H |
AW: RTF - Absatzhintergrund setzen
Und genau das ist, was mich an der ganzen Sache so stört. Die Werte, die durch wildes Herumprobieren entstehen, bewirken eine Farbänderung (zwar nicht die gewünschte, aber immerhin irgendeine). Versucht man es aber laut Doku, dann passiert entweder gar nichts oder nicht das, was eigentlich passieren sollte. Irgendwie ist da fürchterlich der Wurm drin. Machen wir irgendwas falsch?
|
AW: RTF - Absatzhintergrund setzen
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo, Leute !
Anhand des Beispiels von p80286 habe ich zunächst auch etwas herumgedoktert und es kam auch nur Müll raus wie bei Euch, weiß auf schwarz. Ich habe kein Word, sondern die Ergebnisse mit OpenOffice getestet. Dort habe ich dann auch mal die Werte so eingestellt, wie sie sein sollen, gespeichert und mir die relevante Stelle angesehen. Die Farbtabelle besteht dann aus 3 Werten : 0,0,0,192,192,192,128,128,128 Nun habe ich also die beiden falschen Werte durch die 3 korrekten ersetzt, das Ergebnis geladen und mir anzeigen lassen, was denn nun da stehen muß. Das Ergebnis überrascht, denn es liegt ganz woanders als bei der Rumdokterei : format.wShadingStyle:=$8040; Ich habe es mit Delphi 7 getestet. Das Beispiel anbei. Viel Vergnügen damit. Irgendwie bekommen wir irgendwann sicher RichEdit auch noch dazu, das darzustellen. :coder: |
AW: RTF - Absatzhintergrund setzen
Genau so wollte ich es haben, Danke :cheers:. Aber es bleibt die Frage: wie kommt dieser Wert zustande? Und gilt der auch künftig weiterhin? Gibt es ein Leben vor dem Tod? Fragen über Fragen :gruebel:
|
AW: RTF - Absatzhintergrund setzen
Also ohne es genau zu prüfen, das riecht doch sehr nach least significant und Konsorten, vielleicht hat da jemand die Abspeicherung und die Registerinhalte vertauscht?
Gruß K-H |
AW: RTF - Absatzhintergrund setzen
Der Gedanke war mir auch zuerst gekommen, aber $0FF0 ist ja vorwärts und rückwärts dasselbe, oder nicht? Ich komme schon ganz durcheinander hier.
|
AW: RTF - Absatzhintergrund setzen
Nee $0FF0 oder $F00F ?
Bei delnu's Lösung wäre das verkehrt $4080 ? wenn man jetzt noch die Nibbels tauscht?? Ich liebe diese verquere Logik! Gruß K-H P.S. warum hatte ich eigentlich keine bunte Anzeige? Gib'ts da einen wert der auch für mich ein Erfolgserlebnis verspricht? |
AW: RTF - Absatzhintergrund setzen
Bunt? Versuch mal $F00F.
|
AW: RTF - Absatzhintergrund setzen
Noch ein kurzer Nachtrag:
Hintergrundfärbung erreicht man über $8000-$F800 wobei $8000 wohl grau ist. Da sind wohl 5Bit im Spiel. Die bits für das Muster hatten bei mur übrigens keine Auswirkung. Gruß K-H |
AW: RTF - Absatzhintergrund setzen
Wird die "uses"-Anweisung so verändert, daß "variants" entfällt, kann z.B. schon mit
Delphi 5 compiliert werden : uses Windows, Messages, SysUtils, {Variants,} Classes, Graphics, Controls, Forms, Dialogs, Buttons, ExtCtrls, StdCtrls, ComCtrls, RichEdit; Außerdem habe ich ein helleres grau gefunden : //format.wShadingStyle:=$8040; // schwarzer Text auf grauem Grund format.wShadingStyle:=$004C; // schwarzer Text auf hellgrauem Grund Hintergrund-Farben : format.wShadingStyle:=$004C; // schwarzer Text auf hellgrauem Grund format.wShadingStyle:=$014C; // schwarzer Text auf hellviolett format.wShadingStyle:=$024C; // schwarzer Text auf hellem blaugrau format.wShadingStyle:=$034C; // schwarzer Text auf hellem rosagrau format.wShadingStyle:=$004C; // schwarzer Text auf hellgrauem Grund ( siehe oben ) format.wShadingStyle:=$104C; // schwarzer Text auf dunkelblauem Grund format.wShadingStyle:=$204C; // schwarzer Text auf dunkelgrünem Grund format.wShadingStyle:=$304C; // schwarzer Text auf dunkelrotem Grund format.wShadingStyle:=$404C; // schwarzer Text auf grauem Grund format.wShadingStyle:=$504C; // schwarzer Text auf dunklem türkis format.wShadingStyle:=$604C; // schwarzer Text auf dunklem violett format.wShadingStyle:=$704C; // schwarzer Text auf dunklem oliv format.wShadingStyle:=$804C; // schwarzer Text auf dunklem grau format.wShadingStyle:=$124C; // weißer Text auf dunkelblau format.wShadingStyle:=$134C; // weißer Text auf dunkelblau format.wShadingStyle:=$224C; // schwarzer Text auf hellerem grün format.wShadingStyle:=$234C; // schwarzer Text auf hellerem grün abweichende Ergebnisse bei anschließender Abfrage : format.wShadingStyle:=$044C; // wird zu $000C ... schwarzer Text auf hellem gelbgrau ? format.wShadingStyle:=$054C; // wird zu $000C format.wShadingStyle:=$904C; // wird zu $004C; format.wShadingStyle:=$A04C; // wird zu $004C; format.wShadingStyle:=$144C; // wird zu $100C schwarzer Text auf dunkelblau format.wShadingStyle:=$154C; // wird zu $100C format.wShadingStyle:=$244C; // wird zu $200C Eine gewisse Systematik ist durchaus erkennbar. Das Problem dabei ist, daß wir nicht gewohnt sind, mit Nibbles ( halben Bytes ) zu rechnen. |
AW: RTF - Absatzhintergrund setzen
Na, das nenne ich mal Engagement :thumb: Ich werde mich heute Abend aber auch noch einmal eingehender mit der Materie befassen, und sei es nur aus Prinzip.
|
AW: RTF - Absatzhintergrund setzen
Bei mir ist das doch auch "nur" Prinzip. Wenn irgendwas nicht funktioniert, gilt es einerseits zu beweisen, daß es an den Verursachern liegt, aber man zweitens dennoch nicht so doof ist, wie die es gerne hätten. Borland war ja eigentlich nie wirklich kundenfreundlich, was dauernde Inkompatibilitäten und massige Quelltextfehler ihrer Standardunits bewiesen haben. Inwieweit das bei der neuen Firma anders ist, weiß ich nicht. Neue Versionen sind mir zu teuer, ich habe genug ausgegeben. Von Microsoft und typischen Windowsfehlern wollen wir besser gar nicht erst anfangen. Was Farben betrifft, denke ich immer zuerst an die Windows-Vertauschung von rot und blau im Vergleich zu den Standardfarben unter Dos.
Wenn Du bzgl. des hier anliegenden Problems die Logik der Bits und Nibbles in Bezug zur jeweiligen Farbgebung gefunden hast, laß es uns bitte wissen. :coder2: |
AW: RTF - Absatzhintergrund setzen
So, meine bisherigen Erkenntnisse: man kann wShadingWeight setzen oder es auch bleiben lassen, Auswirkungen hat es zumindest bei mir gar keine. Dasselbe gilt für den Style (Nibble 0 lt. Microsoft). Ich habe meine eigene Geduld einmal strapaziert: Schleife von 0 bis MAXWORD - 1, wShadingStyle auf diesen Wert gesetzt und Absatz formatiert. Die "magische Zahl" ist anscheinend 2048. Herausgekommen ist nun folgender Test-Code:
Delphi-Quellcode:
Das ergibt dann folgende Colortable:
uses RichEdit;
procedure TFrmRTFTest.Button1Click(Sender: TObject); type // Indizes gem. http://msdn.microsoft.com/en-us/library/bb787942%28VS.85%29.aspx TIndexColor = (Black, Blue, Cyan, Green, Magenta, Red, Yellow, White, DarkBlue, DarkCyan, DarkGreen, DarkMagenta, DarkRed, DarkYellow, DarkGray, LightGray); function IdxColorToString(AColor: TIndexColor): string; begin case AColor of Black: Result := 'Black'; Blue: Result := 'Blue'; Cyan: Result := 'Cyan'; Green: Result := 'Green'; Magenta: Result := 'Magenta'; Red: Result := 'Red'; Yellow: Result := 'Yellow'; White: Result := 'White'; DarkBlue: Result := 'DarkBlue'; DarkCyan: Result := 'DarkCyan'; DarkGreen: Result := 'DarkGreen'; DarkMagenta: Result := 'DarkMagenta'; DarkRed: Result := 'DarkRed'; DarkYellow: Result := 'DarkYellow'; DarkGray: Result := 'DarkGray'; LightGray: Result := 'LightGray'; end; end; const InitialOffset = $0801; // darunter passiert nichts TestFile = 'C:\test\Test.rtf'; var i: TIndexColor; fmt: TParaFormat2; OldStart: integer; begin RichEdit1.Lines.BeginUpdate; try RichEdit1.Clear; ZeroMemory(@fmt, SizeOf(fmt)); fmt.cbSize := SizeOf(fmt); fmt.dwMask := PFM_SHADING; // anscheinend völlig egal, aber wir setzen den Wert einfach mal fmt.wShadingWeight := 100; for i := Low(TIndexColor) to High(TIndexColor) do begin OldStart := RichEdit1.SelStart; RichEdit1.Lines.Add(IdxColorToString(i)); RichEdit1.SelStart := OldStart; RichEdit1.SelLength := RichEdit1.GetTextLen; // die "Blockgröße" scheint bei 2048 zu liegen fmt.wShadingStyle := InitialOffset + Ord(i) shl 11; SendMessage(RichEdit1.Handle, EM_SETPARAFORMAT, 0, lParam(@fmt)); RichEdit1.SelLength := 0; RichEdit1.SelStart := RichEdit1.GetTextLen; end; RichEdit1.Lines.SaveToFile(TestFile); ShowMessage('Fertig'); finally RichEdit1.Lines.EndUpdate; end; end;
Code:
Das sieht für mich schlüssig aus, so dass ich erst einmal dabei bleiben werde. Unklar bleibt für mich allerdings weiterhin, wieso das im MSDN so völlig anders beschrieben ist.
{\colortbl
;\red0\green0\blue0 ;\red0\green0\blue255 ;\red0\green255\blue255 ;\red0\green255\blue0 ;\red255\green0\blue255 ;\red255\green0\blue0 ;\red255\green255\blue0 ;\red255\green255\blue255 ;\red0\green0\blue128 ;\red0\green128\blue128 ;\red0\green128\blue0 ;\red128\green0\blue128 ;\red128\green0\blue0 ;\red128\green128\blue0 ;\red128\green128\blue128 ;\red192\green192\blue192;} |
AW: RTF - Absatzhintergrund setzen
Oh, das sieht ja wirklich sehr gut aus ! :thumb: Außer der erkennbaren Systematik begeistert mich dabei besonders die fast immer korrekte Zuweisung der jeweiligen Textfarbe, außer bei DarkMagenta.
Zitat:
Wie ich sah, hat der gute Karpfen bei lima-city dort durch einen kurzen Zwischentext die Doppelpostsperre aufgehoben und Du hast auf die neuen Erkenntnisse hingewiesen. Leider gibt es immer wieder mal Threadersteller, die schreiben nur "Problem gelöst" und alle anderen, die es auch interessiert hätte, dürfen weiter rätseln ... Übrigens : Eigene Beiträge konnte man bei lima-city früher ca. innerhalb einer Woche nochmal editieren. Ob es jetzt - seit man mich rausgeschmissen hat - anders ist, weiß ich nicht. |
AW: RTF - Absatzhintergrund setzen
Die Schriftfarbe setzt man ja damit nicht, anscheinend wird die automatisch ermittelt (was ja nicht immer funktionieren muss *g*). Sonst müsste man ja explizit die SelAttributes setzen, was sicherlich auch möglich ist, aber das hab ich jetzt noch nicht ausprobiert. Ich setz mich jetzt noch schnell hin und baue den Testcode in allgemeingültige Form um, man will es ja schließlich wiederverwertbar haben, gell? :zwinker:
[edit] Ich habe jetzt eine Unit draus gemacht, werde die aber erst nächste Woche veröffentlichen, da sie noch etwas blutleer wirkt. Da bringe ich lieber noch Code mit, den ich momentan in der Firma habe, damit sich das auch lohnt. [/edit] |
AW: RTF - Absatzhintergrund setzen
Na, das nenne ich doch mal eine wirklich soziale Einstellung ! :thumb:
Was die Textfarbe betrifft : Anhand des Links habe ich mir erstmals die Microsoft-Angaben angesehen. Dort heißt es Zitat:
Zitat:
Aufgrund dessen war ich eigentlich der Ansicht, daß mit den Bits 4 bis 7 ( Vordergrundfarbe ) die Textfarbe gemeint wäre. Bei den Shift-Methoden ( shl ) steige ich immer nicht so ganz durch. Ich arbeite lieber mit Tabellen für die Bitwerte, bei denen ich ganz normal die jeweiligen Bits addiere und die Ergebnisse besser kontrollieren kann. Auf der Basis werde ich mich mal die nächsten Tage an die Microsoft-Angaben wagen. Auch diese geheimnisvollen Möglichkeiten des eigentlichen "shading style" interessieren mich : Dark horizontal, Dark vertical, Dark down diagonal, Dark up diagonal, Dark grid, Dark trellis und das alles noch mal in hell ... Das Wort "trellis" ( Rankgitter, Gitterwerk ) kannte ich vorher gar nicht. Was dabei der Unterschied zu einem Grid sein soll ? Naja, wahrscheinlich funktioniert das ohnehin nicht, weil man die Hintergrundinformationen nicht hat. Dabei ist RTF so interessant und dennoch all die Jahre ein Buch mit sieben Siegeln geblieben. |
AW: RTF - Absatzhintergrund setzen
Was mich gerade etwas stutzig macht: der PARAFORMAT2-Record enthält in Delphi folgendes Feld
Zitat:
Code:
->
LONG rgxTabs;
Delphi-Quellcode:
heißen. Bedeutet das nun, dass die Struktur falsch übersetzt wurde und man daher einfach an die falsche Stelle schreibt? Nur, dann sollten doch theoretisch die Numbering-Optionen auch nicht funktionieren, was sie aber tun. Das wird immer komischer :gruebel:
rgxTabs: LongInt; //das sind immerhin 31 LongInts weniger
//Dummy-Zeile für den Highlighter [edit] Nimmt man meinen Testcode von vorhin und setzt wShadingWeight auf 0 (der einzige Wert, den ich vorher nicht versucht hatte), dann wird der Absatz schraffiert. Da scheint also wirklich mit der Struktur etwas nicht zu stimmen. [/edit] |
AW: RTF - Absatzhintergrund setzen
Liste der Anhänge anzeigen (Anzahl: 1)
Nun, das mit 31 weniger LongInts verstehe ich so nicht. :roll: Allerdings habe ich mir den Quellcode bei Delphi daraufhin jetzt nicht angesehen. Während auf dem Rechner, mit dem ich im Internet bin, Delphi 7 ( das ich noch nicht lange habe ) vorerst nur in einem virtuellen PC eingerichtet ist, weil auf dem Boot-System noch das mehr oder weniger doch unbrauchbare Lazarus rumgeistert, hatte ich vorhin noch auf einem anderen Rechner mit Delphi 5 etwas weiter getestet.
Obwohl : Es stimmt schon, daß man Winzigweich ( schön, daß diese auch von mir benutzte wörtliche Übersetzung auch bei anderen üblich ist ) nicht sonderlich trauen kann. Das mit der Schraffur habe ich NICHT feststellen können. Es wäre auch paradox, denn wenn man keinen Wert angibt, wird doch automatisch 0 gesetzt. Ansonsten : Ich bin sicher, daß man statt "fmt.dwMask := PFM_SHADING;" auch mehrere Werte kombinieren kann, also PFM_SHADING nicht unbedingt allein stehen muß. Deine übrigen Berechnungen und Überlegungen scheinen soweit zu stimmen. Ich hatte gerade auch mal noch ein paar Tests mit Schleifen gemacht und erhielt dabei auch gelegentlich wunderherrliche Hintergrundfarben - nur ohne jede erkennbare Systematik. Immerhin stimmt Deine Angabe von 2048 mit den Microsoftangaben bzgl. Bits 8 bis 11 überein. Ich multipliziere im Test darum auch gleich mit 2048, weil mir das durchschaubarer ist. Aber bei $0800 statt bei $0801 zu beginnen, ist logischer. // fmt.wShadingStyle := InitialOffset + Ord(i) shl 11; fmt.wShadingStyle := InitialOffset + (Ord(i) * 2048); Ansonsten halte ich für sinnvoll, statt der Microsoft-Farbbezeichnungen die von Delphi zu benutzen, weil dadurch das Handling erleichtert wird. Ich habe im beiliegenden Test mal ein wenig rumgebastelt, u.a. auch andere Schriftfarben benutzt und optional kann die Hintergrundfarbe ( nach Wolfgang Beintvogl ) zur Kontrolle ausgegeben werden. Das geht dann zwar nicht über die ganze Zeile, sondern nur den wirklichen Schriftteil, kann aber Orientierungshilfe sein. Ich habe das ggf. auskommentiert, weil es sonst auch in die RTF-Datei geschrieben wird. Const farben : Array[0..15] of TColor = (clBlack, clBlue, clAqua, clLime, clFuchsia, clRed, clYellow, clWhite, clNavy, clTeal, clGreen, clPurple, clMaroon, clOlive, clGray, clSilver); Außerdem hat mich die angehängte, hellgraue Leerzeile gestört. Das hat mit der automatischen Selektion zu tun. Ich habe das jetzt so geändert, daß es stimmt. RichEdit1.SelLength := RichEdit1.GetTextLen - OldStart-1; // - OldStart ! Sieh es Dir an und bau ein, was Dir sinnvoll scheint. Es wäre doch schön, wenn man hier mal gemeinsam was zuwege bringt, was bisher fehlte. Falls ich wüßte, wie man Wolfgang Beintvogl irgendwie erreichen kann, glaube ich, daß er sich auch beteiligen würde. Immerhin hatte er ja schon vor Jahren so einiges rausgefunden. Und die "Toolbox" existiert in der alten Form ja auch nicht mehr. Falls bei meiner Beschreibung hier irgendwas nicht schlüssig zum Quelltext ist : Ich habe beides nochmal etwas überarbeitet, erst den Quelltext, dann diese Beschreibung. Ich hoffe, die alte zip-Datei wurde korrekt gelöscht und durch die neue ersetzt. Wenn es statt "- OldStart-1" noch "- Oldstart" heißt, ist es die falsche. |
AW: RTF - Absatzhintergrund setzen
Entgegen unserer bisherigen Annahme scheint wShadingWeight sehr wohl eine Rolle zu spielen. Bei meinen Nachforschungen in RichEdit.pas bin ich über folgenden Kommentar gestolpert:
Zitat:
|
AW: RTF - Absatzhintergrund setzen
Oh ja, das kann ich jetzt nach dem Testen bestätigen : Ein Wert von 10000 und alles ist schwarz.
Aber noch was anderes : Oberhalb von hellgrau gibt es 2 weitere, brauchbare Farben in mittleren Tönen, ehe es dann wieder unlogisch wird : braun und grün. Außerdem habe ich eine Logik für Zwischenstufen gefunden : Abstand 512 ( müßte eigentlich 256 sein, scheint aber dabei Fehler zu geben ) bis max. 3 * 512 nzw. eigentlich 7*256, sonst kommt man ja in den Startbereich 2048. Bedingung, damit sich die Farben etwas unterscheiden : Ein paar der unteren Bits müssen gesetzt sein. Am Saubersten kam es mir wahrscheinlich beim Wert 5 vor. Das ist jetzt schon wieder einige Stunden her und ich habe nicht geschlafen, darum weiß ich es nicht mehr genau. Der ganzen verqueren Logik liegt ein völlig anderes Prinzip zugrunde, als man gewohnt ist. Ich habe sogar schon an BCD oder sonstige Kodierung gedacht. Wie dem auch sei : Normal ist das nicht. Selbst wenn die Basis 2048 mit entsprechenden Schritten schlüssig ist, wundert mich, wieso meine Tests auch bei Werten unter 2048 andere Hintergrundfarben ergaben. Das können doch dann nur die Werte für den "foreground color index" sein, in Verbindung mit dem "shading style", dessen Bedeutung mir nach wie vor unklar ist. Es kann natürlich auch sein, daß Open Office manche Sachen nicht darstellt, oder anders als Word. |
AW: RTF - Absatzhintergrund setzen
Ganz langsam kommt Licht in die Sache: wShadingWeight gibt die prozentuale Dichte des Füllmusters an (anscheinend tatsächlich in 1/100%). Je höher, desto weniger Hintergrund schimmert durch. Mittlerweile bin ich hier angelangt:
Delphi-Quellcode:
Jetzt muss ich nur noch herausfinden, wie ich das Füllmuster (in der Vordergrundfarbe, das ist deren Sinn, wie mir jetzt endlich klar ist) zuverlässig setzen kann. Eigentlich sollte es ja auf 0 stehen (keine Füllung), tatsächlich sind aber Punkte zu sehen. Ich teste hier übrigens mit Word 2010, möglicherweise sieht das unter OO wirklich etwas anders aus.
type
TShadingWeight = 0..100; function SetParaColors(const RE: TRichEdit; Weight: TShadingWeight; ForegroundColor, BackgroundColor: TIndexColor): Boolean; var fmt: TParaFormat2; begin Result := false; if Assigned(RE) then begin ZeroMemory(@fmt, SizeOf(fmt)); fmt.cbSize := SizeOf(fmt); fmt.dwMask := PFM_SHADING; fmt.wShadingWeight := Weight * 100; (* verständliche Variante *) fmt.wShadingStyle := Succ(Ord(ForegroundColor)) * 64 or Succ(Ord(BackgroundColor)) * 2048; (* etwas schnellere Variante *) fmt.wShadingStyle := Succ(Ord(ForegroundColor)) shl 6 or Succ(Ord(BackgroundColor)) shl 11; Result := SendMessage(RE.Handle, EM_SETPARAFORMAT, 0, lParam(@fmt)) <> 0; end; end; Achja: natürlich kannst Du die Maske erweitern, dementsprechend müssen/sollten dann auch die anderen Felder des Records ausgewertet werden. |
AW: RTF - Absatzhintergrund setzen
Liste der Anhänge anzeigen (Anzahl: 1)
Na ja, Punkte. Bei OO habe ich ein Linienraster. Bist Du sicher, daß es sich nicht um Hilfsmarkierungen handelt? Oder punktförmige "Unterstreichung" ?
Deine Funktion habe ich mir rauskopiert und werde sie testen. Mittlerweile habe ich noch was anderes Interessantes gefunden, um weitere mit Delphi offenbar nicht darstellbare Sachen zu RTF konvertieren zu können, u.a. Image und StringGrid. Ich habe nur mal kurz das enthaltene Beispiel ausprobiert. Vorher muß eine Komponente installiert werden. Das ist zwar schon etwas älter, aber frei verfügbar. Es gibt einen interessanten Registrierungshinweis : "You must register this software by visiting http://nishita.com." Dumm nur, daß es diese Seite nicht mehr gibt. ctltortf.zip : Download von ![]() Wie dumm von mir. Ich hatte nicht dran gedacht, daß ich das ja auch gleich hier hochladen kann. Das habe ich jetzt noch nachgeholt. Übermüdung ... |
AW: RTF - Absatzhintergrund setzen
Die Komponente schau ich mir bei Gelegenheit an, im Moment hänge ich immer noch am Füllmuster fest. Egal, was ich als Maske festlege, Word zeigt mir immer Punkte.
|
AW: RTF - Absatzhintergrund setzen
Bei der ( etwas intensiveren ) Googlesuche fand ich 2 interessante Links, aber ich habe da noch nichts runter geladen :
![]() ![]() Ich werde weiter suchen. Anscheinend gibt es doch schon Komponenten, die weitere Features darstellen können, warum dann nicht auch Absatzhintergründe ? |
AW: RTF - Absatzhintergrund setzen
RichView ist mir vom Namen her geläufig, das ist aber AFAIK von Grund auf selbst geschrieben und basiert nicht auf dem RichEdit von Microsoft.
|
AW: RTF - Absatzhintergrund setzen
Das kann ich so nicht (noch nicht - mal sehen, wann ich dazu komme, es zu laden) bewerten. Auf der Suche nach der neuesten RTF-Spezifikation fand ich lediglich einen offenbar toten Link für 1.9, da tut sich nämlich nichts. Aber vielleicht ist das hier interessant, allerdings offensichtlich "C" :
![]() Ansonsten durchsuche ich noch weiter Google anhand folgender Kriterien : ![]() ![]() |
AW: RTF - Absatzhintergrund setzen
Hier solltest Du die Vers 1.9 finden:
![]() Gruß K-H |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:24 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