Versuch es mal so (Units ShellAPI und RichEdit müssen eingebunden werden): Du brauchst eine Variable/ein Feld für den originalen Methodenzeiger und die neue auszuführende Methode.
Delphi-Quellcode:
type
TForm5 = class(TForm)
RichEdit1: TRichEdit;
Panel1: TPanel;
procedure FormCreate(Sender: TObject);
private
{ Private-Deklarationen }
FOldWndProc: TWndMethod;
procedure NewWndProc(var Message: TMessage);
public
{ Public-Deklarationen }
end;
Die Methode sieht dann (fast) wie in dem verlinkten Beispiel aus:
Delphi-Quellcode:
procedure TForm5.NewWndProc(
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(RichEdit1.Handle, EM_EXSETSEL, 0, Longint(@(p.chrg)));
strURL := RichEdit1.SelText;
ShellExecute(
Handle, '
open', PChar(strURL),
nil,
nil, SW_SHOWNORMAL);
end
end
end;
if Assigned(FOldWndProc)
then
FOldWndProc(
Message);
end;
Im OnCreate merkst Du Dir jetzt die originale Methode des RichtEdit.Parent und weist ihm Deine eigene zu.
Delphi-Quellcode:
procedure TForm5.FormCreate(Sender: TObject);
var
mask: Word;
begin
mask := SendMessage(
Handle, EM_GETEVENTMASK, 0, 0);
SendMessage(RichEdit1.Handle, EM_SETEVENTMASK, 0, mask
or ENM_LINK);
SendMessage(RichEdit1.Handle, EM_AUTOURLDETECT, Integer(True), 0);
RichEdit1.Text := '
SwissDelphiCenter.com: '#13#10 +
'
Site is located at www.SwissDelphiCenter.com';
FOldWndProc := RichEdit1.Parent.WindowProc;
RichEdit1.Parent.WindowProc := NewWndProc;
end;
Das dürfte auch in etwa dem entsprechen, was die Doku zu TControl.WindowProc zu sagen hat.
Zitat:
Zeigt auf die Fensterprozedur, die auf an das Steuerelement gesendete Botschaften reagiert.
Mit Hilfe von WindowProc können Sie die Fensterprozedur des Steuerelements vorübergehend ersetzen oder unterklassifizieren. Die Methode sollte von Komponentenentwickler überschrieben werden, die diese Prozedur für eine abgeleitete Klasse selbst definieren.
Speichern Sie den alten Wert, bevor Sie WindowProc einen neuen Zeiger zuweisen. WindowProc wird zu Anfang mit der Methode WndProc initialisiert, und daher braucht der ursprüngliche Wert nicht gespeichert zu werden, wenn dieser seitdem nicht geändert wurde. Übergeben Sie in der zugewiesenen Prozedur alle nicht behandelten Botschaften an die Originalprozedur, die zuvor für WindowProc verwendet wurde. Nach einer speziellen Botschaftsbehandlung muss der Wert von WindowProc wieder in den ursprünglichen Zustand versetzt werden.