Delphi-PRAXiS
Seite 1 von 2  1 2      

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 5. Jul 2011 08:27

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:

Style and colors used for background shading. Bits 0 to 3 contain the shading style, bits 4 to 7 contain the foreground color index, and bits 8 to 11 contain the background color index.
Wenn ich das richtig deute, bestimmt somit das niederwertigste Nibble den Stil, das folgende Nibble die Vordergrundfarbe und das wiederum darauf folgende die Hintergrundfarbe laut Tabelle. Versuchen wir also mal Folgendes: Verhältnis Vordergrund/Hintergrund 50%, beide Farben auf Hellgrau, kein Füllstil. Wenn ich das richtig verstehe (und gerade das scheint ja nicht so zu sein), hieße das:
Delphi-Quellcode:
ParaFormat.wShadingWeight := 50;
ParaFormat.wShadingStyle := $0F shl 4 or $0F shl 8; //oder auch gleich $FF shl 4
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?

[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]

p80286 5. Jul 2011 10:08

AW: RTF - Absatzhintergrund setzen
 
Warum machst Du es nicht so:
Delphi-Quellcode:
ParaFormat.wShadingStyle := $0FF0;
Und gefühlt ist $0770 eher Grau oder vllt. $00F0 ?
Ich hab es nicht so mit den Farben.

Gruß
K-H

DeddyH 5. Jul 2011 10:15

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

p80286 5. Jul 2011 11:56

AW: RTF - Absatzhintergrund setzen
 
Mach es doch so wie Word über
Zitat:

\cbpatN N is the background color of the background pattern, specified as an index into the document's color table.
Z.B.
Hellgrau(5%) --> \cbpat17 bei dieser Colortable:
Code:
{\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;}
Gruß
K-H

DeddyH 5. Jul 2011 12:04

AW: RTF - Absatzhintergrund setzen
 
Und wie bekomme ich das hin, ohne auf die Rohdaten zurückzugreifen?

p80286 5. Jul 2011 12:44

AW: RTF - Absatzhintergrund setzen
 
Zitat:

Zitat von DeddyH (Beitrag 1110043)
Und wie bekomme ich das hin, ohne auf die Rohdaten zurückzugreifen?

Das ist eine gute Frage.
Ich hatte es so verstanden, daß Du den RTF-File generierst.

Gruß
K-H

DeddyH 5. Jul 2011 12:49

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

delnu 6. Jul 2011 19:54

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.

DeddyH 7. Jul 2011 07:46

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

delnu 7. Jul 2011 14:17

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.

DeddyH 7. Jul 2011 14:26

AW: RTF - Absatzhintergrund setzen
 
Zitat:

Zitat von delnu (Beitrag 1110593)
Wenn Du was gefunden hast, denke ich mal, daß Du es andere wissen läßt.

Aber selbstverfreilich :zwinker:

p80286 7. Jul 2011 16:23

AW: RTF - Absatzhintergrund setzen
 
Ich habe einmal etwas herum gespielt, mit folgendem Code kann man durchaus Farbmanipulationen durchführen:
Delphi-Quellcode:
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;
Das ist dann das Ergebnis:
Code:
{\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 }
Wobei sich je nach eingegebenem wert die colortbl ändert.
Aber wenn
Delphi-Quellcode:
wShadingStyle:=$x8xx;
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.
(Word2003)

Gruß
K-H

DeddyH 7. Jul 2011 16:46

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?

p80286 7. Jul 2011 17:12

AW: RTF - Absatzhintergrund setzen
 
Das ist eine gute Frage!
das
Code:
{\colortbl ;\red0\green0\blue0;}
ist das Ergebnis von $0800.
wenn ich mich nicht irre ergibt $0F00
Code:
{\colortbl ;\red192\green0\blue192;}
Aber es wird nichts angezeigt!
Die RTF-Doku schreibt
Zitat:

Each definition must be delimited by a semicolon, even if the definition is omitted. If a color definition is omitted, the RTF reader uses its default color. The following example defines the default color table used by Word. The first color is omitted, as shown by the semicolon following the \colortbl control word. The missing definition indicates that color 0 is the ‘’auto’’ color.
{\colortbl;\red0\green0\blue0;\red0\green0\blue255 ;
jetzt weiß ich beim besten Willen nicht wo er anfängt zu Zählen, Ich gehe davon aus, daß in PARAMETER2 die Bits verschoben sind. Noch mehr stört mich allerdings, daß die Anzeige so stur ist. Die ganze Sucherei als letztlich vergebliche Liebesmüh.

Gruß
K-H

DeddyH 7. Jul 2011 18:06

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?

delnu 8. Jul 2011 00:29

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:

DeddyH 8. Jul 2011 07:06

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:

p80286 8. Jul 2011 09:32

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

DeddyH 8. Jul 2011 09:33

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.

p80286 8. Jul 2011 09:40

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?

DeddyH 8. Jul 2011 09:41

AW: RTF - Absatzhintergrund setzen
 
Bunt? Versuch mal $F00F.

p80286 8. Jul 2011 11:43

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

delnu 8. Jul 2011 12:23

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.

DeddyH 8. Jul 2011 12:28

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.

delnu 8. Jul 2011 21:28

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:

DeddyH 9. Jul 2011 12:36

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:
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;
Das ergibt dann folgende Colortable:
Code:
{\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;}
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.

delnu 9. Jul 2011 13:29

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:

Unklar bleibt für mich allerdings weiterhin, wieso das im MSDN so völlig anders beschrieben ist.
Das ist doch typisch für manche Leute, vor allem bei Firmen : Möglichst viel geheim halten und Fehler nur dann zugeben, wenn es gar nicht mehr anders geht. Eventuelle Lösungen konsequent zurückhalten.

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.

DeddyH 9. Jul 2011 13:36

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]

delnu 9. Jul 2011 15:07

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:

Style and colors used for background shading. Bits 0 to 3 contain the shading style, bits 4 to 7 contain the foreground color index, and bits 8 to 11 contain the background color index. To use this member, set the PFM_SHADING flag in the dwMask member. This member is included only for compatibility with Word; the rich edit control stores the value but does not use it to display the text.
und etwas später
Zitat:

The foreground and background color indexes can be one of the following values.
usw.

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.

DeddyH 9. Jul 2011 15:26

AW: RTF - Absatzhintergrund setzen
 
Was mich gerade etwas stutzig macht: der PARAFORMAT2-Record enthält in Delphi folgendes Feld
Zitat:

Delphi-Quellcode:
rgxTabs: array [0..MAX_TAB_STOPS - 1] of Longint;

Laut Winzigweich müsste es aber wohl
Code:
LONG rgxTabs;
->
Delphi-Quellcode:
rgxTabs: LongInt; //das sind immerhin 31 LongInts weniger
//Dummy-Zeile für den Highlighter
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:

[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]

delnu 10. Jul 2011 00:26

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.

DeddyH 10. Jul 2011 08:10

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:

Delphi-Quellcode:
wShadingWeight: Word;      { Shading in hundredths of a per cent    }

1/100%? Dann ist mir klar, wieso so kleine Werte zwischen 1 und 100 keine sichtbare Änderungen brachten und wieso das eine Word ist (bei 100% hätte ja auch Byte genügt). Ich bleibe dran ;)

delnu 10. Jul 2011 10:06

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.

DeddyH 10. Jul 2011 10:32

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

Achja: natürlich kannst Du die Maske erweitern, dementsprechend müssen/sollten dann auch die anderen Felder des Records ausgewertet werden.

delnu 10. Jul 2011 15:13

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 http://www.torry.net/pages.php?id=274, dort nach "Control to RTF Conversion v.1.00" suchen und runterladen. Einen direkteren Link habe ich nicht gesehen.

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

DeddyH 10. Jul 2011 16:53

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.

delnu 10. Jul 2011 23:13

AW: RTF - Absatzhintergrund setzen
 
Bei der ( etwas intensiveren ) Googlesuche fand ich 2 interessante Links, aber ich habe da noch nichts runter geladen :

http://www.wpcubed.com/products/wptools/index.htm
http://www.trichview.com/

Ich werde weiter suchen. Anscheinend gibt es doch schon Komponenten, die weitere Features darstellen können, warum dann nicht auch Absatzhintergründe ?

DeddyH 11. Jul 2011 08:23

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.

delnu 11. Jul 2011 09:36

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" : Writing Your Own RTF Converter

Ansonsten durchsuche ich noch weiter Google anhand folgender Kriterien : "delphi"+"word"+"rtf"+"free"+"source" und "rtf dokumentation"

p80286 11. Jul 2011 10:49

AW: RTF - Absatzhintergrund setzen
 
Hier solltest Du die Vers 1.9 finden:
http://www.microsoft.com/download/en...ng=en&id=10725

Gruß
K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:13 Uhr.
Seite 1 von 2  1 2      

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