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/)
-   -   RichEdit mit eigenen Urls (https://www.delphipraxis.net/186798-richedit-mit-eigenen-urls.html)

Thomas Feichtner 30. Sep 2015 16:14

RichEdit mit eigenen Urls
 
Hallo,

ich möchte gerne im RichEdit noch Wörter als URL definieren.

Derzeit geht ja http://..., mailto...., usw

Wie kann ich nun das Richedit dazu bringen auch bei dem Wort mgmdoc:// ein Hyperlink daraus zu machen und das entsprechend beim OnClick aufgerufen wird.

Delphi-Quellcode:
procedure TForm1.InitRichEditURLDetection(RE: TRichEdit);
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);
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  s: string;
begin
  InitRichEditURLDetection(RichEdit1);

  s:='TEST' + #13#10 +
     'http://www.delphi.abc.com.' + #13#10 +
     'Send an email to your Guide: mailto:delphi@abc.com';
  RichEdit1.Text := s;
end;
und
Delphi-Quellcode:
procedure TForm1.WndProc(var Msg: TMessage);
var
  p: TENLink;
  sURL: string;
  CE : TRichEdit;
begin
 if (Msg.Msg = WM_NOTIFY) then
 begin
  if (PNMHDR(Msg.lParam).code = EN_LINK) then
  begin
   p := TENLink(Pointer(TWMNotify(Msg).NMHdr)^);
   if (p.Msg = WM_LBUTTONDOWN) then
   begin
    try
     CE := TRichEdit(Form1.ActiveControl);
     SendMessage(CE.Handle, EM_EXSETSEL, 0, Longint(@(p.chrg)));
     sURL := CE.SelText;
     ShellExecute(Handle, 'open', PChar(sURL), 0, 0, SW_SHOWNORMAL);
    except
    end;
   end;
  end;
 end;

 inherited;
end; (* TForm1.WndProc *)

Perlsau 1. Okt 2015 00:51

AW: RichEdit mit eigenen Urls
 
Die Tatsache, daß die URLs ja irgendwo anders gespeichert werden müssen, wenn sie nicht mehr im Klartext in der Stringliste Lines auftauchen dürfen, wirft die Frage nach dem Wo auf. Die Antwort lautet daher: Du mußt dir eine eigene RichEdit-Komponente ableiten und diese um die gewünschte Funktion ergänzen.

Die Frage nach dem Wie erfordert allerdings komplexere Überlegungen. Führst du ein weiteres Steuerzeichen ein, um Beginn und Ende einer URL zu kennzeichnen, machst du dir's einfach. Du nummerierst die URLs durch und verweist mit diesm Index auf einen internen Record, der die URLs enthält. Dazu mußt du dann aber auch mindestens eine InputBox spendieren, damit der Anwender die URL dort eingeben kann. Zusätzlich wäre wie in Word oder in HTML-Browsern ein Hint sinnvoll, der die verborgene URL anzeigt. So oder ähnlich würde ich die Sache anzupacken versuchen.

Die Sache mit dem zusätzlichen Steuerzeichen hat nur einen Haken: Die damit bearbeiteten Texte sind nicht mehr kompatibel mit der RTF-Spezifikation und werden wohl beim Versuch, sie in normale Richedits einzulesen, Fehler oder Fehldarstellungen erzeugen. Damit wären wir bei der zweiten Möglichkeit: ein dynamisches RichEdit, das selbst ständig kontrolliert, ob im angezeigten Bereich eine Zeichenfolge existiert, die als URL gekennzeichnet wurde. Das ist zwar komplexer, kommt aber letztendlich ohne weiteres Steuerzeichen aus und bleibt somit kompatibel. Der URL-Record, der bei der Wahl dieser Möglichkeit verwaltet werden muß, benötigt Beginn- und Endwerte, um die als URL gekennzeichnete Zeichenfolge ermitteln zu können. Beim Einfügen von weiterem Text vor diesen URL-Strings muß immer gleich angepaßt werden, also im Prinzip bei jedem Tastendruck, er ein Zeichen einfügt oder löscht.

Thomas Feichtner 5. Okt 2015 08:58

AW: RichEdit mit eigenen Urls
 
Hallo,

vielleicht habe ich mich hier falsch ausgedrückt.
Was will ich?
Ein Memo bzw. DBMemo das auch Hyperlinks darstellen kann und eben auch selbst definierte Links.

Ich brauche keine Formatierung.

p80286 5. Okt 2015 09:55

AW: RichEdit mit eigenen Urls
 
Zitat:

Zitat von Thomas Feichtner (Beitrag 1317682)
Hallo,

vielleicht habe ich mich hier falsch ausgedrückt.
Was will ich?
Ein Memo bzw. DBMemo das auch Hyperlinks darstellen kann und eben auch selbst definierte Links.

Ich brauche keine Formatierung.

Für die Darstellung benötigst Du Formatierung.
Des weiteren brauchst Du eine Definition "was ist ein link im Text" und ggf. die Definition einer Aktion wenn ein "Link" angeklickt wird.

Ein TRichedit/TMemo ist zunächst einmal für die Darstellung und Bearbeitung von Text zuständig, was Du möchtest geht doch etwas darüber hinaus.
U.U. könnte Dir Synedit da weiter helfen.

Gruß
K-H

Perlsau 5. Okt 2015 18:44

AW: RichEdit mit eigenen Urls
 
Zitat:

Zitat von Thomas Feichtner (Beitrag 1317682)
Was will ich? Ein Memo bzw. DBMemo das auch Hyperlinks darstellen kann und eben auch selbst definierte Links.

Oben wolltest du noch eine RTF-Komponente, die URLs darstellen kann, ohne die URL in die komponenteneigene Stringliste aufzunehmen. Aber natürlich kann man seine Meinung auch ändern ... :stupid:

Zitat:

Zitat von Thomas Feichtner (Beitrag 1317682)
Ich brauche keine Formatierung.

Wie p80286 bereits ausführte, geht die Darstellung von "mehr als nur Text" nicht mit einem Memo, denn dieses kann wirklich nur eines: Text in einer einzigen Schriftformatierung – z.B. Arial 10 Punkt, linksbündig, kursiv, schwarz – darstellen. Willst du davon abweichende Textstellen kennzeichnen, genügen TMemo und TDBMemo nicht. Daher benötigste du – wie du in deinem Eingangsposting bereits festgestellt hast – ein TRichEdit, und zwar wegen der Formatierung. Die Kennzeichnung eines Textteiles als URL ist eine Formatierung, denn sie betrifft nicht den Text, sondern eine Texteigenschaft, also ein Property.

Soweit alles klar?

Wie ich oben bereits ausführlich dargestellt habe, mußt du dir überlegen, wo die URL gespeichert werden soll. Die beiden Möglichkeiten, die mir dazu einfielen, habe ich dir bereits aufgezeigt. Programmieren mußt du das natürlich selber – außer du erteilst jemandem einen Auftrag (z.B. mir gegen Vorkasse) oder erwirbst eine der kommerziellen Komponenten (was ich an deiner Stelle vorziehen würde).

hathor 5. Okt 2015 19:32

AW: RichEdit mit eigenen Urls
 
Mal 'ne dumme Frage: Was ist das eigentlich "mgmdoc://"?

Was nützt Dir ein Link, der so beginnt - man braucht auch einen Browser, der damit was anfangen kann.

Eigene URLs kann man in der Registry eintragen:
Code:
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\URL\Prefixes]
"mosaic"="http://"
"www"="http://"
"home"="http://"
"ftp"="ftp://"


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:32 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz