Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Hilfe, meine RichEdit-Komponente übernimmt Formatierungen !


Hochhaus - Mo 03.12.12 19:41
Titel: Hilfe, meine RichEdit-Komponente übernimmt Formatierungen !
Hallo allerseits !

für meinen Texteditor habe ich die RichEdit-Komponente verwendet. Soweit, so gut. Normalerweise funktioniert dies problemlos mit Textdateien. Wenn ich nun aber formatierten Text (z.Bsp. Fettdruck) aus dem Web hineinkopiere, kommen die Formatierungen mit hinein in den Text.

Wie kann ich dies ändern ? Ich will nur Text speichern und kein Zugemüse.

Vielen Dank für Eure Hilfe !


Hochhaus


Moderiert von user profile iconNarses: Topic aus VisualCLX (Component Library for Cross Platform) verschoben am So 09.12.2012 um 22:04


Gerd Kayser - Mo 03.12.12 19:55

user profile iconHochhaus hat folgendes geschrieben Zum zitierten Posting springen:
Ich will nur Text speichern und kein Zugemüse.



Delphi-Quelltext
1:
RichEdit.PlainText := true;                    


Oder im Objektinspektor setzen.


Hochhaus - Mo 03.12.12 19:59

Das habe ich schon probiert ! Dann enthält meine leere Datei plötzlich chinesische Schriftzeichen ( Bug in Delphi)

Gruss,


Hochhaus


Gerd Kayser - Mo 03.12.12 20:23

user profile iconHochhaus hat folgendes geschrieben Zum zitierten Posting springen:
Dann enthält meine leere Datei plötzlich chinesische Schriftzeichen ( Bug in Delphi)

Dann halt den Text aus der Zwischenablage mit


Delphi-Quelltext
1:
SendMessage(RichEdit1.Handle, EM_PasteSpecial, CF_Text, 0);  // uses RichEdit                    


einfügen.

Siehe hierzu auch: http://mc-computing.com/languages/RichEdit.htm (ziemlich in der Mitte)


Hochhaus - Mo 03.12.12 20:32

---> [DCC Fehler] CHILD.PAS(212): E2003 Undeklarierter Bezeichner: 'EM_PasteSpecial'

Was nun ?


Gerd Kayser - Mo 03.12.12 20:35

user profile iconHochhaus hat folgendes geschrieben Zum zitierten Posting springen:
---> [DCC Fehler] CHILD.PAS(212): E2003 Undeklarierter Bezeichner: 'EM_PasteSpecial'


"uses RichEdit". Hatte ich aber oben geschrieben.


Hochhaus - Mo 03.12.12 20:50

Ok ! Super ! Die Formatierungen sind jetzt weg. Aber die Datei ist immer noch nicht ausführbar und grösser als sie sein sollte. Siehe Beilage !

Hochhaus


Gerd Kayser - Mo 03.12.12 21:23

user profile iconHochhaus hat folgendes geschrieben Zum zitierten Posting springen:
Aber die Datei ist immer noch nicht ausführbar und grösser als sie sein sollte.

Kein Wunder, wenn man die Datei im RTF-Format abspeichert ...

Versuche es mal so:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
  Richedit1.PlainText := false;
  RichEdit1.Lines.LoadFromFile('e:\iconx.rtf');
  
  // speichern als normale Textdatei
  Richedit1.PlainText := true;
  RichEdit1.Lines.SaveToFile('e:\iconx.bat');


jaenicke - Mo 03.12.12 21:33

user profile iconHochhaus hat folgendes geschrieben Zum zitierten Posting springen:
Das habe ich schon probiert ! Dann enthält meine leere Datei plötzlich chinesische Schriftzeichen ( Bug in Delphi)
Den hatte ich ja gemeldet:
http://qc.embarcadero.com/wc/qcmain.aspx?d=105991
Eigentlich sollte es aber gehen, wenn man alles zur Laufzeit setzt, zumindest ging bei mir dann alles.

Und wenn du für den Eintrag votest, wird er vielleicht auch schneller behoben. ;-)


Hochhaus - Mo 03.12.12 21:33

--> Gerd Kayser

Aber das tue ich ja schon !


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
Procedure TFrmChild.SaveToFile(S: String);
Begin
     RichEdit1.Cursor := crHourGlass;
     Try
       RichEdit1.PlainText := True;
       RichEdit1.Lines.SaveToFile(S);
       RichEdit1.Modified := False;
     Finally
       RichEdit1.Cursor := crDefault;
     End;
End{* SaveToFile *}


Hochhaus

P.S. Da sind noch mehr Bugs im RichEdit drin, glaube ich ... ...


jaenicke - Mo 03.12.12 22:19

Ich selbst habe in einem Editorprojekt TRichEdit auch ausschließlich für RTF-Texte verwendet. Alles andere läuft da bei mir mit SynEdit. ;-)


Hochhaus - Di 04.12.12 08:11

Wie ich gesehen habe, ist die estellte Datei exakt doppelt so gross wie eine reine Textdatei. (FED.EXE mit Delphi XE2 erstellt) Falls das Editorprojekt mit Delphi 6 erstell wird, hat die Textdatei die richtige Grösse.

Gruss,

Hochhaus


WasWeißDennIch - Di 04.12.12 09:18

UTF-16 = 2 Byte je Zeichen, Ansi = 1 Byte je Zeichen. Delphi ab 2009 verwendet Ersteres, Du musst also konvertieren.


Hochhaus - Di 04.12.12 10:11

user profile iconWasWeißDennIch hat folgendes geschrieben Zum zitierten Posting springen:
UTF-16 = 2 Byte je Zeichen, Ansi = 1 Byte je Zeichen. Delphi ab 2009 verwendet Ersteres, Du musst also konvertieren.


Ok. Und wie konvertiere ich von UTF nach ANSI ?

Hochhaus


jaenicke - Di 04.12.12 10:12

user profile iconHochhaus hat folgendes geschrieben Zum zitierten Posting springen:
Wie ich gesehen habe, ist die estellte Datei exakt doppelt so gross wie eine reine Textdatei. (FED.EXE mit Delphi XE2 erstellt) Falls das Editorprojekt mit Delphi 6 erstell wird, hat die Textdatei die richtige Grösse.
Was heißt richtige Größe? Du hast dort wie user profile iconWasWeißDennIch geschrieben hat, Unicode. Bei Delphi 6 kannst du z.B. chinesische Zeichen gar nicht darstellen, deshalb brauchst du da weniger Platz.

user profile iconHochhaus hat folgendes geschrieben Zum zitierten Posting springen:
Ok. Und wie kovertiere ich von UTF nach ANSI ?
Eine Konvertierung in Ansi macht nur Sinn, wenn man auch wirklich dieses Format braucht. Ein Editor sollte dies normalerweise als Option anbieten, siehe Notepad von Windows oder Notepad++...
Aber standardmäßig macht es keinen Sinn auf Unicode zu verzichten...


Hochhaus - Di 04.12.12 10:16

Von mir aus gesehen macht es schon Sinn: Nur als reiner Text sind .BAT-Dateien auch ausführbar ...! Im Unicode dagegen hagelt es Fehlermeldungen.

Gruss,


Hochhaus

Wie ich gesehen habe, werden nur neu erstellte Dateien im Unicode gespeichert. Bestehende Textdateien (Ansi) behalten ihr Format.


jaenicke - Di 04.12.12 11:04

Für Batchdateien ist das natürlich richtig, ja. Wenn es um die geht, müssen die umgewandelt werden. Am einfachsten indem du TStringList nimmst und dort beim Speichern als zweiten Parameter die passende Kodierung angibst.


WasWeißDennIch - Di 04.12.12 11:09

Mit einem TStringStream müsste es auch gehen, aber die Stringliste ist weniger Tipparbeit :)

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
var
  sl: TStringlist;
begin
  DeinRichEdit.PlainText := true;
  sl := TStringlist.Create;
  try
    sl.Assign(DeinRichEdit.Lines);
    sl.SaveToFile(DeinDateiname, TEncoding.Default);
  finally
    sl.Free;
  end;
end;


Hochhaus - Di 04.12.12 11:12

Verstehe ich das richtig: Mit einem RichEdit geht das nicht ? Weshalb kann dann das RichEdit bestehende Ansi-Dateien nach einer Änderung im Text wierder als Ansi speichern ? Nur neue Dateien werden als Unicode abgelegt.


Hochhaus

Soeben habe ich das ausprobiert mit einem Richedit: Es funktioniert !

Code:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
Procedure TFrmChild.SaveToFile(S: String);
Begin
     RichEdit1.Cursor := crHourGlass;
     Try
       RichEdit1.PlainText := True;
       RichEdit1.Lines.SaveToFile(S, TEncoding.Default);
       RichEdit1.Modified := False;
     Finally
       RichEdit1.Cursor := crDefault;
     End;
End{* SaveToFile *}


Hochhaus

Moderiert von user profile iconNarses: Beiträge zusammengefasst

Welche Werte kann der Wert "TEncoding" haben ? Wo findet man entsprechende Hinweise ?

Gruss,


Hochhaus


WasWeißDennIch - Di 04.12.12 14:12

"TEncoding." eintippen und etwas warten oder CTRL-SPACE drücken ;). Alternativ in der Online-Hilfe nachlesen oder per STRG-linke Maustaste nach SysUtils abspringen (AFAIK nicht in der Starter-Edition).


Hochhaus - Di 04.12.12 17:20

Danke !! Ich habe in diesem Forum sehr viel konstruktives Helfen erfahren. 99 % der Tips waren sehr hilfreich !

Hochhaus