| 2015/05/20(Wed) 10:06:56 編集(投稿者)
■No75887 (魔界の仮面弁士 さん) に返信
度々の質問を失礼致します。 多くの言葉を頂き大変勉強させていただいております。 せっかくですのでもう少しお時間の許す限り、お付き合いいただければ幸いに存じます。
>TextBoxBase は利用しないでください。 の『利用しない』、この禁止の適用範囲がわかりません。 それではなぜTextBoxBase.TextChangedがあるのだろう、と思ってしまいます。 どの様なときにTextBoxBase.TextChangedを使うのでしょうか。
なぜそう思うのかは、 Public Class Form1 Private WithEvents TextBox0 As TextBoxBase Private WithEvents TextBox1 As TextBox Private WithEvents TextBox2 As MyTextBox Enum EnableMode StrNo = 0 '文字列無し SelectNo = 1 '選択文字列無し SelectAllTextBox = 2 '文字列全選択、TextBox SelectAllMyTextBox = 3 '文字列全選択、MyTextBox SelectSomeTextBox = 4 '文字列あり、選択有り、TextBox SelectSomeTextBox = 5 '文字列あり、選択有り、MyTextBox End Enum ・ ・ ・ ↓↓↓↓↓↓↓↓↓↓↓↓ここから↓↓↓↓↓↓↓↓↓↓↓↓↓↓
Friend Sub AllTextBox_MouseDown(sender As Object, e As MouseEventArgs) Handles TextBox0.MouseDown Dim sp sp As System.Drawing.Point= System.Windows.Forms.Cursor.Position If (Control.MouseButtons And MouseButtons.Right) = MouseButtons.Right Then ContextMenuStrip_FormYSKAMPROP.Show(sp) If TextBox0.TextLength = 0 Then MenuEnabled(EnableMode.StrNo, TextBox0) ElseIf TexTBox0.SelectionLength = 0 Then MenuEnabled(EnableMode.SelectNo, TextBox0) ElseIf TextBox0.GetType.ToString = "ClassLibrary.TextBox" AndAlso TexTBox0.SelectionLength = TextBox0.TextLength Then MenuEnabled(EnableMode.SelectAllTextBox, TextBox0) ElseIf TextBox0.GetType.ToString = "ClassLibrary.MyTextBox" AndAlso TexTBox0.SelectionLength = TextBox0.TextLength Then MenuEnabled(EnableMode.SelectAllMyTextBox, TextBox0) ElseIf TextBox0.GetType.ToString = "ClassLibrary.TextBox" AndAlso TexTBox0.SelectionLength > 0 Then MenuEnabled(EnableMode.SelectSomeTextBox, TextBox0) ElseIf TextBox0.GetType.ToString = "ClassLibrary.MyTextBox" AndAlso TexTBox0.SelectionLength > 0 Then MenuEnabled(EnableMode.SelectSomeMyTextBox, TextBox0) End If End if End Sub Private Sub MenuEnabled(ByVal strEnable As EnableMode, ByVal TextBox0 As TextBoxBase) Select Case strEnable Case EnableMode.StrNo ToolStripMenuItem_CUT.Enabled = False ToolStripMenuItem_COPY.Enabled = False ToolStripMenuItem_DELETE.Enabled = False ToolStripMenuItem_SELECTALL.Enabled = False Case EnableMode.SelectNo ・ ・ ・ End Sub ↑↑↑↑↑↑↑↑↑↑↑↑ここまで↑↑↑↑↑↑↑↑↑↑↑↑↑↑ こうイベントを一括して回したいからです。 【こう言う使い方はいわゆる、『邪道』なのですか。】 (初めからこういう事をしていいのか?できるのか?という事を 聞きたかったのですが、様々な助言が新鮮かつ疑問に思う事もあり、 簡潔な質問にならずすみませんでした。 後、他者と初めて話題にする為、語彙力がなく説明方法がわかりませんでした、 すみません。)
______________________________________________________________________ ______________________________________________________________________ >> コンテキストメニューアイテムのそれぞれの >> ShortcutKeysプロパティにはCtrl+Z、X、C、Vと振っています。 >標準割当のキー操作と競合しないよう、各 TextBox の ShortcutsEnabled を >False にしてありますか? Falseでなかったので、 @それぞれのTextBox.ShortcutKeys = True だったところをFalseにし、 ToolStripMenuItem_UNDOREDO.ShortcutsEnabled = Ctrl+Z ToolStripMenuItem_CUT.ShortcutKeys = Ctrl+X ToolStripMenuItem_COPY.ShortcutKeys = Ctrl+C ToolStripMenuItem_PASTE.ShortcutKeys = Ctrl+V ToolStripMenuItem_DELETE.ShortcutKeys = DEL ToolStripMenuItem_SELECTALL.ShortcutKeys = Ctrl+A (ToolStripMenuItem_***.ShortcutKeysはこれまで通りです。) としたところ、 ショートカットキー入力では、どのToolStripMenuItemイベントにも回らず、 反応しなくなりまして、 Aさらには.ShortcutsEnabled = False。と戻しても同様反応しなくなりました。
>標準の Undo 動作を活かす方法を模索するのがよろしいかと。 Bという事で元に戻しております。 そして、各TextBox(またはMyTextBox).Textの内容が変わってものUndoにも 格納しなくなったようです。
と考えているうちに、!!! いっぺんに改変してしまって自身で状況がつかめておらずすみません。 【どれもこれも、通常のイベントに反応しないのは もしかすると、すべての原因は『ユーザー入力でない』からでしょうか。】 じゃんぬ さんのこのMyTextBox http://jeanne.wankuma.com/tips/vb.net/textbox/permitchars.html イベント発生を横取りという事は、 通常イベントも発生しなくなるという事なのでしょうか。 (すごい基本的な事なのかも知れない…;;;)
Private Sub undoredo_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles ToolStripMenuItem_UNDOREDO.Click Dim CMSSource As Control = ContextMenuStrip_FormYSKAMPROP.SourceControl If CMSSource.GetType.ToString = "YSKAMPROPClassLibrary.MyTextBox" Then(●※1●) If MyTexBox.CanUndo = True Then Dim TextBox As MyTextBox = CType(CMSSource, MyTextBox) TextBox.Undo() End If End If End Sub
●※1● また少し別の質問になってしまいますが、 ここで"MyTextBox"とTextBoxの振り分けをしていますが、KeyDownイベント中などで振り分けた方が いいのでしょうか。 どこでもできる様な規制のない事に対して、 どこでするのが理想的等、基本的な順序の様なものがもしあるようでしたら、助言いただけますと助かります。
______________________________________________________________________ ______________________________________________________________________
> とりあえず、こんな感じで如何でしょう。 > WndProc メソッドを下記のように実装してみて下さい。 > > Select Case m.Msg > Case WM_RBUTTONDOWN '&H204 > Dim m2 = Message.Create(m.HWnd, m.Msg, m.WParam, m.LParam) > m.Msg = WM_LBUTTONDOWN '&H201 > MyBase.WndProc(m) > MyBase.WndProc(m2) > Return
恐れ入ります、(書いている内容の意味は分かるのですが)これをどう実装すれば 機能するのかがわかりません、 (WndProcメソッドは先のじゃんぬ さんの例で使ってみて、 その意味を魔界の仮面弁士 さんの説明で何となく理解を得ました。) いろいろ試しましたが、目的の様に機能はしませんでした。 もう少し詳細お教えいただけると助かります。
理解が悪く申し訳ないです。 そして、この『左クリックを一旦入れる』はユーザー入力ではないから、 ここでマウスイベントは発生しないと考えていいのでしょうか?
______________________________________________________________________ ______________________________________________________________________
そして最後の質問です、またトピック(表題)と異なる質問ですが、 前回記した件です、 いろんな種類のエラーが出た後、最終的にはこれが本当に伝えたいエラーなのだろうと 思うものが、あるのですが、そのエラーの意味が解りません。 このエラーがあってもコンパイル(ビルド)はでき、デバックもできます。 もしお分かりでしたら、解説いただけますと助かります。 ・・ メッセージ・・・ 型MyTextBoxが見つかりませんでした。この型を含むアセンブリが参照していることを確認してください。 変数'TextBox2'は宣言されていないか、または割り当てられていません。 (これが最初出ていて、放置しておくと、) ↓ ↓ ↓ 'ClassLibrary.MyTextBox'は、ターゲット フレームワークでは使用できません。
※もちろんMyTextBoxはアセンブリ内に存在しています。 ターゲットフレームワークとMyTextBoxの相性?がうまくいっていないという意味なのでしょうか。
度々簡潔でなく複数の質問で読みづらいかとは存じますが、ご意見いただけますと幸いです。 |