Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.01.07;
Скачать: CL | DM;

Вниз

Про URL в RichEdit и про Panel (несовместимость?)   Найти похожие ветки 

 
КВАНТ   (2006-12-17 05:00) [0]

Здравствуйте! Привожу кусок статьи из DRKB про выделение URL в RichEdit. (Вопрос после кода)


uses Richedit, ShellApi;

{....}

 protected
   procedure WndProc(var Message: TMessage); override;
   
{....}

procedure TForm1.FormCreate(Sender: TObject);
var
 mask: Word;
begin
 mask := SendMessage(RichEdit1.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 := "http://www.test.te";
end;

procedure TForm1.WndProc(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), 0, 0, SW_SHOWNORMAL);
     end
   end
 end;

 inherited;
end;


Вопрос: этот код прекрасно работает, если Rich расположен прямо на форме. НО стоит поместить RichEdit в панель (Panel), как открывать ссылку он перестает (иногда даже вообще не выделяет URL)! Объясните пожалуйста, как открыть ссылку, когда RichEdit в панели?? (от панелей отказаться не могу, т.к. это мои "окна")

Спасибо.


 
КВАНТ   (2006-12-17 05:15) [1]

Дополнение: это происходит всегда, когда RichEdit является дочерним, будь то Panel или GroupBox
Что же делать?


 
MBo ©   (2006-12-17 08:47) [2]

Как нетрудно заметить, приведенный код перехватывает сообщение RichEdit в оконной функции формы, являющейся его родительским окном (Parent)
Если же у твоего RichEdit другой Parent, то его оконную функцию и надо перекрывать

Ведь ты же верно диагностировал, что дело в том, по отношению к чему является RichEdit дочерним...


 
КВАНТ   (2006-12-17 21:33) [3]

То есть вместо
procedure TForm1.WndProc(var Message: TMessage);
писать
procedure TPanel1.WndProc(var Message: TMessage);?


 
КВАНТ   (2006-12-18 00:08) [4]

Так как писать-то?


 
sniknik ©   (2006-12-18 00:20) [5]

> Так как писать-то?
можно так

 TSendPanel = class(TPanel)
 private
   procedure RunLink(var Msg: TMessage); message WM_NOTIFY;
 end;

 TPanel = class(TSendPanel);

 TForm1 = class(TForm)
    Pane1: TPanel;
    Richedit1: TRichedit;
 ...

implementation

{$R *.dfm}

procedure ExCheck(inst: THandle);
begin
 if inst < 32 then ShowError(SysErrorMessage(inst));    
end;

procedure TSendPanel.RunLink(var Msg: TMessage);
var
 p: TENLink;
 Len: Integer;
 strURL: string;
begin
 if (PNMHDR(Msg.lParam).code = EN_LINK) then begin
   p:= TENLink(Pointer(TWMNotify(Msg).NMHdr)^);
   if (p.Msg = WM_LBUTTONDOWN) then begin
     SendMessage(TWMNotifyFormat(Msg).From, EM_EXSETSEL, 0, Longint(@(p.chrg)));

     Len:= p.chrg.cpMax - p.chrg.cpMin;
     if Len = 0 then Exit;

     SetLength(strURL, Len + 1);
     Len:= SendMessage(TWMNotifyFormat(Msg).From, EM_GETSELTEXT, 0, Longint(PChar(strURL)));
     SetLength(strURL, Len);

     ExCheck(ShellExecute(Handle, "open", PChar(strURL), nil, nil, SW_SHOWNORMAL));
   end
 end else
   inherited;
end;


 
sniknik ©   (2006-12-18 00:23) [6]

p.s. ShowError это моя функция, лог+показ сообщения, замени на raise, или чтото подобное моему.


 
КВАНТ   (2006-12-18 01:32) [7]

Спасибо, работает. Только один нюанс
Действия:
1) Открыл ссылку
2) Открылся браузер (и встал на первый план, т.е. стал активным)
3) Переключаюсь на моё приложение
4) Приложение "застыло", пока не щелкнешь по нему мышкой (в любом месте на форме). Почему и как это убрать?


 
sniknik ©   (2006-12-18 11:38) [8]

> 4) Приложение "застыло", ...
хм... а это как? до этого оно у тебя жидким чтоли было? ;о)

у меня не "застывает", или просто не замечал отличий, напиши конкретнее, что сделать (переключаюсь -> клавишами, мышкой, через диспетчер задач, ...), и на что обратить внимание чтобы понять, что оно "застыло". (в общем обьясни "на пальцах")

хотя, если это чтото вроде неприема комманд/сообщений кроме как от мыши... то можно предположить, что чтото программой обрабатывается... какоето сообщение, может от мыши (гдето в ожидание вошло, т.к. получило начало клика, а окончания нет), попробуй сделать inherited; в процедуре безусловным (else убери перед ним), ведь в случае если срабатывает вызов тут убрано продолжение обработки, а этого может у тебя чтото ждет.
+ можно проверить, и вместо Handle в ехекюте передать 0, т.к. этот хендл нужен для назначения твоего окна "парентом" для вызываемого, от которого через него тоже могут быть какието "послания" которые нуждаются в обработке (вернее наоборот они не нужны но чтото пытается).


 
КВАНТ   (2006-12-18 15:50) [9]

так, я позже все это проверю...

на пальцах: например, кнопка "крестик" :))) т.е. закрыть, не "зажигается" при наведении указателя... это например. :)



Страницы: 1 вся ветка

Текущий архив: 2007.01.07;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.008 c
15-1166360933
Freedman
2006-12-17 16:08
2007.01.07
Подскажите сайт


15-1166200113
allax
2006-12-15 19:28
2007.01.07
Вопрос


15-1165876750
IMHO
2006-12-12 01:39
2007.01.07
FAR и зрение


15-1166001006
ocean
2006-12-13 12:10
2007.01.07
100 худших фильмов


2-1166352049
jonson35
2006-12-17 13:40
2007.01.07
как правильно создать процедуру?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский