- PR -

各Formの引用の仕方に原因あり?

投稿者投稿内容
Nakata
常連さん
会議室デビュー日: 2004/03/30
投稿数: 41
投稿日時: 2004-05-04 14:42
Me.Ownerを使ってForm2上ではForm2の値をForm1に反映させる事はできましたが、Form1上でForm2の値をForm1に使うにはどうすればいいですか?
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2004-05-04 16:58
引用:

Nakataさんの書き込み (2004-05-04 14:42) より:
Me.Ownerを使ってForm2上ではForm2の値をForm1に反映させる事はできましたが、Form1上でForm2の値をForm1に使うにはどうすればいいですか?


とりあえず、
引用:

「クラス・インスタンス」や「値型・参照型」辺りの概念をまったく理解していません。Form1型のインスタンス.Label2 とはどういうことでしょうか?


この辺の事をまず理解してください。
Me.Ownerを使うとなぜ出来たのかを理解していないと話は進みません。

# 同じような事を逆にやってやればいいだけなんですけどね。
# Ownerにあたる物がないので、代わりのものを自分で用意すればいいんです。
Nakata
常連さん
会議室デビュー日: 2004/03/30
投稿数: 41
投稿日時: 2004-05-04 17:19
どんなサイトを調べてもMe.Ownerを使ってForm2上でForm2の値をForm1に反映させる事しか載ってません。
概念は本を読みましたが記述の仕方は載っていなくて困っています。

form2をForm1のどこでも参照できるようにするんですよね。
どういう風にコードを書けばいいんでしょうか?




[ メッセージ編集済み 編集者: Nakata 編集日時 2004-05-04 17:29 ]
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2004-05-04 17:41
引用:

Nakataさんの書き込み (2004-05-04 17:19) より:
どんなサイトを調べてもMe.Ownerを使ってForm2上でForm2の値をForm1に反映させる事しか載ってません。
概念は本を読みましたが記述の仕方は載っていなくて困っています。


うーん、書き方を説明してもいいんですけど、意味を理解していないとまた同じような事ではまっちゃいますよ。
引用:

form2をForm1のどこでも参照できるようにするんですよね。
どういう風にコードを書けばいいんでしょうか?


ま、理解できていると仮定して。

Form2からForm1のインスタンスを参照できるのは、Ownerに「たまたま」開いた元のForm1のインスタンスが設定されているからですね。
逆にForm1のインスタンスには、Form2のインスタンスを示すものが用意されていない(まあ、あたりまえと言えばあたりまえ)ので、それを自分で用意する必要があります。

やり方はいろいろと考えられます(別にForm2がアプリ上で必ず一つしか表示されないなら、グローバルな変数でもできますよね、それが良いか悪いかは置いとくとしても)。

例えばForm1に、自分が開いたForm2を示すプロパティまたはフィールドを追加しておいて、Form2のインスタンスを作成後にForm2への参照を設定しておく等。
そうすれば、そのフィールド等経由でForm2にアクセスできますね?
※この場合は、基本的にForm1に対して、Form2は同時に一つしか表示されないという条件付。

これで分からります?
Nakata
常連さん
会議室デビュー日: 2004/03/30
投稿数: 41
投稿日時: 2004-05-04 17:48
Form1上にform2.Owner = Meと書いたようにForm2上にも参照できるようにすれば
いいと言うことですか?
だけどそれを参照させるようなコードの書き方がわからないです×

[ メッセージ編集済み 編集者: Nakata 編集日時 2004-05-04 17:51 ]
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2004-05-04 23:56

Form1のクラス内に
Private form2Instance as Form2

Form2のインスタンスを作成する際に、例えば、
form2Instance = New Form2
などというようにしておく。

※単にform2Instanceというフィールドに開いたForm2への参照を設定するだけ。
 自分のコードに合わせて書いてください。
Nakata
常連さん
会議室デビュー日: 2004/03/30
投稿数: 41
投稿日時: 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のような書き方をしてエラーが出てしまいました。どうすればいいかわかりません。
コード書いた事でやりたい事がだいたい解ってもらえるとありがたいです。

Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-05-05 03:22
諸農です。

問題点を整理する必要がありませんか?

やりたい事は概ね以下の内容に近いと思います。

1.Form1、Form2の双方ともにボタンとテキストボックスがある。
2.Form1でボタンクリックされるとForm2が表示される。
3.Form2でボタンがクリックされるとForm1のテキストボックスに
  Form2のテクストボックスの内容が転送される。

最初にForm1でボタンがクリックされた時の処理を考えます。
Form2を表示させるには、Form2型(Class Form2)のインスタンスを生成した上で、
Form2型のインスタンスのShowDialog()メソッドを呼び出す必要があります。

コード:
    Dim fm2 As Form2   'Form2型の変数の宣言
    fm2 = New Form2    'Form2型の変数にForm2型のインスタンスを格納
    fm2.ShowDialog(Me) 'Form2型のインスタンスで表示メソッドを呼び出す



これでfm2変数に格納されているForm2型のインスタンスがフォームを表示します。

次に、表示されたフォーム2に配置されたテキストボックスの内容をフォーム1のテキストボックスに転送する事を考えます。

表示されたfm2のフォームでは自分を表示させたフォーム1にあるテキストボックスを操作出来ないと自分のテキストボックスの内容を転送する事が出来ません。
まだこの時点では、fm2に格納されているインスタンスはフォーム1のインスタンスを知る術がありません。
そこで、フォーム1は自分のインスタンスをフォーム2に通知するために、フォーム1で使ったfm2変数を通じて自分の所在を知らしめます。それがOwnerプロパティです。
先ほどのコードを少し変えて、フォーム1がフォーム2に自分を知らしめるのが、
コード:
    Dim fm2 As Form2   'Form2型の変数の宣言
    fm2 = New Form2    'Form2型の変数にForm2型のインスタンスを格納
    fm2.Owner = Me     'Form2型のインスタンスに自分の所在を通知
    fm2.ShowDialog(Me) 'Form2型のインスタンスで表示メソッドを呼び出す


このコードになります。

Form2のインスタンスは、自分のオーナーを通じてForm1にアクセスします。
コード:
    Dim fm1 As Form1
    fm1 = Me.Owner


これでフォーム2の中で宣言したForm1型の変数にForm1型のインスタンスを格納する(所在を知り得た)事が出来ました。

次に、フォーム2のTextBoxの内容をフォーム1のTextBoxにセットする事を考えます。
フォーム2はフォーム1のインスタンス(の所在)までは確保できたので、フォーム1のインスタンスが格納されている変数「fm1」を利用してフォーム1側のTextBox1にアクセスします。
VB.NETの場合、フォーム上に配置されたコントロールはFriendアクセスで宣言されるようですので、同一アセンブリであれば参照が可能です。
ですので、フォーム2側のボタンクリックイベントハンドラは最終的に次のようになります。
コード:
    Dim fm1 As Form1
    fm1 = Me.Owner
    fm1.TextBox1.Text = Me.TextBox1.Text



引用:

コード書いた事でやりたい事がだいたい解ってもらえるとありがたいです。



やりたい事は判らないでもないですが、そのまま動くコードを書いては
Nakataさんに失礼ですよね。
ですので、問題を簡潔化して解説してみました。
後は応用力&&プログラミングに対する情熱だと思います。

#C#使いにとっては、VB.NETでのコーディングは難しすぎます。。(^^;
_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/

スキルアップ/キャリアアップ(JOB@IT)