XPだとロックしているのに「貼り付け」できる!


す〜なん  2003-10-14 20:44:52  No: 109093

VBでプログラムを作成しています。

TextboxのLockedを「True」にしても、
XPでは「右クリック」すると「貼り付け」がDisabledになっておらず、
貼り付けることが出来てしまいます。
貼り付けた内容をDeleteしようにもTextbox自体は「Locked」状態なので
Deleteできません。
95・98では「貼り付け」はできません。

「貼り付け」できないように制御する方法をどなたかご存知でしたら
教えてください。よろしくお願いします!


魔界の仮面弁士  2003-10-14 22:59:37  No: 109094

Windows 2000以降では、読取専用(.Locked = True)のテキストボックスでも、
『貼り付け』メニューは淡色表示されません。(KBの416041を参照)
VBに限らず、エクスプローラからの『ファイルのプロパティ』などでも、
読取専用の項目で、「貼り付け」メニューが淡色表示されません。

# ただし、VBの場合とは異なり、実際にペーストする事はできませんけれども。

> 「貼り付け」できないように制御する方法を
とりあえずは、GotFocus時にクリップボードをクリアすれば、
簡易的な対応にはなります。 厳密に制限したいのであれば、
サブクラス化して WM_PASTE メッセージを握りつぶすようにして下さい。


す〜なん  2003-10-15 03:49:53  No: 109095

>(KBの416041を参照)

すみません。「KB」って何でしょう?

>GotFocus時にクリップボードをクリア

Textboxの数は大量(数百)にあり、すべてのコントロールに対して
イベントを追加するのは非常にロードがかかってしまいますね・・・・。
う〜ん。


魔界の仮面弁士  2003-10-15 12:30:43  No: 109096

> すみません。「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


す〜なん  2003-10-15 23:04:34  No: 109097

>一つのフォームに、TextBoxだけで数百もあるのですか?

いえ。修正するプログラムが10以上あり、
1プログラムあたり5〜10のフォームがあると考えてください。

教えていただいたプログラミングですと、
フォームを開く前にCOPYした内容は貼り付けできませんが
開いたあとでCOPYした内容はCOPYできるような気がします。


魔界の仮面弁士  2003-10-16 04:05:49  No: 109098

> フォームを開く前にCOPYした内容は貼り付けできませんが
> 開いたあとでCOPYした内容はCOPYできるような気がします。

ですます。(^_^;)
それこそが、『簡易的な対応』という表現をしていた所以です。

厳密に制限したいのであれば、(先の回答にも書きましたように)
WM_PASTEを捉えるようにしてみて下さい。


す〜なん  2003-10-17 18:25:27  No: 109099

『簡易的な対応』ってそういうことだったのですね。

WM_PASTEを制御するのですね。
サブクラス化のプログラミングをしたことはないのですが、
参考になりそうなものを見つけたのでやってみます。

…M社は「『貼り付け』メニューが淡色表示されない」事象を
バージョンダウンとはみなしてないのでしょうか?
淡色表示されるよう修正してさえくれれば、このような問題に
頭を悩ます必要はないのに…独り言です。


す〜なん  2003-10-17 18:25:33  No: 109100

『簡易的な対応』ってそういうことだったのですね。

WM_PASTEを制御するのですね。
サブクラス化のプログラミングをしたことはないのですが、
参考になりそうなものを見つけたのでやってみます。

…M社は「『貼り付け』メニューが淡色表示されない」事象を
バージョンダウンとはみなしてないのでしょうか?
淡色表示されるよう修正してさえくれれば、このような問題に
頭を悩ます必要はないのに…独り言です。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加