WindowsXP SP2 VB2005フォームにテキストボックス"txt1"を貼り付け、コードで以下のように記述します。Msgbox txt1.Textこれで、テキストボックスのコントロール名を"txt2"に変えると、コードもMsgbox txt2.Textと勝手に変わってしまいます。また、txt1を削除すると、txt1に関連付けられたイベントとの関連付けがなくなっていまいます。これらを防ぐ方法というか設定というのはないのでしょうか?ツール→オプションを一通り見たのですが分かりませんでした。
> Msgbox txt1.TextVB2005 っぽくないコードですね……。メソッド呼び出しに括弧が無いと、コンパイルエラー(BC30800)になるはずなんですけど。> Msgbox txt2.Text> と勝手に変わってしまいます。連動してくれた方が便利だったりしませんか?# 極端な話、初期設定の TextBox1 のままだったら困りますよね。というよりも、コントロール名を変えておいて、それを利用するコードを修正したくない…という状況が思い浮かびませんでした。名前を txt1 → txt2 にした、ということは、txt1 なコントロールが無くなったという事ですよね。にもかかわらず、txt1 を残したいという状況が思い浮かびませんでした。> txt1に関連付けられたイベントとの関連付けがなくなっていまいます。WithEvents 定義のコントロールなら、イベント宣言末尾の「Handles」句の修正漏れとか。> これらを防ぐ方法というか設定というのはないのでしょうか?元のコードをコピーしておいて、名称変更後に手動でコードを復元、という泥縄的方法とか。
> > Msgbox txt1.Text> VB2005 っぽくないコードですね……。> メソッド呼び出しに括弧が無いと、コンパイルエラー(BC30800)になるはずなんですけど。> > > > Msgbox txt2.Text> > と勝手に変わってしまいます。> 連動してくれた方が便利だったりしませんか?> # 極端な話、初期設定の TextBox1 のままだったら困りますよね。> > というよりも、コントロール名を変えておいて、それを利用するコードを> 修正したくない…という状況が思い浮かびませんでした。> 名前を txt1 → txt2 にした、ということは、txt1 なコントロールが> 無くなったという事ですよね。にもかかわらず、txt1 を残したいという> 状況が思い浮かびませんでした。> > > txt1に関連付けられたイベントとの関連付けがなくなっていまいます。> WithEvents 定義のコントロールなら、イベント宣言末尾の「Handles」句の修正漏れとか。> > > これらを防ぐ方法というか設定というのはないのでしょうか?> 元のコードをコピーしておいて、名称変更後に手動でコードを復元、という泥縄的方法とか。自分は画面の起動時のコントロールをすべて配列にセットしています。Private txt() As System.Windows.Forms.TextBoxMe.txt = New System.Windows.Forms.TextBox(3) {}Me.txt(0) = txt0Me.txt(1) = txt1 ・ ・ ・この状態でコントロール名をtxt0からtxt1に変えたとき、Me.txt(0) = txt1Me.txt(1) = txt1などとなっていまいます。まあ、逆に言えば最初に配列にセットするためこの定義部分だけ修正すれば済むことなのですが・・・
すみません。まだ状況が理解できていません。> Me.txt(0) = txt0> Me.txt(1) = txt1> この状態でコントロール名をtxt0からtxt1に変えたとき、そんな事をしたら、txt1 というコントロールが 2つになってしまいませんか?(内部的には可能ですが、Visual Studio 環境は、それを許可していませんよね)ひとつずらして、txt1 を txt2 にしてから、txt0 を txt1 にするというのであればまだわかりますが、それならば、> Me.txt(0) = txt1> Me.txt(1) = txt1という状況にはならないと思いますし……。
> > ひとつずらして、txt1 を txt2 にしてから、txt0 を txt1 にするというのであれば> まだわかりますが、それならば、> > Me.txt(0) = txt1> > Me.txt(1) = txt1> という状況にはならないと思いますし……。言い方が適当すぎました、すいません。その例で正しいです。Me.txt(0) = txt0Me.txt(1) = txt1がMe.txt(0) = txt1Me.txt(1) = txt2なってしまうのです。
解決策は、先に書いた泥縄的な方法しか提示できないのですが、それはそれとして。> なってしまうのです。結局、それが何故まずいのでしょうか?
> 解決策は、先に書いた泥縄的な方法しか提示できないのですが、それはそれとして。> > > なってしまうのです。> 結局、それが何故まずいのでしょうか?配列txtのインデックスとtxt?(?は数字)でインデックスと?を一致させたいからでしょう。1. Me.txt(0)にtxt0が入っている。2. txt0をtxt1にリネームする。3a. Visual Studioはコード上のtxt0をtxt1に修正する。 よってMe.txt(0)の中身はtxt1(内容は元々のtxt0)になる。 当然、無関係なMe.txt(1)を書き換えたりはしない。3b. フウセンウナギさんはリネーム後のtxt1はMe.txt(1)に入っていて欲しい。といった感じですよね>質問者さんしかし、配列txtとtxt?とをどのように対応付けるか?はフウセンウナギさんが(Visual Studioかれ見れば勝手に)決めていることなので、Visual Studioが知るすべはありません。というわけで、手修正で対応するしかありませんね。#コントロール名を修正してもソースコード上(のInitializeComponent内以外)のコントロール名までは修正しない、#という要望は一般的とは言えないでしょうし、汎用性もないので、そういう機能は用意されていないのだと思いますよ。
> > しかし、配列txtとtxt?とをどのように対応付けるか?はフウセンウナギさんが> (Visual Studioかれ見れば勝手に)決めていることなので、Visual Studioが知るすべはありません。> というわけで、手修正で対応するしかありませんね。> > #コントロール名を修正してもソースコード上(のInitializeComponent内以外)のコントロール名までは修正しない、> #という要望は一般的とは言えないでしょうし、汎用性もないので、そういう機能は用意されていないのだと思いますよ。分かりました。('・ω・`)ショボーンどうもありがとうです。
> 配列txtのインデックスとtxt?(?は数字)でインデックスと?を一致させたいからでしょう。VB6まででは便利だったコントロール配列ですが、ExcelVBAでは既に無かったし、VB.Netでも無くなってしまいました。それを知った当初は私もずいぶん憤慨したものですが「何かを達成するためにVB.Netではコントロール配列をあきらめた」(詳細忘れ)という記事を読んでから、私もすっぱりコントロール配列をあきらめました。必要ならコレクションでまとめなおすと。。で、踏ん切りがつくとtxt(1)=txt1のような二重管理は逆に紛らわしくなりませんか?似た名前だからこそ揃える努力が必要になる。配列名を主でハンドルするならもう元の名前は気にしないと。コードにも書かないつもりで。