Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - RichEdit - CharSet erzwingen
Don Krawallo - Mo 01.10.12 20:05
Titel: RichEdit - CharSet erzwingen
Schönen guten Abend die Herren der Schöpfung.
Ich habe mitlerweile meinen eigenen NFO Viewer geschrieben. Erste Gehversuche machte ich mit einer Memo Box. Schnell kam jedoch das Problem der Url Detection auf. Gezwungenermaßen hab ich das Ganze auf ein TRichEdit umgestellt. Die Anwendung bzw. der Viewer ist auch funktionabel aber es gibt da ne Sache die mich stört.
Ich hoffe/denke mal das ich nicht erläutern brauch was NFO Dateien sind. NFO Dateien sind im wesentlichen simple ASCII Arts.
Nun aber zum besagten Problem. Im OnCreate Ereignis der MainForm deklariere ich die Schriftart (Terminal), Größe und das CharSet (OEM/DOS) der RichEdit Komponente. Mit der Anwendung liefere ich eine eigene Schrift mit, aber standardmäßig wird die Schriftart Terminal genutzt. Per OpenDialog lass ich den Inhalt einer NFO Datei einlesen. Und zwar folgendermaßen...
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TDropForm.Open1Click(Sender: TObject); begin if OpenDialog1.Execute then begin RichEdit1.Clear; LastUsed:= OpenDialog1.FileName; Richedit1.Lines.LoadFromFile (OpenDialog1.FileName); end; end; |
Nach ausführen dieses Codeschnipsels wird allerdings das CharSet des RichEdits geändert. Füge ich da nach RichEdit1.Lines.LoadFromFile (...) die Anweisung RichEdit1.Font.Charset:= OEM_CharSet ein dann bleibt die Schrift unverändert. Änder ich die Prozedur allerdings folgendermaßen, dann wird die NFO richtig dargestellt.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TDropForm.Open1Click(Sender: TObject); begin if OpenDialog1.Execute then begin RichEdit1.Clear; LastUsed:= OpenDialog1.FileName;
RichEdit1.Font.Charset:= Default_CharSet; Richedit1.Lines.LoadFromFile (OpenDialog1.FileName); RichEdit1.Font.Charset:= OEM_CharSet; end; end; |
Bei einem TMemo funktioniert alles problemlos, aber eben ohne URL Detection. Das oben beschriebene Problem findet sich auch bei der RichEdit Komponente der Jedi Library. Meine Frage diesbezüglich - Muss ich jetzt quasi mit diesem Umstand leben oder gibt es eine Möglichkeit das CharSet zu erzwingen? Denn bei etwas größeren NFO Dateien bemerkt ein geschultes Auge definitiv die Situation das die NFO erst nicht korrekt dargestellt wird.
Wäre schön wenns dafür eine elegantere Lösung gäbe...
Im folgenden (wenn das jemand von euch nachvollziehen möchte) hab ich meine eigens erstellte NFO parat. Diese wird optimal bei der Schriftart Terminal mit einer Größe von 9 Punkten dargestellt.
NFO Datei (txt, 9.65 KB)
Vielen Dank für eure Aufmerksamkeit
bummi - Mo 01.10.12 20:28
ein JvRichedit macht bei mir ohnehin das erwartete, mit einem "normalen" geht es so
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58:
| type TForm3 = class(TForm) re: TRichEdit; Button1: TButton; procedure Button1Click(Sender: TObject); private procedure WndProc(var Message: TMessage); override; public end;
var Form3: TForm3;
implementation uses richedit,Shellapi; {$R *.dfm}
procedure TForm3.WndProc(var Message: TMessage); var p: TENLink; strURL: string; begin if (Message.Msg = WM_NOTIFY) then begin if (PNMHDR(Message.lParam).code = EN_LINK) then begin p := TENLink(Pointer(TWMNotify(Message).NMHdr)^); if (p.Msg = WM_LBUTTONDOWN) then begin SendMessage(re.Handle, EM_EXSETSEL, 0, Longint(@(p.chrg))); strURL := re.SelText; Showmessage(strURL); end end end;
inherited; end;
procedure TForm3.Button1Click(Sender: TObject); var mask: Word; begin
mask := SendMessage(RE.Handle, EM_GETEVENTMASK, 0, 0); SendMessage(RE.Handle, EM_SETEVENTMASK, 0, mask or ENM_LINK); SendMessage(RE.Handle, EM_AUTOURLDETECT, Integer(True), 0);
re.Lines.LoadFromFile('C:\temp\term.txt'); re.Font.Name := 'Terminal'; re.Font.Charset:= OEM_CharSet;
end;
end. |
Don Krawallo - Di 02.10.12 02:51
Ich danke Dir für die schnelle Antwort, aber wie ich wie ich eine normale RichEdit Komponente mit einer URL Detection versehe ist mir bestens bekannt.
Mit diesem Code...
Delphi-Quelltext
1: 2:
| RichEdit1.Font.Name := 'Terminal'; RichEdit1.Font.Charset:= OEM_CharSet; |
...hab ich auch schon experimentiert. Aber wie ich schon sagte funktioniert das nicht ganz. Wird eine Datei gelesen siehts dementsprechend aus, aber wenn erneut eine NFO oder TXT Datei gelesen wird geht die Formatierung wieder verloren... Und wie auch schrieb verhält sich das beim normalen RichEdit wie bei der RichEdit Komponente der Jedi Library so.
Martok - Di 02.10.12 03:48
Kann gut sein, dass das RichEdit da die Formatierung am Cursor verwendet und da irgendwelche Defaults wiederherstellt.
Versuch mal, das nach dem Laden per SelectAll; SelAttributes.Charset&SelAttributes.Name zu machen.
Alternativ auch mal mit der Eigenschaft PlainText spielen, die vor dem Lesen auf True zu setzen könnte auch helfen.
Don Krawallo - Di 02.10.12 18:02
Schönen guten Tag...
Ich habe das folgendermaßen gelößt bzw. den Fehler entdeckt. Da ich solche Deklarationen so gut wie immer im Sourcecode mache und nicht im Objektinspektor hat mich dein Vorshlag aber dahingeführt.
Bei einem RichEdit der Jedi Library gibts noch eine Möglichkeit "Language Options". Standardmäßig ist die Option "AutoFont" auf True eingestellt. Trotzdem Danke an euch beide für eure kostbare Zeit.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!