- PR -

異なるアプリ間でのドラッグアンドドロップ

1
投稿者投稿内容
ガルマ・ザビ
ベテラン
会議室デビュー日: 2007/06/07
投稿数: 55
お住まい・勤務地: ジオン公国
投稿日時: 2007-06-07 13:24
こんにちは、はじめまして。

表記の件、どうも上手くいかないのです。
MSDNには次のような記載があります。

>ドラッグ操作が別のプロセスのアプリケーションと相互運用する必要がある場合、
>データは、基本マネージ クラス (String、Bitmap、または Metafile)、あるいは
>ISerializable または IDataObject を実装するオブジェクトのいずれかである必要があります。

そのためドラッグドロップをさせる次のようなオブジェクト作成しました。

[Serializable()]
public class DragDropObject : ISerializable
{
private string name = "ガルマ・ザビ";

public string Name
{
get{ return this.name; }
}

public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("name", this.name);
}
}

ドラッグ処理は次のように書いています。

XXXX.DoDragDrop(new DragDropObject(), DragDropEffects.Copy);


ドロップ受け入れ側のDragDrop処理を次のように書いています。

private void DragDrop(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(typeof(DragDropObject)))
{
DragDropObject obj = ((DragDropObject)e.Data.GetData(typeof(DragDropObject)));

this.label1.Text = obj.Name;
}
}

DragDrop処理の中で、e.Data.GetDataメソッドで
データを取り出そうとするとしていますが、エラーとなり取り出すことができません。


何か方法がまずいでしょうか?
ご教授いただければと思います。




渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2007-06-07 14:05
引用:

DragDrop処理の中で、e.Data.GetDataメソッドで
データを取り出そうとするとしていますが、エラーとなり取り出すことができません。



どんなエラーになるのでしょうか?
ガルマ・ザビ
ベテラン
会議室デビュー日: 2007/06/07
投稿数: 55
お住まい・勤務地: ジオン公国
投稿日時: 2007-06-07 14:13
エラーというのは、ちょっと書き方が悪かったです。
申し訳ありません。
具体的には、e.Data.GetDataメソッドの処理以降に流れていかないのです。

デバッグをして「e.Data.GetData(typeof(DragDropObject))」を
ウォッチウィンドウで処理をしてみると
「関数の評価がタイムアウトしました。」と表示されてきます。

e.Data.GetFormats()をしてみると、
DragDropObjectクラスのGetObjectDataで設定した
「name」が入ってきていないので、
何か根本的に間違っているような気がするのですが、、、。
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-06-07 16:55
DragDropでISerializableを使ったことないのでよくわかりませんが。

ISerializableを実装するときって
コンストラクタも作らないといけなかったはず。

問題が解決するかわからないですが、
SerializationInfoとStreamingContextを引数にとる
DragDropObjectのコンストラクタを作っておかないと
ISerializableは機能しないと思いますよ。

追記:
嘘ついたかも。
ちょっと検証してみます。

[ メッセージ編集済み 編集者: れい 編集日時 2007-06-07 17:05 ]
ガルマ・ザビ
ベテラン
会議室デビュー日: 2007/06/07
投稿数: 55
お住まい・勤務地: ジオン公国
投稿日時: 2007-06-07 17:06
れいさん、ありがとうございます。

ずばりおっしゃるとおりで、ちゃんと上手く動作しました!!
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-06-07 18:15

検証してる間に問題解決したようで。

せっかくなのでまとめときます。

プロセス内で通信するときはDoDragDropに与えたオブジェクトはそのまま渡されるが、
プロセス間では一度COMオブジェクトにシリアル可されるので、
SerializableAttributeでマーク、
ISerializableを実装、
Signaturedコンストラクタの3つが必要。

シリアル可できないとき、e.Data.GetDataはSystem.__ComObjectを返す。

引用:

具体的には、e.Data.GetDataメソッドの処理以降に流れていかないのです。


これは__ComObjectをDragDropObjectに変換できないのでInValidCastExceptionが発生している。

DragDropイベントハンドラやPaintイベントハンドラ内でExceptionが出ても
トップレベルまでスローされないので、要注意。

こんなとこかな。
1

スキルアップ/キャリアアップ(JOB@IT)