1 名前:デフォルトの名無しさん [2008/02/22(金) 12:14:02 ] 前スレ VB.NET質問スレ(Part24) pc11.2ch.net/test/read.cgi/tech/1197507828/ テンプレは2〜5くらいまでの間にある予定
207 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 15:44:00 ] プロセスハンドルはプロセスが生きてる限り一貫して同じ値 ただしそのプロセスが死んだ後そのハンドルは他のプロセスに再利用されうる
208 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 15:49:57 ] >>207 書き込みありがとうございます。 メモ帳と同じハンドルで存在するアプリケーションは存在しないということでしょうか? アプリケーションの終了を判断したいので、「〜後そのハンドルは他のプロセスに」 は問題ないです。
209 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 15:57:57 ] >>208 ToStringでわざわざ文字列にする必要はないと思われる。 逆にToInt32()でInteger型にして比較するほうが妥当だと思われるが。 まあ、IntPtr型とInteger型(UInt32型)は直接比較することもできる。 Dim pi As New System.Diagnostics.ProcessStartInfo pi.FileName = "c:\windows\notepad.exe" Dim hProcess As IntPtr = System.Diagnostics.Process.Start(pi).Handle Dim pHnd As UInt32 '取得したプロセスハンドル If hProcess = pHnd Then '判断 MsgBox("メモ帳です") Else MsgBox("メモ帳じゃない") End If プロセスハンドルは、OSがそのプロセスを特定するための値なので同じ値は存在しない。
210 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 16:01:00 ] わざわざ、訂正までありがとうございますw 無事解決しました。 ありがとうございました!m(_ _)m
211 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 16:55:50 ] dsofile.dllで拡張情報のコメント読み書きしてみたのだけど、XPで書いたコメントは2000で読めず 2000で書いたものはXPで読めないというワケワカ状態です (これはエクスプローラで見てもそうなので、書き込まれていないとかじゃ無いです) 2000とXPでは違う場所に書き込んでるんですかねえ…
212 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 17:40:43 ] 同じだと思うけど? XPと2000の切り替えはデュアルブートとか?
213 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 21:29:24 ] >>212 2000サーバのファイルを2台のXPマシンと2台の2Kマシンで見てみた エクスプローラで同時に同じファイルのコメント表示してる筈なのに違ってるってもう… 一度iPropertyStorageで試してみるかな
214 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 21:35:08 ] えーっと、ローカルじゃないドライブでもNTFSの機能って使えるんだっけ?
215 名前:210 mailto:sage [2008/03/11(火) 21:38:42 ] またプロセス関係で躓きました。 「起動中のプロセスのハンドルを全て列挙して、 それらから記録していたハンドル整数を検索して見つからなかった場合、それが終了した」 といった風でさせているのですが、もっと簡単な方法があるのでしょうか? >>216
216 名前:210 mailto:sage [2008/03/11(火) 21:41:33 ] 書き込めない
217 名前:210 mailto:sage [2008/03/11(火) 21:45:45 ] 'XMLファイルから読み込んだファイルを監視起動 Public Sub LoadedXML_EXE_MonitorShell() AddHandler hProcess.Exited, AddressOf EXEShell_Exited End Sub '監視対象アプリが終了 Private Sub EXEShell_Exited(ByVal sender As Object, ByVal e As System.EventArgs) '何が終了したか判断するために、今あるアプリケーションのハンドル一覧から、記録しているハンドルと比較する @@@@@@@ここで比較しています@@@@@@@ End Sub できれば、 hProcess.Exitedで終了したハンドルが取得できればスッキリするのですが、 どうすればいいのでしょうか?
218 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 00:31:14 ] ハンドル整数(WIN32のProcessIDのことかな?) からプロセスハンドルを開いて、終了を待てばいいじゃん。
219 名前:210 mailto:sage [2008/03/12(水) 07:50:10 ] Process.Handleです、 非同期でやりたいので、できれば217のプログラム構造を壊さないで 終了したプロセスのハンドルを取りたいのですが、 イマイチ方法がわかりませんでした、 もう少しやってみます。
220 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 08:54:07 ] >>209 IntPtr型のまま比較すべきでは? 64ビットではプロセスハンドルも64ビットなんだから、 pHndだってIntPtrであるべき。
221 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 08:57:16 ] >>219 終了した後にハンドルを得るのは無理に近いから、起動したときに得たハンドルを取っておけ。 Process.HasExitedはだめなの?
222 名前:210 mailto:sage [2008/03/12(水) 09:27:21 ] 監視するアプリケーションは20を超える数になることがあるので、 的確に、何が終了したかをしりたいので |監視対象だった数個の内の、どれかが終了したときに |一体何が終了したのか? を調べたかったんです。 起動したときに、ハンドルは取得できているので 現在のプロセスのハンドルを全て列挙して、記憶している数個のハンドル整数から比較、 消えているもので判断しようと思います。 Process.HasExitedでは一つを対象にした場合なので、 使えませんでした。
223 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 10:12:45 ] 20 程度、Process をコレクションでもっときゃいいじゃん ハンドルも次の新規プロセスで再利用されうるんだから死んだ後使うのは危険
224 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 11:06:45 ] >>220 WindowsAPI使ってプロセスハンドル取得してる場合も少なからず考えられるからさ、 一応、Integer型でも比較できるというのを言いたかったんだ。
225 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 11:37:31 ] はぁ?
226 名前:210 mailto:sage [2008/03/12(水) 11:41:07 ] 一応コレクションは管理していますが、アプリケーションを監視している際にも、 そのアプリに関する情報も管理しないといけないので 膨大になっています。 これ以上増やすことはゴメンなんでw、 「現在のプロセスハンドル比較」の方法で行います。 ありがとうございました。m(_ _)m またお世話になることがあると思うので、そのときも、またよろしくお願いします。
227 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 11:45:48 ] 断る
228 名前:210 mailto:sage [2008/03/12(水) 11:48:24 ] 工エエェェ(´゜д゜`)ェェエエ工
229 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 16:19:28 ] >>222 Process.Exitedイベントとか、 監視用のスレッドを作ってWaitHandle.WaitAnyとかはどう。
230 名前:210 mailto:sage [2008/03/12(水) 18:39:37 ] 出来るだけループ処理は避けたいです、 長期間監視する場合や、スペックが低い場合 単純なタイマー監視などでも予期しないことが起こったりしてしまいそうなのでw '何が終了したか判断するために、今あるアプリケーションのハンドル一覧から、記録しているハンドルと比較する Dim ps As System.Diagnostics.Process() = System.Diagnostics.Process.GetProcesses() '配列から1つずつ取り出す Dim p As System.Diagnostics.Process '全てのプロセスハンドルを取得する Dim All_Process As String = "" For Each p In ps Try 'プロセス名を出力する All_Process = All_Process & (p.Handle.ToString) & vbCrLf Catch End Try Next p '比較開始(正規表現****\r\n)記憶させたキー全てを検索する Dim MoniPro_Count As Integer = nvc.Keys.Count - 1 'カウント数と実際のインデックス数は違うから「-1」 For i = 0 To MoniPro_Count If Not Regex.IsMatch(All_Process, "\b" & nvc.GetKey(i).ToString & "\r\n") Then '正規表現で検索 Dim End_EXE_Pro As String = nvc.Keys(i).ToString '0番目から検索して消えていたハンドル nvc.Remove(End_EXE_Pro) '登録から抹消 MoniPro_Count = nvc.Keys.Count - 1 'カウント調整 MsgBox(nvc.Count) Exit For End If Next 成功しているので張っておきます
231 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 19:01:16 ] >>224 そりゃDeclareが悪い。そっちをIntPtrに直せ。 ところで230はループを避けたいと言いつつ、 そこにあるコードはループして使うしかなさそうに見える件。
232 名前:210 mailto:sage [2008/03/12(水) 19:12:46 ] 監視しているアプリケーションがどれか終了したときだけ10回程度ループします、 秒間隔でループするのではないので、負荷は掛からないと思います。 >>217
233 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 19:13:30 ] >>231 多分なんかのイベント発生のタイミングで検証させたいとかじゃね? 常に回っている必要は確かにないかもね
234 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 21:25:15 ] 各プロセスハンドル毎に ThreadPool.RegisterWaitForSingleObject 使えばおしまいだとおもったけど・・・
235 名前:デフォルトの名無しさん [2008/03/13(木) 11:29:13 ] ちょっとおしえてください VB.NETでもC#でもなんですが・・・ private sub aaa() dim a as new class1 dim aa as new class1 call XXX(a,aa) end sub private sub XXX(byval B as class1 , byref BB as class1) B = nothing BB = nothing end sub private class1 public ABC as string end class このときに XXXを通過した後何故 変数aはNothingにならずに変数aaはNothingになるのかがわかりません。 オブジェクトなので両方参照っぽい動きになるのはわかるのですが・・・・ 片側はポインタのポインタみたいな動きになっているのが関連しているのでしょうか… 出来れば詳しくしえていただけると助かります。 よろしくお願いします。
236 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 11:46:57 ] ByRef だからとしか。 参照渡しで調べるといいよ。
237 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 11:58:36 ] >>236 レスありがとうございます。 普通の値型のIntegerとかの動作でなら ByValの時に変更できないByRefの時は直接変更される というのも納得できるのですが Objectのインスタンスを渡したときの動作がなんとなく違うと思うんです。 Objectを値型で渡し、渡した先でプロパティを変更すると渡したもとのプロパティも変更されているようになりますよね? 参照渡しでも同様だと思います。 ではなぜXXXで操作した結果が異なるのか・・・この場合 単純に参照渡しだから直接元の参照位置をNULLにする=渡した元のオブジェクト変数のメモリ参照がNULLになる としたら 値渡しの場合・・・・どうなるんでしょう?
238 名前:12 mailto:sage [2008/03/13(木) 12:01:38 ] >>235 逆に聞くが、お前が何故疑問に思うのか分からない。 関数を経由させずに考えるんだ。 dim a1, a2 as class1 a1 = new class1() a2 = a1 '現在のa1の参照を代入 a2 = nothing 'null参照を代入、つまりa2の参照するオブジェクトが変更されただけ このときa1の参照がNothingになったらおかしいだろ? 参照渡しのときは a1 = new class1 a1 = nothing こういう結果になっているだけだ。 おそらく次のケースと混同しているんだと思うが、 dim a1, a2 as integer() a1 = new integer() { 0, 1, 2, 3 } a2 = a1 a1(2) = 5 このときというのは、a1及びa2が参照しているものが一緒。 んで、その参照しているオブジェクト自体を変更している。 ゆえに当然どちらの参照もinteger() { 0, 1, 5, 3 } となる。
239 名前:238 mailto:sage [2008/03/13(木) 12:06:20 ] >>237 やっぱりそういうことか。 根本的なオブジェクトと参照という概念のとらえ方が違う。 オブジェクトの参照先を変更するのと、オブジェクトを変更するのとでは全く違うぞ。
240 名前:デフォルトの名無しさん [2008/03/13(木) 12:09:24 ] >>237 単純に、値渡しの場合 新たにインスタンスがその処理内で作成される、 と考えればよいのでは。 コンパイラーがそう作られている。と
241 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 12:15:38 ] >>238 あ〜!!!!! すっごい納得がいきました。 素人みたいな質問で申し訳なかったですが・・・ スッキリしたんで助かりました ありがとうございました。 PS.おっしゃる通り後者と混同してました
242 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 12:20:08 ] >>239 >>240 遅くなりましたがレスありがとうございます。 完璧に勘違いしてました すっごいお恥ずかしい話ですが…・
243 名前:デフォルトの名無しさん [2008/03/13(木) 12:39:19 ] > Objectを値型で渡し、 > 渡した先でプロパティを変更すると > 渡したもとのプロパティも変更されているようになりますよね? 出来たことに驚き・・; 知らなかった。 素人が変なこと書いてすみません<(_ _)> >>240 は無視して下さい。
244 名前:デフォルトの名無しさん [2008/03/13(木) 15:24:01 ] 引数のbyRef,byValの他にもこれが関係してるんじゃないの? www.microsoft.com/japan/msdn/net/vbnetref/vbnetref3-2.aspx
245 名前:243 [2008/03/13(木) 16:35:34 ] 横からすみません。 >>244 参考にさせていただきました。 そして、 www.microsoft.com/japan/msdn/net/vbnetref/vbnetref3-6.aspx#3-6-4 図 3-18 値型と参照型の引数 (配列の例ですが) 参照渡しの場合 呼び出し側で生成したインスタンス=ポインタ変数。 で、ポインタ変数そのもののアドレスが渡される。 値渡しの場合 ポインタ変数の中身(呼び出し元のインスタンスのアドレス)が渡される。 渡されたアドレスの入れ物はSub内に作られる。 そこで 参照渡しでも値渡しでも 呼び出し側で生成したインスタンスのアドレスを扱うことになるので どちらの場合でもインスタンスのメンバーを操作できる。 しかし 値渡しの場合、 Sub側では、呼び出し元のポインタ変数の内容、をクリアすることは出来ない。 という事で・・・ 余計な一言を追加します。すみません。<(_ _)>
246 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 18:50:20 ] .NETでは参照渡し(参照型の値渡しじゃなくてByRefの方)は滅多に使わない C#と違って呼び出し側から見分けがつきにくいし
247 名前:246 mailto:sage [2008/03/13(木) 19:02:25 ] 参照型の値渡しじゃなくて,参照型のオブジェクトへの参照の値渡し (ByVal a As Objectみたいなの)というべきか ややこしいなあ
248 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 19:11:50 ] >>246 C#も.NETなんですが・・・
249 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 19:15:03 ] c#にはoutってのがあってだなあ・・・ まあ調べれば分かると思うけど>>246 の言うとおりだよ
250 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 19:16:36 ] >>248 246の言う.NETはVB.NETの省略だろう。
251 名前:246 mailto:sage [2008/03/13(木) 20:16:06 ] いや.NET全般のことを指して言ったんだ。C#でもあまり使われないよ。 コピーが嫌なら構造体じゃなくてクラスを使えばいい。 それに加えて,VBでは呼び出し側から参照渡しなのか値渡しなのか見分けられない欠点がある。 (C#ではメソッドを呼び出すときに参照渡しの引数にはrefやoutをつける必要がある) Dictionary.TryGetValueみたいなのはあるけどあくまで例外。
252 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 20:53:59 ] >>246 の日本語が崩壊してる点
253 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 21:02:30 ] >>251 どういう根拠でそんなこと言っちゃってんのよ。 初級程度のコーディングなら参照渡しはあまり使われないのかもしれんが、 "構造化プログラミング"というものを突き詰めていくと、参照型の参照渡しが必要になることは結構ある。 単純なプログラムしか書いたことない人間には想像つかんのだろうね。 OOPを理解できている奴の自作ライブラリとかで、しばしば参照型の参照渡しを見ることがある。
254 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 21:25:59 ] それはちょっと信用できなさすぎる例ではないか
255 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 21:31:10 ] 中では必要に応じて使うけどライブラリで外に見せるのは格好悪い
256 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 21:48:55 ] >>253 むしろ「可読的コーディング」を突き詰めればそんなことは「したくない」と思うのが普通だろうし、 そもそも必要になることもまず無いと思うけどねw まあ確かに俺自身、「例外を起こす代わりに例外オブジェクトを返り値として返す」 といった場面でしばしば使ってるけど、メソッドの直感性を考えたらこんなことはしたくないのが本音。
257 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 07:43:14 ] まぁ、世の中にはガベージコレクションがない言語もあるわけで。
258 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 07:45:25 ] EVENTを自分で作る利点をWEBで調べたけどいまいち理解が難しい 管理が簡単になるってことかいな、関数を自分でつくってもやれそうなのに
259 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 08:02:29 ] そりゃ何か状態の変化を通知したいからだろう 利点とかの問題ではない
260 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 08:04:09 ] >>259 どうやって確認しますでしょか? コードでのデバッグでしかわからないですかね
261 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 08:09:21 ] ・・・? 確認ってなにを? 色々説明が足りてない気がするので詳しく
262 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 08:12:21 ] >>261 すません、 確認って言うのは状態の変化を確認するって言うことです 参考書とか見ても何かのイベント(たとえばClick)を実行して、それにつづけてRaiseEventを実行してるってのが多かったので
263 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 08:28:49 ] >>258 多分、というか確実に、それは「イベントを自作する利点」が分かってないのではなく、 イベントそのものの意義が分かってないだけだね。 イベントの実態は確かに相手のメソッドを呼び出しているに過ぎないわけだけど、 イベントの利点は、イベントを起こすオブジェクトのコードを書いている時点で 「相手」のことを知らなくていい点。 イベントをモーニングコールに例えるとして、 ホテルに就職した時点でモーニングコールの相手がプログラムされてるホテルマンは使えないでしょw モーニングコールを欲しい人自身が、ホテルマンの予定帳に自分の番号を「登録」できないと困る。
264 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 09:24:27 ] もっと具体的な例を挙げるとすると、モードレスダイアログなんかがいいか。 ShowDialogじゃなくてShowで表示するサブフォーム。IEの検索ダイアログみたいな。 モーダル(ShowDialog)なら入力文字列プロパティを用意しておけばShowDialog呼出し後に呼び出し元が勝手に取っていくけど、 モードレスの方は「検索」ボタンが押されたことを通知する必要がある。 このときにイベントを発生させる。SearchClickとかそんな感じの。 呼び出し元はこのSearchClickイベントで検索を開始する。
265 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 10:33:21 ] >確認って言うのは状態の変化を確認するって言うことです オブジェクト自身が自分の状態の変化を見て、イベントデリゲートを実行するんだよ。 オブジェクト外から変化を確認するってのはナンセンス。それイベントじゃないよ
266 名前:デフォルトの名無しさん [2008/03/14(金) 10:43:00 ] WindowsServer2003には.NETFramework2.0はプレインストールされて ましたっけ?(WindowsServer2008には確かにされているけど) でもFrameworkのインストール自体はMicrosoftUpdateとかで簡単に インストールされるからインストールの手間とか気にする必要はないのかね?
267 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 10:43:41 ] >>258 デリゲートの概念が全く分かっていないからだ。 つか、利点が分からないようならイベントを自作する必要に迫られていないということだから、 別に作らなくていいじゃん。 カスタムユーザーコントロールを自作するようになったときに、イベントデリゲートが必要になるときがくる。 OOPが分かってくるようになったらそのときには分かると思うから、今は気にしないことだな。
268 名前:12 mailto:sage [2008/03/14(金) 10:48:49 ] >>266 気にする必要なし。 うちの会社では俺がシステム管理者なんだが、HFSLIPでNFX20SP1と30SP1と35を 全部統合インストールするようにカスタマイズしているし。 そうじゃなくたってNFX20SP1のサイレントインストールパッケージを作っておいて それを実行させるだけならワンタッチでいけるっしょ。
269 名前:デフォルトの名無しさん [2008/03/14(金) 10:57:02 ] >>268 おお、サンキュウ!そういうものなのか。
270 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 11:46:41 ] イベントってデリゲートが隠されてるから余計分かりにくいんだよね 実体はデリゲート専用の特別なプロパティみたいなもの
271 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 12:38:23 ] >>270 そりゃおかしい。 そもそもイベントとデリゲートでは概念の抽象度が違う。 List(of T)って配列が隠されてるから余計分かりくいとか、 配列ってメモリ確保とポインタ操作が隠されてるから余計わかりにくいとか 普通は思わないでしょ。
272 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 12:46:08 ] >>264 それイベントの利点の説明になってないことないか?w イベントの利点は263にあるとおり、依存関係を逆転させされることだよ。
273 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 12:46:48 ] デリゲートとイベントの違いってフィールドとプロパティの違いみたいなもんだよ どのみちデリゲートの存在を意識しないといけないでしょ
274 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 16:11:43 ] deligateって、ただの引数の順列を定義しただけの「型」宣言だと腿ふんだが。
275 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 18:28:00 ] >>273 だから抽象度が違うってw イベントはデリゲートを「利用」してるだけで概念的には全く別物。 メソッドは内部で変数を使ってるから変数みたいなものだ、というぐらいトンチンカンな 物言いだぞそれ。 っていうかイベント使うときにデリゲート意識するかよ。 少なくとも意識「しないといけない」か?
276 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 18:30:09 ] C#だとデリゲート型は意識しないといけないな 匿名メソッドや型推論で緩和されたが VBだとHandlesがあるから意識度は一段低い
277 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 18:33:14 ] >>275 AddHandlerとかAddressOfとか使うんだからデリゲート意識するだろ普通。 あ、そうですか。イベントハンドラ作成のときは全てIDEに任せる初心者でしたか、失礼しました。
278 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 18:46:33 ] >>277 だからそれは「使ってる」だけでしょ。 Integerを引数にとるメソッド呼び出しを書くときに君は「Integerの存在を意識する」の?w まあ言葉遣いの問題かもしれんが、 普通「意識」っていう言葉はそういう場面で使わないだろう。
279 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 19:11:27 ] イベントを自分で作るときの話だろ 使う分には理解してなくてもいいけど作るなら仕組みをきちんと理解しないと Public Event MyEvent As EventHandler これだけ見たら「イベントはデリゲート型のPublicフィールドなんだ」と誤解しそう
280 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 19:15:27 ] >>279 作るときは尚更意識しないと思うけどね。 カスタムイベントのことをいってるのなら同意するけども。
281 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 19:15:57 ] Public Event MyEvent(sender As Object, e As EventArgs) なら?
282 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 19:18:39 ] 今まであまりイベント作成時にデリゲート意識してなかった者なんですが、 イベントでデリゲート使ってるってことは、共通のリソースに対してイベントを 発生させた場合には競合状態も発生しうるっていう認識でよろしい? 危なそうならSynLockあたりかけておくのが基本なんですかね?
283 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 19:21:59 ] >>278 >イベントはデリゲートを「利用」してるだけで概念的には全く別物。 VB脳の恐ろしさが分かる発言だな。 お前が何と言おうとイベントの実体はデリゲート。 「デリゲートを利用してるだけ」なんて発言からレベルの低さが見て取れる。 お前がデリゲートを意識しないでもイベントを扱えてるからといって、嘘を言ってはいかんよ。
284 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 19:23:44 ] イベントハンドラ(デリゲートの呼び出し対象)は通常はそれを呼び出したスレッドで実行されるよ カスタムイベントアクセサ使ったイベントを一度自分で作ってみたら イベントとデリゲートの関係は完璧に理解できるからやってみるといいよ
285 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 19:27:59 ] >>283 自分の無知と無分別を自覚できない君は幸せでいいね VB脳ってお前のことじゃんw というか、別の概念だから別の名前が与えられているんだけどね。 まあ君は抽象化ということの意味が分からないのだろう。
286 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 19:39:52 ] イベントはデリゲートを登録解除する機能 だけどまあ根本的な概念の方が重要だわな
287 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 19:40:45 ] デリゲート型のpublicフィールドを使ってもイベントは実現できそうだけど それだとクラス外から好き勝手に書き換えたりできちゃうから イベントハンドラを追加するメソッドや削除するメソッド(アクセサ)を使って仲介して 直接デリゲートに触らせないようにするんだよ それらのアクセサをひとまとめにしたのがイベント コンパイラがデリゲート型の変数やアクセサを自動生成してる
288 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 19:44:54 ] >>285 涙目wwww
289 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 19:54:32 ] まあ正直いうとイベントとデリゲートの区別がつかない人の気持ちは一応わかる 俺も最初そうだったから。 そういう人は抽象化という発想が理解できてないこと以上に、 イベント以外のデリゲートの用途が想像できないんだろうな多分。 そういう人は匿名メソッドでも理解すれば自分の勘違いに気がつくんじゃないのかな。
290 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 19:58:24 ] 抽象化は抽象化でもカプセル化と言ったほうが適切
291 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 20:05:29 ] graphicsつかって線引いたりしたのがウィンドウサイズとか変えると消えるのって そのたび書き直さなきゃいけないの?
292 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 20:06:55 ] うん それが嫌ならBitmapに描いてPictureBoxにでも入れとけ
293 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 20:22:35 ] >>289 カプセル化くらいで何を偉そうに。 カプセル化なんぞOOPの基本だろうが。 自分が中級プログラマだと勘違いしているやつの典型的口調だな。 最近匿名メソッドを覚えたことでちょっと優越感を覚えている感じかw
294 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 20:29:48 ] ふーん偉そうに他人を「偉そうだ」と言うのは偉そうじゃないんだ。 本当馬鹿ってのはどうしていつでも自分自身の言葉を自分に適用できないんざんしょ不思議。 まあ基本であることに全然異議はないんだけど、その基本すら理解できない御仁がいらっしゃるから 「偉そうに」貴殿はまちがっておられるぞよ、と進言差し上げたしだいなんでございますがね。
295 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 20:37:12 ] >>289 随分必死だなお前。 msdn.microsoft.com/library/ja/default.asp?url=/library/ja/cpref/html/frlrfsystemwebuiwebcontrolsbuttonclassclicktopic.asp msdn.microsoft.com/library/ja/default.asp?url=/library/ja/cpref/html/frlrfsystemeventhandlerclasstopic.asp どうみてもデリゲートです。本当にありがとうございました。 「全く違う概念」とか「デリゲートを利用してるだけ」とかいうから突っ込まれるんだよ。 >>283 の言っていることは正しい。 定義を読んでみると間違いなく実体はデリゲートだな。 要するに外部からは追加削除を許可して、自由に呼び出したりできないように制限されたデリゲートなんだよ。 まあ目的がカプセル化だということは知っていたみたいだが、「全く違う概念」という発言は明らかに間違い。
296 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 20:38:56 ] >>294 涙目で逃走wwww
297 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 20:48:10 ] Public Custom Event MyEvent As EventHandler AddHandler(handler As EventHandler) End AddHandler RemoveHandler(handler As EventHandler) End RemoveHandler RaiseEvent(sender As Object, e As EventArgs) Console.WriteLine("イベント発生") End RaiseEvent End Event やろうと思えばこういうこともできるが // 意味があるかどうかは別
298 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 20:48:51 ] >>295 まあ馬鹿がそう思いたいなら思うのは止めんよ別に。 好きにすれば? まともなプログラマで君の意見に同調する人間がいるとは絶対に思えないけどw 本当に馬鹿だな。 カプセル化が基本とか言ってる割に物事を抽象化・概念化するってことの意味が全然わかってないじゃんw
299 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 20:50:20 ] >>295 まあそういうことだな。 ただカプセル化されただけのデリゲートとそうでないデリゲートを ”根本的に違う概念”と言っちゃったのが間違いだったな。 public readonly Str as string public str as string この二つを全く違うと言っているようなもんだ。 どっちもStringには変わりない。 これと同様に、event修飾子があるかないかだけで実体はデリゲートには変わりないよな。
300 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 20:51:46 ] 引っ込みが付かなくなって発狂している>>298 がいると聞いて飛んできました。
301 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 20:53:08 ] >>298 完全に日本語が崩壊してるなw
302 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 20:53:31 ] >>298 の人気に嫉妬
303 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 20:54:18 ] >>299 君もアホだなあ。。 イベントが「デリゲート」を使って実現されいるということと、 イベントという概念が何を意味しているかは全然別の問題。 だから前にも書いたが、配列の「実体」はメモリ確保とポインタ操作だが、 「配列」という概念はポインタという概念とイコールなのかよって 馬鹿な奴ってのはこういう抽象的思考ができないから馬鹿なんだよね。
304 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 20:56:14 ] もっと低レベルなたとえが必要かもしれんね。 車の機能はエンジンを使って実現されているが、「自動車」という概念と 「エンジン」という概念はイコールなの?
305 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 20:56:15 ] >>303 巛ミヾヾ \ / ミ ヽ f, ミ } ┏v'┳_━━━ r、 | yバノ゙’' ̄ ''' } }゙ } ‘ーj`' : // / L_ヽ i V / (" ` ! _/ \ _,. -‐ '  ̄ !_ /|~ /  ̄ \ ヒッシ・ダナー [Hissy Danner] (1901〜1997 イギリス)
306 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 20:59:03 ] そういうのは人に「必死だな」と言われれば傷ついちゃう弱っちい自分を語ってるだけだと思うよw 必死だったら何?
307 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 21:01:34 ] >>303 何"イベントという概念"ってwwww PGならイベントといったらEventHandler<T>のことを指すもんだと思っていたが・・・ VB脳恐るべし。