Discussion:
Links in RichEdits
(zu alt für eine Antwort)
Manfred Polak
2017-06-01 16:45:37 UTC
Permalink
Ich gleich nochmal. Kann man in einem RichEdit URLs als anklickbare
Links unterbringen? In RTF-Dateien geht das ja, aber wenn ich so eine
Datei mit LoadFromFile in ein RichEdit lade, kommt statt eines Links
nur Murks heraus. Geht das wenigstens manuell mit Sel...irgendwas,
oder gar nicht?


Manfred
Franz Moll
2017-06-02 09:33:34 UTC
Permalink
Post by Manfred Polak
Ich gleich nochmal. Kann man in einem RichEdit URLs als anklickbare
Links unterbringen?
Hi,

ja, kann man. Du musst allerdings genau wissen, wie Dein Link im
RichEdit aussieht. Dann besteht eine Möglichkeit darin, dass Du mit
MouseMove auf dem RichtEdit prüfst, ob die aktuelle Mausposition auf
solch einem Link steht. Hierzu musst Du den unter der Maus liegenden
Text ermitteln, wenn es sich um eine URL handelt diese in eine globale
Variable schreiben und selbige im MouseDown-Event auswerten.

Ungefähr so (memInfo = TRichEdit):


procedure TFormular.memInfoMouseMove(Sender: TObject;
Shift: TShiftState; X, Y: Integer);
var
Point: TPoint;
Wert: LongInt;
LineNumber: Integer;
LinePos: Integer;
Line: string;
begin
// Get absolute position of character beneath mouse
Point.x := X;
Point.y := Y;
Wert := memInfo.Perform(EM_CHARFROMPOS, 0, LParam(@Point));

if Wert >= 0 then
begin
// Get line number
LineNumber := memInfo.Perform(EM_LINEFROMCHAR, Wert, 0);

// Get line position
LinePos := Wert - memInfo.Perform(EM_LINEINDEX, LineNumber, 0);

// Get line
Line := memInfo.Lines[LineNumber];

//self.DebugMsg := Format('Zeile=%d, Spalte=%d, Text=%s',
// [LineNumber, LinePos, Line]);
//

// _url = string global
_url := Self.GetURL(line);
if url = '' then
begin
memInfo.Cursor := crDefault;
end
else
begin
memInfo.Cursor := crHandPoint;
end;
end;
end;


procedure TFormular.memInfoMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if (Button = mbLeft) and _url <> '' then
begin
ShellExecute(_url);
end;
end;


HTH
Viele Grüße

Franz
Manfred Polak
2017-06-02 21:01:22 UTC
Permalink
Post by Franz Moll
Post by Manfred Polak
Ich gleich nochmal. Kann man in einem RichEdit URLs als anklickbare
Links unterbringen?
ja, kann man.
Danke für die Antworten. Ich werde beide Vorschläge bei Gelegenheit
ausprobieren.


Manfred

Björn Schreiber
2017-06-02 13:12:13 UTC
Permalink
Post by Manfred Polak
Ich gleich nochmal. Kann man in einem RichEdit URLs als anklickbare
Links unterbringen?
Hier noch eine andere Variante:

--- Schnipp On ---

FOldWindowProc: tWndMethod;

// Initialisierung, z.B. im Konstruktor des Formulars
var
Mask: LRESULT;

Mask := SendMessage(RichEdit.Handle, EM_GETEVENTMASK, 0, 0);
SendMessage(RichInfo.Handle, EM_SETEVENTMASK, 0, Mask or ENM_LINK);
SendMessage(RichEdit.Handle, EM_AUTOURLDETECT, 1, 0);
FOldWindowProc := RichEdit.WindowProc;
RichEditLicenseInfo.WindowProc := RichEditWindowProc;

// Botschaftsbearbeitungsfunktion
procedure tForm.RichtEditWindowProc(var aMsg: tMessage);
var
URL: String;
Link: tENLink;

begin
if (aMsg.Msg = CN_NOTIFY) and
(tWMNotify(aMsg).NMHdr^.Code = EN_LINK) then
begin
// URL Auswahl in tRichEdit-Steuerelement behandeln
Link := tENLink(Pointer(tWMNotify(aMsg).NMHdr)^);

if Link.Msg = WM_LBUTTONDOWN then
begin
// komplette URL ermitteln
SendMessage(RichEditLicenseInfo.Handle, EM_EXSETSEL, 0,
LongInt(@(Link.Chrg)));
URL := RichEditLicenseInfo.SelText;

// URL im Standard-Browser öffnen
ShellExecute(Handle, 'open', PChar(URL), nil, nil,
SW_SHOWNORMAL);
end
end;

// Botschaft weiterleiten
FOldWindowProc(aMsg);
end;

--- Schnipp Off ---

Der Code stammt allerdings noch aus Delphi 5.


hth,
Björn
--
DRIGUS Systeme GmbH
Loading...