Einzelnen Beitrag anzeigen

Benutzerbild von DeddyH
DeddyH

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

AW: RTF - Absatzhintergrund setzen

  Alt 9. Jul 2011, 13:36
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.
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