VB.NET質問スレ(Part33)

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2010/04/11(日) 02:42:18
例えばフォーカスがあたった場合に、テキストを全選択状態にする、というよくある動作をさせたかったとする。

お前はどう実装するんだ?
Formに直接そういうコードを書くのか?
継承してカスタムコントロールにするのか?

俺はそんなことはしない。
953デフォルトの名無しさん:2010/04/11(日) 02:45:41
ユーティリティ的な機能を、それ用のクラスを作るか、元のクラスを拡張するかなんて
設計の方針の問題で、やりたいように実装すればいいだけの話
システム規模とか全体の設計とか作成する技術者のスキルとか考慮しないでどっちがいいとか
そんな話はただの宗教論だ

まあ、とかく他人のやり方が自分と違うと許せない人が多いんだな
これ以上は別にスレ立てるかなんかしてやってくれ
954デフォルトの名無しさん:2010/04/11(日) 03:41:19
>>911,に言え。
955デフォルトの名無しさん:2010/04/11(日) 05:52:20
>>952
どうするの?
956924:2010/04/11(日) 06:31:56
>>941
ありがとうございます。
実はそれも試したのですが、必要の無いListViewをVisible=Falseに
設定してもその場所に空間ができて画面が不恰好になってしまうのです。

957デフォルトの名無しさん:2010/04/11(日) 11:35:18
>>956
今試せないが、それはhtmlのスタイルの問題だと思うが
少なくとも今までのコントロールはVisble=Falseだとそこには何もレンダリングしない
だからその後ろの要素をちゃんと詰めるように指定しておけば空間が開いたりしないはず
958デフォルトの名無しさん:2010/04/11(日) 12:03:02
>>948
えーっと、まず前提として変なアプリを作るがそこは否定するなよ。あくまで一例だからな(俺が昔気が触れて作ったものだ)
operaのようなMDIのブラウザを作るときに、どうしてもあれをtextboxで実現したい!
という時に、ユーティリティー的な操作+継承をすれば解決。
継承はtextboxクラスにURL(string)や前回更新時間(date)などを登録してた気がする。
ユーティリティー的な操作を具体的に言うと、まずArrayListにtextboxをaddする。Dim vu As New ArrayListとする。
そして必要に応じて For Each xxxxx In vuのようにし、ブラウザ替わりのtextboxだけに処理させるというもの
場合によっては必要な人もいるんじゃないか
959デフォルトの名無しさん:2010/04/11(日) 12:05:43
なんだよアレって。
960デフォルトの名無しさん:2010/04/11(日) 12:07:52
それはユーティリティとは言わん
アプリケーションの本質的な動作じゃないか
961デフォルトの名無しさん:2010/04/11(日) 12:11:00
>>949
アセンブラでおk
962デフォルトの名無しさん:2010/04/11(日) 12:32:47
>>958
継承使う必要ない
TextBoxやURLや前回更新時間を保持するクラスを作るほうが素直
963デフォルトの名無しさん:2010/04/11(日) 13:19:02
>>952
そんなのはカスタムコントロールにするのが第一選択で、次がFormにベタに書く方法。
そんなものを実現するために別のクラスにTextBoxの参照を渡す、などは愚の骨頂だと思う。

一体どこに自分も自分の所有者でもない第三者を登場させて話を複雑にさせる合理性があるのかさっぱりわからない。
君は根本的にOOP的な思考ができないんじゃないの?

>>958
言ってる意味がわからない。
どうしてTextBoxの所有者であるMDI子ウィンドウではなく、それとは別にTextBoxだけを
集約したオブジェクトを用意する必要があるのか。
964デフォルトの名無しさん:2010/04/11(日) 13:27:20
>>953
そういう考え方してるといつまでたっても大きなプログラムが書けるようにならないよ。

コントロールにちょっとした付加機能を付け加えるだけの訳のわからんクラスが
登場するようなアホなコードなんか、規模が大きくなると書いてる本人だって
訳がわからなくなる。

「えーとこのTextBoxは一体全体どうしてこんな振る舞いをするんだ?」と
思っても、TextBoxはカスタムコントロールでもなければ、所有者(Form)がイベントを
捕捉して制御してるわけでもないんだから。

その振る舞いを解明するには、そのTextBoxの参照を握ってる別のオブジェクトによって実現されているんだ、
ということを発見する必要がある。

そんなパズルみたいなコード読んでられっかよここのお馬鹿さんどもは。
965デフォルトの名無しさん:2010/04/11(日) 13:39:31
はいはい。お前さんの言うとおりですよ。
すごいですね。
966デフォルトの名無しさん:2010/04/11(日) 13:47:52
>>964
昨日から見てるけどさ
いい加減鬱陶しい
そろそろ、よそでやれ
ここはVBスレで皆まったりやって来てんだよ
上から目線で俺スゲーしたいならC#スレでも行って思う存分暴れてこい
967デフォルトの名無しさん:2010/04/11(日) 13:52:13
>>966
なんで「論争」の片方の当事者だけにそういうこと言うわけ?
まあ、騙るに落ちてるなw
968デフォルトの名無しさん:2010/04/11(日) 13:56:55
>>967
>> 910くらいから読み直して来い
どいつが原因なのか良く分かるから
969デフォルトの名無しさん:2010/04/11(日) 14:11:07
じゃ、どっちもいい加減にしろ。

これでいいな。
970デフォルトの名無しさん:2010/04/11(日) 14:12:41
何かアホが勘違いしてるみたいなので白状しておくけど
>>919,926,966,968 が俺

昨日パチンコ行く前にくだらねぇレス付け合ってる奴らがいるなぁと思って
それで、負けて帰って来たら、まだやってんのかよ
で、今日になってもまだやってるしよ

いいかVBスレはな
> クラスってなんですか〜?
> インスタンスってどうやって使うの?
こうゆうまったりした流れなんだよ

これからまたパチンコだ
帰って来るまでには、いつもの流れになってる事を期待する!
971953:2010/04/11(日) 14:19:48
俺が大きなプログラム書けるかどうかは大きなお世話です
これ以上やりたいならよそでやってください

OOPの設計に関して議論するスレでも立てたら?
そこでならある程度お前の意見に同意してやるが

多人数のプログラマでシステム作成してるときに交じってほしくないタイプだな
972デフォルトの名無しさん:2010/04/11(日) 15:38:51
パチするよりコーディングしてろよw
せっかくの休みなのに朝鮮ゲームとかw
973デフォルトの名無しさん:2010/04/11(日) 17:31:19
キムチくさ・・
974デフォルトの名無しさん:2010/04/11(日) 17:44:09
>>970
あなたは配列やカプセル化などちゃんと使ってますか?
975デフォルトの名無しさん:2010/04/11(日) 19:08:23
配列とカプセル化ってまた微妙な取り合わせだな…
976デフォルトの名無しさん:2010/04/11(日) 19:35:31
俺が読んだ入門書にはセットで教えられたわけだが
977デフォルトの名無しさん:2010/04/11(日) 19:36:47
クラス内部の配列をプロパティで直接公開するとカプセル化崩壊だよ
978デフォルトの名無しさん:2010/04/11(日) 19:41:42
質問です。
オブジェクトの開放にはNothingを代入するって聞いたのてすが、
明示的にNothingを入れなくても、参照している変数がなければ、
ガベージコレクタが、適当なタイミングで開放してくれますか?

' あまり良い例ではありませんが
Dim A As Object = New myClass1
… ' 何らかの操作
A = Nothing ' ← 必要ですか?
A = New myClass2
… ' 何らかの操作
A = Nothing
979デフォルトの名無しさん:2010/04/11(日) 19:44:03
>>978
>オブジェクトの開放にはNothingを代入する
そもそもこれが間違ってます
.NETではNothingを代入するのはほとんどの場合意味がありません
使わなくなったらほっとけばGCに回収されます
980デフォルトの名無しさん:2010/04/11(日) 19:51:06
> .NETではNothingを代入するのはほとんどの場合意味がありません

どういう場合で意味があるんですか?
981978:2010/04/11(日) 19:52:57
>>979
ありがとうございます。
つまり、参照元がなくなったオブジェクトは、
適当なタイミングでGCに回収されるから、
参照が終わったらNothingを代入するとかは必要ないんですね。
982デフォルトの名無しさん:2010/04/11(日) 19:54:31
>>980
インスタンスAがフィールドとしてインスタンスBへの参照を持ってて
Aはまだ使うけどBはもういらない場合、Nothingを代入すればBをGC対象にできる
983デフォルトの名無しさん:2010/04/11(日) 20:01:30
忘れちゃうから、常にNothingするようにしとこーっと。
984デフォルトの名無しさん:2010/04/11(日) 20:09:28
それがいらないのがVBのいいとこなのに・・
985デフォルトの名無しさん:2010/04/11(日) 20:10:44
>>980
VB的には、WithEvents付きの変数の場合は特に意味があるね。

というか、FormのフィールドをWithEvents付きにした場合でかつ
イベントハンドラでForm上のコントロールを弄ってる場合は(ほとんどの場合そうだと思うけど)
FormClosedとかでNothing入れておかないとまずいケースもある。
986デフォルトの名無しさん:2010/04/11(日) 20:41:26
どうまずいの?
ほとんどの場合、イベントハンドラはフォームのメソッドだろうし。
どっちかっていうとほとんどの場合はまずくないと思うが…
987デフォルトの名無しさん:2010/04/11(日) 20:44:23
まあ、イベントハンドラの登録が盲点になりやすいのは同意するけどね。
現実にはそれで引っかかることって、普通に作ってればあまりないような気もするのよね。
988デフォルトの名無しさん:2010/04/11(日) 20:50:47
>>985
普通はフォームとコントロールの寿命は一致するから問題ない
989デフォルトの名無しさん:2010/04/11(日) 21:00:17
>>988
それは.NETの世界ではその通りなんだが、
コントロールみたいにWin32の世界ではそうじゃない。

現実問題、ハンドルが破棄されたコントロールを操作することになって例外が発生する場合がある。
990デフォルトの名無しさん:2010/04/11(日) 21:04:56
イベントハンドラとGCの関係で一番注意が必要なのは
Sharedイベントに登録したイベントハンドラの外し忘れ
参照を掴みっぱなしになるからNothingを代入しようが関係なく確実にメモリリークする
991デフォルトの名無しさん:2010/04/11(日) 21:14:24
>>989
でもさ、フォームを閉じた後に、ハンドルが必要になるような操作を行うようなイベントが発行されるような操作を、
コントロールに対して行うことって普通あるかな?
そして、あったとして、それはコントロールにNothngを代入することでかいけつするような問題かな?
ってとこなんだよね。
むしろ問題があるなら、ハンドラ側で調整すべきな気もする。
992デフォルトの名無しさん:2010/04/11(日) 21:19:43
>>990
それさ、確かに盲点的で気づきにくいのは確かなんだけどさ、
そこで問題になるほどリークが発生するような状態になることって
少ないと思うんだよね。

まず、静的イベントに大量に登録するのは、普通に組んでてやることって少ないと思うんだよね。
んで、イベントに登録するのは多くないけど、その登録される一個のオブジェクトが巨大だとか、
そういうことはあり得るけども、大量データを持ちつつ静的イベントに登録するなんてのは、
元々寿命が長いオブジェクトな事が多い気がするんだよね。

となると、後は大量データとかをメンバに保持しながら、静的イベントに登録して、
すぐに不要になるオブジェクトとかなんだけど、そういうのって普通に作ってるとあまりない気がする。
993デフォルトの名無しさん:2010/04/11(日) 21:31:18
>>964
拡張プロバイダとかならそんなことにはならないよってかならないように作るわな、当たり前。

ToolTipが表示されたとき、このテキストボックスはなんでこんな動作をするんだ、
カスタムコントロールでもないのに、どこで制御してるんだ、発見できない、なんてことにはならないだろ?

まあ全選択状態にするとかはテキストボックス系のコントロールに限った話になるが、
要はいろんなコントロールに対して横断的な処理を行いたいとき、コントロールを拡張するって方法だと、
使うコントロールをみんな拡張する必要がある、そんなのはあまり好ましくないってこともある。
拡張した各コントロールでそれぞれそういう処理を書くことになるんだぜ?
だってまとめてどっかに書いたら、それはつまりユーティリティ的な機能を作るってことだからな、それはだめなんだろ?
994デフォルトの名無しさん:2010/04/11(日) 21:34:26
ともかく、横断的な観点で何らかの処理を行いたいとき、
クラスを拡張して各クラスに書くってのは、もはや一般的にもあまり推奨されないやり方になってる。
995デフォルトの名無しさん:2010/04/11(日) 21:37:25
>>992
静的イベントに限らないよ
メインフォームにサブフォームのイベントハンドラを登録したりすれば同じ
996デフォルトの名無しさん:2010/04/11(日) 21:41:29
まあ静的イベントの話で書いたんで。

>メインフォームにサブフォームのイベントハンドラを登録したりすれば同じ
これも確かにそうなんだけど、普通気づくんじゃないかなって気がする。
いや、気づかんかなー
997デフォルトの名無しさん:2010/04/11(日) 21:43:17
WPFだとWeakEventパターンの登場だな。
998デフォルトの名無しさん:2010/04/11(日) 21:50:18
.NETリリースする最初に気づいてればよかったのにな、WeakEventの必要性。
999デフォルトの名無しさん:2010/04/11(日) 21:50:33
ちゃんとGCとイベントの仕組みを理解してないとわからないだろうな
わかってなくても一つ覚えでこうすれば問題無いというような話じゃないんで
1000デフォルトの名無しさん:2010/04/11(日) 21:50:33
要するにデータベースの操作でOpenしたものを必ずCloseしろってのと同じで、
イベントハンドラも追加したら必ず削除しろってことでOK?
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。