Macie może jakąś koncepcję, jak zrobić, żeby po wpisaniu do zwyczajnego RichEdita adresu www dany odcinek textu był podkreślony a po kliknięcui na niego otwierała się przeglądarka?
Moja koncepcja - rusz zaschniętym rozumkiem i cofnij się z dwa dni wstecz - Dryobates umieścił w FAQ wskazówkę odnośnie tego..
I po co chłopak ma się męczyć i cokolwiek pisać Wam,jak Wy nawet nie spojrzycie, tylko sie pytacie naforum?
//Posty poniżej będą kasowane :-[ :-[ :-[ :-[
Tam jest wszystko ładnie napisane, tylko że po kliknięciu na linka nic się nie dzieje... Jak przechwycić text linka, żeby móc go potem otworzyć? Chodzi mi o to, jak go do zmiennej jakiejś wpakować
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/richedit/richeditcontrols/richeditcontrolreference/richeditstructures/enlink.asp
Ale jak to zaimplementować to męcz się sam. Nie mam teraz czasu na zabawy z WinAPI
Siedziałem pół dnia nad tym i się nie domyśliłem.... Kiepski jestem w WinAPI, więc jak moglibyście mi podać jakiś gotowy kod, lub przynajmniej jakieś wskazówki podać, to byłbym wdzięczny
wszystkie potrzebne nagłówki masz w windows.pas, wystarczy reagowanie na message wysyłany przez richedit i odpowiednie uruchamianie. reakcja na mesag notify:
procedure TJvCustomRichEdit.CNNotify(var Msg: TWMNotify);
var
AMsg: TMessage;
begin
with Msg do
case NMHdr^.code of
EN_SELCHANGE:
SelectionChange;
EN_REQUESTRESIZE:
RequestSize(PReqSize(NMHdr)^.RC);
EN_SAVECLIPBOARD:
with PENSaveClipboard(NMHdr)^ do
if not SaveClipboard(cObjectCount, cch) then
Result := 1;
EN_PROTECTED:
with PENProtected(NMHdr)^ do
begin
AMsg.Msg := Msg;
AMsg.WParam := WParam;
AMsg.LParam := LParam;
AMsg.Result := 0;
if not ProtectChange(AMsg, chrg.cpMin, chrg.cpMax) then
Result := 1;
end;
EN_LINK:
with PENLink(NMHdr)^ do
begin
case Msg of
WM_RBUTTONDOWN:
begin
FClickRange := chrg;
FClickBtn := mbRight;
end;
WM_RBUTTONUP:
begin
if (FClickBtn = mbRight) and (FClickRange.cpMin = chrg.cpMin) and
(FClickRange.cpMax = chrg.cpMax) then
URLClick(GetTextRange(chrg.cpMin, chrg.cpMax), mbRight);
with FClickRange do
begin
cpMin := -1;
cpMax := -1;
end;
end;
WM_LBUTTONDOWN:
begin
FClickRange := chrg;
FClickBtn := mbLeft;
end;
WM_LBUTTONUP:
begin
if (FClickBtn = mbLeft) and (FClickRange.cpMin = chrg.cpMin) and
(FClickRange.cpMax = chrg.cpMax) then
URLClick(GetTextRange(chrg.cpMin, chrg.cpMax), mbLeft);
with FClickRange do
begin
cpMin := -1;
cpMax := -1;
end;
end;
end;
end;
EN_STOPNOUNDO:
begin
{ cannot allocate enough memory to maintain the undo state }
end;
end;
end;
w URLClick dajesz normaly shellexecute (jest w faq) i jusz masz gotowe. ps. kombinuj z kodem bo ten na pewno nie zadziała, poza tym Ściągnij sobie JediVCL (dużo razy było o tym na forum) tam jest to co ci potrzeba (JvxRichEdit)
No więc skożystałem z kodu powyżej i po trzech dniach prób i błedów i niepowodzeń (bo w WinAPI to ja świerzy w zasadzie jestem) wpadłem na to, że po prostu RichEdit nie wysyła komunikatu o kliknięciu na link. Ściągnąłem tamten komponent i moja procedurka działa na ten JvxRichEdit, a na zwyczajnego RichEdita niebardzo... A więc cały czas proszę o pomoc w tej sprawie. Potrzebuję mieć te linki w zwykłym RC, nie chcę używać innych komponentów z pewnych względów... Gdyby ktoś pomógł, byłbym bardzo wdzięczny.
Nikt mi nie pomógł, a więc odpowiadam sam sobie... Może komuś się w przyszłości przyda.... w FAQ Dryobates napisał, jak zrobić, żeby RichEdit zanzaczał linki... Trza jeszcze jeden komunikat do RichEdita wysłać, który rozkaże wysyłanie komunikatów o kliknięciu na tego linka:
const
EM_SETEVENTMASK = WM_USER + 69;
ENM_LINK = $04000000;
begin
SendMessage(RichEdit1.Handle, EM_SETEVENTMASK, 0, ENM_LINK);
end;