いつもお世話になっています。
「C#によるプログラミングWindows上」の第14章のP.764に書いてあるサンプルプログラムのImageDropにおいてうまく動かないのでわかる方お願いします。
サンプルプログラム自体はいくつも継承しているので全ては載せれないので最後の方に一部を載せておきます。
やっていることは、同じプログラムの2つのインスタンスを起動させクライアント領域に表示している画像をもう一つのインスタンスへドラッグアンドドロップさせて動作確認をしていましたら、以下のようなエラーがでました。
エラーが起きているのはDrawImage(...)メソッドの内部です。コールスタックを見ると内部でRealProxy()というメソッドを呼んでいるみたいですが、エラーもそれに関係しているようです。
わかる方お願いします。足りない情報等ありましたら、指摘していただければ載せますので。
<<環境>>
Vista
VisualStudio2005 SP1
<<エラーメッセージ(抜粋)>>
System.Runtime.Remoting.RemotingException はハンドルされませんでした。
Message="このリモート処理プロキシには、チャネル シンクがありません。待機中のサーバー チャネルが登録されていないか、またはこのアプリケーションに、サーバーと通信する適切なクライアント チャネルがありません。"
Source="mscorlib"
StackTrace:
場所 System.Runtime.Remoting.Proxies.RemotingProxy.InternalInvoke(IMethodCallMessage reqMcmMsg, Boolean useDispatchMessage, Int32 callType)
場所 System.Runtime.Remoting.Proxies.RemotingProxy.Invoke(IMessage reqMsg)
場所 System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
場所 System.Object.FieldGetter(String typeName, String fieldName, Object& val)
場所 System.Drawing.Graphics.DrawImage(Image image, Int32 x, Int32 y)
<<ソース抜粋>>
namespace Chapter14
{
class ImageDrop : ImageClip
{
・
・
・
protected override void OnDragDrop(DragEventArgs drgevent)
{
base.OnDragDrop(drgevent);
if (drgevent.Data.GetDataPresent(DataFormats.FileDrop))
{
string[] astr = (string[])drgevent.Data.GetData(DataFormats.FileDrop);
try
{
image = Image.FromFile(astr[0]);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, this.Text);
return;
}
strFileName = astr[0];
this.Text = strProgName + " - " + Path.GetFileName(strFileName);
this.Invalidate();
}
else
{
if (drgevent.Data.GetDataPresent(typeof(Metafile)))
{
image = (Image)drgevent.Data.GetData(typeof(Metafile));
}
else if (drgevent.Data.GetDataPresent(typeof(Bitmap)))
{
image = (Image)drgevent.Data.GetData(typeof(Bitmap));
}
bIsTarget = true;
strFileName = "DragAndDrop";
this.Text = strProgName + " - " + strFileName;
this.Invalidate();
}
}
protected override void OnMouseDown(MouseEventArgs e)
{
base.OnMouseDown(e);
if (image != null)
{
bIsTarget = false;
DragDropEffects dde = DoDragDrop(image, DragDropEffects.Copy | DragDropEffects.Move);
if (dde == DragDropEffects.Move && !bIsTarget)
{
image = null;
}
}
}
}
((別クラス内で[ImageDropの継承元]))
namespace Chapter09
{
public partial class ImageOpen : Form
{
・
・
・
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Graphics gr = e.Graphics;
if (image != null)
{
gr.DrawImage(image, 0, 0);
}
}
}
No.1ベストアンサー
- 回答日時:
cs2003/2005双方ともにこの現象は起きるようですね
別な方法として DataObjectを使ってファイル名とイメージを送る方法ならうまくいくようですよ
ファイルをドロップされた際に BMPやJPGなどで保存して置きます
その保存されたイメージをつかってDoDragDropを行います
// TempImage.jpgで保存されている仮定
string[] ss = { "TempImage.jpg" };
FileInfo oFInfo = new FileInfo( ss[0] );
ss[0] = oFInfo.FullName;
DataObject dObject = new DataObject( DataFormats.FileDrop, ss );
dObject.SetData( DataFormats.Bitmap, (Bitmap)Image.FromFile( ss[0] );
DragDropEffects dde = DoDragDrop( dObject, DragDropEffects.All );
といった具合です …
この回答への補足
回答ありがとうございます。
そうですか、C#2003でも同じ現象がおきるのですか・・・
そして、代替案まで出していただき誠にありがとうございます。
実際に書き換えてやってみます。そのあと改めてお礼を書きたいと思います。
おかげさまで、動かすことができました。
以下のように書き換えましたら動作しました。
なお、スマートではないやり方が入ってますが、参考にされる方は気を付けてください。
namespace Chapter14
{
class ImageDrop : ImageClip
{
・
・
・
protected override void OnMouseDown(MouseEventArgs e)
{
base.OnMouseDown(e);
if (image != null)
{
bIsTarget = false;
string[] strTempFile = { Directory.GetCurrentDirectory() + "\\TempImage.jpg" };
int num = 0;
while (File.Exists(strTempFile[0]))
{
strTempFile[0] += num.ToString();
}
image.Save(strTempFile[0]);
DataObject data = new DataObject();
data.SetData(DataFormats.FileDrop, strTempFile);
data.SetData(DataFormats.Bitmap, (Bitmap)Image.FromFile(strTempFile[0]));
DragDropEffects dde = DoDragDrop(data, DragDropEffects.Copy | DragDropEffects.Move);
//DragDropEffects dde = DoDragDrop(image, DragDropEffects.Copy | DragDropEffects.Move);
if (dde == DragDropEffects.Move && !bIsTarget)
{
image = null;
this.Invalidate();
}
}
}
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP imageフォルダに、画像をリサイズして保存する時のファイル名を変更したい 1 2023/05/30 11:39
- Visual Basic(VBA) Excel vbaについての質問 3 2023/04/18 16:14
- JavaScript clear機能を失わずにファイルアップロード機能を作成したい 3 2023/06/10 16:12
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- HTML・CSS CSSが効かずどのように指定すれば良いか分からないのでアドバイスお願い致します 2 2023/06/07 12:25
- PHP 掲示板を資料を参考にして開発中ですが、画像がアップされません? 1 2022/11/21 06:44
- PHP PHP MySql 画像を取得 1 2022/06/04 14:05
- PHP 'member_picture/'に/がありますが 、「スラッシュ」は必要でしょうか? 1 2022/11/27 04:32
- PHP PHP MySQLに画像を直接保存 2 2022/06/05 11:50
- JavaScript アップロードファイルの種類によって処理を分岐させたいのですが書き方が分からずアドバイスお願いします 4 2023/06/17 19:12
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
変数名の付け方
-
複数の変数を宣言する時、同時...
-
VB.NET getとsetの概念がわかり...
-
private static という変数の修飾
-
インスタンス参照でアクセスで...
-
生成したインスタンスを削除す...
-
C# インスタンスの破棄
-
フォームの存在をチェックする方法
-
文字列を日付に変換でParseExce...
-
他のファイルの変数参照
-
C#の構造体の開放のしかた
-
VB6.0で、DLLを動的に参照したい
-
c++の課題で クラスのオブジェ...
-
エクセル(複数インスタンス)...
-
C#「オブジェクト参照が必要で...
-
C#において、同じインスタンス...
-
vb.netでFAXを送信する方法
-
Delphiでインスタンスが作成さ...
-
String a = "a"; と String b =...
-
SerialPort処理でInvokeメソッ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
変数名の付け方
-
インスタンス参照でアクセスで...
-
private static という変数の修飾
-
VB.NET getとsetの概念がわかり...
-
C# インスタンスの破棄
-
複数の変数を宣言する時、同時...
-
C#において、同じインスタンス...
-
生成したインスタンスを削除す...
-
SQLを連続発行する時の正しい(?...
-
文字列を日付に変換でParseExce...
-
変数の参照でエラーが出てしま...
-
エクセル(複数インスタンス)...
-
フォームの存在をチェックする方法
-
VB6.0で、DLLを動的に参照したい
-
String a = "a"; と String b =...
-
C#「オブジェクト参照が必要で...
-
newしないインスタンス?実体化...
-
「インスタンス」の意味をわか...
-
SetWindowsHookExで質問
-
フィールドでのnewとコンストラ...
おすすめ情報