VBプログラマ質問スレ(Ver.6.0 まで) part56

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2011/04/23(土) 14:32:08.62
>>950
> たぶん、Form2では最後にVisible=Falseで消してるんだね
> で、次にForm2をShowした時にLoadイベントが発生しないもんだから強制的にNewしてるに違いない

それはあなたの想像でしょう?

この文脈では、Form2をshow(load, unload)することはないよ。
showするのはForm2から作られたhogeインスタンス。
withを使っているから、実際には書かれてないけど。
953デフォルトの名無しさん:2011/04/23(土) 14:38:26.57
>>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
>>953
どこか間違ってた?
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を複数出したいという意図なら問題ないや
958デフォルトの名無しさん:2011/04/24(日) 04:03:56.38
ModelessなForm2のインスタンスが別に存在して
Newして別のForm2のインスタンスが欲しいとか?
959デフォルトの名無しさん:2011/04/24(日) 06:44:57.56
> hogeを毎回Newしてるのはhoge.Visible=Falseにして戻ってくるからに違いない

だからなんで決め付けるのさ?

Form2のインスタンス側でフォーム閉じたかForm2にあるボタンで
Unload meしているかもしれんだろ。というかそっちの方が自然。

vbModalなんだから、何度もForm2がつくられることはない。
(つくろうと思えば可能がだ、自然な作り方ではない)
だからメモリ不足にもならない。

new使ってるのは、Form2が閉じられたらメモリを解放したいからとか
ボタンをおすたびにForm2を完全に0から作りたいからだろ。
(initializeで何かの初期化をしたい)
それに複数インスタンスを生成することも可能。

使用するときに毎回newして要らなくなったら完全になくなるほうが
柔軟で自然で分かりやすいだろ

withを使う書き方が気持ち悪いが、書き方の問題だけでコード上は問題ない。
960デフォルトの名無しさん:2011/04/24(日) 20:33:54.93
Dim hoge As Form2

Dim hoge As New Form2
同じって話じゃないの?
With Form2にしようがWith New Form2にしようが内部処理かわんないでしょ?
961デフォルトの名無しさん:2011/04/24(日) 20:59:14.82
つ 実行時エラー 91 オブジェクト変数またはWithブロック変数が設定されていません。
962デフォルトの名無しさん:2011/04/24(日) 22:30:33.08
> 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 とも違う。


963デフォルトの名無しさん:2011/04/24(日) 22:30:52.95
>>961
なるかなあ。
VB6は暗黙の宣言みたいなの、フォームにはあったよね?
964デフォルトの名無しさん:2011/04/24(日) 22:32:35.88
暗黙の宣言とやらがどういうものか言ってみ。
965デフォルトの名無しさん:2011/04/24(日) 22:32:59.90
VB6は、フォームの場合、newしなくても

Form2.show

とかしても、フォームが現れちゃったと思うんだ。
マイクロソフトはこの方法を推奨してたかもしれない。
けど、インスタンスの生成を明示的に行わない方法は個人的には嫌だ。
966デフォルトの名無しさん:2011/04/24(日) 22:43:22.78
>>960
Dim hoge As Form2 で宣言したあとに、Newしないって前提か?

>>962
明示的にNewしたのに既定のインスタンスが戻ることがあったような気がする
状況によっては、Dim hoge As New Form2 が同じものになることがあるぞ

>>963
既定のインスタンスとか呼ばれてるやつな
そして、既定のインスタンスはVBのバージョンによって動作が違う
1回目のNewしたときに既定のインスタンスが戻る時もあったりなかったり
967966:2011/04/24(日) 22:55:22.40
VB.NETの話と勘違いしてた
既定のインスタンスがあるのは間違いないが、動作周りの話はちょっと違うかも
968デフォルトの名無しさん:2011/04/25(月) 02:03:27.82
Dim hoge As New Form2

こう書いちゃうと、hoge を参照するたびに

If hoge Is Nothing Then
Set hoge = New Form2
End If

が実行されてしまう。

>>966
VB.NET でもそんなことあるわけネー
なんかコーディングミスしてるだろ。
969デフォルトの名無しさん:2011/04/25(月) 07:56:06.61
>>951
いつも思うんだけど
ラベルを書くときどーすんの?
ラベルがあっても1行で書ける?
970デフォルトの名無しさん:2011/04/25(月) 12:20:51.77
ラベル含めて一行で済ませたいやつなんているのか。ここまでくるとPerlの省略の美学に通じる物があるな
Perlは省略されまくっている上に同じ文でもいくつか書き方があるから何が書いてあるのかすぐに理解できない
971969:2011/04/25(月) 12:46:55.32
>>970
いや、VBなら1行で書けるってよく言われるからさ
じゃあラベル含めて1行で書けるの?って思ってさ
972デフォルトの名無しさん:2011/04/25(月) 13:04:54.12
よく言われる?
973デフォルトの名無しさん:2011/04/25(月) 15:49:12.84
1行で書けるってCとかJAVAじゃないの
974デフォルトの名無しさん:2011/04/25(月) 19:46:01.93
VB6は規定のインスタンスがあったり、画面にペタペタコントロール
貼りつけたりするだけでそれなりに動作するものが出来てしまうから
OOPわかってない初心者でも取っつき易いんだけど
それのせいでわけのわからん動作がある。
逆にそれが初心者にOOPをわかりづらくしている。

ということで、インスタンスは明示的に。
975デフォルトの名無しさん:2011/04/26(火) 19:50:12.76
みなさんのアドバイスのおかげでVB6+DirectXでサウンドメーターが無事作れました。ありがとうございました。
976デフォルトの名無しさん:2011/04/27(水) 01:17:11.24
>>975
どなたか存じませんが、どういたしまして。
977デフォルトの名無しさん:2011/04/27(水) 08:37:33.47
> ということで、インスタンスは明示的に。

たしか、Initializeあたりに、

If Me Is Form2 Then
 Err.Raise 適当なの
End If

ってすればForm2変数を使えなくできたはず。
(Isで参照しただけではForm2はNewされなかったはず)

逆にNotを付ければ、Form2変数だけ使えるようになる。
これ入れておくといいかもね。
978デフォルトの名無しさん:2011/04/27(水) 17:06:02.93
Dim Form2 As Integer
979デフォルトの名無しさん:2011/04/27(水) 20:11:48.13
>>12-14あたりの話か?>>975
980デフォルトの名無しさん:2011/04/28(木) 01:40:34.56
>>977
参照しただけで New されるぞ。

デフォルトのインスタンスを禁止するなら

Private Sub Form_Initialize()
  Set Form2 = Nothing
End Sub

とする。
981デフォルトの名無しさん:2011/04/28(木) 21:55:20.37
このスレで良いのかよく解らないんだけど。

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")

フツーは、こうなのかな?
982デフォルトの名無しさん:2011/04/28(木) 23:46:09.28
まぁ試してみればイイじゃん?
983デフォルトの名無しさん:2011/04/29(金) 03:00:48.46
>>980
されないよ。

Newされるのは、Formのプロパティを触ったとき。
984デフォルトの名無しさん:2011/04/29(金) 14:42:10.59
スミマセン。いきなり>>981で高度な質問をしてしまってご迷惑でしたか。
もっと、頭の良い人の居る所で質問しなおします。
何の意味もないプライドを傷つける様な事をしてしまってスミマセンでした。
でわ、誰も聞いてない罵詈雑言をお好きなだけ書き込むという意味の無い事を楽しんでください。ぺこ <(_ _)>
985デフォルトの名無しさん:2011/04/29(金) 16:47:48.16
>>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つ作るっていうなら、なんでそんな事するのかわからない。
986デフォルトの名無しさん:2011/04/29(金) 22:03:35.22
VB6でDIできますか?
987デフォルトの名無しさん:2011/04/29(金) 22:53:39.57
>>986
SpringみたいなDIコンテナ…無理だろ
988デフォルトの名無しさん:2011/04/29(金) 23:48:18.76
>>987
なんで?

DIの肝は考え方であって、
実装技術はただのファクトリーパターンだと思うけど。

キー(文字列)があって対応表(XML)から引っ張ってきて
対応したクラスをつくるだけ。
989デフォルトの名無しさん:2011/04/30(土) 01:01:07.22
素人グラマの私はDIという言葉を今初めて知った
↓これで合ってる?今度はSpringというものをググって、XMLとかファクトリーパターンというのもググる

DIコンテナ【Dependency Injection Container】 - 仕事に役立つプログラミング・キーワード:ITpro
ttp://itpro.nikkeibp.co.jp/article/COLUMN/20060628/241982/


990デフォルトの名無しさん:2011/04/30(土) 01:02:14.55
でもこれってクラスを参照するためのインターフェースに依存するけどこれは問題ないの?
991デフォルトの名無しさん:2011/04/30(土) 01:04:52.92
なるほどSpringというのをググって何となくDIというものが分かった気がする
992デフォルトの名無しさん:2011/04/30(土) 01:15:00.09
>>989
正直、この説明ってどうなの?w
ただの多態をなぜもったいぶってDIなんて呼ぶのかこれじゃさっぱり分からん
993デフォルトの名無しさん:2011/04/30(土) 01:17:33.90
↓こちらのほうがDIについて正しい知識?

@IT:Spring Frameworkで理解するDI(1)
http://www.atmarkit.co.jp/fjava/rensai3/springdi01/springdi01_1.html
994デフォルトの名無しさん:2011/04/30(土) 01:20:02.15
つまりコンパイルした後でもXMLというテキストファイルをちょちょい弄るだけでアプリケーションの動きを変えられるよう設計してるってこと?
995デフォルトの名無しさん:2011/04/30(土) 01:21:07.35
本職でない素人は知らなくていい
996デフォルトの名無しさん:2011/04/30(土) 01:25:52.27
>>990
インターフェースならVB6に普通にあるじゃん。
997デフォルトの名無しさん:2011/04/30(土) 01:32:40.33
>>994
いや違う。できなくはないだろうけど、コンパイルしたあとで
アプリケーションの動きを変えるのが目的ではない。

モジュール(クラス)間の依存度を少なくするのが目的。

モジュール間の依存度が少ないから簡単にテスト用の
クラスに入れ替え可能になる。

自分で頑張ってそういう仕組みを作ってもいいけど、
他の人が用意してくれたのがある。それがJavaならSpring
998デフォルトの名無しさん:2011/04/30(土) 01:35:25.46
>>997
だから、それならただの多態以上の物ではないでしょ。
999デフォルトの名無しさん:2011/04/30(土) 01:38:18.37
>>998
多態性は実装技術。DIは(実装技術を使って)つくられた製品。

比べるものが違う。
1000デフォルトの名無しさん:2011/04/30(土) 01:41:46.46
話が通じてないなあ。

だから、依存性の排除はインターフェイスを使えば自動的についてくる機能に過ぎず、
DIとやらによって初めて得られるものでは全然ない。
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。