![]() |
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] |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:13 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