Delphi-PRAXiS
Seite 2 von 2     12   

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/)
-   -   Delphi RTF Linespacing speichern und wiederherstellen (https://www.delphipraxis.net/122886-rtf-linespacing-speichern-und-wiederherstellen.html)

toms 26. Okt 2008 08:12

Re: RTF Linespacing speichern und wiederherstellen
 
Ich meinte du könntest den RTF Code vorher und nachher auslesen und dann vergleichen.


Delphi-Quellcode:
function GetRTFText(RichEdit: TRichedit): string;
var
  s: string;
  Stream: TStringStream;
begin
  s := '';
  Stream := TStringStream.Create(s);
  try
    RichEdit.PlainText := False;
    RichEdit.Lines.SaveToStream(Stream);
    Result := Stream.DataString;
  finally
    Stream.Free
  end;
end;

hamburcher 26. Okt 2008 08:29

Re: RTF Linespacing speichern und wiederherstellen
 
Zitat:

Zitat von toms
Ich meinte du könntest den RTF Code vorher und nachher auslesen und dann vergleichen.


Delphi-Quellcode:
function GetRTFText(RichEdit: TRichedit): string;
var
  s: string;
  Stream: TStringStream;
begin
  s := '';
  Stream := TStringStream.Create(s);
  try
    RichEdit.PlainText := False;
    RichEdit.Lines.SaveToStream(Stream);
    Result := Stream.DataString;
  finally
    Stream.Free
  end;
end;

Sind wir nicht wieder bei #9 in einer Schleife?
:cheers:

GreenHorn3600 26. Okt 2008 08:47

Re: RTF Linespacing speichern und wiederherstellen
 
Mhhh,

wenn ich das so mache, dann zeigt mir das RTF (beim Load) gar nix mehr an :cry:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, richedit, StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    bStore: TButton;
    bLoad: TButton;
    bFormat: TButton;
    re: TRichEdit;
    procedure bStoreClick(Sender: TObject);
    procedure bLoadClick(Sender: TObject);
    procedure bFormatClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    aString: string;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.bFormatClick(Sender: TObject);
var
  aparaformat2 : TParaFormat2;
begin
  ZeroMemory(@aparaformat2, sizeof(aparaformat2));
  aparaformat2.cbSize := SizeOf(aparaformat2);
  aparaformat2.dwMask := PFM_LINESPACING;
  aparaformat2.bLineSpacingRule := 2;
  SendMessage(re.Handle, EM_SETPARAFORMAT, 0, LParam(@aparaformat2));
end;

procedure TForm1.bLoadClick(Sender: TObject);
var
  ss: TStringStream;
begin
  ss := TStringStream.Create;
  try
    ss.WriteString(aString);
    re.Lines.LoadFromStream(ss);
  finally
    ss.Free;
  end;
// re.Lines.LoadFromFile(ChangeFileExt(Application.ExeName, '.txt'));
end;

procedure TForm1.bStoreClick(Sender: TObject);
var
  ss: TStringStream;
begin
  ss := TStringStream.Create;
  try
    re.Lines.SaveToStream(ss);
    aString := aString;
  finally
    ss.Free;
  end;
// re.Lines.SaveToFile(ChangeFileExt(Application.ExeName, '.txt'));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  re.PlainText := false;
end;

end.

taaktaak 26. Okt 2008 12:31

Re: RTF Linespacing speichern und wiederherstellen
 
Moin, Moin.

Habe mir das jetzt mal im Detail angesehen und muss gestehen, dass ich es auch mit dem "normalen" RichEdit nicht hinbekomme. Egal ob direktes Speichern oder indirekt über den Umweg mit einem MemoryStream. Nach dem Laden ist die Formatierung verschwunden. Ob die Formatierung überhaupt gespeichert wird, habe ich nicht untersucht.

Wenn ich nun in #3 geschrieben habe, dass es bei mir ohne Probleme funktioniert, dann stützt sich diese Bemerkung darauf, dass in einem meiner Programme die Zeilenabstände verändert werden können und diese Formatierung auch nach dem Wiedereinlesen wieder angezeigt wird. Wieso?

Nach kurzer Suche hier die Lösung: Ich verwende LineSpacingRule=4 und stelle das LineSpacing in Twips ein, nutze also nicht die Auswahl 1 / 1,5 / 2-zeilig. Ist zwar ein wenig umständlicher, erfüllt aber seinen Zweck.

Delphi-Quellcode:
procedure reSetLineSpacing(re:TRichEdit;LineSpacing:LongInt);
var PF2 : TParaFormat2;
begin
  FillChar(PF2,SizeOf(PF2),0);

  with PF2 do begin
    cbSize         :=SizeOf(PF2);
    dwMask         :=PFM_LineSpacing;
    bLineSpacingRule:=4;
    dyLineSpacing  :=LineSpacing; // in twips > 567 twips = 1 cm
    end;

  SendMessage(re.Handle,EM_SetParaFormat,0,LParam(@PF2));
end;
Das erklärt nun zwar nicht, wieso es mit LineSpacingRule 1..3 nicht funktioniert, gibt aber eine funktionierende Alternative mit der man arbeiten kann.

GreenHorn3600 26. Okt 2008 13:13

Re: RTF Linespacing speichern und wiederherstellen
 
Hallo TaakTaak,

das funktioniert wunderbar :lol: ich persönlich hänge da nicht so sehr an den LineSpacingRoule 1, 2, 3. Hauptsache ist, dass das Spacing vernünftig dargestellt und auch nach dem Abspeichern wieder vernünftig hergestellt wird. Da ein TWIPs 1/20 Punkt ist, und 1 Zeilig 120%, 1.5 Zeilig 150% und 2 Zeilig 200% der Fonthöhe ist, ist die Berechnung ja auch nicht so dramatisch 8)

Schöne Grüsse an die WaterKant
Greeny

:cheers: :cheers: :cheers:


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

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