tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトル前画面の処理
記事No1022
投稿日: 2004/08/12(Thu) 12:06
投稿者くいな
[OSのVer]:Windows 2000   [VBのVer]:VB.NET   2003

タイトルがForm2〜Form1のテキストボックスの内容を・・・
というのを拝見してわからないことがあります。

フォーム2でフォーム1上にあるテキストボックスのテキストを取得するにはどうすればよいんでし
ょうか?

・フォーム1にテキストボックスを1つ貼り付ける
 テキストボックスのテキストに"フォーム1のテキストボックス"を付ける

・フォーム1にボタンを1つ貼り付けてフォーム2の画面に映る
  
  dim frm_2 as form = new form2
  frm_2.show()

・フォーム2のOpenじの処理にフォーム1を呼び出し、フォーム1上にあるテキストボックスの
 テキストを取得する
 
 dim frm1 as from = new from1

 このときにフォーム1上にあるテキストボックスをどうやって取得するのでしょうか?

 "frm1.textbox1" というのが出てきません。
 
 何か設定するところがあるのでしょうか?

[ツリー表示へ]
タイトルRe: 前画面の処理
記事No1024
投稿日: 2004/08/12(Thu) 12:34
投稿者魔界の仮面弁士
>  dim frm1 as from = new from1
>  このときにフォーム1上にあるテキストボックスをどうやって取得するのでしょうか?
>  "frm1.textbox1" というのが出てきません。

from というのは、Form の書き間違いかと思いますが、それはさておき。

Form1 というクラスは、標準のFormクラスを継承して作成された、独自のクラスですよね。
そして、標準のFormクラス自体には、TextBox1 というメンバは用意されていません。
そのため、「frm1.TextBox1」のようなメンバは、IntelliSense には表示されません。


この場合、変数が As Form1 で宣言してあれば、TextBox1 にもアクセスする事ができます。
(または、DirectCastを使って、型変換を行ってもOKです)

ただし、フォーム外から TextBox1 にアクセスするためには、そのコントロールが
Privateスコープではなく、FriendやPublicなどで宣言されている必要があります。


ただ、カプセル化の原則から言えば、フォーム外からフォーム上のコントロールを
直接参照するような設計は、あまり望ましくありません。できれば、フォームに
メソッドやプロパティを定義し、間接的にアクセスされた方が良いでしょう。

[ツリー表示へ]
タイトルRe^2: 前画面の処理
記事No1026
投稿日: 2004/08/12(Thu) 13:00
投稿者くいな
どうもありがとうございます。

解決しました

[ツリー表示へ]
タイトルRe^2: 前画面の処理(便乗質問)
記事No1027
投稿日: 2004/08/13(Fri) 16:11
投稿者花ちゃん
> ただ、カプセル化の原則から言えば、フォーム外からフォーム上のコントロールを
> 直接参照するような設計は、あまり望ましくありません。できれば、フォームに
> メソッドやプロパティを定義し、間接的にアクセスされた方が良いでしょう。

Module も使用しない方がいいと言う事でしょうか?

Form1 からForm2 上のテキストボックスへの読み書きはプロパティを定義して
比較的簡単に取得する事ができたのですが、その逆のForm2 からForm1 上の
テキストボックスへの読み書きは、同様にはできないようなのですが(どぼん!さん
のところのサンプルを見た限りでは)何かいい方法があるのでしょうか?

hhttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/dv_vstechart/html/vbtchWorkingWithMultipleFormsInVisualBasicNETUpgradingToNET.asp
上記のリンクを見ていたのですが、プロパティを使った方しか理解できませんでした。

[ツリー表示へ]
タイトルRe^3: 前画面の処理(便乗質問)
記事No1028
投稿日: 2004/08/13(Fri) 23:05
投稿者魔界の仮面弁士
> Form1 からForm2 上のテキストボックスへの読み書きはプロパティを定義して
> 比較的簡単に取得する事ができたのですが、その逆のForm2 からForm1 上の
> テキストボックスへの読み書きは、同様にはできないようなのですが

これは、Form1からForm2を表示するような場面でしょうか。

「Form1が、Form2から値を受け取る」ような設計にしたいのか、それとも、
「Form2が、Form1に値を設定する」ような設計にしたいのかにもよりますし、
どのような状況で利用するのか(Form1 と Form2 の親子関係や、
モーダル/モードレスの違いなど)にもよるかと思いますが、たとえば
それぞれのフォームに親子関係がある場合には、
   Owner プロパティ
   OwnedForms プロパティ
   AddOwnedForm メソッド
   RemoveOwnedForm メソッド
などを使うという手があります。あるいは、これらのプロパティは使わず、
Form2 のコンストラクタ (あるいはメソッドやプロパティ)にて Form1 を
渡すようにしておき、Form2 はそれを利用する事もできるかと。


それ以外の手法としては、Singleton なクラスか Module 等を使い、そこに
フォームやコントロールなどを渡しておく事もできるでしょうし、あるいは
別フォームから値を受け取るために、独自のイベントを実装する事もできるかと。


# 複数フォームの取り扱いは、GDNJ などでも時々質問にあがっていますね。
# hhttp://www.gdncom.jp/general/bbs/ShowPost.aspx?PostID=13533


> ドボンさん
「ドボン」さんではなく、「どぼん!」さん、では?

[ツリー表示へ]
タイトルRe^4: 前画面の処理(便乗質問)
記事No1029
投稿日: 2004/08/14(Sat) 00:10
投稿者花ちゃん
レスありがとうございます。
言語はVBしか知らないので、どうしてもVB6.0のイメージが頭にあるものですから
.NET では悪戦苦闘しております。
教えて頂いたリンクで勉強させて頂きます。

どぼん!さんの件修正したのですが遅かったようでした。

[ツリー表示へ]