構造体配列をクラスに渡す


とおる  2011-04-29 20:41:44  No: 102877

こんにちは。

メニュー画面起動時に、商品マスタを構造体配列に読み込んでいます。

商品マスタの画面はDLLで作ってみようかとしてるんですが、どう作ればよいか分からないです。

なんとなく、property letとproperty getを使うと分かってはいるんですが。

やりたいのは、メニュー画面で読み込んだ商品データ(構造体配列)を商品マスタ(クラス)に渡して、商品マスタ(クラス)からメニュー画面に戻すということです。

どなたか教えてください。

お願いします。


魔界の仮面弁士  2011-05-07 04:30:58  No: 102878

> どう作ればよいか分からないです。
どの点が分からないのかが伝わってこないので回答を控えていたのですが、
レスが付かないようなので:

まず、「クラスモジュール」へのコーディングは、文法的にみれば
標準モジュールやフォームモジュールへのコーディングと大差ありません。
(機能的に見れば、"画面表示されないフォーム" というイメージが近いかも)

もちろん、各モジュールごとに幾つかの違いはありますけれどね。たとえば——

(1) クラスは通常、「New」でインスタンスを作成して使われる。
(2) クラスやフォームには、Event プロシージャで「イベント」を定義できるが、
  標準モジュールにはイベントを定義できない。
(3) AddressOf 演算子に渡すことができるのは、標準モジュールのメンバーのみ。
(4) Friend メンバーは標準モジュールには書けない。
(5) 標準モジュールでは Implements ステートメントを使えない。

——などなど。

2 番以降は使わない場合も多いので、さほど重要ではありませんが、
最大の違いといえるのは 1 ですね。

開発側にとってみれば、Sub / Function / Property の記述方法が
変わるわけではありませんが、この『インスタンス』を意識する必要が
あるという点が、クラスモジュールの最大の特徴と言えるでしょう。

> なんとなく、property letとproperty getを使うと分かってはいるんですが。
Property プロシージャとは「プロパティ」を自作するためのものですが、
これはクラスモジュール専用のステートメントというわけではありません。
標準モジュールやフォームモジュール上にもプロパティは作成できます。

> property letとproperty get
プロパティを実装する場合、Property Let/Set/Get の 3 種を
組み合わせて/使い分けて実装します。

一般的な組み合わせとしては、
  数値や文字列等  →  Let/Get  (TextBox.Text プロパティ等)
  オブジェクト型  →  Set/Get  (DataGrid.DataSource プロパティ等)
  読取専用メンバ  →  Getのみ  (Form.ActiveControl プロパティ等)
で実装しますが、中には「Form の Picture プロパティ」や
「ADODB.Recordset の ActiveConnection プロパティ」のように、
Let/Set/Get がすべて実装されるケースもあります。

> メニュー画面起動時に、商品マスタを構造体配列に読み込んでいます。
データ量が少ない場合(数件程度)には、その方が使いやすいのかも知れませんが、
データ量が多い場合(数千件以上)にユーザー定義型の配列で管理してしまうと
パフォーマンスに難が出ますので、クラス+コレクションで管理した方が
良いかも知れません。

クラスおよびコレクションの作成手順については、MSDN ライブラリの
下記の項を参照してみてください。

[Visual Basic ドキュメント]
└[Visual Basic の使用方法]
  └[プログラミング ガイド]
    └[Visual Basic を使ってできること]
      └[オブジェクト]
        ├[独自のクラスの作成]
        ├[クラスのプロパティおよびメソッドの追加]
        └[コレクションの作成方法]

> 商品マスタの画面はDLLで作ってみようかとしてるんですが、
最終的には、どのような DLL を想定しているのでしょうか?
利用側にとって、どのようなメンバーが用意されていれば使いやすいかを、
まずは想像してみてください。

たとえば ADODB.Connection オブジェクトなら、
  「CommandTimeout プロパティ」
  「Execute メソッド」
  「ExecuteComplete イベント」
などがありますし、VB.TextBox オブジェクトなら
  「Text プロパティ」
  「LinkSend メソッド」
  「Change イベント」
などがありますよね。
ADO なら、Recordset → Fields → Field といった、コレクション階層もあります。

ActiveX コンポーネントの場合、インターフェイスをプロジェクトの外部に対して
公開する事になるため、常にバージョン間の互換性を意識する必要があります。

そのため、一度 DLL としてリリースした後は、メソッド名や引数・戻り値を
変更する事が難しくなってしまいますので、事前のクラス設計が
とても重要になってきます。

# どうしても互換性の無い仕様に変更しなければならない場合は、
# 旧バージョンの情報をレジストリから抹消しておかないと、
# レジストリ上にゴミデータが残ってしまう事になります。

事後変更を極力避けるべきであるという事はすなわち、コーディングに取り掛かる前に

・利用側にとって、どのようなメソッド/プロパティ/イベントが必要かを考える。
・それをどのようなクラスモジュール/標準モジュール単位に切り出すかを考える。

という設計作業を行う必要性が、今までよりも高くなってくるということです。

逆に言えば、こうしたメンバー設計さえきちんと行われてさえいれば、
たとえ Property や Event の作り方が分からなかったとしても、VB6 標準アドインの
『クラス ビルダ ユーティリティ』を使って雛形を作成する事ができるはずです。

まぁ、Sub/Function/Event/Property の基本文法を把握しているのであれば、
アドイン無しで直接コーディングした方が早いのですが、いずれにせよ、
雛形さえできてしまえば、あとはその Function や Property の中身を
実装していけば良い事になります。

チュートリアルおよびサンプルとして、MSDN ライブラリの下記の項を参照してみてください。
自分のアプリに組み込んでいくのは、これらを一通り理解してからの方が良いでしょう。

[Visual Basic ドキュメント]
└[Visual Basic の使用方法]
  └[コンポーネント ツール ガイド]
    └[ActiveX コンポーネントの作成方法]
      ├[ActiveX DLL の作成]
      │└[ActiveX DLL 作成のまとめ]
      └[ActiveX EXE コンポーネントの作成手順]
        └[ActiveX EXE コンポーネントの作成についてのまとめ]


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加