Текущий архив: 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