ピクチャーBoxを10万個使えますか?

タグの編集
投稿者 にぃや♪  () 投稿日時 2008/11/24 20:19:08
サンプルエディターは完成しました。
実証用のピクチャーBoxは将来的に1万個以上になると思いますが、大丈夫でしょうか?
また
解説用のテキストファイルも同じ数を使います。
10万個以上のテキストファイルを追加できますか?
よろしくお願いします。
投稿者   (社会人) 投稿日時 2008/11/24 20:47:10
サンプルエディターというのが、どういったものか分かりませんが
PictureBox数万個というのは流石にムリがある気がします。

実装方法から見直すことをお勧めします。
投稿者 にぃや♪  () 投稿日時 2008/11/24 20:52:52
フォームを沢山、使うことにしました。
フォームは50個くらいは追加できますか?
なにぶん入門者なので。
投稿者   (社会人) 投稿日時 2008/11/24 21:17:05
Formを50個どのように使うか知りませんが、できるできないで言えば、できます。
それが実用に足るかどうかは別問題ですが。

まず、どういったソフトウェアを作りたいのか教えてください。
それが分からなければForm50個もPicturBox数万個も妥当かどうかなんて分かりません。
なにぶん他人なので。
投稿者 にぃや♪  () 投稿日時 2008/11/24 22:02:50
個人(自分向け)の勉強用のヘルプです。
よく考えたら、ピクチャーを使わないものもあるので。
vbのサンプルだと、ほしい情報を探すのに時間がかかりますし、
使い方を忘れた時などに、すぐ参照できるようにしたいんです。
実行結果も参照したいし。
つくりながら勉強ができるので面白いです。
テキストファイルは数万個は必要です。
リストボックスも沢山使います。コレも何個位が限界でしょうか?
フォームの小分けは、つくりやすさと、バグ発生の検査がしやすそうだからです。
投稿者 葉月  (社会人) 投稿日時 2008/11/24 22:11:42
恐らく試験的に使用するということですよね?
それだったら10万個いきなり生成するのではなく、CPUやメモリーの状態を取得してある一定の状態(閾値)を超えなければ作成するという手段にした方がいいです。
趣味でも安全性を考慮せず、むちゃはしない方がいいと思います。

サンプルを掲載したいんですが、急ぎで投稿したかったんでリンクのみです。
関係ないのも混ざってるかも知れません。
http://msdn.microsoft.com/ja-jp/library/cc720837.aspx
http://msdn.microsoft.com/ja-jp/library/system.diagnostics.performancecounter%28VS.80%29.aspx
投稿者 にぃや♪  () 投稿日時 2008/11/24 22:47:48
サンプルは、少しずつ増やしていきますので。
現状は、まだ10個です。将来的に数が少しずつ増えていきます。
DataGridViewでやろうか迷いましたが、今の実力では自信がないので、
リストBox多用を選択しました。
完成したらDVD_Rに保存します。
助言ありがとございました。
投稿者 葉月  (社会人) 投稿日時 2008/11/24 23:16:55
>>>現状は、まだ10個です。将来的に数が少しずつ増えていきます。
 それを聞いて安心しました。
 ただ、10個ずつ増やすにしても、何回も同じ作業を繰り返すことになります。
 面倒なので動的に行えるようにした方が楽です。
 それから、単純作業にかかる他の時間を、別の勉強にも割り当てられます。 

 あくまで私見です。やり方の一つとして頭の片隅に留めて貰えれば幸いです。

>vbのサンプルだと、ほしい情報を探すのに時間がかかりますし、
>使い方を忘れた時などに、すぐ参照できるようにしたいんです。
 一通りの基礎を覚えてしまい、MSDNを読めるようになり調べる癖をつけた方が早道かも知れません。
 パターン化されているため、読めるようになると重宝します。
投稿者 (削除されました)  () 投稿日時 2008/11/25 00:02:03
(削除されました)
投稿者 あにす  (社会人) 投稿日時 2008/11/25 00:02:54
>にぃや♪さん
VBのコードのサンプルと実行結果を集めて確認できるソフトを作りたいと言うことでしょうか?
その前提でレスします。
.NETにはソースコードを文字列で渡してコンパイル、実行する機能があります。
ソースコードを外部ファイルに保存しておいて、それを実行時に読み込んでコンパイル、実行するなんてのはどうでしょうか?
以前、C#にてBrainF*ck→C#のトランスレータとC#のコードのコンパイルを組み合わせたBrainF*ckコンパイラを作成したことがあります。
VB.NETでも同様のことが出来るはずです。
投稿者 にぃや♪  () 投稿日時 2008/11/25 00:34:31
>何回も同じ処理
ですが、1つ1つのサンプルを検証しなければなりません。
一応、勉強ですのでコードも確認や理解もしなくてはいけませんので。
VBサンプルは2回連続で使用するとエラーするものも沢山あります。
そうすると、検証して不具合のあるコードに自分のTryステートメントを
加えなければなりません。
なぜエラーになるのか、別のメッセージBoxで解説や注意点も表示します。
例えば、GDI凡用エラーとか表示させます。
ですから、意外と作業は大変ですね。
投稿者 あにす  (社会人) 投稿日時 2008/11/25 00:54:25
>にぃや♪さん
それってVisualStudioの機能そのまんまじゃ…。難しいですよぉ…。

先の案についてサンプルを書いて見ました。
実行ファイルと同じフォルダ内にあるVBのソースファイルをListBoxに列挙。
項目をダブルクリックするとその場でコンパイルして実行します。

Public Class Form1

    Dim deleteFileList As New List(Of String'コンパイルしたファイルのリスト 

    Private Sub Form1_Load(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles MyBase.Load
        '実行ファイルと同じフォルダのvbのソースファイルを取得してListBoxに追加 
        For Each file As String In IO.Directory.GetFiles(".""*.vb", System.IO.SearchOption.TopDirectoryOnly)
            Me.ListBox1.Items.Add(file)
        Next
    End Sub

    Private Sub ListBox1_DoubleClick(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles ListBox1.DoubleClick
        'ソースファイル読み込み 
        Dim sourceFile As String = Me.ListBox1.SelectedItem
        Dim sourceCode As String
        Using sr As New System.IO.StreamReader(sourceFile)
            sourceCode = sr.ReadToEnd()
            sr.Close()
        End Using

        'コンパイル 
        Dim param As New System.CodeDom.Compiler.CompilerParameters()
        param.GenerateExecutable = True
        Dim rs As System.CodeDom.Compiler.CompilerResults
        rs = New Microsoft.VisualBasic.VBCodeProvider().CompileAssemblyFromSource(param, New String() {sourceCode})

        '実行 
        System.Diagnostics.Process.Start(rs.PathToAssembly)

        '後始末用 
        deleteFileList.Add(rs.PathToAssembly)
    End Sub

    Private Sub Form1_FormClosing(ByVal sender As ObjectByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        'コンパイルして出来た一時ファイルを削除 
        For Each file As String In deleteFileList
            System.IO.File.Delete(file)
        Next
    End Sub

End Class
投稿者 にぃや♪  () 投稿日時 2008/11/25 02:02:25
テキストファイル専用ボタンを作りました。
これは、難しくて検証も難しい内容を収めるものです。
こちらに保存して近いうちに、新しいプロジェクトで勉強してみます。
なかなか、すごいコードなんで大切に保管します。
投稿者 葉月  (社会人) 投稿日時 2008/11/25 02:43:56
>>>にぃや♪さん

>何回も同じ処理
 GUIの作業軽減にと思って書き込みしました。
 ご存知かも知れませんが~Designer.vbはプレーンなテキスト形式です。
 メモ帳などで開ける形式ですからコンソールアプリケーションを作成してバッチ処理が行えます。
 他にもフォーム継承やイベントプロシージャなど便利な機能もありますので。

>なぜエラーになるのか、別のメッセージBoxで解説や注意点も表示します。
>例えば、GDI凡用エラーとか表示させます。
 どちらにしても、私の予想を遥かに上回る難度を挑戦されてたんですね。
 失礼しました。


>>>あにすさん
 .NETだと、こんな簡単にコンパイラーの記述ができるんですね。
 ソース、とても参考になりました。
 @itやMSDNで概要は掴みましたが、内部では複雑な処理を行っていそうですね。
投稿者 にぃや♪  () 投稿日時 2008/11/25 02:53:58
手作業には、まだ理由があるんです。
VBヘルプは、名前空間を省略されているので、どのクラスに使用しているのか
調べなければいけません。
アニスさんは名前空間が書いてありますよね。
例 system.io
とかです。
投稿者 あにす  (社会人) 投稿日時 2008/11/25 03:19:03
>にぃや♪さん
>アニスさんは名前空間が書いてありますよね。
>例 system.io
>とかです。

VBのimportsの使い方が良く分からないので(僕はC#な人なのです)、使用しているクラスの分かりやすさも兼ねてフルネームで書きました。
VC#2008だとコードエディタのクラス名にマウスカーソルを当てるとクラスのフルネームをツールチップで確認出来るのですが、VB2005だと"Class クラス名"としか表示されませんね。2008では改善されているのでしょうか。(VBは未だに2005を使っています)

にぃや♪さんの趣旨とは少し違うのかも知れませんが、僕も自身が過去に書いたコードを体系的にまとめて参照出来るようにしたいと考えています。現状では過去のプロジェクトを開いてコピペして使ったりしているのですが、「あれ、あのときに書いたクラスってどのプロジェクトだっけ…」と探し回ることもあります。HTML等にまとめてWebで公開するのも面白いのかなと思っています。面倒でなかなか行動に移せずにいるのですが…。
そんな僕個人の事情があるので、にぃや♪さんの取り組みにはとても興味があります。
投稿者 にぃや♪  () 投稿日時 2008/11/25 03:42:35
Option Strict On
Imports System.Drawing.Imaging
Imports System.Drawing.Drawing2D
Imports System.IO
Public Class Form1

名前空間の例です。
VBヘルプは、ほとんどのサンプルコードで名前空間を省略しています。
そうすると、コードをコピーして貼り付けてもエラーになります。
逆にエラーする事で、どこに名前空間が必要なのか判断できますが。
投稿者 あにす  (社会人) 投稿日時 2008/11/25 04:06:46
>にぃや♪さん
Imports System.IO
を省くと、いきなりStreamReader()と書けませんが、
なぜかIO.StreamReader()と書けてしまうから訳が分からなくなってしまうんですよね。
IOの前のSystem.は誰がどうやってエスパーしてるんだろうと…。
自分で書くときはIDEの機能に任せれば困ることは何もないのですが…。
投稿者 にぃや♪  () 投稿日時 2008/11/25 04:20:22
名前空間を最初に書くと、そのフォームでは、すべて省略できるんです。
他のフォームで使うときは別のフォームの先頭に必要なようです。
省略例
Using reader As New StreamReader("C:ファイル(仮).txt")
TextBox1.Text = reader.ReadToEnd
End Using
で、System.Ioが省略になります。
VBヘルプサンプルは、すべて省略されてます。
そのままのコードではエラーになる場合も多いのです。
投稿者 あにす  (社会人) 投稿日時 2008/11/25 04:20:33
@IT:連載:プロフェッショナルVB.NETプログラミング 第18回 名前空間とImports文(後編)
http://www.atmarkit.co.jp/fdotnet/vb6tonet/vb6tonet18/vb6tonet18_01.html
このページを読んで理解しました。C#のusingとは全く違う機能なんですね。
投稿者 葉月  (社会人) 投稿日時 2008/11/25 05:16:08
私の書き方も悪かったと思います。双方の意思疎通ができていないようです。
コンソールアプリケーションの作成は、クラスの一部ではありません。
あくまで作業軽減で行うために作成するツールとして作成します。
ですから、C#で作成しても構いませんし、スクリプト言語、場合によってはExcelで行える作業かも知れません。
無論、他の部分でも行えると思います。

にぃやさんの行いたいことの一部がわかりましたので、名前空間を使った例を次のレスに書きます。

実際に名前空間の作業短縮したものを載せます。
一部、手動で変更するだけで使えます。
投稿者 葉月  (社会人) 投稿日時 2008/11/25 05:18:51
http://msdn.microsoft.com/ja-jp/library/system.aspx
①サイトへ行く
②クラス・説明の部分をコピー
③メモ帳を立ち上げて、半角スペースを,に変換
④csvで保存して、A列を削除
⑤=CONCATENATE("Imports System."B1)
⑥オートフィルで終了

名前空間はこれで行えます。手作業する必要がありません。
下記は、①~⑥を行った例です。
掲示板の制約で全ては載せられませんでした。ご了承ください。
それから一部失敗しているのは、手動で直してください。 


Imports System.AccessViolationException
Imports System.ActivationContext
Imports System.Activator
Imports System.AppDomain
Imports System.AppDomainManager
Imports System.AppDomainSetup
Imports System.AppDomainUnloadedException
Imports System.ApplicationException
Imports System.ApplicationId
Imports System.ApplicationIdentity
Imports System.ArgumentException
Imports System.ArgumentNullException
Imports System.ArgumentOutOfRangeException
Imports System.ArithmeticException
Imports System.Array
Imports System.ArrayTypeMismatchException
Imports System.AssemblyLoadEventArgs
Imports System.Attribute
Imports System.AttributeUsageAttribute
Imports System.BadImageFormatException
Imports System.BitConverter
Imports System.Buffer
Imports System.CannotUnloadAppDomainException
Imports System.CharEnumerator
Imports System.CLSCompliantAttribute
Imports System.Console
Imports System.ConsoleCancelEventArgs
Imports System.ContextBoundObject
Imports System.ContextMarshalException
Imports System.ContextStaticAttribute
Imports System.Convert
Imports System.DataMisalignedException
Imports System.DBNull
Imports System.Delegate
Imports System.DivideByZeroException
Imports System.DllNotFoundException
Imports System.DuplicateWaitObjectException
Imports System.EntryPointNotFoundException
Imports System.Enum
Imports System.Environment
Imports System.EventArgs
Imports System.Exception
Imports System.ExecutionEngineException
Imports System.FieldAccessException
Imports System.FileStyleUriParser
Imports System.FlagsAttribute
Imports System.FormatException
Imports System.FtpStyleUriParser
Imports System.GC
Imports System.GenericUriParser
Imports System.GopherStyleUriParser
Imports System.HttpStyleUriParser
Imports System.IndexOutOfRangeException
Imports System.InsufficientMemoryException
Imports System.InvalidCastException
Imports System.InvalidOperationException
Imports System.InvalidProgramException
Imports System.InvalidTimeZoneException
Imports System.LdapStyleUriParser
Imports System.LoaderOptimizationAttribute
Imports System.LocalDataStoreSlot
Imports System.MarshalByRefObject
Imports System.Math
Imports System.MemberAccessException
Imports System.MethodAccessException
Imports System.MissingFieldException
Imports System.MissingMemberException
Imports System.MissingMethodException
Imports System.MTAThreadAttribute
Imports System.MulticastDelegate
Imports System.MulticastNotSupportedException
Imports System.NetPipeStyleUriParser
Imports System.NetTcpStyleUriParser
Imports System.NewsStyleUriParser
Imports System.NonSerializedAttribute
Imports System.NotFiniteNumberException
Imports System.NotImplementedException
Imports System.NotSupportedException
Imports System.Nullable
Imports System.NullReferenceException
投稿者 葉月  (社会人) 投稿日時 2008/11/25 05:22:56
訂正です。
連投&間違えてしまい申し訳ないです。


⑤=CONCATENATE("Imports System.",B1)


⑤=CONCATENATE("Imports System."B1)
投稿者 にぃや♪  () 投稿日時 2008/11/25 06:48:39
葉さん>小さいサイズのサンプル集なので。
おおがかりなサンプルは、新しいプロジェクトを開いて、別口で勉強する予定です。
とゆうのは、大きいサンプルはdataベースとか沢山のコントロールを使用しますし、
コード自体の理解も時間が必要です。
葉さんの言いたいことは理解してます。
プロ仕様は将来的にチャレンジしますが。
メモ帳は今回は使用していません。文字化けしてしまいますので、VBテキストに直接
貼り付けてます。
名前空間ですが、マイクロソフトが小分けしている理由があると思いますが。
パフォーマンスが下がるとか、容量が増えすぎとか、あるんでしょうか?
とりあえず、入門者なんで、ボチボチやります。
投稿者 にぃや♪  () 投稿日時 2008/11/25 07:34:38
ちょっと、かみ合ってないかな。
ソースコードは、コードエディターに貼り付けるだけの状態にしてあります。
解説はVBテキストファイルに貼り付けるだけの状態にしてあります。
Zzzz・・・
投稿者 あにす  (社会人) 投稿日時 2008/11/25 20:25:42
>にぃや♪さん
VBテキストファイルって何でしょうか?

>メモ帳は今回は使用していません。文字化けしてしまいますので、VBテキストに直接
>貼り付けてます。
Windowsに付いてるメモ帳じゃなくて、UTF-8に対応したテキストエディタならVBのコードを貼り付けられますよ。本番の開発ではまずやる人はいないでしょうが、コーディングもOKです。
投稿者 葉月  (社会人) 投稿日時 2008/11/26 05:27:53
>>>メモ帳などで開ける形式
 書き方が悪かったですね。
 ~Desiner.vbは、StreamReaderメソッドで処理ができるという意味で書きました。
 実際にメモ帳を使って作業するという意味ではありません。

>>>VBテキストファイル
 統合開発環境(VS)に用意されているエディッタのことでしょうか?

>>>名前空間ですが、マイクロソフトが小分けしている理由があると思いますが。
>>>パフォーマンスが下がるとか、容量が増えすぎとか、あるんでしょうか?
 一言でいうと、どのクラスで使われているか明確にするためです。
 たとえば、よく見かけるメソッド名の一つにaddがあります。
 add(メソッド名)は、複数のクラスで利用されています。
 一例を紹介します。

・List
 http://msdn.microsoft.com/ja-jp/library/s6hkc2c4.aspx
・Dictionary
 http://msdn.microsoft.com/ja-jp/library/xfhwa508.aspx

 処理は違いますが、何かを付け加えるという意味になっており、
メソッド名は推測しやすい仕組みになっています。
 しかし、複数のクラスから同じメソッド名を使っているため、
どのクラスで利用されているのか分かり難いです。
 そのためImportで指定してもSystem.~から略さずに書いたり、
にぃやさんの質問で見かけるImportで細かく分けたりしていると
思います。
 私は面倒なので、サンプルや短いコードを書くときはSystem.
を省略しています。
 (例)IO.StreamReader
投稿者 にぃや♪  () 投稿日時 2008/11/26 06:36:46
いろいろ失敗場所があるので、最初から作り直しました。
解説部分は、リソーステキストを使う事に変更しました。
StreamReaderは使わなくなりました。
投稿者 にぃや♪  (小学生) 投稿日時 2008/11/26 19:20:01
沢山の助言ありがとうございました。
経緯について。
最初は、メモ帳ファイルを使用してましたが、文字化けするので中止しました。
SHIFT JISとか、環境対応が難しいでした。
で、次はテキストファイルの追加に変更しましたが、DVD_Rに保存しても、
パソコンを再setUPとかした場合に使えなくなります。
入門者なんで、失敗も多いです。
リソースファイルだと安心と感じました。
最初のタイトルとは違いますが。
このサンプル集は日記みたいなもんなんで、永久にDataは増えていきます。
現状、これで解決。
投稿者 あにす  (社会人) 投稿日時 2008/11/26 23:15:12
>にぃや♪さん
リソースにサンプルを入れてしまうと、自前の検索機能がないとサンプルが増えた時に探せなくなりますよ。後から探せないと集める意味も無いでしょう。
テキストファイルを実行ファイルと同じフォルダに置くようにして、フォルダごとDVD-Rに焼けば再SETアップをしても問題ないのでは?
メモ帳についてですが、かわりにこれを使ってみてはどうでしょうか?僕自身もたまにこれでVB.NETやC#等のコードを書きます。
http://www5f.biglobe.ne.jp/~t-susumu/library/tpad.html
投稿者 にぃや♪  () 投稿日時 2008/11/27 02:18:22
あにすさん>どうもサンプル数は、あまり増えません・・・
すこしずつ増えるので、検索項目も必要ないかと・・・
今、sound項目を入れてますが、サンプルのコピー丸投げは危険です。
自作のコードをたくさん入れなければなりません。
例えば、loopのサンプルだと音楽がとまりませんし、数値によるオーバーフローも
発生したりします。
とゆうわけで。
ぼちぼち日記的に作ります。
投稿者 あにす  (社会人) 投稿日時 2008/11/27 03:01:50
>にぃや♪さん
自前のエディタでコレクションするのもいいですが、ブログ等で公開するのも面白いと思います。
皆の役に立ちますし、もし間違いがあれば見てくれた人から指摘して貰えることもあり、自身の為にもなるでしょう。
Googleで検索も出来ちゃいますよ。
投稿者 にぃや♪  () 投稿日時 2008/11/28 04:17:23
自作サンプルも入れました
Option Strict On
'VisualBasic2008 
Public Class Form1
    Private hari As Integer '針 
    Private hour As Integer '時 
    Private Function cosS(ByVal nagasa As IntegerByVal kakudo As IntegerByVal iro As Pen) As Integer
        Dim x, y As Integer
        x = CInt(nagasa * Math.Cos(kakudo * 3.14159 / 180))
        y = CInt(nagasa * Math.Sin(kakudo * 3.14159 / 180))
        Me.PictureBox1.CreateGraphics().DrawLine(iro, 150, 150, 150 + x, 150 + y)
        Me.PictureBox1.CreateGraphics().Dispose()
    End Function
    Private Sub hariHyouji()
        Dim i As Integer = 270
        PictureBox1.Refresh()
        hari = CInt(DateTime.Now.Second)
        hari = hari * 6 + i
        cosS(100, hari, Pens.Black)
        hari = CInt(DateTime.Now.Minute)
        hour = hari
        hari = hari * 6 + i
        cosS(80, hari, Pens.Aqua)
        hari = CInt(DateTime.Now.Hour)
        hari = CInt((hari * 30 + i) + hour / 2)
        cosS(50, hari, Pens.Red)
    End Sub
    Private Sub Timer1_Tick(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Timer1.Tick
        hariHyouji()
    End Sub
    Private Sub Form1_Load(ByVal sender As ObjectByVal e As System.EventArgs) Handles Me.Load
        Timer1.Start()
        Timer1.Interval = 300
    End Sub
End Class

Disposeが、まだ理解できない。
IroはDisposeする必要ありますか?
ドボンさんのトコで聞こうかなぁ~(笑)
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2008/11/28 07:20:26
> x = CInt(nagasa * Math.Cos(kakudo * 3.14159 / 180))
「3.14159」よりも、「Math.PI」を使った方が良いと思いますよ。


> Disposeが、まだ理解できない。
きちんと理解しようとすると、ちょっと難しい分野ですよね…。


> IroはDisposeする必要ありますか?
いえ。その cosS メソッドの中では、Dispose してはいけません。
cosS に渡すべき Pen を作成した側が、Dispose するようにします。

何故なら、その Pen は cosS メソッドが呼ばれた後も、他のメソッドなどから
利用される可能性があるためです。cosS 内では、その Pen が他で使用されるか
どうかを判断できないので、このメソッド内で Dispose するわけにはいかないのです。


大前提として……こうしたオブジェクトを Dispose する責任を負うのは、
それを「作成」した側であり、「取得」した側では無いという事です。



そしてもう一つ。Dispose について、さらにややこしい話をしなければなりません。


実は今回使っている Pens.Black 等は、Dispose してはいけないオブジェクトなのです。

Pens.Black、Pens.Aqua、Pens.Red などは「共有プロパティ」と呼ばれるものです。
これらの Pen は、.NET 全体で共有されるオブジェクトになっています。

この場合、にぃや♪さんは Pen を「作成」したのではなく、
.NET の内部で作成済みの Pen を「取得」しているだけなので、
VB のコードから、勝手に Dispose してはならないのです。


これが、自分で Pen を「作成」した場合においては、
 Dim p As New Pen(Color.Black, 3)
 cosS(100, hari, p)
 p.Dispose()
などのようにして、『Dispose しなければならない』のですけれどね。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2008/11/28 08:04:07
> Me.PictureBox1.CreateGraphics().DrawLine(iro, 150, 150, 150 + x, 150 + y)
> Me.PictureBox1.CreateGraphics().Dispose()
残念ながらこのコードでは、Grapchis が正しく Dispose されません。

CreateGraphics は、「Graphicsをクリエイト(作成)する」という言葉通り、
呼び出すたびに新たな Graphics オブジェクトを作り出すメソッドです。

そのコードですと、2 つの Grapchics を生成している事になります。
1番目に生成した方は DrawLine するが Dispose していない事になり、
2番目に生成した方は、使わずにただ Dispose しているだけです。


こういう時には、
 Dim g As Grahics = Me.PictureBox1.CreateGraphics()
 g.DrawLine(iro, 150, 150, 150 + x, 150 + y)
 g.Dispose()
と書くようにしてみてください。VB2005, 2008, 2010 の場合は、
 Using g As Graphics = Me.PictureBox1.CreateGraphics()
  g.DrawLine(iro, 150, 150, 150 + x, 150 + y)
 End Using
と書くこともできます(Usingを使う方法を推奨)。


ただし再描画の事を考えると、できれば CreateGraphics を利用した描画方法は
避けた方が良いでしょう。CreateGraphics を使ったサンプルが多く出回ってはいますが、
PicturBox それ自身に描画するのは、あまり好ましい方法ではありません。

本来、PictureBox を使う場合には、
 (方法1) Paint イベントに描画処理を書く。
 (方法2) Image / BackgroundImage プロパティに画像を割り当てる。
という手法を用いた方が都合が良いのです。

そして方法1 の場合、Graphics はイベント引数 e.Graphics から得る事になります。
たとえば、このようになります。

Option Strict On
Public Class Form1
    Private Sub cosS( _
          ByVal g As Graphics, ByVal nagasa As IntegerByVal kakudo As IntegerByVal iro As Pen)
        Dim x As Integer = CInt(nagasa * Math.Cos(kakudo * Math.PI / 180))
        Dim y As Integer = CInt(nagasa * Math.Sin(kakudo * Math.PI / 180))
        g.DrawLine(iro, 150, 150, 150 + x, 150 + y)
    End Sub

    Private Sub PictureBox1_Paint( _
          ByVal sender As ObjectByVal e As PaintEventArgs) Handles PictureBox1.Paint
        Dim i As Integer = 270

        Dim hari As Integer '針 

         hari = Now.Second * 6 + i
        cosS(e.Graphics, 100, hari, Pens.Black)

        hari = Now.Minute * 6 + i
        cosS(e.Graphics, 80, hari, Pens.Aqua)

        Dim ji As Integer = Now.Hour
        hari = (ji * 30 + i) + ji \ 2
        cosS(e.Graphics, 50, hari, Pens.Red)
    End Sub

    Private Sub Timer1_Tick( _
          ByVal sender As ObjectByVal e As EventArgs) Handles Timer1.Tick
       PictureBox1.Invalidate()   '描画して欲しい、と PictureBox にお願いするためのメソッド 
    End Sub

    Private Sub Form1_Load( _
          ByVal sender As ObjectByVal e As EventArgs) Handles Me.Load
        Timer1.Interval = 300
        Timer1.Start()
    End Sub
End Class
投稿者 にぃや♪  () 投稿日時 2008/11/28 20:31:50
Disposeは理解が少し進みました。
eの使い方は、実は、あまり理解してませんでしたが、非常によくわかりました。
Functionは、作ってみたら必要がなくなりました。
Me.Graphicsのトコは、フォーム2の名前をGraphicsと付けてしまって、バグに気がつくのに時間がかかりましたが...
入門者ぶりを発揮してます。
ども、有料講義に匹敵する内容で、ありがとうございます。