リサイズ機能を使用してRichTextBoxまたはGcRichTextBoxのリサイズを行うと書式設定がクリアされる

文書番号 : 37621     文書種別 : 不具合     登録日 : 2014/10/17     最終更新日 : 2016/04/28
文書を印刷する
対象製品
PlusPak for Windows Forms 7.0J
状況
修正済み
詳細
RichTextBoxコントロールの文字列にフォントの色やサイズなどの書式を設定している状態で、GcResizeのリサイズ機能を使用してフォームのサイズを変更すると、設定されている書式がすべてクリアされます。

本現象は、GcRichTextBoxコントロールにリサイズポリシー(GcRichTextBoxResizePolicy)を適用した場合も発生します。なお、GcRichTextBoxではツールバー項目の設定もクリアされます。

また、本現象はGcApplicationResizeコンポーネント、GcResizePanelコントロールを使用した場合にも発生します。
回避方法
この問題はService Pack 3(v7.0.2016.0428)で修正されました。
不具合を修正した最新のサービスパックは、アップデートページ からダウンロードできます。

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

下記のリサイズポリシーを適用します。

注意:
下記のリサイズポリシーでは、リッチテキストで定義されている書式データ(RTF)を保持するために、コントロール内の文字列や画像オブジェクトのサイズ変更は行いません。

RichTextBoxコントロール
下記のコードを使用してユーザー定義のリサイズポリシーを作成し追加することで回避できます。

ユーザー定義のリサイズポリシーの使い方については、製品ヘルプの次の章を参照してください。

+[PlusPak の使い方]
 +[レイアウト]
  +[GcResize コンポーネント]
   +[リサイズポリシー]
     [ユーザー定義のリサイズポリシー]

[Visual Basic]
Imports GrapeCity.Win.Components

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 = dic(control)
      End If
    End If
  End Sub

End Class

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

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

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

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

GcRichTextBoxコントロール
本不具合を修正したGcRichTextBoxResizePolicyを適用することで回避できます。

注意:
プロジェクトに既にInputManResizePolicyが追加され、GcRichTextBoxResizePolicyが適用されていることを前提とします。未適用の場合は、下記の製品ヘルプを参考にしてGcRichTextBoxResizePolicyを適用してください。

+[PlusPak の使い方]
 +[レイアウト]
  +[GcResize コンポーネント]
   +[リサイズポリシー]
     [基本的な使い方]

1. プロジェクトに追加されているInputManResizePolicy.vb/csファイルを開く。
2. GcRichTextBoxResizePolicyクラスのコードを検索して選択する。
3. 下記のコードを使って元のコードを上書きする。
4. プロジェクトをリビルドする。

[Visual Basic]
Public Class GcRichTextBoxResizePolicy
  Inherits NoResizeFontResizePolicy

  Private dic As New Dictionary(Of Control, String)()

  Public Overloads Overrides ReadOnly Property TargetType() As Type
    Get
      Return GetType(GcRichTextBox)
    End Get
  End Property

  Public Overloads Overrides Sub Initialize(control As Control)
    Dim resizeControl As GcRichTextBox = TryCast(control, GcRichTextBox)
    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 GcRichTextBox = TryCast(control, GcRichTextBox)
      If resizeControl IsNot Nothing Then
        resizeControl.Rtf = dic(control)
      End If
    End If
  End Sub
End Class

[C#]
  public class GcRichTextBoxResizePolicy : NoResizeFontResizePolicy
  {
    Dictionary dic = new Dictionary();
    public override Type TargetType
    {
      get { return typeof(GcRichTextBox); }
    }

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

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

    public override void Terminate(Control control)
    {
      if (dic.ContainsKey(control))
      {
        GcRichTextBox resizeControl = control as GcRichTextBox;
        resizeControl.Rtf = dic[control];
      }
    }
  }

キーワード
PPWI10766