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

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

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

Re[3]: VB.NetでModuleからボタンを操作したい


(過去ログ 109 を表示中)

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

■64910 / inTopicNo.1)  VB.NetでModuleからボタンを操作したい
  
□投稿者/ MP枯渇ウィザード (8回)-(2013/01/22(Tue) 11:47:59)

分類:[.NET 全般] 

お世話になります。

具体的にはアプリの設定画面が20枚あり、その20枚の中ではボタン操作は
全て共通、セーブボタンを押したときにセーブ処理が終わるまでボタンを
無効にして、セーブ処理終了後にボタンを有効にする処理を作っています。

Public Sub DataSeve()
Func1Button.Enabled = False
Func2Button.Enabled = False
Func3Button.Enabled = False
Func4Button.Enabled = False
Func5Button.Enabled = False
Func6Button.Enabled = False
Func7Button.Enabled = False
Func8Button.Enabled = False
Func9Button.Enabled = False
Func10Button.Enabled = False

(セーブ処理)

Func1Button.Enabled = True
Func2Button.Enabled = True
Func3Button.Enabled = True
Func4Button.Enabled = True
Func5Button.Enabled = True
Func6Button.Enabled = True
Func7Button.Enabled = True
Func8Button.Enabled = True
Func9Button.Enabled = True
Func10Button.Enabled = True

End Sub

Module内にFuncXButtonがあるわけではないので、エラーが出てしまいます。
かといって

Select Case Disp
Case Disp1:
Disp1.Func〜〜〜
Case Disp2:
Disp2.Func〜〜〜

と延々書くのも違うような気がするのですが、上手い記述方法があれば教示ください。
お願いします。
引用返信 編集キー/
■64915 / inTopicNo.2)  Re[1]: VB.NetでModuleからボタンを操作したい
□投稿者/ shu (144回)-(2013/01/22(Tue) 12:53:36)
No64910 (MP枯渇ウィザード さん) に返信

案1)ボタンだけのフォームを作りそこから派生させる。
案2)ボタン部分をユーザーコントロールにする
案3)制御用のコンポーネントを作成する。


案3のコンポーネントについて書きます。
新規追加でコンポーネントを追加します。
Designer.vbファイルはそのままで
vbファイルを例えば以下のように記述します。
Imports System.ComponentModel

<ProvideProperty("FuncNo", GetType(Windows.Forms.Control))> _
Public Class Component1
    Implements IExtenderProvider

    Friend ButtonNo As New Dictionary(Of Button, String)

    Public Function CanExtend(extendee As Object) As Boolean Implements System.ComponentModel.IExtenderProvider.CanExtend
        If TypeOf extendee Is Button Then
            Return True
        Else
            Return False
        End If
    End Function

    Public Function GetFuncNo(ByVal ctrl As Windows.Forms.Control) As String
        If Not TypeOf ctrl Is Button Then Return Nothing
        Dim btn = DirectCast(ctrl, Button)
        Dim ret As String = Nothing
        If ButtonNo.TryGetValue(btn, ret) Then
            Return ret
        Else
            Return Nothing
        End If
    End Function

    Public Sub SetFuncNo(ByVal ctrl As Windows.Forms.Control, ByVal value As String)
        If Not TypeOf ctrl Is Button Then Exit Sub
        Dim btn = DirectCast(ctrl, Button)
        If String.IsNullOrEmpty(value) Then
            If ButtonNo.ContainsKey(btn) Then
                ButtonNo.Remove(btn)
            End If
        Else
            ButtonNo(btn) = value
        End If
    End Sub

    Public Property Enabled As Boolean
        Get
            If ButtonNo.Count > 0 Then
                Return ButtonNo.Keys(0).Enabled
            Else
                Return False
            End If
        End Get
        Set(value As Boolean)
            For Each btnNo In ButtonNo
                btnNo.Key.Enabled = value
            Next
        End Set
    End Property
End Class

一度コンパイルします。
するとフォームデザイン状態でツールボックスから作成したComponent1を選ぶことが出来るようになります。
Component1をフォームに貼りつけると
各ButtonコントロールにToolTipのような拡張プロパティ『Component11のFuncNo』というのが表示されるので
そこに適当に文字を入力します。Func1Buttonなら1など。
後はコード上でComponent11.EnabledをTrue,Falseに変えるとFuncNoを設定したButtonのEnabledがすべて変わります。


引用返信 編集キー/
■64934 / inTopicNo.3)  Re[2]: VB.NetでModuleからボタンを操作したい
□投稿者/ MP枯渇ウィザード (9回)-(2013/01/23(Wed) 13:38:23)
No64915 (shu さん) に返信

ありがとうございます。
コンポーネントを作るのですか。
なるほど勉強になります。
見た目はどの画面でも同じなので、現状案1っぽいものになっています。
(Function.vbにページ名、時計、ボタンを配置、他の画面はすべて
Function.vbを継承、標準機能以外が必要なところではボタンの機能を
オーバーライドしている)
そんな状態でも(Functionのボタンが使われているのと、独自機能で
ボタンが上書きされているのが混在している)上記機能は記述できるのでしょうか?


> ■No64910 (MP枯渇ウィザード さん) に返信
>
> 案1)ボタンだけのフォームを作りそこから派生させる。
> 案2)ボタン部分をユーザーコントロールにする
> 案3)制御用のコンポーネントを作成する。
>
>
> 案3のコンポーネントについて書きます。
> 新規追加でコンポーネントを追加します。
> Designer.vbファイルはそのままで
> vbファイルを例えば以下のように記述します。
> Imports System.ComponentModel
>
> <ProvideProperty("FuncNo", GetType(Windows.Forms.Control))> _
> Public Class Component1
> Implements IExtenderProvider
>
> Friend ButtonNo As New Dictionary(Of Button, String)
>
> Public Function CanExtend(extendee As Object) As Boolean Implements System.ComponentModel.IExtenderProvider.CanExtend
> If TypeOf extendee Is Button Then
> Return True
> Else
> Return False
> End If
> End Function
>
> Public Function GetFuncNo(ByVal ctrl As Windows.Forms.Control) As String
> If Not TypeOf ctrl Is Button Then Return Nothing
> Dim btn = DirectCast(ctrl, Button)
> Dim ret As String = Nothing
> If ButtonNo.TryGetValue(btn, ret) Then
> Return ret
> Else
> Return Nothing
> End If
> End Function
>
> Public Sub SetFuncNo(ByVal ctrl As Windows.Forms.Control, ByVal value As String)
> If Not TypeOf ctrl Is Button Then Exit Sub
> Dim btn = DirectCast(ctrl, Button)
> If String.IsNullOrEmpty(value) Then
> If ButtonNo.ContainsKey(btn) Then
> ButtonNo.Remove(btn)
> End If
> Else
> ButtonNo(btn) = value
> End If
> End Sub
>
> Public Property Enabled As Boolean
> Get
> If ButtonNo.Count > 0 Then
> Return ButtonNo.Keys(0).Enabled
> Else
> Return False
> End If
> End Get
> Set(value As Boolean)
> For Each btnNo In ButtonNo
> btnNo.Key.Enabled = value
> Next
> End Set
> End Property
> End Class
>
> 一度コンパイルします。
> するとフォームデザイン状態でツールボックスから作成したComponent1を選ぶことが出来るようになります。
> Component1をフォームに貼りつけると
> 各ButtonコントロールにToolTipのような拡張プロパティ『Component11のFuncNo』というのが表示されるので
> そこに適当に文字を入力します。Func1Buttonなら1など。
> 後はコード上でComponent11.EnabledをTrue,Falseに変えるとFuncNoを設定したButtonのEnabledがすべて変わります。
>
>
引用返信 編集キー/
■65062 / inTopicNo.4)  Re[3]: VB.NetでModuleからボタンを操作したい
□投稿者/ MP枯渇ウィザード (11回)-(2013/01/31(Thu) 17:58:20)
いろいろ調べた結果、時間の都合で全フォーム力押しになりました。
ただ、次回は楽してプログラミングしたいので、他にも挙がっていた方法も
勉強してみます。
ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -