DataObject 作成方法

解決


まさお  2005-08-01 09:14:15  No: 91178  IP: [192.*.*.*]

まさお と申します。  宜しくお願い致します。

  WinXP Pro SP1 VB6 SP6 です。

  OLEDragDropイベントの引数である、DataObjectをプロシージャ
で作成する方法を教えて下さい。

  OLEDragDropイベントは下記のようになります。
  HogeHoge_OLEDragDrop(Data As DataObject, _
                       Effect As Long, _
                       Button As Integer, _
                       Shift As Integer, _
                       x As Single, _
                       y As Single)
  エクスプローラ等から、ファイルをHogeHogeにD&Dして、
ある処理をしています。
  この DataObjectを処理する別プロシージャは完成しており、
  Call HogeProcedure(Data) を実行しています。

Function HogeProcedure(Data As DataObject)
  …
End Function

  HogeHogeへのD&Dだけでなく、コモンダイアログを使用して
ファイルを指定した場合にも、同様の処理をしたいと考えて
います。

Function CommonDialogOpen
  Dim dData As DataObject
  Dim strFileName As String

  With Me.CommonDialog
    .ShowOpen
    strFileName = .FileName
  End With
  dData.SetData strFileName '※ 
  Call HogeProcedure(dData)
End Function
というようなことを行いたいのですが、※で
「オブジェクト変数未設定エラー」が発生します。

  Set dData = New DataObject に類することが必要なのだと
思いますが、この方法が判りません。
  DataObject を作成するにはどのようにしたら良いでしょうか?

以上、宜しくお願い致します。

編集 削除
K.J.K.  2005-08-01 09:35:34  No: 91179  IP: [192.*.*.*]

原則としてできません。処理を見直してください。
# 全くできないとは言わないが手間が見合いません。

編集 削除
まさお  2005-08-01 09:38:09  No: 91180  IP: [192.*.*.*]

K.J.K. さん、ありがとうございます。

  判りました。  ありがとうございます。

  もう暫く開けておいて、他にアドバイスを貰えないようでしたら、閉じます。

編集 削除
魔界の仮面弁士  2005-08-01 09:39:31  No: 91181  IP: [192.*.*.*]

>   DataObject を作成するにはどのようにしたら良いでしょうか?

クラスモジュールを追加して、先頭に
  Implements DataObject
を宣言し、各メソッドを実装しておきましょう。

そうすれば、
    Dim foo As DataObject
    Set foo = New Class1
のようにして生成できます。

編集 削除
まさお  2005-08-01 09:48:20  No: 91182  IP: [192.*.*.*]

魔界の仮面弁士 さん、ありがとうございます。

> Implements DataObject

  かなり以前にクラスモジュールにおける Implements を参考書で読んだ記憶があります。
  確か、蚤と恐竜が出てきたような。  (^^;

  Implements を、少し、勉強してみます。

編集 削除
K.J.K.  2005-08-01 10:32:37  No: 91183  IP: [192.*.*.*]

ファイル名を保存するケースの場合は、Implementsを提示するのは
マズいような。DataObjectFilesの方はImplementsできましたっけ/

編集 削除
まさお  2005-08-01 13:58:07  No: 91184  IP: [192.*.*.*]

K.J.K. さん、ありがとうございます。

  魔界の仮面弁士 さん、のアドバイスにより、Set foo = New Class1 はできました。

  しかし、ファイルのD&Dの場合、DataObjectの
Property Get DataObject_Files() As DataObjectFiles メソッドを使いたい
のですが、クラスモジュール内変数として DataObjectFiles が作れません。

  別クラスモジュールを作成し、そこに Implements DataObjectFiles を宣言し、
各メソッドを実装しようとしましたが、DataObjectFiles は Implements できないようです。
  オブジェクトドロップダウンボックスに [DataObjectFiles]が表示されません。

  これが、
> DataObjectFilesの方はImplementsできましたっけ/
の意味ですネ。

  Function HogeProcedure(Data As DataObject)
を少し改造し、
Function HogeProcedure(FileNames() As String)
のようにし、Dataを直接渡さず、Data.Filesの中身を配列にして引き渡すしか方法がなさそうです。


  K.J.K. さん、魔界の仮面弁士 さん、ありがとうございました。

  もう暫く開けておいて、特にレスが付かないようであれば閉じます。

    #ここは閉じても、その後もレスを付けられますから、構わず閉じても
      良いのでしょうか?

編集 削除
まさお  2005-08-02 08:50:27  No: 91185  IP: [192.*.*.*]

閉じます。

K.J.K. さん、魔界の仮面弁士 さん、ありがとうございました。

編集 削除
K.J.K.  2005-08-02 09:42:00  No: 91186  IP: [192.*.*.*]

> Function HogeProcedure(FileNames() As String)
この引数の型にするのがおそらくは一番問題が少なくなると思われます。
本題とは外れますが、戻り値の型も指定するべきかと。

で、Implements云々をここでは使うべきではない、とは考えますが、
不可能でもない、ということを示すためにサンプルを作りました。
http://www.koalanet.ne.jp/~akiya/vbtaste/vbp/ImpDOF00.lzh

編集 削除
まさお  2005-08-02 11:32:20  No: 91187  IP: [192.*.*.*]

K.J.K. さん、わざわざ、サンプル、どうもありがとうございました。

> 本題とは外れますが、戻り値の型も指定するべきかと。
  ハイ。  実際には戻り値の型は指定してありますが、ここでは不要と考えて削除して記しました。

> 不可能でもない、ということを示すためにサンプルを作りました。
  ありがとうございます。研究させて戴きます。

  IDataObjectFiles なら、Implements できるのですネ。
  だけど、DataObjectFiles ではなく、IDataObjectFiles にする、というのは何故ご存知なのでしょう。

  そのような知識って、どうすれば身に付けられるのでしょうか。
  色々な参考書に当たれば、吸収できるのでしょうか。
      #これは質問ではないので回答不要です。

色々とありがとうございました。

編集 削除
魔界の仮面弁士  2005-08-02 22:02:18  No: 91188  IP: [192.*.*.*]

> IDataObjectFiles なら、Implements できるのですネ。

VB6のImplements命令は、各インターフェイスが
  Private Sub 型名_メソッド名()
の形式で実装される事になりますよね。

この仕様のため、VB6ではアンダーバーで始まるメソッド名を持つ
インターフェイスを実装できないという制限があります。
(DataObjectFilesは、「_NewEnum」というメソッドを持っています)

そこで K.J.K.さんは、これを NewEnum という別名で定義した
タイプライブラリを独自に作成して、それを参照設定しているのかと。


OLEVIEW.EXE をお持ちであれば、
    oleview C:\WINDOWS\system32\msvbvm60.dll\3
の実行結果と、
    oleview 〜\KTLDoImp.tlb (サンプル内にあったタイプライブラリ)
の結果を比較してみると良いかも。

編集 削除
魔界の仮面弁士  2005-08-03 03:33:23  No: 91189  IP: [192.*.*.*]

少し訂正。


> この仕様のため、VB6ではアンダーバーで始まるメソッド名を持つ
> インターフェイスを実装できないという制限があります。

先頭に限らず、「アンダーバー(_)が含まれる名前」自体が駄目ですね。

編集 削除
まさお  2005-08-03 09:09:32  No: 91190  IP: [192.*.*.*]

魔界の仮面弁士 さん、ありがとうございます。

  魔界の仮面弁士 さん、の投稿を読んで理解できたのですが、K.J.K. さんのサンプルで、Implements IDataObjectFiles が可能なのは、KTLDoImp.tlb が同梱されているからなのですネ。

  チョット、私のレベルをはるかに超える内容になってきました。
  私にはついて行けませんが、色々なアドバイス、ありがとうございました。


追伸:
  以前、ある質問をすることによって、それまで全く使っていなかったクラスモジュールを使うようになり、今では、クラスモジュールをバンバン使っています。
  おかげで、VB6の世界を広げることができました。
  今回の質問も私の世界を広げるきっかけになるかもしれません。
  先輩諸兄、本当にありがとうございました。

編集 削除