こんにちは。初めて質問させていただきます。
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 に何を渡せばよいのか(?)がわかりません。
よろしくお願いいたします。
ここまで自分で考えたのであれば分かるはずですが?
他のサイトから盗んできたのであれば、まずはこの
プログラムの作成者に聞くのが筋だと思います。
フォーム側のイベントでの引数もそのまま利用して
いるようですし、正しく理解せずに使うには問題が
起きそうなプログラムです。
指定するのは Form クラスか…もしかしたら継承して
独自のクラスを作ってるかもしれません。でもまぁ、
通常は Form クラスで呼び出し側の Form への参照を
引数として渡してるんでしょうね。呼び出し側では
Me だと予想は出来ますが、確実ではありません。
呼び出し側はフォームの何かのイベントですか?その
あたりのコードも必要です。
関係ないですが、
Label10 はグローバルに公開されて無い可能性が
ありますので自分でグローバルなプロパティなり
関数なりを作る必要があるかもしれません。
ご指導ありがとうございます。
まったくの.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
Form クラスでいいんじゃないですか?フルの名前空間が必要です??
System.Windows.Forms.Form
です。
ありがとうございます。
Public Sub InpSiire(ByRef Frm As System.Windows.Forms.Form)
.Label10.Text =
End Sub
にしてみたのですが、
”System.Windows.Forms.Formのメンバではありません。”
となってしまします。
>”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つだけ設定するのみの関数ですか?
それだけの機能なら文字列を渡して文字列を返す関数でいいんじゃ
ないですか?もしくはテキストボックスとラベルを引数で渡すとか…
ありがとうございます。
やってみます。
>ところでこの関数は特定のテキストボックスのテキストをキーにして
>ラベルを1つだけ設定するのみの関数ですか?
>それだけの機能なら文字列を渡して文字列を返す関数でいいんじゃ
>ないですか?もしくはテキストボックスとラベルを引数で渡すとか…
現状は、項目が少ないのでその方法で作成しています。
勉強中なのでフォーム渡しができればと思い質問させていただきました。
もし『継承』について勉強されるなら、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
ありがとうございました。
編集 削除