- - PR -
異なるアプリ間でのドラッグアンドドロップ
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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メソッドで データを取り出そうとするとしていますが、エラーとなり取り出すことができません。 何か方法がまずいでしょうか? ご教授いただければと思います。 | ||||
|
投稿日時: 2007-06-07 14:05
どんなエラーになるのでしょうか? | ||||
|
投稿日時: 2007-06-07 14:13
エラーというのは、ちょっと書き方が悪かったです。
申し訳ありません。 具体的には、e.Data.GetDataメソッドの処理以降に流れていかないのです。 デバッグをして「e.Data.GetData(typeof(DragDropObject))」を ウォッチウィンドウで処理をしてみると 「関数の評価がタイムアウトしました。」と表示されてきます。 e.Data.GetFormats()をしてみると、 DragDropObjectクラスのGetObjectDataで設定した 「name」が入ってきていないので、 何か根本的に間違っているような気がするのですが、、、。 | ||||
|
投稿日時: 2007-06-07 16:55
DragDropでISerializableを使ったことないのでよくわかりませんが。
ISerializableを実装するときって コンストラクタも作らないといけなかったはず。 問題が解決するかわからないですが、 SerializationInfoとStreamingContextを引数にとる DragDropObjectのコンストラクタを作っておかないと ISerializableは機能しないと思いますよ。 追記: 嘘ついたかも。 ちょっと検証してみます。 [ メッセージ編集済み 編集者: れい 編集日時 2007-06-07 17:05 ] | ||||
|
投稿日時: 2007-06-07 17:06
れいさん、ありがとうございます。
ずばりおっしゃるとおりで、ちゃんと上手く動作しました!! | ||||
|
投稿日時: 2007-06-07 18:15
検証してる間に問題解決したようで。 せっかくなのでまとめときます。 プロセス内で通信するときはDoDragDropに与えたオブジェクトはそのまま渡されるが、 プロセス間では一度COMオブジェクトにシリアル可されるので、 SerializableAttributeでマーク、 ISerializableを実装、 Signaturedコンストラクタの3つが必要。 シリアル可できないとき、e.Data.GetDataはSystem.__ComObjectを返す。
これは__ComObjectをDragDropObjectに変換できないのでInValidCastExceptionが発生している。 DragDropイベントハンドラやPaintイベントハンドラ内でExceptionが出ても トップレベルまでスローされないので、要注意。 こんなとこかな。 |
1