VBプログラマ質問スレ(Ver.6.0 まで) part60
5 :
デフォルトの名無しさん :2012/10/27(土) 23:31:18.86
もつ
駄スレが立った、また、立った 1 おつ
これでVB6の構文は全部捉えきれるかな? function run(id1,id2) { var textarea1 = document.getElementById(id1); var textarea2 = document.getElementById(id2); var v = textarea1.value.match(/([a-zA-Z][a-zA-Z0-9_]*([\$\#\!\&]|)|[0-9]+(\.[0-9]+|)([\$\#\!\&]|)|\.[0-9]+([\!\#]|)|"[^"]+"|[\>\<]\=|\=[\<\>]|\<\>|\>\<|[\+\-\*\/\\\(\)\=\<\>\.:,_]|'.+| +)/g); var t = '', i; for(i=0;i<v.length;i++) { t += i + ' = "' + v[i] + '"\n'; } textarea2.value = t; }
Win8買ってVB6を入れてみた。 相変わらずProgram Filesには入れられないが、 他のフォルダなら普通に通った。 まだ現役だ。
もう捨ててやれよ・・・
10 :
デフォルトの名無しさん :2012/10/29(月) 13:10:31.72
>>8 >相変わらずProgram Filesには入れられないが、
入りますが何か?
しれとも入れ方を知りたくてわざと馬鹿なカキコしたのかな?
教えないから安心してね。
11 :
デフォルトの名無しさん :2012/11/04(日) 03:02:54.10
来週からVBの仕事なのに久しぶりにVB立ち上げたらなにもかも忘れてた...死にたい。
12 :
デフォルトの名無しさん :2012/11/04(日) 08:26:42.19
CreateObjectで指定できるProgIdの一覧ってどこかにまとめられていませんか?
>>13 なんでも一覧を欲しがる奴っているよね?
そういう奴に限ってみんなのために自分が一覧を作ろうとは思わない。
利己主義者。エゴイスト。あーやだやだ。
>>11 久しぶりにVB触ったら、UBoundでとれる配列の数が、配列のindexの最大値か
配列の数そのものか忘れてた。
たまにはLBoundも思い出してやってください
ひろしです
Lsetって便利だけど.netへの移行時に死ぬような目に遭う。 これって変じゃね?
はあ。
20 :
デフォルトの名無しさん :2012/11/07(水) 11:49:47.70
23 :
デフォルトの名無しさん :2012/11/07(水) 22:29:32.72
VBドカタってなんでプログラムができないの?
他の言語のスレと違って、オブジェクト指向をあんまり理解しない人が いるのが、このスレの住人の特徴です。
上を目指さないから
26 :
デフォルトの名無しさん :2012/11/07(水) 23:40:36.19
【 注意 】 飼育管理していますので 勝手に猿に餌を与えないよう願います
猿が餌を欲しがっています。
>>24 に餌を上げていいですか?
毒餌さですがwwww
28 :
デフォルトの名無しさん :2012/11/08(木) 09:03:12.64
オブジェクト指向の適切な使い方を知らないで使いまくっているアホを見ると 元からオブジェクト指向を知らないプログラマの方が 安心して仕事を任せられるから不思議
29 :
デフォルトの名無しさん :2012/11/08(木) 14:08:55.01
「不要になった時点」と関数の最後の間にコードがなければ そのコードを実行する前に開放してくれるんだから効果はあると思う。 冗長にはなりそうだが。
>>29 >>30 一つのモジュールにダラダラとクソ長いコードを書く初心者がVB6使いには
多いので、使い終わった時点でNothingしとけよっていう教え方は
せ ざ る を 得 な い
ところだと思う。
>>29 VB6とVB.NETを混同してるでしょw
VB6の場合は議論の余地はない
33 :
デフォルトの名無しさん :2012/11/08(木) 21:01:16.69
馬鹿が構築したオブジェクトと、継承にはうんざり
34 :
デフォルトの名無しさん :2012/11/08(木) 21:37:07.25
35 :
デフォルトの名無しさん :2012/11/08(木) 21:51:14.24
"有る" と言って、お前は納得するのか ?w
36 :
デフォルトの名無しさん :2012/11/08(木) 21:57:50.50
>>32 いや、その先生はVB6でNothingの早期代入を推奨してるんだが???
.Netはガーページコレクションに任せればいい(任せなければならない)ので
議論の余地がないのは分かるけどね。
37 :
デフォルトの名無しさん :2012/11/08(木) 21:58:43.97
>>34 実装継承は無いがインタフェース継承はある。俗に言うテンプレートみたいなやつ。
38 :
34 :2012/11/08(木) 22:23:33.85
>>37 そか。あれも継承っていうんだ。さんくす。
継承は良くない
君が理解できないからか?
継承を安易に使う奴に警鐘を鳴らせ
馬鹿なのは羹にこりて膾を吹く奴。 さらに馬鹿なのは、羹が何か理解できないくせに羹に懲りてる奴w
失敗すらできない臆病チキンの輩が何か言ってら
44 :
デフォルトの名無しさん :2012/11/08(木) 22:57:44.31
我家のなますはたこ入りでした。
>>29 今更の話題。とっくに答えは出てるね。
そのコメントだけじゃ判断できなくて、
Nothingを代入する意味が正しくわかっているなら、
Terminateイベントを早めに起こすというのは間違いじゃない。
だけどよくある勘違い、つまりNothingを代入した時点で
Terminalイベントが発生すると思っているのであれば間違い。
Nothingの代入は、Terminalイベントを発生させる命令ではない。
Newしたオブジェクトは、複数の変数に代入することで
複数の変数からオブジェクトを参照することが出来る。
Terminalイベントが発生するのは、どこからも参照されなくなった時。
時間がかかる処理の前に(Nothingを代入することで)どこからも参照されなくなれば
早く開放される。それが目的なら使わなくなったときにNothingを代入するのは意味がある。
(あと循環参照を断ち切ったりグローバル変数を開放するためにNothingを代入することもある)
スコープが終わるタイミング(変数がなくなるのでNothingをするのと同等になる)で
参照を破棄されるのが問題ないのであればわざわざNothingを代入する必要はない。
46 :
デフォルトの名無しさん :2012/11/09(金) 09:15:20.92
>Newしたオブジェクトは、複数の変数に代入することで >複数の変数からオブジェクトを参照することが出来る。 詭弁だな。 あたかもNEWしたオブジェクトを別の変数に入れる事で 別の用途に同時使用できるかのような書き方だ。 初心者はこういう語学に問題のある筆者の本を読んで間違いに走る。 後で修正するのは我々なんだよな。
>>46 オブジェクトを使用する場合、特に初心者に向けての忠告であれば
宣言1回、SET1回で終わるのが大抵なのだから
あえて複数SETで多参照とか前提にして
簡単な事をあえて難しく見せることに意味はないよね。
単に天邪鬼って事でFA?
48 :
デフォルトの名無しさん :2012/11/09(金) 09:20:05.66
たぶんあの時ドヤ顔でNothing不要論を唱えてた輩でしょ? 今頃まともなツッコミが入ったので慌ててるんでしょう。 触らぬアホに祟り無しといいます。
>今更の話題。とっくに答えは出てるね 答えが出てなかったから、今頃慌てて補足しているくせにwww
>>50 のサンプルコードだけで一つのプロシージャならわざわざNothingしなくてもという気がするのだが
52 :
デフォルトの名無しさん :2012/11/09(金) 10:19:17.78
>>51 気になったんで、その執筆者 「 不要になった時点で参照を解放する (Terminate イベントを早めに起こす)」
について、連絡をするフォームから問い合わせていた件で回答が来た。
要約すると、VB6の場合でもオブジェクトが使い終わった時にどこからも参照されない事を明確にする意味で
Nothingを代入するように心がけた方が良いとのお話。実際に早期にNothingを代入した場合とそうでない場合とで
VB Decompiler でコードを追いかけてみたところ、明らかにリソースの解放タイミングが早期に行われるようになっていた。
ロジック的にはNothingを代入しようとしまいが関係はないが、システムリソースに気を配った優しい設計を
心がけるように自分はしているとの事でした。僕も見習っておうしようと思います。
53 :
デフォルトの名無しさん :2012/11/09(金) 10:21:42.54
結局、Nothing代入不要論者は優しくない女にもモテないブサイク君って事か? だから魔界の仮面弁士たる彼はオペラ座の怪人みたく仮面をかぶってるわけな。
54 :
デフォルトの名無しさん :2012/11/09(金) 10:26:47.21
>>53 魔界の仮面弁士さんのVB6スキルは半端なく凄いけど
あの人って一体どんな仕事してるんだろうね。
55 :
51 :2012/11/09(金) 10:29:03.15
>>52 なるほどなぁ。納得。
新規の仕事になら適用してもいいかな。
改修の仕事でそれをやるとソースコードレビューで他とやり方が違うとか叩かれて
元に戻されるのがオチだろうし。
>>55 >ソースコードレビューで他とやり方が違うとか叩かれて
そんな目を皿のようにしてソースを見て叩くクライアントがいるのか?
客選べよw
つまり、mallocしたものはfreeしろと。 malloc/free論争。
58 :
デフォルトの名無しさん :2012/11/09(金) 11:43:30.97
まあ、関数内でnewしたFSOの変数にNothingを代入するのはやりすぎだわな。 何かの強迫観念か。
60 :
デフォルトの名無しさん :2012/11/09(金) 12:59:43.53
FSOとて例外ではなかろう
.netのプログラムでもNothingを代入してるのをたまに見かけるけど、アレって一体???
アピールじゃないかな
63 :
デフォルトの名無しさん :2012/11/09(金) 13:18:49.75
>>45 >どこからも参照されなくなれば早く開放される。
おまい、オブジェクトと共有DLLをごっちゃにしてないか?頭大丈夫か?
>>59 Nothingの代入がその関数の一番最後に配置するのだったらやり過ぎという感はあるけど
他はNothingを代入しているのにそこだけ代入していなかったら
コーディングミスだと思われても仕方ないだろう。
あるいはコメントに、「ここは関数の最後なのでNothingを代入しても意味が無いので代入しません」
とでも書くか?
使い終わったらNothingを代入するという社内コーディング規則を決めたのなら徹底すべき。
>>64 君って、mainの最後でfreeする派?
Nothing代入しろ派の人達は、C++のスマートポインタなんか気持ち悪くて使えないでしょうね。
Nothing代入しろって奴は、当然 string_value = vbNullString variant_value = Empty もやってんだろうな?
>>68 .net 小僧は i = Nothing とかやってそうで恐いわwww
mainの最後でfreeとかC++のスマートポインタとか引用する奴はたぶん病気。 空気脳病。
73 :
デフォルトの名無しさん :2012/11/09(金) 16:32:23.95
ここには魔界の仮面弁士はいないの?
>>72 freeはともかく、smart pointerはわかるよ。
nothing代入派は、生ポつかって早くdeleteしたいんだろ?
「Nothingを代入するのはお作法です」←思考停止
>>76 StringやVariantに値を代入したら、メモリが確保されるのだが。
mk:@MSITStore:C:\Program%20Files\Microsoft%20Visual%20Studio\MSDN98\98VS\1041\vbenlr98.chm::/HTML/vadatvariant.htm Empty 値は、初期化されていない (初期値が代入されていない) バリアント型の変数を示します。 Empty 値を含むバリアント型の変数は、数値データと共に使われるときは 0、文字列データと共に使われるときは長さ 0 の文字列 ("") として扱われます。 Empty 値をNull 値と混同しないでください。Null 値は、バリアント型変数に有効なデータが意図的に格納されていないことを示します。
>>74 生ポとか関係のない話題を引き合いに出してまで
自分の意見を通そうとするかふつう?
Sub Foo(x As integer, y As integer) x = 5 ' コードは、 ' Main のローカル変数である z を y = 6 ' x と y の 2 とおりの名前で参照します。 End Sub Sub Main Dim z As integer Foo z,z End Sub
>>78 何を言いたいのかわからないが、Emptyを代入すればVariantに代入されていたものが解放される。
vbNullを代入すると、「vbNull」という値が代入され、その分のメモリが使われる。
>>79 生ポ=生のポインタ
まあそういうのどうでもいいよ。 それより、以前のスレでNothingを代入しないとメモリリーク起こすと言ってた奴はどこいったんだ? 早く根拠示してくれよ。
気になってググったら、一番上にヒットしてたやつにこんな書き込みが。 > 魔界の仮面弁士 2004/05/29(土) 14:33:26 > Nothingすればリークしない、という物でもありませんし、逆に > Nothingしなければリークする、というわけでもありません。 魔界の仮面弁士というのはこいつかwww
VB6でサーバアプリ作るんなら、念のためNothingを代入してやってもいいって感じ
85 :
デフォルトの名無しさん :2012/11/09(金) 18:05:23.85
Nothingを代入しないのは時間で微分した場合は一種のメモリーリークだろ? 単位次元をかえてみろっつーの。物理が分からんプログラマーは話していて疲れる。
>>85 それだとオブジェクトをSetすること自体がメモリーリークになってしまうけど?
87 :
デフォルトの名無しさん :2012/11/09(金) 18:07:56.24
>>83 >魔界の仮面弁士というのはこいつかwww
少なくともオマエよりはデキル感じが汁!
まあNothingして早めにメモリを解放して、リソースの無駄遣いにならないように するのはわかったが、ダラダラと糞長いプロシージャを書かなければいいって 事だよな。適切に機能ごとにプロシージャに分けて、スコープ最小になるように。
89 :
デフォルトの名無しさん :2012/11/09(金) 18:44:17.12
>>88 そんな事は百も承知だけど、無理な納期設定で
じっくり考える時間もない中で仕上げなければならない現実。
もうかれこれ5年やってるけど、いままで自分が満足するものを作ったことがない。
納期を無視すればいくらでも自己満足なコードは書けるだろうな。
プログラミングを趣味でやれる人たちと俺とでは生きてるステージが違うのかも。
仕事も趣味もプログラミングだから頭がヤバい
重箱の隅を突っつくヤツはVB6の作法に合わないから反省しろよ
重箱じゃないから騒がれる。ダンボール箱に住む浮浪者に暴力を振るうって感じ。
>>47 > オブジェクトを使用する場合、特に初心者に向けての忠告であれば
> 宣言1回、SET1回で終わるのが大抵なのだから
> あえて複数SETで多参照とか前提にして
> 簡単な事をあえて難しく見せることに意味はないよね。
関数を使わない初心者?
さすがにそんな初心者は想定してなかったなw
VBの構文忘れたから適当に書くけど
sub func1
Dim a As Cls
c = new Cls
func2(c)
set c = Nothing '最後の参照がなくなった時点でTerminateが発生する
end sub
sub func2(c)
func3(c)
set c = Nothing ' Nothing代入してもTerminateは発生しない
end sub
sub func3(c)
func4(c)
set c = Nothing ' Nothing代入してもTerminateは発生しない
end sub
>>66 > 君って、mainの最後でfreeする派?
mainとfreeは話が違うだろ。
Nothingを代入する行為は
”全く意味が無い”ことが多いってこと。
関数の最後の直前にNothing入れたって意味ないよ。
閉じるのを早くするためにNothingを早くすると言っている人がいるが、
それをしたいのであればグローバル変数を使わなくするだけでいい。
そうすれば、「一つの関数」の中で中盤に開放されるか
後半に開放されるかの違いでしかないだろ。
Nothingを代入 = スコープが抜けて自動的に変数削除(GC) スコープを小さくしておけば、 どっちみちスコープが終わった時に 自動的にNothing代入されるよ。 だからこれ(自動的なNothing代入)も Nothing代入の一つと考えればいい。 ということで俺はNothing代入を書かずに スコープを小さくして自動的なNothing代入に任せる派
>>89 自分の技術力の無さを
納期のせいにするな。
>スコープを小さくして自動的なNothing代入に任せる派 必ずしも踏襲できんだろうが。出来ないケースの方が圧倒的に多いだろうし。氏ねアホ。
>>96 技術力と任される仕事の納期とどんな関係があるとでも?
これだからアマチュアプログラマは困る。
先日3日で図書館のライブラリ管理システムを構築しろと言われたわ。
プログラム組むだけならまだしもDB設計やLAN構築まで3日以内に完了せよだとか。
これ、アシスタント女性一名でやれっつーんだから。うちの会社は。
99 :
デフォルトの名無しさん :2012/11/10(土) 09:14:49.83
>>93 VBの構文忘れたという前置きがあねれば
どんだけ未熟なVBプログラマ化と小一時間バカにするところだった。
良かったな。
>>98 そんな会社に居なきゃいけないってことは技術力が無いってことだね。
>>93 は上級者に間違いない。
文法を忘れたと油断させて、罠を仕掛けている。
>>98 だから関係ないでしょ?
お前の会社なら技術力がある人のところにも
同じような司令が下るでしょ?
>>97 > 必ずしも踏襲できんだろうが。出来ないケースの方が圧倒的に多いだろうし。氏ねアホ。
えっと関数は一画面で見れる程度の行数にするのが普通ですよね?
目指すべき所が間違ってる。
長い関数を見た時、やるべきことはNothing代入とかいう
小手先の技術ではなく、関数を小さくすることだ。
Nothingを代入して置かなければ不安というのは、
関数が長いという問題の兆候かもしれんな。
105 :
デフォルトの名無しさん :2012/11/10(土) 10:07:53.19
>>104 >えっと関数は一画面で見れる程度の行数にするのが普通ですよね?
そんな常識論はないよ。解像度によって画面に表示できる行数は違うし。
俺はモニターを縦にして3台並べてコーディングしているが、
一面内に収まらない関数の方が圧倒的に多い。
医療のCT映像処理で縦に撮影した数百枚の画像を
横から輪切りにしたイメージに変換してDICOM化するなんてことを
一週間納期で任される事もあるが、普通のプログラマなら一生涯かけても無理な事を
短期間にやり遂げる俺にとっては関数の行数なんて論旨に足らん話に過ぎない。
>長い関数を見た時、やるべきことはNothing代入とかいう >小手先の技術ではなく、関数を小さくすることだ。 短い関数でもNothingは代入した方がいいのでは? Terminateイベントを侮るなかれ!
107 :
デフォルトの名無しさん :2012/11/10(土) 10:10:03.55
>>106 だから代入してるよ。
関数の最後に自動的にNothingが代入される。
>>108 だからその自動で代入されるNothingが罠なんでしょ?
自分で明示的に代入したNothingと暗黙のスコープエスケープ時のNothing代入。
割り当てられるコード量に3倍ちょいの違いがあるって話ではなかったのかい?
110 :
デフォルトの名無しさん :2012/11/10(土) 10:32:14.28
明示的代入: アーリーバインド(アクセスするメモリーの範囲がローカルチック) 暗黙の代入: レイトバインド(なぜかマーシャリングが発生する)
>>110 暗黙の代入だと、対象がどんなタイプのオブジェクトかわからないので最大公約数で処理する。
この場合、最大と認定されるのはなんとOLEDB。FSOを暗黙でNothing代入しても
システムはOLEDBでも扱えるルーティンで対応するとか馬鹿仕様にも程がある。
112 :
デフォルトの名無しさん :2012/11/10(土) 11:11:35.09
VB6ってもう完全に終わった言語かと思ってたのに Nothing一つでここまで深い事実があってそれを語ることができる人たちが生き残ってることに驚いた。 もっと驚かせてくれ。
113 :
デフォルトの名無しさん :2012/11/10(土) 11:19:30.76
.Netの最大の欠点 それは外部DLLを参照する都度アンマネージドのメモリー領域へのマーシャリングが発生すること。 .Netアプリが最大の利点を得られるのはアセンブリしか使わない完全マネージドの閉じた環境のみ。 多くのアプリではこれを踏襲できるから無問題かも知れないが、そうでないアプリは今でもVB6を使っているよ。
>>109 > だからその自動で代入されるNothingが罠なんでしょ?
なにが罠なの?
関数を抜けたら変数はなくなって
グローバル変数は関数を抜けても値はそのままってだけだよね?
115 :
デフォルトの名無しさん :2012/11/10(土) 11:22:48.57
見かけの振る舞いを内部の動きとイコールに考えてる初心者が少なくない事がわかった。
>>111 なんでOLEDBがでてくるのかわからん。
変数があってその変数がなくなる(=同時にNothing代入される)
そのタイミングでVBはオブジェクトに参照してる人が一人減ったと通知する。
ここまでがVBの仕事なんだが。
その後の仕事はどっちも同じだよ。
オブジェクトはどこからも参照されなくなったと知ることができるから
終了処理をオブジェクトが行う。
OLEDBはSP6からだな
118 :
デフォルトの名無しさん :2012/11/10(土) 11:39:21.98
>>116 一人減る時の減り方まで考えがおよばないみたいね。十代かな?
リストラを考えてみよう。
ある人は黙っていなくなるが、ある人はジタバタ騒いで訴訟問題にまで発展させて減る。
外見からは同じように一人減っているが内情は大きく異なるって事。
>>118 理解してないようだから(だから変な喩えを言うのかな?w)
もう一度書いておくね。
終了処理自体はオブジェクト自身が行うから
正しく終了処理は行える。
VBはオブジェクトに対して使っているか使っていないかを
通知するだけでいい。
どちらも正しく処理してるんだけどね。 通知と処理、この違いが同じだと思ってるのね。 アサハカ
明示的なNothing代入時: フラグが立つだけ。スコープから出るときに1回の処理でOK。 暗黙のNothing導入時: オブジェクトの数だけ開放処理が行われる。
>終了処理自体はオブジェクト自身が行うから いや、間違ってるだろ?呼び出し側の処理が殆どでは?
やっぱりこいつ意味わからんw SetによるNothingの代入と 変数がスコープから消える=Nothingの代入 はどっちも同じでオブジェクトに対して 参照のデクリメントを ”通知” してる。 その後の ”終了処理” はオブジェクト自身が 参照カウンタが0になった時に行うものでどちらも同じ。 俺は明らかに通知と処理を区別して 書きましたよw
>どっちも同じでオブジェクトに対して >参照のデクリメントを ”通知” してる。 やっと癌細胞を摘出できましたよ。苦労しました。
125 :
デフォルトの名無しさん :2012/11/10(土) 11:59:51.96
初心者VB6プログラマならその理解で十分だろ?癌は言い杉。
>>122 終了処理っていうのは、オブジェクト内部の終了処理だぞ。
オブジェク自身以外の誰が、オブジェクト内部の事を知ってると言うんだ?
>>124 感想を述べるだけで言い返せないのは、負けだって聞きましたw
参照カウンタが0とか・・・。たぶん共有DLLと勘違いしてる。 でもそういう時期があっても人生、いいと思ふ。
>終了処理っていうのは、オブジェクト内部の終了処理だぞ。 みかけはそうだが実際のコード進行は全然番うよ? VB Decopilerで見てみれば分かる。
とりあえず単芝使いはそれだけで頭悪い
Nothigの代入が参照カウンタのデクリメントを通知しているってことは、 例えばこんなコードで証明できます。 Sub Hoge Dim cls1 As ClassA Dim cls2 As ClassA Debug.print 1 Set cls1 = New ClassA 'ここでClassAのInitializeが呼び出される Debug.print 2 Set cls2 = cls1 'ここは何も表示されない Debug.print 3 Set cls1 = Nothing 'なにも表示されません End Sub '関数が終わったらcls2がなくなる=Nothing代入と同じなので 'ClassAのTerminalが呼ばれます。 [ClassA] Private Sub ClassA_Initialize() Debug.print "Initialize" '初期化処理 End Sub Private Sub ClassA_Terminate() Debug.print "Terminate" '終了処理 End Sub
Set cls2 = cls1みたいな事を実際のコーディングでやるかっつーの? 意味の無い比喩。何が面白いのか?煙に巻いて逃げる気か?
>>105 いや、俺も関数は1画面内に収まるようっていう指導のもと、今がある。
今では長い関数みかけたらダサく思えるようになった。
まあ、俺も全てが1画面に収まるわけではないけど、
少なくとも2画面には収まる。
関心の分離ってわかるか?
糞長い関数を書く人が多いのもVB6スレの特徴。
VB6の内部処理の話までくると、日本で話してる人は少ないからねぇ。
参照カウンタと言えばCOMが持ってるインターフェースAddRef()とRelease()の話になる。
これは以下でも述べられてるようにSetで参照が増えた時にAddRef()が呼ばれ
Nothingを代入した時(スコープから外れた時に行われる暗黙のNothing男優でも同じ)に
Release()が呼ばれる。そしてCOMオブジェクトは内部のカウンタが0になった時に
自分自身の終了処理を行う。
http://stackoverflow.com/questions/7189196/addref-in-vb6 I'm fairly sure that VB6 doesn't support directly accessing the
IUnknown methods. But the workaround is simple. Add this declaration to a Module:
Dim ReferenceHolder As Variant
And then get AddRef() to get called with a simple assignment
Set ReferenceHolder = someObject
Reversely, get Release() to get called with
Set ReferenceHolder = Nothing
This is normal VB6 memory management at work.
自分の発言内で自己破綻してるな >デクリメントを通知 その言い分だとデクリメント毎にClassAに何らかの通知が行ってる証明にならないだろ 全体を見る脳がなさそうだ
フィールド変数をグローバル変数という奴がいるのもVB6スレの特徴。
>>134 何かの通知が行われていることは
COMSpyを使えばわかるよ。
SetによるNothing代入でも変数のスコープが外れた時の
暗黙のNothing代入でも、同じようにReleaseが呼ばれてる。
137 :
デフォルトの名無しさん :2012/11/10(土) 12:15:41.60
頭悪杉るのにも程があるな・・・ Sub Hoge Dim cls1 As ClassA Dim cls2 As ClassB Set cls1 = New ClassA Set cls2 = New ClassB Debug.print 1 Set cls1 = Nothing 'ClassAのTerminalが呼ばれます。 End Sub '関数が終わったらcls2がなくなる=Nothing代入と同じなので 'ClassBのTerminalが呼ばれます。 [ClassA] Private Sub ClassA_Initialize() Debug.print "Terminate" '終了処理 End Sub Private Sub ClassA_Terminate() Debug.print "Terminate" '終了処理 End Sub
>>137 Set cls1 = Nothing 'ClassAのTerminalが呼ばれます。
これってClassAのインスタンスへの参照カウンタが0になったからだね。
もし参照カウンタが0にならないときは
ClassAのTerminalは呼ばれないよ。
Nothingを代入しても、参照カウンタが0にならないときって
どんな時か思いつく?
>>139 気安く質問してんじゃねーぞコラ。厚かましい初心者だわ。
> Nothingを代入しても、参照カウンタが0にならないときって
> どんな時か思いつく?
それが
>>130 だろ?
ということで、ここまでの例
>>136 と
>>130 から
結論付けられることは、Nothing代入(暗黙のNothing代入含む)は
単純なTerminalイベント呼び出しではなく
参照カウンタのデクリメントを行ってるにすぎないということだ。
その結果(参照カウンタが0になった場合に)Terminalイベントが引き起こされる。
実際に行うことと、その結果発生することは
区別して考えた方がいい。
143 :
デフォルトの名無しさん :2012/11/10(土) 12:24:35.96
やっと理解できたようだな。ヤレヤレ。
だからとっくに答えは出てるってw
45 名前:デフォルトの名無しさん[sage] 投稿日:2012/11/09(金) 01:28:53.69
>>29 今更の話題。とっくに答えは出てるね。
そのコメントだけじゃ判断できなくて、
Nothingを代入する意味が正しくわかっているなら、
Terminateイベントを早めに起こすというのは間違いじゃない。
だけどよくある勘違い、つまりNothingを代入した時点で
Terminalイベントが発生すると思っているのであれば間違い。
Nothingの代入は、Terminalイベントを発生させる命令ではない。
Newしたオブジェクトは、複数の変数に代入することで
複数の変数からオブジェクトを参照することが出来る。
Terminalイベントが発生するのは、どこからも参照されなくなった時。
時間がかかる処理の前に(Nothingを代入することで)どこからも参照されなくなれば
早く開放される。それが目的なら使わなくなったときにNothingを代入するのは意味がある。
(あと循環参照を断ち切ったりグローバル変数を開放するためにNothingを代入することもある)
スコープが終わるタイミング(変数がなくなるのでNothingをするのと同等になる)で
参照を破棄されるのが問題ないのであればわざわざNothingを代入する必要はない。
バスターミナルじゃないんだから、Terminalイベントとか言うのをます止めろよ初心者君。
100レスかかって 答えが出てる話題に戻っただけかw
147 :
デフォルトの名無しさん :2012/11/10(土) 12:28:23.82
初心者Terminal君ときたらもうねwwwww 恥ずかしい人。
低次元な話してるな お前ら他の言語もやれ そしたらGCの動きなんか常識過ぎてこんな話題出ること自体が恥ずかしいことだとわかる
おっと上のをコピペしてたら移ってたwww ま、Terminal君の話の内容に 反論してる人が消えたならそれでいいかなw
自分を自分でTerminal君って呼ぶなよ。恥ずかしいだろ?
反論は? もう終わり?
○○君って呼ぶ人間て自分が古臭いって気付かないのかな 40〜50代だろどうみても…
元から破滅してる論旨に論破は不要だろうよ?ターミナル。
>>152 おそ松くんとか言いたいのかな?ターミナルは次元が低いな。
?
>>153 論破というのは、「論旨が破綻している」と
周りに認めさせる行為のことですよ。
論破しない(不要)というのなら
周りは誰も論旨が破綻しているとは
認めてくれません。
でもその初心者は今後絶対にTerminateをTerminalと間違えないだろう。 これだけ公衆の面前で恥をかかされたのだからな。 彼の人生にとっては良い出来事であったに違いない。 良かったな。
論破って
>>45 の内容にか?
言ってることが正しいのに、
いうことがあるわけ無いだろwww
こういう流れで良かったですか?
159 :
デフォルトの名無しさん :2012/11/10(土) 12:38:33.63
>>156 それ以前にTerminalイベントなんてこの世に存在しないイベントを誰も認めてはいないよ?
>>158 >>45 の内容は正しくないよ。
Terminalって単語の部分だけだけどな!
こういう流れで良かったですよw
162 :
デフォルトの名無しさん :2012/11/10(土) 12:40:46.75
>>158 >論破って
>>45 の内容にか?
その内容にあるTeminalイベントの数を数えてみろ。論破以前に破綻してるだろ?
大丈夫か?専門学校生よ。
どうやら間違いを認めて黙った人と、 ターミナルという揚げ足を取る人の 2つにわかれたようだ。
>>162 破綻の内容をちゃんと書いてくれ。
お前の口から「Terminalというスペルミス」について
文句を言ってるんだって。聞きたいよ。
>>163 俺は単芝がきもいから最初から揚げ足取りに専念してたよ
どうやって全単芝野郎から生きる気を奪えるかにしか興味ないわ
167 :
45 :2012/11/10(土) 13:12:03.16
めし買いにって、なんて書いてあるか期待して このスレを見た時の、残念感
Sanba規制でアク禁止食らってた負け惜しみ。ばいばいサルさん。
169 :
デフォルトの名無しさん :2012/11/10(土) 13:16:37.21
俺も今、セブンイレブンから398円の幕の内弁当を買って帰ったところだ。 別に500円の弁当でも良いのだが、「これで398円は安い!」と思うとつい買ってしまう。 金が貯まってしまって仕方ない。
Sanba規制ってなに? 書き込み多すぎってやつのことなら IPアドレス変えて違うブラウザから やれば大丈夫でしたよ。 IPアドレスもクッキーも違うから 連投判定は難しいと思う。
171 :
デフォルトの名無しさん :2012/11/10(土) 13:23:34.40
なんかIPアドレスとクッキだけがSanba規制の条件だと思ってる2ch初心者がいるね。 VB6初心者ぶりはよくわかったけど、何もここで2chの無知ぶりまで披露しなくてもいいのにね。 恥さらしもいいとこだわ。
>>169 それだと500-398 =102円。一年間で37,230円しかたまらないじゃないか。
俺は別に5000円の弁当でもいいんだけど398円の弁当を買って
一年で約168万円も、金が溜まってしまって仕方ない。
>>171 僕、2ちゃんねるのプロじゃないんでw
君とは違うよ。君は凄いね。いつも何してんの?
あ、プロかw
VB6もプロじゃないだろ。その頭で金取ってたら詐欺だわ。
>別に5000円の弁当でもいい 安倍のカツカレーを思い出したわ
なんかこのスレらしい間抜けなやり取りだな。 ところで、VB6って以下の場合どうなるんだっけ。 下図のようにメインフォームがA、AがBをそれぞれ参照している場合を考える。 A、Bはそれぞれ他からは参照されていないとする。 メインフォーム ← A ← B こうい場合、必ずしもAのTerminateでBへの参照を開放する必要はないんだっけ? 要するに聞きたいことは、メインフォームがAへの参照を開放した場合にA、Bが リークするかどうかってことだけど。 っていうか俺はこの話が始まった時に、当然今書いたようなこと話題にしてるんだとばかり 思い込んでたんだけど、とんだ勘違いだったなw
単芝うぜぇ
当然、A、B間で循環参照がないという前提ね
179 :
45 :2012/11/10(土) 13:41:32.51
>>176 今までの話は、俺が
>>45 で言った
とっくに答えが出てる話をしていただけ
この前提は間違ってないのだから反論しないでくれ。意味が無い。
100レスかかって
>>45 にたどり着いたのがその証拠だろ。
それを理解しているのを前提として話をしたい。
君がその前提を理解してるのであれば話ができる。
だが、俺は今から出なきゃいかんw
帰ってくるまでに話が変わっていなければ
続きをしよう。
180 :
デフォルトの名無しさん :2012/11/10(土) 13:46:52.73
100レスかかってたどり付いたのはTerminalイベントではなくてTerminateイベントだっけ学習した結果だけだろ。 幼稚園を早く卒園してこい。話はそれからだ。
>>171 sanba とか言ってる奴が
> 2chの無知ぶりまで披露しなくてもいいのにね。
とか、ウケ狙いか?
Terminate → Terminal よりマシじゃね?
>>176 GCの気持ちになって考えろってこった
C++やってるなら参照カウント方式のスマートポインタの動作だ
本当に物の分かっているやつの2、3のレスで片付く話がオレオレ解釈が入り乱れてここまで カオス状態になる現象のほうがむしろ興味深い。 これはしばしば一般社会にも起こる現象だろう。 頭のいい人が社会科学的に究明していったらノーベル賞のひとつや二つ取れるやもしれんなw シェークスピア的に言うと、にちゃんねる劇場もいろんな役者が立ち現れては消える舞台ってとこか カオス状態が必ずしも悪いというわけでもない。その混乱ぶりに我慢できず真打の役者が現れて詔を発する 事態に。すると、急にその場の喧騒が収まり演目は終焉を迎えるというわけだ。 その騒乱の中で出たがりの喜劇大根役者が他の役者の足を引っ張ったり奇声を発したり、 舞台を意味も無く走り回ったりする(本人的には主役のつもりだったりするのが滑稽ではあるがw) のもいらん存在だがご愛嬌の内だろうw
まあお前は頭悪いよ
長文だしな。
>>185 本質馬鹿だが小賢しいからノーベルやらシェークスピア等まで引っ張り出す。
お前の文章の一行目を引用すると
本当に物が解っている奴なら、お前の話も二・三行で片付く話だ。
>>189 一瞬「?」と思ったがああそうかと気づくことができた漏れはオッサン
もっと前のMS BASICじゃないの
普通に端末でclsって打ち間違えるからエスケープシーケンスで画面消去されるようにaliasしてる
VB6にもClsメソッドは存在するんですけど・・・
だから?
>>176 帰ってきたぞ。
フォームの場合はフォーム特有の問題がある。
まずフォームはクラスを拡張したものと考えていい。
だからフォームはクラスの性質をすべて持っているが
それに加えて変な性質が追加されている。
その話の前に先に
>>176 の答えから。
> 下図のようにメインフォームがA、AがBをそれぞれ参照している場合を考える。
Bを参照しているのが本当にAだけならば(ここ重要な所)
AのTerminateでBへの参照を解放する必要はない。
しかし、ここでフォーム特有の罠がある。(これは古いVBとの互換性維持のための仕様だろう)
まず確認しないといけないことは、フォームBを参照している変数はどこで定義(Dim)されているかということ。
それがちゃんとフォームAのクラス変数かローカル変数にあるのならおめでとう。
それはフォームAが消えた時に自動的に消える変数だ。
もしフォームAのどこにも定義されていないとしたら、それはグローバル変数だろう。
グローバル変数(スコープがアプリケーションスコープである変数のこと)から
参照されているのであれば当然アプリ終了まで参照は続く。
注意が必要なのが、フォームAを作るとDim FormA as New FormAというコードが
見えないところに作られるということ。FormAというクラスのFormAというグローバル変数が自動的にできる。
グローバル変数を定義したつもりはなくても勝手に作られるから注意。
このFormAというクラスとFormAという変数をごっちゃにしている人が結構多い。
Unload Meをしなければいけない場面でUnload FormAをしたり、その逆をしていたりする。
そしてもう一つ。フォームにはロード状態というものがあるということ。 ロード状態というのは「ウインドウ」が生成された状態と言い換えてもいい。 Windowsからそこにウインドウがあると認識できる状態。 ロード状態になると、グローバル変数のFormsコレクションに参照が勝手に追加される。 フォームBがロード状態にあるのなら、フォームAが消滅することで”フォームAが持つフォームBへの参照”が なくなっても、別の所が参照しているから注意が必要。 ロード状態かつ非表示になってるフォームが残っていてアプリが終了しないと言ってる人もよくいる。 ロード状態からアンロード状態にするには、フォームを閉じるかUnload命令を使う必要がある。 逆にロード状態にするのは、Load命令と・・・ここがまた罠なんだが、フォームがもともと持っているプロパティと そのフォームの中にあるコントロール、コントロールのプロパティを読み書きすると勝手にロード状態になる。 (自分でフォームに追加した変数であれば読み書きしてもロード状態にならない) フォームをUnloadしたはいいが、そのあとでフォームのプロパティを参照してしまったり、 フォームのTerminateでフォームのプロパティを参照してしまい、 終了するつもりが勝手にロードされてしまって終了しないという罠にはまってる人もよくいる。 話をまとめると、本当にフォームAの変数だけからフォームBを 参照しているのであればクラスと同じような動きをする。スコープを抜けたr勝手に消えるしリークもしない。 だけどフォームは勝手に参照が追加されてしまう罠が多いから注意が必要ということ この罠を理解せずに、「とりあえずNothing入れとけばなんとかる」と言ってる奴は、 「Nothingを入れても解放されないことがある。VBのバグだ」などとよく騒ぐ。
mk:@MSITStore:C:\Program%20Files\Microsoft%20Visual%20Studio\MSDN98\98VS\1041\vbcon98.chm::/Html/vbconcodebasics.htm フォームやコントロールを作成するときには、予約キーワードと同じ名前を付けることができます。たとえば、Loop という名前のコントロールを作成できます。 ただし、Visual Basic では、Loop という名前を使うと Loop キーワードと見なされてしまうので、通常の方法ではコードからこのコントロールを参照することはできません。たとえば、次のようなコードではエラーが発生します。 Loop.Visible = True ' エラーが発生します。 予約キーワードと同じ名前を持つフォームやコントロールを参照するには、名前の前に修飾子を付けるか、または角かっこ ([ ]) で囲む必要があります。たとえば、次のコードではエラーは発生しません。 MyForm.Loop.Visible = True ' 名前の前にフォーム名を付けます。 [Loop].Visible = True ' 角かっこを付けます。 前の例のように予約キーワードと角かっこが使えるのは、予約キーワードと同じ名前のフォームやコントロールを参照する場合です。 ただし、変数の宣言やプロシージャの名前には、角かっこを付けても、予約キーワードと同じ名前を使うことはできません。 角かっこは、ほかのタイプ ライブラリで定義されている予約キーワードと同じ名前を、Visual Basic で使用するときにも使います。
予約キーワードをコントロールやフォームの名前にする利点が分からないのだが
>>176 最後に「要するに」の方への答え
> メインフォーム ← A ← B
>
> 要するに聞きたいことは、メインフォームがAへの参照を開放した場合にA、Bが
> リークするかどうかってことだけど。
メインフォームがAへの参照を開放した場合に、
A、Bはともに開放される。
ただし、罠によって違う場所に参照が残っていないならば。
あと
>>178 に書いてあるように循環参照がないという前提で話している。
>>200 > 予約キーワードをコントロールやフォームの名前にする利点が分からないのだが
俺の知らない時代の話だが、VBは昔クラスがなかった。
フォームもクラスではなく一つしか作れなかった。
つまり、Form1を作ったら、それはForm1という名前のインスタンスだった。
というかインスタンスという考えもなく、単にForm1を作った。という認識だった。
その頃のコードをそのまま動くようにしつつ、
クラスを導入してフォームもクラスの一種にするには
こうするしかなかったのではないだろうか?
おっとw 俺のレスに対する話じゃなかったw >202は忘れてくれ。
ターミネーターをNGにぶっこんだ
相互参照は開放されないって言えば済む事を長々と書き出すやつ()
相互参照(循環参照)が開放されないってのは
>>45 ですでに指摘済み
参照カウンタ方式のGCでは他の言語でも一般的な話だから
ここはVBスレなわけで、今話してるのはVB特有の問題の話。
相互参照をFormを例に必死に説明してただけでしょそれはVB特有の話じゃない 長文書いて気持ちよくなりたかっただけだよね?
>>208 お前ちゃんと読んでないでしょw
相互参照の話はフォームの話の中にはどこにも出てきてないんだよ。
フォームA → フォームB
フォームAがフォームBを参照しているだけのように見えて
(見えないグローバル変数)
↓ ↓
フォームA → フォームB
気づいていないグローバル変数が存在して
いつの間にかそこから参照されているって話なんだから。
どこにも「相互」な参照は存在しない。
このあとのレスを想像 Q.なんだよ見えないグローバル変数ってわけわからん A.だからVB特有の話だって言ってんだろ。 Form1フォームを作った時に勝手に作られるForm1変数とか ロード時に登録されるFormsコレクションのことだよ。 これが他の言語にもある話か?相互参照の話か?
>>197 やっぱりTerminate後にクラスのメンバ変数は自動的にNothingになるんだね。
まあある意味当然か。
あんまり関係ないが、VB.NET使ってると俺が時々やってしまうポカにWitheventsな
フィールドへのNothingの入れ忘れがある。
特にフォームでこれをやるとFormClosed後でも参照してるオブジェクトのイベントを拾ってしまって
既にハンドルが破棄されたコントロールを更新しようとして例外なんてことになるが、
VB6の場合はこれはないわけか。
なんだデフォルトインスタンスの話しか その話ならどっかで参照持ってるやつがいるならGCが回収しないのは一般論だし長文書く必要もないだろ 長文オナニー楽しいでしょ
>>212 長文にならない方法で説明して欲しいw
少なくともお前の文章ではForm1のこともFormsのことも
分からない。
フォームは、ロード状態と表示状態が別々にあるから気をつけろ。 フォームのプロパティに触れると勝手にロードされるから気をつけろ。 あとは、クラスと同じ注意が必要。 と言うだけでしょ。 Forms なんて、システムが勝手にやる話だから、説明してもしょうがない。
>>214 それがNothingの話とどう関係があるんだ?
それが抜けてるだろ。
お前はフォームの話をしているに過ぎない。
> あとは、クラスと同じ注意が必要。
だからクラスには無い問題があって、 それがどうフォームのロードとつながるのかって 話をしないとダメだろ。 Formsもちゃんと説明しないと、だってそこに 参照ができるんだからさぁ。 元々の話わかってる? フォームの話じゃなくて参照の話だよ。
だめかどうじゃないくて フォームとNothingの関連性が 説明されてないって言ってるんだが。
Nothing の話は > あとは、クラスと同じ注意が必要。 で充分だろ。 頭に血が上ってるのは判るけど、ちょっと冷静になれよ。
221 :
デフォルトの名無しさん :2012/11/11(日) 22:42:30.83
まあ揚げ足取りしてる変な奴もどうかと思うが.... どちらの人も言ってないと思うけど、Formの特殊性は参照されてなくても 生存し続ける必要があるという機能的な要請から来てるんだよね。
このスレの住人は絶対自分の意見を曲げないアスペだからしょうがなし
>>223 不要でしょ。
必要だと思うなら、君が説明すればいい。
すでに説明済みw
ぐぐればなんでも説明済みw 2度手間乙w
ぐぐるまでもなく、このスレで説明済みだろw
>>105 > 医療のCT映像処理で縦に撮影した数百枚の画像を
> 横から輪切りにしたイメージに変換してDICOM化するなんてことを
> 一週間納期で任される事もある
へー、それVB6でやってんだ。
お前らほんと何回も何回も同じ議論ごっこして飽きないのな。 お前らが話してることなんかどうでもいいんだよ。 問題は、こういう主張してる奴がいるって事。 ・Nothingを明示的に代入することと、スコープを外れたときの処理とでは内容が異なる ・Nothingを代入しないとメモリリークする 本当なら、根拠を示してくれよ。
CやC++じゃあるまいし、オブジェクトを利用し終わったら取りあえずNothing入れとけとか... Nothingキーワードの意味を調べとけって感じだな...
>>230 VB6は医療系に強いよ。
無茶な納期要求、スカラー型を主に使えばネイティブCコンパイラ高速処理が可能だし
医療系OCXも充実している。
>>231 人に聞かないで自分で試して論拠を提示しなよ。能無しの雑魚が。
235 :
デフォルトの名無しさん :2012/11/12(月) 14:23:17.92
>>232 CでNothing代入とか言ってる貴様の空気脳にはマイッタヨ。
236 :
デフォルトの名無しさん :2012/11/12(月) 14:25:50.07
>>235 C++とCを混同してるんだろ?ほうっておけ。バカが移るぜ?
238 :
デフォルトの名無しさん :2012/11/12(月) 14:30:18.10
>>237 C++でも処理系を限定しないならNothingは関係ない。
純粋に言語仕様で物を考えられない初心者と
説明下手な長文さんの巣窟だねここは。
ヤレヤレ ┐(´ー`)┌
NothingはVB6にとどめておけよ。 Cキチガイまで参加してきたらオワルぞココ。
241 :
デフォルトの名無しさん :2012/11/12(月) 14:51:26.88
まとめると、VB6でオブジェクトが不要になった時は Terminateイベントを早期に発生させるためにNothingを導入するが正解なのね? この結論のためにどんだけ無駄スレ消費してるのよ君ら? そのエネルギーを仕事に使えばいいのに。
>>241 > まとめると、VB6でオブジェクトが不要になった時は
> Terminateイベントを早期に発生させるためにNothingを導入するが正解なのね?
不正解
ホントageてる奴って馬鹿ばっかだな
244 :
デフォルトの名無しさん :2012/11/12(月) 17:00:16.12
ホントsageてる奴って暗い奴ばっかだな
難しい事は判らないが...たぶん不正解だろ
>>245 また最初から繰り返すつもりか?
不正解だ馬鹿。
真昼間からおまえらみんな暇人だな
malloc/free論争でも、ど素人に近づくほどfree必要派が増えてくのと似た感じ
250 :
デフォルトの名無しさん :2012/11/12(月) 17:23:34.41
オブジェクトが使ってるメモリを一刻も早く解放したけりゃNothingしておけばいいんでね?
>>247 正解にしとけ。WEBサイトで堂々とアピールしている先生様の面子も考えてやれやwwwwww
>>249 つ、mallocしたらfree必須だろうが?アホか貴様は?
>>250 Nothingしてもメモリは解放されない
254 :
デフォルトの名無しさん :2012/11/12(月) 17:32:13.91
Nothingして「ほかに参照がないなら」メモリは解放だっけ?
Nothingしなければ参照ポインタが0になっても解放されない。
参照ポインタが0になったら即座に解放してほしければNothingを代入しなければならない。
>>255 質問!
それは、オブジェクトを返す関数を作ると、メモリがリークするって事か?
>>257 なぜそういう疑問になるか意味不明。参照の意味わかってないのね?
>>255 Nothingしなければ参照ポインタが0に(なった時点では)解放されない。
260 :
デフォルトの名無しさん :2012/11/12(月) 17:59:27.94
Nothingしなければ参照ポインタが0になっているのならスコープを外れるときに解放される。 Nothingすれば参照ポインタが0になっているのならその時点で解放される。 参照ポインタが0になっていないのなら何をどうしようが解放されることはない。これがメモリーリークだ。
>>261 それってmallocで実際にメモリが確保されるタイミングが分からないからという事?
まだ確保されていないのにfreeしたらイカンという事なら
元々そういう確保ディレイが生じるシステムではfreeもディレイされるよう設計されているから問題無い。
逆にそうなっていないとしたらシステム側の問題であってプログラマに責任はない。
つ、そんなシステム、誰も相手にシンクなるから放っておけば淘汰される。
基本、mallocにfreeは絶対必要と考えていい。
>>262 freeしたところで実際にはメモリをシステムに返さないから意味ないから書かなくていいという考え方みたい。
そもそも実装とコーディングは別次元の話なので、freeが不要だという考えは間違っている。
しかし間違えた方がエレガントに見えるので、問題が無いのであれば間違いを受け入れることを
あえて初心者にすすめる人もいる。
世の中で自分目線で正しい事が、必ずしも世の中に対する正義にはならないのと同じ。
それって A: 「私は私を眠らす」 B: 「私は眠る」 上では、Bの方がエレガント、みたいな話?
グローバル変数・・・アプリが終了されるときに解放される クラス変数・・・クラスがなくなるときに解放される ローカル変数・・・関数が終了するときに解放される ・変数の生存時間 (短い)ローカル変数 < クラス変数 < グローバル変数(長い) ようするにこういうこと。 ローカル変数の場合、変数の生存時間が短いことが多いわけだから Nothingを代入する必要は殆ど無い。 もし代入した後ですぐに関数が終わるようならやる意味は無いと言い切って良い。 クラス変数の場合、変数の生存時間はローカル変数より長い。 だけど、クラス変数の場合はたいがいクラスが生きてる間は参照先を使う事が多い。 もしTerminateなんかでNothingを代入しているようならそれは意味が無い。 クラスは生きているが参照先が不要になった(ただしローカル変数ではない)って時だけ Nothingを代入する必要がある。 アプリが終了するまで参照が消えない。これは長時間だが そもそも、グローバル変数を使うときは、長時間何かのオブジェクトを使いたい時。 長時間使う必要がないのに、グローバル変数になっているのは設計がまずい 結局どのパターンも ”早く解放したいという理由で” 明示的にNothingを代入することはまずない。
>>258 > Nothingしなければ参照ポインタが0になっても解放されない。
細かいようだが、この文では、Nothingしない限りメモリは解放されないと読める
クラス変数よりローカル変数の方が生存期間が永いケースなんて山ほどある
268 :
デフォルトの名無しさん :2012/11/12(月) 20:45:43.63
まーは不完全な理論展開か?また荒れるぞ!
>もしTerminateなんかでNothingを代入しているようならそれは意味が無い。 正しいと言えるのはココだけかな?
誰にレスしたらいいかわからんから適当に。
C言語におけるmallocとfreeの話は
VBのNew、Nothingの話とは違う。
なぜならC言語にはGCがないからだ。
http://www.kouno.jp/home/c_faq/c7.html > 7.24:
> プログラムが終了する前に、確保したメモリを解放しなければならな いか。
> A:
> その必要はない。まともなオペレーティングシステムならきっとプロ グラムが終了した時点で
> すべてのメモリを取り返すだろう。にもかか わらず、個人向けコンピュータ(PC)の中には
> メモリを取り戻すことが 確実にはできないものもあるようである。ANSI/ISO C規格から
> 結論つ けられることは、解放してくれるかどうかは「実装の品質がどれくら い高いかによる」ということだけである。
freeしなくてもいいという理由「まともなOSならOSがやってくれるから」であり、
GCが自動的にメモリ解放してくるからという理由ではない。
272 :
デフォルトの名無しさん :2012/11/12(月) 20:49:10.13
>>269 Terminateイベントを早めに出すためにNothingの代入が必要だということは認めてるんじゃね?
あくまでTerminateイベントが出たからってメモリから解放されないと言いたいのでは?
あまり煽るとまたTerminalとか言ってきそうなので程々になwww
>>267 > クラス変数よりローカル変数の方が生存期間が永いケースなんて山ほどある
ないだろw
クラスに定義した変数よりも クラスに定義した関数の中のローカル変数のほうが 生存時間が長い? 不思議なコードだなw 書いてみて。
>>272 > あくまでTerminateイベントが出たからってメモリから解放されないと言いたいのでは?
Terminateイベントはメモリ解放の直前に発生するんだぞ。
Terminateイベント発生時はメモリ解放されてないの当たり前だし、
イベントが終了したらメモリは解放される。
そしてTerminateイベントが発生するタイミングは
誰からも参照されなくなった時。
>>272 なるほど。
>>273 ほとんどないだろうがシステム側の定義が無い以上絶対にないとは言い切れないな。
たとえばローカル変数と言っておきながらシステム的にはスコ―プが外れても開放しない。
理由はまたプログラムがローカル変数を定義するかもしれないからそのままにしておくという。
CPUのレジスタを使うかメモリを使うかは処理系任せなのだし、コーディング上であれやこれや言っても
机上の空論におわりそうだな。
GCを搭載している言語は わざわざメモリ解放を手動でやったりしないよ。 それが答えじゃないか?
> 理由はまたプログラムがローカル変数を定義するかもしれないからそのままにしておくという ローカル変数は、関数が終わったら自動的に消える (オブジェクトならNothingされる)って知ってますか? どうやってそのままにするの? ちょっと具体的にコード書いてみて。
>>276 は「ローカル変数」と「ローカル変数の参照先」の区別がついてないんだろうな。
280 :
デフォルトの名無しさん :2012/11/12(月) 20:58:55.45
>>276 VB6という処理系に限定してもローカル変数の生存時間が非常に長い事がありますよ。
たとえば局所的にローカル変数を数百個定義した場合などがそれで
VB Decompilerで見るとなんとローカル変数を開放していないばかりかスタックにもなっていない。
そう、mallocで確保したメモリをローカル変数に使ってるのですよ!
こうなるともうfreeが要不要論にまで発展してしまい、それこそ収拾がつかなくなりますわ。
>>280 だからローカル変数と、ローカル変数の参照先の
区別ぐらい付けられるようになれって。
アホ丸出し
「ローカル変数の参照先」とかまーた屁理屈こねだしましたよ? 突っ込まれると色んな比喩を使ってくるから分かりやすい人ですね。ふふふ。
参照型を持ち出すなら剪定としてローカル変数なんて持ち出すなよ。 そのうち何でもポインターですとか言ってしまうのだろう?この青ケツ坊やは?
> たとえば局所的にローカル変数を数百個定義した場合などがそれで Dim v001 As Integer Dim v002 As Integer : : Dim v998 As Integer Dim v999 As Integer こんなコードか?w
>>284 なんでそこで切れてるの?
さっきからNothingって話してるだろ。
Nohingってのは参照型にしか代入できないんだが。
日本語が不自由らしい
289 :
デフォルトの名無しさん :2012/11/12(月) 21:06:44.43
生存期間の説明にローカル変数を引き合いに出したものの 突っ込まれて慌てて参照型を持ち出す慌てよう。 見ていて滑稽。アホ丸出しですwww
>>285 定義と宣言の意味さえもわからないようでつ
>>289 滑稽なのはお前のことだよ。
みんなわかってるよ。
>>290 C言語のように、定義と宣言が分かれてる言語なら
よかったねw
みんな = おまえの妄想 大丈夫か?医者いけよw
>>292 うわっ!とんでもないVB6初心者を相手にしてたのね俺。
菌が伝染しそうで恐いわ。
>>293 お前以外は一人だと思ってるの?w
ちょっと頭悪いと思う。
宣言というのは、今から○○という名前を使いますよこと。
定義っていうのは○○という名前のものをそこに作りますよって言うこと。
>>285 はv001という変数がそこにできるから
これは定義。
298 :
293 :2012/11/12(月) 21:13:36.24
>>295 ええと、あなたに言った覚えはないのですが?見えない敵をつくらないでね。
妄想ちゃん
>>298 え? 違う人がレスしたらダメなの?w
みんなでお前を叩いてるって図なんだがw
昨日のターミナルくんが今日はローカル変数くんになって帰ってキタ? 連日頑張るなぁ。
>>300 違うけどw
でもそう思ったお前は
連日このスレに居るってことかなw
でなきゃ連日なんてわからないよね。
VB6に宣言と定義の違いなんてあるわけないだろう。 さすがこのスレというか、もう馬鹿丸出しだな
303 :
デフォルトの名無しさん :2012/11/12(月) 21:17:29.42
>>299 語尾に草が付くようになっては心理状態がまるみえでつよ?
取りあえず大切な事は Nothingは、オブジェクトが存在しない事を示すオブジェクト型である Nothingを代入すれば、オブジェクトは解放される場合がある
>>302 いやまったく。ターミナル小僧ときたらもうね。
>>303 心理状態がバレないようにわざとwを付けなかったんですねw
308 :
デフォルトの名無しさん :2012/11/12(月) 21:19:37.25
まあ上げ足を取られる前に言っておくけど、一応外部dll内の関数を「宣言」する 構文はあるけどね
309 :
302 :2012/11/12(月) 21:19:39.74
>>306 TerminateをTerminalとスペルミスするくらいの頭だから大目にみてやろうよ。
こいつが馬鹿でしたwww
↓
290 名前:デフォルトの名無しさん[sage] 投稿日:2012/11/12(月) 21:07:31.36
>>285 定義と宣言の意味さえもわからないようでつ
ターミナル小僧のせいに
しようとしてるのバレバレw
>>290 だろ。馬鹿なのは。
>>311 ということはターミナル小僧だったんだな?
イヒヒ
313 :
デフォルトの名無しさん :2012/11/12(月) 21:23:23.52
ローカル変数と、ローカル変数の参照先の 区別もつかない奴はどこに行った? 値型と参照型の区別もついてない奴だよ。 ローカル変数ではなく、参照先のオブジェクトが ヒープに作られてるのを見つけてドヤ顔してても 周りから見ると恥ずかしいだけだよ。
ターミナル ローカル ドヤ顔 (^o^)/
>>314 話を蒸し返すな。
また
>>280 が暴れだすぞw
279 名前:デフォルトの名無しさん[sage] 投稿日:2012/11/12(月) 20:58:46.74
>>276 は「ローカル変数」と「ローカル変数の参照先」の区別がついてないんだろうな。
280 名前:デフォルトの名無しさん[] 投稿日:2012/11/12(月) 20:58:55.45
>>276 VB6という処理系に限定してもローカル変数の生存時間が非常に長い事がありますよ。
たとえば局所的にローカル変数を数百個定義した場合などがそれで
VB Decompilerで見るとなんとローカル変数を開放していないばかりかスタックにもなっていない。
そう、mallocで確保したメモリをローカル変数に使ってるのですよ!
こうなるともうfreeが要不要論にまで発展してしまい、それこそ収拾がつかなくなりますわ。
281 名前:デフォルトの名無しさん[sage] 投稿日:2012/11/12(月) 20:59:44.16
>>280 だからローカル変数と、ローカル変数の参照先の
区別ぐらい付けられるようになれって。
アホ丸出し
キチガイ↑ サワルナチュウイ!
無駄に時間を消費しているだけで何も説明できてないな。 こいつら雁首そろえて馬鹿か?
まあ、Nothingを free( p ) と勘違いしてるみたいだから馬鹿には違いない
スペルミス程度なら愛嬌で済んだけどなw
しかし、今時どの言語スレをみてもこれだけ熱く語っている所を見た事が無い。 なぜ枯れたVB6が今これほどまでに熱いのか??? 誰が三行で説明してくれ。
322 :
デフォルトの名無しさん :2012/11/12(月) 22:31:41.02
>>321 Nothingを代入すると言語がプログラマを見て、メモリを開放するかどうか判断するところだろ?
こんなインテリジェントな言語が他にあるかっつーの。
323 :
デフォルトの名無しさん :2012/11/12(月) 22:54:53.27
>>321 VB6使いの仕事
今はもう細かい知識を競い合う以外には
Nothing
終わったVBスレがム板で5番目に勢いがあってワロタ
幼稚な。
するよ。それだけじゃないけど。
>>328 だから、Nothingはメモリを開放しない
Nothingの代入で、メモリが開放されたように見える場合があるだけ
330 :
デフォルトの名無しさん :2012/11/13(火) 11:45:36.27
Nothingする 参照カウンタ一つ減る 参照カウンタがゼロならメモリを解放する
>>271 > C言語におけるmallocとfreeの話は
> VBのNew、Nothingの話とは違う。
> なぜならC言語にはGCがないからだ。
なぜ俺がmalloc/free論争の話を持ち出すかというと、VBでのNothingの話と、
「本質的に必要ではないfreeなのに、なぜfreeしろというのか」という文脈が同じだから。
malloc/free論争では、「使ったのだからfreeするのは当然(思考停止)」「お作法として
必要(思考停止)」と頑固に主張する人がいたため、長大な論争となった。
Nothingで言うと、スコープ出る前にオブジェクトの解放が必要に決まってるのだからNothing代入が必要、って感じだな
>>332 オブジェクトを返す関数の場合はどうするの?
>>333 その、オブジェクトを返す関数を呼び出す関数のスコープを抜ける前にNothingの代入が必要かどうか
という問題に置き換わるに決まってるんだけど、そんなこともわからないわけ?
>>329 だからメモリーは解放されるってば。タスクマネージャーで見ていても明白。
バッカジャネーノ?
Nothingを代入しろ派は、C++のスマートポインタにメモリを解放するメソッドがあったら、 明示的にそのメソッドを呼びたくなっちゃうの?
VB6の話題にC++を引き合いにでしてしまうアンポンタンを最近よくみかけますね。
Set X = Nothingしたときに呼ばれる関数も 関数の終わりに自動実行される自動変数のデストラクタも VB6ではなくてC++で実装されているんじゃないかね。
>>338 そんなことはありません。VB6ではOLEオートメーションが呼び出されます。
その先は何をやっているのかわかりませんが単純にC++ライブラリ渡しではありません。
残念でした。
>>334 ん?
オブジェクトを返す関数の戻り値としてのオブジェクトの参照にたいしてどうやって明示的にNothingを代入するのかと言うのを聞いている
Function TestFunc() as Object
Set TestFunc = New なんかのオブジェクト '<-こいつにどうやって明示的にNothingを入れるの?
'以下なんかの処理
End Function
>>335 Nothingを代入しても、参照カウンタが0にならなければ、オブジェクトの開放は行われない
VB6にはGCは無いので、参照カウンタが0になればオブジェクトは開放される
>>340 アホなの?
sub foo()
set bar = testfunc()
set bar = nothing
end sub
>>340 だから結局「解放される」を否定することはできないだろうって事だよ。
「開放」とか書いてる奴は、オブジェクト志向とか書きそう
345 :
デフォルトの名無しさん :2012/11/13(火) 14:26:48.66
>>343 あの例ならExcelAppを Command1_Clickで宣言すべきじゃねかと思った。
VB6はExcelのVBAとは違うぞ? そもそもVBAとは似て非なりでVBAの方が言語的には進んでいる。 構造的にはVB6が勝るが。
プログラマって日本語能力が低い奴しかおらんの?
いつのまにVBAの話になったの?
>>341 それは、変数barにNothingを代入しただけじゃん
俺が言っているは、暗黙変数TestFuncにNothingをどうやって代入するのかだ
>>342 Nothingの代入の有無にかかわり無く、開放されるべきときに開放され、開放されるべきではないは開放されない
過疎のム板で加速する旧VBスレ
俺含めてこのスレの奴ら全員日本語能力が無いんじゃねえの
日本語能力じゃなくコミュ力が無い コミュニケーション、つまり意思伝達 このスレの連中は互いに意思伝達が出来てない 自分の言いたいことだけを一方通行的にわめいてるだけ
言う側に難があるのか聞く側に難があるのか
>>346 が、なぜVBAの話を開始したのかが理解できない...
このスレの連中とはチームは組めねえ しょうもないことで言い争いになりそうだから
>>348 VB6の説明にC++を引用するアホがいたかと思えば今度はVBAを引き合にだすドアホが出る始末。
黙って見ていれば日本語不自由な奴が日本語叩き。もうなんちゅうとこなの?ココは?w
どちらか一方が引けとは言わん、両方引け。互いに相手に主張が通じてないのに言い合うのは議論とも討論とも言わん。自分の主張するだけとかまるで幼稚園だぞ。
>>349 >
>>341 > それは、変数barにNothingを代入しただけじゃん
> 俺が言っているは、暗黙変数TestFuncにNothingをどうやって代入するのかだ
その、オブジェクトを返す関数(TestFunc)を呼び出す関数(bar)のスコープを抜ける前に(変数barに)Nothingの代入が必要かどうか
という問題に置き換わる
ってことなんだけど理解できないか?
>>359 TerminateをTerminalと間違えるのも幼稚園だから?
訂正。 誤: 呼び出す関数(bar) 正: 呼び出す関数(foo) ところで、参照カウンタの話は理解してるよな?
消えゆくVB6最後の花火だね
>>359 コミュ力が無い相手、日本語が通じない相手に何言っても無駄です
>>357 それ以前にお前さんとチームを組む必要がどこにあるんだよ?w
>>364 無駄だと知りながら力説する君のその矛盾は一体なに?
>>365 文面そのままの意味で受け取るとかアスペかよ
>>367 アスペルガーがいることを踏まえて遠回しな表現や婉曲表現や比喩表現などは一切控えてください
アスペばかりだからコミュ不全なのか。なるほど納得。
>>343 の例がExcelを使う話だったから、VBAがどうこうとか言い出したんじゃね?
371 :
デフォルトの名無しさん :2012/11/13(火) 14:56:47.05
>>367 文面そのままの意味で受け取るとアスペだというお前の理論が既に崩壊している件。
>>368 今度はアスペルガーと省略しない理由は別人だからと言い張るであろう予測は的中。
>>360 意味不明、俺は
Function TestFunc() as Object
Set TestFunc = New なんかのオブジェクト '<-こいつにどうやって明示的にNothingを入れるの?
'以下なんかの処理
Set TestFunc = Nothing 'まさか、Nothingを明示的に代入するという人は、こうやってNothingを代入する気なのかい?
End Function
って質問をしてるの
>>374 そのコードだとオブジェクトを返してないじゃん。
アホ?
それと何か勘違いしてるようだけど、俺は
>>343 でNothing代入不要論者だから。
>>378 Nothing不要だと思ってるなら、「Nothingが必要だと思う人に聞いてくれ」って返せばいいじゃない
わざわざコードまで書いて質問してるんだから、コードの意図も読めよ
>>379 > Nothing不要だと思ってるなら、「Nothingが必要だと思う人に聞いてくれ」って返せばいいじゃない
なんで?
> わざわざコードまで書いて質問してるんだから、コードの意図も読めよ
意図がさっぱりわかんないんだけど。
>>333 > オブジェクトを返す関数の場合はどうするの?
という疑問なら、
>>334 > その、オブジェクトを返す関数を呼び出す関数のスコープを抜ける前にNothingの代入が必要かどうか
> という問題に置き換わる
ってことであって、それ以上でも以下でもないよ?
>>380 Set Bar = TestFunc()
とした場合、変数Barと、TestFunc関数の暗黙変数TestFuncは、同じオブジェクトへの参照を持つ、全く別の変数です
つまり、明示的にNothingを入れなければならないという主張を正しいと言うには、暗黙変数TestFuncへの明示的なNothing代入が出来なければなりません
で、変数Barにオブジェクトを代入した後、暗黙変数TestFuncに明示的にNothingを代入する手段は存在しますか?
まっ、サブルーチンや関数の引数にTestFunc()を直接指定すれば、暗黙変数TestFuncを明示的にNothingできるけど...それは、それでダーティーな手法だろ...
>>381 >
>>380 > Set Bar = TestFunc()
> とした場合、変数Barと、TestFunc関数の暗黙変数TestFuncは、同じオブジェクトへの参照を持つ、全く別の変数です
そして、この行の実行中、「なんかのオブジェクト」の参照カウントは一旦2になり、この行の実行が
完了したら自動的にTestFuncがもっていた「なんかのオブジェクト」の参照はなくなり、参照カウントが
1(Barが参照している分)になる。
つまり、
>>334 > その、オブジェクトを返す関数を呼び出す関数のスコープを抜ける前にNothingの代入が必要かどうか
> という問題に置き換わる
ってことであって、それ以上でも以下でもないよ?
>>382 つーかさ、勝手に質問を変えないで
俺は、暗黙変数TestFuncに対して明示的にNothingを代入する方法を聞いてるの
明示的にNothingを代入する方法が無いなら、「システムが自動で回収するから問題ない、極一部の場合を除いて明示的なNothingなんて必要ない」で話は終了するの
>>383 いやいや、勝手に意味不明な質問に変えてるのは君なんだけど。
>>332 > Nothingで言うと、スコープ出る前にオブジェクトの解放が必要に決まってるのだからNothing代入が必要、って感じだな
>>333 > オブジェクトを返す関数の場合はどうするの?
>>334 > その、オブジェクトを返す関数を呼び出す関数のスコープを抜ける前にNothingの代入が必要かどうか
> という問題に置き換わる
〜という問題に置き換わるのであって、「オブジェクトを返す関数(の変数)にNothingを代入する」なんて
問題はどこにも存在しないわけだ。
存在しない問題に対しては答えられないよ。
付け加えると、
>>383 > 明示的にNothingを代入する方法が無いなら、「システムが自動で回収するから問題ない、
> 極一部の場合を除いて明示的なNothingなんて必要ない」で話は終了するの
〜で話が終了しないから紛糾してるんだけど。
あ、ひょっとすると、左辺値とか右辺値という概念がない人?
>>384 Nothingを使う必要が無いというのは同意だが、なぜNothing使う必要が無いのか理解してないんじゃないの?
388 :
384 :2012/11/13(火) 18:06:30.73
>>387 > なぜNothing使う必要が無いのか理解してないんじゃないの?
ん、主語は俺なの?それとも彼?
彼だとしたら、説明済みなんだけど、理解できてないのかしら。
>>382 > そして、この行の実行中、「なんかのオブジェクト」の参照カウントは一旦2になり、この行の実行が
> 完了したら自動的にTestFuncがもっていた「なんかのオブジェクト」の参照はなくなり、参照カウントが
> 1(Barが参照している分)になる。
390 :
384 :2012/11/13(火) 18:11:22.35
いかん、変な奴に絡まれはじめたので、俺からのこの話題に関するレスは終了。
潔く負けを認めるとは立派だなw
392 :
384 :2012/11/13(火) 18:12:50.86
最後にばしっと答えてあげとくか。 > 俺は、暗黙変数TestFuncに対して明示的にNothingを代入する方法を聞いてるの そのような方法は無いし、そもそもそんな問題は存在しない。 さらには「暗黙変数」とかいう俺用語使うな。
そいつが俺用語使うなら君の弁舌は俺擁護じゃないのか?
おつかれさまw
395 :
384 :2012/11/13(火) 18:18:15.27
>>393 別に自分自身を擁護する必要なんかないわけですが。
つか、君も俺のレスの何かにコメントしたいわけ?だったらしなよ。
別角度の話題になるんだったらレスするから。
結論がNothingとはこのスレらしくていいね
結局は、Nothing代入は不要でいいんだよな? 代入必要派の反論ある?
>>340 > オブジェクトを返す関数の戻り値としてのオブジェクトの参照にたいしてどうやって明示的にNothingを代入するのかと言うのを聞いている
多分、オブジェクトを返す関数の戻り値がスタック上にしか存在しないというのがわかってない。
呼び出しが終了すれば、スタックが破棄され参照は消滅する。
初心者なもので話に全然ついていけません。要するにNothingって住所を抹消するってこと だが住所先の種類や状態によってその意味合いが変わり、自動的に消滅するものは Nothingは不要って話?
400 :
桃白白 :2012/11/13(火) 18:55:30.33
>>397 ケースバイケースだろ。しかしまあ、だいたいはそれでいんじゃね。
オブジェクトがメモリを大量に消費して自転車操業的に実行しなければメモリが
やばいです超やばいですってんじゃないなら問題ないだろ。
Dim o As Object
Set o = New BigMemoryConsumer
Call Use(o)
Call SuperLongTimeProcessing()
こんなときは必要なくなった時点で破棄してやらんとまずいわね。桃白白そう思うわね。
>>397 反論じゃないけどNothingの代入は必要だと思ってる。
代入しなくても動くから代入しないとかいう考えはあまりにも稚拙だし。
おまえら不毛な議論好きね
>>402 .netがだらしないからな。しかたないよ。
404 :
デフォルトの名無しさん :2012/11/13(火) 20:32:54.49
オブジェクト変数のスコープ抜けたら勝手にNothingしてくれるんじゃないの? なんでわざわざという気がする。
早期にTerminateイベントを出してスコープから出るときのイベントラッシュを回避するんじゃね?
>>401 質問!
次のコードの場合、オブジェクトForm1は開放されないの?
Set o = New Form1
Set o = New Form2
>>406 されない。
解放タイミングはそれをどこで定義したかによる。
>>407 では、
Set o = New Class1
Set o = New Class2
の場合は?
409 :
デフォルトの名無しさん :2012/11/13(火) 20:52:05.90
Terminateイベントが発生する=解放、でいいの?
>>408 Set o = New Class2 の時点でClass1は解放される。
411 :
デフォルトの名無しさん :2012/11/13(火) 20:55:46.83
>>406 >>408 同じ変数を違う用途で使いまわすのはお行儀がよろしくないかと思いますことですわよ
>>409 違う。解放タイミングはシステムの都合で一方的に決められる。
例えばあるサブルーチンで100のオブジェクトを個々の変数にSETした場合
スコープを抜ける時に100のTerminateイベントが一斉に発生する。
このオーバーヘッドはバカにならない。
しかし、Nothingを代入して参照カウントが0になったとしても
そのオブジェクトがメモリから解放されるとは限らない。
そしてその心配を君がする必要はない。
それがVB6プログラミングさ。
つまり「解放」と言った場合に、プログラミング上で「解放」しているのと 実際にメモリがシステムによって「解放」されるのとでは 時間的に非同期という事なんだね。
>>410 質問ばかりで申し訳ないが、もうちょっと付き合って
Set o = New Form1
Set o = Nothing
Set o = New Form2
この場合は?
>>413 その通り。
だから、せっかくNothingを代入して解放したつもりでもされてないのなら意味が無い。
それならスコープを出たら勝手に解放される事になってるのだから
そもそもNothingを代入する意味はないと考える人たちが多いのさ。
>>415 へぇーそうなのか。でもNothingを代入する人たちがいるのはなぜなの?
>>416 うむ、それはだね。Nothingを代入する事にはもう一つ意味があって
Nothingを代入した時点でTerminateイベントが発生するという特徴があるんだよ。
どうせ空のイベントだからってバカにするかもしれないけど内部的にはメッセージが発生し
他の処理の妨げになることがあるので、できるだけ早めに出させて後でまとまって発生しないように
配慮しているのさ。
>>417 ふーん。では例えばこのような場合、解放とTerminateイベントの発生はどうなるの?
Set o = New Form1
Set o = Nothing
Set o = New Form2
>>418 Set o = Nothing の時点でForm1のTerminateイベントが発生する。
ここでプログラミング上はオブジェクトが解放されるが実際にシステムはメモリーを開放していないかも知れない。
Set o = New Form2 の時点でForm2のInitializeイベントが発生する。
Form2 の開放タイミングとTerminateイベントの発生はこれがどこで定義されているかに依る。
各イベントでイミディエイトウィンドウに処理を書き出して様子を見ればいいんじゃないの
421 :
デフォルトの名無しさん :2012/11/13(火) 21:14:40.90
オブジェクト変数のスコープ終盤まできっちりオブジェクトを参照することが多いんよな。 結局スコープ終端でしかNothingできないコードになっちまう。
>他の処理の妨げになることがあるので どうせ具体例はないんだろ?
>>412 > スコープを抜ける時に100のTerminateイベントが一斉に発生する。
> このオーバーヘッドはバカにならない。
0.01秒もかからずに終わったけど?
>
>>408 > 408 名前:デフォルトの名無しさん[sage] 投稿日:2012/11/13(火) 20:49:55.63
>
>>407 > では、
>
> Set o = New Class1
> Set o = New Class2
>
> の場合は?
>
>
>
> 410 名前:デフォルトの名無しさん[sage] 投稿日:2012/11/13(火) 20:52:41.20
>
>>408 > Set o = New Class2 の時点でClass1は解放される。
あれ? おかしくない? Nothingしてないのに
なんで解放されるの?
C言語ってmallocしたあとにfreeしなくていいんだよね?って
言ってこんなコードを書いたらちゃんとfreeしろって怒られた。
どういうこと?
int foo(void)
{
char *buf = NULL;
buf = (char *)malloc( 100 );
略
/* free( buf ); */
return 0;
}
http://www2s.biglobe.ne.jp/~hig/q_a/Programing_QA03.html > 2. malloc() した後 free() せずにプログラムを終了するのはまずいのか?
> 問題ない。
矛盾してると思うけど、先輩が間違ってるの?
>>425 先輩は処理系を考えて言ってる。短絡的な後輩はダメだね。
>>427 Nothing = 参照ポインタを0にする命令でしょ?
間違えた Nothing = 参照ポインタを一つ減らす命令でしょ?
>>419 > Set o = Nothing の時点でForm1のTerminateイベントが発生する。
ぶっぶー はずれwwww
なぜならForm1のInitializeには
Load MeとかMe.Caption = "タイトル”
とか書いてありましたーw
Set o = NothingしてもTerminateイベントは起こりません。
ざんねーんw
なんでそんなくだらないことでおまえら意地になってレスしまくってんの
434 :
デフォルトの名無しさん :2012/11/13(火) 22:24:36.13
>>431 前提条件を後出しするのは脳の発達に障害があるから
人格形成上の障害も顕著にみられる
親のしつけの問題であることが多い
以上
>>432 はい、ガキですが?
そのガキに反論できないあんたは何?
人格おかしいというのは当たってるなw
>>434 前提条件? Form1に何も書いてないなんて
一言も書いてないが?
悔しかったらなぜこの場合はTerminateイベントが
発生しなかったのか、その説明でもしたら?
こりゃまたへー
>>425 関数fooが終了しても、プログラムは終了しない
よって、プログラムが動作し続ける限り、関数fooが呼び出されるたびにメモリーが消費され続ける
440 :
桃白白 :2012/11/13(火) 22:34:54.47
>>437 俺はさっきじゃんけんという名の近接戦闘において握りこぶしを突き出して
見せたがそれがグーだとは言ってない、俺の頭はパーだみたいなw
Form1が終了しないのは ロード状態になるからだろう? 上のほうで丁寧に説明されていたと思うが?
442 :
441 :2012/11/13(火) 22:37:01.27
ガキでもこれだけVB6に噛みついてくれるとなぜかうれしい。
アスペ同士の罵り合いか
違うのであれば、 同レベルってだけ。 どっちでもいい。
ガキじゃね?
いまVB6手元にないから試せないけど Set o=New Form1 したときのoの指すインスタンスって、既定のインスタンスと同一か?
>>449 Newしてるんだから違うものに決まってるさ
>>412 > 例えばあるサブルーチンで100のオブジェクトを個々の変数にSETした場合
> スコープを抜ける時に100のTerminateイベントが一斉に発生する。
一斉には発生しないよね。
順繰りに発生するだけ。
> このオーバーヘッドはバカにならない。
For loopなりで回して自前でNothingを代入する処理時間は問題にしないの?
>>450 .NETのどこかのバージョンで試したときに、初回のインスタンス生成が既定のインスタンス戻した事があったんだが
>>451 ユーザに100を待たせるより、1を100回待たせる方ががユーザの感覚として問題になりにくいって話だろ
>>452 > ユーザに100を待たせるより、1を100回待たせる方ががユーザの感覚として問題になりにくいって話だろ
え、そんな話なの?
ということは、
For i = 0 to Ubound(objs)
Set objs(i) = Nothing
DoEvents
Next
とやれということなの?
一つの配列じゃなければ、set obj = nothingとdoeventsをずらずら書くの?
そんな奴見たこと無いわ。
一つのオブジェクトの破棄に非常に時間がかかり(たとえば100msかかるとか)、 それをまとめて破棄しなければならないのだとしたら、それはNothingを 代入する/しないの問題じゃなくて別の問題じゃないの。
オブジェクトの出来が悪いとかプロシージャの切り方に難があるってか?
>>455 「プロシージャの切り方」というのが何なのかわからないけど、現実世界のリソースを解放しようとしたとき
などは時間がかかったりする。
なんか言葉に厳しい人がいるみたいだから、念のため説明しておくと、現実世界のリソースとは 物理デバイスに対するクローズ処理とかだからね。
参照ポインタって何だよ
>>417 > どうせ空のイベントだからってバカにするかもしれないけど内部的にはメッセージが発生し
> 他の処理の妨げになることがあるので、できるだけ早めに出させて後でまとまって発生しないように
> 配慮しているのさ。
この、「後でまとまって発生する」のが悪だと思ってる人は、なぜそう思うんだろうか?
悪だと思ってる人は、GCが存在する言語を使うとき、そのGCを起動するメソッドが用意されてるときは、 こまめに自分で明示的に呼び出したりしてるんだろうか。
いろいろ紛糾してるが、そもそもは
>>29 のサイトみたいな糞コードをありがたがる奴が駄目なんだよ。
> ' 不要になった時点で参照を解放する (Terminate イベントを早めに起こす)
とか、もうアホかと。
FileSystemObjectなんか、グローバルに
Dim FSO as New FileSystemObject
と書いときゃいんだよ。
まだやってる... Nothingが参照カウンタを操作するわけでも、Nothingがメモリを開放するわけでもない オブジェクト型の変数に、オブジェクトが存在しない事を示すキーワードがNothing
>>461 糞コードとは思わんがな。ここでしか威勢を張れない役立たずのチキン野郎のお前と比べたら神だよ彼は。
>>462 >Nothingが参照カウンタを操作
当たり前だろ?代入値が参照カウンタをどうやって操作すんだよ?
考えてから書けドアホ。
465 :
デフォルトの名無しさん :2012/11/14(水) 15:35:39.59
>>462 >Nothingがメモリを開放
当たり前だろ?代入値がどうやってメモリを開放すんだよ?
考えてから書けドアホ。
>>462 >オブジェクト型の変数に、オブジェクトが存在しない事を示すキーワードがNothing
Nothingは「キーワード」じゃねーよ。アホかぁ?コイツwwww
467 :
デフォルトの名無しさん :2012/11/14(水) 15:39:25.31
Nothingが参照カウンタを操作するわけでも、Nothingがメモリを開放するわけでもない ,.,.,.,.,.,.,.,.,__ ,,;f::::::::::::::::::::::ヽ i::::::::/'" ̄ ̄ヾi |:::::::| ,,,,,_ ,,,,,,| |r-==( 。);( 。) ( ヽ :::__)..:: } ,____/ヽ ー== ; ほほう それでそれで? r'"ヽ t、 \___ ! / 、、i ヽ__,,/ / ヽノ j , j |ヽ |⌒`'、__ / / /r | {  ̄''ー-、,,_,ヘ^ | ゝ-,,,_____)--、j / \__ / | "'ー‐‐---'' オブジェクト型の変数に、オブジェクトが存在しない事を示すキーワードがNothing ,.,.,.,.,.,.,.,.,__ ,,;f::::::::::::::::::::::ヽ i::/' ̄ ̄ ̄ヾi::l |::| / \,|::| |r-( ・ );( ・ )-| ( ヽ :::(__)..:: } <・・・小学生レベルの嘘だな ,____/ヽ -==- / r'"ヽ t、 ヽ___/ / 、、i ヽ__,,/ / ヽノ j , j |ヽ |⌒`'、__ / / /r | {  ̄''ー-、,,_,ヘ^ | ゝ-,,,_____)--、j / \__ /
「開放」と変換する奴は糞の法則が守られた
Emptyとこんがらがっとるな
>>470 「存在しない事」の表現の一つだから、呼び方なんてどうでもようがす
472 :
デフォルトの名無しさん :2012/11/14(水) 15:59:25.96
Emptyは評価するものであって代入するものじゃないだろ?それこそキーワードだろうがw
474 :
デフォルトの名無しさん :2012/11/14(水) 16:22:48.33
>>474 Dim a As Variant
a = "Hello!"
a = Empty
MsgBox TypeName(a)
476 :
293 :2012/11/14(水) 16:27:31.02
Dim s As String s = "Empty"
477 :
デフォルトの名無しさん :2012/11/14(水) 16:29:48.28
>>475 Option Ecplicit を宣言するとエラーになる。
アマチュアプログラマー乙。
>>477 「Option Explicit」だボケ
479 :
デフォルトの名無しさん :2012/11/14(水) 16:39:08.58
>Option Ecplicit を宣言するとエラーになる。 なるほど、正しい事を言ってる。 罠か?w
>>477 Option Explicitを宣言してもエラーにならないけど?
レス乞食?
ageてる奴は糞の法則が守られた
>>463 「ここでしか威勢を張れない役立たずのチキン野郎のお前と比べたら神」な人が書いたから、糞コードではないと判断してないか?
このスレ、頭悪い奴しかいないな。 とか書くと、「お前もそうだ」とレスする頭悪い奴が釣れそうだが。
自己紹介乙
485 :
デフォルトの名無しさん :2012/11/14(水) 19:54:50.72
ム板で2番目に勢いのあるスレになりました!
勢いのあるスレを上位からみても このスレだけオワコン言語なのだが
オワコンじゃねえよマイクロソフトですらサポート切ることの出来ないほどのあらゆる意味での人気言語だぞ
>>480 Option Ecplicit を宣言するとエラーになるよ。
さて問題です
>>477 は何を目的に Option Ecplicit を宣言したのでしょうか?
VBってたのしいなぁ
なんだろう。 「アマチュアプログラマー乙」と煽ったつもりだったのが、自分の方がド素人だったことに気づいて 話題をそらそうとしてるのだろうか。 まあ、何にせようざいから消えて欲しいんだけどな。
>>492 しらんが「アマチュア」という言葉が心にグサッと刺さった事はわかった。
494 :
デフォルトの名無しさん :2012/11/15(木) 13:42:41.62
積極的なド素人がいるとスレが崩壊の危機に瀕するの例
崩壊の瓦礫も過疎スレのにぎわい
ここで暴れてるVB6オタクが子供であることに期待
今日は静かだったな。 やっと飽きたか。
ガキが試験だろ
VB6とか入手困難な言語を課題にする授業なんてするのか? 家で宿題が出来ないだろう
あはは
さすがに
>>500 は、馬鹿と言わざるを得ないな
ガキ以下だな。生きる価値なしw
え?どういうことなの?
まさか↓これのこと言ってたりすんの?たかだか1授業のために大金払うわけ? なお、MSDN サブスクリプションでは、Visual Studio 6.0 を含む新旧のソフトウェアを引き続き提供しますので、旧バージョンである Visual Studio 6.0 が必要な場合は、Visual Studio .NET MSDN Deluxe Edition または MSDN サブスクリプションをお求めください。
ランチャを作ってます。 1 管理者権限で起動したランチャから 非管理者権限でプロセスを起動する方法 2 非管理者権限のエクスプローラ等からファイルをドラッグして 管理者権限のランチャでOleDragDropを発生させる方法 3 64ビットOSでSystem32内に存在するはずの ファイルが見つからないというエラーの回避方法 を教えていただけませんか?
2は無理。 エクスプローラのマニフェストでUIアクセスを要求する必要があると思う。 UIアクセス=trueは署名付きじゃないとダメだったと思う。 以上、自分ならランチャを2プロセス構成にしてUIを非管理者プロセスで起動します。 でもMSマウスは管理者プロセスだとスクロール出来なくなるんです。 それを盾に開き直っても良いと思います。
510 :
デフォルトの名無しさん :2012/11/16(金) 09:50:04.48
>>508 VB6で「CreateProcessWithTokenW」を使って
管理者トークンで走行するプロセスから標準モードで別のプロセスを起動したが
どうやっても管理者トークンで走行してしまう。よってドラッグ&ドロップもできない。
これはVB6では無理みたいね。残念。
511 :
506 :2012/11/16(金) 12:15:58.45
>>507 ドラッグは無理なのですね。
おっしゃるとおり、2プロセス構成にしてみようと思います。
>>508 、509、510
紹介していただいた方法で、管理者プロセス起動プロセスを
実行しようと思います。
ありがとうございました。
512 :
デフォルトの名無しさん :2012/11/16(金) 12:58:40.67
上がるのは勝手に上がるが、下げようとするとこれほど大変とはねぇ。
下げるってスレのこと?他のスレを上げまくればいいだけっしょ
ぼけ
515 :
506 :2012/11/16(金) 17:10:39.53
非管理者権限のプロセスから ActiveXExeを管理者権限で起動する方法を教えていただけませんか? EXEファイルのプロパティで管理者として実行するようにしたら インスタンスが作れなくなってしまいました。
>>513 馬鹿かお前?それとも天然か?
プロセスは管理者トークンをもつプロセスから起動されれば何をしなくても自動的に
管理者に昇格するが、管理者トークンをもったプロセスがユーザーレベルに
降格するためには恐ろしいほどのトリッキーな操作が必要って事だよ。
それに比べたら起動されたEXE時の走行レベルが管理者かユーザーかなんて議論はゴミだっつーの。
>>515 起動は出来てるがメッセージが遮断されるから無意味って事では?何がしたいの?
(UAC関係無かったら無視してね)
そもそもUACの警告を無視するようにユーザーに促すのは良くない。
たまに「無視して下さい」ってマニュアルを見かけるけど、何かあったらどうするの?
せめてオレンジ色のダイアログだけは回避すべき。
趣味プログラミングです。アイコンが多数必要になった場合、めんどーで仕方ないです。 VB6でDephiみたく横に細長いイメージからイメージを抽出してアイコンのPictureにする方法ないの?
プロのプログラミングです。VB6で作ったアプリでデスクトップに表示されるアイコンは48x48で。 ボタンに表示されるアイコンは24x24とかってする方法はさすがにありませんよね。 考えあぐねた末にでた結論が無理って事だったので、もし方法があったらショックで自殺してしまうかも。
できるけどしんだほうがいいかも
できないだろ。
524 :
デフォルトの名無しさん :2012/11/17(土) 14:22:55.29
アホはそう思ってればいい
そもそも、デスクトップは意味が分かるがボタンって何なんだw
池沼のお前には分からないだろうな。
そもそもデスクトップのアイコンのサイズはユーザーが決めることだろ?
528 :
デフォルトの名無しさん :2012/11/17(土) 19:52:02.75
>>527 VB6の場合、EXEに複数のアイコンを組み込めないから無理って話じゃないのか?
何のこっちゃ。 先週の週末の話題もあまりの低レベルさに大いに呆れたけど、今週はプログラミング以前に 日本語が不自由なんだから話にもならんな。
>>529 理解できてないのはお前だけだったりしてなw
アイコン自体が複数の解像度持てなかったっけ? VB6では無理なの?
そうVB関係ない。 ついでに言えば、ショートカットのアイコンは別にリンクしてるバイナリの リソースじゃなくていいい。 っていうかボタンって何なんだだから。
>>531 アイコンファイルのフォーマットであり可能
つかVB6付属のイメージエディタでアイコンファイル作れるし
534 :
デフォルトの名無しさん :2012/11/17(土) 21:08:11.30
>>531 アイコン自体が複数の解像度を持っていたところで、フォームのアイコンやグラフィックモードに指定したボタンへ
適用するアイコンサイズを任意に指定できないことを指摘しているのではないのか?
俺の読解力が有りすぎるのか、それともよく理解しようともせずに煽ってる人たちが多いのか知らんが。
おめーの文章自体が既に……
ごめん。とりあえず俺はちゃんと読んでない。 なんかどうでもよくてw
他の処理系からするとアイコン番号1しか使用できないVB6が糞って事なんだろよ? 例えばデスクトップには1番の48ドットアイコンが使用され、大きいアイコンで綺麗に表示して ボタンのアイコンには24ドットアイコンで小さく表示して、フォームの左端のアイコンは16ドットとか そういう事なんじゃねーの?俺でも分かったぜw
アイコンファイルの24x24とか48x48とかの異なるサイズのアイコンを入れたやつをアプリケーションのアイコンとして設定すれば スタートメニュー用のアイコンなりデスクトップ上のアイコンなり2種類以上表示されるよ
>>538 ボタンに表示させるアイコンのサイズは変えられないだろ?
フォームのタイトルバー上のアイコンも変えられないだろ?
あほww
vbNewLineって環境によって変わるの?
Mac版VBAではvbNewLineが Windows版とは違っていたはず。
(´・ヘ・` *)
MSDNだとvbNewLineはプラットフォーム(オペレーティングシステム)によって適切なほうを使用する(chr(13)&chr(10) or chr(13))とあるけど これはコンパイル時の話?
Windows向けにコンパイルしたものが MacやLinuxで動くわけ無いだろw (エミュレータは話が別) VBAはWindowsでもMacでも動くが そもそもスクリプトだからコンパイルはしない。
えっ えっ
>プラットフォーム(オペレーティングシステム)によって これってWindows95かWindows98かとかのWindowsのバージョンの違いとかを指してるんじゃないの?
Windowsは改行全部CR LFだろ。 わざわざ別に用意してるのは、Windows以外のことを考慮してだよ。
なんで知らないのにコンパイルしないって言い切るんだろう メニューにPコードにコンパイルする項目あるにも関わらず 単芝はダメな子って噂は本当だったんだ
VBAの話だぞ? Pコードはコンパイルには入らねーよ。
じゃあお前の中じゃJavaのバイトコード化もコンパイルに入らないよな? さすがに厳しい状況に自分を置いたけど大丈夫?
VBAのPコードは、Pコードのままインタプリタが実行する Javaのバイトコードは、バイトコードからさらに ネイティブコードにコンパイルしてから実行する。 両者は違うもの。
VBのソースをPコードに変換することをなんていうの?
>>553 それは両者がメモリにロードされた後のインタプリタの挙動の違いだろ何言ってるんだ?
javac.exeがやってることとVB/VBAがPコードを生成することはどう違うかって話。
話題すり替える能力はさすがだな。
>>555 明確にコンパイルって書いてるだろ?
ところが
>>546 は頑なにコンパイルはないって言ってるんだ。
コンパイルと主張しているが あれはコンパイルではない。 と言ってる。
まさかマシン語に翻訳する以外はコンパイルじゃないと言ってるわけじゃないよな。
compileを英語辞書で引くと、機械語に翻訳することと、どの英語辞書サイトでも出る
javaは仮想マシン上の機械語コードなのでcompileの意味は通るが、VBの場合は・・
例えば普通のCコンパイラは直接バイナリ吐きませんけどね。 毎度毎度このスレの話題のレベルは何か泣けてくるなしかし
時代とともに言葉の意味も変わってくるもの 辞書サイトは古い辞書だから無料で公開しているわけであってだな 最新の辞書は有料でなければ引けないのだよ
563 :
デフォルトの名無しさん :2012/11/19(月) 00:17:15.49
>>559 によってJava/.NETはコンパイルされていなかったという事実が明らかになったが
Javaコードとか.NETコードがネイティブで動くボードが出来た(実際存在する)時点でコンパイルされていたということに事実が書き換わることも明らかとなった。
Pコードも同様にネイティブで実行されるボードが開発されればコンパイルされているということに事実が書き換わるらしい。複雑だな。
p-codeって何ぞ?と思ったらラーニングエディションには無いのか・・・
c2.exe link.exe cvpack.exeを使えばラーニングエディションでもプロフェショナルエディションと同じスイッチを使ったコンパイルが出来たりする?
いくらググってもc2.exeの使い方は出てこないな・・・c2.exe用の怪しいツールはあったが
569は何気にヤバそうなサイト
プロのプログラミングです。VB6で作ったアプリでデスクトップに表示されるアイコンは48x48で。 ボタンに表示されるアイコンは24x24とかってする方法はさすがにありませんよね。 考えあぐねた末にでた結論が無理って事だったので、もし方法があったらショックで自殺してしまうかも。
572 :
506 :2012/11/19(月) 08:55:36.07
>>519 >起動は出来てるが〜
ActiveXExeは起動すらしていないようです。
>そもそもUACの警告を
ActiveXExe自体の昇級ダイアログをスキップするつもりはありません。
>何かあったらどうするの?
このようなプロセス間通信を認証と暗号化なしにしたら
バックドアになるのは分かっています。
一般公開した時点で、ウィルスが作成できてしまいます。
個人で使用し、ウィルスまがいのプロテクトがかかった近年のゲームの
UACをスルーしたいだけです。
AcriveXExeにするのが、最も簡単な2プロセス構成と思っていましたが
起動できなそうなので、普通の2プロセスにしようかと思います。
ァ ∧_∧ ァ,、 ,、'` ( ´∀`) ,、'` '` ( ⊃ ⊂) '`
ここ最近のWin7アップデートをしたら、VB6で作ったソフトが終了出来なくなったとか、 そんな話をあちこちで聞いてるんだけど… ランタイム系で変更かかったとか、ランタイムが読まれなくなってるとか?ある?
言った奴に聞け
576 :
デフォルトの名無しさん :2012/11/26(月) 16:39:44.36
>>574 うちでもそれが大問題に発展している。
VB6で作ったアプリ限定で、OLEAUTOで落ちているので
ランタイムとの不整合性が問題なのは間違いない。
MSもとうとうVB6を排除に出たのかもね。
とうとうって、Windows7とかいつの話してんだよ
578 :
デフォルトの名無しさん :2012/11/26(月) 16:48:23.20
>>576 マジですか?
なんで排除するのでしょうかね
勝手にWindowsアップデートとかさせんなよ。
>>578 .netに移行しろって事だろ?
>>579 IT部門が動作検証後に定期的にWindows Updateを一斉に行うが
5日ほど前に行われたアップデートからおかしくなったと騒ぎが勃発。
よくソフトの動作を検証しなかったIT部門の責任だが、
金融系なので一大事だよ。
>>580 > 金融系なので一大事だよ。
自業自得
Old Soldiers Never Die
http://msdn.microsoft.com/en-us/magazine/jj133813.aspx <pre>
As Don’t Get Me Started columnist David Platt recounts in this month’s issue of MSDN Magazine,
Microsoft has formally extended “It Just Works” support for its Visual Basic 6 programming language
through the full lifetime of the Windows Vista, Windows Server 2008, Windows 7 and Windows 8 OSes.
That means the core Visual Basic 6 runtime in each OS will enjoy five years of mainstream support,
followed by another five years of extended support, from the point that a given OS shipped.
</pre>
>>582 それは表向きで実は裏でVB6を抹殺する計画が進んでいる。
VB6を恒久的にサポートするという方針はWindows 8の開発責任者で
「次期CEO」とも言われたスティーブン・シノフスキー(Steven Sinofsky)氏。
ところが彼がマイクロソフトから退社することになってしまった。
公的には単なる退社として扱われていたが、真相はそんなに円満ではなく
事実上「クビ」だったそうだ。
彼がクビになった後、VB6がどのように扱われるかはだれでも想像がつく。
その第一弾が最近のWUであったという噂が飛んでいるが真偽は不明だ。
584 :
デフォルトの名無しさん :2012/11/26(月) 17:45:42.18
VB6アプリ使いたけりゃおとなしくXP(XP Mode)つかっとけってこったな
これがFUDか
587 :
デフォルトの名無しさん :2012/11/26(月) 18:37:17.22
>>583 なんで抹殺する必要があるんだろう
VB6をサポートすることってそんなに大変なんですか?
古いものを古いままサポートするのは儲けはまったく出ないのに経費はかさむので、大変に決まってます
>>583 VB6を擁護しまくっていたスティーブン・シノフスキーの更迭と同時にVB6も更迭かよ。
まあ確かにかなりの権力がある人がVB6をマンセーしていなければ
いまだにVB6がサポートされるなんて事があり得ないというのは薄々気づいていたが
もう終わりかVB6。長い間ありがとう。
590 :
デフォルトの名無しさん :2012/11/26(月) 19:35:38.45
>>589 もしVB6が人間だったら大往生と言われるだろうなww
OLEAUTO.dllがSide by Side対応とか思ってる奴、現実にいるのな。驚いたわ。
593 :
デフォルトの名無しさん :2012/11/26(月) 21:09:42.82
OS側でOLEAUTOが動かないようにするのは他愛もない事だろう。 さようならVB6!今までどうもありがとう!
dllファイルって実行ファイルと同じフォルダのよりsystem32フォルダのほうが優先して使われるんだっけ?
596 :
デフォルトの名無しさん :2012/11/26(月) 23:37:11.18
?
カレントフォルダ優先
じゃあWindowsUpdate前の問題ないOLEAUTOとやらのファイルをカレントに置けばいいんじゃないの?
599 :
デフォルトの名無しさん :2012/11/27(火) 02:05:09.12
は?
>アップデートからおかしくなったと騒ぎが勃発。 会社なら、マイクソソフトに高い顧問料払ってるんじゃないの? 直接問いただせばいいんじゃねーの
602 :
デフォルトの名無しさん :2012/11/27(火) 10:28:17.91
どうおかしくなったか知りたいす
603 :
デフォルトの名無しさん :2012/11/27(火) 10:50:20.63
>会社なら、マイクソソフトに高い顧問料払ってるんじゃないの? そんなことねーよ。 MSDNのサブスクリプションで最高位クラスの待遇受けられるけど 実際にインシデントを使って問い合わせると、KBから問い合わせ内容を参照して ただ引用して答えるだけで、何の意味もない事がわかる。 MSに金払えば問題が解決するとか、本気で信じている奴がいることに驚きを隠せない。
>>603 > 実際にインシデントを使って問い合わせると、KBから問い合わせ内容を参照して
> ただ引用して答えるだけで、何の意味もない事がわかる。
それって、お前が知らないだけで、既知の問題だからだったからでしょ。
605 :
デフォルトの名無しさん :2012/11/27(火) 11:51:44.57
いえてる
>>604 既知じゃない問題ならわかりませんで終わるんだがな。
>>605 擁護しなき主張もできないのかよ。情けない奴。
607 :
デフォルトの名無しさん :2012/11/27(火) 12:04:45.26
いえてるw
自分の視野が世界の全部な人の典型例
MSに金払えば何でも解決してもらえると信じる視野か 狭すぎだろw
1,000回くらいインシデント使ったことあるなら信じてあげてもいいよpgr
MSのサポートは、問題を解決するための方策の一つであって、それだけで全ての問題が解決するとか、 全く解決にはならないというのはどちらも間違い。 解決になる場合もあればならない場合もある。 自力で解決可能な問題でも、相手がそれを調査してくれるという、時間と金を交換するケースもある。
ここ見るかぎりじゃ、けっこう使えるサービスだと思うが(俺は使ったことない)
http://www.microsoft.com/ja-jp/services/professional.aspx > サポート対応範囲 Q&A
> 対応範囲やよくあるお問い合わせについて、下記カテゴリにて Q&A 形式でご説明いたします。
>
> ・トラブル原因の調査
> ・複数製品にまたがるトラブルの切り分け
> ・修正プログラム (Hotfix) の作成リクエスト
> ・デバッグ支援、コード レビュー、サンプルコード提供
> ・キャパシティ プランニング
> ・パフォーマンス/チューニング
> ・運用環境診断や製品アップグレード/システム移行の支援
> ・仕様確認
そのQ&Aページ見ると、もっと金払えば(プレミアムサポート、アドバイザリーサポート)もっと対応してくれるみたいだぞ。 > Q. 要望の動作を実現するためにどうすればいいか、プログラムやアドインの開発方法、カスタマイズ方法を > 教えて欲しい。 > > A. 弊社公開情報 (KB、TechNet、MSDN などの弊社 Web サイトを含む) のご紹介までを範囲として対応します。 > お客様の開発要件にあわせたサンプル コードの提示については、プレミア サポートもしくはアドバイザリー > サービスにて承ります。 もちろん俺は使ったことないが。
で、そのプレミアサポートとやらが一体いくらくらいのものなのかググると、問題解決サポート50時間+ その他サポート300時間みたいな料金体系で、860万〜2,955万だった(俺調べ)。 やっぱ、金払えばそれなりのものが得られるんじゃないの?
そこまでわかると、1件3万程度のインシデントがどうとかというのは、井の中の蛙もいいとこだとわかるな
そんな能書きを信じて大金を払ったものの、まともなサポートを一度も受けた事の無い 某一次上場企業のF社に勤務する私がココにイル・・・。
617 :
デフォルトの名無しさん :2012/11/27(火) 21:14:21.61
プレミア サポートとかアドバイザリーサービスって確かMSが下請けで使っている ソフトハウスに面倒を見させるだけだったと思う。そんな鼻息荒くするようなサービスではないよ。
業務用ソフトにVB6を使い続けた会社の自己責任ではないだろうか? とは思うが、会社のマイクソ離れは加速するんじゃないかな。そうなっても マイクソの自己責任だろw
619 :
デフォルトの名無しさん :2012/11/27(火) 21:28:16.43
今時VB6使ってて井の中の蛙とか言ってる奴。心底笑える()笑
()笑
621 :
デフォルトの名無しさん :2012/11/28(水) 06:25:07.26
斬新だな…
「下請け」の人間が程度が低いと考えてるなら、お前ら全員程度が低いわw
>>616 > そんな能書きを信じて大金を払ったものの、まともなサポートを一度も受けた事の無い
> 某一次上場企業のF社に勤務する私がココにイル・・・。
まともなサポートが必要な事態がなかっただけじゃないの?
> ・キャパシティ プランニング
> ・パフォーマンス/チューニング
とか、サービス非常停止時のリカバリサポートとか使ってみた?
624 :
デフォルトの名無しさん :2012/11/28(水) 14:06:14.95
なんかMSのサポートの質が良い事をアピールしたい工作員がいるみたいだな。
>>624 ナレッジベースの棒読みと、もう少し金払う相手には外注の窓口へご案内。
MSの有償サポートはかなり質がいいよ。 まあ、サポート使いたくないなら自力で頑張ればいいよ。誰も止めないし。
MSはアメリカ人に弱いのでアメリカ人の同僚に頼んでネイティブイングリッシュで 無償サポート窓口へまくしたてると有償サポート窓口の担当者に回してくれる。 そこに松田さんという人がいて、かなり詳しく調べてくれて事実上有償サポートを 無償で受けることができていた。最近はこの手が使えるか試していない。
どこでもごね得が通用するんだな。
629 :
デフォルトの名無しさん :2012/12/06(木) 09:48:53.19
マウスによりTextBoxをクリックした場合に 全選択させたいのですができません。 Tabキーによる移動の場合はこれで問題なく全選択させる事ができています。 どのようにしたらいいか教えてください。 Private Sub Text4_Enter(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles Text4.Enter Option2.Checked = True Text4.SelectionStart = 0 Text4.SelectionLength = Len(Text4.Text) End Sub
630 :
デフォルトの名無しさん :2012/12/06(木) 09:55:36.67
スレタイ読んでから来い。 あるいはVB6とVB.netの違いも分からんなら逝け。
MouseClickイベントに書けばいいよ
www
Windows 9ではVB6サポート打ち切るとの正式発表が来たね。 気持ちまでブルーだわ。 もう.netへ移行するしかないのか? やだなぁ、あの重たいフレームワーク。 バージョンもいろいろあって4は下位との互換ないし。
634 :
デフォルトの名無しさん :2012/12/08(土) 21:06:55.66
冗談かと思ったらマジなのな。
VB 9 とか出るんじゃね?
普通は10年前に移行完了してるって。 何がもう.NETへ移行するしかないのかだよアホかって
>>636 未だに、COBOLだFORTRANだCだ言ってる世の中だぜ
Cは許してやれよ
UNIX系OS使ったことないほどの情弱なんだろ
640 :
デフォルトの名無しさん :2012/12/09(日) 08:24:34.74
だれかVB6.NETをつくれよ
VisualBasic名前空間をインポートするってのじゃいかんのか?
>>640 .net がヤダって言ってるのに… バカ?
646 :
640 :2012/12/10(月) 06:09:19.30
一番場違いというか空気脳なレスは
>>639 なのに、なんでスルーするの?
>>633 > Windows 9ではVB6サポート打ち切るとの正式発表が来たね。
ソースどこ?
>>649 個人では入ってない。
ということは、ソースはMSDNということだね。
ようは自己責任でやれって事?
十分に時間的猶予与えただろ 自分用のソフトで使うなら勝手だが新規で使うなよって話
>>651 物理的に動かないようにする(なる)という事のようだ。
OKEAUTOが機能しないんじゃないか?
COMとかはどうなるんだろう?
ごめん、OLEAUTOの間違いねw
>>653 OLE/COMがダメなら、既存のアプリほぼ全滅じゃないの?
656 :
デフォルトの名無しさん :2012/12/10(月) 14:48:31.10
Windows 9でCOMを殺すとは言われてない。 しかしVB6のランタイムはサポートされないのではなく物理的に動作しない。 可能性としてはやはりoleaut32.dllの機能抑制というところだろうか。
やったー .net置き換え案件が大量にクルー
>>656 Windows 8の時もVB6を動かなくするかどうかについて議論が重ねられたようで
VB6廃止派の先導を務めていた社長が先日クビになったため
VB6存続派のバルマーがWindows 9でも当然VB6をサポートするかと思いきや
先日の驚愕のアナウンスに違和感を禁じ得ない。
まさか、Windows FX 計画の再来?
660 :
デフォルトの名無しさん :2012/12/10(月) 16:34:31.29
日本のMS公式サイトから「Windows Phone 8」の端末情報が消えたけど それとも関係がありそうだね。 MS社内で大改革が行われようとしている…。
>>660 まさか日本では出ないなんてことが無ければいいですけどね。
今後の動きに注目です。( ´・ω・)y─┛~~~oΟ◯
>>646 > おまいが.net嫌いとか知らんがな
スレの流れも追えないバカ (w
>>633 見ろ。
663 :
640 :2012/12/11(火) 06:57:11.95
>>633 にレスしたつもりはないのだが・・・まぁいいや。
独り言ならチラシの裏へ…
Windows 9 は64bit専用OS。
666 :
デフォルトの名無しさん :2012/12/13(木) 22:26:11.77
>>665 一応、WOW64は搭載されるみたいね。
Microsoft Script Control 1.0で Eval, ExecuteStatement, Runで実行中のスクリプトを VB側から中断させる方法はありませんか? ScriptControl.AddObjectしたオブジェクトのメソッドを スクリプトから呼出されている場合や、 MsgBoxで止まっている場合、VBに制御が戻るので、 そのときに、中断できるようにしたいです。 現状は、ShellExecuteとExitProcessで再起動してますが、 それでは困ることが多々。
668 :
デフォルトの名無しさん :2012/12/25(火) 07:05:35.02
なんか変なの発見した INIファイルのアクセスでWritePrivateProfileString/GetPrivateProfileStringを使うよね 右端に半角スペースがあるデータをWrite〜してもGet〜でカットされる仕様だけど 一度、右端に半角スペースがあるデータを書くと右端のスペースは消えない 全く別のデータを上書きしても、前のデータにあったスペースを覚えていて 新しいデータの右にそのスペースを追加してくれちゃう 読むときにカットされるから問題はないんだけど
それ、変でも何でもないんだが?
670 :
デフォルトの名無しさん :2012/12/25(火) 23:39:31.50
つまり、データの書き換えで短くなった場合は後ろにスペースを追加して 以降のデータを書き換えないで済むように小細工してるのだろう
固定長データ
Windows8 64bitにVB6 IDEをインストールできるの?
Mac上の仮想PCにXPインストールしてVB6使ったら快適すぎワロタ Superπ 100万桁やってみたら11秒だった。速すぎw
>>649 msdnで見つけられなかった、、、
url教えてください。
678 :
デフォルトの名無しさん :2013/01/14(月) 23:31:02.65
コンパイル中に、VBA1.tmpというファイルに、こんなエラーを吐いた ○○○○.bas(155) : fatal error C1001: INTERNAL COMPILER ERROR (compiler file 'E:\8783\vc98\p2\src\P2\reader.c', line 1994) Please choose the Technical Support command on the Visual C++ Help menu, or open the Technical Support help file for more information ○○○○.basの155行は 「 If Sgn(buf1$) <> 0 Then 'buf1$は有効か? 」 buf1$とは、Dim buf1$()と宣言してあって、 Ubound(buf1$)がエラーにならないように この行で配列が初期化されているかのチェックをしてます(ちょっと裏ワザ的方法) IDEでは問題なく通るのになんで?VB壊れたかな?
仕様にない使い方をしたものをexeにコンパイルして配布しようとか怖いな
680 :
デフォルトの名無しさん :2013/01/15(火) 00:17:49.05
趣味のプログラムだから、そこらへんはいいのだけど
682 :
デフォルトの名無しさん :2013/01/15(火) 06:25:11.05
>>681 申し訳ない、ネットに出てましたか
以前、同じ事をして上手くいったので何故だろうと思って
前に作ったコードを探してみたところ、Sgn( )は諦めて
ReDimする毎に、配列の大きさを別変数に格納し、UBoundを使わないことで処置してました
On Error Resume Next Dim LB As Long, UB As Long LB = 0 LB = LBound(buf1) UB = -1 UB = UBound(buf1)
正直、Resume Nextはできるならば使いたくない。
エラー箇所が分かりにくいから?
自分でReDim切ってるなら管理できるからいいんだが 外部から貰った配列のときにどうしようもないことがあるからなぁ まあ、Resume Nextじゃなくてラベル切って飛ばすほうが良いけど、見通しはさらに悪くなる
Resume Next有りのコーディングルールにすると 素人メンバーが単に「落ちない」ようにするだけのResume Nextの使い方を しはじめる、というのはあるかも。 ただしもう、VB6で新規案件など無いがな。
むしろResume Next使わないと今時の構造化例外構文風に書けないと思うが... On Error Gotoでラベルにジャンプなんてそっちの方がずっとあり得ないよ
Private Sub Hoge() On Error Goto Catch '処理 On Error Goto 0 Exit Sub Catch: '例外時の処理 End Sub 問題はfinallyを実現したい時。 書けない事もないけど、Gotoを記述するところで抵抗がある。
>>688 どんな書き方してるかしらんが
複数エラー発生しても最後のエラーにしか対応してない気がするな
GOSUB なら普通に割り込み感覚で使えるんじゃね?
692 :
デフォルトの名無しさん :2013/01/17(木) 17:20:03.25
今頃思い出してすまんが 前スレあたりで動的配列の初期化チェックについて これは名案と思ったレスがあった それは動的配列を宣言した直後に取り合えずReDim hogehoge(0)してしまう
>>690 そんなわけないでしょ。
try...catchと同じように例外を想定している箇所のみOn Error Resume Nextと
On Error Goto 0で囲む。
こんなの当たり前だと思うが...
もっともVB6はもう10年書いてないけど
>>694 On Error Resume Next
文1
文2
On Error Goto 0
こういう風に書いてるんじゃないかと想像したが
これだと文1のエラーはトラップされないんじゃね?って話だが
まあお前がどう書いてるかしらんし実際どうなのか試す気もないけど
そんな間抜けなことするわけがないアホか
On Error Resume Next Err.clear '文1 If Err.Number <> 0 Then 'エラー処理1 End If Err.clear '文2 If Err.Number <> 0 Then 'エラー処理2 End If On Error Goto 0 これだとtry〜catch風ではないよね。
エラーなし try{} → finally{} → 次の行へ 想定のエラーあり try{} → catch{} → finally{} →次の行へ 想定外のエラーあり try{} → finally{} →プログラム中断
>>694 > こんなの当たり前だと思うが...
コード出せば、一発でみんなを納得させることができるよ。
そもそも VB でエラーが発生する文が複数連続するような状況が想像し難いんだが。 ファイル関係と件の動的配列のチェックぐらいしか使ったことないし。
例外発生の可能性だけで言えば、例外を起こさない命令の方が少ないだろうが あとはどこまで事前チェックではじけるかと、どこまで不慮の事態を想定するか
>>700 DB、ネットワーク関係とかも例外発生するでしょ。
例外が出るとこは全部プロシージャにまとめて外部に作ればいいのよ
>>701 基本的に事前チェックで可能な限り例外は排除する。
>>702 が言うような外部とのやり取り等は例外を排除しきれないから、
>>703 が言うように、そう言う奴はプロシージャに閉じ込める。
って言うのが、俺の方針。
>>705 お前も馬鹿か。
その「例外が出るとこを全部まとめた」部分のエラー処理はどうするんだよ。
> その「例外が出るとこを全部まとめた」部分 誰も言ってない部分とやらに突っ込むアホに言われてもね (w 例外を閉じ込めたプロシージャ内では、普通に On Error Resume Next で処理して、 エラーコード返すなりすれば良いだけ。
>>707 だから馬鹿だろお前。
だからエラーコードを返すためには何らかの方法でエラーを検出するコードを
書かなければならない。
つまり冗長性は少しも減らない。
そもそもエラーコードを返すなんて方法は返り値がない関数にしか使えない。
誰も冗長性を減らすなんて話しをしてるわけじゃないんだけど、 バカは自分のことしか考えられないんだな。 > そもそもエラーコードを返すなんて方法は返り値がない関数にしか使えない。 自分の知識のなさをいちいち披露しなくても良いぞ (w
On Error Resume Next ってのは想定外のエラーが出てもプログラムを止めたくないときにしか使えないぞ 例外を閉じ込めたプロシジャーが1行しかないなら話は別だがな そのプロシジャー内でエラーキャッチしてしかるべき処理をするべきで On Error Resume Nextでは最後に発生したエラーが解るだけで、エラーキャッチできないんだが
>>710 そんな訳ないでしょ。
On Error Resume Nextを使うってことはエラーを自分でチェックすると言うこと。
>>710 > On Error Resume Next ってのは想定外のエラーが出てもプログラムを止めたくないときにしか使えないぞ
想定内のエラーでも使うだろ、「ファイル関係」「DB」「ネットワーク」とか書いてあるのも理解できてないのか?
> On Error Resume Nextでは最後に発生したエラーが解るだけで
最後、最後と連呼してるアホは、文毎にエラーチェックすることも出来ないのかよ。
>>712 つまり
>>697 のように書くのね
文毎にエラーチェックなんて、出来ても普通はやらないって前提の話をしてるんだよな、712以外のみんな?
ひょっとして「全ての文」にエラーチェック入れるとか思ってるのか? 「想定できる例外」が発生する文なんてそんなにないだろ。
715 :
デフォルトの名無しさん :2013/01/20(日) 01:27:59.06
またくだらん話で言い争いが起きるのか 変わらんね
717 :
デフォルトの名無しさん :2013/01/20(日) 01:35:50.26
>>716 だね。前提をそろえて話しないと話がすれ違うばかりで、
>>713 のように
あとだしでどや顔するやからがわいてくる。
欠陥言語で何を言い争ってるんだかねw
719 :
デフォルトの名無しさん :2013/01/21(月) 14:05:33.60
予期できない例外って存在するの? メディアがないとか異常な計測値が入ってきたとか、全て事前にチェックできるじゃん あ、メディアがあることを確認した後で抜かれるってのがあるな
まあそういう前提であれば、予期できない、ではなくて、予期しない、って言うのが正解 メモリ不足とか、非常に予期しにくい例外もあるけどな
通信中にネットワークケーブルが切れるとか、どうやって予期するんだよ。 エスパーでも雇えってか?
思いつける範囲は全部対処しとけばOK
想定出来るもの出来ないもの 対処出来るもの出来ないもの どれの事言ってるのか曖昧すぎるだろ
VB6.0最近始めましたド素人です。 0〜100まで変化する数値をある閾値で認識し、ダイアログ表示を出すプログラム において、同じ値が変化しない間、ダイアログを消そうとしても消えず、困っております。 値の認識を最初の立ち上がり時だけ受け取り、一度ダイアログを消したら次を無視するような記述は どうしたらよいでしょうか? 宜しくお願い致します。
フラグを使うのはどう? if 閾値内 then if 表示フラグ then ダイアログ表示 end if 表示フラグ = False else 表示フラグ = True end if
最近はじめるなよ
最近VB6始めるなんてアレだな。 仕事か?
On Error Goto Catch '処理 On Error Goto 0 Goto Finally Catch Select Case Err.Number Case ● 'エラー処理 Case ▲ 'エラー処理 Case ■ 'エラー処理 Case Else 'エラー処理 End Select 'Finallyを実装したくない時はここにExit Subを設けるか、ログを吐いて処理を終了させる Finally 'Finally処理 'Finally終わり---------------------- '処理の続き End Sub こんなんでどうよ?Try Catch風
>>728 へ?Finally処理の後に処理が続くのか?
「Finally処理」が最後の処理になってないんだけど。
try-finallyの実装ならそれでいいと思うけど?
724です
自己解決しました。
閾値到達からタイマカウントUPされるまでの間を起動条件にして、それ以外では表示しないようにさせました。
シーケンサのノリでタイマを使ってトリガパルスを作りました。
>>727 おっしゃる通り仕事で最近使い始めました。
昔外注(派遣さん?)に作らせたものを改装しようとして、普段PLCラダーしかやらない私に振られ、困ってましたが
何とかなりました。
ド素人から レ素人くらいにはなれました。
お騒がせしました。
732 :
デフォルトの名無しさん :2013/01/23(水) 12:40:29.74
724が理解できた725が凄いと思った
俺も理解してた
734 :
デフォルトの名無しさん :2013/01/23(水) 17:33:00.07
異常値でダイアログを表示しているが、 ダイアログを閉じても異常値は継続しているので、またダイアログが表示されて困ってる という話か 妙な日本語使うのぅ
735 :
デフォルトの名無しさん :2013/01/23(水) 18:49:55.73
ピクチャのLineメソッドって、コードに誤りがなくても時々 「コンパイルエラー 引数の数が一致していません。または不正なプロパティを指定しています。」 って出るよね プロジェクトを一旦閉じて開き直すと治るけど
>>729 TryCatchFinallyからは外したい部分じゃね?
例えば
引数がnullの場合はそのまま空のCollectionを
返して、nullじゃない場合はデータベースアクセスして
結果をCollectionに入れて返す。
で、データベースアクセスでfinally内にRecordsetのclose
だとかConnectionのクローズとかを記述。
>>736 > で、データベースアクセスでfinally内にRecordsetのclose
> だとかConnectionのクローズとかを記述。
これこそがFinally処理かと。
TryCatchFinallyから外したい処理があるのなら、それはこの関数内で行う処理じゃなくて
この関数をコールする関数でやることかと思うんだけど。
そうじゃないと関数がぐちゃぐちゃになっちゃう。
>>737 一つのプロシジャ中にTryブロックは一つしか書いちゃいけない教の人ですか?
Private Function hoge(aaa As String) As Collection ans As Collection: Set ans = New Collection If aaa = vbNullString Then '何もしない Else On Error Goto Catch 'DBアクセス コネクションの取得とかそんなん On Error Goto 0 Goto Finally Catch 'エラー処理 Select Case Err.Number Case ● Case ■ Case Else End Select Finally On Error Resume Next 'コネクション持ってたら解放とか On Error Goto 0 End If Set hoge = ans '戻り値のセット。一応、Finally以下に処理がくる End Function Finallyの後に何かある例
>>739 戻り値のセットもFinally処理に入るんじゃね?
741 :
740 :2013/01/24(木) 18:50:32.72
>>739 すまん。間違えた。
Catch、FinallyをIfステートメントの中に入れるのかよ。
文法上は問題ないと思うけど、Catch、FinallyをIfステートメントの中に入れなくてはいけない理由は?
>>741 入れてもいいけど、TryCatchのスコープを絞りたい。
TryCatchしたい対象を絞るって感じですね。
人によってはTryCatch使う時、メソッドの中身をガバっと
丸ごと囲ってしまうっていう事をするのはもちろん知ってる。
743 :
741 :2013/01/24(木) 19:34:57.19
>>742 これじゃダメなの?
Private Function hoge(aaa As String) As Collection
ans As Collection: Set ans = New Collection
'引数のチェック
If aaa = vbNullString Then
'何もしない
Goto Finally
End If
'DBアクセス用オブジェクトや変数の初期化処理
On Error Goto Catch
'DBアクセス コネクションの取得とかそんなん
On Error Goto 0
Goto Finally
Catch
'エラー処理
Select Case Err.Number
Case ●
Case ■
Case Else
End Select
Finally
On Error Resume Next
'コネクション持ってたら解放とか
On Error Goto 0
Set hoge = ans '戻り値のセット。
End Function
>>743 最初のGoto Finallyが、無用で、
その使い方をすると際限なくGoto使うバカが出現しそう。
JavaのTryCatchFinallyと近い形式で記述したい。
>>744 ん?条件後出しかよ。
そんなこと言ったら、Finally使ってる時点でGoToを際限なく使う奴が出てくると思うけど。
そもそもVBをJava風に書くスレでもないわけで、VBの書き方に沿えばいいんじゃねぇの?
確かにGoTo廃止論はあるけど、エラー処理、終了処理についてはGoTo使うと処理がスッキリ書ける。
最初のチェックでGoto Finallyにしたくないのなら、Exit Functionにするやり方もある。
ただし、終了処理となるFinallyラベルがあるのに最後の処理を通らず終了するのは処理の統一感が無くなってしまう。
最初のチェックでGoto Finallyを使ったのはそういった理由がある。
>>739 俺ならこうするな。
Public Function GetDBConnection(connectString as String) As Boolean
On Error Goto FATAL
'DB接続処理
GetDBConnection = True
Exit Function
FATAL:
'接続エラー時の処理
'例外を投げても良し
End Function
>>743 finally相当の仕組みを使いたいなら、Classを使ってデストラクタを定義したら?
748 :
デフォルトの名無しさん :2013/01/25(金) 10:51:41.16
>>745 誰もお前に書けなんて要求はしてない。後出しも先出しも中出しも先っちょだけもない。
お前は勝手にゴミのような劣化したコードを書いてこれじゃダメなのと言い出した
勘違いブサイクであることを自覚しろ。
ageてまで書くようなことかね
750 :
デフォルトの名無しさん :2013/01/25(金) 11:10:40.89
>>749 上げることは特別なことだという価値観がお前の中では形成されているのか?
お前の中では?いんじゃねえのそれでも お 前 の 中 で は な。
751 :
デフォルトの名無しさん :2013/01/25(金) 11:15:15.33
>>743 ダメに決まってんだろ。こんなきったねえコード久々に見たわ。
お前の汚い染み付きコードを見せられて気分が悪い。謝罪と賠償を要求する。
752 :
デフォルトの名無しさん :2013/01/25(金) 11:20:33.63
>>745 お前はFinallyの意味がわかってない。
関数の終わりだからFinallyじゃねんだよ!Finally句のイディオムも理解せずに適当ぬかしてんじゃねえぞ!
>>741 何お前If文のなかでTry Catchしたらいけないとでも思ってんの?
バカじゃねw
754 :
デフォルトの名無しさん :2013/01/25(金) 11:23:42.48
756 :
デフォルトの名無しさん :2013/01/25(金) 12:07:43.90
>>729 そもそもこいつがTry Catch Finallyを理解せずにいちゃもんつけてんだよな
>「Finally処理」が最後の処理になってないんだけど
バカすぎるw
構造化例外処理くらい知ってろよ
finally厨はもういいって
759 :
デフォルトの名無しさん :2013/01/25(金) 16:16:47.23
では頭の体操です Debug.Print DateAdd("d", CDate("2013/1/25"), 7) は 2013/02/01 ですが Debug.Print DateAdd("h", CDate("2013/1/25"), 7) は 1904/09/22 19:00:00 なぜでしょう
後出しって言われてブチギレてる奴がいるなw
763 :
744 :2013/01/25(金) 17:13:27.88
finally厨はもういいって
>>759 パラメータの順序が変ってことかな。
Date型は整数部が日数、小数部が時間で実数型と互換があるから、
それなりに動いてしまうわけだ。
Debug.Print DateAdd("h", 7, CDate("2013/1/25"))
766 :
デフォルトの名無しさん :2013/01/25(金) 20:40:47.57
正解でございますー
つか、挑戦しようが、受け取ろうがどうでもいいけどさ... コードはもっと単純に書けよ... On Error Resume Next でこんがらがる様なら、そのコードそのものが間違ってんだよ...
768 :
デフォルトの名無しさん :2013/01/27(日) 12:31:38.78
私なら多分例外だって、信じてるはずだわね、あなたも 針で刺すような 口づけの後、窓の外、気まずさを逃したの
>>743 > これじゃダメなの?
ダメだよ。ダメダメ。却下。
理由を言えない
>>769 みたいなレスを見ると
逆に良いって事なんじゃないかって思えてしまうな。
2ちゃんねるのやり過ぎかw。
771 :
デフォルトの名無しさん :2013/01/29(火) 08:33:44.49
↑ 正論!
>>770 理由はね…Javaの try-catch-finally…の働きを見てみよう。
>>752 に
>関数の終わりだからFinallyじゃねんだよ!
とある。
もう少し言えば
>>756 が
>Try Catch Finallyを理解せずに
と言ってる。
finallyってね、tryで囲んだ中で例外が起ころうが起こるまいが
最終的にはfinally内の処理を行うっていう記述なんですよ。
関数の終わりだからfinallyじゃないんですよ。try内の最終処理なんですよ。
tryで囲むという事は
>>742 が優しく教えてくれているように
>TryCatchしたい対象を絞るって感じですね
こういう事なんですよ。そこに●●の例外が起こる可能性というのを
明確に理解した上で、意図的にtry-catchで囲みます。
finallyの使い方の一例としては、既にデータベースアクセスが例に挙げられているけど
それと同じように、openしたらcloseしなきゃならないような場合、finally内に
closeの記述を入れるのは定番かと思います。例外が生じてcatchしようが
closeは必ずしなゃなんないでしょ。
773 :
772 :2013/01/31(木) 01:27:01.93
>>770 というように、理由を言えないとかではなくて、
スレを読んでいればもうそこに理由が書かれてるんですよ。
そもそもVBなのにJavaのように書こうとするのが愚か。
775 :
デフォルトの名無しさん :2013/01/31(木) 11:56:25.20
>>774 Try Catchふうに書くとこうなるねって会話が行われてたわけで
そもそもとかいうのはちゃぶ台を返すようなもの。
将棋で負けそうになって将棋盤をひっくり返すようなもの。
愚かなのはお前だけ。
>>775 どうしてもJava風に書かなければいけない理由があるのか?
その背景がないのなら意味がない。
777 :
デフォルトの名無しさん :2013/01/31(木) 12:23:43.95
>>776 会話の前提に従うことができないのならその会話に参加する意味はないな。
そりゃそうだ。
>>776 try...catchはJavaだけじゃないし。モダンな構造化言語には一般的だろ。
VB.NET使えよって煽りがまだなのがあれだ。 Try-Catch-Finallyを全機能コーディングで実現しようと思ったら こんなに大変になるって言うのを証明できれば十分。 どっか漏れができるんだよね。
>>778 VBにtry...catchなんてないのにアホか。
>>778 finallyの部分が特に糞だと言われてんだけど
on error resume next しておいて if err then exit sub end if がよい。
俺はプログラムのセンス無いと思ってたが おまえらもセンス無いのな、俺と大差ない センスある奴ってやっぱごく限られた人間だけなのがよく分かる
>>782 いちいちエラーコードをチェックしなくて良いように、今の実行時エラーの仕組みがあるんだから、
それをやっちゃ元も子もない
コールスタックの一番最初、例えばボタンのクリックなんかでは sub Command1_click on error goto err いろいろ exit sub err: call 共通エラー処理(err) end sub それ以外のコードでは以下のコードを基本として sub foo on error goto err いろいろ exit sub err: 終了処理 Err.raise Err.Number end sub 終了処理が何も要らなければ(ほとんどがこれに当てはまる) on error gotoしないで、エラーを無視して続行できる場合は Err.raiseしないで処理を続行させればいいでしょ?
> 終了処理が何も要らなければ(ほとんどがこれに当てはまる) なぜ終了処理が何も要らない=ほとんど当てはまるかというとね。 たとえばデータベースの切断。 あんなのはクラスにしてしまえば、 関数から抜けた時にfinallyと同じように terminateが実行されるんだよ。
>>787 try catchできないVBでの例外処理はどうしようかって議論で
finalyな処理が必要かどうかなんて議論してないぞ
あと基本GCにメモリ掃除を任せる言語でデストラクタによるDB切断とか薦められてないからな
>>788 VB6のGCは参照カウンタ式だからterminateのタイミングは
きちんとプログラムで制御できるよ。
>>789 基本GCにメモリ掃除を任せる言語ってのはVBのように単純なGCではない言語って意味だったんだが
まあ、そこも議論の本題ではない
791 :
デフォルトの名無しさん :2013/01/31(木) 20:29:26.47
>>790 VB以外の言語の話をしてそれは本題ではないといってんの? バカ?
>>788 finallyはtry catchとセットのものだ。例外処理の議論をしてて
finallyを議論しないやつはにわか。そっこくこのスレを去るべきだ。
792 :
デフォルトの名無しさん :2013/01/31(木) 20:48:30.54
構造化例外処理ならこうだろ。 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
finallyがそんなに重要とは俺は思わないね。 構造化例外処理のキモは文字通り構造化されていること。 何が起ころうと実行する必要がある終了処理を実行する必要がある構文として finallyが優れているとは思わない。 現にusingやlockがあるC#ではfinallyってそんなに出番がない。
>>791 VBスレなのに何でJavaの話をする必要があるのか解らんな。
try catchなんて論外だろw
いやだからfinallyの出番が多いか少ないかではなくて usingはおろかtry-catchすらないVBで、try-catch-finallyの機能を処理するための構造はどうするかって話をしてたんじゃないの? だれかあれ張ってくれ、詭弁のガイドライン
VBらしい使い方してあげてよ
797 :
デフォルトの名無しさん :2013/01/31(木) 21:13:52.58
>>794 どういうのが論内?
>>793 usingがあればfinallyがいらないという関係のものじゃないだろ。
コンパイラがusingをfinallyに書き換えてんだから。finallyがなければ
usingもない。蒸気機関なんていらない汽車に乗ればいんだからと言ってるようなもの。
パンがなければケーキを食べればいいと言っているようなもの。アンネ・フランクでも気取ってるつもりか!
>>795 でっすよねー
798 :
794 :2013/01/31(木) 21:25:28.14
>>797 VBが範囲内でしょ。
何で態々Java風な書き方しなくちゃいけないんだよ、VBで。
どうしても議論したいのであれば、どうしてもJava風に書かなければいけない理由を教えてくれ。
799 :
デフォルトの名無しさん :2013/01/31(木) 21:29:59.87
>>798 そのVBの範囲内というのはどういうの?
VB.NETにもTry Catch Finallyがあるわけで見慣れた構文なら
一般的な開発者間での意思共有がはかどりまくりだろ。はかどりまくりだろ。
2度言いたかったから2度言いました。
>>799 お前の要望なんてどうでもいいんだよ。
VBはTry Catch Finallyが存在しない言語ってことが理解できないみたいだね。
推測だけど、VBをJava風にアレンジしたのがVB.NETなんじゃねえの?w
801 :
794 :2013/01/31(木) 21:47:49.81
>>799 どうしてもJava風に書かなければいけない理由になってない。
単なる要望w
802 :
デフォルトの名無しさん :2013/01/31(木) 21:52:39.15
>>800 俺の要望て何?俺なんか要望したかな。
なるほど、Try Catch FinallyはVBに存在しない。
VBでは例外処理がどう書かれるべきだと思う?
803 :
デフォルトの名無しさん :2013/01/31(木) 21:54:15.16
>>801 どうしてもJavaふうに書かなければいけない理由はないよ。
VBらしいすてき実装方式を教えてもらえるならそれに鞍替え
しようと思う。どう書くべきだと思う?
804 :
794 :2013/01/31(木) 21:55:19.77
>>802 話をそらすな。
どうしてもJava風に書かなければいけない理由は?
805 :
デフォルトの名無しさん :2013/01/31(木) 21:59:42.95
>>804 /゙ミヽ、,,___,,/゙ヽ
i ノ `ヽ'
/ > ● | ナイヨ☆
彡, ミ(__,▼_)彡ミ
/ 、 |∪| )
/ ヽノ //
ヽ| /
| /
ヽ / /
/ /ヽ
(´_ /ヾ_)
806 :
794 :2013/01/31(木) 22:14:34.21
>>805 だったらTry Catch Finallyにこだわる必要が全くないのだが。
普通にVBの例外処理を書けばいいだけのこと。
807 :
デフォルトの名無しさん :2013/01/31(木) 22:15:42.42
ナイヨ☆しようと思う。どう書くべきだと思う?
808 :
デフォルトの名無しさん :2013/01/31(木) 22:22:43.77
>>806 うん、
>>794 がTry Catch Finallyにこだわる必要はまったくない。
Try Catch FinallyにこだわらないふつうのVBの例外処理はどういうの?
>>794 はVBにTry Catch Finallyがないという理由でTry Catch Finallyを模したもの
よりそれがすぐれていると思っている。普通にといわれても
>>792 も
>>786 も
普通といえば普通。
>>794 の頭の中にある普通のVBの例外処理はどういうの?
809 :
794 :2013/01/31(木) 22:30:55.44
構造化例外処理だろ? finallyは必須の機能じゃないよ。 finallyがなくても構造化例外処理になる。 C++がそうだ。
811 :
デフォルトの名無しさん :2013/01/31(木) 22:51:15.34
>>809 不満はない。
>>794 の考えを聞いてる。それだけ。議論というのは
ほかの人の意見を聞くことに重きが置かれるべきだと思う。だから聞いてる。
>>792 は俺が書いたものだけどそれはJavaでのこの形を参考にしたもの。
try {
try {
} catch {
}
} finally {
}
>>794 は普通にVBの例外処理を書けばいいと思っていて
>>792 を普通のVBの例外処理
と認識するなら
>>792 のように書けばいいということになるから、VBには
Try Catch FinallyがないからJavaをまねをすべきじゃないということと
はちょっと矛盾するよ。
デストラクタがない言語でfinallyがないとちょっとしんどい
813 :
809 :2013/01/31(木) 23:53:31.30
>>811 書いた本人だから
>>792 はtry catch finallyを参考にしたと言えるけど、
>>792 のコード自体Java臭はしないし、普通のVBのコードだと思う。
Javaを意識せずにVBのコードを書いても
>>792 のようなコードはありえるものだと思う。
>>811 の話はプログラムの構造の話なんで言語はそんなに問題じゃない。
今回のTry Catch FinallyをVBのステートメントに強引に置き換えようとしていたから
おかしな話になっていたんで無理にJava風にする必要はないだろと言っていただけのこと。
814 :
デフォルトの名無しさん :2013/02/01(金) 00:26:24.37
>>813 たぶんみんな構造の話をしてるんだと思うよ。おかしな話にはなっていなかったと思うよ。
>>794 はVBの例外処理をこう書くべきだというのはないの?
俺はtry catchをまねしてこう書くべきだと
>>792 を示した。
Javaの臭いを嫌悪する立場からこうするべきだという具体的なものはないの?
Javaの嫌悪とか関係ない。 まず、try-catchはネストできるからと言ってネストするのは良くない。 なぜなら例外処理というのは正常系の流れと異常系の流れを 分離するものだから、ネストするとそれがごちゃまぜになる。 そしてVBのon errorはネストできないが、それはgotoの飛び先を変えればいい。 try-catchにかぎらずネストは浅くするもの。この程度制御できないわけがない。 そしてうまいコーディングをするのならclassのterminateを使えば 終了処理は不要になる。これはJavaにも当てはまる話。
816 :
デフォルトの名無しさん :2013/02/01(金) 00:51:12.31
議論が煮詰まって最強のコードが出来上がったらそれをいただく これぞまさに漁夫の利 さぁおまえらどんどん白熱してくれ
Javaのコードとして
>>811 は
微妙なんだよ。
818 :
デフォルトの名無しさん :2013/02/01(金) 00:58:53.10
>>816 一般的な会議みたいな形だったら進行役の人がいて
これはこういうことでとまとめていくのだろうけど、
こういう議論の場だとどうなんだろうね。できあがるのは闇鍋コードになっちゃいそう。
819 :
デフォルトの名無しさん :2013/02/01(金) 01:01:27.29
>>817 絶妙なJavaのコードはどんな感じ?その機能をVBで実装するとどう?
>>819 関数1()
関数2()
関数3()
関数4()
上から関数が並んだ状態
これだとテストは一つのルートだけ
行えばいい。
条件分岐(try-catch含む)やループが
増えるたびコードは複雑になる。
821 :
デフォルトの名無しさん :2013/02/01(金) 01:05:50.64
>>820 なるほど、俺はお前との会話をあきらめた。
>>792 に聞きたいんだが
たとえばデータを読み取るような、そのオープンしたコネクションを使う処理はどこに書くべきだとおもってるんだ?
>>814 完全に後出しの話だろw
最初から構造的にどうする?って話じゃなかったし。
いい加減さ、人の話を利用して別の話にすり替えるのやめろよ。
>>811 きたねーコードだな。
お前Javaプログラマに向いてないよ。
俺なら、コネクションをラップするクラスを作るか、DB接続関連を全てラップするクラスを作るか、 接続済みコネクションを返す関数を作るかするね。 少なくとも、生のADODBという文字列が、コード中の至る所に登場するようなことにはしない。 あと、ByRefじゃないのか?
826 :
デフォルトの名無しさん :2013/02/01(金) 12:19:37.80
>>822 オープンしたコネクションを使う処理はCに書かれるべきだと思ってる。
>>825 ByRefは参照渡しだよ。戻り値を複数返したいときにはByRefを使うけどどこをByRefにすべき?
戻り値を複数返したいときにはByRefを使う 戻り値を複数返したいときにはByRefを使う 戻り値を複数返したいときにはByRefを使う 戻り値を複数返したいときにはByRefを使う ???
>>827 メモリーを消費したくないという意味だろ?
国語力の無さに突っ込むな
829 :
デフォルトの名無しさん :2013/02/01(金) 12:30:35.20
構造体って値で返せなかったっけ?
>>826 ここ
> Sub B(ByVal objConnection As ADODB.connection)
> Sub C(ByVal objConnection As ADODB.connection)
831 :
デフォルトの名無しさん :2013/02/01(金) 12:41:12.97
>>827 俺がByRefを使うときといったら戻り値を複数返したいときだな〜ていう意味。
>>828 違うよ。俺がByRefを使うときといったら戻り値を複数返したいときだな〜ていう意味だよ。
俺の国語力は108まである。
832 :
デフォルトの名無しさん :2013/02/01(金) 12:47:59.76
>>830 ConnectionのインスタンスはAで作られるからB、Cの引数を
ByRefにする必要はないよ。B、Cの引数をByRefにするとB、Cでインスタンスを
入れ替えられる危険性が生じる。B、Cでインスタンスを入れ替えられると
Aでリソースが解放されることが保証されなくなる。だからB、Cの引数は
ByValにすべきだと俺はそう思ってる。
>>832 VB6は参照カウンタでオブジェクトの解放を行うから、リソースの解放漏れはないよ。
834 :
デフォルトの名無しさん :2013/02/01(金) 13:08:21.16
>>834 え?
> B、Cでインスタンスを入れ替えられると
> Aでリソースが解放されることが保証されなくなる。
って書いてたから、喩えそんなことがあってもリソースが解放されないことなんてないよって書いたんだけど?
836 :
デフォルトの名無しさん :2013/02/01(金) 13:18:05.80
>>835 うん、そうなんだろうなとは思うけど、ByValにすべきかByRefにすべきか
という話をしてるんであって、参照カウンタ行うリソースの解放と
俺が書いたAで行われるリソースの解放と言葉の定義が変わってるから
そういうのはやめてくれって意味でそんな話はしてないってこと。
>>836 > 参照カウンタ行うリソースの解放と
> 俺が書いたAで行われるリソースの解放と言葉の定義が変わってるから
いや、君が思ってる通りの意味で、リソースの解放漏れは無いよって書いたつもりだけど。
それともアレなの?ADBDBって、オブジェクトが消滅してもコネクションが残ってたりするの?
838 :
デフォルトの名無しさん :2013/02/01(金) 13:24:33.89
>>837 そういうこというと話が発散しちゃうんだよね。現にいまByValをByRefに
すべきかという話がADODBのオブジェクトがどうなんだって話になってる。
そういうのやめてくれっていってんだ。
>>828 国語力の無さは関係ない。
VBという言語をきちんと理解しているかどうかだ。
>>838 俺は、ByValかByRefかはどうでもいいよ。好きにやれよ。
俺はね、「リソースが解放されることが保証されなくなる」とかいう適当なこという奴に敏感なだけなんだよ。
>>831 何が言いたいのかさっぱりw
ByRefってどんなときに使うのか、戻り値とは何なのかきちんと理解してないね。
こういう奴の話を聞くと疲れるだけ。
>>838 あ、ひょっとして「リソースの解放がされない可能性があるから、set obj = nothingは必須」って言ってた人?
>>832 > B、Cでインスタンスを入れ替えられると
> Aでリソースが解放されることが保証されなくなる。だからB、Cの引数は
> ByValにすべきだと俺はそう思ってる。
BもCも自分で書く関数なのに「入れ替えられると」なんて書くから、なんのこっちゃってなる。
書くんなら、「BもCもobjConnectionを再設定しないという表明のためByValにした」みたいに言えよ。
そういうことなんだろ?
844 :
デフォルトの名無しさん :2013/02/01(金) 14:03:09.15
>>843 >「BもCもobjConnectionを再設定しないという表明のためByValにした」みたいに言えよ。
そう予測したということは問題なく伝わるってことだ。証明してくれてありがとう。
何かこうさまつなところにばかり噛み付いてくるな。昨日あの店で食べたアイスクリームが
おいしかったって話してたら「違う、それはバニラアイスクリームだ、バニラの香りこそが
あのアイスクリームの味を際立たせるものだからバニラアイスクリームと言うべきだ、
お前らは間違ってる」と激昂するコミュニケーションブレイカーという名前のラスボスだ。俺はビアンカ。
>>844 > 何かこうさまつなところにばかり噛み付いてくるな。
みたいな愚痴いわずに、最初からちゃんと説明できるようにしような。
846 :
デフォルトの名無しさん :2013/02/01(金) 14:36:25.14
>>845 きちんと伝わることはお前自身が証明して見せたんだから
それが説明できていることのなによりの証拠だ。
自分でその証拠を提示しておいて説明できてないと言い張る
お前はただのかまってちゃん。ByValとByRefの違いがどうでもいいと
思っているのに俺にレスしてくるお前はタダノ・カマッテ・チャン。
カマッテ・チャンという名のアクションスター。俺はビアンカ。
>>846 話の流れで忖度できただけで、説明が下手なのは変わりない。
言ってくれる奴がいるだけ幸せなんだが。
>>832 > B、Cでインスタンスを入れ替えられると
> Aでリソースが解放されることが保証されなくなる。だからB、Cの引数は
> ByValにすべきだと俺はそう思ってる。
だからリソースの解放はTerminateでやるべきだってことだよ。
参照が0になればリソースの解放が行われる。
>>846 どう見ても、お前がかまってちゃん
長文とageるのやめろ
>>815 同意。
下手な奴は、業務上想定できるエラーも例外として定義して、try-catchをネストさせ、何段階ものcatchを書き、
例外を再スローしたりしなかったりにぎりつぶしたりとか、もう混沌としてたりする。
851 :
デフォルトの名無しさん :2013/02/01(金) 15:01:40.58
>>847 話の流れで意味がわかるんなら説明できてるってことじゃねえか。何言ってるんだ。
お前が幸せをあたえてるっていう思いに浸れるんならいんじゃねえの。
俺はそんなお前に絡まれるという不幸な目にあったビアンカだけどな。
>>848 >>832 はByValをByRefにするべきかという話だったんだけど、それはどういう話?
前提が違う話をしても話がすれ違うばかりだ。
つか、ByRefにするかByValにするかは、実引数そのものを変更するかしないかで選択するものにすぎないのに、 何をごちゃごちゃ言ってるんだよって話だ
>>851 何度も説明を重ねないと、人に真意が伝わらないのを、普通は説明下手って言うんです。
854 :
デフォルトの名無しさん :2013/02/01(金) 15:20:23.88
>>853 相手がこちらの意図を理解しようと努力する一般的な人であるという前提が
成立するならそのとおりだね。ByValとByRefの話をしてるときにByValとByRefは
どうでもいいといってしまう天然アスペだと前提は成立しない。
>>854 間違った事を理由にしてたから、それは違うと指摘しただけだよ。
いい加減、間違いを認めろよ。
俺の言ってることがわからないのは、俺が説明下手だからじゃない お前らが理解しようとしてないだけなんだ ってことですね、わかります
つか、構造化例外の例だかなんだか知らないが、
>>792 のコードは筋が悪い
858 :
デフォルトの名無しさん :2013/02/01(金) 15:38:50.71
>>855 俺はByValとByRefの話をしていて、お前はそれはどうでもいいという話をしている。
話の前提が違ってるからそもそも論理が展開される筋道が違うわけで、
トマトが甘くておいしいという話をしてる人に
「どこが甘いんだ、甘いというのはメロンのことを言うんだ」と怒りを爆発させている
大噴火おじさんでしかない。俺はビアンカ。
>>856 お前らというよりお前だけど、まあそういうこと。
860 :
デフォルトの名無しさん :2013/02/01(金) 15:40:40.39
>>857 お前が考える筋のいいコードを見せちゃいな。
「A、だからB」のAが間違ってるよと指摘するとファビョるの巻き
少なくともVB6系では、オブジェクトをByValでは渡せないんだぜ...
>>860 筋が悪い理由聞いた方がいいんじゃないの?
説明が下手な奴の例: ・全く関係無いたとえをして、話を発散させる
どうでもいいけど、sageろや ど素人か
866 :
デフォルトの名無しさん :2013/02/01(金) 15:49:31.18
867 :
デフォルトの名無しさん :2013/02/01(金) 15:57:01.42
>>865 メール欄にまで噛み付きだしたよ。天然アスペここに極まれり。
868 :
デフォルトの名無しさん :2013/02/01(金) 16:49:35.35
> 817 :デフォルトの名無しさん:2013/02/01(金) 00:53:58.19
> Javaのコードとして
>>811 は
> 微妙なんだよ。
> 857 :デフォルトの名無しさん:2013/02/01(金) 15:27:55.37
> つか、構造化例外の例だかなんだか知らないが、
>>792 のコードは筋が悪い
お前らは
>>811 や
>>792 は筋が悪いと言ったが、それよりすぐれたものを書くことができなかった。
つまり、
>>792 や
>>811 を書いた俺はお前らに対して完全勝利をはたした。
いまここに俺が大勝利したことを宣言する。
> お前らは
>>811 や
>>792 は筋が悪いと言ったが、それよりすぐれたものを書くことができなかった。
>>820 に書いてあるだろ。
優れたコードってのは、何かを書くんじゃなくて
何も書かなくていいようにするってことだ。
コードは書くとバグのもとになる。
だからコードを減らすことが、優れたコードなんだよ。
870 :
デフォルトの名無しさん :2013/02/01(金) 16:57:45.10
>>869 お前はコードを減らすという名目の元に例外処理を行う具体的なコードを
示すことができずに、条件分岐が増えるほどコードが複雑になるというプログラミング上の
ごくごくあたりまえの一般論を語ることしかできなかった。それはさながら家に火を
つければ火事になるといってるようなものであり、まったく1ミクロンも意味のない空虚な
言葉でしかなかった。つまりお前は
>>792 を具体的に示した俺に大敗北をきっした。
>>792 は汚すぎるコードだな。
まずサンプルとしてダメ。例外以外のことをやってない
例外処理が主になってる。アホらしい。
サンプル書くならこうだろ。
まずデータベースを使ったfoo()という処理を行いたい。
void main() {
foo()
}
これがスタートとなるべきメインの処理だ。
データベース関連のコードを加える
void main() {
Con con = new Connection();
MyClass my_class = new MyClass(con);
my_class.foo();
}
あ、VBじゃないというツッコミはいらんよ。
どの言語でも同じだから。
あとこれに例外処理を加える。
void main() {
try {
Con con = new Connection();
MyClass my_class = new MyClass(con);
my_class.foo();
} catch(e) {
共通例外処理(e);
}
}
これがシンプルな例外処理、無意味に複雑にするのは馬鹿のやること。
>>792 のコードが糞なののは、
コードレビューしたら、
で? 何がやりたいの? って言われる所。
まず「何がやりたいの?」という質問に日本語で答えろ。
どうでもいいけど、国語力が108って・・・。 プ
874 :
デフォルトの名無しさん :2013/02/01(金) 17:12:48.26
>>871 例外処理をどう書くかて話なんだから例外処理が主になるのはとうぜん
のことで、fooを追加しただけでなんとかなると思ってるお前の頭は虫に食われてんのか
と心配になる。お前のfooは俺のCでしかない。そしてお前のコードはConnectionのリソースを解放せず
メモリリークするようにしただけだ。つまり俺のコードより数段劣る。俺のコードでは例外処理をした上で
ConnectionのClose処理が行われるようになっている。
>>874 例外処理の正しい書き方とは、
本来のコードとは分離させること。
ネストしている時点でそれは正しい書き方とはいえない。
> Connectionのリソースを解放せず
スコープから消えたら解放される。
876 :
デフォルトの名無しさん :2013/02/01(金) 17:17:04.23
>>872 try {
try {
} catch {
}
} finally {
}
これをやりたいのと返す刀で返してレビュワーの頭をレビューするべきなんじゃないかと
手元の紙にメモる。コードレビューしたらそうなる。
>ネストしている時点でそれは正しい書き方とはいえない。 そうでもない
>>866 それは、気のせいだよ...
めんどくさいから詳しい説明は端折るが...ByValでも、ByRefでも、全く同じオブジェクトしか渡せないよ
879 :
857 :2013/02/01(金) 17:18:33.08
>>860 ダメだしで勘弁。
まず、A()、B()、C()にちゃんとした関数名を付けてみて。
(念のため説明すると、今A, B, Cという名前にしてるというのが悪いというわけじゃ無いぞ)
そして、オープンしたコネクションはC()で使うということだが、その使用するコードをC()に追加することを想像する。
さらに、別のオープンしたコネクションを使う場面を考える。
さて、そのコードはどうなる?
>>877 正しくない。
そもそもどちらがシンプルなコードになってるか見れば答えは明らか。
力を入れる場所が違っている
俺はコードをシンプルにするようにプログラミングしていく。
馬鹿はコードを複雑に書いてどや顔する。
881 :
デフォルトの名無しさん :2013/02/01(金) 17:20:36.61
>>875 >>871 はスコープを抜けたらリソースが解放されるようになってないよ。
どの言語でも同じだっていってるけど、それは違うよ。それは気をつけないと
メモリリークするよ。
>>881 > スコープを抜けたらリソースが解放されるようになってないよ。
Connectionはただのクラス。
データベースの接続オブジェクトはConnectionクラスに内包されている。
データベースの接続オブジェクトの解放はConnectionクラスの中のTerminateで行なっている。
お前にはそういうコード、作れないの?
883 :
デフォルトの名無しさん :2013/02/01(金) 17:25:42.30
>>878 ちょっとお前がなにをいってるのかわからなくなってきた。
> 862 :デフォルトの名無しさん:2013/02/01(金) 15:41:59.05
> 少なくともVB6系では、オブジェクトをByValでは渡せないんだぜ...
> 878 :デフォルトの名無しさん:2013/02/01(金) 17:17:57.67
>
>>866 > それは、気のせいだよ...
> めんどくさいから詳しい説明は端折るが...ByValでも、ByRefでも、全く同じオブジェクトしか渡せないよ
ByValではオブジェクトを渡せないと言ってたのが、
ByValでも同じオブジェクトしか渡せないと言ってる。
ByValでオブジェクトを渡せるの?ByValでオブジェクトを渡せないの?どっちなの?
例 ある作業をするときにデータを一時ファイルに書き出し、そして処理を行う。 一時ファイルはtempディレクトリ作る。ただし名前は既存のものと被らないようにする この時途中でエラーが起きたら、一時ファイルは削除する 俺ならこう書くね。 Sub main On Error Goto err Dim p as Process Set p = new Process Call p.run Exit Sub Err: MsgBox Err.Description End Sub Processクラスの内容は省略。作れないわけ無いよね?
885 :
デフォルトの名無しさん :2013/02/01(金) 17:29:49.47
>>882 俺にはというかすくなくともJavaではできないよ。デストラクタがないから。
お前はどの言語でも同じだっていってたから、それは違うよってこと。
VBで考えろよ 馬鹿なの?
>そもそもどちらがシンプルなコードになってるか見れば答えは明らか。 それほど明らかでもない
はい、ここで「Javaでは出来ない」という話が出て来ました。 言語的に劣っているものと同じコードを書かないといけないのでしょうか? おかしな話ですね。 Javaではできないから、こんなふうに書かざるをえない。 だからVBでも同じようにするべきだ。 意味がわかりません。
>>883 非常にめんどくさいので、説明は割愛させて欲しい...
要するにオブジェクトに関して言うと、ByValで指定しても、ByRefで指定しても、結果的には全く一緒だって事
内部の処理は、ByValはByValの処理、ByRefはByRefの処理はされているが
ByValで渡しても、ByValに期待する結果にはならない
いやVBを使う人には、ByValで期待する結果になるのか?
890 :
デフォルトの名無しさん :2013/02/01(金) 17:35:27.58
>>879 俺終止形で命令するやつって大っ嫌い。
言いたいことあるなら質問という形にするんじゃなくて先に言って。
うぜえだけだから。あたし何歳に見えるー?と同じ。うざいだけ。
どうや? お前が実はJavaにも 無知だってわかったかい?
894 :
デフォルトの名無しさん :2013/02/01(金) 17:39:06.46
>>888 > Javaではできないから、こんなふうに書かざるをえない。
> だからVBでも同じようにするべきだ。
これは俺が言ったことじゃなくてお前が言ったこと。
お前は意味がわからない言葉を自分で考えてそれに自分で意味がわからない
といっているだけだよ。むなしいだけだね。
JavaでできることとVBでできることとが違うっていう認識があるんなら
どの言語でも同じっていうのは成り立たないよ。
>>894 どの言語でも同じなのは考え方なw
そりゃ言語が違うんだから書き方は違うに決まってるよw
>>890 > 言いたいことあるなら質問という形にするんじゃなくて先に言って。
まず、A(), B(), C()に具体的な名前を付けることができないとすれば、それはA(), B(), C()の
凝集度が低いことの証明になる。
次に、C()内部でデータベースをオープンするのはまずい。
C()と同じような立場のD()を作る事を想像すると、その呼び出しシーケンスはどうなるか?
D()でデータベースをオープンしないのなら、なぜC()ではオープンするのだろうか?
898 :
デフォルトの名無しさん :2013/02/01(金) 17:46:51.01
どの言語でも同じ「考え方」でいうと コードはシンプルな方がいい。 シンプルなコードを目指すとtry-catchのネストなんて 汚いコード以外の何者でもないのだ。 まあJava6まではリソースの自動解放ができなかったのだから 仕方なくtry-catchのネストなんて汚いコードを書かざるを得なかったかもしれないけど その汚いコードと同じ書き方をするべきなんてのは間違っているわけだ。 Java7では文法が改良され、リソースの自動解放ができるようになった それは望まれた機能だったから追加された。 そしてよりシンプルにコードが書けるようになった。 VBでもシンプルなコードにするのがいいに決まっている。 考え方は一緒だが、書き方は違う。
>>897 > うん、で、
>>871 のJavaで示されたコードはメモリリークするよっていってんの。
Javaのコードなんて一言も言ってないけど?
コンパイル通らないでしょ。
901 :
デフォルトの名無しさん :2013/02/01(金) 17:49:59.65
>>897 だからさ、質問という形じゃなくて考えをまとめて自分の頭の中で
結論を出してからそれを書いてよ。こうするべきだというのもあわせて
提示してもらうのが理想だけどもないならないでかまわないから、
これはこういう理由でこうするべきだっていうのを示して。
902 :
デフォルトの名無しさん :2013/02/01(金) 17:52:34.69
>>900 ほんとだ、Javaじゃないのね、デストラクタが存在するJavaのような
コードで書くとそうなってどの言語でもそれは変わらないっていってるのね。
どの言語にもデストラクタが存在するといってるわけだから、Javaにデストラクタ
が存在しないことを述べた俺が正しいということでいいね。
>>901 結論は出ている。
A(), B(), C()は凝集度が低いように見える。
だがそれは君がどういうつもりで関数分割したのかにもよる。
だから、具体名を付けてみてと言っている。
そして、C()でデータベースをオープンするのはまずい。
どうすれば良いかはあきらか。
オープンしたコネクションをC()に渡せば良い。
> Javaにデストラクタ > が存在しないことを述べた俺が正しいということでいいね。 Java7ではデストラクタの代わりとなるものがあるって さっきリンク書いただろ。読んでないのか?
> オープンしたコネクションをC()に渡せば良い。 ちょっとこれは誤解を招くので訂正する。 オープンしたコネクションを使う場合は、その関数にオープンしたコネクションを渡す仕組みにするのが良い。
>>903 全くその通り
汚いコードをだして汚いコードを真似して書いてみろと
言われても、なんでお前そんなコード書くんだよ?
まず最初にお前の汚いコードから直そうなとしか思えない。
つーか、関数じゃなく、クラスで処理しやがれ
908 :
デフォルトの名無しさん :2013/02/01(金) 18:08:33.07
>>903 関数を分割した意図はこれをやりたかったから。
これで俺がどういうつもりかお前はわかるから俺が名前を変えるまでもなく凝集度がわかるな。
try {
try {
} catch {
}
} finally {
}
>>904 代わりになるものだね、つまりデストラクタは存在しないということでいいね。
>>905 BでコネクションをオープンしたらErr.Numberのチェックが2つ必要になる。
VB.NETやC#ではTryブロックの中でコネクションをオープンするだろ。
つまり俺のコードは直感的にわかりやすい。お前が言ってるのはコードが
増えるだけの悪いコード。
ちょっと病気かもね
Bでコネクション・・・だからな 推して知るべし
>>908 > BでコネクションをオープンしたらErr.Numberのチェックが2つ必要になる。
「Bでコネクションをオープンした」場合のことを言っているのでは無い。
C()でオープンするのなら、その他のコードはどうなるのかということを考えてくれと言っている。
*
もう今日は帰るので、もっと具体的に考えることができる例を書いとく。
ある画面Form1のButton1をクリックしたら、マスターのsectionsとusersを検索して
画面に表示しなければならない。
・sectionsを検索するコードはA(), B(), C()のどこに実装するのか
・usersを検索するコードはA(), B(), C()のどこに実装するのか
・Button1のクリックイベントハンドラは、A(), B(), C()のどれを呼ぶのか
・Button1のクリックイベントハンドラが別の関数を呼んで、その中でデータベースの検索をする場合、
その呼ばれる関数には何という関数名を付け、A(), B(), C()はどう呼ぶのか
・Form2のButton1をクリックしたらusersを検索する必要があるのだが、そのコードはどうなるのか
>>908 > 代わりになるものだね、つまりデストラクタは存在しないということでいいね
デストラクタの代わりになるものがあるから
同等のコードが書けると認めたってことでいいかい?
俺が言いたいのはデストラクタそのものがあるかどうかではないからさ。
VBだってデストラクタではなくTerminateだしな。
>>908 > 関数を分割した意図はこれをやりたかったから。
そもそもなんでそんな汚いコードをやりたいと思うの?
まず話はそこからなんだが。
914 :
デフォルトの名無しさん :2013/02/01(金) 18:14:10.34
ちょっと違うだろ
>>908 > BでコネクションをオープンしたらErr.Numberのチェックが2つ必要になる。
汚いコードを書くお前は、やっぱり汚いコードを思いつく。
なんでそんなチェックが必要になるのか、
やっぱり根本的な発想がダメなんだろうな。
916 :
デフォルトの名無しさん :2013/02/01(金) 18:15:30.34
>>911 もういいわお前。俺はお前の意見を聞きたいの。質問を聞きたいんじゃないの。
自分の意見をきちんと述べることができなかったお前が大敗北したということに決定な。
大敗北とか 勝負してたのかね?
大敗北・・・2chではあまり聞かない言葉だ
>>916 まだ帰ってなかったりして。
>>911 の具体例を瞬時に想定できないようなコードだから、筋が悪いと言っている。
悪くないというなら、
>>911 の回答を月曜までに書いといてくれ。
休みの間は2ch見ないから。
コードをシンプル側に持っていくって 発想がないのかねぇ。
厳密なデストラクタがある言語こそ限られてると思うが
だな それに、大学のレポートかよ?
>>921 正確にはデストラクタじゃなくても
スコープを抜けた時に呼び出される仕組みがあればいいんだよ。
たとえばJava7にはそれがある。
ない言語って?
なお、俺なら全然別の実装をするよ。 他の人も書いてるが、コネクションを取得する関数を別途作る。 Public Function GetConnection(connString as String) as ADODB.connection End Function って感じだろうか。 接続できなければ、Nothingを戻す。あるいは、実行時エラーを戻す。 どちらにするかは、そのアプリケーション全体のエラー処理ポリシーによる。
925 :
デフォルトの名無しさん :2013/02/01(金) 18:22:53.41
>>912 うん、Java7のリソース付きtry文でcloseが呼ばれることは否定してない。
>>913 汚いコードだと思ってないからお前の質問は意味がない。はい勝利。
926 :
デフォルトの名無しさん :2013/02/01(金) 18:24:22.60
いつもの論破君か?
> スコープを抜けた時に呼び出される仕組みがあればいいんだよ。 VBもスコープを抜けたらリソースが解放されるんだが、それがわかってないんじゃないだろうか
>>925 > 汚いコードだと思ってないからお前の質問は意味がない。はい勝利。
汚いコードであることは明白なので
お前がどう思っているかどうかは意味が無い。
むしろお前が汚いコードだと思ってないことは承知済み
だろうなぁって生暖かい目で見てる。
だろうな
勝利とか言っちゃうのは劣勢だからだろ? もっと余裕持てよ
汚いコードだと思ってないけど、お前らの質問には答えません なぜなら質問の意味がないからです
あの馬鹿に、Java7コードで try-catchのネストを書かせばばいいじゃね? ちゃんと具体的なコードも含めて ま、逃げるだろうな。
933 :
デフォルトの名無しさん :2013/02/01(金) 18:30:03.45
>>919 ふつう逆だろ、仕事のときは2chを見て、お休みのときに2chを見ないなんて
この罰当たりが!想定できなかったのはお前が悪い。俺のコードは悪くない。
お前の頭が悪い。俺のコードは悪くない。俺のコードが大勝利。早く帰れバカ。
934 :
デフォルトの名無しさん :2013/02/01(金) 18:31:51.36
>>928 明白であることを一切示すことできていないお前の発言は
井戸の中に向かって王様の耳はロバの耳と言っているようなもの。
王様の耳はロバの耳じゃない。はい古典文学的論破。
try { try { } catch { } } finally { } 俺ならこう書く try { } catch { } finally { } もしかして1段に並べられるのを知らないのではないか?
>>934 > 明白であることを一切示すことできていないお前の発言は
上で書いたでしょw
ネストするのはありえないし、
コードはシンプルにする方がいい。
>>935 ありそうwww
なんかJavaにも詳しくなさそうだし。
938 :
デフォルトの名無しさん :2013/02/01(金) 18:35:26.62
ネストさせる理由を一切書いてないからな。 ネストさせることに正当な理由があることを証明できてないのだよ。 多分これからもいろいろな文句を言って書かないつもりだろうね。
939 :
デフォルトの名無しさん :2013/02/01(金) 18:40:25.26
>>935 それは知ってるんだけど、それについては
>>739 がすでに示してるんで、
同じもの書いて俺ならこう書くっていうのはそれこそ変だろ。
だから俺は
>>739 に対してそれ構造的に変だなんてことは言ってない。はい論破。
940 :
デフォルトの名無しさん :2013/02/01(金) 18:44:07.03
>>938 階層を分けることによってああここはFinallyしてるだなー
ああここはCatchしてるんだーなーというのがわかるだろ。
関数の機能を一つに絞るという構造化プログラミングの王道を
示した
>>792 こそ優れた例外処理だということに異論はないだろ。はい論破。
>>792 がクソコードな理由ならはっきりしてるな。
AでnewしてAでcloseするのなら
Aでopenしないといけない。
センスが無いとしか言いようが無い。
942 :
デフォルトの名無しさん :2013/02/01(金) 18:50:21.27
>>941 AでCloseされるからAでOpenしなければいけない理由が説明されてない。
AでCloseするのが嫌ならCでCloseすればいいだろ。はい論破。
>>942 やっぱりセンス無いとしか言いようが無いな。
openとcloseというような
対応する処理を階層をまたがって実行することで
ここでOpenしてるのだからCloseもここらへんに
あるはずだよなーという想定が全く通用しなくなる。
それはコードがわかりにくいということ。
>>792 が書いたコードが
ことごとく糞である。
そのことを認められないので
嵐とかしてる。
> AでCloseするのが嫌ならCでCloseすればいいだろ。はい論破。 こういうことかい? Sub A() Dim objConnection As ADODB.connection Set objConnection = New ADODB.connection Call B(objConnection) 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 objConnectionを使った何かの処理 If objConnection.State <> adStateClosed Then Call objConnection.Close End If End Sub
947 :
デフォルトの名無しさん :2013/02/01(金) 19:02:26.04
>>943 うん、じゃあその非対称性が気になる問題はCにCloseを記述することで解決するな。
で、その階層をまたがるって話なんだけど、じつはVB.NETやC#ではこれは
見慣れたものだったりするだろ。ほれ、OpenとCloseの階層は異なっている。
msdn.microsoft.com/ja-jp/library/system.data.sqlclient.sqlconnection%28v=vs.80%29.aspx
つまり俺が示した
>>792 は例外処理のベストプラクティスといっていいわけ。はい論破。
> つまり俺が示した
>>792 は例外処理のベストプラクティスといっていいわけ。はい論破。
ベストプラクティスであるという根拠が示されていない。
949 :
デフォルトの名無しさん :2013/02/01(金) 19:05:37.41
>>946 うんにゃ、すこし違う。Aで行われるのはあくまでFinallyの処理
なんでAではStateをチェックしてCloseを呼ぶようにしておく。
CではStateをチェックしないでCloseを呼ぶようにする。
>>947 目を凝らしてどこにcloseが書いてあるか言ってみろ。
>>949 はい、じゃあそのコードを書いてください。
お前のやり方は、どんどん複雑になりますねw
952 :
デフォルトの名無しさん :2013/02/01(金) 19:08:41.49
>>948 俺が示した
>>792 はマイクロソフトが示した実装例のコードとシンクロする。
つまり
>>792 はマイクロソフトお墨付きの例外処理といっても過言ではないわけ。
お前らのちんけな頭で考えられた中身のともなわない空疎なものとはものが違うわけ。はい論破。
論破と言うまでもない戯言だろうが
単にVB6板を荒らしたいだけだろう?
なぜかJava族に嫉妬されるVB6.0であったwwww は〜い、論破!w
956 :
デフォルトの名無しさん :2013/02/01(金) 19:14:23.98
>>950 usingがfinallyになってdisposeが呼ばれてcloseが呼ばれるだろ。
openとcloseの階層が違うのは明らかなことだろ。
>>947 はopenとcloseの階層が
異なることを述べたわけ。はい論破。
>>951 何言ってんだお前。1行増えるだけだろ。
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
Call objConnection.Close
End Sub
>>949 俺ならこうやるな。
Sub A() 'コールスタックの一番上の場合。
On Error Goto ErrHandler
Call B()
Exit Sub
ErrHandler:
If Err.Number <> 0 Then
Debug.Print Err.Description
End If
End Sub
Sub B()
Call C()
End Sub
Sub C(ByVal objConnection As ADODB.connection)
On Error Goto ErrHandler
Dim objConnection As ADODB.connection ' オブジェクトは必要となる部分で作って解放
Set objConnection = New ADODB.connection
Call objConnection.Open
objConnectionを使った何かの処理
Exit Sub
ErrHandler:
Dim number As Integer: e = Err.Number
If Not objConnection Is Nothing Then
If objConnection.State <> adStateClosed Then
Call objConnection.Close
End If
End If
Err.Rase number
End Sub
958 :
957 :2013/02/01(金) 19:19:18.73
まあこれはちょっと長いので工夫する Sub A() 'コールスタックの一番上の場合。 On Error Goto ErrHandler Call B() Exit Sub ErrHandler: ErrLog(Err) End Sub Sub B() Call C() End Sub Sub C(ByVal objConnection As ADODB.connection) Dim myclass As MyClass Set myclass = new MyClass '内部でデータベースへ接続。スコープから抜けるときにデータベース切断 myclass.foo() 'objConnectionを使った何かの処理 End Sub
959 :
957 :2013/02/01(金) 19:20:05.92
訂正w Sub A() 'コールスタックの一番上の場合。 On Error Goto ErrHandler Call B() Exit Sub ErrHandler: ErrLog(Err) End Sub Sub B() Call C() End Sub Sub C() Dim myclass As MyClass Set myclass = new MyClass '内部でデータベースへ接続。スコープから抜けるときにデータベース切断 myclass.foo() 'objConnectionを使った何かの処理 End Sub
>>956 汚いなぁ。
実際にやりたいことが例外処理コードに
埋もれてしまってるじゃないか。
961 :
デフォルトの名無しさん :2013/02/01(金) 19:29:58.21
>>959 見た目はシンプルだけど、MyClassの実装はどうなってんの?
962 :
デフォルトの名無しさん :2013/02/01(金) 19:32:42.51
>>960 Connectionを使って実際にやりたいことはCに書かれてる。
きれいに分離されてる。お前の目は節穴か?はい論破。
>>961 > 見た目はシンプルだけど、MyClassの実装はどうなってんの?
private con As ADODB.connection
Private Sub Class_Initialize()
Set con = new ADODB.connection
con.Open
End Sub
Private Sub Class_Terminate()
If Not con Is Nothing Then
If con.State <> adStateClosed Then
con.Close
End If
End If
End Sub
Terminateの処理がわかりづらいと思うなら、ユーティリティ関数を作れば
DbClose(con) という風に一行で書ける。
聞かれたからコード書いたけど重要なのは
見なくていいコードは隠蔽し、見なければいけな本質的な処理を見えるようにすること
そういう点で
>>792 のようなコードはごちゃごちゃしてるといわれる。
>>959 にはまだ問題点があって、
A = コールスタックの一番上 = ボタンのクリックとかのイベントハンドラ
全てに(汎用処理とはいえ)例外処理コードを書かないといけないってことだけど
今の自分なら、イベントハンドラと特定のクラスのメソッドを結びつけるクラスを作って
その間に例外処理を挟み込むことで、一つで汎用的な例外処理をかけそうな気がする。
965 :
デフォルトの名無しさん :2013/02/01(金) 19:58:16.97
>>963 隠蔽してきれいになりましたというのは部屋中の散らかった生活物資を押入れに
しまいこんで、はいきれいといってるようなもの。俺のように整理整頓された
>>792 こそ
構造化プログラミングの真骨頂でありほんとうにきれいということができるコードだ。
なんならAとBを見なきゃいんだから。それはお前の努力しだいでなんとでもなる。
Openが例外を投げたときが気になるんだよなー。例外投げたけど、閉じてもないよという
ときがありそうでなんかやだ。はい論破。
> 俺のように整理整頓された
>>792 こそ
整理整頓されたという根拠が無い
やり直し。
967 :
デフォルトの名無しさん :2013/02/01(金) 20:00:34.21
>>966 きれいに峻別されてるだろ、ここはFinallyだなー、ここはCatchだなー、
ここが処理の中核だなー。はい論破。
>>965 > Openが例外を投げたときが気になるんだよなー。例外投げたけど、閉じてもないよという
そういうのも隠蔽することでシンプルに書ける
もとのコードはシンプルなままいられる。
それに対してお前のやり方はどうだ?
○○の場合は〜、○○の場合は〜、って
コードを本質的な処理に紛れ込ませていき、
どんどん複雑になるのが目に見えているではないか。
>>967 > きれいに峻別されてるだろ、ここはFinallyだなー、ここはCatchだなー、
> ここが処理の中核だなー。はい論破。
では
>>792 のコードで示してください。
どこがFinallyでCatchで処理の中核ですか?
水出して野菜洗ってたら、鍋が噴いたから火を止めようとしたわけだが、 水もったいないかあら水とめてからって思っても、 水止めるボタンは離れたところにありますとかどうよ。
971 :
デフォルトの名無しさん :2013/02/01(金) 20:09:46.19
>>968 隠蔽すればいいて押入れに詰め込んどけばいいといってるようなもので
コードが増えることに変わりはないだろ。
>>792 はOpenが例外投げたときにも
対処されるように書かれているわけで、その点で俺のコードは優れてる。
俺が優でお前が劣。はい論破。
>>969 AがFinally
BがCatch
Cが処理
そもそもさ、FinallyとかCatchとかいってるから、
それらに相当する関数Aとか関数Bとかできるわけさ。
そういうマヌケなことを言わなければ、関数Aとか関数Bも不要になって
>>963 のコードはここまでシンプルになる
Sub main() 'コールスタックの一番上の場合。
On Error Goto ErrHandler
Dim myclass As MyClass
Set myclass = new MyClass '内部でデータベースへ接続。スコープから抜けるときにデータベース切断
myclass.foo() 'objConnectionを使った何かの処理
Exit Sub
ErrHandler:
ErrLog(Err)
End Sub
なるほど、AとBが出来てしまった理由が finallyやcatchを無理やり真似ようとしてしまったからなわけだな。 例外処理のためだけに関数を二つも増やしてしまったわけか。 よくわかった。
処理Cに対応するAとBが必要。 追加で処理C1とC2とC3が増えました。 A1、B1、A2、B2、A3、B3、が必要です。 処理は4つですが 関数は12個必要です。 恐ろしいw メンテナンス性低すぎだろ。
975 :
デフォルトの名無しさん :2013/02/01(金) 20:21:35.74
>>972 うん、A、Bは不要になるけどMyClassが必要になってるわけで、
記述する量が減りましたというわけじゃない。その隠蔽体質が問題だと
認識しています。はい論破。
>>975 記述量は減ってるよ。
C1とC2とC3が増えた時のことを考えてみ。
MyClassならいくつ増えても
本質的な処理しか増えないけど
お前のやり方では例外処理までも増えていく。
977 :
デフォルトの名無しさん :2013/02/01(金) 20:29:06.45
>>976 C1の例外とC2の例外をわけたいときもあるだろ。明確に区別される
俺の記述方がはるかに優れているってことになる。はい論破。
>>975 おいおいオブジェクトは、複雑な事を、単純な事に置き換えるための仕組みだぞ...
979 :
デフォルトの名無しさん :2013/02/01(金) 20:31:53.63
>>979 馬鹿でも判るようにする仕組みだって事だよ...
論破くん、もう病気だね。はい確定。
>>825 俺は標準モジュールでコネクションプーリングを実装してる。
明確に分けたいときに限って俺の勝ちだ! って言ってる馬鹿がいますねw
本人は勝利宣言のつもりなんだろう。 負け宣言になってるが。
985 :
デフォルトの名無しさん :2013/02/01(金) 20:59:37.12
>>983 それはどうとでもなるところだ。
C1とC2が増えると前提を置けば
>>976 が成立するし、
C1とC2が増えないと前提を置けば俺が言ってることが成立するし、それは
前提をどう置くかってことだけだから、話としてはつまんない。
何かこう斬新な例外処理とかないかな。はい論破。
>>984 なに勝利って?議論に勝ちも負けもないよ、そういうこというのって恥ずかしいだけだと思う。はい論破。
C1、C2、C3が増えるたびに 例外処理まで増えるしか無いやり方のほうが負けだろう。 クラスに書いておけば、基本増えなくて、 必要があれば、違う例外処理も実行できるし。
頭は悪くなさそうだが、周囲からは冷たい目で見られてそうだな
なんか論破くんとその他の人に間には 10年ぐらいの技術の差がありますね。 あ、もちろん論破くんのほうが下です。
989 :
デフォルトの名無しさん :2013/02/01(金) 21:03:21.84
上とか下とかいうこだわりは論破君の専売特許だが 仲間になりたいのか?w
就職はまず無理 そんなタイプ
>>986 > クラスに書いておけば、基本増えなくて、
> 必要があれば、違う例外処理も実行できるし。
話の流れからして、たぶん奴はそのことに気づいてないと思う・・・
それにしても、 finally の意味を関数の終わりという意味に取り違えている っていうしょうもない例から、よくこれだけ糞スレ展開したもんだ。 お前ら、例外処理したい範囲ぐらい絞ってtry-catchしろよ。
例外処理のためだけに 関数二つ追加しちゃう センスが無い人ですからw
994 :
デフォルトの名無しさん :2013/02/01(金) 21:09:21.14
>>986 それはプロセッサオブジェクトを作ってその
メソッドをCの変わりに呼ぶこともできるわけで、
別にオブジェクト作るようなことになったら俺は首をくくるしかない
なんていう覚悟を持ってるわけじゃないんで、それはどうとでもなる。
例外処理としては対して違いがあるわけじゃない。ほかになんか知らない?はい論破。
プロセッサオブジェクト(笑) オレオレ用語出て来ましたよ。 ああいう人ならこんなこと言ってしまう 的な展開ですねw
つーかさ... tryとかcatch以前にthrowしろよ...
俺はちゃんとErr.Raiseしてるというのにさ。
____ / \ / ⌒ ⌒ \ 論破くん必死だなー / (●) (●) \ | 、" ゙)(__人__)" ) ___________ \ 。` ⌒゚:j´ ,/ j゙~~| | | | __/ \ |__| | | | | | / , \n|| | | | | | / / r. ( こ) | | | | | | ⌒ ーnnn |\ (⊆ソ .|_|___________|  ̄ \__、("二) ̄ ̄ ̄ ̄ ̄l二二l二二 _|_|__|_
1000 :
デフォルトの名無しさん :2013/02/01(金) 21:14:24.79
>>996 オレオレだけど、わかるだろ。わからなかったらただのバカ。
オレオレだからというだけで叩こうとしたお前はスーパーバカ。
スーパーバカというのは俺が作った言葉だからお前には理解できない。はい論破。
だれか次スレ建てて。俺レベル低いから無理。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。