Сообщение RichEdit EM_AUTOURLDETECT не всегда отправляется - PullRequest
1 голос
/ 21 апреля 2010

Чтобы описать эту проблему, лучше всего протестировать мое приложение со следующим сценарием использования:

Применение: http://ubuntuone.com/p/nF/

  1. Открыть приложение;
  2. Нажмите на кнопку с надписью «>»;
  3. Снова нажмите на ту же кнопку;
  4. Нажмите на ту же кнопку еще раз.

Как видите, при первом расширении URL-адрес корректно обнаружен, а в дальнейшем - нет.

Надеемся получить исправление для этой проблемы с вашей помощью:)

В настоящее время я отправляю WM каждый раз, когда диалог расширяется, но он все равно не работает ...

Развернуть / свернуть фрагмент кода кода:

    if (PreviewOpn.Caption = '<') and (Width >= 499) then                          // if form is expanded
  begin
   PreviewOpn.Caption := '>';
   if CheckWin32Version(6,0) then begin
     Constraints.MinWidth := 252; ClientWidth := Round(252 - ((Width - ClientWidth) / 2));
    end else begin
     Constraints.MinWidth := 248; ClientWidth := Round(248 - ((Width - ClientWidth) / 2));
    end;
   PopupActionBar1.Items[1].Enabled := False; PopupActionBar1.Items[1].Checked := False;
   if (PreviewOpn.Caption = '<') and (Width >= 248) then PreviewOpn.Caption := '>';
  end else                                                                      // else if form is collapsed
  begin
   SendMessage(RichEdit1.Handle, EM_SETEVENTMASK, 0, EM_GETEVENTMASK or ENM_LINK);       //|
   SendMessage(RichEdit1.Handle, EM_AUTOURLDETECT, Integer(True), 0);
   PreviewOpn.Caption := '<';
   if CheckWin32Version(6,0) then begin
    Constraints.MinWidth := 252; ClientWidth := Round(510 - ((Width - ClientWidth) / 2));
   end else begin
    Constraints.MinWidth := 248; ClientWidth := Round(499 - ((Width - ClientWidth) / 2));
   end;
   PopupActionBar1.Items[1].Enabled := True; PopupActionBar1.Items[1].Checked := True;
   if (PreviewOpn.Caption = '>') and (Width >= 499) then PreviewOpn.Caption := '<';
   if (FileExists(Edit1.Text)) or (FileExists(Edit2.Text)) or (FileExists(ParamStr(1)))
    then RAWInputBtnClick(TabSet1);
  end;
 vClick(VKPInputBtn);                                                           // calls PopuMenu items enabling triggers
 for n := 0 to RichEdit1.Lines.Count - 1 do if RichEdit1.Width < Canvas.TextWidth(RichEdit1.Lines[n]) then  // enable automatic scroolbar settup
  RichEdit1.ScrollBars := ssBoth;

Событие создания внутренних форм:

 SendMessage(RichEdit1.Handle, EM_SETEVENTMASK, 0, EM_GETEVENTMASK or ENM_LINK);       //|
 SendMessage(RichEdit1.Handle, EM_AUTOURLDETECT, Integer(True), 0);                    //|
 RichEdit1.Lines[5] := RichEdit1.Lines[5] + ' ';                                       //| resend message for line to fix update issue

Как гласит документация http://msdn.microsoft.com/en-us/library/bb787991%28VS.85%29.aspx, URL-адрес обнаруживается путем изменения текста, что означает, что единственный способ повторно вызвать обнаружение - это отправить какое-то сообщение с добавлением / удалением символов, НО:

URL обнаруживается сразу после нажатия клавиши на клавиатуре и только в строке INSIDE. Возможное исправление было бы довольно неприятно, и поэтому я даже не думаю разрабатывать код sinpp для этого :) Идея: пропустите все доступные символы и, например, добавьте Char (# 10), а затем удалите Char (# 10). Недостаток: представьте, что происходит с большим текстом RTF внутри элемента управления RichEdit ...

1 Ответ

1 голос
/ 22 апреля 2010

Вы неправильно устанавливаете маску события, EM_GETEVENTMASK - это сообщение, а не флаг. Вы должны установить это так:

  SendMessage(RichEdit1.Handle, EM_SETEVENTMASK, 0,
      SendMessage(RichEdit1.Handle, EM_GETEVENTMASK, 0, 0) or ENM_LINK);


Я не знаю, как вы теряете обнаружение URL-адреса после того, как получите его, но если вышеприведенное не поможет, насколько я знаю, нет другого способа, кроме как очистить и переназначить текст или измените текст самого URL, как вы заметили.

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

Как еще один боковой узел, ваш тест на изменение ширины формы неверен.

 if (PreviewOpn.Caption = '<') and (Width >= 499) then
  begin
  ...
  end else
  begin
   if CheckWin32Version(6,0) then begin
    Constraints.MinWidth := 252;
    ClientWidth := Round(510 - ((Width - ClientWidth) / 2));
  ...

В приведенном выше примере, когда ваша форма развернута, она будет иметь ширину ~ 510 и минимальная ширина 252. Это означает, что форма может быть изменена, чтобы иметь меньше ширины, чем 499, то ваше «если» не удастся, и хотя форма расширен это не будет сокращаться. Забудьте о заголовке и ширине и использовать частный флаг поля, такой как FFormExpanded и установить его в true или ложь .. и т.д ...

...