リッチテキストボックスをリサイズする時、URLが無効になる

文書番号 : 39835     文書種別 : 不具合     登録日 : 2016/12/21     最終更新日 : 2017/11/21
文書を印刷する
対象製品
PlusPak for Windows Forms 8.0J
状況
修正済み
詳細
標準のRichTextBoxコントロールをリサイズする時、エディタに設定されているURLが通常の文字列になりリンクが無効になります。InputMan for Windows Formsのリッチテキストコントロールを使用する場合は、InputManResizePolicyを適用しても同様な現象が発生します。

この現象は、リサイズコンポーネント(GcResize、GcApplicationResize、GcResizePanel)を配置したフォームで発生します。
回避方法
この問題はService Pack 3(v8.0.2017.1121)で修正されました。
不具合を修正した最新のサービスパックは、アップデートページ からダウンロードできます。

Service Pack 3より前のバージョンでは次の方法で回避可能です。

・RichTextBoxを使う場合
フォームのコードエディタで以下のリサイズポリシーのコードを追加することで現象を回避できます。

[Visual Basic]
Imports GrapeCity.Win.Components

  Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    GcResize1.ResizePolicies.Add(New RichTextBoxResizePolicy())
  End Sub

Public Class RichTextBoxResizePolicy
  Inherits NoResizeFontResizePolicy
  Private dic As New Dictionary(Of Control, String)()
  Public Overloads Overrides ReadOnly Property TargetType() As Type
    Get
      Return GetType(RichTextBox)
    End Get
  End Property
  Public Overloads Overrides Sub Initialize(control As Control)
    Dim resizeControl As RichTextBox = TryCast(control, RichTextBox)
    If resizeControl IsNot Nothing Then
      dic(control) = resizeControl.Rtf
    End If
  End Sub
  Public Overloads Overrides Function CanResizeChildren(control As Control) As Boolean
    Return False
  End Function
  Public Overloads Overrides Sub Terminate(control As Control)
    If dic.ContainsKey(control) Then
      Dim resizeControl As RichTextBox = TryCast(control, RichTextBox)
      If resizeControl IsNot Nothing Then
        resizeControl.Rtf = Nothing
        resizeControl.Rtf = dic(control)
      End If
    End If
  End Sub
End Class

[C#]
using GrapeCity.Win.Components;

    private void Form1_Load(object sender, EventArgs e)
    {
      gcResize1.ResizePolicies.Add(new RichTextBoxResizePolicy());
    }

  public class RichTextBoxResizePolicy : NoResizeFontResizePolicy
  {
    Dictionary dic = new Dictionary();
    public override Type TargetType
    {
      get { return typeof(RichTextBox); }
    }

    public override void Initialize(Control control)
    {
      RichTextBox richtTextBox = control as RichTextBox;
      if (richtTextBox != null)
      {
        dic[control] = richtTextBox.Rtf;
      }
    }

    public override bool CanResizeChildren(Control control)
    {
      return false;
    }

    public override void Terminate(Control control)
    {
      if (dic.ContainsKey(control))
      {
        RichTextBox richTextBox = control as RichTextBox;
        if (richTextBox != null)
        {
          richTextBox.Rtf = null;
          richTextBox.Rtf = dic[control];
        }
      }
    }
  }


・GcRichTextBoxを使う場合
次のようにInputManResizePolicyのGcRichTextBoxResizePolicyクラスで回避コードを追加することで現象を回避できます。

[Visual Basic]
Public Class GcRichTextBoxResizePolicy
  Inherits NoResizeFontResizePolicy

  ・・・

  Public Overloads Overrides Sub Terminate(control As Control)
    If dic.ContainsKey(control) Then
      Dim resizeControl As GcRichTextBox = TryCast(control, GcRichTextBox)
      If Not resizeControl Is Nothing Then
        ' 【回避方法:次の行を追加】
        resizeControl.Rtf = Nothing
        resizeControl.Rtf = dic(control)
      End If
    End If
  End Sub
End Class

[C#]
  public class GcRichTextBoxResizePolicy : NoResizeFontResizePolicy
  {

    ・・・

    public override void Terminate(Control control)
    {
      if (dic.ContainsKey(control))
      {
        GcRichTextBox richTextBox = control as GcRichTextBox;
        if (richTextBox != null)
        {
          // 【回避方法:次の行を追加】
          richTextBox.Rtf = null;
          richTextBox.Rtf = dic[control];
        }
      }
    }
  }
キーワード
PPWI20022