tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルコントロール名が勝手に変わる・・・
記事No5003
投稿日: 2007/02/27(Tue) 08:32
投稿者フウセンウナギ
WindowsXP SP2 VB2005

フォームにテキストボックス"txt1"を貼り付け、コードで以下のように記述します。
Msgbox txt1.Text
これで、テキストボックスのコントロール名を"txt2"に変えると、コードも
Msgbox txt2.Text
と勝手に変わってしまいます。

また、txt1を削除すると、txt1に関連付けられたイベントとの関連付けがなくなっていまいます。


これらを防ぐ方法というか設定というのはないのでしょうか?
ツール→オプションを一通り見たのですが分かりませんでした。

[ツリー表示へ]
タイトルRe: コントロール名が勝手に変わる・・・
記事No5004
投稿日: 2007/02/27(Tue) 09:24
投稿者魔界の仮面弁士
> Msgbox txt1.Text
VB2005 っぽくないコードですね……。
メソッド呼び出しに括弧が無いと、コンパイルエラー(BC30800)になるはずなんですけど。


> Msgbox txt2.Text
> と勝手に変わってしまいます。
連動してくれた方が便利だったりしませんか?
# 極端な話、初期設定の TextBox1 のままだったら困りますよね。

というよりも、コントロール名を変えておいて、それを利用するコードを
修正したくない…という状況が思い浮かびませんでした。
名前を txt1 → txt2 にした、ということは、txt1 なコントロールが
無くなったという事ですよね。にもかかわらず、txt1 を残したいという
状況が思い浮かびませんでした。

> txt1に関連付けられたイベントとの関連付けがなくなっていまいます。
WithEvents 定義のコントロールなら、イベント宣言末尾の「Handles」句の修正漏れとか。

> これらを防ぐ方法というか設定というのはないのでしょうか?
元のコードをコピーしておいて、名称変更後に手動でコードを復元、という泥縄的方法とか。

[ツリー表示へ]
タイトルRe^2: コントロール名が勝手に変わる・・・
記事No5006
投稿日: 2007/02/27(Tue) 12:06
投稿者フウセンウナギ
> > Msgbox txt1.Text
> VB2005 っぽくないコードですね……。
> メソッド呼び出しに括弧が無いと、コンパイルエラー(BC30800)になるはずなんですけど。
>
>
> > Msgbox txt2.Text
> > と勝手に変わってしまいます。
> 連動してくれた方が便利だったりしませんか?
> # 極端な話、初期設定の TextBox1 のままだったら困りますよね。
>
> というよりも、コントロール名を変えておいて、それを利用するコードを
> 修正したくない…という状況が思い浮かびませんでした。
> 名前を txt1 → txt2 にした、ということは、txt1 なコントロールが
> 無くなったという事ですよね。にもかかわらず、txt1 を残したいという
> 状況が思い浮かびませんでした。
>
> > txt1に関連付けられたイベントとの関連付けがなくなっていまいます。
> WithEvents 定義のコントロールなら、イベント宣言末尾の「Handles」句の修正漏れとか。
>
> > これらを防ぐ方法というか設定というのはないのでしょうか?
> 元のコードをコピーしておいて、名称変更後に手動でコードを復元、という泥縄的方法とか。


自分は画面の起動時のコントロールをすべて配列にセットしています。
Private txt() As System.Windows.Forms.TextBox

Me.txt = New System.Windows.Forms.TextBox(3) {}

Me.txt(0) = txt0
Me.txt(1) = txt1
  ・
  ・
  ・


この状態でコントロール名をtxt0からtxt1に変えたとき、

Me.txt(0) = txt1
Me.txt(1) = txt1

などとなっていまいます。



まあ、逆に言えば最初に配列にセットするため
この定義部分だけ修正すれば済むことなのですが・・・

[ツリー表示へ]
タイトルRe^3: コントロール名が勝手に変わる・・・
記事No5007
投稿日: 2007/02/27(Tue) 15:23
投稿者魔界の仮面弁士
すみません。まだ状況が理解できていません。


> 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
という状況にはならないと思いますし……。

[ツリー表示へ]
タイトルRe^4: コントロール名が勝手に変わる・・・
記事No5008
投稿日: 2007/02/27(Tue) 15:59
投稿者フウセンウナギ
>
> ひとつずらして、txt1 を txt2 にしてから、txt0 を txt1 にするというのであれば
> まだわかりますが、それならば、
> > Me.txt(0) = txt1
> > Me.txt(1) = txt1
> という状況にはならないと思いますし……。


言い方が適当すぎました、すいません。その例で正しいです。

Me.txt(0) = txt0
Me.txt(1) = txt1



Me.txt(0) = txt1
Me.txt(1) = txt2


なってしまうのです。

[ツリー表示へ]
タイトルRe^5: コントロール名が勝手に変わる・・・
記事No5009
投稿日: 2007/02/27(Tue) 16:12
投稿者魔界の仮面弁士
解決策は、先に書いた泥縄的な方法しか提示できないのですが、それはそれとして。

> なってしまうのです。
結局、それが何故まずいのでしょうか?

[ツリー表示へ]
タイトルRe^6: コントロール名が勝手に変わる・・・
記事No5014
投稿日: 2007/02/28(Wed) 09:59
投稿者よねKEN
> 解決策は、先に書いた泥縄的な方法しか提示できないのですが、それはそれとして。
>
> > なってしまうのです。
> 結局、それが何故まずいのでしょうか?

配列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内以外)のコントロール名までは修正しない、
#という要望は一般的とは言えないでしょうし、汎用性もないので、そういう機能は用意されていないのだと思いますよ。

[ツリー表示へ]
タイトルRe^7: コントロール名が勝手に変わる・・・
記事No5015
投稿日: 2007/02/28(Wed) 11:47
投稿者フウセンウナギ
>
> しかし、配列txtとtxt?とをどのように対応付けるか?はフウセンウナギさんが
> (Visual Studioかれ見れば勝手に)決めていることなので、Visual Studioが知るすべはありません。
> というわけで、手修正で対応するしかありませんね。
>
> #コントロール名を修正してもソースコード上(のInitializeComponent内以外)のコントロール名までは修正しない、
> #という要望は一般的とは言えないでしょうし、汎用性もないので、そういう機能は用意されていないのだと思いますよ。


分かりました。('・ω・`)ショボーン
どうもありがとうです。

[ツリー表示へ]
タイトル発想を変えて
記事No5017
投稿日: 2007/02/28(Wed) 16:46
投稿者ダンボ
> 配列txtのインデックスとtxt?(?は数字)でインデックスと?を一致させたいからでしょう。

VB6まででは便利だったコントロール配列ですが、ExcelVBAでは既に無かったし、VB.Netでも
無くなってしまいました。それを知った当初は私もずいぶん憤慨したものですが
「何かを達成するためにVB.Netではコントロール配列をあきらめた」(詳細忘れ)という
記事を読んでから、私もすっぱりコントロール配列をあきらめました。必要ならコレクション
でまとめなおすと。。

で、踏ん切りがつくとtxt(1)=txt1のような二重管理は逆に紛らわしくなりませんか?
似た名前だからこそ揃える努力が必要になる。配列名を主でハンドルするならもう元の名前は
気にしないと。コードにも書かないつもりで。

[ツリー表示へ]