DOBON.NET DOBON.NETプログラミング掲示板過去ログ

サブルーチンの外部共通化が可能か?

環境/言語:[WindowsXP,VB.NET,Framework1.1]
分類:[.NET]

よろしくお願いいたします。

1つのプロジェクトで、Form1にテキストボックスやボタンをを配置し、
このような状態で、同じプロジェクト内のForm1に、サブルーチンを
記述してます。ここまでは普通によくあるケースだと思います。(たぶん)
サブルーチンでは、自クラスのテキストボックスの名前を「直接指定」して
使用しています。スコープが範囲内であることをわかっていてるので、引数とか
にしていませんでした。サブルーチンコールとチョッとした引数で、フォーム上の
コントロールを多彩に操作しようと思ったからです。
そして、このようなサブルーチンは共通(やる事も、コントロール名も同じ)なので、
コピペして、異なるプロジェクトに使用してきました。類似のサブルーチンも沢山使用してます。

しかし、サブルーチンの内容を変えるたび、必要なプロジェクトに反映し、
コンパイルし、配布し、、、と私の手に負えなくなるほどに多くなってしまいました。

私がやりたいことは、このサブルーチンをDLLのように外部へ分離し、
共通に使用したいと思ってます。
問題は、呼び出し元の記述を変更したくないと言う事です。
サブルーチンコール名も引数も。もちろんコントロールの名前もです。
Importsして、名前空間の省略とかは苦にならないです。

プロジェクトあたりのサブルーチンコールの
頻度が多くて、全てを変更していられないのです。オブジェクトを引数にしてあげれば
良いのはわかるのですが、膨大すぎるとてもとても。。

自クラスの情報を引数等で与えずに、自クラスのコントロールを弄ってもらう
とは、都合が良すぎるのはわかります。可能な限り少ない変更で済めばと願います。
なんとかなる手立てはありませんでしょうか?ほとほと困り果てております。
自分のレベルが低すぎるのは重々承知です。お知恵をお願いいたします。


(下記のコードの稚拙さは御容赦ください)
Public Class Form1
---
WithEvents TextBoxMain As System.Windows.Forms.TextBox
---
Private Sub Button1_Click(ByVal ...) Handles Button1.Click
TestTest("あ")
End Sub
--
Private Sub Button2_Click(ByVal ...) Handles Button2.Click
TestTest("い")
End Sub
--
Sub TestTest(ByVal message as String)
Select Case message
Case "あ": TextBoxMain.Text = "A1"
Case "い": TextBoxMain.Text = "A1"
Case "う": TextBoxMain.Text = "A1"
End Case
End Sub
End Class
たとえばサブルーチンと言っている箇所 (必用な機能) をユーザーコントロール化する方法などが考えられますね。
>■No22137に返信(じゃんぬねっとさんの記事)
> たとえばサブルーチンと言っている箇所 (必用な機能) を
> ユーザーコントロール化する方法などが考えられますね。

ユーザーコントロール化ですね。

私のとこでは各コントロール(TextBox,CheckBox,ComboBox・・・等)を継承して
拡張(単純に継承しただけのを含む)したコントロール群をライブラリ化して
DLLとし、各プロジェクトにて参照して使用しています。

↓あたりが少しは参考になるかな。
拡張Windowsコントロールの作成http://www.atmarkit.co.jp/fdotnet/winexp/winexp02/winexp02_02.html
第2回 ユーザー・インターフェイス開発は分割して小さくする
http://www.atmarkit.co.jp/fdotnet/vblab/developbizapp_02/developbizapp_02_01.html
じゃんぬねっと様、やじゅ様

説明が悪くて申し訳ありませんでした。サンプルが駄目でした。
サブルーチンでは他のコントロールやファイルアクセスやら色付けなど、
一挙にいろいろおこなっているのです。ユーザーコントロールが目的で
はないのです。サブルーチンの使い手は、如何に単純なコード(引数)
だけ記述し、水面下で色々作業をさせているのです。

コードやオブジェクト名が同じなので、外部へ一本化っと思ったのですが、
やはり無理なんでしょうか。。。みなさんはどういう設計にするのだろうか。。
■No22140に返信(もるがんさんの記事)
> コードやオブジェクト名が同じなので、外部へ一本化っと思ったのですが、
> やはり無理なんでしょうか。。。みなさんはどういう設計にするのだろうか。。

別にムリではないですけど、(たとえば Control のインスタンスを引数にしてしまえば何でもできる... いや、できてしまう) そのメリットが薄いように感じます。

> 説明が悪くて申し訳ありませんでした。サンプルが駄目でした。
> サブルーチンでは他のコントロールやファイルアクセスやら色付けなど、
> 一挙にいろいろおこなっているのです。

上記の文章でも判断できかねる部分はありますね。

他のコントロールやインターフェイスをまとめるのがユーザーコントロールというコンテナだという回答のつもりでしたが、説明が悪かったのはこちらという可能性もあります。
では、共通するクラスを1つ作成し
コントール名またはコントールオブジェクトを渡すPublic Sharedプロパティを
用意する。
また、各メソッドをPublic Sharedとして定義しておき、プロパティに渡された
コントール名またはコントールオブジェクトを使って処理を行う。

クラス作成とSharedキーワードが味噌かな。
じゃんぬねっと様、やじゅ様

返信が遅くなり、大変申し訳ありませんでした。
あれからずーっと試行錯誤を繰り返しております。

じゃんぬねっと様の「Control のインスタンスを引数・・」というのは、
出来るのは判っているのですが、それを全てのプロジェクトに適応するのが
億劫に思っての質問でした。
また私がユーザーコントロールの使い方を勘違いしておりました。
しかし、ユーザーコントロールまでは必要ないこともわかりました。
やじゅ様の「クラス作成」よりヒントをいただき、Formクラスの継承で事済ませようと考えました。

もう一度無駄かと思いますが説明いたします。(どなたかの参考になれば、、)

私が担当しているのは、ハード制御用ソフト開発担当者用のテンプレートを作ることです。
ハード制御のパターンは数知れずですが、その通信プロトコルやフォーマット、アクセス手順は
毎度共通なため、テンプレート化にしました。
テンプレートを使用する担当者はハードは知っていますが、ソフトはほとんど知らないのです。
極力フォームやコントロールを共通化し、使用するコード(サブルーチン)を単純化させ
担当者がテンプレート用いてハードを動かすソフトを組むときに混乱させない事が目的なのです。

ここでいうテンプレートですが、基本となるFormへはコントロールを配置済みのものです。
これらのイベント記述などは一切ありません。
コントロールの操作はFormクラス内のサブルーチン内でのみ行う。ハード屋はさわりません。
拡張するのはあくまでメインルーチンだけです。サブルーチンを並べるだけなのです。
(多少の計算やループは使います)

今まで煩わしかったのは、テンプレートをコピペしハード屋に組んでもらい、要望や修正があれば
全てに適応して、と使っていたのです。これがウザイ。

繰り返しますが基本フォームクラスには、イベントに対するコーディングもなく、
サブルーチンではコントロールのプロパティやメソッドをいじっているだけです。
イベントが必要なら拡張時に追加して個別に対応します。

継承を使用すればオーバーライドするものもなく、サブルーチンの変更は
継承元で一括に変更できるかと思いました。
いままでのプロジェクトへの変更もInheritsの部分と参照設定だけで済みそうな感じです。

私の中では解決しそうなのですが、他の方へは参考になるとは思えなく。。。
申し訳ありません。またこれが正解なのかもわかりませんが、とにかく目の前が
明るくなったのは確かです。ありがとうございました!!

http://msdn.microsoft.com/ja-jp/library/cc440871.aspx
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板