tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトル複数のForm上の同名のコントロールに関しての処理をまとめるには
記事No6027
投稿日: 2007/08/08(Wed) 10:16
投稿者ひでと
複数のFormがあり、それぞれに同じ名前をつけたコントロール群があります。
Form1
  TextBox1,Button1,...
Form2
  TextBox1,Button1,...
...
またこれらのコントロールに同じ処理を入れています。
Public Class Form1
     Private Sub Button1_Click(ByVal sender As Object, _
                               ByVal e As System.EventArgs) Handles Button1.Click
        TextBox1.Text=A処理()
     End Sub
   ...
End Class

Public Class Form2
     Private Sub Button1_Click(ByVal sender As Object, _
                               ByVal e As System.EventArgs) Handles Button1.Click
        TextBox1.Text=A処理()
     End Sub
   ...
End Class

Private Function A処理()
     ...
End Function

このような場合に共通する処理部分
      Private Sub Button1_Click(ByVal sender As Object, _
                               ByVal e As System.EventArgs) Handles Button1.Click
        TextBox1.Text=A処理()
      End Sub
    ...
を一箇所で記載したいのですが、どのようにしたら良いのでしょうか?

この処理をモジュールに記載すると、当然のことですが
コントロール名などがコンパイルできなくなります。
よろしくお願いいたします。

[ツリー表示へ]
タイトル追伸です
記事No6028
投稿日: 2007/08/08(Wed) 10:21
投稿者ひでと
複数のForm上には 同名のコントロールだけではなく、別のコントロールも
存在しています。
Form1
  TextBox1,Button1,...
 TextBoXSpecial1
Form2
  TextBox1,Button1,...
 TextBoXSpecial2
...
このような感じになります

[ツリー表示へ]
タイトルRe: 複数のForm上の同名のコントロールに関しての処理をまとめるには
記事No6044
投稿日: 2007/08/08(Wed) 21:22
投稿者魔界の仮面弁士
末尾の部分を Handles Button1.Click, Button2.Click, Button3.Click のように
列挙するか、または AddHandler メソッドで動的にイベントを関連づけてやれば OK です。

[ツリー表示へ]
タイトルRe^2: 複数のForm上の同名のコントロールに関しての処理をまとめるには
記事No6046
投稿日: 2007/08/09(Thu) 09:21
投稿者ひでと
ありがとうございます。
> 末尾の部分を Handles Button1.Click, Button2.Click, Button3.Click のように
> 列挙するか、または AddHandler メソッドで動的にイベントを関連づけてやれば OK です。
これは1つのフォーム内で複数のコントロールがあり、それぞれに同じイベントを記載
するときの方法ですよね。
お聞きしたかったのとは、ちょっと違うのです。

複数のフォームがあり、同じコンロール名のコントロールをそれぞれが持っています。
例えば TextBox1 というコントロールが FormAにもFormBにもFormCにも
存在します。
同じようにTextBox2やButton1のコントロールも、全てのフォームが共通して持っています。

しかし、FormAだけのコントロール TextBoxA とかFormBだけのButtonB などの
コントロールがあるため FormA,FormBは同じフォームを流用することができません。

このとき、共通して持っている同名のコントロール ここでのTexBox1やTextBox2、Button1
に関してのプログラム部分は FormA,FormB,FormCでも全く同じになっています。
この同じ部分の処理を、フォーム中にそれぞれ記載するのではなく、1箇所で
管理できないかと考えたのです。

単純に共通したプログラム部分を標準モジュールに貼り付けると、TextBox1やTextBox2,
Button1を参照できないためエラーになってしまいます。
このような場合の対処方法をお聞きしたかったのです。
この説明でご理解いただけますでしょうか

[ツリー表示へ]
タイトルRe^3: 複数のForm上の同名のコントロールに関しての処理をまとめるには
記事No6047
投稿日: 2007/08/09(Thu) 09:56
投稿者大吉末吉
> > 末尾の部分を Handles Button1.Click, Button2.Click, Button3.Click のように
> > 列挙するか、または AddHandler メソッドで動的にイベントを関連づけてやれば OK です。
> これは1つのフォーム内で複数のコントロールがあり、それぞれに同じイベントを記載
> するときの方法ですよね。

別のフォームでもできますよね・・・

#ちゃんと、対象オブジェクトが外部から見えるようにしないと
#(Modifiers プロパティを変更しておかないと)駄目ですが・・・



> しかし、FormAだけのコントロール TextBoxA とかFormBだけのButtonB などの
> コントロールがあるため FormA,FormBは同じフォームを流用することができません。

共通処理部分を1つのクラスにまとめて、各フォームで継承するとか・・・


> 単純に共通したプログラム部分を標準モジュールに貼り付けると、TextBox1やTextBox2,
> Button1を参照できないためエラーになってしまいます。

「Modifiers プロパティ」が「Friend」のままだとか・・・

[ツリー表示へ]
タイトルRe^4: 複数のForm上の同名のコントロールに関しての処理をまとめるには
記事No6055
投稿日: 2007/08/09(Thu) 11:33
投稿者ひでと
ありがとうございます。
> > > 末尾の部分を Handles Button1.Click, Button2.Click, Button3.Click のように
> > > 列挙するか、または AddHandler メソッドで動的にイベントを関連づけてやれば OK です。
> > これは1つのフォーム内で複数のコントロールがあり、それぞれに同じイベントを記載
> > するときの方法ですよね。
>
> 別のフォームでもできますよね・・・
>
> #ちゃんと、対象オブジェクトが外部から見えるようにしないと
> #(Modifiers プロパティを変更しておかないと)駄目ですが・・・
>
>
>
> > しかし、FormAだけのコントロール TextBoxA とかFormBだけのButtonB などの
> > コントロールがあるため FormA,FormBは同じフォームを流用することができません。
>
> 共通処理部分を1つのクラスにまとめて、各フォームで継承するとか・・・
>
>
> > 単純に共通したプログラム部分を標準モジュールに貼り付けると、TextBox1やTextBox2,
> > Button1を参照できないためエラーになってしまいます。
>
> 「Modifiers プロパティ」が「Friend」のままだとか・・・
Modifilers プロパティを調べてみます。
理解できなかったら またお願いします。

[ツリー表示へ]
タイトルRe^4: 複数のForm上の同名のコントロールに関しての処理をまとめるには
記事No6061
投稿日: 2007/08/09(Thu) 14:07
投稿者ひでと
すいません。良く理解できないのでもう少し教えてください。
  
> > しかし、FormAだけのコントロール TextBoxA とかFormBだけのButtonB などの
> > コントロールがあるため FormA,FormBは同じフォームを流用することができません。
>
> 共通処理部分を1つのクラスにまとめて、各フォームで継承するとか・・・
> #ちゃんと、対象オブジェクトが外部から見えるようにしないと
> #(Modifiers プロパティを変更しておかないと)駄目ですが・・・
>

「共通部分をクラスにまとめる」とは 別に共通部分のフォームを作成するのと
同じでしょうか?
(フォームでないとコントロールに 関係する処理でコンパイルできませんよね)

ということで、途中の報告をさせていただきます。
同じと考えて、今のフォーム Form0をコピーして別のフォーム Form1 を作ってみました。
Form1のコードの非共通部分を削除しました。

次にコンパイルできないSubとFunctionを作成フォーム Form1上でダミーの定義を
Public Overridable でつくりました。
またエラーになってしまう変数を作成フォーム Form1上で定義しました。

次にフォームの追加で 「継承されたフォーム」を選択して新しいフォーム Form2を
作成しました。
継承されたフォーム Form1上に、元のForm0の非共通部分のコードをはりつけ
Sub,Function を Public Overrides に変更しました。

この状態で Form1とForm2でのコンパイルエラーは消えています。
その後、非共通部分と共通部分の調整をいくつかしたところ、現状では動くように
なりました。
>
>
> > 単純に共通したプログラム部分を標準モジュールに貼り付けると、TextBox1やTextBox2,
> > Button1を参照できないためエラーになってしまいます。
>
> 「Modifiers プロパティ」が「Friend」のままだとか・・・

「継承されたフォーム」を選択して新しいフォーム を作成するようにしてしまいましたので
Modifilers プロパティをいじっておりません。
その為、今ひとつフォームのInherits を含めて理解できておりません。
通常はどのようにされるのでしょうか?
教えていただけるとたすかります。

[ツリー表示へ]
タイトル追伸です
記事No6068
投稿日: 2007/08/09(Thu) 15:59
投稿者ひでと
申し訳ありません。また解らないとこがでてきました
>
> 次にフォームの追加で 「継承されたフォーム」を選択して新しいフォーム Form2を
> 作成しました。

この段階で全てのコントロールの配置がロックされてしまい、別のコントロールを
追加しようとすると、位置調整が出来なくなりました。
別の方法が必要みたいです。

[ツリー表示へ]
タイトルRe: 追伸です
記事No6070
投稿日: 2007/08/09(Thu) 16:38
投稿者大吉末吉
私も「継承」は詳しくないんで、ちゃんとした説明はちょっと・・・


> 「継承されたフォーム」を選択して新しいフォーム を作成するようにしてしまいましたので
> Modifilers プロパティをいじっておりません。

> この段階で全てのコントロールの配置がロックされてしまい、別のコントロールを
> 追加しようとすると、位置調整が出来なくなりました。
> 別の方法が必要みたいです。

とりあえず継承元で、コントロールの「Modifiers プロパティ」を変更すれば、
継承先でプロパティを変更できるので、位置を変えられると思いますけど・・・

#私の認識では「自分自身以外からの参照・操作可能かどうかを指定するプロパティ」だと・・・

[ツリー表示へ]
タイトルRe^3: 複数のForm上の同名のコントロールに関しての処理をまとめるには
記事No6059
投稿日: 2007/08/09(Thu) 13:47
投稿者魔界の仮面弁士
> 複数のフォームがあり、同じコンロール名のコントロールをそれぞれが持っています。

ダックタイピング……?

そういう時は、その名前のコントロールがあることを保障するために、
ベースクラスやInterface などに、それらのコントロールが存在するように
実装してみてください。イベントの問題も、それで解決できますよね。


そうした共通のプロパティを持たせられないのであれば、やはり
AddHandler を使えばよいでしょう。レイトバインドで得たプロパティであっても、
適切にキャストさえすれば、イベントの割り当ては可能です。


> 単純に共通したプログラム部分を標準モジュールに貼り付けると、
> TextBox1やTextBox2, Button1を参照できないためエラーになってしまいます。

フォーム側から、標準モジュール上のメソッドを AddHandler すれば済むと思いますよ。

もしも標準モジュール上から AddHandler したいなら、それらのコントロールを
引数等で渡すようにすれば良いかと。
(Modifilers でフォーム上のコントロールを公開する必要は無し。Private でも十分)

[ツリー表示へ]
タイトルRe^4: 複数のForm上の同名のコントロールに関しての処理をまとめるには
記事No6062
投稿日: 2007/08/09(Thu) 14:18
投稿者ひでと
ありがとうございます。
たくさんの概念がでてきて難しいです。
何か参考になるものを教えていただけないでしょうか?
あたって砕けろもちょっときつい状況なので...。

> > 複数のフォームがあり、同じコンロール名のコントロールをそれぞれが持っています。
>
> ダックタイピング……?
>
> そういう時は、その名前のコントロールがあることを保障するために、
> ベースクラスやInterface などに、それらのコントロールが存在するように
> 実装してみてください。イベントの問題も、それで解決できますよね。
>
>
> そうした共通のプロパティを持たせられないのであれば、やはり
> AddHandler を使えばよいでしょう。レイトバインドで得たプロパティであっても、
> 適切にキャストさえすれば、イベントの割り当ては可能です。
>
>
> > 単純に共通したプログラム部分を標準モジュールに貼り付けると、
> > TextBox1やTextBox2, Button1を参照できないためエラーになってしまいます。
>
> フォーム側から、標準モジュール上のメソッドを AddHandler すれば済むと思いますよ。
>
> もしも標準モジュール上から AddHandler したいなら、それらのコントロールを
> 引数等で渡すようにすれば良いかと。
> (Modifilers でフォーム上のコントロールを公開する必要は無し。Private でも十分)

[ツリー表示へ]
タイトルRe^4: 複数のForm上の同名のコントロールに関しての処理をまとめるには
記事No6082
投稿日: 2007/08/10(Fri) 10:36
投稿者ひでと
ありがとうございます。
>
> そうした共通のプロパティを持たせられないのであれば、やはり
> AddHandler を使えばよいでしょう。レイトバインドで得たプロパティであっても、
> 適切にキャストさえすれば、イベントの割り当ては可能です。

たぶん、仰っていることはこういうかと思いやってみました。

1.既存フォームのコードの共通部分を切り取り、標準モジュール Mod1 に貼り付け。
2.標準モジュールに Public Obj as Object を追加。
3.標準モジュールの中で、既存フォームのコントロールを参照している部分が
エラーとなるので、それを Obj.コントロールの形になおす。
4.標準モジュールのイベントプロシージャの  Handles句を削除し、宣言をPublicに変更。
5.残された既存フォームの Loadイベントに
   Mod1.Obj=Me
   Mod1_Load(sender,e)  
   AddHandler Button1.Click, AddressOf Mod1.Button1_Click
等を記載。
6.標準モジュール内で遅延バインディングのエラーがでたので、フォームのコントロール
 のModifiersプロパティをPublicに変更。

以上で今のところ動くみたいです。
ありがとうございました。

[ツリー表示へ]