tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルform_load
記事No5934
投稿日: 2007/07/29(Sun) 13:18
投稿者たーくん
過去レスを探したのですが
探し方が下手なのか見つかりませんでした

初歩的質問ですがよろしくお願いします


form_load1 と
form_load2 があります。
form_load2にはpicturebox1が配置してあります。
picturebox1に画像を描画する関数があります。


form1からform2を呼び出しすぐに画像を表示したいので
form2_loadに
picturebox1に画像を描画する関数の呼び出しを
書いたのですが描画しません。

ちなみにbutton_click1に関数呼び出しを書き
ボタンをクリックすると問題なく画像を描画します。

よろしくお願いします。


m(--)m

[ツリー表示へ]
タイトルRe: form_load
記事No5935
投稿日: 2007/07/29(Sun) 16:15
投稿者魔界の仮面弁士
> form_load1 と
> form_load2 があります。
あれ、Form1_Load, Form2_Load ではなく?
Handles 句は指定されているのでしょうか。


> picturebox1に画像を描画する関数の呼び出しを
> 書いたのですが描画しません。
どのようなコードを書いたのでしょうか?
Bitmap に描画して、それを背景として与えるなどすれば消えないかと思いますが、
コントロールに対して CreateGraphics した場合は、コントロールが
表示されていないと意味が無いでしょうね。

[ツリー表示へ]
タイトルRe^2: form_load
記事No5936
投稿日: 2007/07/29(Sun) 17:15
投稿者たーくん
魔界の仮面弁士さま
ありがとうございます


> あれ、Form1_Load, Form2_Load ではなく?
> Handles 句は指定されているのでしょうか。
>
ミスです(笑)失礼しました
handlesは特にいじっていません


>
> > picturebox1に画像を描画する関数の呼び出しを
> > 書いたのですが描画しません。
> どのようなコードを書いたのでしょうか?
> Bitmap に描画して、それを背景として与えるなどすれば消えないかと思いますが、

遅くなりました2005EEを使っています
bitmapの知識がないので調べてみます。


> コントロールに対して CreateGraphics した場合は、コントロールが
> 表示されていないと意味が無いでしょうね。

この方法だとおもいます。
Dim g As Graphics = PictureBox1.CreateGraphicsを宣言し
rec3 = New Rectangle(ix, 0, 1, maxy) : g.DrawRectangle(Pens.Blue, rec3)
などで
picturebox1にラインやボックスを描いています。
picturebox1はform2上に配置されており(enabled=true)
form2はform1から呼び出されて画面一番上に表示されています。

前にも描きましたが「button1_click」から描画関数の呼び出しは出来るのですが
form2_loadからだと呼び出した形跡はあるのですが描画がされません。
もう少し原因を探ってみます。
ありがとうございました。

[ツリー表示へ]
タイトルRe^3: form_load
記事No5938
投稿日: 2007/07/30(Mon) 01:37
投稿者魔界の仮面弁士
そのようにして描画された内容は、他のウィンドウが重なったり、
ウィンドウが最小化されたりすれば、容易に消えてしまうものです。

Load 処理中は通常、フォームすら表示されていないので、PictureBox も
表示されておらず、結果として、描画された結果も消えてしまっていたのです。
一方、Button1_Click 時は表示されていたので、結果も見る事ができたのでしょう。

消さずに残したいのなら、PictureBox から Graphics を得て、そこに直接描画するのでは
なく、Dim bmp As New Bitmap(〜) から得た Graphics に描画して、その Bitmap を
PictureBox に割り当てるようにすれば、そのまま消えずに残すことができますよ。


> Dim g As Graphics = PictureBox1.CreateGraphicsを宣言し
これも少々マズイです。

CreateGraphics を使うにしても、Graphics.FromImage を使うにしても、
 Using g As Graphics = 〜〜〜
  'ここに描画処理を記述
 End Using
のように Using ステートメントを用いて、描画処理後には、作成した Graphics クラスが
即時解放されるようにしておく必要があります。
(もし、Using を使わないのであれば、かわりに Dispose メソッドの呼び出しが必要です)

[ツリー表示へ]
タイトルRe^4: form_load
記事No5942
投稿日: 2007/07/30(Mon) 16:55
投稿者たーくん
魔界の仮面弁士さま
わかりやすく丁寧なお答え
何度も感謝です。

@なるほどロードフォームで表示されなかった理由わかりました。

A直接picturebox に描画せず bitmapをあてがう方法やってみます。


恥かきついでにもう一つ質問させていただきたいのですが
using ステートメントを使うとdisposeメソッドを省略できるとのことですが
ちなみにusing を使わず disposeもしないとどんな不都合があるのでしょうか。。
宜しくお願いします

m(--)m

[ツリー表示へ]
タイトルRe^4: form_load
記事No5969
投稿日: 2007/07/31(Tue) 14:42
投稿者魔界の仮面弁士
> using ステートメントを使うとdisposeメソッドを省略できるとのことですが
そうです。(Dispose とは、「処分する」という意味です)
より正確にいえば、「IDisposable インターフェイスの Dispose メソッド」が
自動的に呼び出されるようになるということです。

Using ステートメントを使うと、処理中にエラーが発生したとしても、
必ず Dispose が呼び出される仕掛けになっているため、単に Dispose を呼ぶよりも、
エラーに強い安全なコードとなります。


> ちなみにusing を使わず disposeもしないとどんな不都合があるのでしょうか。。
"不都合"の内容はクラスによって異なりますが、たとえば「メモリ不足エラーが発生」
「処理速度が低下する」「オブジェクトの作成処理が失敗する」などが発生します。


たとえば、『電話回線』や『データベース接続』を開く場合を想像してみてください。

通信要求があれば、接続を開く必要があります。
しかし接続を開いたあと、もし通信終了後も、回線を切断せずに放置しておいたとしたら、
接続数ばかりが増えてしまい、いずれ回線がパンクしてしまうでしょう。


OS の資源の場合にも、同じことがいえます。
IDisposable を実装したクラスでは、原則として、作成したオブジェクトを、
作成者自身が破棄しなければならないのです。

# IDisposable なクラスの具体例としては、たとえば Graphics, Font, Pen, Brush などの
# 描画系クラス、MemoryStream, FileStream などのメモリ/ファイル操作用の
# ストリーム系クラス、OleDbConnection, SqlConnection などのDB接続系クラスなどです。


ただし、他の人が作ったオブジェクトや、他の場所でも使われるオブジェクトは、
勝手に破棄してはいけません。それらをうっかり破棄してしまうと、他の場所で
破棄済みのオブジェクトが使われる時に、エラーとなってしまうでしょう。

たとえば、.CreateGraphics() などで『作成』した Graphics は、自身で Dipose
しなければいけませんが、Paint イベントの引数などから『取得』した Graphics などは、
.NET 側によって処理されますので、勝手に Dispose してはいけません。

[ツリー表示へ]
タイトルRe^5: form_load
記事No5970
投稿日: 2007/07/31(Tue) 15:45
投稿者たーくん
なるほど 「自分で開いた分」に関しては終わったら
必ずdisposeして終わらす必要がありますね。   

特にエラーなどでも自動に処理してくれる
using 文のほうが確実なのでこちらをなるべく使った方が良さそうですね


魔界の仮面弁士さま
本当にありがとうございました。

m(--)m

[ツリー表示へ]