[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 2chのread.cgiへ]
Update time : 08/15 18:53 / Filesize : 174 KB / Number-of Response : 620
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

VB.NET質問スレ(Part25)



1 名前:デフォルトの名無しさん [2008/02/22(金) 12:14:02 ]
前スレ

VB.NET質問スレ(Part24)
pc11.2ch.net/test/read.cgi/tech/1197507828/

テンプレは2〜5くらいまでの間にある予定

191 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 18:45:20 ]
       ∧ル∧
 ニ= ,, _/-@∀@)__
    〈ヘ_|i    Θ) ノ   ,,   ∧NY∧
  ̄=圧|__|ニ(二二(,ニニニ(二(),, _/-@∀@)__
 ニニ= ゝ9コア/ {ジ、  ~ .〈ヘ_|i     Θ) ノ   ,,  ∧朝∧ < オオニシ! フィリップ!
 =‐ ̄-=;/____|_|_〉   圧|__|ニ(二二(,ニニニ(二()_/-@∀@)__ ジェット・ストリーム・アタックをかけるぞ!
  ( ⌒ヾ,,〉几〈  〉0卩    ゝ9コア/ {ジ、   〈ヘ_|i     Θ) ノ   ,,
 (⌒ヾ,,γ/[]ヘ,)r'__/ヾヽ、 -=;;/____|_|_〉   圧|__|ニ(二二(,ニニニ(二()
   ̄ ̄  ̄ ̄   ̄ ̄ ̄(⌒ヾ,,〉几〈  〉0卩    ゝ9コア/ {ジ、   ~
             (⌒ヾ,,γ/[]ヘ,)r'__/ヾヽ、 -=;;/____|_|_〉
              ̄ ̄  ̄ ̄   ̄ ̄ ̄(⌒ヾ,,〉几〈  〉0卩
                         (⌒ヾ,,γ/[]ヘ,)r'__/ヾヽ、

192 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 01:16:58 ]
messagebox.show()と、msgbox()は、同じ動きをしますが、どのように違うのでしょうか?

193 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 01:21:22 ]
d.hatena.ne.jp/non_tak/20071029/1193657718#c1193658482

194 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 08:08:21 ]
>>193
さんくすこ

195 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 18:11:56 ]
アプリケーションの「軽い」「重い」は処理以外に「ソフト自体の容量」も関わりますか?
たとえば、フォームロードでは何も行わない「1000KBの*.exe」と「100KBの*exe」にはメモリ使用率などの違いがでるんでしょうか

196 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 18:31:53 ]
フォームに3つくらいタブ付けてそれぞれに40個くらいツリーボックス付けてみ
ソフト自体の容量はあまり無いが起動に1〜2分くらい掛かる

容量で重くなるって事はあることはあるな


197 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 21:27:41 ]
なんとなくわかったような気がしますw
ありがとうございました。m(_ _)m

198 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 00:34:34 ]
多分木を視覚的に表現するにはどうしたらいいの?

199 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 01:26:31 ]
Console.WriteLineの書式文字列の詳細な仕様はどこに載ってるのか。
標準入力はConsole.ReadLine(とRead)か。
数値を入力する手段は、まず文字列として代入してから、数値に変換する
しかないのかな。



200 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 01:34:19 ]
>>199
MSDN

201 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 01:46:49 ]
>>199
なに言ってのかわかんね

202 名前:sage mailto:sage [2008/03/11(火) 03:42:57 ]
>>199
キーボードから文字でなく、数値を入力してみろよ

203 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 06:36:47 ]
>>201 >>202
何でお前らは頭が狂ってるのか

204 名前:12 mailto:sage [2008/03/11(火) 10:59:07 ]
>>203

>>202は只の突っ込みだろ?
条件反射レス恥ずかしいぞw
プログラミングの前に読解力を鍛えろ。

205 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 12:05:49 ]
>>199
msdn2.microsoft.com/ja-jp/library/txafckwd(VS.80).aspx
msdn2.microsoft.com/ja-jp/library/427bttx3(VS.80).aspx

Stringから変換するのではなく直接数値型として読み取る方法はないのかという意味だろ
ない。

206 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 15:34:48 ]
起動されたアプリケーションを判断したいのですが、
プロセスのネイティブハンドルで判断するのは妥当でしょうか?

Dim hProcess As System.Diagnostics.Process
System.Diagnostics.Process.Start("メモ帳")

のとき

hProcess.Handle.ToStringで取ってきた整数で比較する方法で正確に判断できますか?

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つかって線引いたりしたのがウィンドウサイズとか変えると消えるのって
そのたび書き直さなきゃいけないの?






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<174KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef