別フォームから1つの関数をcallするには

解決


ばんび  2004-08-02 14:56:33  No: 115280  IP: [192.*.*.*]

こんにちは。初めて質問させていただきます。
VB.NETで開発してます。

フォーム1でTEXT1.TEXTに値を入力し、マスタ参照関数をcall
            ボタンクリック時、TEXT1.TEXTを渡しフォーム2を表示
              (これはできました)
フォーム2でTEXT1.TEXTに値を入力し、マスタ参照関数をcall

このとき、同じ関数を使っているのですが、どちらのフォームというのを
どのように判断すればいいのかが分かりません。
どのようにすればよいのでしょうか?

****  マスタ参照関数  ****
Public Sub InpSiire(ByRef Frm As *****, ByVal sender As Object,             ByVal e As System.Windows.Forms.KeyEventArgs)
 
   With Frm
       'マスタより参照
       strsql = "select * from siire_mst where siirecd= '"                        & .TextBox1.Text & "'"
      ***  DBを参照し値取得
        .Label10.Text = CType(cnRd.Item("siireme"), String)

   End With

**** 

Frm  に何を渡せばよいのか(?)がわかりません。

よろしくお願いいたします。

編集 削除
特攻隊長まるるう  2004-08-03 18:35:09  No: 115281  IP: [192.*.*.*]

ここまで自分で考えたのであれば分かるはずですが?
他のサイトから盗んできたのであれば、まずはこの
プログラムの作成者に聞くのが筋だと思います。
フォーム側のイベントでの引数もそのまま利用して
いるようですし、正しく理解せずに使うには問題が
起きそうなプログラムです。

指定するのは Form クラスか…もしかしたら継承して
独自のクラスを作ってるかもしれません。でもまぁ、
通常は Form クラスで呼び出し側の Form への参照を
引数として渡してるんでしょうね。呼び出し側では
Me だと予想は出来ますが、確実ではありません。
呼び出し側はフォームの何かのイベントですか?その
あたりのコードも必要です。

関係ないですが、
Label10 はグローバルに公開されて無い可能性が
ありますので自分でグローバルなプロパティなり
関数なりを作る必要があるかもしれません。

編集 削除
ばんび  2004-08-04 10:15:20  No: 115282  IP: [192.*.*.*]

ご指導ありがとうございます。
まったくの.net初心者なんで、説明不足で
申し訳ありません。

フォーム1、フォーム2ともに、textbox1のキーダウンイベントで
マスタ参照関数をコールしています。

Private Sub TextBox1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown

    Call InpSiire(Me) 
    
end sub
Public Sub InpSiire(ByRef Frm As ???)

   With Frm
       'マスタより参照
       strsql = "select * from siire_mst where siirecd= '"                        & .TextBox1.Text & "'"
      ***  DBを参照し値取得
        .Label10.Text = CType(cnRd.Item("siireme"), String)

   End With

End Sub

編集 削除
特攻隊長まるるう  2004-08-04 10:45:06  No: 115283  IP: [192.*.*.*]

Form クラスでいいんじゃないですか?フルの名前空間が必要です??
    System.Windows.Forms.Form
です。

編集 削除
ばんび  2004-08-04 11:12:41  No: 115284  IP: [192.*.*.*]

ありがとうございます。

Public Sub InpSiire(ByRef Frm As System.Windows.Forms.Form)
.Label10.Text =
End Sub
にしてみたのですが、
”System.Windows.Forms.Formのメンバではありません。”
となってしまします。

編集 削除
特攻隊長まるるう  2004-08-04 12:00:47  No: 115285  IP: [192.*.*.*]

>”System.Windows.Forms.Formのメンバではありません。”
ええ、もちろんです。

そもそも、InpSiire 関数の引数 Frm が2つの違うクラスである
Form1 と Form2 を受け取ることができるのは、Form1 と Form2
が System.Windows.Forms.Form クラスを『継承』しているから
です。ですから Form クラスで実装されている Name プロパティ
などを使用することは可能です。
例)
Public Sub InpSiire(ByRef Frm As System.Windows.Forms.Form)
   With Frm
        Debug.WriteLine("引数は " & .Name & " です。")
   End With
End Sub

ところが、.Label10 はクラス Form1(もしくは Form2)で定義されています。
当然、メンバでは無いとエラーが出ます。
こういった使い方をしたいのであれば、1つの方法は System.Windows.Forms.Form
を継承して Label10 を実装したベースとなるフォームを作成し、それを
Form1 と Form2 が『継承』することです。

ただ、この辺りの話になってくると全体の仕様が分からないと…わざわざ
継承する必要があるのか?ということを検討しなければなりません。

もう1つ思いつくのは型変換(キャスト)して Form1(もしくは Form2)
クラスの変数に代入することです。
例)
    Public Sub InpSiire(ByRef Frm As System.Windows.Forms.Form)
        Dim wForm1 As Form1
        Dim wForm2 As Form2

        Try
            wForm1 = CType(Frm, Form1)
        Catch
        End Try

        Try
            wForm2 = CType(Frm, Form2)
        Catch
        End Try

        wForm1 = Nothing
        wForm2 = Nothing
    End Sub
…ただ…引数として渡した意味は薄れます。

ところでこの関数は特定のテキストボックスのテキストをキーにして
ラベルを1つだけ設定するのみの関数ですか?
それだけの機能なら文字列を渡して文字列を返す関数でいいんじゃ
ないですか?もしくはテキストボックスとラベルを引数で渡すとか…

編集 削除
ばんび  2004-08-05 09:56:54  No: 115286  IP: [192.*.*.*]

ありがとうございます。
やってみます。

>ところでこの関数は特定のテキストボックスのテキストをキーにして
>ラベルを1つだけ設定するのみの関数ですか?
>それだけの機能なら文字列を渡して文字列を返す関数でいいんじゃ
>ないですか?もしくはテキストボックスとラベルを引数で渡すとか…

現状は、項目が少ないのでその方法で作成しています。
勉強中なのでフォーム渡しができればと思い質問させていただきました。

編集 削除
特攻隊長まるるう  2004-08-05 10:44:48  No: 115287  IP: [192.*.*.*]

もし『継承』について勉強されるなら、Form クラスでなく、自分で
作った単純なクラスで理解を深めてから Form クラスに応用するのが
良いでしょう。サンプルを載せておきます。スタートアップの設定は
Form1 では無く、Sub Main にして実行して下さい。以下のコードを
適当なファイル(Test.vb とか…1つの vb ファイルでよい)にコピー
して実行して下さい。
[VB.NET]
Option Explicit On 

' 基本クラス
Class Person
    ' このクラスの外部から参照できるフィールド
    Public FirstName As String
    Public LastName As String
    Public Const Tax As Single = 1.05

    Private BaseSalary As Single
    Public Property GetSetBaseSalary() As Single
        Get
            Return BaseSalary * Tax
        End Get
        Set(ByVal Value As Single)
            BaseSalary = Value / Tax
        End Set
    End Property
    Public ReadOnly Property GetNomalSalary() As Single
        Get
            Return BaseSalary
        End Get
    End Property
End Class

' Employee クラスを Person から継承します。
Class Employee
    Inherits Person ' 『継承』のキーワード
    ' 新しいパブリックフィールド
    Public SideBusinessSalary As Single

    ' 新しいメソッド
    Public Function Salary() As Single
        Return (GetNomalSalary() + SideBusinessSalary) * Tax
    End Function

    Public Function SayAll() As String
        Return FirstName & " " & LastName & " " & CStr(Salary())
    End Function
End Class

Module MainRun
    Public Sub main()
        Dim anEmployee As New Employee
        With anEmployee
            .FirstName = "Faust"
            .LastName = "Laust"
            .GetSetBaseSalary = 1000
            .SideBusinessSalary = 500
            MsgBox(.SayAll())
        End With
    End Sub
End Module

編集 削除
ばんび  2004-08-13 11:38:02  No: 115288  IP: [192.*.*.*]

ありがとうございました。

編集 削除