1

この問題を説明するには、次のユースケースで私のアプリケーションをテストしていただければ幸いです。

アプリケーション: 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;

フォームの OnCreate イベント内:

 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 を開発することさえ考えていません:) 欠点: RichEdit コントロール内の大きな RTF テキストで何が起こるか想像してみてください ...

4

1 に答える 1

1

イベントマスクを正しく設定していません。EM_GETEVENTMASKはメッセージであり、フラグではありません。このように設定する必要があります。

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


URLを取得した後、どのように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よりも小さくするようにサイズ変更できる場合、「if」は失敗しますが、フォームは失敗します。拡大すると縮小しません。キャプションと幅を忘れて、FFormExpandedのようなプライベートフィールドフラグを使用し、trueまたはfalseに設定します。

于 2010-04-21T22:45:05.287 に答える