Delphi-PRAXiS

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 zwei RichEdits zusammenführen (https://www.delphipraxis.net/51271-zwei-richedits-zusammenfuehren.html)

spacewolf 9. Aug 2005 15:47


zwei RichEdits zusammenführen
 
Hallöchen :P,

Ich versuche gerade zwei RichEdits zusammenzuführen... besser gesagt den Inhalt, sammt Formatierung in
das andere RichEdit mit zuübernehmen. Dabei musste ich leider feststellen, das der Inhalt, aber nicht die Formatierung,
mit übernommen wird. :gruebel:

Delphi-Quellcode:
procedure Merge(var dest,source : TRichEdit);
begin
  with dest do
  begin
    Lines.Add(source.Text);
  end;
end;
Mein suchen in der Delphi-Hilfe hat mich diesmal nicht viel schlauer gemacht :roll:

euer Andreas

mschaefer 9. Aug 2005 16:24

Re: zwei RichEdits zusammenführen
 
Delphi-Quellcode:
R1.lines.Text := R1.lines.Text + R2.lines.Text;
/Edit: Sorry: geht tatsächlich verloren /Edit

Grüße // Martin

Luckie 9. Aug 2005 16:36

Re: zwei RichEdits zusammenführen
 
auch da wird wohl die Formatierung verloren gehen. Ich würde es mit der Stream Eigenschaft versuchen.

spacewolf 9. Aug 2005 18:13

Re: zwei RichEdits zusammenführen
 
ähh wie über die Streameigenschaften ????

Flocke 9. Aug 2005 18:30

Re: zwei RichEdits zusammenführen
 
Etwa so:
Delphi-Quellcode:
strm := TMemoryStream.Create;
try
  RichEdit1.Lines.SaveToStream(strm);
  strm.Position := 0;
  RichEdit2.Lines.LoadFromStream(strm);
finally
  strm.Free;
end;
[Nachtrag]

Allerdings kannst du so nur vollständig ersetzen und nichts anfügen. Alternativ musst du mit EM_STREAMIN arbeiten, dazu siehst du dir am besten in ComCtrls.pas die Routine TRichEditStrings.LoadFromStream an.

[Noch'n Nachtrag]

Wie das geht steht in diesen Thread, hier noch einmal die Essenz:
Delphi-Quellcode:
uses
  RichEdit;

// Hilfsroutine für AddRtfFromStream
function _AddRtfCallback(dwCookie: Longint; pbBuff: PByte;
  cb: Longint; var pcb: Longint): Longint; stdcall;
begin
  try
    Result := 0;
    pcb := TStream(dwCookie).Read(pbBuff^, cb);
  except
    Result := 1;
  end;
end;

// Ersetzt die aktuelle Auswahl durch den Inhalt des Streams
procedure AddRtfFromStream(RichEditHandle: THandle; Stream: TStream);
var EditStream: TEditStream;
begin
  EditStream.dwCookie := LongInt(Stream);
  EditStream.dwError := 0;
  EditStream.pfnCallback := @_AddRtfCallback;

  SendMessage(RichEditHandle, EM_STREAMIN, SF_RTF + SFF_SELECTION, LongInt(@EditStream));
  if EditStream.dwError <> 0 then
    raise Exception.Create('RichEdit operation fehlgeschlagen!');
end;
und dann:
Delphi-Quellcode:
strm := TMemoryStream.Create;
try
  RichEdit1.Lines.SaveToStream(strm);
  strm.Position := 0;
  AddRtfFromStream(RichEdit2.Handle, strm);
finally
  strm.Free;
end;

spacewolf 11. Aug 2005 09:25

Re: zwei RichEdits zusammenführen
 
is ja super... Aber was ist TEditStream ??? :gruebel:

SebE 11. Aug 2005 09:29

Re: zwei RichEdits zusammenführen
 
Ich weis nicht genau, aber geht das, wenn man die Eigenschaft PlainText auf TRUE setzt?

und dann:

Delphi-Quellcode:
R1.lines.Text := R1.lines.Text + R2.lines.Text;
Is nur ne Idee -> hab's nicht getestet

Flocke 11. Aug 2005 09:39

Re: zwei RichEdits zusammenführen
 
Zitat:

Zitat von spacewolf
is ja super... Aber was ist TEditStream ??? :gruebel:

Ist definiert in "RichEdit.pas", die Datei ist bei Delphi dabei!

Da stehen nicht die Definitionen von TRichEdit drin (das ist in "ComCtrls.pas" deklariert), sondern die API-Sachen für's RichEdit-Control (Strukturen usw.)

spacewolf 11. Aug 2005 09:46

DANKE jetzt gehts
 
in einem anderen Beitrag stand es:

Delphi-Quellcode:
  // These declarations are wrong in richedit.pas, the stdcall is missing.
  TEditStreamCallBack = function (dwCookie: Longint; pbBuff: PByte;
    cb: Longint; var pcb: Longint): Longint; stdcall;

  TEditStream = record
    dwCookie: Longint;
    dwError: Longint;
    pfnCallback: TEditStreamCallBack;
  end;
JETZT funktioniert es !!! DANKE EUCH, das is krazz... :dp:


also das mit dem Plain Text ? Ähm, hab ich noch gar net bedacht... aber ich glaube, dann muss man neu laden...
ich glaub ich wollt mal den RichEdit Source life anzeigen und so per Tags bearbeiten, so wie im HTML aber mit dem Plain, das ging net so recht, wenn ich mich recht erinnere... (aber ich beSchwörs net - ist lang her) :stupid:


bin jetzt froh :bouncing4: das der krempel geht und das mein Programm endlich die Briefchen erzeugen kann...
so wie es das vorher auch konnte, nur eben ohne Formatierung...

jippii yaaeehh... so n fetter Buchstabe drin, das macht schon spaß :coder:

euer Andreas sagt [b] DANKE [b] :spin2:

PS: vielleicht könnt wir die Lösung mal in die [b]CodeLibrary[&b] einfügen... Wer darf das eigendlich ?
PPS: wenn das hier alls richtig funzt, wie ich hoffe, dann muss ich unbedingt, das veröffentlichen...
word, openoffice und rtf alles in einem griff ;-) nur sind meine funktionen im Moment noch undurchsichtig
und undokumentiert und nicht fehlerfrei... vielleicht darf ich das dann in die CodeLibrary stellen (doch ist ja nicht von mir
ist ja nur zusammengestellt und verändert, ge- und verbastelt... naja, mal schauen - so Gott will und ich lebe und es alles funktioniert... ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:38 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 by Thomas Breitkreuz