人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

VB6をVB.NET向けに変換
VB6のシステムをVB.NETへ変換を行いました。
変換は無事に完了したんですが、画像を取り込む処理の細かな修正作業で苦戦しています。

下記処理を行うと、途中で左に示すエラーが出てしまいます。
・Kill("c:\Picfolder\test.bmp") → 別のプロセスが使用されているため、
"c:\Picfolder\test.bmp"にアクセスできません。
・Picture.Image.Save("c:\Picfolder\test.bmp") → 「GDI+で汎用エラーが発生しました。」

また.NETに対応してない箇所の修正を行っています。
色々なサイトを参考に修正を行っていますが、下記の記述で正しいでしょうか。
Dim g As Graphics = Picture.CreateGraphics
・Adjustment(Picture.hdc, X, Y) → Adjustment(g.GetHdc, X, Y)
・Picture.cls → g.Clear
・Picture.PaintPicture(Picture1.Image,X1,Y1,H1,W1,W1,X2,Y2,H2,W2)
→ g.DrawImage(Picture1.Image,X1,Y1,H1,W1,X2,Y2,H2,W2) //このままだとエラーが出る

※以下の内容は、どう修正したらいいか分からない
・Picture.AutoRedraw = True
・Picture.ScaleHeight
・Picture.ScalWidth

VB6→.NETの変換作業に詳しい方がいれば、ご助言をお願いいたします。

●質問者: Nivusys741
●カテゴリ:コンピュータ
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

質問者から

freemannさんへ
はい、PictureBoxです。


1 ● freemann
●500ポイント

Killがうまくいかないのは、PictureBoxが画像を参照していたためだと思います。
回避方法はサンプルを見てください。

Picture.Image.Saveでエラーが出るのは、同じファイルに上書きで保存できないため。
次を参照してください。 Image.Save メソッド (String) (System.Drawing)
ExternalExceptionのところを見てください。

Public Class Form1
  '削除のために画像の変数を作っておく
 Private img As Image

 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  '一旦変数に入れてから、PictureBoxに設定する
 img = Image.FromFile("e:\sample.jpg")
 Me.PictureBox1.Image = img
 End Sub

 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
 img.Save("e:\sample2.jpg")
 End Sub

 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
  'PictureBoxが参照しているために削除できないでいたので参照しないようにする
 Me.PictureBox1.Image = Nothing
 Me.PictureBox1.Refresh()
  '変数にしたのはこれをしたいがため。
  '明示的にDisposeすることによって、参照していたのを強制的に解除する
 img.Dispose()
 Kill("e:\sample.jpg")
 End Sub
End Class

Picture.CreateGraphicsで得られるハンドルは、PictureBox自身のもののためあまりよくないかと思います。
Bitmapのインスタンスなどを作成し、それに書き込むようにするほうがよいかと思います。

DrawImage()は次を参考にしてください。 Graphics.DrawImage メソッド (System.Drawing)

AutoRedrawはちょっとわかりませんでした。

ScaleHeightとScaleWidthについては、次のサイトの拡大縮小のあたりが参考になるのかなと思います。g.ScaleTransform()
緑のバイク ★ 初めてのC# 画像/描画


2 ● taroe
●500ポイント

>Picture.Image.Save("c:\Picfolder\test.bmp")

同じファイル名での上書き?使い回し?は避けて
ユニークなファイル名で作業ファイルを作成して

>Kill("c:\Picfolder\test.bmp")

アプリケーションの開始と終了時に作業ファイルを削除するのが良いかと思います。
アプリケーション終了時に削除できないかどうかは試してみないとわかりかねますが
できない場合は、一部作業ファイルが残るのはあきらめるとかはどうでしょうか?

こういう構造にすれば、修正範囲は少なくて済みますし
動作確認のテストも簡単に済むので品質が保証できます。

関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ