![]() |
RTF Linespacing speichern und wiederherstellen
Hallo Zusammen,
ich häng an einen kleinen problem ..., wahrscheinlich ist es nur eine kleinigkeit. ich möcht gern ein line spacing im RTF controll setzen, dies speichern und nach dem speichern später wieder anzeigen. das setzen funktioniert einwandfrei... doch, sobald ich das speichere ist wieder das spacing rule 0 aktiv. weiss jemand von euch, wie man das hinbekommt?
Delphi-Quellcode:
Dank und Gruss
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(cxRichEdit1.InnerControl.Handle, EM_SETPARAFORMAT, 0, LParam(@aparaformat2)); end; procedure TForm1.bRestoreClick(Sender: TObject); begin cxRichEdit1.InternalEditValue := aString; end; procedure TForm1.bSaveClick(Sender: TObject); begin aString := cxRichEdit1.InternalEditValue; end; procedure TForm1.FormCreate(Sender: TObject); begin aString := '{\rtf1\ansi\deff0{\fonttbl{\f0\fnil Tahoma;}}' + #$D#$A'\viewkind4\uc1\pard\sl0\slmult0\lang2055\f0\fs16 ' + 'that''s a string with three lines\par'#$D#$A'second\par' + #$D#$A'thirt\par'#$D#$A'and so on\par'#$D#$A'}'#$D#$A#0; cxRichEdit1.InternalEditValue := aString; end; Euer Greeny |
Re: RTF Linespacing speichern und wiederherstellen
*push* :oops:
weiss denn keiner wie man unterschiedliche linespacings im Richedit speichern und anzeigen lassen kann :roll: |
Re: RTF Linespacing speichern und wiederherstellen
Moin, Moin GreenHorn.
Ich denke schon - bei mir funktioniert das mit dem TRichEdit ohne Probleme. Offenbar verwendest du aber eine andere Komponente.
Delphi-Quellcode:
Das ..InnerControl.. kenne ich nicht. Beim "normalen" RichEdit wird hier einfach nur RichEdit.Handle verwendet. Liegt es vielleicht daran? Der übrige Code schaut ok aus, die mir unbekannte Textzuweisung im OnCreate() kann ich nicht beurteilen.
SendMessage(cxRichEdit1.InnerControl.Handle,...
|
Re: RTF Linespacing speichern und wiederherstellen
Hallo TaakTaak,
Dank für deine Mühe, Du hast Recht, es handelt sich um eine andere Komponente, sie verwendet aber das Standard RichEdit (das ist das InnerControl), denn ich selbst schaff es nicht bei einem TRichEdit den Formatierten Text in eine Variable zu speichern und anschliessend zu laden :cry: :cry: Daher habe ich es mal mit einem standard TRichEdit probiert, über den Umweg der Datei, und leider kommt das selbe heraus :?
Delphi-Quellcode:
Kann es sein, dass ich mich einfach nur zu blöd dafür anstelle?
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); begin re.Lines.LoadFromFile(ChangeFileExt(Application.ExeName, '.txt')); end; procedure TForm1.bstoreClick(Sender: TObject); begin re.Lines.SaveToFile(ChangeFileExt(Application.ExeName, '.txt')); end; Dank für Deine Müh. Euer Greeny |
Re: RTF Linespacing speichern und wiederherstellen
Hallo
Wie verhält es sich, wenn du RichEdit2.0 (z.B JVRichEdit) verwendest? |
Re: RTF Linespacing speichern und wiederherstellen
Hallo Toms,
was soll ich sagen :roll: auch das TJvRichEdit speichert mir nicht den Zeilenabstand. Das Verhalten der Komponenten ist somit identisch, nur nicht das, was ich gerne möchte :? Schöne Grüße Greeny |
Re: RTF Linespacing speichern und wiederherstellen
Wie unterscheidet sich der RTF Code des RichEdits vor und nach dem Speichern?
|
Re: RTF Linespacing speichern und wiederherstellen
Zitat:
So ungefähr würde ich versuchen, dem Fehler auf die Schliche zu kommen. HTH |
Re: RTF Linespacing speichern und wiederherstellen
Zitat:
|
Re: RTF Linespacing speichern und wiederherstellen
Guten Morgen,
tja, wie vergleichen? Ich habe jetzt hier 3 Komponenten, wie TRichEdit oder TJvRichEdit und jedes Mal das gleiche Ergebnis. Vielleicht stelle ich mich auch nur blöd an :roll: . Denke von da her wäre es vielleicht ganz gut, ob jemand anderes das Problem auch nach vollziehen kann, ober ob das Problem vor dem Bildschirm sitzt (Greeny). Herzlichen Dank Greeny |
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; |
Re: RTF Linespacing speichern und wiederherstellen
Zitat:
:cheers: |
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. |
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:
Das erklärt nun zwar nicht, wieso es mit LineSpacingRule 1..3 nicht funktioniert, gibt aber eine funktionierende Alternative mit der man arbeiten kann.
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; |
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 14:22 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