コントロールが読み取り専用でもタッチツールバーの「貼り付け」「切り取り」「削除」ボタンが無効にならない
対象製品
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);
}
}
不具合を修正した最新のサービスパックは、アップデートページ からダウンロードできます。
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);
}
}