C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[13]: クラスの参照について


(過去ログ 80 を表示中)

[トピック内 24 記事 (1 - 20 表示)]  << 0 | 1 >>

■47499 / inTopicNo.1)  クラスの参照について
  
□投稿者/ だい (32回)-(2010/03/04(Thu) 13:40:25)

分類:[.NET 全般] 

お世話になります。
以下のようなことを実現したいのですが、クラスの参照がうまくいきません。

Ctrlsで作成されたTxt_HinCDをフォームに配置し、値が入力された時ParametersクラスにあるHinCDに値が入る。
フォームにあるBtn_Selectをクリックした時にParametersクラスから値を取得し、SQLを作成。データベースから値を取得する。

Ctrls.vb(TextBoxを派生させたコントロールを作成)
Public Class Txt_HinCD
 Inherits TextBox

  Protected Overrides sub TextBoxChange
   @ParametersクラスのHinCDにテキストボックスの値を入れる処理
 End Sub
End Class

Parameters.vb
Public Class Param
  Private pHinCD as String = ""

  Public Property HinCD() as String
    Get
       Return pHinCD
    End Get
    Set(value as string)
       pHinCD = value
    End Set
  End Property
End Class

Public Frm_Hin
  Private Sub Btn_Select Click(省略)
    Dim Cmd as new OleDbCommand
    Cmd.CommandText = "SELECT * FROM HogeTbl WHERE hin_cd = " & AParametersクラスのHinCDの値
    ・
  ・
  ・

@をHParam as new Parameters とし、Aも同様に定義してみましたが、@で値が入ってもAではブランクになっています。
どのように定義したらよろしいでしょうか?

引用返信 編集キー/
■47501 / inTopicNo.2)  Re[1]: クラスの参照について
□投稿者/ 自作 (25回)-(2010/03/04(Thu) 14:53:43)
2010/03/04(Thu) 15:17:19 編集(投稿者)

No47499 (だい さん) に返信
実際に値を覚えられるのはクラスではなく、クラスから実体化させたインスタンスですよね?
つまり、Class Param から
Dim ParamA As New Param
Dim ParamB As New Param
Dim ParamC As New Param
が可能です。
Param が値を覚えるのではなく、ParamA、ParamB、ParamC がそれぞれ違う値を覚えます。

@では ParamA に設定して、Aでは ParamC を参照すれば空っぽなのは当然ですが、
@とAのインスタンスは一致しているのですか?
提示のコードは、その関係が読み取れないものとなっています。

ごめんなさい。追記した↓
> @をHParam as new Parameters とし、Aも同様に定義してみましたが
どこに?っていうのが重要ですよね?普通に考えれば別の場所2箇所に定義したのでしょうから、
Public Class Txt_HinCD
Public HParam as new Param
End Class

Public Frm_Hin
Public HParam as new Param
End Class

って感じ?この場合、
Txt_HinCD.HParam

Frm_Hin.HParam
は、東京都中央区と大阪府中央区が同じ住所か?って言っているのと同じで
全く違います。どっちか1つを使ってください。

もしくはデータを受け渡してください。
引用返信 編集キー/
■47502 / inTopicNo.3)  Re[2]: クラスの参照について
□投稿者/ だい (33回)-(2010/03/04(Thu) 15:12:38)
No47501 (自作 さん) に返信
> ■No47499 (だい さん) に返信
> 実際に値を覚えられるのはクラスではなく、クラスから実体化させたインスタンスですよね?
> つまり、Class Param から
> Dim ParamA As New Param
> Dim ParamB As New Param
> Dim ParamC As New Param
> が可能です。
> Param が値を覚えるのではなく、ParamA、ParamB、ParamC がそれぞれ違う値を覚えます。
>
> @では ParamA に設定して、Aでは ParamC を参照すれば空っぽなのは当然ですが、
> @とAのインスタンスは一致しているのですか?
> 提示のコードは、その関係が読み取れないものとなっています。

ありがとうございます。

> @とAのインスタンスは一致しているのですか?

別クラスなので一致していないと思われます。
初心者なのでその辺がいまいち掴めておりません。すみません。

> Dim ParamA As New Param
> Dim ParamB As New Param
> Dim ParamC As New Param
> が可能です。
> Param が値を覚えるのではなく、ParamA、ParamB、ParamC がそれぞれ違う値を覚えます。

ということはさまざまなクラスから参照される場合、どのような定義をしたら良いんでしょうか?
モジュール追加して、Publicで変数宣言して使うしかないんでしょうか?

引用返信 編集キー/
■47503 / inTopicNo.4)  Re[3]: クラスの参照について
□投稿者/ 自作 (26回)-(2010/03/04(Thu) 15:24:56)
No47502 (だい さん) に返信
>ということはさまざまなクラスから参照される場合、どのような定義をしたら良いんでしょうか?
クラス設計の話ですよね。循環参照すると混乱するから、クラス同士の相関図を書いた時に
きれいなツリー構造になるように考えてください。

その根っこの方に定義しておけば、順に参照できます。

Param → Txt_HinCD(HinCD を Param の形で覚える)
Txt_HinNameが出てきたら?
Param → Txt_HinName(HinName を Param の形で覚える)
でしょう?TextBox 継承コントロールが1つずつ持っておくべきじゃないの?

東京都中央区に行きたいなら、大阪府中央区は必要ないでしょ?
東京都中央区の住所を頼りに参照すれば良いだけでは?

引用返信 編集キー/
■47506 / inTopicNo.5)  Re[4]: クラスの参照について
□投稿者/ だい (34回)-(2010/03/04(Thu) 15:39:11)
No47503 (自作 さん) に返信
> ■No47502 (だい さん) に返信
> >ということはさまざまなクラスから参照される場合、どのような定義をしたら良いんでしょうか?
> クラス設計の話ですよね。循環参照すると混乱するから、クラス同士の相関図を書いた時に
> きれいなツリー構造になるように考えてください。
>
> その根っこの方に定義しておけば、順に参照できます。
>
> Param → Txt_HinCD(HinCD を Param の形で覚える)
> Txt_HinNameが出てきたら?
> Param → Txt_HinName(HinName を Param の形で覚える)
> でしょう?TextBox 継承コントロールが1つずつ持っておくべきじゃないの?
>
> 東京都中央区に行きたいなら、大阪府中央区は必要ないでしょ?
> 東京都中央区の住所を頼りに参照すれば良いだけでは?
>

ご丁寧にありがとうございます。
分かりやすいです。

独学なので我流な部分もあり、すみません。

ということは、HinCDをクラスとしなければいけないということですか?
Public Class Param_HinCD
Private pHinCD as string = ""

Public Property HinCD() as string
Get
Return pHinCD
End Get
Set(value as string)
pHinCD = value
End set
end Propety
End Class

Public Class Param_HinName
Private pHinName as string = ""

Public Property HinName as string
Get
Return pHinName
End Get
Set(value as string)
pHinName = value
End set
end Propety
End Class

こんな感じですか?
ツリー状になっていない気もしますが…

引用返信 編集キー/
■47507 / inTopicNo.6)  Re[5]: クラスの参照について
□投稿者/ 自作 (27回)-(2010/03/04(Thu) 15:48:18)
No47506 (だい さん) に返信
こうじゃないの?

Param→Txt_HinCD→Frm_Hin(Btn_Select)

    Public Class Param
        Public Text As String = String.Empty
    End Class

    Public Class Txt_HinCD
        Public HParam As New Param
        Sub New()
            Me.HParam.Text = "あああ"
        End Sub
    End Class

    Private Sub Btn_Select()
        MsgBox(Txt_HinCDinstance.HParam.Text)
    End Sub

引用返信 編集キー/
■47510 / inTopicNo.7)  Re[6]: クラスの参照について
□投稿者/ だい (35回)-(2010/03/04(Thu) 15:58:32)
No47507 (自作 さん) に返信
> ■No47506 (だい さん) に返信
> こうじゃないの?
>
> Param→Txt_HinCD→Frm_Hin(Btn_Select)
>
> Public Class Param
> Public Text As String = String.Empty
> End Class
>
> Public Class Txt_HinCD
> Public HParam As New Param
> Sub New()
> Me.HParam.Text = "あああ"
> End Sub
> End Class
>
> Private Sub Btn_Select()
> MsgBox(Txt_HinCDinstance.HParam.Text)
> End Sub

なるほど。これってTextBox主体のクラス設計ですよね。
でもこれだと、わざわざクラスを作らなくてもTextBox.Textと同じ意味のような気もします。

自分がやろうとしていることはデータベースにアクセスする際のパラメータとしてクラスを作成したいんです。
厳密に言うといくつかテーブルがあるので、Paramクラスの中にさらにテーブルごとのクラスがあり、その中に各フィールド(HinCD等)がある設計です。

TextBoxは入力された値をParamクラスに代入するような感じです。

もっと細かく言うと、SELECT、INSERT、UPDATEに応じてSELECTだったら" AND HinCD = '" & value & "'"をReturnしています。
SQLを作成するためのクラスという考え方でしょうか。

その方がNewし易いと思います。
引用返信 編集キー/
■47511 / inTopicNo.8)  Re[7]: クラスの参照について
□投稿者/ 774RR (480回)-(2010/03/04(Thu) 16:12:07)
主題と関係ないけど
" AND HinCD = '" & value & "'"
モロに SQL injection するから「このままではダメ」だぞ。

引用返信 編集キー/
■47513 / inTopicNo.9)  Re[8]: クラスの参照について
□投稿者/ 自作 (28回)-(2010/03/04(Thu) 16:23:09)
2010/03/04(Thu) 16:23:26 編集(投稿者)
No47511 (774RR さん) に返信
> 主題と関係ないけど
> " AND HinCD = '" & value & "'"
> モロに SQL injection するから「このままではダメ」だぞ。
> 
うん。ハッカーの格好の的ですね(^^;

■No47510 (だい さん) に返信
例えば、■46712 あたりで質問していた時に OleDb.OleDbParameter クラスは
使っていますよね?これは、品目コードも品目名も入れられると思いますが、
これを機能拡張していくイメージで良いんですよね?

> 自分がやろうとしていることはデータベースにアクセスする際のパラメータとしてクラスを作成したいんです。
Param クラスですよね?Text を使ったのは分かり易くする為であって、Text 以外にしてくれて構いません。
Param クラスを作り込んでいくので問題ないと思いますが。

> もっと細かく言うと、SELECT、INSERT、UPDATEに応じてSELECTだったら" AND HinCD = '" & value & "'"をReturnしています。
あくまでサンプルコードなので、そのまま使えるものまでレベルは上げていませんよ。
仕組みを説明するだけのものです。
    Public Enum CommandKind
        SQL_SELECT
        SQL_INSERT
        SQL_UPDATE
    End Enum

    Public Class Param
        Public Text As String = String.Empty

        Public ReadOnly Property SQLText(ByVal Kind As CommandKind) As String
            Get
                Dim ReturnText As String = String.Empty
                Select Case Kind
                    Case CommandKind.SQL_SELECT
                        ReturnText = "SELECT " & Me.Text
                    Case CommandKind.SQL_INSERT
                        ReturnText = "INSERT " & Me.Text
                    Case CommandKind.SQL_UPDATE
                        ReturnText = "UPDATE " & Me.Text
                    Case Else
                        Err.Raise(999)
                End Select
                Return ReturnText
            End Get
        End Property
    End Class

    Public Class Txt_HinCD
        Public HParam As New Param
        Sub New()
            Me.HParam.Text = "あああ"
        End Sub
    End Class

    Private Sub Btn_Select()
        MsgBox(Txt_HinCDinstance.HParam.SQLText(CommandKind.SQL_SELECT))
    End Sub

引用返信 編集キー/
■47514 / inTopicNo.10)  Re[9]: クラスの参照について
□投稿者/ だい (36回)-(2010/03/04(Thu) 16:40:08)
No47513 (自作 さん) に返信
> 2010/03/04(Thu) 16:23:26 編集(投稿者)
>
> ■No47511 (774RR さん) に返信
>>主題と関係ないけど
>>" AND HinCD = '" & value & "'"
>>モロに SQL injection するから「このままではダメ」だぞ。
>>
> うん。ハッカーの格好の的ですね(^^;
>
> ■No47510 (だい さん) に返信
> 例えば、■46712 あたりで質問していた時に OleDb.OleDbParameter クラスは
> 使っていますよね?これは、品目コードも品目名も入れられると思いますが、
> これを機能拡張していくイメージで良いんですよね?
>
>>自分がやろうとしていることはデータベースにアクセスする際のパラメータとしてクラスを作成したいんです。
> Param クラスですよね?Text を使ったのは分かり易くする為であって、Text 以外にしてくれて構いません。
> Param クラスを作り込んでいくので問題ないと思いますが。
>
>>もっと細かく言うと、SELECT、INSERT、UPDATEに応じてSELECTだったら" AND HinCD = '" & value & "'"をReturnしています。
> あくまでサンプルコードなので、そのまま使えるものまでレベルは上げていませんよ。
> 仕組みを説明するだけのものです。
> Public Enum CommandKind
> SQL_SELECT
> SQL_INSERT
> SQL_UPDATE
> End Enum
>
> Public Class Param
> Public Text As String = String.Empty
>
> Public ReadOnly Property SQLText(ByVal Kind As CommandKind) As String
> Get
> Dim ReturnText As String = String.Empty
> Select Case Kind
> Case CommandKind.SQL_SELECT
> ReturnText = "SELECT " & Me.Text
> Case CommandKind.SQL_INSERT
> ReturnText = "INSERT " & Me.Text
> Case CommandKind.SQL_UPDATE
> ReturnText = "UPDATE " & Me.Text
> Case Else
> Err.Raise(999)
> End Select
> Return ReturnText
> End Get
> End Property
> End Class
>
> Public Class Txt_HinCD
> Public HParam As New Param
> Sub New()
> Me.HParam.Text = "あああ"
> End Sub
> End Class
>
> Private Sub Btn_Select()
> MsgBox(Txt_HinCDinstance.HParam.SQLText(CommandKind.SQL_SELECT))
> End Sub
>

すみませんが、いまいち理解できませんでした。
引用返信 編集キー/
■47526 / inTopicNo.11)  Re[10]: クラスの参照について
□投稿者/ Jitta on the way (574回)-(2010/03/04(Thu) 22:24:00)
No47514 (だい さん) に返信
> すみませんが、いまいち理解できませんでした。

だから、どうしたい?どうしてほしい?
引用返信 編集キー/
■47535 / inTopicNo.12)  Re[11]: クラスの参照について
□投稿者/ だい (37回)-(2010/03/05(Fri) 10:03:57)
以下のようにしました。

Public Class clsParameters
    Public Enum CmdKind
        SQL_SELECT
        SQL_INSERT
        SQL_UPDATE
    End Enum

    Public Class HinCD
        Public Text As String = String.Empty

        Public Property Param(ByVal Kind As CmdKind) As String
            Get
                Select Case Kind
                    Case CmdKind.SQL_SELECT
                        Return " AND Hin_NM = '" & Text & "'"
                    Case CmdKind.SQL_INSERT
                        Return " ,'" & Text & "'"
                    Case CmdKind.SQL_UPDATE
                        Return " ,Hin_NM = '" & Text & "'"
                    Case Else
                        Err.Raise(999)
                        Return String.Empty
                End Select
            End Get
            Set(ByVal value As String)
                Text = value
            End Set
        End Property

        Public Sub New()
            Me.Text = String.Empty
        End Sub

    End Class

    Public Class clsHinKN
        Public Text As String = String.Empty

        Public Property Param(ByVal Kind As CmdKind) As String
            Get
                Select Case Kind
                    Case CmdKind.SQL_SELECT
                        Return " AND Hin_KN = '" & Text & "'"
                    Case CmdKind.SQL_INSERT
                        Return " ANS Hin_KN = '" & Text & "'"
                    Case CmdKind.SQL_UPDATE
                        Return " ,Hin_KN = '" & Text & "'"
                    Case Else
                        Err.Raise(999)
                        Return String.Empty
                End Select
            End Get
            Set(ByVal value As String)
                Text = value
            End Set
        End Property

        Public Sub New()
            Me.Text = String.Empty
        End Sub

    End Class

Public Class Ctrls

    Public Class Txt_HinCD
        Inherits TextBox

        Protected Overrides Sub OnLostFocus(ByVal e As System.EventArgs)
            MyBase.OnLostFocus(e)

            Dim HinCD As New clsParameters.clsHinNM

            HinCD.Text = Me.Text
        End Sub

    End Class

End Class

セキュリティの問題が出ていますが、mdbを使う場合何か方法はあるのでしょうか?
名前付きパラメータも使えないし、順不同に入力される可能性があるので?も使えないですし…。



引用返信 編集キー/
■47537 / inTopicNo.13)  Re[12]: クラスの参照について
□投稿者/ 魔界の仮面弁士 (1531回)-(2010/03/05(Fri) 11:03:17)
No47535 (だい さん) に返信
> 名前付きパラメータも使えないし、順不同に入力される可能性があるので?も使えないですし…。
SQL 中で、『PARAMETERS』宣言をすれば OK です。
http://office.microsoft.com/ja-jp/access/HP010322601041.aspx

ADO や DAO のように、SQL 中のパラメータを自動取得する機能はありませんが、
ADO.NET(Microsoft.JET.OLEDB.4.0) でも『PARAMETERS』を明示すれば、パラメータの順序が保たれます。


'あえて、未使用パラメータ nantoka を追加してみる。
Dim q As String = "PARAMETERS nantoka TEXT, kantoka LONG; SELECT * FROM HogeTbl WHERE hin_cd = kantoka;"

Dim cmd As New OleDbCommand(q, Conn)
cmd.Parameters.Add("nantoka", OleDbType.VarWChar)
cmd.Parameters.Add("kantoka", OleDbType.Integer)

cmd.Parameters("nantoka").Value = DBNull.Value
cmd.Parameters("kantoka").Value = 123

' nantoka と kantoka が区別されて処理されるはず
Dim tbl As New DataTable()
Using adp As New OleDbDataAdapter(cmd)
 adp.Fill(tbl)
End Using

引用返信 編集キー/
■47540 / inTopicNo.14)  Re[13]: クラスの参照について
□投稿者/ だい (38回)-(2010/03/05(Fri) 11:21:19)
No47537 (魔界の仮面弁士 さん) に返信
> ■No47535 (だい さん) に返信
>>名前付きパラメータも使えないし、順不同に入力される可能性があるので?も使えないですし…。
> SQL 中で、『PARAMETERS』宣言をすれば OK です。
> http://office.microsoft.com/ja-jp/access/HP010322601041.aspx
>
> ADO や DAO のように、SQL 中のパラメータを自動取得する機能はありませんが、
> ADO.NET(Microsoft.JET.OLEDB.4.0) でも『PARAMETERS』を明示すれば、パラメータの順序が保たれます。
>
>
> 'あえて、未使用パラメータ nantoka を追加してみる。
> Dim q As String = "PARAMETERS nantoka TEXT, kantoka LONG; SELECT * FROM HogeTbl WHERE hin_cd = kantoka;"
>
> Dim cmd As New OleDbCommand(q, Conn)
> cmd.Parameters.Add("nantoka", OleDbType.VarWChar)
> cmd.Parameters.Add("kantoka", OleDbType.Integer)
>
> cmd.Parameters("nantoka").Value = DBNull.Value
> cmd.Parameters("kantoka").Value = 123
>
> ' nantoka と kantoka が区別されて処理されるはず
> Dim tbl As New DataTable()
> Using adp As New OleDbDataAdapter(cmd)
>  adp.Fill(tbl)
> End Using

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

クラスは作成されたのですが、頂いたサンプルコードですと、キーを複数指定してSELECTすることはできませんか?
自分の書いたコードでもそれぞれパラメータは入るんですが、それを連結する際、クラスを参照しなければならず、必ずNewすることになります。
そうなるとTextの値はEmptyになってしまいます…。
引用返信 編集キー/
■47547 / inTopicNo.15)  Re[14]: クラスの参照について
□投稿者/ もりお (193回)-(2010/03/05(Fri) 12:54:41)

No47540 (だい さん) に返信
> 必ずNewすることになります。そうなるとTextの値はEmptyになってしまいます…。

New しないようにすると善いかと思います。
ご掲示いただいた No47535 のコードを見る限りテキストボックスに入力された値をパラ
メータマーカにして SQL 文を構築するクラスのようですが、どのような使い方を想定し
ていらっしゃるのでしょうか。

引用返信 編集キー/
■47548 / inTopicNo.16)  Re[15]: クラスの参照について
□投稿者/ だい (39回)-(2010/03/05(Fri) 13:12:16)
No47547 (もりお さん) に返信
>
> ■No47540 (だい さん) に返信
>>必ずNewすることになります。そうなるとTextの値はEmptyになってしまいます…。
>
> New しないようにすると善いかと思います。
> ご掲示いただいた No47535 のコードを見る限りテキストボックスに入力された値をパラ
> メータマーカにして SQL 文を構築するクラスのようですが、どのような使い方を想定し
> ていらっしゃるのでしょうか。
>

Newしないとなるとインスタンスされていないためエラーとなります。

最終的にはボタン押下でパラメータを連結し、DBアクセスを行います。
Btn_Select_Clickで参照するにはどうしたら良いかで詰まっています。
引用返信 編集キー/
■47549 / inTopicNo.17)  Re[16]: クラスの参照について
□投稿者/ もりお (194回)-(2010/03/05(Fri) 13:46:20)
2010/03/05(Fri) 13:50:38 編集(投稿者)
> Newしないとなるとインスタンスされていないためエラーとなります。

Form 側で HinCD のインスタンスを作成して TxtHin_CD オブジェクトに渡すと良いかと
思います。

Public Class Form1
  Private HinCD_ As New HinCD()

  Private Sub Form1_Load(...) Handles MyBase.Load
    Txt_HinCD1.HinCD = HinCD_
  End Sub

  Private Sub Btn_Select_Click(...) Handles Btn_Select.Click
    ...
    Dim command As New OleDbCommand()
    command.CommandText = HinCD_.Text
    ...
  End Sub
End Class

Public Class Txt_HinCD
  Inherits TextBox

  Private HinCD_ As HinCD

  Public WriteOnly Property HinCD() As HinCD
    Set(ByVal value As HinCD)
      HinCD_ = value
    End Set
  End Property

  Protected Overrides Sub OnLostFocus(ByVal e As System.EventArgs)
    MyBase.OnLostFocus(e)
    If HinCD_ IsNot Nothing Then
      HinCD_.Text = Me.Text
    End If
  End Sub
End Class

> 最終的にはボタン押下でパラメータを連結し、DBアクセスを行います。

パラメータへの値のセットが抜け落ちているようですがその辺りは大丈夫でしょうか。

引用返信 編集キー/
■47552 / inTopicNo.18)  Re[17]: クラスの参照について
□投稿者/ だい (40回)-(2010/03/05(Fri) 14:24:12)
Public Class Txt_HinCD
Inherits TextBox

Private HinCD_ As HinCD ←※

Public WriteOnly Property HinCD() As HinCD
Set(ByVal value As HinCD)
HinCD_ = value
End Set
End Property

Protected Overrides Sub OnLostFocus(ByVal e As System.EventArgs)
MyBase.OnLostFocus(e)
If HinCD_ IsNot Nothing Then
HinCD_.Text = Me.Text
End If
End Sub
End Class

※の部分でインスタンスされていないように思いますがこれで大丈夫なんですか?
引用返信 編集キー/
■47553 / inTopicNo.19)  Re[18]: クラスの参照について
□投稿者/ もりお (195回)-(2010/03/05(Fri) 15:20:14)
No47552 (だい さん) に返信

Public Class Txt_HinCD
  Inherits TextBox
  
  Private HinCD_ As HinCD ←※
  
  Public WriteOnly Property HinCD() As HinCD
    Set(ByVal value As HinCD)
      HinCD_ = value
    End Set
  End Property
  
  ...
End Class

> ※の部分でインスタンスされていないように思いますがこれで大丈夫なんですか?

Form で HinCD のインスタンスを作成して Txt_HinCD のオブジェクトにセットします。
Txt_HinCD クラスには HinCD のインスタンスを受け取るために WriteOnly な Property 
を用意しています。
なので Txt_HinCD クラスの HinCD_ 変数宣言時にインスタンスが作成されないことを危
惧する必要はありません。

Public Class Form1
  ' ここで HinCD のインスタンスを作成して
  Private HinCD_ As New HinCD()

  Private Sub Form1_Load(...) Handles MyBase.Load
    ' Txt_HinCD にセットします
    Txt_HinCD1.HinCD = HinCD_
  End Sub
  
  ...
End Class

引用返信 編集キー/
■47555 / inTopicNo.20)  Re[19]: クラスの参照について
 
□投稿者/ だい (41回)-(2010/03/05(Fri) 15:39:30)
No47553 (もりお さん) に返信
> ■No47552 (だい さん) に返信
>
> Public Class Txt_HinCD
> Inherits TextBox
>
> Private HinCD_ As HinCD ←※
>
> Public WriteOnly Property HinCD() As HinCD
> Set(ByVal value As HinCD)
> HinCD_ = value
> End Set
> End Property
>
> ...
> End Class
>
>>※の部分でインスタンスされていないように思いますがこれで大丈夫なんですか?
>
> Form で HinCD のインスタンスを作成して Txt_HinCD のオブジェクトにセットします。
> Txt_HinCD クラスには HinCD のインスタンスを受け取るために WriteOnly な Property
> を用意しています。
> なので Txt_HinCD クラスの HinCD_ 変数宣言時にインスタンスが作成されないことを危
> 惧する必要はありません。
>
> Public Class Form1
> ' ここで HinCD のインスタンスを作成して
> Private HinCD_ As New HinCD()
>
> Private Sub Form1_Load(...) Handles MyBase.Load
> ' Txt_HinCD にセットします
> Txt_HinCD1.HinCD = HinCD_
> End Sub
>
> ...
> End Class
>

コントロールにパラメータとなるプロパティを持たせるということですか。

Txt_HinCD.HinCDはちょっと複雑化しているような気もします。

可能であれば、clsParametersで入力値を受け取り、パラメータにセット
コントロールのClassには入力値をclsParametersに引き渡す、FormではclsParametersに入っている値を読む。

このようなことが実現できればスマートになるんですが…。

自分が考えたところだと、clsParametersに値をセットするにはインスタンスを作成しなければならない。この場合はNewしても大丈夫なので、セットまでは可能。
次にclsParametersの値を読む際も同様にインスタンスしなければならない。が、インスタンスを作成してしまうとNewされるので値はブランクとなる。
なのでセットしたクラス以外から値を読むことは不可能という結論に至ったんですが…。

大変申し訳ないです。

引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -