tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルForm(Class)をPublic変数に代入したい
記事No10291
投稿日: 2010/11/03(Wed) 20:54
投稿者tomi
環境:WinXP VB2005

はじめまして、御世話になります。

同じような振舞いををする、3つの画面(フォーム)を作成し、ボタン等のイベント処理を
モジュールで一括でコントロールしようとしています。

通常の画面ではPictureBoxと、Butttonがそれぞれ6個あります。
大画面ではPictureBoxと、Butttonがそれぞれ3個、小画面ではそれぞれが9個あります。

なぜ、こんなことをしているかというと、御年寄りが見るには大画面(PictureBox)がよく、
たくさんの画像を一気に見るには小画面が良いのではと考え3つのフォームを作成しました。
当然ながら、それぞれのフォーム同士はButtonイベントにて切替が可能です

それぞれのフォームにて、
Public Class Form_xx

   Public Pict_box() As PictureBox
   Public Pict_btn() As Button

  Private Sub Form_xx_Load

     '__________________________________________________________
   'ここに、フォーム用の変数があれば、変数 = Form_xx としたいです
     '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     Pict_box = New PictureBox() {PictureBox1, PictureBox2, PictureBox3, ....}
     Pict_btn= New Button() {Button1, Button2, Button3, ....}

     MJ_Load(Pict_box , Pict_btn)   'モジュールでの処理へ

  End Sub

 Private Sub Button_Click
     ’切替に応じたフォームの表示(小画面に切替の場合)
   Form小.Show
      Me.Close
   Me.Dispose
  End Sub

End Class

とそれぞれのフォームにコードを書いて、モジュール内にて下記のように処理しています。

Module Module1

     '__________________________________________________________
   'ここに、フォーム用の変数が宣言できれば、Public変数 としたいです
     '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

     Public Sub MJ_Load(ByRef Pict_box() as PictureBox , _
                        Byref Pict_btn() as Button )

        For i As Integer = 0 To pict_btn.Length - 1        
            pict_btn(i).Parent = Pict_box(i)   ’ボタンの親を設定
            pict_btn(i).Top = pict_btn(i).Top - Pict_box(i)
            pict_btn(i).Left = pict_btn(i).Left - Pict_box(i)
            pict_btn(i).Tag = i
            AddHandler pict_btn(i).Click, AddressOf pict_btn_Click
        Next

     End Sub
    
     'フォームのボタンが押されたときの処理
     Public Sub pict_btn_Click(ByVal sender As Object, ByVal e As EventArgs)

        Dim i As Integer = _
            CInt(CType(sender,System.Windows.Forms.Button).Tag.ToString)

    Form_xx.Pict_box(i).Image=Image.FormFile(xxxxxxx)
        ※<< この部分の呼ばれたフォームを取得したい(知りたい) >>※
    
     End Sub
End Module

呼ばれたフォーム(クラス)をあらかじめ変数等に代入できるのであれば
Module 内で変数を設定して、ロード処理の際に呼び出すフォーム(Class)を代入して
、pict_btn_Clickのイベント内で 

    変数.Pict_box(i).Image=Image.FormFile(xxxxxxx) 

と処理して、フォームに画像を表示したかったのですが、この変数の宣言にて
宣言の仕方が解からず途方にくれております。

 Dim Frm as ?????? ← フォーム(Class)の宣言?????
(Newしてしまうと、特定のフォーム(Class)しかアクセスできません)

あらかじめ、Form(Class)が特定できているのであれば、上のコードのように
  Form_xx.Pict_box(i).Image=Image.FormFile(xxxxxxx)
とすれば動作するのですが、、、、、、

VBのモジュール機能の便利さを痛感して、VBに乗換えて2年目の若輩者です。
これらのような問題を解決できる良い御知恵をご教授いただけますよう
宜しくお願いいたします。

[ツリー表示へ]
タイトルRe: Form(Class)をPublic変数に代入したい
記事No10292
投稿日: 2010/11/03(Wed) 23:10
投稿者花ちゃん
> 通常の画面ではPictureBoxと、Butttonがそれぞれ6個あります。
> 大画面ではPictureBoxと、Butttonがそれぞれ3個、小画面ではそれぞれが9個あります。
>
> なぜ、こんなことをしているかというと、御年寄りが見るには大画面(PictureBox)がよく、
> たくさんの画像を一気に見るには小画面が良いのではと考え3つのフォームを作成しました。

私なら、下記のように ListView を使ってエクスプローラの縮小画像の表示のように
表示して、選択したら別 ウィンドウに表示するようにします。
http://hanatyan.sakura.ne.jp/samplepic/vb8_154.htm

いずれにしても、投稿されたような仕様(コード)は見直された方が良いような気がします。



[ツリー表示へ]
タイトルRe: Form(Class)をPublic変数に代入したい
記事No10293
投稿日: 2010/11/03(Wed) 23:39
投稿者shu
> Dim Frm as ?????? ← フォーム(Class)の宣言?????
??????をFormとすればとりあえず解決しそうな気がしますが、
Interfaceを定義するこを奨めます。


Public Class Form_xx
    Implements IForm

    Private m_Pict_box() As PictureBox
    Private m_Pict_btn() As Button
    Private m_strFileNames() As String

    Public Sub New()
        ' この呼び出しはデザイナーで必要です。
        InitializeComponent()

        ' InitializeComponent() 呼び出しの後で初期化を追加します。
        m_Pict_box = New PictureBox() {PictureBox1, PictureBox2, PictureBox3, ....}
        m_Pict_btn= New Button() {Button1, Button2, Button3, ....}
        m_strFileNames = New FileNames() {......}

        MJ_Load(Me)   'モジュールでの処理へ
    End Sub

    Public ReadOnly Property Pict_box As System.Windows.Forms.PictureBox() Implements IForm.Pict_box
        Get
            Return m_Pict_box
        End Get
    End Property

    Public ReadOnly Property Pict_btn As System.Windows.Forms.Button() Implements IForm.Pict_btn
        Get
            Return m_Pict_btn
        End Get
    End Property

    Public Property FileNames(ByVal Index As Integer) As String Implements IForm.FileNames
        Get
            Return m_strFileNames(Index)
        End Get
        Set(ByVal value As String)
            m_strFileNames(Index) = value
        End Set
    End Property
End Class

Module Module1

    Public Sub MJ_Load(ByVal fm As IForm)

        For i As Integer = 0 To fm.Pict_btn.Length - 1
            fm.Pict_btn(i).Parent = fm.Pict_box(i)   'ボタンの親を設定
            fm.Pict_btn(i).Top = fm.Pict_btn(i).Top - fm.Pict_box(i)
            fm.Pict_btn(i).Left = fm.Pict_btn(i).Left - fm.Pict_box(i)
            fm.Pict_btn(i).Tag = i
            AddHandler fm.Pict_btn(i).Click, AddressOf pict_btn_Click
        Next

    End Sub

    'フォームのボタンが押されたときの処理
    Public Sub pict_btn_Click(ByVal sender As Object, ByVal e As EventArgs)

        Dim btn As Button = CType(sender, System.Windows.Forms.Button)
        Dim i As Integer = CInt(btn.Tag.ToString)
        Dim fm As IForm = DirectCast(btn.FindForm, IForm)

        fm.Pict_box(i).Image = Image.FromFile(fm.FileNames(i))
        ※<< この部分の呼ばれたフォームを取得したい(知りたい) >>※

    End Sub

End Module

Public Interface IForm
    ReadOnly Property Pict_box As PictureBox()
    ReadOnly Property Pict_btn As Button()
    Property FileNames(ByVal Index As Integer) As String
End Interface

こんな感じでしょうか。実行はしていません。

[ツリー表示へ]
タイトルRe^2: Form(Class)をPublic変数に代入したい
記事No10294
投稿日: 2010/11/04(Thu) 11:08
投稿者tomi
花ちゃん様、shu様 早速のご教授ありがとうございました。


> Dim Frm as ?????? ← フォーム(Class)の宣言?????
> ??????をFormとすればとりあえず解決しそうな気がしますが、

System.Windows.Forms.Formとしても変数は宣言することはできませんでした。
ビルドに失敗しました。

> Interfaceを定義するこを奨めます。

この方法は、完璧に動作しました。Interfaceを定義することで完全にコントロールすることが可能でした。Interfaceのプロパティを利用してモジュールからフォームのコントロールとは、私には全く想定外の活用方法で、改めてVBの深さを実感しました。
実は、フォームのデザインをかなり作りこんでいたので一時はどうなることかと、悶絶しておりましたが、お知恵をお借りすることができ、何とか解決することができました。本当にありがとうございます。

又、何かわからないことがあれば利用させていただきますので、その際はよろしくお願いいたします。このたびは本当にありがとうございました。

[ツリー表示へ]