- - PR -
各Formの引用の仕方に原因あり?
| 投稿者 | 投稿内容 | ||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-05-04 14:42
Me.Ownerを使ってForm2上ではForm2の値をForm1に反映させる事はできましたが、Form1上でForm2の値をForm1に使うにはどうすればいいですか?
| ||||||||||||||||||||
|
投稿日時: 2004-05-04 16:58
とりあえず、
この辺の事をまず理解してください。 Me.Ownerを使うとなぜ出来たのかを理解していないと話は進みません。 # 同じような事を逆にやってやればいいだけなんですけどね。 # Ownerにあたる物がないので、代わりのものを自分で用意すればいいんです。 | ||||||||||||||||||||
|
投稿日時: 2004-05-04 17:19
どんなサイトを調べてもMe.Ownerを使ってForm2上でForm2の値をForm1に反映させる事しか載ってません。
概念は本を読みましたが記述の仕方は載っていなくて困っています。 form2をForm1のどこでも参照できるようにするんですよね。 どういう風にコードを書けばいいんでしょうか? [ メッセージ編集済み 編集者: Nakata 編集日時 2004-05-04 17:29 ] | ||||||||||||||||||||
|
投稿日時: 2004-05-04 17:41
うーん、書き方を説明してもいいんですけど、意味を理解していないとまた同じような事ではまっちゃいますよ。
ま、理解できていると仮定して。 Form2からForm1のインスタンスを参照できるのは、Ownerに「たまたま」開いた元のForm1のインスタンスが設定されているからですね。 逆にForm1のインスタンスには、Form2のインスタンスを示すものが用意されていない(まあ、あたりまえと言えばあたりまえ)ので、それを自分で用意する必要があります。 やり方はいろいろと考えられます(別にForm2がアプリ上で必ず一つしか表示されないなら、グローバルな変数でもできますよね、それが良いか悪いかは置いとくとしても)。 例えばForm1に、自分が開いたForm2を示すプロパティまたはフィールドを追加しておいて、Form2のインスタンスを作成後にForm2への参照を設定しておく等。 そうすれば、そのフィールド等経由でForm2にアクセスできますね? ※この場合は、基本的にForm1に対して、Form2は同時に一つしか表示されないという条件付。 これで分からります? | ||||||||||||||||||||
|
投稿日時: 2004-05-04 17:48
Form1上にform2.Owner = Meと書いたようにForm2上にも参照できるようにすれば
いいと言うことですか? だけどそれを参照させるようなコードの書き方がわからないです× [ メッセージ編集済み 編集者: Nakata 編集日時 2004-05-04 17:51 ] | ||||||||||||||||||||
|
投稿日時: 2004-05-04 23:56
例
Form1のクラス内に Private form2Instance as Form2 Form2のインスタンスを作成する際に、例えば、 form2Instance = New Form2 などというようにしておく。 ※単にform2Instanceというフィールドに開いたForm2への参照を設定するだけ。 自分のコードに合わせて書いてください。 | ||||||||||||||||||||
|
投稿日時: 2004-05-05 00:49
(form1)
Inherits System.Windows.Forms.Form Private fm2 As New Form2() " Windows フォーム デザイナで生成されたコード " Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim fm2 As New Form2() fm2.Owner = Me fm2.ShowDialog(Me) End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim dt As Date = Now() Dim y As Single Dim s As Single y = fm2.TextBox2.Text s = Val(Label2.Text) s = (Year(dt) - y) * 365 Label2.Text = s (form2) Public Class Form2 Inherits System.Windows.Forms.Form form2Instance = New Form2←エラーが出た 本では「クラスから作成したオブジェクトをインスタンスと言う」と書いてあったので Form2のような書き方をしてエラーが出てしまいました。どうすればいいかわかりません。 コード書いた事でやりたい事がだいたい解ってもらえるとありがたいです。 | ||||||||||||||||||||
|
投稿日時: 2004-05-05 03:22
諸農です。
問題点を整理する必要がありませんか? やりたい事は概ね以下の内容に近いと思います。 1.Form1、Form2の双方ともにボタンとテキストボックスがある。 2.Form1でボタンクリックされるとForm2が表示される。 3.Form2でボタンがクリックされるとForm1のテキストボックスに Form2のテクストボックスの内容が転送される。 最初にForm1でボタンがクリックされた時の処理を考えます。 Form2を表示させるには、Form2型(Class Form2)のインスタンスを生成した上で、 Form2型のインスタンスのShowDialog()メソッドを呼び出す必要があります。
これでfm2変数に格納されているForm2型のインスタンスがフォームを表示します。 次に、表示されたフォーム2に配置されたテキストボックスの内容をフォーム1のテキストボックスに転送する事を考えます。 表示されたfm2のフォームでは自分を表示させたフォーム1にあるテキストボックスを操作出来ないと自分のテキストボックスの内容を転送する事が出来ません。 まだこの時点では、fm2に格納されているインスタンスはフォーム1のインスタンスを知る術がありません。 そこで、フォーム1は自分のインスタンスをフォーム2に通知するために、フォーム1で使ったfm2変数を通じて自分の所在を知らしめます。それがOwnerプロパティです。 先ほどのコードを少し変えて、フォーム1がフォーム2に自分を知らしめるのが、
このコードになります。 Form2のインスタンスは、自分のオーナーを通じてForm1にアクセスします。
これでフォーム2の中で宣言したForm1型の変数にForm1型のインスタンスを格納する(所在を知り得た)事が出来ました。 次に、フォーム2のTextBoxの内容をフォーム1のTextBoxにセットする事を考えます。 フォーム2はフォーム1のインスタンス(の所在)までは確保できたので、フォーム1のインスタンスが格納されている変数「fm1」を利用してフォーム1側のTextBox1にアクセスします。 VB.NETの場合、フォーム上に配置されたコントロールはFriendアクセスで宣言されるようですので、同一アセンブリであれば参照が可能です。 ですので、フォーム2側のボタンクリックイベントハンドラは最終的に次のようになります。
やりたい事は判らないでもないですが、そのまま動くコードを書いては Nakataさんに失礼ですよね。 ですので、問題を簡潔化して解説してみました。 後は応用力&&プログラミングに対する情熱だと思います。 #C#使いにとっては、VB.NETでのコーディングは難しすぎます。。(^^; _________________ 諸農和岳 Powered by Turbo Delphi & Microsoft Visual Studio 2005 十兵衛@わんくま同盟 http://blogs.wankuma.com/jubei/ | ||||||||||||||||||||
