Thema: Delphi Richedit und Hyperlinks

Einzelnen Beitrag anzeigen

Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Richedit und Hyperlinks

  Alt 1. Jul 2018, 13:28
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat