トップページ⇒tech
1001コメント351KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2013/02/01(金) 21:20:49.96
        ____
        /     \    
     /   ⌒  ⌒ \   論破くん↓必死だなー
   /    (●)  (●) \     
    |   、" ゙)(__人__)"  )    ___________
   \      。` ⌒゚:j´ ,/ j゙~~| | |             |
__/          \  |__| | |             |
| | /   ,              \n||  | |             |
| | /   /         r.  ( こ) | |             |
| | | ⌒ ーnnn        |\ (⊆ソ .|_|___________|
 ̄ \__、("二) ̄ ̄ ̄ ̄ ̄l二二l二二  _|_|__|_
構造化例外処理ならこうだろ。 AがFinally、BがCatch、Cが処理
Sub A()
  Dim objConnection As ADODB.connection
  Set objConnection = New ADODB.connection
  Call B(objConnection)
  If objConnection.State <> adStateClosed Then
    Call objConnection.Close
  End If
End Sub
Sub B(ByVal objConnection As ADODB.connection)
  On Error Resume Next
  Call C(objConnection)
  If Err.Number <> 0 Then
    Debug.Print Err.Description
  End If
End Sub
Sub C(ByVal objConnection As ADODB.connection)
  Call objConnection.Open
End Sub
前スレ VBプログラマ質問スレ(Ver.6.0 まで) part60
http://toro.2ch.net/test/read.cgi/tech/1351327234/
0232デフォルトの名無しさん2013/02/04(月) 15:43:09.97
>>229
賛成


トランザクションの話をしよう。
「データベースを使った処理」と
「トランザクション」は分離していないといけない。

つまり、

データベースを使った処理開始
 トランザクション開始
 処理
 トランザクション終了
終了

この形は良くない。なぜなら、データベースを使った処理
複数個を一つのトランザクションにまとめられないから。

だから「データベースを使った処理」の中にトランザクション処理は含めるべきではない。
0233デフォルトの名無しさん2013/02/04(月) 15:43:35.21
>>228
なぜダメなのか明確になるけどお前は考えてないからそれを明確に示すことは
できないのね。じゃあダメであることは不明確なままであり、現時点で俺のABC理論が
ベストプラクティスであることに変わりはない。はい論破。
0234前スレ何番か2013/02/04(月) 15:43:51.95
>>229
そろそろ潮時なので、もうやめるよ。
やめても、いいコーディングの話はしないけど。
0235デフォルトの名無しさん2013/02/04(月) 15:45:02.45
また「データベースを使った処理」とコネクションも分離した方がいい。

なぜなら、処理自体は同じでも別のデータベースに対して行うかもしれないから。

処理とコネクションが一体化されてしまうと柔軟性がなくなってしまう。
0236デフォルトの名無しさん2013/02/04(月) 15:47:20.60
>>225
0237デフォルトの名無しさん2013/02/04(月) 15:48:45.22
あと当たり前だけど、エラーは例外を基本とすること。
戻り値をエラーに値として使ってはいけない。

これらのことを合わせると以下の様な構造になる。


Sub main
On Error Goto ErrHandler
 コネクション作成
 トランザクション開始

 データベース処理

 コミット
Exit Sub
ErrHandler:
 エラー処理(ロールバック)
End Sub
0238前スレ何番か2013/02/04(月) 15:50:29.48
>>225
VB6では内部コードとしてUnicodeを使ってるから。

『転ばぬ先の文字コード入門(第4回)』
http://itpro.nikkeibp.co.jp/members/ITPro/ITBASIC/20010620/4/
0239デフォルトの名無しさん2013/02/04(月) 15:51:12.78
データベース処理のところはクラスにした方がいい。
そうすることでいちいち引数でコネクション渡す必要はなくなるし、
それでいて複数のコネクションに対応できる。


Sub main
On Error Goto ErrHandler
 コネクション作成
 トランザクション開始

 Set DB処理インスタンス1 = new クラス名(コネクション)

 コミット
Exit Sub
ErrHandler:
 エラー処理(ロールバック)
End Sub
0240デフォルトの名無しさん2013/02/04(月) 15:51:58.53
>>231
お前がAとBを隠蔽する場合のコードを提示してくれと言ったから
俺はAとBを隠蔽するコードを示してお前と同じようにはいきれいといって見せたわけであり、
お前がAとBを隠蔽するコードを要求したから俺がそれを示したわけであり、
Cが省略されているから意味がないというのはこれはひどいいいがかり。

>>234
うん、お前は目も当てられないほど見苦しいわ。俺が徳川八代将軍吉宗であったらいさぎよく
腹を切れと喝破して、峰打ちと称して心臓を一突きにしてやってるとこだわ。はい論破。
02412202013/02/04(月) 15:52:54.47
更新せずに書きこんだら、なんでこんなに流れ速いんだ・・・。
炎上終ったらで良いんで、>>220をお願いします・・・。
0242デフォルトの名無しさん2013/02/04(月) 15:52:57.60
>>240は無視ですね。了解ですw
0243前スレ何番か2013/02/04(月) 15:54:33.75
>>240
これで君にするレスは最後ね。

前スレでA, B, Cという構造を見たとき、正直衝撃を受けたよ。
今まで考えたこともなかった構造だったから。

俺は、他の人と違ってばっさり切り捨てることはしない。
今後も折に触れて、ABC構造が適合するような場面があるのかないのか、個人的に考えていくよ。

じゃね。
0244デフォルトの名無しさん2013/02/04(月) 15:55:29.31
>>241
君のコードが根本的にダメなのは、コードのそのままぺたっと書こうとしている所

> Aを試みてエラーならB試みる。
> Bを試みてエラーならCを・・・
とやりたいことを書いているだろう?
そのとおり書けばいい。

A()
正常なら終了
B()
正常なら終了
C()
正常なら終了
0245デフォルトの名無しさん2013/02/04(月) 15:58:40.30
今回のはエラーかどうか知りたいだけという珍しい例。
これならOn Error Resume Nextが便利

Sub Func
 On Error Resume Next

 Call A
 If Err.Number = 0 Then Exit Sub
 Call B
 If Err.Number = 0 Then Exit Sub
 Call C
 If Err.Number = 0 Then Exit Sub

End Sub

AとBとCの内容は好きに書けばいい。
ただしエラーの時はErr.Raiseすること。
0246デフォルトの名無しさん2013/02/04(月) 16:00:27.92
>>238
その記事だとShift_JISが主流とか書いてあるけど日本国内PCって意味だよね?諸外国でもShift_JISが標準だったの?
0247デフォルトの名無しさん2013/02/04(月) 16:05:04.56
別解として「エラーなら次の関数を実行する」という関数を作るという方法もある。

VBでは実装しにくいから関数オブジェクトにして

nantoka(new A(), new B(), new C())

A、B、Cはそれぞれrun(名前はなんでもいいけど)メソッドという
インターフェースを持ったクラス。

nantokaって関数は、エラーであれば次の引数のrunを呼ぶみたいな
コードを書けばいい。

A、B、Cそれぞれのクラスができるからちょっと面倒。
CallByName当たりを使えば一つのクラスで実装できるだろう。
0248前スレ何番か2013/02/04(月) 16:05:32.45
>>246
自分で調べろ
0249デフォルトの名無しさん2013/02/04(月) 16:07:35.26
コードを書くときは、やりたいこと(最小限のコード)を書いて
そこに肉付けしていくのではなく、

やりたいことを書いて、それだけで動くように
するにはどうするか?って考えるのがいい。

コードをシンプルに保つ秘訣だ。
0250デフォルトの名無しさん2013/02/04(月) 16:15:52.60
>>247
お前もVB6じゃないコードだって指摘できないから同罪。
0251デフォルトの名無しさん2013/02/04(月) 16:26:47.05
>>219
クラスでRecordsetを保持したらダメだと思ってんの?馬鹿はお前のほうだ。お前は疑いようのない馬鹿だ。はい論破。
0252デフォルトの名無しさん2013/02/04(月) 16:48:24.53
>>208
ABC理論だとこんなに簡潔にできる。敗北を知りたい。はい論破。

Sub A()
  Dim objConnection As ADODB.Connection
  Set objConnection = New ADODB.Connection
  Call B(objConnection)
  If objConnection.State <> ADODB.adStateClosed Then
    Call objConnection.Close
  End If
End Sub

Sub B(ByVal objConnection As ADODB.Connection)
  On Error Resume Next
  Call C(objConnection)
  If Err.Number <> 0 Then
    If objConnection.State = ADODB.adStateClosed Then
      Call objConnection.RollbackTrans
    End If
  End If
End Sub

Sub C(ByVal objConnection As ADODB.Connection)
  Call objConnection.Open
  Call objConnection.BeginTrans
  Call objConnection.CommitTrans
End Sub
02532202013/02/04(月) 17:11:29.13
>>244 >>245
なるほど、On Error Resume NextにしてErr.Numberを調べれば良いのですね。
try{
A();
}catch(...){
try{
B();
}catch(...){
C();
}
}
のように書こうとして、ずっと悩んでおりました。
ありがとうございました。
0254デフォルトの名無しさん2013/02/04(月) 17:12:09.88
こっちのほうがシンプルだったw

  Dim objConnection As ADODB.Connection
  Set objConnection = New ADODB.Connection
  On Error Resume Next
  Call objConnection.Open
  Call objConnection.BeginTrans
  Call objConnection.CommitTrans
  If Err.Number <> 0 Then
    If objConnection.State = ADODB.adStateClosed Then
      Call objConnection.RollbackTrans
    End If
  End If
  If objConnection.State <> ADODB.adStateClosed Then
    Call objConnection.Close
  End If
0255デフォルトの名無しさん2013/02/04(月) 17:21:26.08
>>253
try-catchのネストはやめたほうがいい
やりたくなったら構造が間違っていると考えたほうがいい。
ほんとうに必要な場合ってのは殆ど無いはずだ。
0256デフォルトの名無しさん2013/02/04(月) 17:25:01.80
>>254
それはやっちゃいけないパターンだ。
Resume NextだからOpenで例外が投げられたとしても
処理が継続されてBeginTransが実行されて例外が投げられて
Openの例外が消失してCommitTransが実行されてBeginTransの例外が
消失する。最低のパターン。ワーストケース。お前のおつむの程度が知れるな。はい論破。
0257デフォルトの名無しさん2013/02/04(月) 17:28:14.19
じゃあこれでいいんじゃね?

  Dim objConnection As ADODB.Connection
  Set objConnection = New ADODB.Connection
  Call objConnection.Open
  Call objConnection.BeginTrans
  Call objConnection.CommitTrans
  If Err.Number <> 0 Then
    If objConnection.State = ADODB.adStateClosed Then
      Call objConnection.RollbackTrans
    End If
  End If
  If objConnection.State <> ADODB.adStateClosed Then
    Call objConnection.Close
  End If
0258デフォルトの名無しさん2013/02/04(月) 17:28:43.98
>>251
コネクションが閉じられたら、レコードセットが無効になるよ
0259デフォルトの名無しさん2013/02/04(月) 17:30:12.07
>>258
え、そうなの?じゃあコネクション閉じられないな。はい論破。
0260デフォルトの名無しさん2013/02/04(月) 17:30:39.13
>>258
そりゃそうだろw
0261デフォルトの名無しさん2013/02/04(月) 17:34:08.32
>>257
お前はバカすぎる。例外が発生した時点で処理が中断されるん
だからErr.NumberのチェックもConnection.Stateのチェックも
意味がなくなる。お前だけレベルが低すぎる。インターネットを
利用しちゃいけないレベル。回線切ってゴマでもすりつぶしてろ。はい論破。
0262デフォルトの名無しさん2013/02/04(月) 17:34:11.21
じゃあこれでいいのか。

Sub foo()
On Error Goto ErrHandler
  Dim objConnection As ADODB.Connection
  Set objConnection = New ADODB.Connection

  Call objConnection.Open
  Call objConnection.BeginTrans
  Call objConnection.CommitTrans

  Exit Sub
ErrHandler:
  If objConnection.State = ADODB.adStateClosed Then
    Call objConnection.RollbackTrans
  End If
  If objConnection.State <> ADODB.adStateClosed Then
    Call objConnection.Close
  End If
End Sub
0263デフォルトの名無しさん2013/02/04(月) 17:34:48.51
ム板で一番活気のあるスレ
0264デフォルトの名無しさん2013/02/04(月) 17:36:37.42
>>262
さすがだ。たった3秒でそのレスをするとはな。
0265デフォルトの名無しさん2013/02/04(月) 17:38:03.82
>>262
いいわけあるか、例外が発生したときにErrHandlerに飛ばされるが、
Connection.Closeは例外が発生しなくても呼ばれなくてはいけない。
お前のようなさんしたは下手にアレンジしようとせずに俺が示したとおりに
記述するのがベストだ。なぜなら俺がベストを示したからだ。はい論破。
0266前スレ何番か2013/02/04(月) 17:38:11.91
>>255
catch内のtry-catchはいいと思うけど。
0267デフォルトの名無しさん2013/02/04(月) 17:38:43.53
ならこれでよさそうだ。

Sub foo()
On Error Goto ErrHandler
  Dim objConnection As ADODB.Connection
  Set objConnection = New ADODB.Connection

  Call objConnection.Open
  Call objConnection.BeginTrans
  Call objConnection.CommitTrans

ErrHandler:
  If objConnection Is Nothing Then Exit Sub
  If objConnection.State = ADODB.adStateClosed Then
    Call objConnection.RollbackTrans
  End If
  If objConnection.State <> ADODB.adStateClosed Then
    Call objConnection.Close
  End If
End Sub
0268前スレ何番か2013/02/04(月) 17:39:44.83
あ、本当に必要な場合か。
catch内でリソースの解放が必要になるときに、その処理自体が例外を発生する可能性がある場合って
良くあることだと思うけど、俺だけなのか?
0269デフォルトの名無しさん2013/02/04(月) 17:40:02.39
論破くんのレスがなくなった時が
完成されたコードになるのだろう。
黙ってみてよw
0270デフォルトの名無しさん2013/02/04(月) 17:40:23.43
>>259
閉じない様に気をつけるのか...頑張ってね...
0271デフォルトの名無しさん2013/02/04(月) 17:42:25.99
>>

つまりこうしろってことですね?

Sub foo()
On Error Goto ErrHandler
  Dim objConnection As ADODB.Connection
  Set objConnection = New ADODB.Connection

  Call objConnection.Open
  Call objConnection.BeginTrans
  Call objConnection.CommitTrans

ErrHandler:
  If objConnection Is Nothing Then Exit Sub
  If Err.Number <> 0 Then
    If objConnection.State = ADODB.adStateClosed Then
      Call objConnection.RollbackTrans
    End If
  End If
  If objConnection.State <> ADODB.adStateClosed Then
    Call objConnection.Close
  End If
End Sub
0272デフォルトの名無しさん2013/02/04(月) 17:42:59.49
あ、間違って書き込みボタン押しちゃったw
0273デフォルトの名無しさん2013/02/04(月) 17:47:16.87
エラー処理が煩雑になってきたので
こういうのは共通クラスにまとめよう。

Sub foo()
On Error Goto ErrHandler
  Dim objConnection As MyConnection
  Set objConnection = New MyConnection

  Call objConnection.Open
  Call objConnection.BeginTrans
  Call objConnection.CommitTrans

ErrHandler:
  If Not objConnection Is Nothing Then
    Call objConnection.CleanUp
  End If
End Sub
0274デフォルトの名無しさん2013/02/04(月) 17:48:02.36
>>270
は? なに言ってんの? バーカ。はい論破。

>>267
正常時の処理と異常時の処理がごちゃまぜにされた劣化コードだな。
お前にはそれが限界だろうな。俺レベルになると構造化プログラミングの
真髄を示すことができるけどな。それが>>252。はい論破。

>>268
お前だけだろ。お前だけ。お・ま・え・だ・け。はい論破。
0275デフォルトの名無しさん2013/02/04(月) 17:49:34.00
CleanUp はMyConnectionクラスのTerminateでやればいいか。

Sub Foo()
On Error Goto ErrHandler
  Dim objConnection As MyConnection
  Set objConnection = New MyConnection

  Call objConnection.Open
  Call objConnection.BeginTrans
  Call objConnection.CommitTrans

  Exit Sub
ErrHandler:
  ErrorLog(Err)
End Sub
0276デフォルトの名無しさん2013/02/04(月) 17:50:20.41
>>275
うわっ神。超シンプル。
感動した。
0277デフォルトの名無しさん2013/02/04(月) 17:54:17.89
>>275
それは臭いものにふたをするだけの詭弁コードだな。そんなことが許される
のであれば俺はこれでできることになる。はい論破。
Sub C(ByVal objConnection As ADODB.Connection)
  Call objConnection.Open
  Call objConnection.BeginTrans
  Call objConnection.CommitTrans
End Sub
0278デフォルトの名無しさん2013/02/04(月) 17:55:13.03
>>277
コード減ってる。Newする所も書かないとダメだろう?
0279デフォルトの名無しさん2013/02/04(月) 17:56:41.98
例外処理も消えてるな。
0280デフォルトの名無しさん2013/02/04(月) 17:57:36.73
まあまて、>>277にnewと例外処理を加えよう

Sub C()
On Error Goto ErrHandler
  Dim objConnection As MyConnection
  Set objConnection = New MyConnection

  Call objConnection.Open
  Call objConnection.BeginTrans
  Call objConnection.CommitTrans

  Exit Sub
ErrHandler:
  ErrorLog(Err)
End Sub

よし。これでOKだ
0281デフォルトの名無しさん2013/02/04(月) 17:58:18.88
>>278
俺はMyConnectionの実装を示さないお前と同じことをやってみせただけのことだ。
お前は都合の悪いところは隠せばいいという隠蔽体質を恥じらいもなく見せた
厚顔無恥であることを自覚しろ。正々堂々と勝負している俺の敵ではない。はい論破。
0282デフォルトの名無しさん2013/02/04(月) 18:11:37.17
>>280
MyConnectionにはすくなくともOpen、BeginTrans、CommitTransのメソッドを
用意しなければならず、それは内部のConnectionオブジェクトに処理を委譲する
だけのだっさい実装になってる。お前はコードを書きまくってそれを表に出さず、
きれいになりましたといってる恥知らず。厚顔無恥どころかその汚れまくった精神構造は
睾丸無知と呼ばれるにふさわしい。もうただのキンタマ。はい論破。
0283デフォルトの名無しさん2013/02/04(月) 18:25:23.37
>>269
キンタマコードが示されただけだった。
それもそのはずでベストプラクティスは俺の手によってすでに
示されているわけ。俺への不合理な反発、心理的リアクタンスから
俺のABC理論に逆らっているだけだったから結末は目に見えていた。
もっとこう合理的にこれがいいと示すことができる骨のあるやつはいないのか。
ここはいつからこんなにレベルの低い連中のたまり場になったんだ。はい論破。
0284デフォルトの名無しさん2013/02/04(月) 20:17:24.90
理論の通じない論破君が出ててきてからだよ
0285デフォルトの名無しさん2013/02/04(月) 20:20:16.87
無視されてるなぁw
0286デフォルトの名無しさん2013/02/04(月) 20:22:12.53
>>285
ぐぬぬ・・・となってるだけだろ。はい論破。
0287デフォルトの名無しさん2013/02/04(月) 21:47:44.16
みんな引数のプリフィックスってどうしてる?
Sub F1(ByVal inValue, ByRef outValue)
とか?
プリフィックス付けなかったらメンバー変数とか関数とかと
被ったりしてなんかいやだろ。どうしてる?
0288デフォルトの名無しさん2013/02/04(月) 21:54:57.44
趣味グラマで1人でやってるから名前付けを気にしたことはないな
0289デフォルトの名無しさん2013/02/04(月) 22:10:34.76
>>287
何でググってみないの?バカなの?死ぬの?
0290デフォルトの名無しさん2013/02/04(月) 22:22:56.39
>>287
メンバ変数にプリフィクス付けてるから
引数はあまり気にしない
小文字で始めれば関数との被りは気にしなくて良い
0291デフォルトの名無しさん2013/02/04(月) 22:31:12.58
>>290
関数と被るときあるじゃん。メンバー変数にプリフィックスつけたら外部から
呼び出すときなんか嫌じゃない?
0292デフォルトの名無しさん2013/02/04(月) 22:34:50.12
>>290
> 小文字で始めれば関数との被りは気にしなくて良い

関数の名前に名詞を使ってるの?
それとも変数に動詞を使ってるの?
0293デフォルトの名無しさん2013/02/04(月) 22:34:58.30
グローバル変数 g
モジュール内変数 m
引数 a
0294デフォルトの名無しさん2013/02/04(月) 22:54:33.83
>>291
メンバー変数なんて全てプライベートだから、外部から直接呼び出したりしない
そもそも、なんのための「Property」やねんと...
0295デフォルトの名無しさん2013/02/04(月) 23:04:28.69
>>294
外部から変更可能なものならプロパティにする意味ないじゃん。
プロパティにしてもプリフィックスつけなきゃ被ることになるじゃん。
0296デフォルトの名無しさん2013/02/04(月) 23:07:12.60
プロパティは大文字で始めるから
被りは気にしなくて良い
0297デフォルトの名無しさん2013/02/04(月) 23:09:49.46
動詞が関数
名詞が変数
なのでかぶることはない。

それにかぶったとしても
たいして問題にならない。

関数か変数かなんて大した問題ではない。
0298デフォルトの名無しさん2013/02/04(月) 23:11:36.88
動詞形と名詞形が同じスペルの英語が困るのか
0299デフォルトの名無しさん2013/02/04(月) 23:13:35.62
>>296
えーそれありえなーい。コンパイラは大文字小文字を区別しないし、
If Value < value Then
比較するときこんなことになるよ。大文字小文字で見分けてたら見にくくない?
ミスを誘発するために地雷埋めてるようなもんじゃん。それって嫌じゃない?
0300デフォルトの名無しさん2013/02/04(月) 23:14:28.91
そんな単純な名前付けして大丈夫か?

大丈夫だ、問題ない。
0301デフォルトの名無しさん2013/02/04(月) 23:15:10.84
神は言っている、ここでバグるようなプログラムじゃないと
0302デフォルトの名無しさん2013/02/04(月) 23:21:00.19
>>295
「Property」には、「Get」「Let」「Set」の三種類があり、それぞれ名前を重複させる事ができるから、基本的に被る心配なんてない
0303デフォルトの名無しさん2013/02/04(月) 23:24:53.22
>>302
引数と被ることあるじゃん。
Sub Func(ByVal value As String)
  'なんかこれ嫌じゃない?
End Sub

Property Get Value() As String

End Property
0304デフォルトの名無しさん2013/02/04(月) 23:25:57.67
VBは糞言語だから仕方が無い
0305デフォルトの名無しさん2013/02/04(月) 23:31:12.50
>>303
引数にもっと適切な名前をつけましょう。
0306デフォルトの名無しさん2013/02/04(月) 23:31:58.81
>>303
何が嫌なの?
Funcから、PropertyのValueにアクセスしたければ、Me.Valueでアクセスできるだろ?
0307デフォルトの名無しさん2013/02/04(月) 23:33:32.04
俺のするレスがことごとく無視されてるとこみると
この安価の付け合いのレス合戦は台本通りの自作自演か?
0308デフォルトの名無しさん2013/02/04(月) 23:34:33.08
>>305
だからさ、みんな引数のプリフィックスどうしてるのかなーと思って。

>>306
う、うん、そりゃできるけどさ。Me付けるタイプ?ふーん。
0309デフォルトの名無しさん2013/02/04(月) 23:35:46.10
>>307
レスどれよ?まともなこと書いてないんだろ。
0310デフォルトの名無しさん2013/02/04(月) 23:38:54.53
>>308
プリフィックスなんか付けない。
適切な変数名をつけていればかぶらない。
0311デフォルトの名無しさん2013/02/04(月) 23:42:18.63
>>308
Meを付けなければならない時は付けるし、付ける必要が無いときは付けない
ただ、それだけ

そもそも、メソッドにPublicなSubが必要なのか?
Propertyに押し込めるんじゃないのか?
0312デフォルトの名無しさん2013/02/04(月) 23:42:39.59
>>310
じゃあたとえば二分木のNodeクラスのValueに適切な
引数名てどういうの?
0313デフォルトの名無しさん2013/02/04(月) 23:57:43.23
node_valueでいいだろw
0314デフォルトの名無しさん2013/02/04(月) 23:59:15.57
>>313
それプリフィックスじゃん。
0315デフォルトの名無しさん2013/02/05(火) 00:00:06.54
>>314
は? 単語を二つくっつけただけだろ
0316デフォルトの名無しさん2013/02/05(火) 00:01:53.10
>>315
クラス名を変数の前に付けるんでしょ。単語を二つくっつけることと
プリフィックスは同時に成立することだよ。クラス名を付けるってことね。
0317デフォルトの名無しさん2013/02/05(火) 00:29:28.80
プロパティ Value の実体を表す変数名は
Value そのものか、あるいはメンバである事を表すプリフィクスを付けただけのものが
最も分かりやすい
それ以外の変数名は逆にややこしい

クラス名はプリフィクスとしてはあり得ない部類
クラスが違えばプリフィクスも変わるとか保守し辛い
0318デフォルトの名無しさん2013/02/05(火) 00:30:50.70
valueって書こうと思ってValueとしてしまったが
ここはVBスレだからvalueでもダメだったわ
VBならプリフィクス一択だな
0319デフォルトの名無しさん2013/02/05(火) 09:41:06.10
フォームBのActivateイベント内にStatic変数blnIsEntを宣言。
フォームAからvbModalでフォームBをShowさせたとき、blnIsEntをTrueに設定しアンロードした。
再度フォームAからvbModalでフォームBをShowさせたとき、なぜかblnIsEntがTrueになったままになっている。
まるでフォームBがアンロードされていないかのようにふるまう。

そこで、フォームAのvbModalでフォームBをShowさせる次のコードに Set frmB = Nothing を記述すると
再度フォームAからvbModalでフォームBをShowさせたとき、blnIsEntがFalseになった。
これはVB6.0の仕様なのか、俺が何かフォームBをアンロードできないような事をしてしまったのだろうか?
0320デフォルトの名無しさん2013/02/05(火) 09:49:52.51
VB6ではNothingの代入は不要だって論破自慢してた人がいたが、実際には明らかに挙動が異なる局面があるじゃんw
0321デフォルトの名無しさん2013/02/05(火) 10:23:50.49
>>320
Terminateイベントを早期に発生させる目的でオブジェクトの使用終了時にNothingを代入するプログラマーは多いですよ?
0322デフォルトの名無しさん2013/02/05(火) 11:29:48.67
>>316
> クラス名を変数の前に付けるんでしょ。単語を二つくっつけることと
クラス名を全部につけたら結局一緒だろw
そもそもnodeという単語であってNodeとくクラス名じゃないし
お前馬鹿なんじゃないの?
0323デフォルトの名無しさん2013/02/05(火) 11:54:36.24
>>319
> まるでフォームBがアンロードされていないかのようにふるまう。

アンロードされた=メモリ上から破棄された
というのが勘違い
0324デフォルトの名無しさん2013/02/05(火) 12:21:21.17
>>323
ガーページコレクションなんたらかんたらでNothingせずともメモリー上から破棄されるって言い切ってたような気が汁

素人論破集団怖すぎw
0325デフォルトの名無しさん2013/02/05(火) 12:42:28.78
VB6じゃFormの扱いは特別じゃなかったっけか
その他オブジェクトは、Nothingの代入はいらないよ
0326デフォルトの名無しさん2013/02/05(火) 12:46:21.94
>>324
間違いではない。スコープから抜けて参照がどこからもなくなれば、とメモリから破壊される。

だがフォームの場合は「参照がどこからもなくなれば」という条件が
ややこしいのだ。Unloadは参照がどこからの亡くなるための条件の一つだが
それだけではない。
0327デフォルトの名無しさん2013/02/05(火) 12:50:29.88
>>319
実際のコードを見ないとなんとも言えない。
そのフォームAとかBというのがどういうフォーム名で
どのような変数名で呼び出して、どのような使い方をしているのか
書かないとわからない。

一般的にフォームのアンロードは、フォームをなくすための条件の一つであるが
アンロードされているだけで、フォームは消えない。
そもそもアンロードは、フォームを消す命令ではないからだ。
0328デフォルトの名無しさん2013/02/05(火) 12:51:48.87
>>319
単にStatic変数がメモリ上に保持されているというだけ。
フォームそのものはアンロードされている。
0329デフォルトの名無しさん2013/02/05(火) 12:52:02.39
>>320
> VB6ではNothingの代入は不要だって論破自慢してた人がいたが、実際には明らかに挙動が異なる局面があるじゃんw

それはインスタンスを削除するのにNothingは不要ってことでしょ?

代入してもしなくても挙動が全く同じなんて誰も言ってないですよ。
0330デフォルトの名無しさん2013/02/05(火) 12:54:23.29
>>324
> ガーページコレクションなんたらかんたらでNothingせずともメモリー上から破棄されるって言い切ってたような気が汁

うん、そうだね。

今は、アンロードの話をしている。
アンロードとNothingは別のものだ。Unload、Nothing 単語違うだろ?
0331デフォルトの名無しさん2013/02/05(火) 12:55:48.98
> 通常、プロシージャ内のローカル変数は、プロシージャが停止した直後に削除されます。
> 静的変数はプロシージャの終了後も存在し続け、最後に設定された値を保持します。
> 次回、コードからそのプロシージャを呼び出したとき、変数は初期化し直されることなく、
> 最後に割り当てられた値をそのまま保持します。
■ このスレッドは過去ログ倉庫に格納されています