Autor Beitrag
Eddie
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 58

WinXP SP2
Delphi 5 Standard,Delphi 2005 Architect
BeitragVerfasst: Fr 04.11.05 16:59 
Hi

ich habe zwei Richedits auf einer Form und in beiden steht etwas drin. Jetzt möchte ich den Text aus dem zweiten Richedit mit formatierung an das erste Richedit anhängen ohne dass der Text des ersten verloren geht und beide Texte untereinander stehen.

Bei meiner suche hier im Forum hab ich folgendes gefunden:
- www.delphi-forum.de/...p;highlight=richedit
- www.delphi-forum.de/...;highlight=%2Astream

Bei beiden Methoden wird aber der Text des ersten Richedits überschrieben.
Wie kann ich aber den Text nur anhängen?

_________________
Der Programmierer ist nur ein Tool, dass Koffein in Code konvertiert.
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: Fr 04.11.05 19:38 
Hallo,

wenn das nur ab Windows 2000 bzw. XP funktionieren muss,
dann hast Du mit dem Link schon die halbe Miete.
- www.delphi-forum.de/...;highlight=%2Astream

Du brauchst die dort enthaltene Funktion GetRTFFromRichEdit und folgenden Code:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var s : String;
begin
  RichEdit1.Lines.LoadFromFile('c:\@archiv\Tabelle.rtf');
  RichEdit2.Lines.LoadFromFile('c:\@archiv\Tabfarbe.rtf');
  s := GetRTFFromRichEdit(RichEdit2);
  RichEdit1.SelStart := Length(RichEdit1.Text);
  RichEdit1.SelText := s;


Sollte das nicht funktionieren, es gibt noch andere Möglichkeiten :wink:

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Fr 04.11.05 20:13 
Wenn man mit einem Stream die Lines-Eigenschaft des RichEdit Controls ausliest/beschreibt bekommt man die Formatierungen. Zweckmäßigerweise geht das mit einem TStringstream:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
Var
  s : TStringStream;

Begin
  s := TStringStream.create;
  Try
    MyRichEdit.Lines.SaveToStream (s);
    ShowMessage('Rich Text formatted stuff:'+s.DataString);
  Finally
    S.Free;
  End;
End;

_________________
Na denn, dann. Bis dann, denn.
Rolf_Geisler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 16

WIN XP
D7 Prof
BeitragVerfasst: Fr 04.11.05 21:48 
Habe da noch eine einfachere Möglichkeit gefunden: Das Clipboard.

ausblenden Quelltext
1:
2:
3:
    RichEdit1.SelectAll;
    RichEdit1.CopyToClipBoard;
    RichEdit2.PasteFromClipBoard;


hängt den Inhalt von RichEdit1 samt Formatierung an den Inhalt von RichEdit2 an. Funktioniert jedenfalls in D7. Mit Streams habe ich eine Weile erfolglos rumexperimentiert. Konnte zwar die beiden Felder zu einem gemeinsamen Text zusammenfassen, einschließlich Formatierung, aber nach RichEdit2.Lines.LoadFromStream(Stream) war das Zielfeld leer :-(.

MfG Rolf
Eddie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 58

WinXP SP2
Delphi 5 Standard,Delphi 2005 Architect
BeitragVerfasst: Fr 04.11.05 22:56 
Vielen Dank für die Antworten. Das mit den Streams hat bei mir auf anhieb funktioniert.

Eine Frage hätte ich da noch: Funktioniert das mit den Streams wirklich nur ab Win2000/XP? Wenn ja, gibt es noch eine andere Lösung, außer das mit dem Clipboard? Ich hab so eine Sperre einprogrammiert, dass nichts aus der Zweischenablage in das Programm kopiert werden kann.

_________________
Der Programmierer ist nur ein Tool, dass Koffein in Code konvertiert.
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: Sa 05.11.05 01:40 
Hallo,

@user profile iconalzaimar
das entspricht genau der Funktion GetRTFFromRichEdit (Direkt-Link)

user profile iconRolf_Geisler hat folgendes geschrieben:
Habe da noch eine einfachere Möglichkeit gefunden: Das Clipboard.

Würde mich -als Anwender- bedanken, wenn ein Programm meine Inhalte in der Zwischenablage überschreibt.
user profile iconRolf_Geisler hat folgendes geschrieben:
aber nach RichEdit2.Lines.LoadFromStream(Stream) war das Zielfeld leer :-(.

Vermute das Du die Stream-Position nicht richtig gesetzt hast:
ausblenden Delphi-Quelltext
1:
2:
3:
   Stream.Seek(soFromBeginning,0);//<-------
   RichEdit2.PlainText := False;
   RichEdit2.Lines.LoadFromStream(Stream);


user profile iconEddie hat folgendes geschrieben:
Eine Frage hätte ich da noch: Funktioniert das mit den Streams wirklich nur ab Win2000/XP? Wenn ja, gibt es noch eine andere Lösung, außer das mit dem Clipboard? Ich hab so eine Sperre einprogrammiert, dass nichts aus der Zweischenablage in das Programm kopiert werden kann.
Streams haben bzgl. älteren Betriebssystemen, soweit ich weis, keine Einschränkungen.
Das Problem liegt in der Zeile begraben:
ausblenden Delphi-Quelltext
1:
RichEdit1.SelText := s;					
Dort wird an Seltext der aus RichEdit per Stream geladene Rtf-Code zugewiesen.
Die Interpretation des Rtf-Codes wird durch die dem Betriebssystem zugehörige riched32.dll ausgeführt und dann in den Rtf-Code des Ziel-Richedits integriert.
Die ältere riched32.dll z.B. bei NT kann das nicht, der RTF-Code wird nicht interpretiert, sondern als Plaintext angezeigt:
ausblenden Quelltext
1:
{\rtf1\ansi\ansicpg1252\uc1 \deff0\deflang103					

Deshalb vermute ich das ein Umweg über das Clipboard auch nur ab Win2000/XP funktioniert(muss ich mal testen).

Eine Lösung die auch unter z.B. NT funktioniert hat user profile iconFlocke in der Delphi-Praxis vorgestellt:
function _AddRtfCallback

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
Eddie Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 58

WinXP SP2
Delphi 5 Standard,Delphi 2005 Architect
BeitragVerfasst: Sa 05.11.05 20:14 
user profile iconLannes hat folgendes geschrieben:
Eine Lösung die auch unter z.B. NT funktioniert hat user profile iconFlocke in der Delphi-Praxis vorgestellt: function _AddRtfCallback

Das hab ich mal ausprobiert. Es hat irgendeine Fehlermeldung in Delphi aufgebracht. (Da würd ich mich aber jetzt nicht ganz nach richten. Ich bekomme unter Windows und Delphi in letzter Zeit öfter mal Fehlermeldungen) :wink:

Aber auf der Seite schreibt "meierotto", dass er mit dem Jedi-RichEdit arbeitet. Ist das bei den Jedi-VCL Komponenten dabei? Würde das nicht unabhängig von der Win-Version funktionieren?

_________________
Der Programmierer ist nur ein Tool, dass Koffein in Code konvertiert.
Rolf_Geisler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 16

WIN XP
D7 Prof
BeitragVerfasst: So 06.11.05 15:12 
Hi,
ich muss noch mal auf Lannes' Kommentar vom 5.11. 00:40 zurückkommen. Something seems to go wrong ...

1. OK, die Position im Stream war nicht gesetzt ...
2. ... aber auch nach Stream.Seek(..) habe ich nicht, was Eddie will.

Variante 1
Wenn ich einfach RichEdit1.Lines auf den Stream sichere und von RichEdit2.Lines einlesen lasse, vergißt RichEdit2 seinen gesamten bisherigen Inhalt und ersetzt ihn durch den Stream, also RichEdit1. Sagt auch die online-Hilfe. Oder gibt's da noch was Besonderes?

Variante 2
Wenn ich die beiden RichEdits auf dem Stream zusammenfasse und dann als Paket von RichEdit2 einlesen lasse, klappts auch nicht. Im Stream stehen nämlich nach dem zweifachen SaveToStream zwei komplette RTF-Pakete. Nach dem Einlesen steht in RichEdit2 nur das zweite RTF-Paket aus dem Stream.
Wie das bei mir aussieht, habe ich als Dateianhang angehängt. Vielleicht hat jemand eine Idee ...

Nur bei CopyToClipboard / PasteFromClipboard hat RichEdit2 den Inhalt von RichEdit1 an RichEdit2 korrekt angehängt. Also, gibt's da noch was Spezielles für Streams im Zusammenhang mit RTF-Text?

Mfg Rolf
Einloggen, um Attachments anzusehen!
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: So 06.11.05 21:59 
Hallo,

zu Variante 1:
Das ist klar, LoadFromStream(Stream), ersetzt den Inhalt des RichEdit.
Dazu gibt es nichts Besonderes zu sagen.

zu Variante 2:
Ich weis nicht wie Du die Streams zusammensetzt, mir ist aufgefallen das zweimal das gleiche vorhanden ist.
Hier der betreffende Auszug aus Deinem Anhang:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
{\rtf1\ansi\ansicpg1252\deff0\deflang1031
{\fonttbl{\f0\fnil MS Sans Serif;}}
\viewkind4\uc1\pard\f0\fs20 RichEdit1\par \par }
{\rtf1\ansi\ansicpg1252\deff0\deflang1031
{\fonttbl{\f0\fnil MS Sans Serif;}}
\viewkind4\uc1\pard\f0\fs20 RichEdit1\par \par }
user profile iconRolf_Geisler hat folgendes geschrieben:
Nach dem Einlesen steht in RichEdit2 nur das zweite RTF-Paket aus dem Stream.
Bist Du sicher das es das zweite Paket aus dem Stream ist?

Der RTF-Reader beachtet die geschweiften Klammern, wenn alle geschlossen sind, wird nicht weiter interpretiert.
Hab sie farblich markiert, damit es deutlich wird.
    {\rtf1\ansi\ansicpg1252\deff0\deflang1031
    {\fonttbl{\f0\fnil MS Sans Serif;}}
    \viewkind4\uc1\pard\f0\fs20 RichEdit1\par \par }
    //alles danach wird nicht eingelesen
    {\rtf1\ansi\ansicpg1252\deff0\deflang1031
    {\fonttbl{\f0\fnil MS Sans Serif;}}
    \viewkind4\uc1\pard\f0\fs20 RichEdit1\par \par }

Aus diesem Grund ist es nicht möglich die Inhalte zweier Richedits incl. der Formatierungen aneinanderzuhängen.

Mit PasteFromClipboard fügst Du den Inhalt der Zwischenablage an der Cursorposition ein,
und er wird interpretiert.
Das ist gleichzusetzen mit:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
s := '{\rtf1\ansi\ansicpg1252\deff0\deflang1031' 
     +'{\fonttbl{\f0\fnil MS Sans Serif;}}' 
     +'\viewkind4\uc1\pard\f0\fs20 Dieser Text ist neu hinzugekommen\par \par }';
RichEdit1.SelText := s;


Hast Du den Code getestet der bei user profile iconEddie funktioniert hat?
Ich hab in nochmal zusammengefasst:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure RichEditAddRichEdit(ZielRE,QuelleRE: TRichEdit);
var StrS : TStringStream;
    s : String;
begin
  StrS := TStringStream.Create('');
  try
    QuelleRE.Lines.SaveToStream(StrS);
    s := StrS.DataString;
    ZielRE.SelStart := Length(ZielRE.Text);
    ZielRE.SelText := s;
  finally
    StrS.Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  //der Inhalt von RichEdit2 -incl. der Formatierungen-
  //wird an RichEdit1 angehängt
  RichEditAddRichEdit(RichEdit1,RichEdit2);
end;


:!: Der Code funktioniert erst ab win2000/XP :!:

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
Rolf_Geisler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 16

WIN XP
D7 Prof
BeitragVerfasst: Sa 12.11.05 19:48 
Hi,

danke. Jetzt ist alles klar. Wenn ich Dein Code-Beispiel vom 4.11. gleich richtig gelesen hätte, hätte ich nicht so ewig herumexperimentieren müssen. SaveToStream ist logischerweise der Weg in den Stream hinein, aber heraus führt nicht LoadFromStream, sondern der DataString.

Vielen Dank noch mal für die Klarstellung. Gruß Rolf