![]() |
Probleme mit RichEdit
Hallo zusammen,
ich habe Probleme beim Formatieren von Text in RichEdit. Mit diesem Code kann ich die Textattribute verändern (Farbe, Fett, usw.):
Delphi-Quellcode:
Mit diesem Code erkennt das RichEdit URLs und öffnet diese mit einem Click:
DBRichEdit1.SelStart:=0;
DBRichEdit1.Font.Name:=form1.BFont.Name; DBRichEdit1.Font.Color:=form1.BFont.Color; DBRichEdit1.Font.Size:=form1.BFont.Size; DBRichEdit1.SelAttributes.Assign(DBRichEdit1.Font);
Delphi-Quellcode:
Beides klappt prima - für sich alleine.
//create
mask := SendMessage(DBRichEdit1.Handle, EM_GETEVENTMASK, 0, 0); SendMessage(DBRichEdit1.Handle, EM_SETEVENTMASK, 0, mask or ENM_LINK); SendMessage(DBRichEdit1.Handle, EM_AUTOURLDETECT, Integer(True), 0); FOldWndProc := DBRichEdit1.Parent.WindowProc; DBRichEdit1.Parent.WindowProc := NewWndProc; procedure TForm4.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(DBRichEdit1.Handle, EM_EXSETSEL, 0, Longint(@(p.chrg))); strURL := DBRichEdit1.SelText; ShellExecute(Handle, 'open', PChar(strURL), nil, nil, SW_SHOWNORMAL); end end end; if Assigned(FOldWndProc) then FOldWndProc(Message); end; Zusammen allerdings blockieren sich die beiden Funktionen. Beides funktioniert dann nicht mehr. Was mache ich falsch? |
AW: Probleme mit RichEdit
Zitat:
Vermutlich tust Du irgendwas, was das Window-Handle des richedits neu erzeugt, und dadurch gehen deine Settings verloren. Um das zu vermeiden mußt Du eine Komponente von TDBRichedit ableiten und ihre CreateWnd-Methode überschreiben. Mach dort die Settings nach dem Aufruf der ererbten Methode. Du kannst dann auch direkt einen Messagehandler für CN_NOTIFY anlegen (oder überschreiben, das Control erbt schon einen von TRichedit, glaube ich) und damit das Handling der URLs direkt im Control implementieren, eventuell dafür einen eigenen Event anbieten, den das Form verwenden kann. Die VCL "reflektiert" eine WM_NOTIFY-Message als CN_NOTIFY an das Control, so dass man die Bearbeitung dort machen kann, wo sie hingehört, und nicht im parent des Controls. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz