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

DragDropされたファイル名を取得したい

環境/言語:[Win2000 VB.net .Net Framworks 1.1]
分類:[.NET]

http://dobon.net/vb/dotnet/control/droppedfile.html
上記リンクのコードでファイル名を取得できるんですが、
Option Strict On にすると、
「暗黙的な変換はできません」や「遅延バインディングを使用できません」
となり、ビルドエラーが発生してしまいます。
どなたか対処法を教えてください。
>暗黙的な変換はできません
キャストしても駄目ですか?

>遅延バインディングを使用できません
このエラーはなった事がないので、後で試して見ます。
Option Strict Onと、言うコードはhttp://dobon.net/vb/dotnet/control/droppedfile.html
にはないのですが、具体的な箇所を教えてもらえば、解決できるかもしれません(初心者なんで、かもです)。
きいぼーです。

YUSKさんへ
> Option Strict Onと、言うコードは
クラスのファイルの先頭に記述します。
記述無しの場合は
Option Strict Off
と同じです。

ヒトサン さんへ
エラーの場合は、どの部分でエラーとなっているのか記述すると
的確な回答をもらえると思います。
※ 教えてくれる人に無駄な時間を取らせることになります。
Dim fileName() As String = _
e.Data.GetData(DataFormats.FileDrop, False)
今回は、多分この部分だと思います。この部分ですと。
e.Data.GetDataは、Object型を返します。
それを Stringの1次元配列に入れているのでエラーとなります。

Option Strict On にしていると
暗黙のキャストは実行されないので、
エラーとなります。
Option Strict Off
にしていると、キャストがなされるので、エラーにならずに実行されます。
もう解決してるかもしれませんが、参考までに。
http://support.microsoft.com/default.aspx?scid=kb;ja;311329
YUSKさん、きいぼーさん ありがとうございます。

YUSKさんへ>
せっかくすぐに返信していただいたのに、返事が遅れてすみません。
MSDNの説明を理解する能力がなくて一人で悩んでいました。

きいぼーさんへ>
すべておっしゃる通りです。

Option Strict Off にすればDragDropでファイル名を取得する目的は果たせるんですが、
コードのメインの部分でループを多用しているので、少しでも実行速度を上げたくて
Option Strict On にしました。

エラーの箇所は画像を添付しておきます。
(この記事にはファイル"1099486900.jpg"が添付されていましたが、削除されました。)
キャストしてみましたか?
暗黙的に変換できない場合は、色々と方法があるようですが、キャストするのが一番早いと思います。
キャスト=明示的に変換する事です。

#キャストの仕方が分からない・・・?
Object型をString型にキャストする方法があるんですか?
初歩すぎてスミマセン...。
この場合の
e.Data.GetData(DataFormats.FileDrop, False)
はたぶんObject型の配列になると思います。
その配列の最初の要素のファイル名文字列を
String型変数に代入したいのです...。
オブジェクト型は、string型にキャストできないんですか?
smlFileName = (string)e.Data.GetData(DataFormats.FileDrop, False)
じゃ駄目ですか?
よく分からないんですが・・・。
これだと変換できないのかな?
#間違ってたらすいません。
どうも駄目みたいです...。

Private Sub Form1_DragDrop(ByVal sender As Object, _
ByVal e As System.Windows.Forms.DragEventArgs) Handles MyBase.DragDrop
Dim xmlFileName as String
xmlFileName = CStr(e.Data.GetData(DataFormats.FileDrop, False))

とすると、ビルドエラーはなくなるんですが、実行すると
xmlFileName = CStr(e.Data.GetData(DataFormats.FileDrop, False))
のところで無限ループにはまったようになり、次のコードに進みません。

もうあきらめてOption Strict Offにした方がいいんでしょうか?
YUSKさん、いろいろとありがとうございました。
■No7133に返信(ヒトサンさんの記事)
> http://dobon.net/vb/dotnet/control/droppedfile.html
> 上記リンクのコードでファイル名を取得できるんですが、
> Option Strict On にすると、
> 「暗黙的な変換はできません」や「遅延バインディングを使用できません」
> となり、ビルドエラーが発生してしまいます。

Dim fileName() As String = CType(e.Data.GetData(DataFormats.FileDrop, False), String())

としてください。
■No7144に返信(ヒトサンさんの記事)
> どうも駄目みたいです...。
>
> Private Sub Form1_DragDrop(ByVal sender As Object, _
> ByVal e As System.Windows.Forms.DragEventArgs) Handles MyBase.DragDrop
> Dim xmlFileName as String
> xmlFileName = CStr(e.Data.GetData(DataFormats.FileDrop, False))
>
> とすると、ビルドエラーはなくなるんですが、実行すると
> xmlFileName = CStr(e.Data.GetData(DataFormats.FileDrop, False))
> のところで無限ループにはまったようになり、次のコードに進みません。
>
> もうあきらめてOption Strict Offにした方がいいんでしょうか?
> YUSKさん、いろいろとありがとうございました。
VB.Net使ったことないから良く分からんが。
型キャストはCType関数なのかもしらん…
CStr関数の戻り値は、CStr関数の引数によって違うみたいだぞ。
  ・Boolean→"True" / "False"の文字列
  ・日付型→日付を表す文字列
  ・数値→数値を表す文字列
で、きっと"e.Data.GetData(DataFormats.FileDrop, False)"は上の三つのうちどれかに
暗黙的にキャストされていると思われる。

…ぉ
IDataObject.GetData メソッドで、いいのがあるじゃん。
Overloads Function GetData(String) As Object
とか、
Overloads Function GetData(Type) As Object
が使える見たいだぞ?(VB)
管理人さんへ>
> Dim fileName() As String = CType(e.Data.GetData(DataFormats.FileDrop, False), String())
のコードで正常にキャストできました!
CType関数は何度も使っていますが、ObjectType に String型の配列を指定しなければならないというのは完全に盲点でした。
(実は、ObjectTypeに配列ではないString型を指定して、あれれっ? と思ってました。恥ずかし〜!!)

ガッ……ぅさんへ>
実は CType(expression, String)
と CStr(expression) の違いがよく分からずに使っています。

結果は同じだと思うんですが...。
戻り値に配列が指定できる分だけ Ctype の方が高機能な気がする...。
実行速度に差があるかも...?


みなさんのおかげで無事解決しました。
ありがとうございました。
解決済み!
■No7148に返信(ヒトサンさんの記事)
> ガッ……ぅさんへ>
> 実は CType(expression, String)
> と CStr(expression) の違いがよく分からずに使っています。
>
> 結果は同じだと思うんですが...。
> 戻り値に配列が指定できる分だけ Ctype の方が高機能な気がする...。
> 実行速度に差があるかも...?

しかし、通常は ToString() を使うべきかと思うのですが...。
解決済み!

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