VBプログラマ質問スレ(Ver.6.0 まで) part56 >>950 > たぶん、Form2では最後にVisible=Falseで消してるんだね
> で、次にForm2をShowした時にLoadイベントが発生しないもんだから強制的にNewしてるに違いない
それはあなたの想像でしょう?
この文脈では、Form2をshow(load, unload)することはないよ。
showするのはForm2から作られたhogeインスタンス。
withを使っているから、実際には書かれてないけど。
>>950 は、クラスとインスタンス
newとloadの区別が付いてないね。
954 :
デフォルトの名無しさん :2011/04/23(土) 15:12:18.92
>>952 そう、想像なんだけど、
Form2は参照しただけでインスタンスが作成されるのに、なぜわざわNewしてるのかという点。
それはForm2を使い終わった後でUnLoadしてないから(想像)
そうすると次にボタンを押した時にNewがないとForm2は表示するけど実行させたいLoadイベントが発生しない
で、メモリ不足を危惧したけどVBはシングルタスクだから
UnLoadせずに、何回インスタンスを作成しようが新たにメモリは食わないと
955 :
デフォルトの名無しさん :2011/04/23(土) 15:16:35.67
956 :
デフォルトの名無しさん :2011/04/23(土) 15:45:24.10
今やってみた >UnLoadせずに、何回インスタンスを作成しようが新たにメモリは食わないと これは訂正 いくつでもインスタンスは作成されちゃうよ で、振り出しに戻るけど hoge.Show vbModal で実行が戻って来るのは、hogeをUnLoadするかVisible=Falseした場合。 hogeを毎回Newしてるのはhoge.Visible=Falseにして戻ってくるからに違いない なら、ボタンを押すごとにhogeの新たなインスタンスが作成されてメモリ不足になるだろう (Newしなければ新たなインスタンスは作成されない)
957 :
デフォルトの名無しさん :2011/04/23(土) 15:51:27.64
すまん訂正 故意にhogeを複数出したいという意図なら問題ないや
ModelessなForm2のインスタンスが別に存在して Newして別のForm2のインスタンスが欲しいとか?
> hogeを毎回Newしてるのはhoge.Visible=Falseにして戻ってくるからに違いない だからなんで決め付けるのさ? Form2のインスタンス側でフォーム閉じたかForm2にあるボタンで Unload meしているかもしれんだろ。というかそっちの方が自然。 vbModalなんだから、何度もForm2がつくられることはない。 (つくろうと思えば可能がだ、自然な作り方ではない) だからメモリ不足にもならない。 new使ってるのは、Form2が閉じられたらメモリを解放したいからとか ボタンをおすたびにForm2を完全に0から作りたいからだろ。 (initializeで何かの初期化をしたい) それに複数インスタンスを生成することも可能。 使用するときに毎回newして要らなくなったら完全になくなるほうが 柔軟で自然で分かりやすいだろ withを使う書き方が気持ち悪いが、書き方の問題だけでコード上は問題ない。
Dim hoge As Form2 と Dim hoge As New Form2 同じって話じゃないの? With Form2にしようがWith New Form2にしようが内部処理かわんないでしょ?
つ 実行時エラー 91 オブジェクト変数またはWithブロック変数が設定されていません。
> Dim hoge As Form2 > と > Dim hoge As New Form2 > 同じって話じゃないの? 違う > With Form2にしようがWith New Form2にしようが内部処理かわんないでしょ? 違う With Form2 が動くのは Dim Form2 As New Form2 という定義が見えないところにあるわけで、 これはDim hoge As Form2 とも Dim hoge As New Form2 とも違う。
>>961 なるかなあ。
VB6は暗黙の宣言みたいなの、フォームにはあったよね?
暗黙の宣言とやらがどういうものか言ってみ。
VB6は、フォームの場合、newしなくても Form2.show とかしても、フォームが現れちゃったと思うんだ。 マイクロソフトはこの方法を推奨してたかもしれない。 けど、インスタンスの生成を明示的に行わない方法は個人的には嫌だ。
>>960 Dim hoge As Form2 で宣言したあとに、Newしないって前提か?
>>962 明示的にNewしたのに既定のインスタンスが戻ることがあったような気がする
状況によっては、Dim hoge As New Form2 が同じものになることがあるぞ
>>963 既定のインスタンスとか呼ばれてるやつな
そして、既定のインスタンスはVBのバージョンによって動作が違う
1回目のNewしたときに既定のインスタンスが戻る時もあったりなかったり
967 :
966 :2011/04/24(日) 22:55:22.40
VB.NETの話と勘違いしてた 既定のインスタンスがあるのは間違いないが、動作周りの話はちょっと違うかも
Dim hoge As New Form2
こう書いちゃうと、hoge を参照するたびに
If hoge Is Nothing Then
Set hoge = New Form2
End If
が実行されてしまう。
>>966 VB.NET でもそんなことあるわけネー
なんかコーディングミスしてるだろ。
>>951 いつも思うんだけど
ラベルを書くときどーすんの?
ラベルがあっても1行で書ける?
ラベル含めて一行で済ませたいやつなんているのか。ここまでくるとPerlの省略の美学に通じる物があるな Perlは省略されまくっている上に同じ文でもいくつか書き方があるから何が書いてあるのかすぐに理解できない
971 :
969 :2011/04/25(月) 12:46:55.32
>>970 いや、VBなら1行で書けるってよく言われるからさ
じゃあラベル含めて1行で書けるの?って思ってさ
よく言われる?
1行で書けるってCとかJAVAじゃないの
VB6は規定のインスタンスがあったり、画面にペタペタコントロール 貼りつけたりするだけでそれなりに動作するものが出来てしまうから OOPわかってない初心者でも取っつき易いんだけど それのせいでわけのわからん動作がある。 逆にそれが初心者にOOPをわかりづらくしている。 ということで、インスタンスは明示的に。
みなさんのアドバイスのおかげでVB6+DirectXでサウンドメーターが無事作れました。ありがとうございました。
>>975 どなたか存じませんが、どういたしまして。
> ということで、インスタンスは明示的に。 たしか、Initializeあたりに、 If Me Is Form2 Then Err.Raise 適当なの End If ってすればForm2変数を使えなくできたはず。 (Isで参照しただけではForm2はNewされなかったはず) 逆にNotを付ければ、Form2変数だけ使えるようになる。 これ入れておくといいかもね。
Dim Form2 As Integer
>>977 参照しただけで New されるぞ。
デフォルトのインスタンスを禁止するなら
Private Sub Form_Initialize()
Set Form2 = Nothing
End Sub
とする。
このスレで良いのかよく解らないんだけど。 Scripting.FileSystemObjectって一つ作っておけば良いのかな? ちょこっと作ったのがあるんだけど、3つのファイルそれぞれにつくったんだけど、そんな事しなくても良いのかな? まぁ試してみればイイじゃん?って話なのだろうけど、本当の所どうなのかと思って。 身近にそういう事に答えてくれる人が居ないんで。 Set fso = WScript.CreateObject("Scripting.FileSystemObject") Set File1 = fso.GetFile("C:\file1.txt") Set File2 = fso.GetFile("C:\file2.txt") Set File3 = fso.GetFile("C:\file3.txt") フツーは、こうなのかな?
まぁ試してみればイイじゃん?
>>980 されないよ。
Newされるのは、Formのプロパティを触ったとき。
スミマセン。いきなり
>>981 で高度な質問をしてしまってご迷惑でしたか。
もっと、頭の良い人の居る所で質問しなおします。
何の意味もないプライドを傷つける様な事をしてしまってスミマセンでした。
でわ、誰も聞いてない罵詈雑言をお好きなだけ書き込むという意味の無い事を楽しんでください。ぺこ <(_ _)>
>>984 >Set File1 = fso.GetFile("C:\file1.txt")
>Set File2 = fso.GetFile("C:\file2.txt")
>Set File3 = fso.GetFile("C:\file3.txt")
質問の意図と合ってるかわかんないけど、これでいいんじゃない?
>WScript.CreateObject("Scripting.FileSystemObject")
これを3つ作るっていうなら、なんでそんな事するのかわからない。
VB6でDIできますか?
>>986 SpringみたいなDIコンテナ…無理だろ
>>987 なんで?
DIの肝は考え方であって、
実装技術はただのファクトリーパターンだと思うけど。
キー(文字列)があって対応表(XML)から引っ張ってきて
対応したクラスをつくるだけ。
でもこれってクラスを参照するためのインターフェースに依存するけどこれは問題ないの?
なるほどSpringというのをググって何となくDIというものが分かった気がする
>>989 正直、この説明ってどうなの?w
ただの多態をなぜもったいぶってDIなんて呼ぶのかこれじゃさっぱり分からん
つまりコンパイルした後でもXMLというテキストファイルをちょちょい弄るだけでアプリケーションの動きを変えられるよう設計してるってこと?
本職でない素人は知らなくていい
>>990 インターフェースならVB6に普通にあるじゃん。
>>994 いや違う。できなくはないだろうけど、コンパイルしたあとで
アプリケーションの動きを変えるのが目的ではない。
モジュール(クラス)間の依存度を少なくするのが目的。
モジュール間の依存度が少ないから簡単にテスト用の
クラスに入れ替え可能になる。
自分で頑張ってそういう仕組みを作ってもいいけど、
他の人が用意してくれたのがある。それがJavaならSpring
>>997 だから、それならただの多態以上の物ではないでしょ。
>>998 多態性は実装技術。DIは(実装技術を使って)つくられた製品。
比べるものが違う。
話が通じてないなあ。 だから、依存性の排除はインターフェイスを使えば自動的についてくる機能に過ぎず、 DIとやらによって初めて得られるものでは全然ない。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。