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