利用規約の変更について

こんにちは、さっそくですが質問です。

現在、VBでWindowsアプリを作成しています。
VBアプリの経験が0に等しいため、いろいろと調べながら作業を
しています。ちなみに、Javaは経験があります。
※意味不明な箇所があったらごめんなさい。


ボタンをクリックすると、Textの入力データを取得して、加工する
処理をつくりました。

複雑な処理になったので(1部重複)、Form クラス内にPrivateメソッドを作成して処理を任せるようにしました。

進めていると、Fromが大きくなってきまして、"このままではまずい..処理を行うソースを1つのクラスでまとめて管理しよう"と思い、ユーティリティクラス(?)を作成しました。

そのクラスでの、メソッドの公開レベル(修飾子)でつまってしまいました。
基本的にこのクラスのメソッドは上記のFormもしくは、関連したFormで
しか使用しないためPublicではなく特定の範囲内のみで公開するべきと
かんがえました。
いろいろと調べてみたのですが、この考えを実現する方法がわかりません。
(Javaでいうところの同一パッケージ内の公開みたいな感じです)

Friendというものがありましたが、ちょっと違う気がします。
(よくわかっていませんが..)

このような場合どういった方法をとればいいのでしょうか?
もしくは、そもそも私の考えがまちがいなのでしょうか?
(Formはでかくなってもしかたがないとか..別のやり方があるなど..)

VB設計での暗黙値的設計も今の段階で、分かっておりません。
そのあたりも含め、ご存知の方がおりましたら、よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

 VB6,VB2002(初代.Net),2003,2005のどれをお使いでしょうか?。



(1)VB6
 同じ問題にぶつかりました。VB6には実装継承がないので、Javaのような細かい制御が効きません。せっぱつまってeventを利用しました。
 Form側のPrivateメソッドを全てeventにおきかえ、そのeventを目標クラスに接続して、eventの実装コードをそのクラス内に書きました。結局これは、#1さんの言うImplementsと同じなのですが、多少コードが直感的という利点があります。

(2)VB2002,2003
 こっからは実装継承があるので、#1さんの方法が標準になると思います。

(3)VB2005
 Partialクラスを使う方法があります。これは任意のクラス(Form含む)のコードを、分散して書く方法で、個人的な意見では「隠れディレクティヴ」です。
 コンパイラーは、Patial Class Formのクラス名~End Classまでのブロックを、Formクラスの一部とみなし、コンパイル時にPatialブロックの内容を、Formクラスに結合してコンパイルします。
 なので空のClassを用意して、Patialブロックを作り、ブロック内にPrivate関数を書けばOKです(ClassはいくつあってもOKです)。

(4)その他
 暗黙値的設計とは、Formの暗黙のインスタンス化などの事でしょうか?。補足を下さい。
 

この回答への補足

すいません...

暗黙値的設計 = 一般的に、VBを使ってアプリを設計する際の、常識的
        な設計

という意味でした。意味不明な言葉を使ってしまってすいません。

例えば、今回のように、ボタンをクリックされて処理を行うという際に、
・複雑な処理の場合
1. とにかくボタンクリック内に記述する
2. Formクラス内のメソッドに分ける
  (多少Formはでかくなっても仕方がないという考え)
3. クラスを分けて管理
といた選択や

・簡単処理の場合
1. ボタンクリックに書いてしまう
2. 複雑な処理の管理と統一性を持たせるために、同じクラスなどで管 理する

といった、一般的にはこういう風にやることが多いといった知識です。

この辺りの知識につきましても、サイト、書籍など、参考になるものが
ありましたら、宜しくお願いします。

補足日時:2007/12/16 14:40
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

Visual Studio 2005 を使っています。ランタイムは.Net 2.0です(?)
(ご質問の答えになっているでしょうか?
.Net と VBの関連がまだいまいち理解できておりません..)

そうなりますと、(3)の方法が使えるということでしょうか?
ちなみに、(3)の方法を実装するにあたり、参考になるサイトを教えていただければ幸いです(他に、VBについて参考になるサイトもあれば..)

お礼日時:2007/12/16 14:25

(1).NetとVBの関係


 以下は個人的意見です。Windows3.1時代の目標モデルは、Windows SDKで、それに対応した言語Packageが、C/C++7,VB2だと思います。Windows95からは、それがDocument-View方式になり、Windows2000でそれはいちおう完成したと見ています。その間の開発言語がVB4~6,VC2~6です。
 WindowsXP以降は、目標モデルがSoftware Factoriesとなり、そのためにWindowsに.Netが導入されます。対応して出てきたのが、VB2002~2005,Managed C,C#です。.Netの導入により、VBやCのRuntimeのかなりの範囲を.Netがカバーしますが、従来のVBやCのRuntimeも使用できます。というわけで、.NetはVB固有のRuntime(?)ではありません。VBやCのRuntimeと、API層の中間に位置しています。

(2)Partialクラス
 前回述べたように、PartialクラスはVB2005から使える、一種の便利機能だと思えます。なので、そこだけに注目した書籍やサイトは余り見た事がありません。
 ・プログラミング Visual Basic.NET Vol1,2.日経BPプレス
 (2002時代に出た解説書で、今でも公式の基礎解説です)
 ・プログラミング Visual Basic 2005 上下.日経BPプレス
 (上記の続編で、Partialクラスの使用法が載っています)
 ・Insider .NET(けっこう利用してます)。

(3)暗黙値的設計
 暗黙知的設計ですよね?。私に言えるのは、(2)であげた書籍などを探って頂けたら、それなりに見えてくる、という事だけです。というか「Javaよりだいぶいい加減」と思われるのではないでしょうか?。際たるものは、無宣言でFormを表示できる事です。これはVB2002で一時廃止されたのですが、VBプログラマーの熱い要望に応えて(?)、2003以降では復活しました。
 

参考URL:http://www.atmarkit.co.jp/fdotnet/
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます

(1).NetとVBの関係
なるほどです。だいぶイメージがつかめました。

(2)Partialクラス
やはり、このクラスを使って実装するのがベターかと考えています。
教えていただいた書籍等参考にさせていただきます。

(3)暗黙値的設計
はい..暗黙知的設計です..。
いろいろと見てみます。ありがとうございます。

お礼日時:2007/12/17 20:17

見せたくない関数やメソッド作ったとしても ソースレベルで配布してしまっては意味がないように思います



VB.NETでしたら Protected、Friend Protected、Friend、Privateなどのアクセス指定子あります

プロジェクト内のクラスの場合
Public、Friend Protected、Friendへのアクセスが可能です

プロジェクト外のDLLなどへの参照の場合
Publicのみへのアクセス可能 ・・・ クラスオブジェクト経由
自プロジェクト内へクラスを追加してこのクラスがInheritsを使用してDLLのクラスを継承した場合
クラスオブジェクトを使用する側は『プロジェクト内のクラスの場合』と同様です
追加クラスの中では MyBase経由で参照クラスのPublic,Protected,Friend Protected指定子へアクセス可能です


ソース提供なら     Public, Friend Protected, Friend
DLL提供Inherits継承なら Public, Friend Protected, Protected
が使用可能なようです
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

なにやら、知らない言葉がでてきて混乱ですw
さっそく周辺情報を調べてみました。公開に関する仕様がある程度(?)理解できました。ありがとうございます。

ちなみに、
「見せたくない関数やメソッド作ったとしても ソースレベルで配布してしまっては意味がないように思います」

すいません。最終的な配布はDLLになると思います。(規模は不明ですが)
開発という小さな世界の中ではソースレベルという回答でした。
なので、「見せたくない」というよりは、「むやみに使われたくない」
という背景です。

お礼日時:2007/12/17 20:08

そのクラスを使う際に提供するのはクラスファイルなのでしょうか


それともActiveX.DLLなどのバイナリ提供なのでしょうか

前者であるならPublicもFriendも同じような振る舞いをします
後者ならPublicはアクセスできますがFriendはアクセスできません

お使いの環境がVB6なら他に指定の方法がないため範囲を限定した公開といった使用方法は無理だろうと思います
あとあるのはImplementsによる継承ですがこれもご質問の用途むきではありません
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
提供はクラスファイルです。

ちなみに、後者のほうに関係しますが、Friendはdll単位でアクセス制限がかかるという考え方であっているでしょうか?
(アセンブリ単位という記述がありましたが..)

お礼日時:2007/12/16 14:16

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qvb.netで画面のコントロールId名を変数で動的に制御し処理する方法

以下のような処理がしたいです。
実現方法をご存知でしたらご教授下さい。

画面のコントロールText1~Text3があります。
For~Nextでこのコントロールに値をセットしたいです。

For i = 1 To 3
  Texti.Text = i
  ※このiのTextの後ろのiの部分を1~3と動的に変更し、各Textに値を設定したいです。
Next

Aベストアンサー

こんにちは、webでは、findcontrolを使うみたいです。

いかに、参考URLから、引用すると
***********************************
Dim L, U, i As Integer
Dim tx As System.Web.UI.WebControls.TextBox
L = LBound(dat)
U = UBound(dat)
For i = L To U
'コントロール名を探し出す
tx = FindControl("TextBox" & CStr(i))
'見つかったコントロールのTextプロパティに代入
tx.Text = dat(i)
Next

******************引用終わり*******
このようにすると良いみたいです。
asp findcontrolで、検索すると、
結構ヒットするみたいです。

参考URL:http://natchan-develop.seesaa.net/

Qアクセスできない保護レベルエラーが発生します

VB or C#についてお教え下さい。環境はVS2010です。

フォーム(Form1)にテキストボックス(txtBOX)があります。

このFormのtxtBOXに対して文字列を入力するには、

this.txtBOX.text = "こんにちは";
または
Me.txtBOX.text = "こんにちは";

というように、やるのは理解できます。

Classを追加して、このクラス(CLASS1)からForm1のテキストボックスに文字列を入力したいと思います。

そこで、
Form1 f1 = new Form1();
f1.txtBOX.text = "こんにちは";

とやりたかったのですが、そもそもインテリセンスが効きません。さらに、ビルドすると、

「Form1.txtBOXはアクセスできない保護レベルになっています。」と表示がされます・・・

いったい何が悪く、どこを直せば解決するのでしょうか?

Aベストアンサー

publicやprivate, protectedの違いは理解しておられますか?
まだなら、先にそれらの学習をしてください。

Qダブルクォーテーションを文字列として扱いたい

 初心者な質問で申し訳ありませんが、ダブルクォーテーション("")を
 文字列として扱いたいのですが、どうもうまくいきません。
 SQLなどだと、escapeって関数がありますよね?
 VBにはそれに似たような関数はあるのでしょうか??

Aベストアンサー

msgbox "ダブルクォーテーションは""と書けばよい"

Q他言語で言うcontinue文

他言語で言うcontinue文に相当する命令はVBに用意されているのでしょうか?

continue文とはループ中の後続の処理をやめループの先頭に戻るという命令です。

なんか探したけど無かったもので…。どんな言語にも用意されてそうな基本的な命令なので質問してみました。

バージョンは
Winエクセル2002 SP3
VBA Retail:6.4.8869, Version:9969
です。基本エンジンはVB6です。

よろしくお願いします。

Aベストアンサー

> continue文の解説でも、貴方のご指摘の動作(ループの先頭に戻る)はしているようには思えません。

ループの最後へジャンプという感じですね。
VBなら、Nextへ飛ばすのと同じです。

For i = 1 To 5
    If i = 3 Then goto Next_i
    Debug.Print i
Next_i:
Next i

QVB.NETのコンボボックスについて

VB6からVB.NETでプログラミングを始めました。
コンボボックスのクリアの仕方や設定の仕方、また
取り出し方等を教えて下さい。

色々とヘルプも見てみたのですが、よく解りません。
宜しくお願い致します。

Aベストアンサー

クリアだけだと思ってました。
追記します。

Itemを操作します


'登録
For i = 1 To 10
  Me.ComboBox1.Items.Add(i.ToString)
Next

'取得
For i = 0 To Me.ComboBox1.Items.Count - 1
  MsgBox(Me.ComboBox1.Items(i).ToString)
Next

'完全クリア
Me.ComboBox1.Items.Clear()

部分クリア
Me.ComboBox1.Items.RemoveAt(Index値)

QVB.NETのテキストボックスの書式指定

VB.NETで開発練習中です。

フォームへ呼び出したデーターを、数値データであれば
カンマ区切りとか、小数点以下の桁数を指定するのは
どうしたらできるのでしょうか?
ソースのACCESSのテーブルには指定してあっても、
呼び出したデータには当然反映されませんよね。
初歩的ですがどなたか教えてください。
よろしくお願いします。

Aベストアンサー

No.3です。

私のレスは間違いでした。

FormのLoadイベントでテキストボックスに値を入れているのですね?

であれば、TextBoxのTextChangedイベントが発生します。このイベントで処理をします。

テキストボックスが多数あるのであれば、コントロール配列を使って処理をすればいいでしょう。

Q変数の参照でエラーが出てしまいます。(VB.NET)

プロシージャの外に記した変数があるのですが、
(Dim IniFileName as string = "myapp.ini")など
Public Shared Sub 内でIniFileNameを使おうとすると
---------
クラスの明示的なインスタンスを指定しないで、共有メソッドまたは共有メンバ初期化子内からクラスのインスタンス メンバへ参照することはできません。
---------
というエラーが出てしまいます。
クラスの明示的なインスタンスを指定したいのですが、
意味がさっぱり分かりません。
class.IniFileNameとかForm1.IniFileNameなどとしてみたのですが違うようです。
一つ正解をご教示頂けたらと思います。
宜しくお願い致します。

Aベストアンサー

参考URLの「インスタンスを作成せずに呼び出せるメソッド 」が参考になるかもしれません。

Sharedをつけると、インスタンス生成しなくても呼び出せるメソッドになるので、インスタンスに属するメンバ変数などにアクセスできません。

Sharedメソッドから参照したいのであれば、
そのSharedメソッドと同じクラス内でShared変数とするか、Sharedメソッドの引数にするかなどで対応できます。

参考URL:http://www.atmarkit.co.jp/fdotnet/vb6tonet2/vbnet2_05/vbnet2_05_02.html

QSpreadの選択行の取得について

いつもお世話になっております。

VB6、Spread3.0の環境でコーディングしています。

Spreadを単一行モードにして、1行だけ選択された
状態で選択された行の行番号を取得したいのです。

Me.vaSpread1.Row = Me.vaSpread1.SelModeIndex
Me.vaSpread1.Col = 1

で取得しようとしても、うまくいきません。
どのようにすれば、行番号を取得できるのでしょう?
ご存知のかたがおられましたら、よろしくお願い
します。

Aベストアンサー

SpreadのクリックイベントでRowに渡されているので
それを使えばいいと思います。

QVb.netのグローバル変数の宣言の仕方の質問

こんばんわ!
VB6.0からの移行でVB.net2012に挑戦中なんですが、グローバル変数の宣言の仕方で分からないことがあり質問しに着ました!

内容
モジュール内で
public hoge as string="aaa"
と宣言するのと

モジュール内で
public hoge as string
と宣言しておいて
フォーム起動時に
hoge="aaa"
と宣言するのにどのような違いがあるのでしょうか?

hogeの変数を変更したいのですが、上記の方法だと動いて、下記の方法だと動かないのですが・・・
まだ良く分かっていないので、程度の低い質問で申し訳ないのですが、アドバイスのほどよろしくお願いいたします。

Aベストアンサー

> グローバルで変数として一箇所のみで宣言しているのですが、それで別の変数になることはあるのでしょうか?
hoge が本当は text とかなら有り得ます。この場合、フォームの Text プロパティが変更されます。
別のクラスなどを Imports していて、そちらに同名の変数がある場合も有り得るかも知れません。
ただし、スコープが同じ変数が複数あると↓文法エラーが出るはず。
http://msdn.microsoft.com/ja-jp/library/856b0w3t(v=vs.110).aspx
http://msdn.microsoft.com/ja-jp/library/03x63w1z(v=vs.110).aspx

上記の現象の確認には、変数を使用している場所で右クリックメニューから「定義へ移動」で
その変数がどこで宣言されたものを参照しているか分かります。
変数のスコープが狭いものが優先して使用されるため、ローカル宣言や、自分が定義していなくとも
既に VB.NET で宣言されているものとかぶってはだめです。


>意味合い自体は同じであると認識しているのですが、あっていますか?
変数宣言は同じで、初期値が違います。…見たまんまだと思いますが。


>「 public hoge as string」と宣言したhoge
>動かないのは配列の項目数(例えば、hoge_arra(hoge)のように)使用しているのですが
配列の添字を文字列型にするなど話になりません。問題外です。
数値型にして下さい。

> グローバルで変数として一箇所のみで宣言しているのですが、それで別の変数になることはあるのでしょうか?
hoge が本当は text とかなら有り得ます。この場合、フォームの Text プロパティが変更されます。
別のクラスなどを Imports していて、そちらに同名の変数がある場合も有り得るかも知れません。
ただし、スコープが同じ変数が複数あると↓文法エラーが出るはず。
http://msdn.microsoft.com/ja-jp/library/856b0w3t(v=vs.110).aspx
http://msdn.microsoft.com/ja-jp/library/03x63w1z(v=vs.110).aspx
...続きを読む


人気Q&Aランキング

おすすめ情報