Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   RichEdit und Delphi XE (https://www.delphipraxis.net/156181-richedit-und-delphi-xe.html)

FrankJ28 23. Nov 2010 07:34

RichEdit und Delphi XE
 
Hallo,
bei der Migration eines Projektes von D2007 auf XE stolpere ich über die andere/falsche Umsetzung des TRichEdit. Bislang kam man über

Delphi-Quellcode:
RichEdit1.Lines.Text

immer an den reinen Text des RichEdit-Controls, mit XE wird mir der RichText-Code ausgeliefert. Hat jemand einen Workaround für mich, wie komme ich jetzt an den PlainText heran?
Danke und ciao
Frank

s.h.a.r.k 23. Nov 2010 09:08

AW: RichEdit und Delphi XE
 
Hab noch nie mit TRichEdit gemacht. Aber vielleicht hilft ja
Delphi-Quellcode:
RichEdit1.Text
!?

FrankJ28 23. Nov 2010 09:11

AW: RichEdit und Delphi XE
 
Hallo Armin,
nö, leider nicht. Darüber sollte der Urcode (RTF) transportiert werden, über die .Lines.Text der reine Textinhalt (Plain). Nicht aber unter XE.
Ciao
Frank

Bummi 23. Nov 2010 09:34

AW: RichEdit und Delphi XE
 
Ich bekomme mit XE mit beiden Varianten den Plaintext
re.lines.Text
re.Text
:?:

s.h.a.r.k 23. Nov 2010 09:36

AW: RichEdit und Delphi XE
 
Das hat aber nicht mit irgendwelchen verschiedenen Versionen zu tun? Ich meine mal was gelesen zu haben.

Lemmy 23. Nov 2010 10:06

AW: RichEdit und Delphi XE
 
Hi,
schon mal mit PlainText true/false probiert?

Grüße

s.h.a.r.k 23. Nov 2010 10:08

AW: RichEdit und Delphi XE
 
Damit wird wohl die Formatierung dauerhaft entfernt!? Zumindest wäre ein temporäres Setzen ja mal mehr als planlos...

FrankJ28 23. Nov 2010 10:11

AW: RichEdit und Delphi XE
 
Hallo ihr Beiden,
tatsächlich ist offensichtlich eine andere Codestelle bei mir dafür verantwortlich.

Delphi-Quellcode:
          RichEdit1.Text:=TxtDataSet1.FieldByName('Memo').AsString;
          MaDataSet1Body.AsString:=RichEdit1.Lines.Text;

Das RichEdit wird aus einer Tabelle zunächst befüllt, das über .Text=.AsString. Offensichtlich tickt das jetzt etwas anders ans unter D2007.

Noch Ideen?
Ciao
Frank

dataspider 23. Nov 2010 10:23

AW: RichEdit und Delphi XE
 
Hi,

also unter Delphi 2007 liefert Lines.Text bei mir den PlainText.
XE Habe ich nicht.
Aber das Setzen vom PlainText ist IMHO schon ein sauberer Weg (siehe Delphi Hilfe).

Ich habe es testweise mal über einen Stream probiert.
SaveToStream z.B. Nutzt TConverter und setzt das Format auf SF_TEXT, wenn PlainText True ist.

Hier das Beispiel über Stream:

Delphi-Quellcode:
procedure TForm11.Button1Click(Sender: TObject);
Var
  AStream: TMemoryStream;
  APlainText: Boolean;
begin
  AStream := TMemoryStream.Create;
  try
    APlainText := RichEdit1.PlainText;
    RichEdit1.PlainText := False;
    try
      RichEdit1.Lines.SaveToStream(AStream);
      AStream.Position := 0;
      Memo1.Lines.LoadFromStream(AStream);
    finally
      if APlainText <> RichEdit1.PlainText then
        RichEdit1.PlainText := APlainText;
    end;
  finally
    AStream.Free;
  end;
end;
Es sollte aber auch genauso über den einfachen Weg mit Lines.Text funktionieren.

Frank

FrankJ28 23. Nov 2010 10:27

AW: RichEdit und Delphi XE
 
Hallo Frank,
die .Text-Variante funktionierte auch mit D2007 wie ich schrieb. Ab XE tickt da aber offensichtlich etwas anders.
Ciao
Frank

dataspider 23. Nov 2010 10:36

AW: RichEdit und Delphi XE
 
Zitat:

Zitat von FrankJ28 (Beitrag 1063478)
Hallo Frank,
die .Text-Variante funktionierte auch mit D2007 wie ich schrieb. Ab XE tickt da aber offensichtlich etwas anders.
Ciao
Frank

Ist schon klar. Aber wenn XE nun tatsächlich anders tickt, dann musst du halt Plaintext vorher setzen.

Frank

[Edit]
Aus dem Source von TRichEdit erkennst du, dass PlainText deinen Text nicht verändert.
SetPlainText setzt nur das Prop PlainText von TRichEditStrings (class(TStrings)).
Nur beim Laden und Speichern vom Text greift es.

Ich sehe also keinen Grund, es nicht zu benutzen (natürlich mit try ... finally...).
[/EDIT]

FrankJ28 23. Nov 2010 12:08

AW: RichEdit und Delphi XE
 
Hallo Frank,
Plaintext bewirkt bei dem CodeSchnipsel nichts. Weder vor Befüllen ein/aus, noch nach Befüllen ein/aus. Schade, wäre ja auch zu einfach
Ciao
Frank

dataspider 23. Nov 2010 13:29

AW: RichEdit und Delphi XE
 
Zitat:

Zitat von FrankJ28 (Beitrag 1063492)
Plaintext bewirkt bei dem CodeSchnipsel nichts. Weder vor Befüllen ein/aus, noch nach Befüllen ein/aus. Schade, wäre ja auch zu einfach

Ich vermute, das Problem liegt woanders. Bei Bummi funktioniert es ja wie erwartet.

Wenn du ein kleines Beispielprogramm machst, könnte man ja testen, ob dass Verhalten je nach IDE oder OS unterschiedlich ist.

Frank

FrankJ28 23. Nov 2010 13:39

AW: RichEdit und Delphi XE
 
Hallo Frank,
mehr sinnvollen Codeschnipsel gibt es nicht. Wie bereits vermutet wird die Grundbetankung des RichEdits via .text aus dem Datenbankfeld offensichtlich anders behandelt als früher. Via Zwischenablage oder deine Idee mit dem Stream klappt es wie erwartet. Die derzeitige (funktionierende) Lösung:

Delphi-Quellcode:
         AStream := TMemoryStream.Create;
          try
           TxtDataSet1Memo.SaveToStream(AStream);
           AStream.Position:=0;
           RichEdit1.Lines.LoadFromStream(AStream);
          finally
           AStream.Free;
          end;
//          RichEdit1.Text:=TxtDataSet1.FieldByName('Memo').AsString;
          MaDataSet1Body.AsString:=RichEdit1.Lines.Text;
Mit diesem Workaround kann ich erst einmal leben. Wissen warum das jetzt anders ist, würde ich aber schon gerne.
Systemeckdaten:
Delphi XE, Servicepack 1
Windows 7 (64)

Ciao und danke
Frank


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:41 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