• ベストアンサー

配列化したTextBoxへの値の入れ方

http://oshiete1.goo.ne.jp/kotaeru.php3?q=1085830 にて、「コントロールのドラッグ・ドロップ」について 質問をさせていただいた結果WithEvents を利用して、、、 という回答をいただきましたが、コントロールをクラス 配列にすると理解してサンプルを作ってみました。 結果、ドラッグによるコントロール移動は実現できたので すが、そのコントロールがTextBoxであった場合など、ど のようにしてそのTextBoxにコードにて値を入れていいの かわかりません。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.5

>CommandButton1はそのままで、TextBox1が、 >c(0)、c(1) になった場合、どのように >"ABC"と表示させられるのか、、、ということ >なんですが、、、何でもすみません。 案1 Sub CommandButton1_Click()   TextBox1.Text="ABC" End Sub このまんま。あえてc(0)とか使う必要なし 案2 c(0).SetCtl Text1 で入れたのですから、逆の事をするTextBoxコントロールのオブジェクトを取り出すメソッドやプロパティをClass1に追加してあげる。 Class1に Public Function GetTextObject() Set GetTextObject = m_t End Function と追加して、 formの方では c(0).GetTextObject.text = "123" みたいにするとか。 Formのほうで何とかするんでしたらこんな感じですかね。

その他の回答 (4)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.4

>たとえば、CommandButton1_Click 時に c(0)の値 を変えたい場合などはどうしたらいいのでしょうか? というか、WithEventsで定義された変数m_Command_Click時って感じの話ですよね。 WithEventsがついててもようは変数なんですから、 m_Command.Caption = "新しいキャプション名" ですよ。

urourojp
質問者

補足

たとえば、、普通に CommandButton1 と TextBox1 があった場合、 Sub CommandButton1_Click()   TextBox1.Text="ABC" End Sub でいけると思うんですが、、 CommandButton1はそのままで、TextBox1が、 c(0)、c(1) になった場合、どのように "ABC"と表示させられるのか、、、ということ なんですが、、、何でもすみません。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.3

Form_Loadの中身間違えました(^^; で、対象コントロールがテキストボックス2つという仮定です。 Sub Form_Load() Set c(0) = New Class1 Set c(1) = New Class1 c(0).SetCtl Text1 c(0).SetCtl Text2 End Sub

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

クラスモジュールを使うとシンプルになります。 '------------- 'form1.frm Dim c(0 to 1) As Class1 Sub Form_Load() Set c(0) = New Class1 Set c(1) = New Class1 End Sub '------------- 'class1.frm Dim WithEvents m_t As TextBox Public Sub SetCtl(t As TextBox) Set m_t = t End Sub Private Sub m_txt_Change() ・ ・ ・ End Sub なんて感じで。

urourojp
質問者

補足

こんにちは。前回はありがとうございました。 そのTextボックス自体にイベントが発生したときは それをきっかけに値が取得できると思うのですが、 たとえば、CommandButton1_Click 時に c(0)の値 を変えたい場合などはどうしたらいいのでしょうか?

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.1

VBAで無く、VBですよね。 下記と違う方法の処理の方向に進んでいるようですが 折角便利なものがあるのに、下記では駄目なのでしょうか。コントロールの種類を越えて、汎用的にイベントを捉えないといけないのでしょうか。 ご存知のはずなので、見当はずれの場合はご免ください。 (基本)VBはコントロール配列が使える。 それは1つのコントロールを複写・貼りつけで増やす場合に限る。したがって同種のコントロールだけしか、配列化 出来ない。 (何かのイベントで、静的に全部を対象に値をセット。勿論一部も判別すれば出きる。) Private Sub Form_Load() s = Array("aa", "bb", "cc") For i = 0 To 2 Form1.Text1(i) = s(i) Next End Sub FormがLoadされる時に TextNo1にaa, TextNo2にbb, TextNo3にccをセットします。 (それら複数のコントロールの何か1種のイベントを捉え 処理をする場合) 引数で Index値を持ってきてくれるので、それを使える。 Private Sub Text1_Click(Index As Integer) s = Array("xx", "yy", "zz") Form1.Text1(Index) = s(Index) End Sub テキストボックスがどれかクリックされたときクリックされたテキストボックスに所定の値をセットする。 Index値で処理を分けるなら、CASE分けをして、処理ルーチンを書けば良い。

urourojp
質問者

補足

もともとの実行時のコントロールの移動もおっしゃる形で 実現はできたのですが、同じコードを何回も書いている気 がしたので、もっと簡単にならないかと考えました。 そこでクラス化をしたのですが、クラスオブジェクト自体 にイベントが発生した場合は何とかなるのですが、自体に イベントが発生していないときにどのような作業をしたら いいのかと再度、質問させてもらいました。