[表示 : 全て 最新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くらいまでの間にある予定

152 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 00:51:42 ]
>>151
情報が足りないからなんともいえんな。
フォーム内のコントロールの種類とか、Designer.vbをいじってないかとか、
継承コントロールを使ったりしてないかとか。

それすらも書けないようなやつはプログラミングやめとけ。
向いてないから。

153 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 01:18:49 ]
>>151
それってVB.NETの頃からの致命的なエラーだよ。
2008になっても修正されていないと聞く。

154 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 09:15:37 ]
VB.NET 2003なのだが
画面をロードしたときにフォーカスの設定をしたいのだがやり方が解らない。

Me.ActiveControl = Me.フォーカスを移したいコントロール名.Focus

をやろうとしても、「Me.」の後に「ActiveControl」が出ない
無視して入れたとしてもエラーになる
だれか解る方いらっしゃいます?

155 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 09:27:37 ]
Me.フォーカスを移したいコントロール名.Focus
だけじゃだめかい?

156 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 09:35:30 ]
>>151
経験ある。その時はデザイナ系触ってなくてロジック層のクラスを触ってただけなのにフォームに表示を戻しただけでそうなったんだよな。
どうにもならなかったら新しいプロジェクトを作成して、そこに元のファイルを順に追加するしかないのかな?

>>154
Call Me.フォーカスを移したいコントロール名.Focus()
でいけると思う。

157 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 09:41:22 ]
>>156
「フォーカスを移したいコントロール名」の後にfocusが出てこない。
無理やり入れたとしてもエラーになる

使えないのかな

158 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 09:44:56 ]
>>157
そのコントロールはなんですか?

159 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 09:52:48 ]
>>157
ボタンです

バージョンが古いからできないのかなって思った
version.7.1.6030です


160 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 10:07:24 ]
そのバージョンのボタンが見つからない、
VB.Net 2008だけど、バージョンは全部2.0になってる



161 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 10:11:03 ]
>>159
2003のリファレンス
ttp://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/cpref/html/frlrfsystemwindowsformsbuttonmemberstopic.asp
Focus メソッドはあるけど、バージョン情報までは分からんな。

162 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 10:15:08 ]
フレームワークは
framework 1.1 バージョン1.1.4322 SP1
です

バージョンの問題か・・・。



163 名前:デフォルトの名無しさん [2008/03/05(水) 19:17:16 ]
LINQに挑戦してるんだけど、SqlClientやレコードセット使ってやってたことを実現するのに一苦労です。
まだ時期尚早でしょうか。というかこれから流行るのでしょうか。

164 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 22:35:41 ]
LINQの目玉はデータベースじゃなくてコレクション操作

165 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 23:18:19 ]
>>151
こんなの日常茶飯事だよ
フォームを継承していると多いような気がする
たいていの場合はビルドして再表示で直るけどね

直らない場合はdesignerを修正しちゃう
修正しちゃうから日常茶飯事なのかもしれないがw

166 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 23:29:41 ]
日常茶飯事ってこともないけどね。
前にも書いたと思うけど、GUI部品は別のプロジェクトにしとけばまず起こらないわけで。

167 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 00:13:12 ]
>>163
一般論として、ver1はバグがたくさんあるとか、次ので仕様変更が、とか
あるので、今すぐやる必要がなければ、やらなくていいと思う。

168 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 00:39:23 ]
>>164
>>167
なるほど、今無理してやる必要もないですね。
変態SQLいじってるみたいで面白いんだけど、細かい部分が良くわからない。

169 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 01:25:55 ]
VB.NETもC#スレのように初心者スレほすいなぁ

170 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 10:14:51 ]
いまXMLファイルの書き出しをしているんですが、
10個の設定を書き出すのにシリアル化するべきか、
ドキュメントからXMLへの変換で書き出すか迷っています。

速度的にドキュメント変換の方が断然処理が早いですし、
コードも書きやすいです、

どっちにするべきですか?



171 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 11:44:51 ]
>>169
君が立てて告知

172 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 18:09:45 ]
>>170

どっちでも好きな方で
設定を格納するための型が既にあるとか値の型が色々あって面倒とかならシリアライズ

173 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 20:25:32 ]
シリアル化を挫折してしまったので
(見えない格納は意味不明w)
ドキュメント変換にしました

で、また問題にぶち当たったんですが
XMLファイルの要素を指定して、その要素のテキストを読み込むにはどのようにしたらいいのでしょうか?

<?xml version="1.0"?>
<Microg_Windows_Vista_UAC_RELEASED>
<UAC項目>
<UAC_Number_0>
<Message>OFF</Message>
<AD>TEST</AD>
</UAC_Number_0>
</UAC項目>
</Microg_Windows_Vista_UAC_RELEASED>

このようなXMLファイルの場合、<UAC_Number_0>の<Message>のテキスト「OFF」のみを読み込みたいんですが、
xmlRoot.ChildNodes(0).InnerText
のようにしてしまうと、OFFTESTになってしまって<Message>のテキストと混ざってしまいまいます。

174 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 21:34:16 ]
ノード辿ってけば良いじゃん
SelectSingleNode で XPath でもいいけど

175 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 22:07:27 ]
辿りかたがちょっとわからなくて・・・

xmlDoc.Load(XMLファイルパス)
Dim xmlRoot As XmlElement = xmlDoc.DocumentElement
msgbox(xmlRoot.SelectSingleNode("//UAC_Number_0/Message").Value)

としたんですがうまくいきませんでした。
(エラーではなく空白NULLが返ってくる)

XPathが間違っているのか、構文が間違っているのか全くわからない状態です。
何度もすいません。

176 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 22:15:26 ]
SelectSingleNode が XmlNode を返すのは分かるよな?
Value プロパティをヘルプで調べてみ

177 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 22:29:17 ]
エクセルのすぷれっと見たいにテキストが出てくる物だと思ってました。
(xmlRoot.SelectSingleNode("//UAC_Number_0/Message/text()").Value)
これで何とか「OFF」のみ排出されているので成功したと思います。
ありがとうございました!

178 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 14:07:32 ]
悪いこと言わんからシリアライズにしとけ…

179 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 14:10:00 ]
プリコンパイルしとけばXmlSerializerはヘタに自分でやるより速いよ

180 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 15:25:13 ]
VB.NETでデバイスドライバは書けますでしょうか



181 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 16:56:18 ]
>>180
宿題やったらしょんべんして寝ちまえ

182 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 18:59:47 ]
>>180
簡単に書けるけどお前には無理


183 名前:デフォルトの名無しさん [2008/03/07(金) 21:38:55 ]
>>181-182
自演乙

184 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 21:42:24 ]
www.xlsoft.com/jp/products/windriver/products-wdcypress.html

185 名前:デフォルトの名無しさん [2008/03/08(土) 13:37:09 ]
www.geocities.jp/tor_park/Dlang/byte.html

186 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 13:45:26 ]
コピペ君って馬鹿だな、まで読んだ。

187 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 17:17:56 ]
WebBrowserで選択状態にする方法、または選択状態を取得する方法がわかりません。
私のほうで引き続き調べていますが、ご存知な方がいらっしゃいましたら、教えていただけると助かります。

よろしくお願いいたします。

188 名前:187 mailto:sage [2008/03/08(土) 17:18:44 ]
追記ですが、
選択状態とは、Webページ内の文字列の選択状態ということです。

189 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 17:20:14 ]
WebBrowserで選択状態
だけでも結構Googleに引っかかるようだが

190 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 18:30:21 ]
ようするにDOMじゃん



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の日本語が崩壊してる点







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

前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