VBでプログラムを作成しています。
TextboxのLockedを「True」にしても、
XPでは「右クリック」すると「貼り付け」がDisabledになっておらず、
貼り付けることが出来てしまいます。
貼り付けた内容をDeleteしようにもTextbox自体は「Locked」状態なので
Deleteできません。
95・98では「貼り付け」はできません。
「貼り付け」できないように制御する方法をどなたかご存知でしたら
教えてください。よろしくお願いします!
Windows 2000以降では、読取専用(.Locked = True)のテキストボックスでも、
『貼り付け』メニューは淡色表示されません。(KBの416041を参照)
VBに限らず、エクスプローラからの『ファイルのプロパティ』などでも、
読取専用の項目で、「貼り付け」メニューが淡色表示されません。
# ただし、VBの場合とは異なり、実際にペーストする事はできませんけれども。
> 「貼り付け」できないように制御する方法を
とりあえずは、GotFocus時にクリップボードをクリアすれば、
簡易的な対応にはなります。 厳密に制限したいのであれば、
サブクラス化して WM_PASTE メッセージを握りつぶすようにして下さい。
>(KBの416041を参照)
すみません。「KB」って何でしょう?
>GotFocus時にクリップボードをクリア
Textboxの数は大量(数百)にあり、すべてのコントロールに対して
イベントを追加するのは非常にロードがかかってしまいますね・・・・。
う〜ん。
> すみません。「KB」って何でしょう?
失礼しました。『Microsoft Knowledge Base』の事です。
具体的には、以下の資料となります。
http://support.microsoft.com/?kbid=416041
> Textboxの数は大量(数百)にあり
……一つのフォームに、TextBoxだけで数百もあるのですか?
それは画面の設計段階で、若干の問題があるかも。。。
それはさておき、それらがコントロール配列になっているなら、
Private Sub Text1_GotFocus(Index As Integer)
Clipboard.Clear
End Sub
と書くだけですから、それほどの手間でも無いような気がします。
また、コントロール配列化されていない場合は、WithEvents変数を利用できます。
例えば、以下のようなコードを書けば、Form1上にあるTextBoxのGotFocusイベントを、
Class1クラスで、まとめて処理する事ができますよ。
'==== Form1 ====
Option Explicit
Private mcolTextBox As VBA.Collection
Private Sub Form_Load()
Dim Ctrl As VB.Control
Set mcolTextBox = New VBA.Collection
For Each Ctrl In Me.Controls
If TypeOf Ctrl Is TextBox Then
mcolTextBox.Add NewClass1(Ctrl)
End If
Next
'------
' ここに、既存のForm_Load処理を記述します
'------
End Sub
Private Function NewClass1(ByVal Txt As VB.TextBox) As Class1
Set NewClass1 = New Class1
Call NewClass1.Initilalize(Txt)
End Function
'==== Class1 ====
Option Explicit
Private WithEvents mTextBox As VB.TextBox
Friend Sub Initilalize(ByVal Txt As VB.TextBox)
On Error Resume Next
Set mTextBox = Txt
End Sub
Private Sub mTextBox_GotFocus()
Clipboard.Clear
End Sub
>一つのフォームに、TextBoxだけで数百もあるのですか?
いえ。修正するプログラムが10以上あり、
1プログラムあたり5〜10のフォームがあると考えてください。
教えていただいたプログラミングですと、
フォームを開く前にCOPYした内容は貼り付けできませんが
開いたあとでCOPYした内容はCOPYできるような気がします。
> フォームを開く前にCOPYした内容は貼り付けできませんが
> 開いたあとでCOPYした内容はCOPYできるような気がします。
ですます。(^_^;)
それこそが、『簡易的な対応』という表現をしていた所以です。
厳密に制限したいのであれば、(先の回答にも書きましたように)
WM_PASTEを捉えるようにしてみて下さい。
『簡易的な対応』ってそういうことだったのですね。
WM_PASTEを制御するのですね。
サブクラス化のプログラミングをしたことはないのですが、
参考になりそうなものを見つけたのでやってみます。
…M社は「『貼り付け』メニューが淡色表示されない」事象を
バージョンダウンとはみなしてないのでしょうか?
淡色表示されるよう修正してさえくれれば、このような問題に
頭を悩ます必要はないのに…独り言です。
『簡易的な対応』ってそういうことだったのですね。
WM_PASTEを制御するのですね。
サブクラス化のプログラミングをしたことはないのですが、
参考になりそうなものを見つけたのでやってみます。
…M社は「『貼り付け』メニューが淡色表示されない」事象を
バージョンダウンとはみなしてないのでしょうか?
淡色表示されるよう修正してさえくれれば、このような問題に
頭を悩ます必要はないのに…独り言です。
ツイート | ![]() |