コントロールが読み取り専用でもタッチツールバーの「貼り付け」「切り取り」「削除」ボタンが無効にならない

文書番号 : 39097     文書種別 : 不具合     登録日 : 2015/09/11     最終更新日 : 2016/04/28
文書を印刷する
対象製品
InputMan for Windows Forms 7.0J
状況
修正済み
詳細
読み取り専用のInputManコントロールでタッチツールバーを表示すると、「貼り付け」「切り取り」「削除」ボタンがグレーアウトされません。
また、このとき削除ボタンをタップするとコントロールの文字列が削除されてしまいます。
回避方法
この問題はService Pack 3(v7.0.2016.0428)で修正されました。
不具合を修正した最新のサービスパックは、アップデートページ からダウンロードできます。

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

コントロールが読み取り専用の場合に「貼り付け」「切り取り」「削除」ボタンがグレーアウトするように実装したクラスを新たに作成して、タッチツールバーの既定のボタンと置き換えます。

[Visual Basic]
Imports GrapeCity.Win.Editors

Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ' 新しいタッチツールバーボタンを生成します。
        Dim PasteBtn As New TouchToolBarButton(New PasteAction(), "貼り付け", GcTextBox1.TouchToolBar.Items(0).Image)
        Dim CutBtn As New TouchToolBarButton(New CutAction(), "切り取り", GcTextBox1.TouchToolBar.Items(1).Image)
        Dim DeleteBtn As New TouchToolBarButton(New DeleteAction(), "削除", GcTextBox1.TouchToolBar.Items(3).Image)
        ' 既定で設定されるタッチツールバーボタンと置き換えます。
        GcTextBox1.TouchToolBar.Items.Insert(0, PasteBtn)
        GcTextBox1.TouchToolBar.Items.Insert(2, CutBtn)
        GcTextBox1.TouchToolBar.Items.Insert(5, DeleteBtn)
        GcTextBox1.TouchToolBar.Items.RemoveAt(1)
        GcTextBox1.TouchToolBar.Items.RemoveAt(2)
        GcTextBox1.TouchToolBar.Items.RemoveAt(4)
    End Sub
End Class

' 貼り付けのアクションを定義します。
Public Class PasteAction
    Implements ITouchBarAction

    Public Function CanExecute(target As Object) As Boolean Implements ITouchBarAction.CanExecute
        Dim owner As EditBase = target
        ' 読み取り専用時は無効にします。
        If owner Is Nothing Or owner.ReadOnly Then
            Return False
        End If
        Return True
    End Function
    Public Sub Execute(target As Object) Implements ITouchBarAction.Execute
        Dim owner As EditBase = target
        owner.Paste()
    End Sub
End Class

' 切り取りのアクションを定義します。
Public Class CutAction
    Implements ITouchBarAction

    Public Function CanExecute(target As Object) As Boolean Implements ITouchBarAction.CanExecute
        Dim owner As EditBase = target
        ' 読み取り専用時は無効にします。
        If owner Is Nothing Or owner.ReadOnly Or owner.SelectedText.Length = 0 Then
            Return False
        End If
        Return True
    End Function
    Public Sub Execute(target As Object) Implements ITouchBarAction.Execute
        Dim owner As EditBase = target
        owner.Cut()
    End Sub
End Class

' 削除のアクションを定義します。
Public Class DeleteAction
    Implements ITouchBarAction

    Public Function CanExecute(target As Object) As Boolean Implements ITouchBarAction.CanExecute
        Dim owner As EditBase = target
        ' 読み取り専用時は無効にします。
        If owner Is Nothing Or owner.ReadOnly Or owner.Text.Length = 0 Then
            Return False
        End If
        Return True
    End Function
    Public Sub Execute(target As Object) Implements ITouchBarAction.Execute
        Dim owner As EditBase = target
        owner.Text = owner.Text.Remove(0)
    End Sub
End Class


[C#]
using GrapeCity.Win.Editors;

public partial class Form1 : Form
{
    private void Form1_Load(object sender, EventArgs e)
    {
        // 新しいタッチツールバーボタンを生成します。
        TouchToolBarButton PasteBtn = new TouchToolBarButton(new PasteAction(), "貼り付け", gcTextBox1.TouchToolBar.Items[0].Image);
        TouchToolBarButton CutBtn = new TouchToolBarButton(new CutAction(), "切り取り", gcTextBox1.TouchToolBar.Items[1].Image);
        TouchToolBarButton DeleteBtn = new TouchToolBarButton(new DeleteAction(), "削除", gcTextBox1.TouchToolBar.Items[3].Image);
        // 既定で設定されるタッチツールバーボタンと置き換えます。
        gcTextBox1.TouchToolBar.Items.Insert(0, PasteBtn);
        gcTextBox1.TouchToolBar.Items.Insert(2, CutBtn);
        gcTextBox1.TouchToolBar.Items.Insert(5, DeleteBtn);
        gcTextBox1.TouchToolBar.Items.RemoveAt(1);
        gcTextBox1.TouchToolBar.Items.RemoveAt(2);
        gcTextBox1.TouchToolBar.Items.RemoveAt(4);
    }
}

// 貼り付けのアクションを定義します。
public class PasteAction : ITouchBarAction
{
    public bool CanExecute(object target)
    {
        EditBase owner = target as EditBase;
        // 読み取り専用時は無効にします。
        if (owner == null || owner.ReadOnly == true)
        {
            return false;
        }
        return true;
    }

    public void Execute(object target)
    {
        EditBase owner = target as EditBase;
        owner.Paste();
    }
}

// 切り取りのアクションを定義します。
public class CutAction : ITouchBarAction
{
    public bool CanExecute(object target)
    {
        EditBase owner = target as EditBase;
        // 読み取り専用時は無効にします。
        if (owner == null || owner.ReadOnly == true || owner.SelectedText.Length == 0)
        {
            return false;
        }
        return true;
    }

    public void Execute(object target)
    {
        EditBase owner = target as EditBase;
        owner.Cut();
    }
}

// 削除のアクションを定義します。
public class DeleteAction : ITouchBarAction
{
    public bool CanExecute(object target)
    {
        EditBase owner = target as EditBase;
        // 読み取り専用時は無効にします。
        if (owner == null || owner.ReadOnly == true || owner.Text.Length == 0)
        {
            return false;
        }
        return true;
    }

    public void Execute(object target)
    {
        EditBase owner = target as EditBase;
        owner.Text = owner.Text.Remove(0);
    }
}