Autor Beitrag
Don Krawallo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 45

Windows 10 x64
Delphi 10.4.1
BeitragVerfasst: Mo 01.10.12 20:05 
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...
ausblenden 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; //Pfad + Dateiname für spätere Zwecke gespeichert

  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.
ausblenden 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;   //RichEdit auf ein anderes CharSet als OEM einstellen
  Richedit1.Lines.LoadFromFile (OpenDialog1.FileName);  //Text einlesen
  RichEdit1.Font.Charset:= OEM_CharSet;   //RichEdit für korrekte Darstellung auf OEM_Charset einstellen
 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
Einloggen, um Attachments anzusehen!
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Mo 01.10.12 20:28 
ein JvRichedit macht bei mir ohnehin das erwartete, mit einem "normalen" geht es so
ausblenden volle Höhe 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;
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  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);
        //ShellExecute(Handle, 'open', PChar(strURL), 0, 0, SW_SHOWNORMAL);
      end
    end
  end;

  inherited;
end;

procedure TForm3.Button1Click(Sender: TObject);
var
 mask: Word;
begin

  mask := SendMessage(RE.Handle, EM_GETEVENTMASK, 00);
  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.

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
Don Krawallo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 45

Windows 10 x64
Delphi 10.4.1
BeitragVerfasst: 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...
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: 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.

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."

Für diesen Beitrag haben gedankt: Don Krawallo
Don Krawallo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 45

Windows 10 x64
Delphi 10.4.1
BeitragVerfasst: 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.