1 名前:デフォルトの名無しさん mailto:sage [2007/03/05(月) 11:19:36 ] 前スレVB.NET質問スレ (Part19) pc11.2ch.net/test/read.cgi/tech/1168585041/
116 名前:デフォルトの名無しさん mailto:sage [2007/03/14(水) 22:12:02 ] そんな馬鹿なw 天然無脳(つまり114のことだが)だって1万ページある本の最後の1000行を 書き出すのに巻頭から全部目を通さないだろう
117 名前:デフォルトの名無しさん [2007/03/14(水) 22:21:19 ] >116 その方法を教えてくれ。たのむ。
118 名前:デフォルトの名無しさん mailto:sage [2007/03/14(水) 22:25:14 ] ケツからファイルポインタをデクリメントしていって1000個目の改行コード探すだけじゃん。 そこから先は普通にテキストとして読めばいい。
119 名前:デフォルトの名無しさん [2007/03/14(水) 22:32:41 ] >118 サンプルコードを教えてくれ。たのむ。俺は、ファイルポインタなんて 使った経験がない。 StreamReaderでファイルを開いてReadLine() で一行ずつなら読める。
120 名前:デフォルトの名無しさん mailto:sage [2007/03/14(水) 22:35:27 ] 氏ねよ
121 名前:デフォルトの名無しさん [2007/03/14(水) 22:39:37 ] >>119 FileStreamクラスを使うんじゃよ
122 名前:デフォルトの名無しさん mailto:sage [2007/03/14(水) 22:43:56 ] >>113 >>119 ってもしかしてテキストファイルなら、TextBox系でLoadFileしておいてTextを String変数に代入してLength目から逆追いするってのと同じじゃないだろうか。 それなら直ぐ書けるのじゃないだろうか。 って俺はとてもヒマないからやってはあげはしないがw
123 名前:デフォルトの名無しさん mailto:sage [2007/03/14(水) 22:45:37 ] あ、ただTextBoxBaseは最大文字数に制限あったっけ??
124 名前:デフォルトの名無しさん mailto:sage [2007/03/14(水) 22:49:38 ] >>122 ,123は論外
125 名前:デフォルトの名無しさん mailto:sage [2007/03/14(水) 23:18:39 ] プログラム始めてから数ヶ月の俺にも出来たぜw
126 名前:デフォルトの名無しさん [2007/03/14(水) 23:24:16 ] >125 それを俺に教えてくれ。たのむ。
127 名前:デフォルトの名無しさん mailto:sage [2007/03/14(水) 23:36:37 ] >>126 Dim a As New IO.FileStream("C:\a.txt", IO.FileMode.Open, IO.FileAccess.Read, IO.FileShare.None) Dim count As Integer Dim Bytes(a.Length - 1) As Byte For I As Integer = a.Length - 2 To 0 Step -1 a.Position = I If a.ReadByte() = 13 And a.ReadByte() = 10 Then count += 1 If count = 1000 Then a.Read(Bytes, 0, a.Length - I) TextBox1.Text = System.Text.Encoding.GetEncoding("Shift-jis").GetString(Bytes) Exit For End If End If Next a.Close() エンコードはシフトJIS 勘で作ったから保障はしないよ
128 名前:デフォルトの名無しさん mailto:sage [2007/03/14(水) 23:44:13 ] 色んな物がメチャクチャだなぁ
129 名前:デフォルトの名無しさん mailto:sage [2007/03/14(水) 23:50:53 ] >Dim Bytes(a.Length - 1) As Byte これで台無しだな
130 名前:デフォルトの名無しさん mailto:sage [2007/03/14(水) 23:58:43 ] >>126 だからFileStreamクラスを調べろっつってんだろがボケ!!! でもSeekとかPositionの性能が本当に良いかどうかは知らんよ。
131 名前:デフォルトの名無しさん [2007/03/15(木) 00:01:41 ] >127 おおーーー、超サンキュウ! さっそく試してみるわ。 >130 >ボケ だから質問してるんだよ。俺に優しく教えろ!
132 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 00:06:09 ] だから悩んだり試したりする前にMSDNに目を通せと(ry
133 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 01:02:05 ] >>130 はツンデレ
134 名前:デフォルトの名無しさん [2007/03/15(木) 05:04:45 ] フォーム上にお絵かきするソフトで下記の例外がまれに発生するんだけど、 なんのことやらさっぱり分からん。 「InvalidOperationException:バッファ操作が現在進行中であるため、BufferedGraphicsContext を消去できません」 作り方が悪いのか? どういう場合に発生する例外なのか、VBプロフェッショナル達よ、教えてくれ。
135 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 08:09:55 ] 頭が悪いんだよ、きっと。 いや、確実に。 作り方が悪いのか?、だと? お前さん以外にそういうトラブルを申し立てている人間がいるのかよw
136 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 08:15:47 ] >>127 そいつのベンチマークが見たいな。
137 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 09:51:10 ] >>125 こんなのでどうか Public Function ReadTailLines(ByVal filename As String, ByVal lineCount As Integer) Dim sep() As String = {vbCrLf} Using ifs As IO.FileStream = IO.File.OpenRead(filename) Dim allBuf As New List(Of Byte) Dim len As Integer = lineCount * 100 Dim pos As Long = ifs.Length Dim lines() As String Do pos -= len If pos < 0 Then len += pos pos = 0 End If Dim tmpBuf(len) As Byte ifs.Seek(pos, IO.SeekOrigin.Begin) ifs.Read(tmpBuf, 0, len) allBuf.InsertRange(0, tmpBuf) lines = Text.Encoding.Default.GetString(allBuf.ToArray(), 0, allBuf.Count).Split(sep, StringSplitOptions.None) Loop While pos > 0 And lines.Length < lineCount (続く)
138 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 09:52:07 ] If lines.Length <= lineCount Then Return lines Else Dim ret(lineCount - 1) As String Array.Copy(lines, lines.Length - lineCount, ret, 0, lineCount) Return ret End If End Using End Function 初めてVB.NETでプログラム組んだのでちょいと汚いがな
139 名前:137 mailto:sage [2007/03/15(木) 09:52:57 ] >>113 の間違いだ。すまん
140 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 12:22:10 ] >>134 どんな時にその例外が投げられるかはMSDN見れ。 なんで、もしくはどこで、出てるのかは お前さんにしかわからない。 とりあえずコード上での発生箇所を探るしかないとおもう
141 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 12:26:42 ] 例外発生ネタは発生個所を晒してもらわないことには回答のしようがないんだよな
142 名前:デフォルトの名無しさん [2007/03/15(木) 12:50:39 ] 134だけど、例外の発生箇所は下記のとおりだよ。 場所 System.Drawing.BufferedGraphicsContext.Dispose(Boolean disposing) 場所 System.Drawing.BufferedGraphicsContext.Dispose() 場所 System.Drawing.BufferedGraphicsContext.AllocBufferInTempManager(Graphics targetGraphics, IntPtr targetDC, Rectangle targetRectangle) 場所 System.Drawing.BufferedGraphicsContext.AllocBuffer(Graphics targetGraphics, IntPtr targetDC, Rectangle targetRectangle) 場所 System.Drawing.BufferedGraphicsContext.Allocate(IntPtr targetDC, Rectangle targetRectangle) 場所 System.Windows.Forms.Control.WmPaint(Message& m) 場所 System.Windows.Forms.Control.WndProc(Message& m) 場所 System.Windows.Forms.ButtonBase.WndProc(Message& m) 場所 System.Windows.Forms.Button.WndProc(Message& m) 場所 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) 場所 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 場所 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 自分の作ったコード内ではないので、困ってるんだよ。
143 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 12:54:43 ] そんな内部のことはどうでもいいから最後に実行された自分のコードを確認してくれ
144 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 13:56:01 ] >>142 > 自分の作ったコード内ではないので、困ってるんだよ。 俺たちも自分の作ったコード内じゃないことの上にソースすらないからどうしようもないんよ(・ω・)
145 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 14:14:50 ] >>144 ソースがないと直しようがないじゃないか・・・ なんか ちらつき防止のダブルバッファの使い方を 間違えたんじゃないかと思うんだが? どうなの、詳しい人? それと、思い出したんだが.VisualStudioに逆アセンブラがついてた気がする。 難読化されていなかったらソース解析できる可能性があるよ。
146 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 14:16:38 ] ごめん>>144 と>>142 が同一人物だと勘違いした。OTZ
147 名前:デフォルトの名無しさん [2007/03/15(木) 14:49:56 ] >137 誰かこれをVB.NET2003に翻訳してくれ。たのむ。
148 名前:デフォルトの名無しさん [2007/03/15(木) 16:47:19 ] VB.netを使って、サーバーやサイト上のデータ(htmlとかtxtとか)をダウンロードし、 PC内にためこんでデータベース化するソフトを作りたいんですが、 どういう機能を使えばいいのかわかりません。 どういう機能を使えばweb上のデータをDLできるのでしょうか?ADO?ASP? また、それを学ぶのにお勧めの本などありましたら教えていただけると幸いです<(_ _)>
149 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 18:12:11 ] >>148 MSDN
150 名前:デフォルトの名無しさん [2007/03/15(木) 18:43:47 ] VB.NETで作成したEXEファイルを自動的に配布するツールとかないですかね? クライアントはIEが前提で ノータッチデプロイメントでいいやって思ってたら、社外からのインターネットアクセスはTAMってやつが邪魔するのよ
151 名前:デフォルトの名無しさん [2007/03/15(木) 19:00:29 ] んーーーーーいろいろ考えたけど IISにローカルのEXEファイルとサーバサイドのファイル更新日時比較するスクリプト仕込んだポータルサイトを置いといて そのスクリプトでFTPダウンロードする方式しか思いつかんな でもかっこ悪いよなこんなやり方 セキュリティ警告のダイアログがウザそうだし
152 名前:デフォルトの名無しさん mailto:sage [2007/03/15(木) 19:11:05 ] フロッピーで郵送
153 名前:デフォルトの名無しさん [2007/03/16(金) 00:00:19 ] if x < 1e10 then って書いたら、勝手に if x < 10000000000 then ってなるのだが、ゼロが並んでいると分かりにくいので、1e10のまま にしたいのだが、方法はあるか?
154 名前:デフォルトの名無しさん mailto:sage [2007/03/16(金) 00:22:53 ] VBって16進も勝手に整形するよね。もうアホかと。 Const tenBillion as Integer = 1000000000 とか、 if x < 10^10 then ぐらいか、手の打ち所は?
155 名前:デフォルトの名無しさん mailto:sage [2007/03/16(金) 00:31:47 ] >>153 自動整形機能を切るのはダメ?
156 名前:デフォルトの名無しさん mailto:sage [2007/03/16(金) 00:40:54 ] Int64.Parse( "1e+10", NumberStyles.AllowExponent ) ww
157 名前:デフォルトの名無しさん mailto:sage [2007/03/16(金) 00:49:55 ] >>137 それだと、lines.Length=lineCountのとき、戻り値の最初の行が途中からにならないか。
158 名前:デフォルトの名無しさん [2007/03/16(金) 04:51:37 ] 134だよ。 ソースを提示したいけど、サイズがでか過ぎてムリだよ。 ミニマムコードを示せればいいんだけど。。。 とりあえず、情報を探してみたけど、 forums.microsoft.com/MSDN/ShowPost.aspx?PostID=200483&SiteID=1 www.codeproject.com/cs/samples/swarmscreensaver.asp?df=100&forumid=185924&exp=0&fr=26&select=1139791 似た現象はあるようだけど、解決策はかいてなかった。 下のは、Graphics.Flushを呼べと書いてあるけど、効果は不明。 う〜ん、はまった。。。
159 名前:デフォルトの名無しさん mailto:sage [2007/03/16(金) 10:09:26 ] VB.NET2003でソフトを動作させていると IOExceptionが発生し、内容は このコマンドを処理するのに必要な記憶域をサーバーで確保できません こんなエラーが時々出る様子 やっている処理は以下のようなもの(普通にありえないんだが別会社のソフトの関係で仕方なくこうなっている) OSはすべてXPのSP2 ウィルスバスターインスコ済み 一定間隔(処理完了から次の処理開始までが10秒ほど) PC2〜10からPC1にある大量のファイル(10000ほどある時もある)を全てなめて計算しているんだが このときに出ている模様 で、検索してみるとサービスで使用しているスタック領域が不足しているので(XPのデフォは15)、これを現在の値から引き上げてやる模様 これが不足する理由ってのがよくわからないけど、他の人は単純に20とか30にまで引き上げてやれば解決しているみたい 外部から共有フォルダに接続してガリガリ読み込むと単純にネットワークサービスが使うメモリが不足するって事なのかな? あと、これは・・・PC1に対して行うのかPC2〜10に対して行うんだろうか・・・ PC1だとは思うけどレジストリなのでおいそれと変えたくない予感 もし、何か知ってる人居たら教えてくれないか?
160 名前:デフォルトの名無しさん mailto:sage [2007/03/16(金) 10:42:42 ] >>159 その質問に答えられるのはエスパーかペテン師ぐらいだろう。 VB.NET2003でどんなソフトを作ってんのよ。WinFormアプリかサービスか、 通信は共有フォルダなのか独自にやってるのかはっきりしろ。
161 名前:デフォルトの名無しさん mailto:sage [2007/03/16(金) 10:54:54 ] >>160 ごめ、説明不足 WinFormアプリで PC1の共有フォルダを介してPC1のファイルを PC2〜10のWinFormアプリ各々がチェックしに行ってる状態 PC1のレジストリにはIRPStackSizeの項目は設定されていない また、パフォーマンスの詳細設定で パフォーマンスの優先はプログラム メモリ使用量はプログラム なぜか仮想メモリは370〜700固定 IRPStackSizeの変更後の値をネットで調べると15が多いようだが マージンとってそれよりも大きな値(20〜30とか)に設定しても大丈夫なのかな? 出来れば設定値の基準値が知りたいところではあるけれど・・・ また、PC1では基本的に操作しないのでパフォーマンス設定も サーバOSのデフォのように変えてやったほうがいいんだろうか? PC1の大まかなスペックはP4 2.8Gでメモリ512M ん〜・・・説明へたでゴメ
162 名前:デフォルトの名無しさん mailto:sage [2007/03/16(金) 11:00:38 ] >>148 Webサービスでがんばれ
163 名前:デフォルトの名無しさん [2007/03/16(金) 12:45:40 ] TextBoxのMaxLengthプロパティってディフォルトで32767文字もあるけれど、 10文字で十分なのだけれど、この値が大きくても小さくても、プログラム 起動してタスクマネジャでメモリ使用量比べても、余り違わないのだけれど、 これはどういうこと?1000個のTextBoxでテストしてみたが良く分からない。
164 名前:デフォルトの名無しさん mailto:sage [2007/03/16(金) 12:48:18 ] 入力を制限しているだけでそれ以上の意味はない
165 名前:デフォルトの名無しさん [2007/03/16(金) 12:55:23 ] >164 知らんかった。39!
166 名前:デフォルトの名無しさん [2007/03/16(金) 13:41:02 ] 馬鹿のイメージでは、メモリアロケーションしてるんかい? きょうびの高級言語、そんなにせこせこしてねーよ。
167 名前:デフォルトの名無しさん mailto:sage [2007/03/16(金) 15:04:28 ] 意味が分からない
168 名前:デフォルトの名無しさん [2007/03/16(金) 19:06:31 ] 質問、Excelなんかが公開してるCOMオートメーションをVB.NETから使う時なんですが。 Excel側のイベントでチェックボックスのチェック状態を変更すると、以下の例外が出ます。 System.Reflection.TargetInvocationException' の初回例外が mscorlib.dll で発生しました。 COMのイベント内で自アプリのフォーム上のコントロールなんかを操作ってどうやったらいいでしょう。 とりあえずExcel側で新しいブックが作成された時のイベント(NewWorkbook)を使ってみたサンプルが 以下です。 Public Class Form1 Private WithEvents m_objExcel As Excel.Application Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load m_objExcel = New Excel.Application m_objExcel.Visible = True CheckBox1.Checked = False End Sub Private Sub Form1_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed m_objExcel = Nothing End Sub Private Sub m_objExcel_NewWorkbook(ByVal Wb As Excel.Workbook) Handles m_objExcel.NewWorkbook CheckBox1.Focus() CheckBox1.Checked = True End Sub End Class VB6だと動きますが、やっぱりVB.NETだとお作法が違いますよね
169 名前:デフォルトの名無しさん mailto:sage [2007/03/16(金) 20:19:54 ] ワロタ
170 名前:デフォルトの名無しさん mailto:sage [2007/03/17(土) 21:18:29 ] おまえらって賢いな
171 名前:168 mailto:sage [2007/03/18(日) 01:11:07 ] 解決しました .NET Fremawork1.1のC#しか扱ったことなかったのですが、2.0以降ではサブスレッドから Windowのコントロールにアクセスすると例外が起こるんですね。 1.1の時はたまたま動いていたと。 orz ちなみにInvoke()呼び出しと、m_objExcelの操作をサブスレッドで実行するように変更したら 動くようになりました。 めったに.NETのC#もVBも使わないんで結構忘れますね。 あと書き忘れてましたが VisualStudio2005使ってます。(最近買いました)
172 名前:デフォルトの名無しさん mailto:sage [2007/03/18(日) 01:19:03 ] >>171 ついでにCOM相互運用とかも見とくといいんでない?
173 名前:デフォルトの名無しさん mailto:sage [2007/03/18(日) 01:22:41 ] ttp://jeanne.wankuma.com/tips/programing/releasecom.html こんな開放ってやっぱり必要なの?
174 名前:デフォルトの名無しさん mailto:sage [2007/03/18(日) 01:25:39 ] 自分しか使わないもんなら不要。 それで困らなければ不要。 立ち上げてすぐ落とすようなもんなら大抵不要。 そうでなければ必須。
175 名前:デフォルトの名無しさん mailto:sage [2007/03/18(日) 01:26:36 ] >>174 thx
176 名前:デフォルトの名無しさん mailto:sage [2007/03/18(日) 01:28:38 ] >>172 ちょうどHELPでそこ読みながらやってました でも.NETメインじゃないんで熟読するの辛いですね >>173 やらないとアプリ終了時に例外が出ますね でも、やらなくてもCOMのローカルサーバーはちゃんと終了するんで 参照カウントはデクリメント(Release)されてるのかも
177 名前:デフォルトの名無しさん [2007/03/18(日) 12:09:49 ] >>173 やっとかないアンマネージドリソースはフレームワークが勝手に開放するような仕組みもって無いんで解放できないんじゃ・・・? というわけで仕方なくCOM使う場合は必ず使ってる ただ、ラッパクラスAをさらにラップしたクラスB作ったら、Bの解放のタイミングでフレームワークがCOMオブジェクトリリースしてくれないかな? とか淡い期待抱いてるけど
178 名前:デフォルトの名無しさん mailto:sage [2007/03/18(日) 12:21:01 ] >>173 使うことが推奨だが、 >COM オブジェクトを扱う場合は、参照の解放を常に意識する必要があります。 >使用した COM オブジェクトの参照カウントが、正しくデクリメントされていないと「メモリ リーク」を起こします。 は明らかな間違い。いい加減なおして欲しいよ。
179 名前:デフォルトの名無しさん [2007/03/18(日) 12:35:03 ] >>178 何が間違ってんだ、とぼけたこと抜かしてんなよボケ
180 名前:デフォルトの名無しさん mailto:sage [2007/03/18(日) 12:36:46 ] >>178 ”メモリリーク”を何に直せばいいの?
181 名前:デフォルトの名無しさん mailto:sage [2007/03/18(日) 13:03:03 ] 微妙な問題ではあるが、MSDNフォーラムのこの話題が参考になりそう。 forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=748277&SiteID=7 COMの参照カウンタはRCWが管理している。 ReleaseComObjectはCOMの参照カウンタそのものではなくRCWの参照カウンタを管理するもの。 RCWの参照ポインタがゼロのなるかGCされればCOMの参照カウンタはデクリメントされる。 RCWはReleaseComObjectで開放すべきであり、GCによる開放はフェイルセーフ的なものと考えるべき。
182 名前:デフォルトの名無しさん mailto:sage [2007/03/18(日) 13:30:27 ] >>180 >COM オブジェクトを扱う場合は、参照の解放を常に意識する必要があります。 COM オブジェクトを扱う場合は、参照の解放を意識する必要があります。 >使用した COM オブジェクトの参照カウントが、正しくデクリメントされていないと「メモリ リーク」を起こします。 使用したRCWの参照カウントが正しくデクリメントされていないと期待するタイミングでCOM オブジェクトが開放されません。
183 名前:デフォルトの名無しさん mailto:sage [2007/03/18(日) 13:32:24 ] >>182 あらゆる意味で不完全燃焼だ
184 名前:デフォルトの名無しさん mailto:sage [2007/03/18(日) 13:34:37 ] そんな文章の校正屋みたいなことして楽しいのかね。奇特な奴。 どうせ何か書くなら物事自分の頭でまとめた結果をアウトプットしろよ
185 名前:デフォルトの名無しさん mailto:sage [2007/03/18(日) 13:49:41 ] そりゃま、「全部GCでOKww手動でやる奴は馬鹿!」とか書いたら爆釣りで完全燃焼だろうけどさw
186 名前:デフォルトの名無しさん mailto:sage [2007/03/18(日) 14:21:11 ] >>184 校正って、間違ってんだろ
187 名前:デフォルトの名無しさん mailto:燃焼系アミノ式 [2007/03/18(日) 17:13:13 ] VB6時代のNothing論争に似てる。 Sub XX Dim Obj As New ActiveX.Hoge ' いろいろな処理 Set Obj = Nothing End Sub 最後のNothingがないとメモリーリークが起きると言い張るのが必ずいた。 実害はないから頭の悪いプログラマーには全部Nothingを付けされたほうが安全というのが結論だった。
188 名前:デフォルトの名無しさん mailto:sage [2007/03/18(日) 17:18:16 ] 参照にnullを代入したらその時点でGCが動くと信じてる奴は多そう 全く意味はないとMSDNには書いてあるが
189 名前:デフォルトの名無しさん mailto:sage [2007/03/18(日) 17:19:20 ] dim a as new collection set a=nothing msgbox a.count
190 名前:デフォルトの名無しさん mailto:sage [2007/03/18(日) 17:19:56 ] 全く意味は無いというのは言いすぎだな 超極めて限定的に意味があるシーンもある ……それは意味がないのと同義か
191 名前:デフォルトの名無しさん mailto:sage [2007/03/18(日) 17:20:00 ] アウトプロセスサーバなCOMでプロセス起動するようなやつだと 解放しないとプロセスが残るやん メモリリークどころじゃないやん その時点でアウトやん
192 名前:デフォルトの名無しさん mailto:sage [2007/03/18(日) 17:22:07 ] >>190 循環参照とかにつかうんよ >>191 参照カウントをデクリメントするのと、「解放」するのは全く別物
193 名前:デフォルトの名無しさん mailto:sage [2007/03/18(日) 17:24:48 ] 循環参照でもそれらが孤立してたらGCされるだろ
194 名前:デフォルトの名無しさん mailto:sage [2007/03/18(日) 17:27:18 ] >>193 .NETはね VBは参照カウントだから無理
195 名前:デフォルトの名無しさん mailto:sage [2007/03/18(日) 17:39:01 ] 以下VB6の話。スレ違いなのでこれくらいにしておく。 「別の処理」のときにObjを確実に終わらせいたいときはNothingの代入は意味がある。 Sub XX Dim Obj As New ActiveX.Hoge ' いろいろな処理 Set Obj = Nothing ' ここで参照が0になったら即開放される。ここはVB.NETと異なる。 ' 別の処理 End Sub Objはローカルに宣言された変数だからEnd Sub時点でObjは消失してNothingの代入相当の処理 つまり参照カウンタの減算は行われる。このため「別の処理」が存在しないときにNothingの代入は意味がない。
196 名前:デフォルトの名無しさん mailto:sage [2007/03/18(日) 17:39:55 ] COM使うの止めればいいじゃん。特にサーバでは。
197 名前:デフォルトの名無しさん mailto:sage [2007/03/18(日) 17:41:26 ] >>196 サーバー用途だとエンタープライズサービスがもろCOM+だからねぇ
198 名前:デフォルトの名無しさん [2007/03/18(日) 23:17:22 ] しかし、これからはComは使わないだろ FW1.1とかでAPI使わずにVB6のMSCOMM使ってる連中が多かったから FW2.0でCOMM通信のコンポーネント追加したんだろう DataGrid使いづらいからってMSFLEXGRID使ってた連中もいたし それでDataGridView追加したんだろうけどなぁ… すべてはCOMから移行していくんだよ全て
199 名前:デフォルトの名無しさん mailto:sage [2007/03/18(日) 23:28:50 ] とはいえ、マイクロソフトの主要プロダクトはほとんどCOMじゃないか。
200 名前:デフォルトの名無しさん mailto:sage [2007/03/18(日) 23:34:01 ] >>198 FWってFrameworkのことか? 普通はFxと略すが
201 名前:デフォルトの名無しさん mailto:sage [2007/03/18(日) 23:37:47 ] Fxは.NET Framework 3.0(旧称WinFX)のことだと誤解されそう
202 名前:デフォルトの名無しさん mailto:sage [2007/03/18(日) 23:39:29 ] >>200 うはw初めて知った。 それって公式な略称なんですか?
203 名前:デフォルトの名無しさん mailto:sage [2007/03/18(日) 23:39:53 ] マイクロソフトの出す資料には.NET Fxと書いてある。
204 名前:デフォルトの名無しさん [2007/03/18(日) 23:40:14 ] >>200 FXは俺も3.0とオモタw そういえばみんなフレームワークなんて呼んでるんだろうな? 俺は普通にフレームワーク2.0とかの書き方なんだが略し方とかあるのか? VisualStudio2005=VS2005みたいに
205 名前:デフォルトの名無しさん [2007/03/18(日) 23:41:16 ] Clipboard.SetDataObject(Me.PictureBox.Image, True) で、クリップボードにコピーしようとしたら、10回に8回くらいは、以下のエラーが出るんだけれど 何でかな? System.Runtime.InteropServices.ExternalException: 要求されたクリップボード操作が失敗しました。 at System.Windows.Forms.Clipboard.SetDataObject(Object data, Boolean copy)
206 名前:デフォルトの名無しさん mailto:sage [2007/03/18(日) 23:46:05 ] >>205 他所のアプリがクリップボードをロックしてる時にでもエラーになってんじゃね?
207 名前:デフォルトの名無しさん [2007/03/18(日) 23:50:34 ] >206 サンキュウ。うーん、でもね、他のアプリは確かに沢山動いているけれど、 クリップボードをロックしているはずはないのだけれど。 例えば、このエラーが出たあとPaintを起動してクリップボード使っても 何も問題なく使える。うーん、おかしい。
208 名前:デフォルトの名無しさん [2007/03/18(日) 23:53:12 ] その前後のプログラムのソース見ないといまいちわからんかもしれんなぁ・・・ なにやってんだ? 俺はクリップボード問題なさそうなんだが
209 名前:デフォルトの名無しさん [2007/03/19(月) 00:05:22 ] プログラムはFormを3つ開いて、Form3のPictureBoxに絵を描いて Buttonを押したらその絵をクリップボードにコピーするという簡単なもの。 このサンプルをそのまま使っている。 ttp://www.bcap.co.jp/hanafusa/dotnet/zu02.htm#no4 プログラムの中には、スレッドを使って別の処理を並行してやらせるようなルーチンも あるのだけれどプログラム起動直後はそういうルーチンは全然実行していないので、 スレッドなどは関係ないと思う。
210 名前:デフォルトの名無しさん [2007/03/19(月) 00:15:10 ] >>209 COM関連だよなInterRop そうおもってググってみたら同じような質問があった でうまくいったみたいだけど参考になるかな?
211 名前:デフォルトの名無しさん [2007/03/19(月) 00:15:56 ] 貼り忘れ 連投スマソ piza.2ch.net/tech/kako/977/977112364.html //********************* 232 名前: 名無しさん♯ 投稿日: 2001/04/17(火) 17:21 >>230 COMのスレッドの問題よん。 ここを参考にしてちょ。 質問 discuss.develop.com/archives/wa.exe?A2=ind0011B&L=DOTNET&P=R26673 回答 from Microsoft discuss.develop.com/archives/wa.exe?A2=ind0011B&L=DOTNET&D=0&P=38177 233 名前: デフォルトの名無しさん 投稿日: 2001/04/18(水) 00:39 >>231-232 ありがとうです。 using System.Threading; して Thread.CurrentThread.ApartmentState = ApartmentState.STA; をMainの一番初めに入れればいいんですよね。 この方法で試してみたけど、うまくいったりいかなかったり…。 で、今試したら100%うまくいくようです。 ちょっと謎ですが、たぶん大丈夫でしょう。 どうもありがとうございました。
212 名前:デフォルトの名無しさん mailto:sage [2007/03/19(月) 01:00:10 ] 普通はSTAThreadAttributeついてると思うんだけど、つけてないの?
213 名前:デフォルトの名無しさん mailto:sage [2007/03/19(月) 01:01:36 ] >>207 そりゃ問題なく使えて当然。そんな長時間クリップボードをロックしっぱなしするようなことはフツーしない。
214 名前:デフォルトの名無しさん [2007/03/19(月) 02:05:54 ] >211 サンキュウ。 Thread.CurrentThread.ApartmentState = ApartmentState.STA っていうのを入れてみたが効果なし。 おかしい。
215 名前:デフォルトの名無しさん mailto:sage [2007/03/19(月) 07:39:15 ] >>214 .NETのVersionはなに?.NETのVersionが2.0なら >Thread.CurrentThread.ApartmentState = ApartmentState.STA は既にレガシーで機能しない。 メインスレッドは属性[STAThread]で指定し、それ以外のスレッドならスレッド開始前に Thread.SetApartmentStateで初期化する必要がある。 それからPictureBoxはGUIコンポーネントだから、もしメインスレッド以外から PictureBox.Imageを参照してるならおかしくなるのは当たり前だけどそこは大丈夫?
216 名前:デフォルトの名無しさん mailto:sage [2007/03/19(月) 08:08:45 ] マイクロソフトはレガシーって呼ぶのか…。obsoleteとか言ってくんないとわからんw