- 1 名前:デフォルトの名無しさん mailto:sage [2009/06/16(火) 20:11:11 ]
- (#゚ー゚)つ < C#、.NETの話題はこちらでどうぞ。
前スレ C#, C♯, C#相談室 Part52 pc12.2ch.net/test/read.cgi/tech/1238548552/ Visual C# 2008 Express Edition 日本語版 www.microsoft.com/japan/msdn/vstudio/express/vcsharp/ その他テンプレ>>2-5くらい
- 641 名前:デフォルトの名無しさん mailto:sage [2009/08/05(水) 21:55:20 ]
- 貼りつければ分かるから宿題じゃないです
クイズです
- 642 名前:デフォルトの名無しさん mailto:sage [2009/08/05(水) 21:58:15 ]
- 不適切な問題じゃね
演算子の優先順を問う感じだろうけど=と==をどっち優先にしてもdになる気がする
- 643 名前:デフォルトの名無しさん mailto:sage [2009/08/05(水) 22:01:08 ]
- d?
- 644 名前:デフォルトの名無しさん mailto:sage [2009/08/05(水) 22:03:05 ]
- >>642
(a = t == f) == (f == t == f) (a = f) == (f == t) (f) == (f) t (a = t == f) == (f == t == f) (t == f) == (f == t) (f) == (f) t ホントだw
- 645 名前:デフォルトの名無しさん mailto:sage [2009/08/05(水) 22:17:53 ]
- あほやのう
- 646 名前:デフォルトの名無しさん mailto:sage [2009/08/05(水) 22:26:34 ]
- >>644
(f == t == f) が (f == t) ? なんで?
- 647 名前:デフォルトの名無しさん mailto:sage [2009/08/05(水) 22:33:06 ]
- 安産してeだと思った15年目の俺・・・orz
基本的に優先順位とか気にしたくないのでかっこでくくってますが( ゚Д゚)ナニカ?
- 648 名前:デフォルトの名無しさん mailto:sage [2009/08/05(水) 22:34:56 ]
- なんだろうねぇ
- 649 名前:デフォルトの名無しさん mailto:sage [2009/08/05(水) 22:39:14 ]
- なにいってんの?
eだろ
- 650 名前:デフォルトの名無しさん mailto:sage [2009/08/05(水) 22:53:01 ]
- >>644
(f == t == f) の出所は?
- 651 名前:デフォルトの名無しさん mailto:sage [2009/08/05(水) 23:18:16 ]
- (a = b == c) == (a == b == c)
=> (a = (F == T)) == (a == b == c) => (a = F) == (a == b == c) => F == (F == (F == T)) => F == (F == F) => F == T => F なので e が正解
- 652 名前:デフォルトの名無しさん mailto:sage [2009/08/05(水) 23:21:37 ]
- ==演算子って左結合じゃなかった?
- 653 名前:デフォルトの名無しさん mailto:sage [2009/08/05(水) 23:28:05 ]
- >>651
まて結合の優先順位と、実行される順序は別だ。 (a = b == c) == (a == b == c) => (a = (F == T)) == (a == b == c) => (a = F) == (a == b == c) 1) => F == (F == (F == T)) => F == (F == F) => F == T => F 2) => (a = F) == (T == (F == T)) => (a = F) == (T == F) => F == F => T
- 654 名前:デフォルトの名無しさん mailto:sage [2009/08/05(水) 23:32:29 ]
- 大漁ですな(;´Д`)
- 655 名前:デフォルトの名無しさん mailto:sage [2009/08/05(水) 23:34:36 ]
- 式は右辺からと思っていると、
(a = b == c) == (a == b == c) -> X == Y の右辺Yからやることになり、地獄行きになるんです
- 656 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 00:13:44 ]
- (==)((a = b == c), (a == b == c))
- 657 名前:651 mailto:sage [2009/08/06(木) 03:03:09 ]
- >>652
すまん4行目は F == ((F == F) == T) だな。 結果は一緒。 ttp://msdn.microsoft.com/ja-jp/library/aa691323(VS.71).aspx
- 658 名前:633 mailto:sage [2009/08/06(木) 09:04:57 ]
- >>634-637
遅くなってすみません。 たとえば、スレッドAとスレッドBで変数myClassを共有している スレッドAでは、myClassに新規インスタンスをセットする while( 1 ) { myClass = new MyClass(); } スレッドBでは、myClassを作業用変数に確保し、さまざまな処理を実行する while( 1 ) { MyClass work = myClass; workに対しての様々な処理 } 代入演算子はオーバーロードしていません ちょっと何をやりたいかわかりにくいかもしれませんが、これだけを見た場合に問題はありそうですか? 内部的に参照カウント関係の処理が走っていたりして、危険だったりしますか?お願いします。
- 659 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 09:10:07 ]
- ダメダメ絶対ダメ
スレッドBのループが一回回る間にスレッドAのループが何回回るか全く分からないんだよ? それにいくらメモリを意識しなくていいといったってさすがにノーウェイトでnewしまくったらGCの負担になる
- 660 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 09:21:04 ]
- スレッドAとスレッドBの周回数は同期がとれていなくていいです
GCの負荷は考慮しないとして、スレッドセーフかっていう質問なんですが・・・ 要するに myClass = new MyClass(); と MyClass work = myClass; のところをロックしないとメモリを壊したりしますか?ってことが聞きたいんです C言語なら問題無いはずですがC#だとどうなのかな?って >>635 の言うようにこれ自体はロックしなくても問題ないんですかね^^;
- 661 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 09:28:22 ]
- myClassが共有されてると言うことでおけー?
ロックされる云々の前に多分それ意図してるように動かないよ。エスパーしてみるとw
- 662 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 09:29:44 ]
- 必ずしも間違った扱いではないけど問題あるかどうかは別だな
AでMyClassのコンストラクタが呼ばれた後に,Bで古いインスタンスが使われる可能性はある
- 663 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 09:32:02 ]
- ロックするならスレッドBの書かれてない処理のところじゃね?
- 664 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 09:36:37 ]
- 参照やintへのアクセスはアトミックと規定されている。
つまり、myClassが32bitだとすると16bitだけ新しい値に書き換わってるという状態は存在しない。 一方doubleやlongはそういう状態が発生しえる。 ただしマルチCPUの場合はもう少しややこしくて、 スレッドAが書き換えたmyClassの内容がスレッドBに反映するまでにタイムラグが発生する場合がある。 これが問題になるならlockを使用するかmyClassをvolatileで宣言する。 Cのvolatileとの違いに注意。
- 665 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 09:44:52 ]
- あと、C#のGCは参照カウントじゃないよ。
- 666 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 09:58:55 ]
- ま、確実性という意味なら、volatileつけとけば確実。
ただしなくてもメモリが壊れるとかのレベルの問題はない。 実質的にはCLR2.0以降のメモリモデルと86系CPUのメモリモデルから、 事実上はvolatileなくても問題ないはず。
- 667 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 10:02:26 ]
- あ、確実というのは、可能な限り最新のインスタンスを使うという意味でね。
- 668 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 10:13:30 ]
- Interlocked.Exchangeでも使えば
- 669 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 10:40:47 ]
- volatileを使わない場合はもうひとつ問題があって、
MyClassの初期化が終わる前にスレッドBに参照が渡ってしまう可能性がある。 ただし、これが起きるのはMSだとItatiumの場合だけ。 原理的には有名なダブルチェックロッキング問題と同じ。 myClassをvolatileにしない場合のスレッドA while( true ){ MyClass tmp = new MyClass(); Thread.MemoryBarrier(); myClass = tmp; }
- 670 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 11:15:28 ]
- おまいら詳しいのな
- 671 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 11:20:35 ]
- それもCLR2.0以降では大丈夫でそ。
ついでにその問題を出すなら、Aのメモリバリアだけじゃだめ。 なぜなら、Bスレッドのワーク変数が目的通りに動かないから。 ワーク変数への各アクセスで、新しい参照を読んでしまう危険がある。 かなり直感に反する動作だと思うけど。 結局この場合もvolatileつけるのが最も簡単確実。
- 672 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 11:58:19 ]
- >>671
いや大丈夫でないから.NET2.0で.MemoryBarrier()が追加になってるわけで。 myClassからworkの参照コピーは1回限りのようだから問題ない。 work変数はローカルなんだし、 MyClassはスレッドAでセットしたあとは放置状態なのだから、 途中で新しい参照を読み込むことはありえない。 workは一貫したクラスを参照できてれば、MyClassのバージョンは問わないという前提だよ。
- 673 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 12:00:37 ]
- C# 2.0で質問です。
List<int> _list = new List<int>(); //(本当はintではなくクラスなんですが説明しやすいようにintで・・・) _list.Add(1); _list.Add(2); _list.Add(3); _list.Add(4); _list.Add(5); foreach(int data in _list) { Console.WriteLine(data); } このような感じで記述した時に List<int>はインデックス0からデータを順番に必ず返すのでしょうか? やってみた感じ必ず返っては来ているようなんですが、保障されているというような感じの文章がヘルプから探せなかったので質問させていただきました。 よろしくお願いいたします。 コレクションやソーテッドリストなんかはその並び順は勝手に変わるようですがListオブジェクトはどうもみあたらない・・・orz
- 674 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 12:11:22 ]
- foreach が配列の要素を走査する順序は、次のように定義されます。
1 次元配列の場合、要素はインデックス 0 から始まってインデックス Length ? 1 で終わるインデックスの昇順に走査されます。 多次元配列の場合、要素は、最初に右端の次元のインデックスが増加し、次にその左側の次元のインデックスが増加し、さらにその左側の次元のインデックスが増加する、というように走査されます。
- 675 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 12:37:54 ]
- >>674
int のコレクションとして考えれば0〜インデックスの最後までの順序で処理される それでもってListコレクションの中身も同じように処理されるということでしょうか? ということであればすっきり処理を続けることができます。 ありがとうございました!
- 676 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 13:09:05 ]
- >>672
違うよ。 メモリバリアはCLIの標準仕様では必要。 CLR2.0以降の実装では不要だとしても、互換性の為には必要になる。 だからある。 あとソースコード上はワーク変数に1回だけ取得してても、 実際にはワーク変数を削除して毎回実体にアクセスするという、 直感的でない最適化が行われる可能性があるんだよ。 共有してる変数をvolatileにすればそれを防げる。
- 677 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 13:11:03 ]
- この辺はいつだったかのMSDNマガジンに詳しく書かれてる。
- 678 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 14:05:33 ]
- >>676
ありがと、勉強になった。MSDNマガジンで確かに見た気がするがスルーしてた。
- 679 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 14:46:29 ]
- ごめんもう一つ補足。
CLR2.0以降では書き込みアクセスでのvolatileは事実上不要だけど、 読み取りでは必要な可能性もあったと思う。 書き込み順序と回数はデフォルトでvolatileのように保証されるが、 読み込みは場合によっては省略されることがある。 ただ、その他諸々の事情により、実際に問題が出るパターンはあまりなかったと思う。
- 680 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 17:20:59 ]
- C#からUnmanaged-DLLを利用する場合についての質問です。
DLL側でThread Local Strage(__declspec(thread)を付けた静的変数)を使用し ている場合、(DLL内の関数がC#から呼び出され)DLL内でこれにアクセスしよう とした時にSystem.AccessViolationExceptionになるようです。(エラー画面.PNG) DLL側を修正せずに、C#側の修正もしくは他の手段でこれを回避する方法はあ りませんでしょうか? www1.axfc.net/uploader/Sc/so/24967.zip&key=Test は問題を再現する簡単なコード例です。 Test\MyDll\MyDll.cpp の18行目が__declspec(thread)を付けた静的変数で、 これを、N:\Test\MyCSApp\Program.cs の29行目から呼び出されたMyFunc(5)の 処理でszMyLastErrorにエラー情報をセットするところで例外が発生します。 Test\MyC++App は同じ処理をC++で記述した場合で、これは問題なく動作しま す。 以上、よろしくお願いいたします。
- 681 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 17:43:07 ]
- >>680
ttp://msdn.microsoft.com/ja-jp/library/2s9wt68x(VS.80).aspx の一番下
- 682 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 17:57:52 ]
- C++/CLIあたりでlibを使ってラッパ作れば何とかなるかもね
- 683 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 21:44:03 ]
- レスありがとうございます。
>>681 症状からして、そのページに書かれていることが起きている(C#はDLLを動的にローディングしている) のだろうな、とは思っていたのですが、それを回避する方法がなにかあるのではないかと質問させてい ただきました。 >>682 MangedなラッパDLLを作成し、これにMyDll.libをリンクしてみましたが、ラッパDLLがC#アプリからは 動的にローディングためか結局ダメでした。 何か、裏技がありませんかねえ??
- 684 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 21:52:25 ]
- 別 Exe にしてプロセス間通信するしかないだろ。
- 685 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 21:57:02 ]
- C++/CLIから起動してC#側を動的ロードするとか
- 686 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 22:23:54 ]
- DLLのほうを触っていいならTlsAllocを使えばいいはずだけど。
- 687 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 23:40:08 ]
- COMのアウトプロセスサーバーでラップすると何とかなりそうだが、
激しくめんどい。 インプロセスサーバーだと駄目だった。
- 688 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 02:56:45 ]
- 一番現実的なのは>>685だろうな
マネージ側は参照だけでいいんで動的ロードとか言わんけど
- 689 名前:デフォルトの名無しさん [2009/08/07(金) 08:47:30 ]
- .NETのWindowsアプリケーションで作成したプログラムにおいて、
ネットワークPCのドライブにあるフォルダをアクセスしようとした時、 たまたまそのPCが立ち上がっていなくてネットワーク上に見つからない 場合に長く待たされていました。このタイムアウト時間はたぶんOS の設定で変えられるものとは思うのですが、タイムアウトにならない うちにプログラムでアクセスを中断してしまうことは可能でしょうか?
- 690 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 10:09:55 ]
- C#でパケットキャプチャしたいのですが、サンプルありますか?
- 691 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 10:18:07 ]
- www.stackasterisk.jp/tech/program/howtosniff01_01.jsp
sourceforge.net/projects/sharppcap/files/SharpPcap/
- 692 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 11:42:39 ]
- >>691
ども、でもなんかよくわからないです エラー 2 型または名前空間名 'NetDefineSet' は名前空間 'StackAsterisk' に存在しません。アセンブリ参照が不足しています。 とか
- 693 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 12:04:49 ]
- お前にはまだ早いということだね
- 694 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 12:16:19 ]
- >>689
別スレッドでチェックしに行って適当にタイムアウトとかできるんじゃ?
- 695 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 13:22:57 ]
- >>692
そういやなんかサンプルそのままじゃビルドできなかった記憶があるな >The Code Projectによいサンプルがあったので拝借させていただき、それを元に書いてみました。 >元となったのは 「RawSocket Class-Create Network Monitoring (Packet Sniffing) Apps」 というものです。 って書いてあるしそっちも参考にするといい
- 696 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 14:39:34 ]
- スレッド分けるのに一票
- 697 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 14:49:45 ]
- Process.Start()で存在しないフォルダを起動したら、FileNotFoundExceptionじゃなくてSystem.ComponentModel.Win32Exceptionというのが来る
Frameworkが吸収するところじゃないのか
- 698 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 15:34:45 ]
- あなたはそれがいいと思うかもしれないが、
大多数の他人はそう思わない
- 699 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 16:48:15 ]
- いやそうでもない
- 700 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 16:59:52 ]
- Frameworkが吸収すべき所のような気がするけど
実害は無いからとやかく言わない
- 701 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 17:06:23 ]
- >>697
つうかふつうに固まるだろ・・・・ 問題はみに行く時に固まるつうのが問題なわけで なにかボタン押したときにチェック ↓ チェック中ですのダイアログ的なものと共に強制キャンセルボタン ↓ チェック開始(バックグラウンドワーカーでもなんでも) ↓ バックグラウンド終了前にキャンセルされたら ナックグラウンドワーカー停止 こんなんでいいんじゃね? 成功のときはバックグラウンドの完了イベントかなんかで処理するとか 色々あると思うけど
- 702 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 17:25:47 ]
- Microsoftの決めたことなんだから正しいお
- 703 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 18:37:58 ]
- >>697
吸収してどうしろって? 別プロセスからの例外をプロセス間通信で受け取るの? それをフレームワークでやれって?
- 704 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 19:01:23 ]
- なん…だと…
- 705 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 20:19:40 ]
- Windowsフォームで質問。
Form2 _form2 = new Form2(_form1); としたとき、_form2.FormClosedのイベントハンドラで_form1.Close()するコードを書くと、 Form2.OnFormClosed()が何度も呼ばれる(つまりFormClosedイベントが何度も発生する) ようなんだけど、これは仕様?バグ? 仕様だとしたらどう理解したらいいんだろう?
- 706 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 20:25:45 ]
- OwnerはCloseするときOwnedFormsを全部Closeする
って言えば分かる?
- 707 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 20:34:10 ]
- >>706
そのレベルの話はOK
- 708 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 20:53:58 ]
- 普通に再帰呼び出しになってるだけっしょ
止まるのはハンドルが消えるから
- 709 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 20:59:15 ]
- >>708
現象の説明としてはそれでいいと思うんだけど、 俺が聞きたいのはそういうことじゃなくて、それが仕様なのか、 仕様だとしてそれに何らかの意味があるのかってこと。 FormClosedイベントの意味は、「Close()が呼ばれました」ではないはずだよね。
- 710 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 21:06:03 ]
- > FormClosed イベントは、ユーザー、Close メソッド、または Application クラスの Exit メソッドによって
> フォームが閉じられた後に発生します。 「Form.Closeが呼ばれました」でも大体いいんじゃないかな ま、おいらはMSの人じゃないので意味とか答えられないけど
- 711 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 21:09:46 ]
- >>710
それはさすがに読解力マズいんじゃないかと思うけど。。
- 712 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 21:50:30 ]
- 何度も呼ばれるって何度?
- 713 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 21:52:55 ]
- バグだよ、>>705のプログラムのね
- 714 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 21:55:57 ]
- Closed≠Disposedと理解すれば良い
- 715 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 22:07:36 ]
- >>710-711
MSDNの説明から読み取れるのは ・ユーザ操作、Close()、Application.Exit()で発生しうる ・FormClosedが発生した時点ではフォームは閉じられている の2点だけじゃね? てか、説明が怪しいと感じたら英語版を読むといい それでも怪しいときも多いけどな
- 716 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 22:20:48 ]
- ちなみに何回くらい呼ばれるの?
また毎回同じ回数なのか場合によって変わるのかどんな感じ?
- 717 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 22:33:34 ]
- >>716
以下が問題を再現する最短のコード。 コンストラクタは省略してある。 public partial class Form1 : Form { Form2 _form2; protected override void OnLoad(EventArgs e) { base.OnLoad(e); _form2 = new Form2(); _form2.FormClosed += new FormClosedEventHandler(_form2_FormClosed); _form2.Show(this); } void _form2_FormClosed(object sender, FormClosedEventArgs e) { Close(); } } public partial class Form2 : Form { int _count = 0; protected override void OnFormClosed(FormClosedEventArgs e) { base.OnFormClosed(e); Console.WriteLine("Form2.OnFormClosed Called ! // count = {0}", _count++); } }
- 718 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 22:53:53 ]
- >>717
とりあえずDisposedイベントでForm1.Closeやるように変更したら 現象回避出来たぞ
- 719 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 23:00:06 ]
- >>718
うん、それはわかるけど、 俺が知りたいのはこういうコードを書くと「何故」そんなことになってしまうか、なんだ。 普通に考えれば、OnFormClosedが何度も呼ばれるのは理解に苦しむと思うんだが。
- 720 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 23:00:45 ]
- Form2ClosedでForm1Closeして新しいClosedが発生するのがおかしいと言ってるの?
何がおかしいのかよくわからない
- 721 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 23:02:44 ]
- >>719
まあ所持関係にあるForm同士として呼び出してるんだから > _form2.Show(this); Form1閉じる→Form2閉じる っていうのは標準動作として組み込まれてる 逆方向の動きを追加したい場合(Form2閉じる→Form1閉じる)は 標準の動作と競合しないようにしなきゃ不具合が起きて当たり前 FormClosed()の時点ではForm同士の所持関係を破棄していないようなので 無限ループが起きる Disposed()の時点でForm同士の所持関係を破棄しきったので やりたい動作が実現できる
- 722 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 23:07:42 ]
- FormClosedイベントなんだから、「完全にフォームが閉じた後」に発生しないとおかしい
と言いたい訳か。 んで_form2が完全に閉じた後だから、_form2_FormClosedが呼ばれても子フォームのCloseが呼ばれるのはおかしい、と
- 723 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 23:15:06 ]
- Close()をこうやって呼べばいけるっちゃいける。
this.BeginInvoke((MethodInvoker) (() => Close())); 親フォームが子フォームを閉じるための参照のコレクションを持ってて、 親フォームから登録を抹消するタイミングがFormClosedの後なんだろうな。
- 724 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 23:16:44 ]
- >>722
>_form2が完全に閉じた後だから、_form2_FormClosedが呼ばれても子フォームのCloseが呼ばれるのはおかしい、と いや、そこは必ずしもそうは思わないけど、>>717のコードの動作が「おかしい」と思う点は、 何度も言うけどOnFormClosedの呼ばれ方が、MSDNに書かれたFormClosedイベントの仕様に 反するように思える点。
- 725 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 23:17:10 ]
- >>723
なんかそれタイミング次第で うまく行ったり例外おきたり 危険な動作しそうな気がする
- 726 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 23:18:43 ]
- 例えば、Form.Show()は何度でも呼べるけど、
その都度Shownイベントが発生したりはしないよね。
- 727 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 23:19:47 ]
- >>724
Formのオーナーシップの関係で Formクラスから子FormのCloseが呼び出されるってことでしょ 何も反してないよ
- 728 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 23:23:40 ]
- >>727
だから、FormClosedイベントの意味、つまり仕様は、「Closeメソッドが呼ばれました」 ではないよね。少なくともMSDNライブラリを詠む限り、そうは読み取れない。
- 729 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 00:26:58 ]
- お前が明示的に呼んだときしかCloseメソッドが呼ばれないと思ってるということか
- 730 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 00:37:46 ]
- >>729
こんなこと言いたくないが、馬鹿はすっこんでてくれよ。 二重の意味で日本語も読めないのかまったく……
- 731 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 00:40:59 ]
- >>730
どう見てもお前の方が馬鹿だが
- 732 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 00:41:33 ]
- むしろMSDライブラリを読み取れないレベルの馬鹿がやめた方がいい
お話になりません
- 733 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 00:59:09 ]
- 横やりだが>>728とかの言ってることは別にそんなおかしくないぞ。
Closeを何度呼ぼうが、実際に閉じたタイミングで一度だけ発生する と期待するのは普通の感覚。 MSDNの説明も普通に読めばそうだと期待する。 一度しか呼ばれない、とは明記されてないし結局仕様なんだろうとは思うけど。
- 734 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 01:05:38 ]
- 1度テストしてみて理解できないようなら方法は無い
- 735 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 01:14:25 ]
- MSDNのクラスのドキュメントって
クラス単体の動作を説明してるのが基本であって フレームワークの中でそのクラスがどう扱われてるかは オマケ程度にしか説明されていない っていうことをわかって無いから的外れなこと言い出すんだよね
- 736 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 01:28:44 ]
- >>735
ほほう、「的外れ」とは? 具体的に何がどう「的外れ」だ、と? いや、無理しなくていいよ。 そんな自分の頭で理解していることを表現しているとは思えない、 悪いけど意味不明な文章を書いているようじゃたぶん正面からの回答は無理だと思うから。 しかし、別に初心者が悪いと思わんけど(誰だって最初はそうだし) 知りもしないことに口出しして挙句に相手をいきなり罵倒する奴っていうのは 迷惑以外の何者でもないな本当。 初心者どころか自分でイベントを生成するコードすら書いたことすらないのが、 言っちゃ悪いがミエミエなのに。 まあそれ以前に日本語もまともに読めていないようだけどw 2chでこんなこと言ってみても仕方ないのは分かっているが、あまりに腹が立ったのでね。
- 737 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 03:20:05 ]
- ここでクダ巻いててもしょーもねーだろw
- 738 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 04:57:36 ]
- 長文書いたら負けですよ
- 739 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 06:37:29 ]
- 閉じられる理由位見ろ
_form2_FormClosed() の処理が if (e.CloseReason == CloseReason.UserClosing) Close(); じゃないの点が問題なんだよ 何度も Form2 に FormClosed が送られてくるのも あくまでも Form2.FormClosed イベントが終了していない段階で Form1 を改めて閉じようとしているからループしてるに決まってるだろ ユーザ操作以外ではどうせ親から Close が送られてくるから無視でいい
- 740 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 16:24:06 ]
- Form 1 の中で生成した Form2 を破棄しようとして起きるんじゃないの
- 741 名前:デフォルトの名無しさん [2009/08/08(土) 18:41:56 ]
- テキストボックスやパネルの境界線の色をグレーや薄いブルーなどにするにはどうすればいいですか?
また、 ラベルの上に小さめのテキストボックスを重ね、一つのコントロールにすることはできますか? 調べましたが分かりませんでした。 どなたか教えてください (T_T;)。
|

|