1 :
デフォルトの名無しさん :
2007/03/13(火) 14:23:56
>>1 乙
∩( ´Α`)< 先生、「・・・」ってどうよ?です。
FormsのControl.Scaleメソッドですがいまいち使いどころがわかりません・・・('A`)
FormのScaleを変えたら、そのままなかのコントロールもその比率で縮小されていってほしいんですが、なんか大きさだけ変わって文字の表示とかそのままだったりレイアウトが崩れたりしてます・・・
Childツリーをぶん回して全部のScaleをいじったりするべきということなんでしょうか?
とりあえずどうできないのか書かないことには。
>>7 >Closing イベントは、.NET Framework Version 2.0 では使用されません。代わりに FormClosing イベントを使用します。
説明不足すいません、2003ではコード中に private void Form1Closing(object sender, System.ComponentModel.CancelEventArgs e) { if (MessageBox.Show( "終了してもいいですか?", "確認", MessageBoxButtons.YesNo, MessageBoxIcon.Question ) == DialogResult.No) { e.Cancel = true; } } を追加すると終了時に確認メッセージがでますが、2005だとそれが出ずに終了してしまいます。 記載はForm1.csに追加してあります。 コンパイルは警告なしで成功しますが機能しませんでしたが、 this.Closing += new System.ComponentModel.CancelEventHandler(this.Form1_Closing); これをフォームデザイナで生成されたコードに追加したところ、動作が確認できました。 お騒がせしてすいませんでした。
static void Test(IList<TestDelegate> methods) { foreach (TestDelegate method in methods) { new Thread(delegate() {method();}).Start(); } } こういう関数を書いてみたんですが、このままではリストの最後の要素しか呼ばれません。 で foreach (TestDelegate method in methods) { TestDelegate m = method; new Thread(delegate() {m();}).Start(); } としたところちゃんと全部呼ばれるようになりました。 匿名デリゲートからローカル変数にアクセスする場合デリゲートをnewした時点で ローカル変数が外部にコピーされると思っていたのですが、 それだと上の方法でも動きそうに思うのですが、なぜ動かないのでしょうか。 そもそもmとmethodは同じスコープの変数なので 同じように振舞うべきのような気がするのですが。
ILに落として見てみれば?
14 :
11 :2007/03/14(水) 14:00:44
>>12-13 どうもです。
つまり
・ローカル変数がコピーされる一時領域(匿名クラス)はデリゲートのスコープではなくてローカル変数のスコープと同じスコープをもつ
・methodは実はmと同じスコープではなくてforeach全体のスコープをもつ
ということですね。
個人的な考えとしてはローカル変数のスコープではなくデリゲートが利用されるたびに匿名クラスもnewすれば
このような問題は起こらないと思うんですがなぜそうしなかったんでしょうね。
ローカル変数が不変という前提なら多少パフォーマンスはよくなるかも知れないですが、
それによって起こる問題のほうが大きいような。
VisualStudioImageLibraryのicoを ImageListに追加して、 リストビュー内に表示させたいんですが、 画像が青く縁取りされたように感じになってしまうのですが。。。 どうすればよいのでしょう。色は48bit、解像度は16*16pxに設定しています bmpなどもきれいに表示されません。
ImageListは鬼門
>>14 自分でファンクタークラス作ればいいよ(・∀・)!!
話とズレるが
>>11 のIList<TestDelegate> methodsは
マルチキャストを使った方がいいんじゃないの
20 :
デフォルトの名無しさん :2007/03/15(木) 14:00:52
質問です。 WebServiceを使ったファイル転送をしています。 ネットワークとしては @クライアントPC AWebServiceを実行するPC BファイルサーバーPC 動作としては @からAのwebserviceを実行して、 @のファイルをAのwevservice以下の一時フォルダにファイルストリームで転送 AはネットワークドライブでBにファイルをコピー。 このファイルのコピーのところでこけます。 CreateDirectryが失敗するので、 ネットワークドライブのアクセス権限の問題だと思うのですが、 WebService自体はなんという名前のアクセス権限なのでしょうか? ASPNET と NETWORK SERVICE 権限は追加しています。
あるコントロールのマウスイベントを他のコントロールにリダイレクトさせようとして protected override void WndProc(ref Message m) { if (WM_MOUSEFIRST <= m.Msg && m.Msg <= WM_MOUSELAST) { if (ctrl.IsDisposed) return; int lp = unchecked((int)m.LParam.ToInt64()); int x = lp & 0x0000ffff; int y = (int)((lp & 0xffff0000) >> 16); Point pt = ctrl.PointToClient(this.PointToScreen(new Point(x, y))); IntPtr lp2 = new IntPtr(pt.X | (pt.Y << 16)); SendMessage(ctrl.Handle, (uint)m.Msg, m.WParam, lp2); } base.WndProc(ref m); } と書いたんですが、MouseMove MouseUp MouseDown あたりはリダイレクトされるんですが Click イベントが来ません。他に処理しなければならないメッセージがあるんでしょうか?
動的にコントロールを追加して btn.Click += btn_Click; した後に このコントロールを削除するとき(アプリは終了させません) btn.Click -= btn_Click; は必要でしょうか?
(゚听)イラネ
やっぱりいりませんか。ありがとうございます。
C#ってnewしたもん明示的にdeleteする必要あんのか?
deleteなんかないだろ…
基本的には放置でおkだけどDisposeが必要な場合もあるので注意
>>25 GCのアルゴリズムで勝手にdeleteする
特定のイベントでDisposeすればいいと思う。
>>25 明示的に破棄しなければならない何らかのリソースを保持しているってことを示すために IDisposable インターフェイスがある。
これを実装してるクラスでは、Dispose() を呼んでそのようなリソースを破棄してやる必要がある。
(実は例外もあるんだけど、それは考える必要なし)
そうでないクラスは、破棄しなくていいっていうか、プログラマは破棄できない。
C#のリソース管理って複雑やね。 デストラクタ、ファイナライザ、Dispose()、Dispose(bool disposing)・・・ MSDN読んでもよくわからん。 Dispose()実装するくらいしかしてないんだがやっぱりこれだとまずいんだろうか
確実にDisposeを呼ぶ自信があるか 継承をしないとかならDisposeだけでおk
Disposeを実装するならファイナライザでDisposeを呼ぶのは必須だろ アンマネージリソースを持ってないなら問題ないのかもしれないが
IDisposableを実装して、using() {} を使えばとりあえずおk
>>33 そうだな。そうしないとDispose()を呼び忘れたときや、呼べないとき困る。
常にusingが使えるわけじゃないしな。
リソース破棄のタイミングを気にする必要がない(最悪プロセス終了まで保持しててもいいとか)なら、
ファイナライザで破棄するようにして、あえてIDisposableを実装しないという手もある。
IDisposableを実装すると、Dispose() した後のことも考えにゃならん。
Disposeは実装することはあるけどFinalizeは滅多にない。
あれ?Finalizeから暗黙的にDispose呼ばれなかったっけ?
んなわきゃーない。 そういう基底クラスは有るが。
基底クラスのファイナライザは暗黙のうちに呼ばれるけど、Dispose()は呼ばれない。
#define SQLITE_STATIC ((void(*)(void *))0) なんてマクロが安マネージDLLの引数になっとるんですが、 これ何を使えばええんですか?
メンテ中すな・・・ ところでこの2種類のマクロっていったい何に使ってるんでしょうか。 デストラクタタイプって記述をどこかで見たんですが。
>>43 英語ムリス
スレチガイだった?まぁSqliteの話題ならそうか。
でもタンクス
private const int SQLITE_STATIC = 0x00000000;
private const int SQLITE_TRANSIENT = 0xffffffff;
でヤッテミル。
普通は渡したメモリをDLL側が解放するためにコールバックする関数を指定するところを、 ・SQLITE_STATIC なら、静的なメモリだから解放いらね ・SQLITE_TRANSIENT なら、コピーとって自分でやってくれ という指示をするための値。 もうなますおやすも。
46 :
デフォルトの名無しさん :2007/03/18(日) 20:26:40
\r\nと普通の\nって何が違いますか
普通の \n ってのが意味分からん \r は CR \n は LF Windows は普通改行には CRLF を使う C/C++ ではリテラル \n をコンパイル時に環境に合わせて CRLF に置き換えたりすることもある
48 :
デフォルトの名無しさん :2007/03/18(日) 20:47:49
意味分かってるじゃん
49 :
デフォルトの名無しさん :2007/03/18(日) 21:42:31
クライアントにC#のフォームアプリを使うことになりました。 サーバ側はJavaでつくってC#<->JavaをHTTPでやり取りするみたいな感じです。 1つ問題があって、C#を誰も使ったことがないのです。 言語それぞれにコツみたいなのがあると思うのですが、C#やるならこれは常識だろみたいなのを教えていただけませんか。
エントリポイントはmainじゃなくてMain
取りあえず @IT の C# 入門でも読めばどうかね
川俣氏のあれか。 内容は意外といいよね。 人物はちょっとアレだけどw
>>50 thx。基本的に大文字で開始なのがわかった。
>>51 thx。とりあえず有名どこは読んでみてます。
Javaやってたからソースはよめるけど書けっていわれると最初はきびしいかな。
明日オライリーの本を買ってみる。
>>53 thx。いまからよんでみます。
>49 get、setのメソッドの代わりにプロパティ。 Equalsじゃなくて==で比較すること。 でも、だいたいはJavaと同じような雰囲気なのですぐ慣れるよ。
・記述スタイルはcamelStyleではなくPascalStyle。 ・パッケージでなく名前空間。ソースのディレクトリ階層と名前空間は 一対一に対応している必要は無い。 ・値型は自動的にboxingされるので、intに対するIntegerみたいなものは 無いし要らない。 ・あまり使わないかもしれないが、値型として構造体が存在する。 ・コレクションをiterateするときにforeachが使える。 ・usingを使うことで、try〜finallyによるリソース解放パターンより 記述が簡易化される。 ・Javaと違ってメソッドはデフォルトでバーチャルではない。 継承とオーバーライドを使ってポリモーフィズムをやりたければ 明示的にキーワードで指定しなければならない。 ・プロパティやインデクサ、演算子オーバーロードが存在する。 これらを利用することで記述が簡易化される。 ・C++の関数ポインタ風のデリゲートが存在する。ただしただの関数ポインタ よりはるかに便利。 ・組込みのeventメカニズムがある。クライアント側の開発ということなので、 eventとデリゲートについては学ぶべきでしょう。
osekkai
>>55 ==を使うのか。これは引っかかりそうだ。thx
>>56 大量の情報thx。
Javaにはない便利そうな機能があるなぁ。だが、メンバーには使わせられん。危険すぎるw
演算子のオーバーロードはおもろいなぁ。
C#だと XXX.add(yyy) とかより XXX + yyy のほうが主流なの?
後者のほうが直感的な気もするけど、Javaにないのを使わせるとろくなことにならなそうだからなぁ。
演算子のオーバーロードなんて、直観的だと思える場面はむしろ例外的だと思うけどな。
==のオーバーロードはstringのようなimmutableなオブジェクトの場合だけの推奨じゃなかった?
Javaのストリームはビッグエンディアンだが、C#は普通プロセッサのエンディアン、結果的にリトルエンディアンだから注意。
== は基本的な型でしか使わないな。整数及び実数、後は真偽値でのみ 組み込み参照型や値型は全てEqualsを使う。 nullである可能性がある場合はstaticなEquals ==は結局Equals呼んでるんでしょ。? ちなみにインタプリタパターン使ってC#内で実に言語作るときに 演算子をオーバーロードできるのは凄い便利 パーサ作るときなんかも便利だな。
63 :
デフォルトの名無しさん :2007/03/19(月) 01:44:37
TCPでソケット通信でファイルのやり取りをしているのですが、 NetworkStreamのReadメソッドの戻り値が読み込んだバイト数を正しく返してくれないです 具体的には読み込んでいない部分を読み込んだものとして返してきます。 int readCount = stream.Read(buf, 0, buf.Length);//bufのサイズを100Mにしてみて実験 readCountは10,000とかの値を返すが、先頭の500くらいしか値が入っていない。 (readCountは読み込んだバイト数が返ってくることを期待している。) 通常のFileStreamで同様のことをすると問題ないのですが、NetworkStreamを使うとうまく報告されないようです。 どのようにすれば、期待したとおり、読み込んだバイト数を取得できるのでしょうか?
取りあえずバッファ大きすぎ。ネットワーク相手なら 4k-8k がベスト。 んー、そんな経験無いなぁ。
>>62 値型でEquals使うとボックス化が発生しちゃわない?
しちゃわない。
>>66 Equalsってobjectを引数にとるのしかないっしょ。staticのも非staticのも。
ためしにSize.Equalsしてみたらちゃんとボックス化されてたぞ。
==はオーバーライドされてるので当然ボックス化されない。
ああすまん。IEquatable.Equalsと勝手に脳内補完しとった。 同名関数たくさんあるときはプロトタイプかいといてちょ
>>68 ん?それってIEquatableを実装した値型じゃないと意味ないんじゃ?
>>62 に書かれてるのはもっと一般的な話だと思うのだが・・・
ああ、あと参照型についても==は命令レベルで比較するのに対して Equalsはメソッド呼び出しが必要だからやっぱり==を使うべきだと思う
==だとGenericsではじかれるのよね・・・
うむ。Genericsと演算子相性悪すぎ
IComparableを実装させればいいだけじゃん。
あふぉか?
それでいいなら、EqualityComparer.Defaultでいいだろ
ただし当然インターフェイス経由になるので、 最大限のパフォーマンスは得られない。 ジェネリックだとこれくらいが関の山だが。
これくらいってどれくらい?
最大限の実行パフォーマンスが欲しければアセンブラでも何でも書くといい
ジェネリックで書けてかつできるだけパフォーマンスが良いのは これくらいのやりかたしかないってこと。
Windows FormのComboBox用の汎用的なアイテムのジェネリッククラスってやっぱりないのかな? つまりDataSourceにList指定するとして、そのListのアイテム用の汎用クラスって意味ですが。 まあ自分で作ってもたいした手間じゃないんだけど。
treeviewの+マークの位置って取得できますか? フォームのデザイン時の奴みるとできるっぽいんですが それらしいプロパティがありません。 とりあえずクリックされてるのが+なのかラインなのかノードなのかが わかればいいんですが。
つ TreeView.HitTest
83 :
デフォルトの名無しさん :2007/03/20(火) 14:08:18
なんでマイクロソフトはframework2.0をwindows updateの重要な更新の方に入れてくれないの? 誰もインストールしてないじゃん。
パッケージなら同梱してランタイム判定後ウィザードでインストールさせればいいじゃないか
ウィザードも飛ばして問答無用でインストールすることもできた気がする
多態性 なんて読むの?
たたいせい
エンジニアは大抵横文字使って一般人に解らなくするの好きだから ポリモーフィズムと読んでおけば良い
別に一般人に解らなくするのが目的じゃないと思うけど・・・
ここはどんな糞レスにもマジレスする仕様ですか?
多熊性 なんて読むの?
たくま しょう
すまん、
>>80 に書いたようなクラスってライブラリにはやっぱり存在しない?
必要性は普通感じるでしょ。 っていうか、DisplayMemberだのValueMemberだの、このListBox系のコントロールの この辺りの仕様はやっつけにしてもちょっと醜過ぎるね。
>ListBox1.DisplayMember = "LongName" ; >ListBox1.ValueMember = "ShortName" ; 必要な人には便利なんじゃないの? 俺は使わないけど。
>83 でかいから。
>>83 さすがにそれやっちゃうと独禁法でゴネられても仕方がないだろ。
Vistaでは3.0が標準搭載ですが
(@@)ドッキン
>101 2003Serverでは1.1が標準だったが2.0が出てしまった。 Vistaで標準で3.0が入ってようが3.0が普及する頃には新しいバージョンが出てしまうのではと思うよ。
(@@)ホゥ
プ 3.0って全然使わないWPFが追加されただけじゃん
>>105 正確には2.0+WPF+WCF+WFだけどな
リリースされたばかりで判断するのは早い
iPodやDSのリリース直後の評価を見ればわかると思う
>>105 TBS+MSねつ造作成アプリに騙された馬鹿がここにもいたか
TBSがSI事業するわけないだろ常識的に考えてw
CardSpaceも忘れないで下さい(X)
普通のネイティブアプリはバイナリパッチで改造したりするらしいけど、 .netのアプリをクラックする場合はどうやるんすか? ソースコード丸見えならクラックされ放題な気が。
スレ違いだが、中身がオブジェクトコードかCILバイトコードかが違うだけで、やることは同じ。
>>110 アセンブリのヘッダにハッシュが含まれてるんじゃないっけ?
整合性とれなくならない?
>>111 それも書き換えりゃいいじゃん。
電子署名されてたら別だけど
114 :
デフォルトの名無しさん :2007/03/21(水) 18:24:18
例えば64*64ピクセルのjpg画像3つをリソースに読み込みます。 読み込んだ画像をそれぞれgazou[0]、gazou[1]、gazou[2]のように、配列として扱うにはどうすればよいでしょうか。 また、pictureboxを3つ作って、コードの中でpicturebox[n]のように書いたらエラーになってしまいました。
まず、Graphicsを覚えましょう
116 :
デフォルトの名無しさん :2007/03/21(水) 18:42:50
graphicsですか……。線を引いたり三角を出したりするものだと本に書いてあります。画像の配列と関係がここにあるのですね。調べてみます。
とりあえずGraphicとかってレベルじゃないっしょ Bitmap[] gazou = new Bitmap[3]; gazou[0] = HogeResource.HagePic1; gazou[1] = HogeResource.HagePic2; gazou[2] = HogeResource.HagePic3; …… ってことじゃないの
おぉ、やってみたらできました! そうか、ビットマップという型の配列を定義するんですね。int[] num = new int[3]と同じようなもので、整数を定義するのと同じことなのですか。 おかげさまでスッキリしました。ごくごく初歩的なことに付き合わせてしまい、申し訳ありませんでした。
int[]とBitmap[]を同一視するのは危険だぞ …まあその段階ならまだ気にしなくていいか
Bitmapがクラスだと覚えておけばいいんじゃね?
分かりました。調べておきますね。
ふらっとに行ったほうがいい希ガス
123 :
デフォルトの名無しさん :2007/03/22(木) 18:34:16
スレ違いな気もするけど他に見つからなかったので質問させてください。 WinのC#を使ったアプリでQuickTimeSDKを使って動画からフレームを バイナリで取得し静止画で吐き出させたいのですが(notクリップボードでのコピー)、 QTのコンポーネントを把握して無いためやり方が分かりません。。。(C#も初心者だが、、) CのGworldみたいなオフスクリーンのバッファとかってあるのでしょうか? よろしくお願いします。 もしくはコレを解決できるチュートリアル的なページがあればよろしくです。
ググレカス h t t p://developer.apple.com/samplecode/QuickTime/idxQuickTimeforWindows-date.html
↑は既に一通り読んでたがこういうのは無い。 コレだろがボケというのがあるなら示して。
javaでいうとこのcommons digesterみたいなのってありませんか? xml <-> DTO を設定ファイルだけでできるような。
バインディングならもっと便利な機能がいくらでもあると思うが
128 :
デフォルトの名無しさん :2007/03/24(土) 00:35:56
すいませんが、C#は今現在形で、どんなアプリケーションに使われてますか? ちょっと具体的に教えてください。 Webでもなさそうだし、バッチ処理でもなさそうだし。 なんに使うのかなあ?
>>128 拡張子がaspxのwebは、C#かVB.NETで作られてる。(ほかの言語の可能性もあるけど)
Windowsで動かすもので、使っちゃダメって言われなければ、なんにでも使おうとする。 好き嫌いは抜きにしてとりあえず楽だから。
アメリカじゃ、いままでVB6で作られてたような分野のソフトは、VB.NETよりC#に移行してるところが多いって記事も見たな。
132 :
デフォルトの名無しさん :2007/03/24(土) 01:03:16
C#をWebのどこに使うの?
JavaとかPHPとかと同じようなところに。
サーバ側処理全般
135 :
デフォルトの名無しさん :2007/03/24(土) 01:54:19
JavaのサーブレットやBeansのかわりのC#ですか? PHPは画面系ということですか?
もうちょっと勉強してこいよ
キーワードはASP.NET ぐぐれ
>>135 ASPは2.0から、PHPみたいにHTMLにコードを埋め込んだりしなくなったな。
PHPもフレークワークとかどんどんでててきてそういう流れだろ?
プログラム言語でなく、.NETFrameworkがWebで動作している。 .NETFrameworkはC#・VB・C++等を利用することができる。 ASP.NETはActive Server Pagesでタグで記述を行う。 タグで記述されたWebコントロールの制御を主にC#等が行う。 MVCモデルで記述するとViewがASP・ModelとControlがC#等で作成する。 Contorlはアプリケーションの制御・Modelはデータの読み書き等を行うプログラムである。 .NETFrameworkの制御はイベントドリブンを採用している。
日本語でおk
>>128 SQLServer2005のマネージャー。
142 :
デフォルトの名無しさん :2007/03/24(土) 10:04:50
string.equals(a,b) a.equals(b) 両者はまったく同じことですか? 違いはありますか?
>>142 aがnullの場合、後者はヌルリ
普通に a==b と書け
String.Equals( string str1, string str2 )のほうが速い(はず)
何と比べて?
常識的に考えて静的メソッドの方が早いわな
でも独自メソッドや言語仕様で固めると他の言語使いからは読み辛いよね
なにも莫迦にあわせることはない
比較演算子使うより比較メソッドを推奨する。 a = nullの場合は String.IsNullOrEmpty(a)で調べる。
String.Equals メソッド (String, String) >objA が objB と同じインスタンスである場合、両方のインスタンスが null 参照の場合、 >または objA.Equals(objB) が true を返す場合は true。それ以外の場合は false。 String.EqualsやStringに対する == も同じ実装なんじゃない?
そもそも==とEqualsで性能が変わるってどんだけショボイPCか判定いくつあんだよって感じだな
コンパイル時かJITで差がなくなると思うが、 あったとしても全体の1%に満たない部分に労力をつぎ込んでその部分の性能を倍にしましたっていう話。
んでそのわずかな差のためにFrameworkのVerが変わる度にコーディング変えるわけ? 「このメソッドは2.0から追加されたから使用」とかコメントに書いてんの?
>>153 お前だけ言ってることがずれてるわけだが
どっかで==のがはやいって話を読んだ気がするな。 確か.NETのStringはsealedでimmutableでdefault internだろ。 純粋にアドレス比較でいいはず。
逆にアドレス比較じゃダメだろ。 String.op_Equality メソッド >この演算子は、Equals メソッドを使用して実装されます。つまり、比較対照値の参照と値が等しいかどうかがテストされます。 >この演算子は、序数に基づく比較を実行します。 これの実装にはString.Equals メソッド (String, String)が使われている。 関数が二重に呼ばれることになるが、最適化で変わらなくなる。
>>155 String.op_Equality は String.Equals(String, String) を呼んでるだけ
おそらくJITコンパイル時にインライン化されるはず
String.Equals(String, String) はまず参照を比較し、参照が異なった場合は
長さを比較し、長さが等しければポインタを使ってデータを比較してる
stringの場合は==もstring.Equals()もほぼ同じ。 それ以外のあらゆる型では型名.Equals()は==より比較にならないほど遅い。ちょっと前にも出てたけど。 他の型と統一性を考えたらstring.Equals()を使うメリットなんてないはず。
159 :
デフォルトの名無しさん :2007/03/24(土) 14:27:23
早い遅い以前に意味が違う(違いうる)と思うんですけど。。。
型安全じゃない
なんでSizeやPointはEquals(Size)やEquals(Point)を実装してないんだろ 推奨してるはずなのに
推奨なんかしてたか?
値型だから。 レベル低すぎるな
165 :
デフォルトの名無しさん :2007/03/24(土) 14:43:08
>>164 系統だてて説明するの面倒だなあ。。
その辺のことは、例えばアスキーから出てるartonって人の書いたc#の入門書に
詳しく書いてあるから興味があったら読むといいと思う。
>>163 DateTime.Equals(DateTime)は実装されてるぞ。
比較のパターン 1.値型 比較演算子 値型 2.オブジェクト.メソッド(変数1, 変数2) 1の場合は値の比較なら問題なし 2の場合は指し示すポインタ・型などを比較する場合に用いる
構造体の場合は IEquatable<T> を実装することが推奨だしょ
結局
>>161 と同じだけど,System.Drawingの構造体は実装してないみたいだな
なんでなんだろ
170 :
デフォルトの名無しさん :2007/03/24(土) 16:00:21
>>161 値型はまた別では。参照比較しても意味がないし。
なるほど。整理すると 値型は迷わず == を使った方がよい。 参照型は == が値の比較になってるか参照の比較になってるかは実装しだいだから用心深く使い分ける。 Stringなどわかり切ってるものは == でいい。 IDEで値型と参照型を色違いで区別してくれるくらいのサポートは欲しいの。
オブジェクト指向の場合は継承でis-aの関係なども 考慮して比較しないといけない場合もある 例:TextBox is Control
文字列の場合、case sensitiveじゃない比較したいときにはよく使うな>Equals()
>>173 ツールのオプション
ユーザーの種類(値の型)で型の色は変えられる。変数の方は無理っぽい。
それからなぜかこの項目でVBのソースの色は変わらなかった。
>>171 『プログラミング .NET Framework 第2版』「6.1.3 値型によるEqualsの実装」に詳しく書いてあるね。
値型でEqualsをオーバーライドしない場合は
System.ValueType.Equalsでオーバーライドされた実装が呼ばれるんだけど、
この実装ってのがリフレクション経由でフィールドを全部列挙して、
それぞれに対してEqualsを呼び出すというものだったりする。
比較のたびに毎回リフレクション使われるとパフォーマンス的に悲惨なので、
値型は可能ならEqualsをオーバーライドすべしといわれていると。
番組始まったけど、亀田のボクシング発生するまであと何分くらいかかるんだ。
>>177 単純な型だとリフレクション使わずバイナリで比較されるはずだが
>>180 System.ValueType.Equals見てみたけど確かにそうっぽいね。
てことはデフォのSystem.ValueType.Equals(object obj)の欠点は
内部でRuntimeTypeを生成するコストがかかることと
引数がobject型のせいで確実にboxingが発生することぐらいか。
まあそんなとこでボクシングしてたら値型使う意味が無くなるけどな
ひょっとしてどこでボクシングが発生してるか全部調査してコード書いてるの?
おおう!ボックス化と亀をかけてたのか。いまごろ気付いたwww
185 :
181 :2007/03/24(土) 22:06:35
もうちょっと調べてみたけどRuntimeTypeは1回作ったら使い回しみたいね。 Equalsの回数に比例してRuntimeTypeのインスタンスが作られるわけじゃないと。 というわけでRuntimeType生成コストも気にしなくていいみたい。
>>183 調査してって、意識してればどこでボックス化が発生するかくらいわかるべ。
それにかなりコストが高いから意識するだけの価値はある。
レス予想 「パフォーマンス気にするならC++使えばいいじゃんバカジャネーノ」
パフォーマンスを気にしてるから値型なんて使うわけで ボクシングが発生しないように配慮するのは当然
いつも思うのだがパフォーマンスが気になるヤツが何を作ってるのかも言って欲しい。 どうせ
>>189 多くの場合、あんまり神経質になる必要がないのも事実だけど、
パフォーマンス関係のことってちょっとルーズにやる過ぎると
とんでも遅くなって使い物にならなくなることも普通にある。
ジェネリック型の型パラメータの制約として「デリゲートである」ことを指定できないのかな?
>>191 何がしたい?
デリゲートを指定できるメリットが分からないけど。
public class Test<T>
{
public delegate void func(T x);
}
みたいなこと?
できないよ
>>192 組み込みのイベントが使いづらい(自由にinvokeや連結ができない)もんで
デリゲートをカプセル化して
public class MyEvent<T> where T: delegate
{
T _handlers;
public void Add(T handler) { _handlers += handler; }
public void Remove(T handler) { _handlers -= handler; }
public void Invoke(params object[] parameters) { _handlers.DynamicInvoke(parameters); }
}
みたいなクラスを定義できたらいいなーと思って。
これができないとなると
protected MouseEventHandler _mouseDownHandler;
public void AddMouseDownHandler(MouseEventHandler handler) { this._mouseDownHandler += handler; }
public void RemoveMouseDownHandler(MouseEventHandler handler) { this._mouseDownHandler -= handler; }
public void InvokeMouseDownHandler(params object[] parameters) { this._mouseDownHandler.DynamicInvoke(parameters); }
みたいなコードをイベントごとに記述するしかないのかな。
ん? カスタムイベントとか Component.Events とか知らない?
よっぽど請ったアルゴリズムのコアルーチンならまだしもそこまで気をつかわナイトいけないならC#使わないでほかの使ったほうがいいんじゃないかと・・・
197 :
194 :2007/03/25(日) 10:23:00
>>195 すみませんコンポーネントについてはよく知らないんですが、
ざっと調べた限りではComponentを基底にもつクラスの話ですよね。
>>194 の例では別に基底クラスを規定してないので使えないような気がします。
いや、それは本質ではない。そういう実装の仕方があるという話。
>>194 public event EventHandler MyEvent
{
add{this.Events[eventKeyMyEvent].
}
200 :
199 :2007/03/25(日) 12:29:07
途中書き込みすまん public event EventHandler MyEvent { add{this.Events[eventKeyMyEvent].AddHandler(value);} remove{this.Events[eventKeyMyEvent].RemoveHandler(value);} } みたいに書けるのは知ってるの?
( ・∀・)つ〃∩ ヘェーヘェーヘェー
202 :
194 :2007/03/25(日) 19:41:52
>>200 ああ、
>>194 のうちAddMouseDownHandlerとRemoveMouseDownHandlerが
public event MouseDown {
add { _mouseDownHandler += value; }
remove { _mouseDownHandler -= value; }
}
のように書ける、ということですか。
でも手間としてはあまり変わってないような。Invokeのためのメソッドはやはり必要でしょうし。
つうか 何 が し た い ん だ
キュウリの古漬けが食いたい
public class MyEvent<T> where T: class { T _handlers; static MyEvent() { if (!typeof(T).IsSubclassOf(Delegate)) throw new NotSupportedException("ゴルア"); } public void Add(T handler) { _handlers = (T)Delegate.Combine((Delegate)_handlers, (Delegate)handler); } public void Remove(T handler) { _handlers = (T)Delegate.Remove((Delegate)_handlers, (Delegate)handler); } public void Invoke(params object[] parameters) { ((Delegate)_handlers).DynamicInvoke(parameters); } }
まあその前に何がしたくてそんなことする必要があるのか分からんが。
どうせワンパターンなんだから
>>202 +Invokeメソッドのコードスニペットを作っとけばいいだろ
208 :
194 :2007/03/25(日) 20:44:05
>>205 おお、いいですね。
一見スマートじゃなさそうですがうまく動きますね。外から見れば
>>194 とまったく同じですし。
ちなみにTとDelegateの間でキャストができないので (T)(object)Delegate.Combine(...) などとする必要があるようです。
というわけで使わせてもらいます。レスくれた方々どうもでした。
超絶な変態プレイだな
というかイベントとデリゲートを混同してる気がするんだな
211 :
デフォルトの名無しさん :2007/03/25(日) 21:04:37
AppendTextと+=って何が違うの?
「C♯, C#相談室 Part34」
http://pc11.2ch.net/test/read.cgi/tech/1162467959/ から(今度こそ)誘導されました。
.Net Framework 2.0 の System.Security.Cryptography; 以下のクラスでRSA暗号を
扱うときのことに関して質問があります。
まず、秘密鍵K 、Kから生成され予め配布された公開鍵P、Kで暗号化された
データCがあります。今から実装するプログラムにおいて、
RSACryptoServiceProvider.FromXmlString() を用いてPを読み込み、それによって
Cを復号したいのです。質問内容は、
1. そもそもこの処理は実装可能か
2. Kで署名されたデータSを、Pから作られた RSACryptoServiceProvider の
VerifyData() で検証することには成功した。しかし、Encrypt() や Decrypt()
では鍵が違うと文句を言われたが、別のメソッドを用いるべきか。あるいは何か
留意すべきことがあるか
実行環境としては WindowsXP Proなんですが、 OAEP パディング は無しでやっています。
以上、何かアドバイスがあれば、よろしくお願いします。
>>194 CIL書く知識があれば、型パラメータのセカンダリ制限にSystem.Delegate指定できるよ。
s/セカンダリ制限/プライマリ制約/;
>>211 TextBoxのこと?
長い文字列になるとAppendTextの方が速いみたい
>まず、秘密鍵K 、Kから生成され予め配布された公開鍵P おおそれはすごい。 ついにRSAもハックされたか。
217 :
212 :2007/03/25(日) 23:07:58
>>216 良く読んでくださいね。表現がまずかったですか?
よく読めも何も、 >Kから生成され予め配布された公開鍵P KからPを生成したと読めるから冗談で突っ込んだだけなんだが…
冗談だけじゃなんなので。 何でCを復号する必要があるの? RSACryptoServiceProviderは公開鍵での復号機能は持ってないみたいだな。 暗号化と復号が同じ処理ならEncryptでもいけるのかも知れんけど、実際どうなんだっけ? よく知らない(もしそうであったとしてもRSACryptoServiceProviderで本当にできるのかはもちろん知らん)。 少なくともDecryptじゃ無理なのは間違いないわな。
ところで検証に成功したなら、もう一回ダイジェストとれば同じデータになるんじゃないの?
221 :
212 :2007/03/26(月) 00:31:05
>>218 $ openssl rsa -pubout
上記のコマンドから得られる結果も何かの冗談ですか?
秘密鍵→公開鍵の処理に必要な計算量をどんなに多く見積もっても、
公開鍵→秘密鍵のそれに比較すれば、無視できる程度で計算可能なはずですが。
恐らく、O(1) くらいで。
>>219 > 何でCを復号する必要があるの?
冷静に考えてみると、復号する必要はないです。PHPの関数に
openssl_private_encrypt() というのがあったため、興味本位で調べていたら、
はまってしまったようです。素直に署名で何とかします。お騒がせしました。
>>220 これは私の説明不足ですね。VerifyData() のくだりは、「鍵ペアがおかしいわけではない」
という意味で書きました。ですので、これを書いた時点では、署名やダイジェストを
どうにかしたいわけではなかった、ということです。すみません。
秘密鍵ってほんとの秘密鍵の部分だけの話かとおもたよ…
ああ、普通に秘密鍵から公開鍵を生成っていうんだな。 すまんかったorz
すまんがsealedの意義を教えてくれ。 継承を禁止されるおかげでちょっと独自の動きをさせたいことに多大な制限がかかるんだが。 あほがうかつに継承することでシステムが複雑になりうることは理解できるけれどそれを暮らす設計者が禁止するほどお前は設計についてすべてを見渡せるのかと子一時間。
・ちょっとパフォーマンスが上がるかも ・かなり汚い実装してるから継承しても無駄!(Graphicsみたいに)
>>224 設計者が意図していない継承をさせたくない場合に役立つ。
こういうのは流行やいろいろ考え方はあるのだろうけど、
C#はこういう面では非常に保守的で、
overrideだってクラス設計者がvirtualと宣言してなきゃ出来ないわけだ。
利用者が機能拡張したいなら委譲と包含が基本だろうな。
>>224 うかつに継承することでシステムを複雑することが無いほどお前は設計についてすべてを見渡せるのかと子一時間。
System.Drawingのsealedの嵐は さすがにもう少しなんとかならなかったのかと思う
Formを継承させたクラスを継承したフォーム作るとデザイナが不具合起こすのが多くて嫌だね
>>224 よくよく考えてみると確かに疑問だね。
継承を許すと問題が起こりうる場合というのを考えてみたけど
ちょっと思い浮かばない。
下手に拡張されてライブラリのバグだなんて言われてはたまらない。
javaのハウツー本の一部には継承する予定のないクラスは 取り合えずfinalにしておけといった記述も見受けられるが、 C#の場合virtual overrideの仕組みがあるから、 あえてsealedにしなくても予期できないような拡張はされにくい。
sealedが必要なのはimmutableなクラスぐらいかな
要はね、デフォルトでは素人がいじれない仕組みなんだけど玄人向けにはその抜け道が必要だと思うのよ。 そうでないといろいろ言語上の制限で記述ができなかったりおかしくなったりすることが多々ある。 いきすぎるとC++のような変態コード生成機になるけれどあながちそれも悪いとはいえないとおもふ。
しかし素人ほど玄人の真似事をしたがる
どっちかっつーとMSのサポセンに素人の下らない苦情が来ないように 厳しい仕様にしたってだけじゃないのかねぇ。 Javaのデフォルトバーチャルな世界や動的言語のダックタイピングと 真逆な方向性なわけだけど、Javaがデフォルトバーチャルで誰か困ったか? むしろC++がデフォルトバーチャルでなくて素直に継承とポリモーフィズムが 適用できず、不便に感じるケースの方がずっと多いんじゃないか? まーC++にはテンプレートメタプログラミングという逃げ道もあるわけだけどさ。
.NET Frameworkだと,Win32やGDI+やinternalクラスやinternalメソッドに べったり依存しててどうしようもないものはsealedになってる場合が多いみたいだな
C++のGDIの変態コードを実装したことがある人はC#のGDI+が不便でも可読性と生産性が高いことが 理解できると思う。 初級PGにGDIコード書かせるとよくわかると思う
え、デフォルトvirtualで困ったことないの?? プログラムの可変な場所を明示的に書けるC#のスタイルの方が生産性が高いと思う。 テンプレートメソッドパターンでサブクラスを人に見せるOr渡すときとか ライブラリ設計しててvirtualだとさらに柔軟になるだろうけど、わざと変更範囲を閉じるとか。 (virtaulにしてoverrideして実装すると危なそうなことを明示する) 実作業レベルではvirtualが限定されているおかげでIDEでoverrideと打つ拡張方法が楽
Javaの@Overrideがその証拠だな
>224 世の中あほが非常に多いんです。 継承とnewとoverrideとインターフェースの明示実装を駆使して全部実装が違っていて 全部実装が間違っているDisposeとか目の当たりにするとあほ防止の機能は重視した方がいいんです。
一般的なWebブラウザのブックマークみたいにメニュー項目上で右クリックしてさらにメニューを表示させるというのは .NET Frameworkでは不可能でしょうか? ToolStripMenuItemのMouseDownイベントで右クリックイベントは捕捉できるんですが そこからさらにContextMenuStripを作成して表示すると古いメニューが消えてしまいます。
>>243 コンテクストメニューを表示するタイミングでToolStripMenuItem.DropDown.AutoClose=false
そして、消えるときに元に戻してやればいい
気合で全部自前描画
246 :
243 :2007/03/27(火) 11:23:13
>>244 どうもありがとうございます。そんなプロパティがあったとは気づきませんでした。
しかしこのままだと問題があって、古いメニューの方も操作できる状態になってしまいました。
で、GetWindowLong/SetWindowLongで古いドロップダウンのウインドウプロシージャをすげ替えて
マウスイベントを排除することで古いメニューを操作できなくしました。
基本的に解決ですが、もし他にスマートな方法があればお願いします。
サブクラス化するなら最初からやっておいても同じじゃない? 以前やったやつ。必要十分かどうか確かめてないが ToolStripDropDownMenuを継承、OnMouseUpで右クリック補足 →フラグ立てる。 フラグが立っているときは PreProcessMessageでfalseを返す WndProcでWM_MOUSELEAVEを無視する →右クリックのイベントを起こす →フラグ降ろす
248 :
デフォルトの名無しさん :2007/03/27(火) 16:28:01
C++で作られたプログラムと、C#で作るプログラム間でWM_DATACOPYを 使ってデータをやり取りする部分を考えていますが、実際にSendMessage を行う際の お互いのWindowハンドルというのはどのように取得すれば いいのでしょうか? HWND_BROADCASTを使うと当然のごとく、いろいろなアプリが反応します。
>>248 FindWindow() で自己解決しましたm(_ _)m
一応言っておくと、HWND_BROADCAST は普通 RegisterWindowMessage と組み合わせて使う。
251 :
243 :2007/03/27(火) 23:05:25
>>247 レスどうもです。ToolStripDropDownMenuを継承したらP/Invokeを使わずにできました。
(継承できたら楽だなとは思ってたんですが実際に継承できるとは思ってませんでした)
ただ、PreProcessMessageに制御がこなかったのでWndProcをかわりにオーバーライドしました。
なんだかんだでP/Invokeを使わずに色々なことができるようになってるんですね。
252 :
35 :2007/03/28(水) 15:21:01
質問です。TreeViewを継承したクラスを作成しているのですが、 ダブルバッファリングの処理を入れたところ、 OnPaintの呼び出しは確認できているんですが、描写されません・・・。 これって何故でしょうか・・・。 以下がコードです。 public class MultiSelectableTreeView : TreeView { /// <summary> /// コンストラクタ /// </summary> public MultiSelectableTreeView() { this.InitializeComponent(); this.SetStyle(ControlStyles.ResizeRedraw, true); //ダブルバッファリングを有効にします this.SetStyle(ControlStyles.DoubleBuffer, true); this.SetStyle(ControlStyles.UserPaint, true); this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); } /// <summary> /// 描写 /// </summary> protected override void OnPaint(PaintEventArgs e) { Debug.WriteLine("Start - OnPaint"); base.OnPaint (e); } } 宜しくお願い致します。
253 :
252 :2007/03/28(水) 15:22:34
↑なんか名前が35になってしまいましたが、このスレの
>>35 じゃないです。
yieldつかってマイクロスレッドとかやってる人おる?
yield いらね
>>252 精神分裂症的な、何がしたいのかよくわからんコードだ。
自分でベースクラスに対して「俺様が描画するからお前黙ってろ」って命令してるんだから
描画されるわけがないと思うんだが。。
ひょっとしてベースクラスに対して「ダブルバッファリングを使ってお前が描画しろ」
と言いたいつもりなのかな?
だとしたらそんなことはたぶん簡単にはできない。
>>254 yieldでデリゲートを返すようにしたらスクリプトみたいでおもしろいんじゃね
おもしろくともなんともない
261 :
デフォルトの名無しさん :2007/03/29(木) 10:32:13
>>256 回答ありがとうございます。この件は解決したのですが、
後学のために教えてください。
>自分でベースクラスに対して「俺様が描画するからお前黙ってろ」
これってオーバーライドしたOnPaintの中でbase.OnPaintを呼び出しても
処理は実行されないんですか?
>ひょっとしてベースクラスに対して「ダブルバッファリングを使ってお前が描画しろ」
そのとおりです。
263 :
デフォルトの名無しさん :2007/03/29(木) 11:38:11
>>262 なるほど、On**はイベントを発生させるためだけ(描写処理を呼び出すだけ)のもので、
その中に描写処理は含まれてない。
だから、
>>252 のソースでは
UserPaintで、描写処理は自分で行うぜ!(既存の描写は無視)という風にしているから、
描写処理が行われなかったわけですね。
OnPaint自体が描写処理を行うと勘違いしてました・・・。
ありがとうございました!!
OnPaintは描画処理していいし、base.OnPaintを呼び出せば基底クラスの描画処理が実行されるよ・・・
そうなってることもあるがTreeViewを含めそうなってないこともある
extern って DllImport と組み合わせずに使うことってあるの?
MethodImpl属性と組み合わせて使うことはあるみたい
System.Windows.Forms.TimerのインスタンスをつくってStartしてもティックがこない・・・(´・ω・`) DLLのクラスライブラリから呼び出すとティックが来ないなどあるんでしょうか?
WebServiceでタイムアウトしてしまうので 非同期のメソッドにして処理をしたいのですが ぐぐるとMSDNのところくらいしかまともな回答に たどり着きません。 しかし、そのMSDNで RemoteService クラスを使ってますが そのクラスがどこにもありません。。。 どの空間にあるのでしょうか? また、他に非同期にする手段はありますでしょうか? よろしくお願いします。
いや、Timerスタートの呼び出しはメインスレッドから行われてる。 そのコードがDLLにあるだけ。
どうやらおまいさんしか分からない前提が多数あるようだ
メインスレッドがブロックされてるんじゃない?
DataGridViewについて質問させて下さい。 Viewに100件のデータがあるとします。 Timerで一定時間ごとに1件削除→コミットするのですが、 コミットのタイミングでスクロールバーをダブルクリックすると、 DataGridViewが最大化されてしまうのです。 何とか回避したいのですが、良い方法は無いでしょうか?
DataGridViewのコミットってなに? コミットのタイミングでダブルクリックってなんでわかるの? DataGridViewが最大化って? ・・・
おれ用語禁止と何度いったら……
それは不可能でしょ 俺様用語矯正スレでも立てたら
矯正スレ立てると無くなるんだ。へー。
279 :
デフォルトの名無しさん :2007/03/30(金) 20:11:05
IPAddressコントロールを使いたいんですが、ToolBox にありません。 なんかの参照を追加しないといけないんでしょうか?
そのコントロールは自作かなにかですか?
281 :
279 :2007/03/30(金) 20:20:29
クラス WC_IPADDRESS のコモンコントロールだと思ってたのですが、標準のものではなかったでしょうか? MFC には ToolBox に出てたと思うのですが・・・
標準ではラッパ用意されてないから自分で作れ
283 :
279 :2007/03/30(金) 22:42:09
>>282 なるほど、標準では使えないのですね・・・
ラッパを作るってのをやったことないのですが、どんな手順で作るものなのかヒントをもらえないでしょうか。
何かの基底クラスを派生させて、いくつかのメソッドをオーバーライドしていく、みたいな感じで作れたりするものでしょうか?
そんなもんラッパ書くより自分で実装した方が早いんじゃないの?
ちょいとぐぐれば普通に実装が見つかっちゃったぜ ちなみに WC_IPADDRESS は SysIPAddress32 って文字列の別名
中国結構凄いな。 ポップアップがいっぱい開くのはやめていただきたい。。。
288 :
デフォルトの名無しさん :2007/03/31(土) 11:49:06
C#の入門書で良書と言ったら何がありますか?
プログラミングC# 第4版
日経BPのプログラミング書籍ははずれが少なく良書が多い。 ただし、プログラミング初心者向けではないが。
291 :
288 :2007/03/31(土) 14:09:13
皆さん、ありがとうございます
>>289 オライリーの本ですね
>>290 日経BPの書籍でC#と言ったら
Petzold著のC#によるプログラミングWindowsとかですかね
サルでもわかるC#
本当の初心者には基本情報技術者とC言語のお勉強からしてもらいたけどね。 参照型と値型にポインタ等この辺を理解できてないうちにプログラミング されても戦力にならないからな。
C#に入門書なんか要るのか?
>>293 どれもC#使いながら覚えても大してかわらん。
むしろC#の方が初心者が無茶な書き方できないから良いと思うんだが。
本当の初心者がC#上でポインタ使えるようになるのは相当先の話だろ。
ポインタ使うくらいならC++使えよ
Cのdllのラッパーを書くときには使うよ
C#からWin32API呼び出すくらいのことができないで プログラマーを名乗るのはやめてほしいくらいだな。 Formsでコントロール貼り付けるだけならエンドユーザーでも できるからな。
P/Invoke ごときで何言ってんのww
そうだね、プロテインだね
P/Invoke出来ない人が実際に多いけどな。 VB上がりだと理解すらできないと思われるが。 どの程度だとベテランと呼ばれる領域なのか? 同期制御やManagedDirectXを使いこなせる位か?
P/Invokeはできれば避けるものだろ
P/Invokeなんて瑣末なWin32API呼び出す技術より、 ポインタ扱えるとかメモリ管理とかコンピュータサイエンスの基礎レベルは知っておいてもらいたい。 なんだかんだできっちり情報やった人とそうでない人ですごい品質の差があるような気がする。
そうかな。技術ヲタクにまともそうな人間は少なく感じるけどな。 必要とされるのは顧客が求める物を求める期間で作れる事だよ。 これまでもこれからも。
>>306 仕様の理解力はものづくりには必要だな。
だけど、技術的な知識はコーディングする上で
最低限知っておいてもらわないと仕事にならないよ。
>>301 友達でも作って、もっと見聞を広げなさい。
C#のプログラミングできる人が少ないのが現状だな。 Javaなら腐るほどいるけどな。
俺もC#の友達少ない。みんなC++とかJAVA。 そういう俺も仕事ではC++なんだけど。
大規模システムにC#及びWindows系サーバを採用することはあまり聞かないから、 大抵は小規模の開発になるよな。 小規模になると担当者は限定的にならざるを得ない。
中規模は?
C#でプログラム経験初→C++っていう流れは、アリですよね?
>>313 ありだけど、とんでもないプロジェクトだったりするからな・・・
新規でC++は大抵、携帯機器かファームウェアだろうな。
速度重視の一部パッケージがC++で作成しようと思うだろうけど、
大抵は.NETで作成するだろう。
WebアプリはJavaか.NETになる。
ありあり、低レベルからやるよりとっつき易いから学習パスとしてはかなり効率的だと思う。
>>309 >Javaなら腐るほどいるけどな。
ほんとですか?、まともなJava経験者にあんまりあったことがない・・
(Javaに限定されない話かもしれませんが)
偽装請負でまともな技術者が少ないからな。 Java言語習得者は現在で一番大量に湧いている。
318 :
デフォルトの名無しさん :2007/04/01(日) 09:47:01
Close() したフォームインスタンスのプロパティを取得できるのは何故ですか? モードレスで開いたフォームが閉じられていることを確認するために Visible 値を 確認するなんてことをやっているのですが、よくよく考えたら閉じたインスタンスに アクセスしてエラーとならないのが不思議です もしかして閉じただけではインスタンス自体は破棄(Destroy)されないですか? (Close したら Destroy されるという認識があるのですが・・・)
>>318 Dispose()メソッドを呼ぶのとDispose()行ったオブジェクトは利用しない
これだけ覚えておけば良い。
詳細はMSDNライブラリを読めばわかるだろうけど。
320 :
デフォルトの名無しさん :2007/04/01(日) 10:07:11
>>319 ありがとうです
なるほど C# では明示的に破棄していない場合は大丈夫なのですね?
あと Destroy ではなく Dispose なのですね
覚えておきます
>>320 モードレスで開いたFormはCloseすると自動的にDisposeされる。
しかしインスタンスは参照がなくなってGCで回収されるまで有効なので
Closeした後でも一部のプロパティやメソッド以外は使用できる。
Disposeで無効になるプロパティやメソッドを使用するとObjectDisposedExceptionが発生する。
大丈夫な場合もあるといっても,やらないほうがいいけどな
324 :
デフォルトの名無しさん :2007/04/02(月) 07:25:07
>>322 それ本当?
ShowDialog() が戻ってきた後、そのダイアログで操作された内容をオブジェクトからプロパティやメソッド経由で読み出すってことをよくやるんだが、それはいけないってこと?
その方法がダメだったら、そのダイアログの結果を受け取るためのクラスを作って、ダイアログ開く前にそのインスタンスを渡してやるとかしないといけないの?
てか、FileDialog とかどうなるんだべ?
いちいちイベントハンドラ設定して受け取る?
Close の解説をご覧
>モードレスで開いたFormはCloseすると自動的にDisposeされる。 「モードレス」で
>>325 うわーマジだー!
ダイアログに置いた ListView とかの選択情報を後から読み出したりしてたんだが、これはアウトっぽいね・・・
自分で明示的に Close を呼ばなくても、×ボタンで閉じられたりとか、AcceptButton や CancelButton を押されたときもダメなんだよね?
うわー・・・ orz
328 :
327 :2007/04/02(月) 07:43:40
>>326 あ、勘違いした。
ダイアログはモーダルですね。
よかった。
とんだ恥さらしでスマソ
327と同じ興奮を漏れも味わったw
ダイアログはDispose忘れが多い俺ダメっこ
using使えよ
ダイアログってデザイナで追加してオブジェクトを使いまわすものなの? それともusingでそのつど作るのが普通?
プロパティ設定するのめんどくさいから前者
Component追加するとForm1.resxとかって糞リソースができない? なんかドロップした場所とか記録してるやつ。 あれが嫌いなんであんまりデザイナで追加したくない。。
>>334 WPFで今度はXAMLというXMLベースのファイルに変わるから安心しろ。
VisualStudioでタブウィンドウを使ってるんだがデバッグの開始・停止を繰り返すたびにボーダーがどんどん左にずれてく・・・(´・ω・`)
>>336 IDEスレで愚痴った方がよくないか?もしかしたら解決策もっている人がいるかも
再インストールって言われそう。 ためしに、新規プロジェクトで最小限のコードで 同じ現象が再現するか試してみたら?
了解です。IDEすれ?で愚痴ってきますです。 解決策あったら報告するです。
>>254 やってるよ。
// ここはメインスレッドで実行
yield return delegate()
{
// ここは別スレッドで実行
};
// 別スレッドの処理が終わったらメインスレッドで実行
みたいな感じでスレッドを切り替えられるようにして使ってる。
>>340 試してないけどかなり軽くなるというのでいいかも。
独自のスレッド管理手法みたいなのも作れるし(゚д゚)ウ-(゚Д゚)マー(゚A゚)イ-…ヽ(゚∀゚)ノ…ゾォォォォォ!!!!
>>340 全然分からないんだけど。
その別スレッドが動作中はメインスレッドはスリープ状態になるんだよね?
どういう使い方をするものなの?
>>340 のいう「スレッド」はいわゆるマルチスレッドのスレッドのことじゃなくて
マイクロスレッド(コルーチン)のことを指してるのか?
344 :
340 :2007/04/05(木) 17:37:54
改めて考えてみると、マイクロスレッドとはちょっと違ってたかも。
>>342 別スレッド実行中は、
別のマイクロスレッドもどきのメインスレッドで実行する部分を実行するか
メッセージループを回してる。
345 :
340 :2007/04/05(木) 17:40:24
例えば、 IEnumerable<Work> WorkA(){ A1(); yield return delegate(){A2();} A3(); } IEnumerable<Work> WorkB(){ B1(); yield return delegate(){B2();} B3(); } void Run(){ works.Add(WorkA()); works.Add(WorkB()); } で、Run()を実行すると メインスレッドでA1 メインスレッドでB1、バッググラウンドでA2 メインスレッドでA3、バッググラウンドでB2 メインスレッドでB3 の順に実行される、といった感じ。
状態が保存されてるだけで複数スレッドで同時に実行されるわけじゃないんじゃないの?
interface IWork{void Work();bool Async{get;}}
class WorkImpl : IWork{
public WorkImpl(MethodInvoker invoker, bool async){略}
public void Work(){this.invoker();}
}
IEnumerable<IWork> WorkA(){
yield return new WorkImpl(delegate{A1();}, false);
yield return new WorkImpl(delegate{A2();}, true);
yield return new WorkImpl(delegate{A3();}, false);
}
void Run(){
>>345 と同じ}
(IWork.Asyncがtrueなら非同期呼び出し,falseなら同期呼び出し)
こんな感じにした方が意味がはっきりすると思う
何につかいたいかさっぱりわからん…… ファイバーやスレッドプールに比べての利点は? 仕様から見て、yield構文はあくまで列挙子ジェネレータを手軽に書ける ようにするため「だけ」のモンだと思ってたんだけど
>>348 C#でファイバーって使えたっけ?
> スレッドプールに比べての利点は?
処理を実行するタイミングと、実行する内容を分離して記述できるのが利点かな。
例えば、
「キャンセルボタンを押したら途中で処理を中終了する」
「ボタンを押すと一時的に処理を中断し、もう一度押すと再開する」
など、スレッドの実行方法を実行内容と分離して再利用できる。
けっきょく、
>>340 でいうメインスレッドやら別スレッドやらっていうのは、
本物のスレッドの事を言ってるんじゃないんでしょ。
352 :
デフォルトの名無しさん :2007/04/06(金) 01:29:02
スプラッシュウィンドウを作成しているのですが、少し困ったことになりました。 と言いますのも、ウィンドウが表示される瞬間ラベルコントロールが真白になり、 ウィンドウを台無しにするという現象を未だに解決できずにいるからです。 スプラッシュウィンドウの構成はとてもシンプルです。 フォームの背景に黒系をメインとした画像を設定し、その上にタイトルと 著作権表示用のラベルコントロールを配置しているだけです。 ラベルコントロールの背景色は Transparent(透過)で文字色は White です。 ウィンドウが表示された一瞬ではありますが、色の関係でとても目立ちます。 個人趣味のプログラムなのですが、できるだけ良いものを作成したいという 気持があります。 何か解決策はないものでしょうか? (画像を白系をメインとしたものに変更するのは不可です。)
解答じゃないんですが。嫌味のつもりじゃないんですが。 できるだけ良いソフトウェアを目指すなら、 スプラッシュ不要なものを設計してください。
354 :
デフォルトの名無しさん :2007/04/06(金) 02:07:22
設定によってスプラッシュウィンドウ表示を無しにできるように設計してあります。 従って、2回目以降の起動時には完全に表示しないようにできます。
スプラッシュウィンドウにそんなに苦労するなんて馬鹿馬鹿しいと思いますが ・スプラッシュを表示してるあいだ重い起動処理をしない ・画面外に表示してスレッドタイマーで中央にもって来る ・アルファ0で描いて次第に不透明になるカッコイイ処理を加える ・文字も画像に書き込んでしまう ・スプラッシュウィンドウなんて止める まあ最後のやつがマジお勧め
ダブルバッファ有効にしてもだめ?
表示したあと定期的にDoEventsを呼んでいないとかで、 再描画のイベントが発生してないということはない?
いいこと教えてやろうか スプラッシュを動画にするんだよ 可変部分は毎回エンコードすればいい vfw使えば簡単
javaの話で恐縮だけど、SE6のスプラッシュ考えた奴は天才だと思うわ。 java -splash:splash.jpeg hogehoge
まあ目から鱗的なところはある。 CreateProcessとWaitForInputIdleを組み合わせれば同じようなものを作れそう。
ビデオドライバをフックして直描きする
すごい昔、まだC#なんぞなかった頃、 スプラッシュウィンドウだけ別アプリにしたことがある。
え…スプラッシュウィンドウを別アプリにして 更新確認−なし→通常起動 └あり→確認してアップデート→新しい方起動 とかやるのは今時普通じゃないんですか
起動時にチェックして,置き換えるときだけ別アプリを起動すればいいだけだろ
>>352 フォームのバックグラウンドが白になってるだけだろ?
投下職を勘違いしてるだけじゃないかな
テストフォームでも作って灯火の意味を調べてみ。
ともしび…
368 :
デフォルトの名無しさん :2007/04/06(金) 23:24:05
スプラッシュで思い出したんだけどさ、俺の知人でさ、起動時にさ、 必ずモーダルなスプラッシュを表示させる香具師が居るんだが・・・ どう思う?馬鹿じゃね? 看板とか言っていたけどさ
び、 ビリケン。
370 :
デフォルトの名無しさん :2007/04/06(金) 23:43:05
モードレスじゃないスプラッシュなんてスプラッシュじゃねえ ただのダイアログだ
>>368 カッコイイと思ってやってるんだからそーっとしておいてやれ
凝ったスプラッシュを出すくらいなら 起動速度の高速化に注力してスプラッシュが不要なようにして欲しいと思う。
ひょっとして平気でビジーループか?
374 :
デフォルトの名無しさん :2007/04/07(土) 00:20:41
良いじゃん別に モーダルなスプラッシュを1〜3秒くれーなら表示してもさ アプリの名前や著作権情報を表示して主張するのもアリでしょ テレビ番組とか映画とかでいうオープニングシーンみてーなもんだよ ゲームで言うならタイトル画面かな ゲームやっててコンティニュー選ぶのまんどくせーって奴はあんまりいねーじゃん まあ、よく使うアプリで毎回起動時にモーダルで数秒取られるのはきついがな その辺は上で誰か書いてたみてーに非表示設定できれば問題なしじゃね? そんなもんだよ
全然よくないしそんなの普通じゃねーよ。
起動が遅いのを体感的に緩めるために、スプラッシュ画面を表示してみましょう。 モーダルでビジーループで3秒表示してみました。 あほかといいたい。
きもいヲタ絵を表示すると得点がさらに倍
業務アプリで、立ち上げ時にサーバから情報を取ってくるのが遅かったので 性能対策でプログレスバーつきのスプラッシュつけた。 が・・メンテナンス時に落とす以外は数ヶ月間立ち上げっぱなし、まぁどうでもよかった
379 :
デフォルトの名無しさん :2007/04/07(土) 02:35:08
フォームが表示されているのかいないのかを判断するにはどうすれば良いですか? フォームがまだロード処理中なのかそれとも既に表示されているのかを知りたいです。
表示と非表示のイベントでフラグ制御してそれを見ればいいだろが
>>379 表示されてアイドル状態になったかどうかなら Form.Shown イベントを使う。
1.x ならApplication.Idle イベントでがんばれ。
382 :
デフォルトの名無しさん :2007/04/07(土) 10:30:47
char[] 掛け声 = "あたっ"; このように書くとエラーになるんですが、どうすればいいですか?
char[] と string は別物
>>382 string s = "あたっ";
char[] ch = s.ToCharArray();
>>382 string 叫び声 = "あたっ";
char 声 = 叫び声[0];
387 :
379 :2007/04/07(土) 13:40:09
>>.380-381
ありがとうございます。
>>385 ありがとうございます。
FormのLoadイベント処理の中で結構時間が掛る処理をやっているのですが、
別スレッドからそのLoadの処理が終わった(処理が終わってFormが表示された)か否かを知りたいのです。
Formび途中の段階でVisible値がfalseになっていれくれれば良かったのですが、
確認してみたところ何故かtrueになっていました。(なので今回のケースでは使えないです。)
IsDisposed(破棄されているか否か)のようなプロパティがあれば一番楽なのですが・・・。
自分でイベントを定義してそのLoadの処理の最後に発生させればいいだろ
>387 OnLoadの終わりでvolatile boolなフラグでも立てとけよ。
> FormのLoadイベント処理の中で結構時間が掛る処理をやっているのですが、 これを止めれば万事解決 つか Load イベントの最後でフラグ立てればいいだけの話じゃね? そもそもワーカスレッドが Form の状態に依存すること自体微妙だが。
391 :
デフォルトの名無しさん :2007/04/07(土) 13:50:03
>>388-390 ありがとうございます。
フィールドにBOOL型のフラグを持たせるようにしてForm::Loadの始めと終わりで変更するようにします。
処理自体を見直すのも検討してみます。
・コンストラクタでフラグ初期化 ・重い処理の最後でフラグセット たったこれだけじゃねーか。 なんで「表示されたかどうか」って発想になるのか…
393 :
デフォルトの名無しさん :2007/04/07(土) 23:43:24
設定保持クラスのProperties.Settingsをinternalでなくpublicとかにしたいんですけど どのようにすればよいでしょうか?(簡単にはできないということはやっちゃまずいんでしょうか・・) プロジェクトをまたいで設定を共有したいのですがどのようにすればよいでしょうか?
395 :
デフォルトの名無しさん :2007/04/08(日) 09:17:41
あの、きっとすごく簡単なことだと思うんですが、 アプリケーションを多重起動防止にして、かつ 2つ目以降が起動された時には、1つ目に SendMessage したいです。 なので 1つめのウィンドウハンドルを知る必要があるのですが、こういうことの実現方法を教えてください。 ヒントでも結構ですので、よろしくおねがいします。
多重起動 禁止 C# でぐぐれかす。
397 :
395 :2007/04/08(日) 11:31:53
>>396 質問するまえにぐぐって、多重起動防止の方法自体は見つけてあるのですが、
1つめのインスタンスのウィンドウハンドルを取得する方法は発見に至っていないのです。
>>397 Process.GetProcessesByName()
Process.MainWindowHandle
.NETならSendMessageを使うよりリモーティングを使ったほうがいいと思うけどね。
>>398 リモーティング便利だよね。
チャネルにTCPでよくつかうけど、
ローカルでのプロセス間通信としてしかつかったことないんだよね。
セキュリティとかかんがえると、TCPよりは、unixドメインみたいなので
実装あると便利なきがするんだけど
2.0 で IpcChannel が増えたが?
IpcChannelって何を使用して実装されてるんだろうね。 気にする必要ないことではあるが。
名前つきパイポ
403 :
399 :2007/04/08(日) 17:09:14
ナッナンダッテー(AA略 いつの間に・・・ きがつかなかった
404 :
デフォルトの名無しさん :2007/04/08(日) 20:03:07
フォームのロードメソッドの中でApplication.DoEvents()すると まだロードメソッドの途中なのにフォームが表示されるんですが、 何でですか? Application.DoEvents()の直前でフォームのVisibleをfalseにしたら 一応防げたんですが・・・ フォームのロードメソッドの中でそのフォームのVisibleをfalseに するのは処理的におかしいですか?
たまたまそういう仕様だからとしか言いようがないだろ 一体何がしたいんだ
C#でオートメーションサーバを作成したいのですが 方法が良く分らないです。 どなたかヒントを教えてもらえないでしょうか。
OLEなの? COMじゃなくて?
>フォームのロードメソッドの中でApplication.DoEvents()すると なんでそんなことするんだよ。
今ならactiveX だろ オートメーションサーバは
410 :
デフォルトの名無しさん :2007/04/08(日) 20:50:49
>>408 メインフォームをロードする中でプラグインの開始処理を呼んでいるんですが、
そのプラグインの中にメインフォームが表示されるまでNow Loading...とか表示する
小さなフォームを表示するやつがあるんですよ(一種のスプラッシュみてーなもん?)
で、そいつは小さいフォームのペイント処理の中でちょっとした描画をやってる関係で
ペイントメッセージ(WM_PAINT?)を処理させる必要があるんですね
で、その小さなフォームを呼んでいるとこ(プラグインの本体クラス)で、件の
Application.DoEventsをかましているってワケですよ
そしたらなぜか知らんのですがメインフォームの野郎が表示されやがるんですよ
(メインフォームの表示メッセージまで処理されてる?)
小さなフォームはメインフォーム表示を判断して消えることになってんで
仕方ねーなーってことでメインフォームをVisuble=falseしてるんですよ
でも表示処理の中でfalseすんのもどーかなーってことで相談した次第であります
で、どうなんですか?
やっぱfalseはまずいですかね?
実際の動きはまあまあ良いんですが、理論的にダメなら次バージョンでどーにか
別手段を考えようかなーって思ってるんですが・・・
411 :
デフォルトの名無しさん :2007/04/08(日) 20:54:48
あ、ちなみに、Visible=falseしてるのはApplication.DoEvents()の前です 同じプラグインの本体クラスの中で親フォームいじくってやってます (オブジェクト指向的にも問題あり?元々VC++ユーザなんで分らんです)
>>410 冗長な割には結局何がしたいのか要領がつかめない文章だね。
最終的にどういう動作を「お望み」か、それを書こうよ。
誰もエスパーじゃないことが理解できるのなら。
413 :
デフォルトの名無しさん :2007/04/08(日) 20:59:45
一応言っておきますが、趣味プログラミングです (業務中じゃC#なんて絶対使わねーし)
414 :
デフォルトの名無しさん :2007/04/08(日) 21:01:33
>>412 メインフォーム表示前に小さななフォームがちゃんと描画された状態で
表示されれば問題なしです
あ、ちなみに、文字表示にラベルとか使うのはナシですよ
はぁ?
つまり設計ミスだろ
>>402 IPCってぐらいだから、SystemV IPCのメッセージキューと共有メモリじゃないのか?
アプリのメインフォームのコンストラクタでプラグインをロードするって設計が腐ってるんだよハゲ プラグインを管理するクラスでやれよハゲ
419 :
デフォルトの名無しさん :2007/04/08(日) 21:09:26
ってか、俺が何をどー作ってるかなんてどーでも良いんですよ :-( 肝心なのは質問の部分ですよ フォームの表示中(ロード処理)の中でそのフォームの Visibleがfalseになるのはマズい?ってことなんですよ Visibleをtrueに戻さなくても勝手に表示されるってのも気になりますがね この辺の仕組みを知ってる人は教えて下さい
DoEvents を Load で呼び出すのが拙い
そうだね、プロテインだね
今日もにぎやかだな
423 :
デフォルトの名無しさん :2007/04/08(日) 21:25:36
>>420 えー、でもさ、そうしねーとペイントできないじゃん
他にペイントさせる手段があるなら教えて下さいよ
だが断る
425 :
デフォルトの名無しさん :2007/04/08(日) 21:36:33
ケチだなー :-(
427 :
デフォルトの名無しさん :2007/04/08(日) 21:42:57
もしかしてVC++のInvalidate+UpdateWindowみたいなのがあるってこと?
もう帰れよ
430 :
デフォルトの名無しさん :2007/04/08(日) 21:47:17
知っ、役に立たん連中だ もういい、自分で考える
<お宅>は退室しました
<お宅>.Visible = false;
<お宅>.Dispose();
GC.Collect();
お宅 <お宅> = new お宅(); GC.SuppressFinalize( <お宅> );
437 :
デフォルトの名無しさん :2007/04/08(日) 23:02:25
??? 描画したいだけなら Refresh() 呼ぶだけで良いんじゃね?
>>437 RefreshはoverridableなのでInvalidate, Updateで
439 :
デフォルトの名無しさん :2007/04/09(月) 00:20:24
??? overridable だと何か問題あったっけ?
440 :
395 :2007/04/09(月) 01:00:09
>>398 トンクスです!
リモーティングに興味しんしんです。
さっそくやってみます。
>>439 動作を変えられる。つまりRefreshは描画のみの意味ではなくて
もっと抽象度の高いメソッド。標準動作で描画なので勘違いしている
人が多いが。
例えばWebBrowserコントロールだと再読み込みとなる。
この場合、「画面を描画してくれ」の意味で呼ぶのだから(Invalidate),
Updateが正解。
442 :
デフォルトの名無しさん :2007/04/09(月) 03:59:33
ある関数で、クラスの型(System.Type) を受けとっています。 この型を元に、そのクラスの static なメソッドを実行したりすることはできるでしょうか? こんなクラスと class testclass { public static string method1() { return "test"; } } こんな関数を用意して、 string testfunc(System.Type t) { return t.method1(); // こんな風に、t のクラスの static メソッドを呼び出したい } 呼び出しはこんな感じ string result = func(typeof(testclass));
>>442 public void test(Type t) {
MethodInfo method = t.GetMethod("test2");
if (method.IsStatic) {
method.Invoke(null, null);
}
}
public static void test2() {
Console.WriteLine("月曜日が襲ってきます");
}
444 :
442 :2007/04/09(月) 04:32:52
月曜日が問題
>>414 亀レスだけど、プラグインの開始処理は↓のようにメインフォーム作成前に
やるのじゃ駄目なの?
[STAThread]
static void Main() {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
// プラグインの開始処理
.......
Application.Run(new Form1());
}
なんでIntPtrってconst宣言できないの?
リテラルがないから。
449 :
デフォルトの名無しさん :2007/04/09(月) 17:44:03
他の特定のアプリケーションのウインドウがアクティブ/非アクティブに なったときにある処理を行いたいのですが、 他のアプリケーションの状態を取得したりイベントにすることはできるのでしょうか。 FW2.0 WinXPです。
>>447 そんなときは readonly static。
>>449 ぐぐれ: サブクラス化 NativeWindow
え
か
454 :
デフォルトの名無しさん :2007/04/10(火) 14:16:06
メインフォームからスレッドを作成して、別スレッドで File.Copy を実行中、thread.Abort(); してもCopyが完了 するまでthread.Join()から抜けてきません。 大きなサイズのファイルのとき終了までフォームが固まります。 File.Copyを途中でばっさり完了させることはできないでしょうか?
もっと低級な方法で実装するしかないだろうな。
プロセスを分けてみるとかはダメかね?
Win32 API の CopyFileEx を使って、中断可能なファイルコピーを実装する。
で、そのコールバック関数の中で、CurrentThread の ThreadState が AbortRequested だったら PROGRESS_CANCEL を返すようにする、ではダメかな。 試しにコード書いてみっか。
入出力処理をスーパバイザに要求してた処理が終わるまで OSの待ち行列にプロセスが入るからだろ? 一時ファイル作成して最後にマージする処理に変えるとか 考えた方が良いんでないか?
演算子のオーバーロードを実装するとき、 public class Counter { int i; public Counter( int i ) { this.i = i; } public static Counter operator ++( Counter c ) { Counter ret = new Counter(c.i + 1); return ret; } } という風に、一度新しいオブジェクトをnewしてからreturnするのが通例なようですが、 なぜc.iを直接書き換えると駄目なのでしょうか?
>>460 通例なようですがって、
classでそれやったらもとのインスタンスと別物になっちまうだろが。
structならそれでもいいが。
462 :
461 :2007/04/10(火) 15:41:59
補足 「それやったら」って、newすることね。
>>460 直接書き換えるとまずい例としては
hoge = counter++ が正しく処理されない。
464 :
460 :2007/04/10(火) 16:55:52
レスありがとうございます。
>>461-462 別物になってしまうから、なぜnewしなければならないのかわからないのです。
>>463 ホントだ。
やってみたら、できなかった。
なんで?
465 :
454 :2007/04/10(火) 17:22:08
みなさんありがとうございました。 とりあえず早急に対応したかったので FileSteamで、ReadOpenとWriteCreateして256Kbyteバッファで ちまちまコピーして、ThreadAbortExceptionでCopy中なら、 rw close,途中ファイルdeleteという実装で逃げました。 速度的にどうかという検証はあとでやることにして・・・
最終更新日とかセキュリティ情報とかのメタデータが保存されないことの方が問題な気が。 まあそういう情報がどうでもいいファイルならいいけど。
467 :
454 :2007/04/10(火) 18:04:12
>>466 はい、それは必要だったので、コピー完了してclose後、
Creation,Access,WriteTimeをFile.Get... してFile.Set... という
段取りで対応しました。
サブストリームとか気になるな まあ、それでいいんならいいんだが。
469 :
454 :2007/04/10(火) 18:13:02
ありがとうございます。だんだん心配になってきますがw 通常のファイルだけを扱うので大丈夫だと思います。 サブストリームの名前もしらなかったくらいなんで・・・
16進数で表記されている数を10進数に変換したいのですが、 Convert.ToInt32を使えばできるそうなのですが、いまいち使い方が よく分かりません。どなたか教えて下さい。
int i = Convert.ToInt32("2A", 16);
指定した基数での数値の String 形式を等価の 32 ビット符号付き整数に変換します。 パラメータ value:数値を含んでいる String。 fromBase:value 内の数値の基数。これは 2、8、10、または 16 である必要があります。 どこをどう読んだら分からんのか分からん・
基数を基教と読んだ…
読んだまんまだと思うけど、分からないならInteger.Parse使えば? おまけに、確かこっちの方がパフォーマンス10倍ぐらい良かったはずだよ。 なんで同じことするのにこんなにパフォーマンス差があるのか不思議なんだけど。
ごめん、Int32.Parseだね。 最近仕事でVBばっかりだもんで
うろ覚えだけど、 16進HEX文字、数値の相互変換、 プロファイラ使って性能対策したとき、 結局、statick readonlyの配列かHashで256ケース用意して昔ながらのindex変換したほうが速かったような 標準のParseメソッドは、 多言語対応とかでCharacterSetの変換とかでもやってるのかな?
16進文字列の数値変換がボトルネックになるってのもレアケースだと思うがね
>>476 そりゃindexで変換するのが速いのは速いだろ。
そこまで求めることがあるかどうかってだけで。
いやー例えば計測機器とか簡単な機器の制御なんかではアスキーでデータ送受信したりするわけで、 一台相手ならどうということはないが複数台になるとマズい処理だとCPU時間喰いまくって よろしくないんだよ。
いきなり語りださなくても…
>>476-478 それはないと思うけどね。
Hex => Binなんて普通にニブルごとに引き算して変換した方が絶対早いと思うよ。
482 :
476 :2007/04/11(水) 00:27:17
>>479 同業者?
シーケンサーとかメモリマップドIOな機器とやりとりするとなると、バイナリーデータの通信になるから、
ログ出力にHEXダンプとかよくやるよね。
うちの場合は、セッションとかコネクション管理はUNIX鯖いれるけど、
GUIとか紙媒体扱うとこはWindowsだね〜
483 :
デフォルトの名無しさん :2007/04/11(水) 02:10:48
C# に限った話ではないかもしれないが、無関係ではないので質問 Visual Studio に標準で付いているアイコンとかあるじゃん カット、コピー、削除とかいった標準のやつ あとフォルダのアイコンとかもあるな ああいったのってさ、無断で使っても良いのかな? 商用/非商用とかでも何かあるのかな?
VisualStudioImageLibrary.zip のことか?
すみません。 フォームのサイズを変更したときなどにコントロール内の文字がチラつくのですが チラつきを防ぐにはどうすればよいのでしょうか?
指で押さえる
リサイズ中目を瞑る
C#やめる
ここは俺に任せろ!!
ふっ、お前にだけ良い格好させられるかよ!
>>486 同じことを文面変えていろんなところで聞いてないか?w
だからそんなくだらないことは気にしないのが一番だと思うが、
どうしてもと言うならSetStylesでダブルバッファリングを有効にした上で
全部自力で描画すればいいんじゃない?
っていうか、そんなにちらつきが気になるコントロールなんてあったかなあ。。。
サイズ変えてる間は画面真っ黒にしとけばいいんじゃね
もしかしてFillとかにしてる? もしそうだったらAnchorをTop, Bottom, Left, Rightにしたら直るかも
Contorl.FlickerEnable=false;
497 :
デフォルトの名無しさん :2007/04/12(木) 23:31:15
コンテキストメニューにショートカットキーを設定するのって変? 例えば「検索(&F)」ってメニューに Keys.Control | Keys.F を設定って感じで
変
>>493 多分ラベルやボタンが100個ぐらいあるんだよ。
>>486 使ってる専ブラのサイズゆっくり変えてみな。
タブのあたりちらついてないか?
500 :
デフォルトの名無しさん :2007/04/13(金) 00:02:17
>>498 じゃあさ、リッチテキストボックス上で Ctrl+F が押されたら、
コンテキストメニューにあるのと同じ検索画面を開きたい場合はどうすれば良いの?
いちいちキーイベントを拾って自分で判断するの?
どこかにwindowsの動作のルールというか、作法書いたページがあったような…
502 :
デフォルトの名無しさん :2007/04/13(金) 00:54:44
どうすれば良いのか教えれ いや、教えてください先生
なんでgoogle先生に聞かないでこんな所で聞くんだろう
逆google八分でもしてんだろ。
505 :
デフォルトの名無しさん :2007/04/13(金) 01:11:33
google 先生に嫌われているからです 俺が質問しても遠回しにしか回答してくれません しかも回答が間違っている場合が多いです やっぱり人間の先生が一番です
いちいちキーイベントを拾って自分で判断する。 グローバルで効かしたいときはFormのProcessうんちゃらKeyメソッドを オーバーライドしたような
508 :
デフォルトの名無しさん :2007/04/13(金) 01:49:58
FormのLoad処理中にそのFormのTopMostをtrueにすると タスクバーが表示されなくなるのですが、これは.netのバグですか? 別のウィンドウを選択するなどして一度Formをアクティブではなくして それからFormを選択してアクティブにすると表示されます ShowInTaskbarはtrueになっていることは確認したのですが なぜそうなるのかは分かっていません
初心者のうちから処理系のバグとか言ってると、ろくな大人にならない。
-質問- 初心者用のC#のお勧め本ありますか?
プログラミングC# 第4版じゃオラー!
>>500 Windows95のガイドラインだと、インターフェイスを簡潔にする目的で
ショートカットキー(Ctrl+Fとか)はコンテキストメニューには表示しない
ことを推奨してます。たぶん。XPやVistaでも変わってないかどうかは謎。
Ctrl+Fはあくまでメインメニューの[編集(E)]-[検索(F) Ctrl+F]が拾って
処理します。そこでActiveControlとかから動作を判断すればよい。
え?メインメニューがない?それは困った。
514 :
500 :2007/04/14(土) 01:58:40
ってことはさ、メインメニュがない場合さ、 private void richHoge_KeyDown(object sender, KeyEventArgs e) { if (!e.Control) { return; } switch (e.KeyCode) { case Keys.F: if (this.findForm != null) { if (!this.findForm.IsDisposed) { this.findForm.Activate(); return; } this.findForm = null; } this.findForm = new FindForm(this.richHoge); this.findForm.Show(this); default: break; } } ってな感じで KeyDown イベントで対応するしかない?
515 :
514 :2007/04/14(土) 02:07:45
あと、イベントハンドラについて質問 hoge..Shown += new EventHandler(this.Hoge_Shown); hoge..Shown += new EventHandler(this.Hoge_Shown2); ってやってみたら2つの関数が共にキックされたんだよね 驚きももの木ってやつで興味津津 でね、疑問に思ったんだけどさ、コレっていくつまで追加できるの? 通常は1つか2つだろうけどさ、インプリの仕方によっては10とか 20とか50とか追加したい場合あるよね (プラグインとか使う場合かな?) 100以上でもできますかね?
試せ
517 :
デフォルトの名無しさん :2007/04/14(土) 02:30:09
とりあえず5つまで動いくことを確認した ま、動かなくなったら考えるってことでいいや ってか KeyDown の方の質問に回答プリーズ おながいします
すげーな。 今時の子は「携帯電話っていうの使ったら、離れた人とお話できたよ!」 とかいってびっくりしちゃうんだ。
全然例えになってなくてワロタ
520 :
デフォルトの名無しさん :2007/04/14(土) 03:35:55
>>518 今時の子て・・・おま、俺は30超えてるって
頭は子供
メインメニューを普通に作って非表示にしとけばいい。
523 :
デフォルトの名無しさん :2007/04/14(土) 19:21:14
特定のコントロールの特定のイベントを発生させるにはどうすれば良いですか? 例えば、ボタンのClickイベントやテキストボックスのKeyDownイベントなどです (もちろんgoogleで検索してみましたが、良い情報が見つかりませんでした)
一般的にはない。 継承してOnXxxを呼ぶか、GUI関連のイベントなら対応するようなメッセージを投げるか。
526 :
デフォルトの名無しさん :2007/04/14(土) 20:18:57
っていうか、「イベントを発生させる」って問題意識が そもそも勘違いの産物だと思う。8割方。 筋の悪い初心者にありがちな勘違いなんだよねこれ。
まあクリック程度ならメソッド作るの面倒くさいときとか PerformClick()とかあるし、やっちゃうけど。 テキストボックスのKeyDownってのは頂けないような。 必要な状況が想像できない。 FocusしてTextプロパティを設定すれば済むんじゃ?
529 :
デフォルトの名無しさん :2007/04/14(土) 20:45:43
>>528 コピーとか元に戻すとかの機能を実装したポップアップメニューを作りたかったのです
テキストボックスにCtrl+CやCtrl+Zを投げることができれば、Windows標準機能を利用してできるかなと考えたのですが間違いでしたか
Copy()とかUndo()とかを使う手も考えたのですが、それだとWindows標準のと本当に同じなのか不安でしたので・・・
530 :
520 :2007/04/14(土) 20:49:31
>>522 そこまでしなくちゃできんもんなんだな・・・
じゃあなんかすっきりしないけど KeyDown でやっとくよ
トンクス
ほら勘違いだよいわんこっちゃない。 イベントなんて何の関係もない話じゃないか。
532 :
デフォルトの名無しさん :2007/04/14(土) 20:52:30
>>531 KeyDownイベントに乗せてキーを送ろうと考えたんですよ
それ以外にキーを送る手段があるのですか?
イベントっていうのはコントロール「が」他のオブジェクト「に」対して何かを通知するためのもの。 コントロール「に」他のオブジェクト「が」何かを命令するためのものじゃないでしょ。
KeyDownイベントに乗せて送っても、 届くのはあなたが設定したKeyDownイベントのハンドラだけ。 TextBox自体には届かない。 そこんとこよろしく
なんかレスが交錯してるような
>>529 Copy()とかUndo()はWM_COPYとかEM_UNDOとかを投げてるだけだよ
537 :
デフォルトの名無しさん :2007/04/14(土) 21:55:03
>>509 マジっすか?
もしかしてVistaでやってるのが・・・いや、初心者が処理系のせいにしてはいかんのでしたね
どうにも解決方法が見つからないので悩んでおります
プロジェクトうp
539 :
デフォルトの名無しさん :2007/04/14(土) 23:03:28
>>538 それはちと厳しいですね。
FormのLoadの中で設定ファイルを読み込む処理をしてまして、
それをもとにFormのTopMostや位置、サイズをセットしてるだけなんですよ。
ブレーク張ったりコメントアウトしたりしてやってみた結果、
TopMostをセットしているところが原因だったという次第です。
はぁ、何がいけないのかさっぱりさっぱり。
とりあえず、書いた部分だけでも張ってみたら?
541 :
デフォルトの名無しさん :2007/04/14(土) 23:22:31
C#でダブルバッファリングってどーやるの? JavaだとBufferStrategyで一発なんだけど
>>539 スケルトンから、
> FormのLoad処理中にそのFormのTopMostをtrueにする
だけのコードを書いてみたら?
544 :
デフォルトの名無しさん :2007/04/14(土) 23:47:06
>>543 おう、そうだよね
自分で調べるのは常識だよね
スマンかったYO
545 :
デフォルトの名無しさん :2007/04/14(土) 23:52:23
>>542 やってみました。
そしたら特に問題はなかったです。
益々今の現象が不思議で仕方がなくなりました。
明日情報処理試験だというのにこれが気になって気になって・・・
諦めます(両方とも)。
両方諦めてどうするw
547 :
デフォルトの名無しさん :2007/04/15(日) 02:25:48
「元に戻す」「やりなおし」「切り取り」「コピー」「貼り付け」「削除」 これらには標準的なアイコンが存在すると思いますが、 どこで手に入れることができますか? またそのアイコンを使ったプログラムを無断でフリーソフトとして 公開してしまっても著作権違反にはならないでしょうか?
>>547 著作権違反云々の前に、とりあえず、マルチはマナー違反になるってことを覚えておこうな。
C++→C#へ構造体を送信したい為、以下のコードを書いたのですが 上手くいきません。ご教授お願いします。 ====C++送信側==== typedef struct Status { int Hp; int Mp; int Sp; }Status; Status s; s.Hp = 101; s.Mp = 800; s.Sp = 505; hWnd = FindWindow(NULL,"C#受信側"); PostMessage(hWnd, 0x8101, 0,(LPARAM)&s);
====C#受信側===== private struct Status{ public int Hp; public int Mp; public int Sp; } protected override void WndProc(ref Message m) { switch(m.Msg) { case 0x8101: Status s = (Status)m.GetLParam(typeof(Status)); MessageBox.Show(m.LParam.ToString()); txtHp.Text = s.Hp.ToString(); txtMp.Text = s.Mp.ToString(); txtSp.Text = s.Sp.ToString(); break; } base.WndProc(ref m); } ====結果==== txtHp.Text = 1244916 txtMp.Text = 1 txtSp.Text = 1360384
Marshal.PtrToStructureとか調べれば良いんじゃないか?
s = (Status)Marshal.PtrToStructure(m.LParam, typeof(Status)); にしても上手くいきません>< 何がおかしいんでしょうか・・・
>>550 いやな予感がするんだが別プロセスだったりする?
だったらポインタはプロセス固有なので渡すの(原則)無理だし
VistaだとWM使った通信はややこしい面があるので別の方法を
推奨。
…まぁこんなこと基本中の基本なんで違ったらごめんね。
554 :
553 :2007/04/15(日) 10:02:40
追記。まぁそれ以前にスタック領域のアドレスポインタをPostMessage するなよなぁと言う気もする…
>552 デフォルトではC++は4byteごとでC#は8byteごとに配置されるからずれる。
そのアラインメントの話ってMSDNライブラリの誤記だった気がしたけど、違ったかな 実際はデフォで4byteだったような
初心者のおれも知りたい。Packのデフォルト値って32bit環境だといくつなん? ↓こんなん関係ある? MessageBox.Show( Marshal.SizeOf( typeof( TEST ) ).ToString() ); unsafe { MessageBox.Show( sizeof( TEST ).ToString() ); } [StructLayout( LayoutKind.Sequential )] struct TEST { public int i1; public int i2; } /* どっちも8 */
ああ、なんか勘違いしてるっぽ
構造体のIntPtrを取得するにはどうすれば良いですか? できればスタック上のものを取得したいです。
意味不明です
>できればスタック上のものを取得したいです。 ・・・
>>549-550 俺もアライメントかなーと思ったんだけど、
全て16進にしてみても何も共通点がないんだな。
前の人が言ってるように、別プロセスとか、
あるいはアパートメントスレッド同士のように、
全く別のアドレスを指してることはあるかも。
ストリームで解決したらあかんか?
>>562 別プロセスが濃厚(FindWindowとかやってるし)かと思うが、
ローカルにとってPostMessageしているのを見るとこれが
原因の可能性も。
>>549 ==
>>559 だとしたらもう絶望的に駄目駄目なので
お前じゃ無理を結論とするのがよかろうかと。
メッセージの0x8101てなんだっけ。WM_COPYDATAが安全ではないかい。
WM_APP + 0x101
549-550です。皆さんの助言により SendMessageに変えWM_COPYDATAで解決しました。 ===送信側=== COPYDATASTRUCT cd; cd.dwData = 0; cd.cbData = sizeof(s); cd.lpData = &s; SendMessage(hWnd, 0x4a, 0,(LPARAM)&cd); ===受信側=== COPYDATASTRUCT cds = (COPYDATASTRUCT)Marshal.PtrToStructure(m.LParam, typeof(COPYDATASTRUCT)); Status s = (Status)Marshal.PtrToStructure(cds.lpData, typeof(Status));
C#でゲームを作りたいと思いManaged DirectXに関するサイトなどを探していたのですが あるサイトでXNAという開発環境があることを知りました。 そこで質問なのですがこの二つにそれぞれメリットがあるとすればどういった所なのでしょうか。 ご教授お願いします。
MS 的には、MDX の後釜のつもりで XNA 作ってるんじゃない。
比較も糞もMDXアボーン→XNA Frameworkなので、ほとんどを切り捨てて いるもののMDX3.0 = XNA Frameworkみたいなもの。
DirectXのthin wrapperが欲しかっただけなのに・・・
>>545 今日が試験だって事を忘れてたうっかりさんがココに
毎日スレ覗いてたのに、たまたま昨日だけ見ずに寝たら・・。
ソフ開受けれなかったよ。・゚・(ノД')・゚・。
オレなんて受験票なくしたぜ!
基本情報の時に「何でこんなに空席があるんだ?」と思ってたら、自分も似たような事になるとはなぁ 受験票、PC横に置いてたのに!
>>568 なるほど…MDXがコケたので後継を作った、という事なんですね。
では、XNAの入門書や解説サイトでお勧めのものはありますでしょうか?
重ね重ね申し訳ないですがお願いします。
┗(^o^ )┛ ___ ┗┃ ヽヾ\ |←SW| ヽ\\  ̄ || ̄ 三二= || 三二=  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄| | ̄ ̄ ̄ ̄ ∧∧∧∧∧∧∧∧∧∧∧ 午前 午後1 ___ |←SW| ミエタ!  ̄ || ̄ ┗(^o^ )┓三 彡 || ┏┗ 三 ∠  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄| | ̄ ̄ ̄ ̄ ∧∧∧∧∧∧∧∧∧∧∧ 午後1 § ティウンティウンティウン § | | .§ | | ___ | | |. §◎| | 午後2 |←SW| __◎§__◎  ̄ || ̄ |____ ◎_ _| || ▼◎▼ ▼◎ ▼◎  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄| | ̄ ̄ ̄ ̄ ̄ ∧∧∧∧∧∧∧∧∧∧∧
>>574 入門書はない。日本語の解説は徐々に増えてきたけど、まだまだ足りない。
誰かに聞いても教えてもらえない事を覚悟する必要がある。
それと、英語アレルギーがあるなら諦めた方がいいと思う。
>>575 今回も午後2が鬼門だったのか。
なんつうかXNAはXBox360用な臭いを感じる
箱コントローラ以外使えないし、終わってる
>>576 VS05EEベースって事はかなり最近ですから、当たり前といえば当たり前ですよね…
英語は余り得意でないので暫く様子見としてMDXを使ってみることにします、ありがとうございました。
>>577 ,
>>578 箱コントローラー以外使えないとはDirectInput(相当)で箱コントローラーしか認識しないということですか?
>>579 というかコントローラとかは本家DirectX準拠なので。
本家も基本的にDirect3D以外は終了だから。コントローラは
XInputという新しいやつになる。X-Box360コントローラ専用。
まぁ、DirectInputは自由すぎて微妙なところも確かにあったし。
こういうマルチメディア周りは基本的にVistaで一新されるから、
今はちょうど移行期になってしまっていて、初心者には辛い
ですな。Direct3Dも名前が一緒なだけで大幅に変わるし。
XNAの目標が「玄関開けたら5分でゲーム」らしいんで、初心者向け
も目指してはいるんで、「出来る!XNA」とか出るらしいんでそれで行けば
いいんじゃない?確かに驚くほど簡単なライブラリではあるので。
長くなったけど最後に一つだけ。
ttp://higeneko.com/diary.php ttp://blogs.msdn.com/ito/ 今のMSの情報は開発者blogが多くなってて、XNAチームには日本人も
いて英語が苦手ならとりあえずここを。あとはNyaRuRu氏とかを適当に。
>>580 ありがとうございます。
XNAについて殆どわかっていなかったので大変参考になりました。
これからの技術ということなので定期的に調べていきたいと思います。
>>581 あ、確かにそうでした。
Vista導入でDX関連はかなり変更されていたんでしたね…
尚更、MDXでやろうかなって思います…w
NyaRuRu氏は時々拝見させて頂いてます。
他の方のブログも定期的に見るようにしますね
それにしても「出来る」シリーズでプログラミング言語とは凄いですね。
本のレベルがそういった域に来てるのかそれだけ言語が簡単なのか…
ともかく、遅くまでお答え頂きありがとうございました。
XNAは結構厳しい動作環境を要求するので注意 ゲームする奴だったら大体大丈夫だろうけど
System.Collections.ObjectModel.Collection<T>みたいに 動作をカスタマイズできるようになってるIDictionary<T>はないの?
System.Collections.DictionaryBase<,>
うそをつくなw
588 :
デフォルトの名無しさん :2007/04/17(火) 20:29:13
初心者スレの方で聞いた方が良いかもしれませんが 教えてください。 TabControlにRichTextBoxを描画していまして 新たにTabPageをAddしてRichTextBoxをそのTabPageにAdd したとき、focusをそのRichTextBoxに設定してるんですが 2つ目以降のTab生成時そのTabを前面に出るようにするには どうしたら良いんでしょうか。 分かりづらい質問だと思いますが、どなたか教えてください。
SelectedTab
590 :
デフォルトの名無しさん :2007/04/17(火) 23:08:36
キーコンフィグ用のアプリを作成しているのですが ただのフォームアプリなのでできればDirectXを呼びたくないのですが DirectInputを用いずにゲームパッドのキーコードを取得する方法はないでしょうか。
592 :
デフォルトの名無しさん :2007/04/18(水) 01:31:56
.NET1.1とC#で勉強を兼ねてワードパットのようなモノを作っているのですが、 RichTextBoxで一般的なWindowsアプリにあるようなダブルクリックによる 単語選択ができません。 トリプルクリックによる行選択は出来るのですが、ダブルクリックでは1文字だけが 選択されてしまいます。 また、ドラッグによるテキスト選択を行おうとすると、カーソルの彼方の方まで選択 してしまったりと、謎の挙動で困っております。 このような場合は、どのようにしたらいいのでしょうか?
>>591 .NETにそのものの機能はない。
joyGetPosとかRawInputとかでぐぐる。
基底クラスのコンストラクタから呼び出されている仮想メソッドがあって、 その仮想メソッドをオーバーライドして動作をカスタマイズしたいんですが そのメソッドから派生クラスのコンストラクタ引数に間接的にでもアクセスすることって可能でしょうか?
それが基底クラスのコンストラクタ引数でもあるなら可能。出なければミリ。
>>594 > 基底クラスのコンストラクタから呼び出されている仮想メソッドがあって、
> その仮想メソッドをオーバーライドして動作をカスタマイズしたいんですが
> そのメソッドから派生クラスのコンストラクタ引数に間接的にでもアクセスすることって可能でしょうか?
質問の意味を勘違いしてるかもしれないが…
派生クラスのコンストラクタで、引数をインスタンス変数に記憶しておけばいいのでは?
↓こんな感じで。
abstract class BaseClass {
protected abstract void Foo(int x);
}
class DerivedClass {
private int mArg;
public DerivedClass(int arg){
mArg = arg;
}
protected override void Foo(int x){
return x + mArg; // この辺は適当な処理にあてはめて。
}
}
>>593 お返事ありがとうございます!
ただ、キーの割り当てが一つとは限らない上
キーボードとパッドを同時に設定する場合もあるので
キーボードはKeyDownハンドラ内でフォーカスもってるコントロールを調べて
そこに対して処理、という風にしていたのですが
joyGetPosはイベント化できないので少し悩んでいます…。
>>596 先にベースのコンストラクタが呼ばれるからミリ
>>597 RawInputでぐぐったらWM_INPUTっての出てこなかった?
600 :
596 :2007/04/18(水) 14:51:16
>>598 ああ。そうか。
よく考えてみればそうですね。了解。
>>594 ふと思ったんだけど、オーバーライドしたメソッドでやりたい処理を
派生クラスのコンストラクタのなかでやったら駄目なの?
>>599 わ、ごめんなさい、joyGetPosでの認識が簡単だったのでそっちでばかり考えていました…。
RawInputでWM_INPUT取得するサンプルソース、すぐに見つかりました。
なんとかなりそうです、ありがとうございました。
複数のボタンのTEXTプロパティを読み出して別のテキストボックス内に書きこみたいんですが ボタンのハンドラを一つにしてsenderの情報にTEXTが入ってるのを利用しようと思ったんですけど 欲しいのはコントロールのTEXTプロパティだけなんで他の情報が邪魔です。 そこで、stringに代入してSubstringを使おうと思ったのですがうまくいきません。 こういうときはどうしたらいいでしょうか、お知恵をお貸しください。
普通にsenderをキャストしてTextプロパティとればいいじゃないか。
string substr = (string)sender; ということですか? これを行うとこのコードが実行される所でそのまま落ちてしまい、デバッカが 型 'System.Windows.Forms.Button' のオブジェクトを型 'System.String' にキャストできません。 とエラーを出してしまいます。。
string s = ((Button) sender).Text;
C#で.NET Remotingについて質問です クライアントプログラムでライブラリをロードし, 以下のコードを実行しました TcpChannel tcc = new TcpChannel(); ChannelServices.RegisterChannel( tcc, true ); Hoge obj = ( Hoge )Activator.GetObject( typeof( Hoge ), "tcp://localhost:4649/Hogetest" ); としたとき,GetObjectのラインで以下のエラーが出ます RemotingExceptionはハンドルされませんでした。 プロキシを非バインド型で作成しようとしています。 エラーメッセージでググってもヒットせず, StackTraceを見たところ,RemotingServices.Unmarshal(Type classToProxy, String url, Object data) のエラーらしいのですが,それ以上がわかりません 何をしたら解決できるでしょうか?
608 :
デフォルトの名無しさん :2007/04/18(水) 19:44:59
>>606 なるほど!自分の欲しいものが貰えるようにキャストすればいいんですね。
ありがとうございました
609 :
デフォルトの名無しさん :2007/04/18(水) 20:07:11
>>602 少し教えて貰いたいんですがパッドの情報を取得するUsagePageとUsage値は何にしました?
1と2でマウスデバイスを指すのはわかるんですがパッドを取得するときはどうするんですか?
610 :
607 :2007/04/18(水) 20:22:05
すいません,自己解決しました System.MarshalByRefObjectを継承していませんでした・・・
611 :
594 :2007/04/18(水) 23:30:56
遅レスになりました。
>>595 やっぱり無理なんですね。どうもありがとうございました。
>>608 その理解はおかしいぞ
ここではsenderにはButton型のオブジェクトが入ってるはずだから
それに合わせてキャストしてるんだよ
>>603 >欲しいのはコントロールのTEXTプロパティだけなんで他の情報が邪魔です。
ここで言っていることが怪しい
キャストしてないからオブジェクトのタイプが出るんじゃないの?
キーについて教えてください。 KeyCodeの数値をキーの文字名(ESCやF1、Enter)などに変換するにはどうすればいいでしょうか? アプリケーション内部ではKeyEventArgsのままやりくりしてたのですが、 設定を保存したときに数値にKeyCodeで保存し、復元ができなくて困っています・・ ご教授ください。
意味が分からんが 保存する時に int にキャストして数字で保存してやりゃ良いんじゃね ロードする時は数値にしてから Keys にキャスト
メニューからイベントメソッドを呼んでるんだけど、イベントメソッド内で実行している内容はほぼ同じで あるメソッドにパラメータを与えて呼んでいるだけ。 メニュー項目一つ一つごとにイベントメソッドを定義するのは、無駄に感じます。 イベントメソッド自体にパラメータを与えることってできませんかね?
全部同じメソッドを呼ぶようにすりゃいいんじゃね?
>>618 その同じメソッドにたいして別々のパラメータを与えたいんです。
いやだから、同じメソッド呼ばれるようにして、どっから呼ばれたかで判断すりゃいいじゃん。
>>620 なるほど。どっから呼ばれたのはどうやって判定するのでしょうか?
EventArgs?
最初の引数に sender て名前ついてるやん。 つうか、無駄に感じる程度ならたぶん無駄じゃないよ。
どっから呼ばれたか判断して処理を分岐するんだろ?
結局メソッド分けるのと同じ。
だいたい同じ処理するメニューなんて存在するわけないんだから
メニュー項目ひとつひとつにメソッド定義するのが普通に決まってるだろ。
「無駄」って何が無駄なのか徹底的に考えてみろよ
>>617
senderになるオブジェクトのTagに引数にしたいもの仕込んでおけば。
>>623 いやコンパイラの立場にたてばどっちでも一緒だけど、
イベントハンドラを一つにまとめちゃった方が意味的にわかりやすい場合も
ないことはないと思うよ。
まあ、あんまりないのは確かだけど。
いま例を挙げようと思ってもぱっと思い浮かばないし。
例えばフォントサイズをいくつかの選択肢から選ぶようなメニューだったら1個にしたいかもね。 後から選択肢が増えたり減ったりしたとき変更が1ヶ所にまとまりそうじゃん。
メニューに関してはふつうにあると思うが。 まあTagじゃなくて拡張プロバイダとか使うと思うけどね。
628 :
623 :2007/04/20(金) 23:45:15
んなもんねぇよ。 メニュー項目自体が既に別オブジェクトになっちゃってるんだから。 たとえばフォントサイズにしたって、senderからフォントサイズをどうやって決めるんだ? 普通なら各イベントから SetFontSize(n) ってメソッド呼ぶ方法を薦めるだろうが。 結局 switch するならイベント纏める意味ないと思うのは俺だけ? Tagでいいってやつは好きにすればいいけど。
コンテナ使え
630 :
623 :2007/04/20(金) 23:53:04
ちょっとまて
>>618 が言ってるのは各イベントから同じメソッドを呼べといってるんじゃないのか?
>>620 でなんで呼び出し元の話になるのかよくわからんが。
>>621 もなんで呼び出し元を気にする必要があるのかわからん。
もうオレ逝ってきます
動的メニューならやるっしょ? 「お気に入り」を実装するとしたら。 DropDownごとにItemClickでまとめるか 各アイテム作るときに同じハンドラくっつけるっしょ
>>628 Tagとか拡張プロバイダっていってんのに
完全無視ワロタ
ToolStripMenuItemを継承して、必要な付加情報(お気に入り項目ならURIとか)をプロパティとして実装するって手もある。 俺は拡張プロバイダよりこっちの方がすっきりしてて好み。
>>628 チミは自分がコンパイラ(あるいはCPU)の目線で問題を語ってる自覚がないんじゃないの?
自分も人間の癖にw
>>633 おいらも、カスタムコントロール作る派に1票
コントロールを生でつかうよりは、
仕様に応じたプロパティを追加したりして、属性もきちんと付与したりしたほうが
いろいろ、便利じゃない?
インスタンスメソッドへの参照とGCに関しての質問です. public delegate void Handler(); public class Foo { public event Handler SomeEvent; public void DoFoo() { SomeEvent(); } } こんな感じでイベントを出すクラスFooがあるときに public class Bar { private int _attr1 = 1; public void DoBar() { Console.WriteLine(_attr1); } } こんな感じでフィールド値を使ってHandler互換な インスタンスメソッドDoBar()を持つクラスBarを作ったときに, Foo foo = new Foo(); Bar bar = new Bar(); // (1) foo.SomeEvent += bar.DoBar; bar = null; こんなコードを書いたとき,barそのものへの参照がなくなったとしても インスタンスメソッドDoBar()への参照があるので, (1)でnewしたBarオブジェクトはGCされないと考えておkですか?
まあおk
>>637 どもです.
再利用可能なイベントハンドラを用意したいんですけど,
イベントハンドラ中で使う値を変更可能にしたい場合,
上のBarみたいなクラスを用意するしかないんですかね・・.
(_attr1はコンストラクタで変更可能にする)
イベントハンドラを登録してからも変更したいならそうするしかないわな
再利用可能なイベントハンドラって何のこっちゃ、と思うのは俺だけだろうか。。
641 :
デフォルトの名無しさん :2007/04/21(土) 18:29:24
似たような処理になるイベントとかあるじゃん。 具体処理は別オブジェクトにやらせたりすれば抽象化もできるし。
まあやってることは馬鹿なことだと思うよ。
匿名メソッドって匿名じゃなくて名無しですよね?
644 :
デフォルトの名無しさん :2007/04/21(土) 23:10:42
リッチテキストボックスに自前でポップアップメニューを追加しているのですが、 同コントロールのメソッドに Delete() が無いのでどうやって実現しようか悩んでいます 現在は this.richTextBox1.SelectedText = ""; でやってますが、 一般的?なやり方はどうなのか教えてください
645 :
644 :2007/04/21(土) 23:11:18
実現したいのは選択テキストの削除です
それで問題ない
647 :
デフォルトの名無しさん :2007/04/21(土) 23:17:30
>>643 偽名やペンネームを使うだけでなく名前を秘匿することも匿名と呼ぶよ〜。
でもこういう匿名デリゲートはいやだ
delaget void <丶`∀´>(´・ω・`)(`ハ´ )さん()
>>643 言語によってAnonymousを匿名〜と訳すものと無名〜と訳すものがある。それだけ。
名無しさんがデフォルトの某掲示板は匿名掲示板と呼ばれます。 訳さなければAnonymousだし無名と匿名は日本人は区別してない。 あんまり。
>>643 ちゃんと名前のついたメソッドがどこかに自動的に作られ、それがプログラマからは見えなくなっているだけ、
なのだから、「匿名」でもいいのでは?
というか、単なる anonymous の訳語ですがな。
お前ら食いつき良すぎね?
こういうときにしか出てこないのかよおまえら
654 :
デフォルトの名無しさん :2007/04/22(日) 02:13:30
C++最高
655 :
638 :2007/04/22(日) 08:37:43
作ってるアプリでPropertyChangedイベントのハンドラが プロパティ名とそこでnew()するクラス以外同じだから そこだけ穴あけたいと思っただけです. 「new()するクラス」のほうはGenericsで穴空けられるけど 「プロパティ名(string)」の方はハンドラとしてdelegateの シグネチャが決められていると穴をあけられない状況. JavaScriptみたいにdelegateにプロパティを付加したいイメージですかね. とりあえずこんな感じに書けるような実装でおちつきますた. foo.PropChanged = new ListPropChangedHandler<FooView>("propname").Handle;
よく考えたらお前らさ、Bを経験しないで いきなりCから行っちゃったやつばっかだろ?
B...B...Brainfuck?
誰か
>>655 の言ってることわかる人いる?
俺には何を言ってるのかさっぱりわからんのだけど。。
わからん。
>>655 か俺かどっちかが根本的なところで勘違いしてる気がする。
+=だろ。
661 :
638 :2007/04/23(月) 07:35:16
既存のイベントがあるんだけど,そのイベントに登録するハンドラが 大量なわりにほとんど同じなので,最小限のパラメタ化だけしたものを みんなに再利用してほしいなぁ,という話です. 何しろnew()する型とプロパティ名だけと書き方だけ知っていれば 深く考えなくてもイベントハンドラが登録できる状況を用意したいです. (ほんとはもうちょっとパラメタ多いですけど・・) あの後考え直して,こんな感じでハンドラ作成ユーティリティメソッドを作っておいて public PropertyChangedHandler CreateListPropChangedHandler<PropViewType>(string propName) where PropViewType: new() { return delegate(object sender, PropertyChangedEventArgs e) { // new PropViewType()したりpropNameを使ったり }; } こんな感じで使ってもらおうかなと考え直しました. // fooはPropertyChangedという既存のイベントを持つクラスのインスタンス foo.PropertyChanged += CreateListPropChangedHandler<FooView>("propname");
662 :
638 :2007/04/23(月) 07:36:42
あああ,C#のdelegateってクロージャじゃないから 661のだとpropNameがおかしくなりそうだ・・・.だめぽ.
PropertyChangedEventArgsはプロパティ名持ってるだろうが。
664 :
638 :2007/04/23(月) 07:39:39
はい,PropertyChangedEventArgs.PropertyNameの値が propNameとして渡された値と同じかどうかで処理が変わるような イベントハンドラなんです.
665 :
638 :2007/04/23(月) 07:42:10
なんかもうただのユーティリティ関数用意して 無名delegateで呼んでもらえばいいやな気分・・・ 利用者の記述量と覚えないといけない文法とか注意点が増えていやだな・・・
AttachSomeEvent<TView>(TView view, String propertyName) where: TView: INotifyPropertyChanged, new(); でよくないか?型推論が利くから<>の記述もいらなくなるし。 (C#3.0だったら、そのまま拡張メソッドにも出来るな)
667 :
638 :2007/04/23(月) 07:55:54
666の意図をちゃんと理解できてるかわからないですけど INotifyPropertyChangedをimplementsしてる型とPropViewType(TView)型は別物です. INotifyPropertyChangedをimplementsしてるオブジェクトの PropertyChangedイベントを受けて,ハンドラでPropViewType(TView)を生成したいです.
668 :
638 :2007/04/23(月) 08:15:56
こういう感じのことを言ってますか? // library provider AttachSomeEvent<TView>( INotifyPropertyChanged notifier, String propertyName ) where TView: new() { notifier.PropertyChanged += delegate(object sender, PropertyChangedEventArgs e) { // new TView()したりpropertyNameを使ったりする再利用したいコード }; } // library user AttachSomeEvent<FooView>(foo, "propname"); たぶん661のコードと同じで,2回以上AttachSomeEvent()が呼ばれたあとに fooのPropertyChangedイベントが発火すると望ましくない結果になると思います. 具体的には登録したすべてのイベントハンドラの処理中では propertyNameの値は最後にAttachSomeEvent()に渡された propertyNameパラメタの値になっていると思います. (Javaがメイン言語なのでC#のdelegateはちゃんとしらないんだけど違ったかな? 「思います」ばっかりで申し訳ない・・)
やっぱり何いってるのかサッパリわからん。 処理が定型ならイベントにする必要がそもそも無いはずと思うんだけど。。
670 :
638 :2007/04/23(月) 08:22:12
> 既存のイベントがあるんだけど,そのイベントに登録するハンドラが > 大量なわりにほとんど同じなので,最小限のパラメタ化だけしたものを > みんなに再利用してほしいなぁ,という話です. イベントはすでに私以外の人が用意してますです.
671 :
638 :2007/04/23(月) 08:23:22
662とか668はクロージャとかがわかってないと意味わからないと思います.
672 :
638 :2007/04/23(月) 08:53:04
えー,非常に恥ずかしい報告です. 662や668のコードは期待通りに動くっぽいです. ちゃんとdelegate理解してなかったぽ・・・.
指定された文字列がファイル名として正しいかどうか判別するメソッドってありますか?
674 :
638 :2007/04/23(月) 09:21:56
Pathクラスのchar[] GetInvalidFileNameChar()メソッドと Stringクラスのint IndexOf()メソッドを組み合わせたらとりあえずできそうです.
675 :
638 :2007/04/23(月) 09:27:20
delegateがクロージャっぽく動いてくれないのって delegate内でforのインデックス変数とかを参照したり, foreachで要素値を参照するようなときだけかな.調べるのチカレタ
デリゲートより外側のスコープの変数にアクセスした場合
質問です。 二つのテーブルを用意して、特定の行をもう片方のテーブルに移動させるにはどうすればよいのでしょうか? 下のやり方だと table2に追加したときに 「この行は既に別のテーブルに属しています」 というエラーが出てしまいます。 DataTable table1 = new DataTable(); DataTable table2 = new DataTable(); DataColumn col = new DataColumn("aaa", typeof(string)); table1.Columns.Add(col); table2.Columns.Add(col); DataRow row = table1.NewRow(); row["aaa"] = "bbb"; table1.Rows.Add(row); table1.Rows.Remove(row); table2.Rows.Add(row);
>>675 かなじゃなくて試してから言えよ。鬱陶しいな
いや俺の方が鬱陶しいよ
いやいや俺の方こそ鬱陶しいよ
↑ どうぞどうぞ
C#で使えるAPI全部載ってる本って無いんですか? いちいちネットで調べるのイヤで。個人的に本で読むほうが好きなので。
>>678 その前に
>table2.Columns.Add(col);
で止まると思うが?
たぶんおまいが思ってるより巨大な本になると思うよ
>>685 apiって何だ?
.netフレームワークには山ほどクラスがあるけど全部読みたいの?
読むだけ無駄だと思うけどな。
えーと、Aから順に引くのか? それとも名前空間別で引くのか? オンライン以外ありえない。
>apiって何だ? すいません。なんていえばいいのかわかんなくって。 >読むだけ無駄だと思うけどな。 まじっすか・・・
ちがちが、オンラインじゃなくて、電子マニュアルとかまあそんな意味で。
windows APIだって 全部載ってる本なんてないだろ。
そもそもクラス数で数千もあるんだぞ。 1ページ1クラスっていうありえないつめ方でも数千ページいくんだぞ。
たまにc#のコントロール全部乗ってる本ないかって聞かれるけど、ないと答えてる。
それはさすがにあるんじゃないか? 俺は知らないけどさ
なければ作ればいいじゃない MSDNを全部印刷して製本Go!
>>685 MSDNダウンロードして入れてみたら?
ローカルだからネットほどストレス無いし。
うーん。そんなにあるんですか。 じゃ全部じゃなくてもかなりの数載ってるのって無いんですか? とにかくいろいろ覚えたいんです。 まず元となるもの覚えないとなんかダメな感じがして。
>697 本がいいんです。
クラスライブラリは本を読んで覚えるような類のものじゃないだろ…
>>698 英語とか習い始めるとき辞書のAから勉強するひとはいないんじゃないの?
たぶん基本的なSystem名前空間とかのクラスリファレンスが欲しいんじゃないの 英語で言うと基本英単語500みたいな
>>698 ダメな感じのままでいいんじゃね?向いてないよ
もしそんな本があったとしてもメソッドやプロパティの説明は1行ずつだと思う。 MSDNのメンバーのページのように。 そんな本が本当に必要か?
>英語で言うと基本英単語500みたいな そう。そんなかんじのが欲しいんです。 なんかどうも取っ掛かりが無くて。
じゃあvs2005についてたポスターやるよ。
>そんな本が本当に必要か? 結構そういう本好きなんです。
何の取っ掛かりが欲しいんだか。 最近死ぬほどC#関連本出だしたから好きな本選んで来いよ。
>最近死ぬほどC#関連本出だしたから好きな本選んで来いよ。 いっぱいありすぎてよくわからん。 でも確かにそうですね。やっぱ地道に探すことにします。
.NET Fx 3.5 完全マニュアル - 全メンバ サンプルコードつき 応接間の飾り物にちょうどよさそうだなw
javaの本が売れなくなったからC#に乗り換えたのかな。
週刊C#のすべて 毎週木曜発売 各号で一つのクラスについての詳細な説明とサンプルコード付き。 創刊号は整理に便利な特製バインダーがついて890円!! (通常定価1360円) デアゴスティーニ♪
創刊号はSystem.Arrayクラスあたりかな。
System.Activatorだったら誰も買わんがな。
>サンプルコードまでMSDNライブラリ(Visual Studio.NETのHELP)とそっくりそのまま >同じなのにはわが目を疑ってしまいました。 >本を置く場所に余裕があって、リファレンスはどうも紙ベースでないとやりにくいという方 >以外にはお奨めできません。 >HELPと全く同じリファレンスなど誰が購入するでしょうか? >Microsoft公式解説書には良いものが多いのに、なぜこうなってしまったのでしょうか? Helpの内容を書き改めるだけの労力はだれもかけたくない。 100%報われないのは分かっているから。
そんなもんホントに買う奴いるんかね。
個人で買うアホはいない。 よその会社で見たことはある。
社長室にでも飾るんかいな
だから威圧感出すためだけの飾りだって。 実は丸写しじゃないらしいんだが(今は知らない)そもそも人間に読める 量じゃないのでほとんどの人はわからない。
>>686 >その前に
>>table2.Columns.Add(col);
>で止まると思うが?
複数のテーブルで同じカラムの組を指定するのはまずいんですかね?
とりあえずとまりません。
>>684 >そのエラーの通りなんだけど。
一度属した行を解除するにはどうしたらよいのですか?
Removeだと思ったのですが・・・
列 'aaa' は既に別の DataTable に属しています。
おとなしくtable2.NewRow() したら?
724 :
684 :2007/04/24(火) 03:56:20
>>721 確かめてないけど、table1.Add(row) と table1.Remove(row) を消しても
table2.Add(row) でエラーでない?
ようは row = table1.NewRow() で rowがtable1に属することが決定するんじゃないのかと。
>>721 > >>table2.Columns.Add(col);
> >で止まると思うが?
> とりあえずとまりません。
うちの環境ではとりあえず止まります。
> Remove
で正しい。
たぶんやりたいことはこんな感じ?
DataTable t1 = new DataTable();
DataColumn c1 = new DataColumn("aaa", typeof(string));
t1.Columns.Add(c1);
DataTable t2 = t1.Clone();
DataRow r1 = t1.NewRow();
r1["aaa"] = "bbb";
t1.Rows.Add(r1);
DataRow r2 = t2.NewRow();
for (int i = 0; i < r2.ItemArray.Length; i++)
r2[i] = r1[i];
t1.Rows.Remove(r1);
t2.Rows.Add(r2);
イベントに登録してないってオチじゃ・・・
登録してないです VBみたいに書くだけでいいのかと思ってました
( ´ー`)フゥー...ー
C#初めて2日目でグーグル先生だけが友達なもので
Form1のKeyPreview を true にしてキーボードイベントを登録できるようにし、 KeyDownイベントハンドラを. 追加します。 これにより、ある特定でのキー入力によりテキストボックス 間のカーソル移動ができるようになり とかかいてるけどわかんねぇ やってるつもりなのにな
WebClientのUploadFileを使って鯖にファイルをPUTしてるのですが、アップロードしたファイルの日付情報をローカルと同期させる方法が分かる方いないでしょうか ヘッダに何か渡せばいいのかなと思っていますが見つけられていません ご存知の方いましたら教えてください
KeyDown += new KeyEventHandler(Form1_KeyDown); これか・・・・こんなんでずっとつまるとかあほくせぇ 本買うしかないな経費でおちないかなー
734 :
732 :2007/04/24(火) 15:15:04
すみません自己レスです。 アップロード後のファイルにPROPPATCHで後から変更する方法で対応できました。 できればUploadFile時にまとめて設定したいと思いますので、ご存知の方は教えていただければと思います。
>>733 VisualStudio2005じゃないのか?
そうだけど C#2005でわかるでしょ
わかるがキモイ
きもくてごめんね^^
J#2005とか日本の2005年大会みたいでかっこいいじゃん
そうだねプロテインだね
どんだけ〜
コンソールアプリケーションを作ってるので,Debugクラスの出力を 他の所(普通のコンソールと分離できて,リアルタイムで確認できれば何でもいい) に出力したいんだけど,どこに出すのが一番いい?
UDP
744 :
デフォルトの名無しさん :2007/04/24(火) 17:51:47
すいません、教えてください。 RichTextBox内で、シンタックス(C言語ならintとか) をハイライトで表示するようなエディタもどきを練習がてら 作ってるんですが、fontDialogを使って文字を調整すると 全部の色が黒に塗り変わってしまいます。 自分の知識不足だとおもいますが、どなたか 文字サイズだけを変える方法を知ってらっしゃる方がいれば 教えていただきたいです。
746 :
735 :2007/04/24(火) 19:43:52
吐くほど不味いか?
もうお前ふらっとスレ行けよ
あえて釣られてみる…
>>731 > KeyDownイベントハンドラを. 追加します。
とりあえず、「表示」メニューで「プロパティ ウィンドウ」。
プロパティウィンドウのなかの稲妻みたいなアイコン(イベントアイコン)を押す。
で、そのなかのKeyDownの隣にある欄をダブルクリック→空のイベントハンドラが
自働で作成されるので、そのなかにコードを書くべし。
C#でテスト駆動開発をやりたいと思っています。 参考になる本やサイトなどがありましたら教えてください。
752 :
デフォルトの名無しさん :2007/04/25(水) 07:26:17
すいません、微妙にスレ違いかもですが、Visual Studio 2005でいつの間にか空白やら タブやらが→と・で表示されるような設定になっちゃってるんですが、これを解除するには どうしたらいいんでしょうか?
Ctrl+R, Ctrl+W
754 :
752 :2007/04/25(水) 07:35:37
755 :
731 :2007/04/25(水) 09:43:45
>>749 すげー
やっぱ本買ったほうが良いですね
756 :
731 :2007/04/25(水) 10:06:41
Enterで検索かけたらなんかでてきた ありがとう
あっちいけってことか まぁForm1にかいててだめだっただけだった^^ さいなら
まあC#のイベントが初心者にはわかりづらいのは確かだと思う。 デリゲート理解してても。 最初はVB.NETで慣れた方が理解しやすいかも。 でもVB.NETから入ると、なんでC#にはHandlesに相当する機能がないんだ、 みたいな体になるかもしれんが。
VB.NETは中途半端だからやめた方が良い 素直にC#かC++にしておけw
C#2.0なら textBox1.Enter += textBox1_Enter; みたいな書き方も可能だからそんなに難しくないと思うけどなあ
俺はVB6.0から来て、VB.netがなんか微妙だったからC#やってみたらはまったなぁw
VB.netなんてMSがVBユーザ捨てない為、無理やり考えたもんでしょ・・・
アセンブラ(Z80,MC68000)→C言語(UNIX系)→VB古いの→C++(UNIX系)→java(JDK1.0〜)→VC++MFC→C#.NET(VS2005) っと渡り歩いてきた感想からすると、結構、最強言語かもしれないと思ったりする。 ただ・・・、性能だすのがなかなか、癖あるね〜 javaとは全然違うけど、JNIとかと比べたら、unsafe,fixedはわかりやすいし、昔のinline assemblerと比べたら、 はるかにエレガントだと思うけど・・・ ハイエンドマシンへの対応状況がネックかもしれないね。 MIPS、SPARCプロセッサ、PowerPCのSMP構成とか、使ったこと無いけどCELLとか、とか、とか・・・ でも、そのうち、Xeonのクラスタリングが追い抜くのかな?
MDXのDirectInputを用いてキーボードの情報を受けるプログラムを作っているのですが 半角全角キー、CapsLockなどの状態をトグルで扱うようなキーを入力すると ずっとそのキーが押されっぱなしになった状態になります。 押されたかどうかを判定したいだけなので代替手段があるのでしたら教えていただけませんか?
C#はあっさりサラダでおいしいけど、それだけで腹を満たすのにはちょっと難ということか
健康にはよさそうだな
>>766 うわ、オレの経歴かと思うくらいそっくり…w
そういうオレも現時点では限りなくC#最強だと思う。特にWindowsなら。
パフォーマンスがどうのとかは、最近のPC性能の高さがカバーしてくれる。
それでもダメならアルゴリズムや手法自体がダメ、或いは今の時代では無理な課題だと切をつける。
昔ならCで作って遅い→アセンブラって以降したけど、C#で遅い→C++って戻る気がしないこの頃。
多次元配列の片方の次元?のサイズを取得する方法を教えてください。 例えば、int array[10, 20] とした場合 array.Length だと多次元配列全体の大きさである 300 が取得できますが 片方の、10 もしくは 20 という 1 次元分のサイズの方を取得したいのです。 よろしくお願いします。
多次元配列全体の大きさ 200 ですね、寝ぼけていました。
array.GetLength
>>773 どうもありがとうございます。
Length だけじゃなくて、GetLength というメソッドもあったのですね。
助かりました。
C#でnsfファイルの再生をするにはどうすればいいんだろう。
C#で角度入力したらその角度に線が引かれるようなものを作りたいのですが ライブラリとかってありますでしょうか
中学校に入り直したら?
中学校入りなおしたらわかるのか 君も仕事いきなさいよ家でPCばっかしてないで
仕事中に2ch見てる悪い子いっぱい
正直高校一年に入りなおせばわかると思うよ。
こういっちゃなんだが、
>>777-780 はたぶん分からないんだと思う。
屁は屁元から騒ぎ出す、という感じだなw
三角関数は中学数学でも高校の数Iでも出てこないぞ
たぶんピタゴラスで
>>776 が解決できると勘違いしてるってところだろうがな
なんにしろ恥ずかしい奴(ら)だなw
三角関数とかはもうわかってるけどそれをGUIであらわしたいだけなんだが^^;
Canvasに線を引く方法がわかれば後は自力で作れるだろう。
小学5年生のおれが来ましたよ。 private PointF GetVector( double dblAngle, int iLength ) { double rad = ( 2 * Math.PI * ( -dblAngle ) ) / 360; return new PointF( (float)( Math.Cos( rad ) * iLength ), (float)( Math.Sin( rad ) * iLength ) ); } private void Form1_Paint( object sender, PaintEventArgs e ) { double dblAngle = 30; PointF pntOrigin = new PointF( 100, 150 ); int iLength = 100; PointF vector = GetVector( dblAngle, iLength ); PointF pntEnd = new PointF( vector.X + pntOrigin.X, vector.Y + pntOrigin.Y ); e.Graphics.DrawLine( SystemPens.Highlight, pntOrigin, pntEnd ); e.Graphics.DrawLine( SystemPens.ControlText, pntOrigin, new PointF( pntOrigin.X + iLength, pntOrigin.Y ) ); }
ラジアンって数一じゃなかったっけ・・・(´・ω・`)
数一なんて小学生にでも分かるぜ。
俺は前世から分かってたぜ
アホばっかだなココ
WPFだとSystem.WindowsにVector構造体があるんだな 感動した
C#ってJavaScriptみたいな手っ取り早さというか、分かりやすい柔軟性がある。 DがC++とJavaの欠点を見直した比較的低水準言語を目指すというのなら、 C#はJavaとECMAScriptっぽい高水準事務処理言語といったところだろうか。 今すごい勢いで虫歯が飛んだ。
Dイラネ C#のネイティブコンパイラでいいのに
教えてください、 クラスをDLLで作成し、クライアントのEXEのプロジェクトと サーバのWebServiceのプロジェクト双方に参照設定し、 このクラスをパラメータとしてクライアントからWebService を呼びたいのですが、 DLLのネームスペースはaaa.test.xxxxxなのに、 WebService側はWindowsApplication1.localhost.xxxxx となっていて同じクラスとして認識してくれません。 どなたか対処方法分かりませんか
>>792 あきらめろ。
まあプロキシ自分でいじったらできるよ。
そんなことしたくないけど。
$getstr = new Win32::API("strmng", "mng", "PNNPN", "N"); $outstr = $getstr ->Call($instr, 20); 学習用ソフトをperlから移植していて いろいろ試行錯誤しながら試しているのですが どうしても巧くいきません。 どなたか教えていただけないでしょうか? 以下テスト用のコードです [DllImport("strmng.dll", EntryPoint = "mng",SetLastError = true)] public static extern int mng(string dr1, int dr2); string ss = "うんこだいスキー!!"; int r = mng(ss, 20);
さすがにDLLの仕様はエスパーできない
>>795 その関数のCやなんなりでの宣言を見せてみろ。
>>798 ごめんなさい
>>797 Cだと下記の表現みたいです・・
int WINAPI mng(char*, int)
>>796 DLLの関数を調べるツールってご存じないですか?
どううまくいかないのか書けやボケ 関数は呼ばれてるのかとか文字化けするのかとか LastErrorとってるならそれも出せハゲ。
>>799 それじゃあperlのと一致しないじゃないか
関数のフォーマットが不正です?
と出るから
引数がまちがっていると思うんですが・・・
>>801 別の関数でした。。
$getstr = new Win32::API("strmng", "mng", "PN", "N");
です
もうふらっとスレ行ってくれ……
[DllImport( "strmng.dll", CharSet = CharSet.Auto )] public static extern int mng( string dr1, int dr2 );
最初の引数が読み取るためのポインタか書き込むためのポインタかで変わってくるな。
>>802 >$getstr = new Win32::API("strmng", "mng", "PNNPN", "N");
何で intに "N" 渡してるんだ?
ということで…
>>804 は没。
第4引数は戻り値の型だろ
perlのlongって何ビットなんだ?
810 :
デフォルトの名無しさん :2007/04/27(金) 23:40:54
textboxとかでコレクションに設定した文字列を 取得するには、どうすれば良いのでしょうか。 すいませんが教えてください
string変数につっこめばよい。
意味不明 ふらっとの方が向いてるよ。
>>810 に勘で答えてみる
TextBox textBox;
List<string> list;
foreach(string str in list){textBox.AppendText(str + "\r\n");}
814 :
810 :2007/04/29(日) 03:54:45
いやAutoCompleteStringCollectionに設定したstring達の 取得設定方法に関してで、設定、っていうか加えるなら this.textBox1.AutoCompleteCustomSource.Add("ghq"); みたいな感じで出来るのがわかるんですが取得方法 がわからないんです。 フォーム(デザイナ)画面で、プロパティタブ開いて AutoCompleteCustomSourceの欄の(コレクション)で書き込んだ stringはデザイナのcsを見ると this.textBox1.AutoCompleteCustomSource.AddRange で設定されてるのは分かったんですが、取得方法がいまいち わかりません。 初心者の質問で申し訳ないですが、教えていただけないでしょうか。
プロパティ set getで検索
>>814 なにが「いや」だよ。
>>810 の説明でわかるヤツなんていねーよ。
ほんとにコミュニケーション能力というか、日本語力というか相手に伝えられないヤツが多いな…
指定して取得したいなら
string text = textBox1.AutoCompleteCustomSource[n];
列挙したいなら
foreach (string text in textBox1.AutoCompleteCustomSource)
818 :
デフォルトの名無しさん :2007/04/29(日) 13:40:19
すみません。教えてください。 OnPaint(PaintEventArgs e) の無効領域を、OnPaint( )内でクライアントエリア最大にできないものでしょうか。 Panelのクライアントエリアに背景画像があって、その上に四角形を描いています。 スクロールしたときに、背景だけ動かして、四角形は動かさないようにしたいのです。 OnScrollでInvalidateしても、いったんスクロールしてからOnScrollが呼ばれるみたいで、四角形がガクガクします。
背景も自分で描くのはダメなの?
820 :
デフォルトの名無しさん :2007/04/29(日) 13:56:16
>>819 コメントありがとうございます。
OnPaintで背景も描いています。
ただ、Panelのスクロールバーでスクロールしたときに、実際に再描画が発生しているのは
スクロールした結果発生した無効領域だけなのです。
スクロールバーを50ピクセル下に動かすと、クライアント領域は50ピクセル上にスクロールします。
その結果として、クライアントエリアの下50ピクセル高さ幅ぶんだけ再描画になります。
Control.CreateGraphicsは?
>>821 それはまずいでしょw
>>820 パネルの位置が変わった時点で無効化すればいいと思うけどな。
試してないけど、パネルじゃなくてPictureBoxならSetStyleでResizeRedraw指定すると
希望するような動作になったような気もしたけど。
823 :
デフォルトの名無しさん :2007/04/29(日) 14:46:15
>>822 実は、背景が地図で、スクロールしたときに地図上の位置を示す中央のターゲットマークの
描画位置を保持したいのです。
>パネルの位置が変わった時点で無効化すればいいと思うけどな。
はい、今はOnScrollで無効化しています。
しかし、これでもスクロールの後で無効化が発生するため、四角形がガクガクします。
ガクガク、というのは次の例のような動作です。
(1)Panelのスクロールバーを50ピクセル下へ
(2)Panel自身の機能でクライアントエリアが50ピクセル上へ。
このとき、背景とともに、ターゲットマークも上へ移動します。
Win32で言えば、クライアントエリアを上へBitBltしている様子です。
(3)無効になったエリアの再描画のためにOnPaintが呼ばれる
無効になった領域*だけ*に背景(と場合によってはターゲットマークの一部)を描画。
(4)OnScrollが呼ばれて、この中でInvalidate
(5)クライアントエリア前面再描画のためににOnPaintが呼ばれる。
背景とターゲットマークを完全に再描画。
この例の場合、ターゲットマークはいったん上へ移動してから再描画されます。
ResizeRedrawは、サイズが変わったときだけで、スクロールしたときには影響がないようです。
ScrollableControlを使うのが無理があるのかなあ。
単にダブルバッファリングすりゃいいんじゃね?
825 :
デフォルトの名無しさん :2007/04/29(日) 15:00:20
>>824 おつきあいありがとうございます。
ダブルバッファリングはしています。
>>823 ああ、やっと意味がわかった。
Win2K以降はWindowの位置が変わったときのBitBltはシステムが自動でやってくれる
みたいだけど、それが裏目にでるというわけか。
じゃあUserPaintフラグ指定してもダメかな?
スクロール位置だけ管理してくれて描画には手を出さんといてってことか。
828 :
デフォルトの名無しさん :2007/04/29(日) 15:30:16
>>826 ありがとうございます。
UserPaintを試してみましたが、関係がないようです。
>>827 はいそうです。
ただ、ターゲットマークを表示していないときには、BitBltはやってくれた方が再描画エリアが
少ないので動作が軽くなるかもしれません。
ターゲットマークを表示しているときだけ、スクロールで発生するOnPaintの無効領域を
クライアントエリアいっぱいにできれば済むのですが。
ところで私の書き込みってsageなくて良いんですかね。
どこかで「質問者はageろ」と書かれていたのにならって、sageていないのですが。
すんごい馬鹿馬鹿しい解決策だけど、マーカー用のPictureBoxをパネル外に作って描画。 実行時にマーカー位置に移動しとく。 これでスクロールから守られる。 ただ、MakeTransparent()しても透過色が機能しない・・・なんでなの? ペイント動作をよく理解していないからなぁ。
背景はPanelの中にPictureBox貼って背景イメージを割り当ててるだけなので省略。 public Form1() { InitializeComponent(); this.panel1.Dock = DockStyle.Fill; Bitmap bmp = new Bitmap(40, 40); Graphics g = Graphics.FromImage(bmp); this.pictureBox2.Location = new Point(10,10); this.pictureBox2.SizeMode = PictureBoxSizeMode.StretchImage; this.pictureBox2.Size = new Size(bmp.Width, bmp.Height); this.pictureBox2.Refresh(); Rectangle r = new Rectangle(0, 0, bmp.Width, bmp.Height); g.FillRectangle(Brushes.White, r); Pen pen = new Pen(Color.Black, 8); g.DrawRectangle(pen, r); pen.Dispose(); g.Dispose(); bmp.MakeTransparent(Color.White); this.pictureBox2.Image = bmp; }
831 :
デフォルトの名無しさん :2007/04/29(日) 15:44:43
リッチテキストボックスコントロールについて質問です コントロール上のカーソル(点滅している縦棒)の位置を知るにはどうしたら良いですか? メソッドを調べているのですが中々使えそうなのが見つからず困っております
832 :
デフォルトの名無しさん :2007/04/29(日) 15:45:30
ありがとうございました。 いただいたアドバイスを参考に検討してみます。 成果があったら報告させていただきます。
834 :
831 :2007/04/29(日) 15:49:16
補足です ○行 △列 とステータスバーに表示することが目的です
>>831 DOBON.Net ぐぐってみてください。
「TextBox(またはRichTextBox)の現在のカレット位置(行と列)を取得する」
というそのままズバリなTipsがありますよ。
836 :
デフォルトの名無しさん :2007/04/29(日) 15:59:45
>>835 すみません、調査不足でした
情報ありがとうございました
837 :
829 :2007/04/29(日) 18:38:50
インチキ万歳。 namespace Test3 { public partial class Form1 : Form { public Form1() { InitializeComponent(); this.panel1.Dock = DockStyle.Fill; this.pictureBox2.Location = new Point(50, 50); this.pictureBox2.Size = new Size(40, 40); GraphicsPath path = new GraphicsPath(); path.AddRectangles(new Rectangle[] { new Rectangle(19, 0, 2, 18), new Rectangle(19, 21, 2, 18), new Rectangle(0, 19, 18, 2), new Rectangle(21, 19, 18, 2) }); this.pictureBox2.Region = new Region(path); } } }
(値型1 + 値型2).ToString(); みたいに,演算子の戻り値に対してメンバを呼び出そうとすると インテリセンスが働かないのはなんで?
対応してないから。
そ、そんなぁ…
>>838 マジレスすると、それをやるなら Convert.ToString(値型1 + 値型2, 基数) 。
あれ、できたっけ?ごめん、寝てくる。
なんで"1".ToString()ではインテリセンスが出て 1.ToString()では出ないのかも気になる
小数かもしんないじゃん
846 :
828 :2007/04/30(月) 01:03:26
ターゲットマーク固定のスクロールについて質問していた者です。
結局、自前のスクロールパネルを作ることにしました。
工夫のない力技になってしまい、
>>829 、
>>830 さんには申し訳けありません。
DataTableがAcceptChanged()した後に変更があったかどうか確認したいのですが これには一つ一つRowStateを見ていくほかに無いのでしょうか? TableState 見たいなのがあると良いんですが。 変更が起こるたびにExtendedPropertiesにフラグをセットするとか考えたんですが・・・ 簡潔な方法があれば教えてください。
GetChanges とかどうよ
>>848 ありがとうございます!
こんな便利なメソッドがあるんですね
これのおかげで他の場所での処理もかなり簡潔に書けそうです
C#で例外の処理をどうするか迷ってます。 フリーウェアを付くっているんですが、正式にリリースする前に、すべての例外を確かめたいのです。 全部の例外を網羅しようとしたら、ひとつひとつの関数をすべて調べて回る必要があるんでしょうか。 それとも、VisualStudioの機能で、投げられるすべての例外の一覧などを取得することはできますか?
全ての new に対して OutOfMemoryException を確認する?
>>851 >すべての例外を確かめたいのです
非現実的だし、そんなことする意味がない。
多分それでチェックできる例外は例外じゃないと思う。
855 :
851 :2007/05/02(水) 02:04:49
書き方が不正確でした。
正確には、プログラム中で投げられる例外をチェックしたいんです。
C#では、Javaのように例外のキャッチを強制するようにできてないので、
textboxで求めるものと違う文字列を入力したとしても、
明示的にキャッチしないとプログラムを強制終了させてしまいます。
ある程度コードを書いてから、処理していない例外がたくさんあることに気づいたのですが、
いまさらコードをすべて見直すのも手間がかかるので、例外をスローする可能性のある部分だけを
列挙したいわけです。
それとも
>>853 さんのいうように、このような考え方はC#ではしないんでしょうか。
例外をキャッチする方向に追求しないで 例外を出さない処理を心がける方向へどうぞ。 textboxで求めるものと違う文字列を入力したとしても それは例外ではなく想定できる状況でしょ。 たぶんJavaの例外と概念が違います。 フリーウェアとして公開するならなおさら握りつぶさずに。 ぶっちゃけtry-cathだらけのアプリケーションなんて公開されても迷惑です。
858 :
853 :2007/05/02(水) 02:22:57
いやC#に限らず、例外は例外なわけでスローする可能性は全てにある。
>>852 のようにメモリ不足なんて常に発生しうるし、HDDの故障によるリードエラーも同じ。
普通、TextBoxに求めるものと違うものを入力された場合の処理は例外を使用しない。
っつーか入力された文字が原因で例外が発生してるんじゃなくて
お前のプログラムが入力された文字に対応してないだけだろーがw
859 :
851 :2007/05/02(水) 02:38:14
>>857 なるほど、C#、というかC系では例外を投げないように作るんですね。
概念が違うのがよくわかりました。
>>858 おっしゃるとおりだと思います。たしかにスローしうるすべての例外をチェックしてたらきりがありません。
しかし、それだと普通にプログラムしていて想定外の入力などあったときの処理などは、
すべて自前で各必要があるんでしょうか。
言い換えれば、入力が期待した値にそっているかすべてチェックするんですか?
それだとどうしてもカバーし忘れたりしないですか?
例えば、
テキストの入力に整数を期待していて、事前チェックで文字列の場合は警告するようにしたとします。
でも、ここで実数を入力されたときの処理を忘れてます。
同じようなことは、もっと複雑にもっと多く存在しうるわけで、それらすべてを想定する値かチェックすると
非常に複雑になりませんか?
それなら一度関数に入れて、例外が出れば警告する、という方法をJavaではとってきました。
まあ、その程度の処理もできないのか、といわれればそれまでなんですが・・・
>>856 いや、自分がほしいのはすべての例外を処理する方法なんです。
それこそ強制終了させないだけならmain文でtry catchかけばいいんで。
861 :
851 :2007/05/02(水) 02:56:03
すいません、自分でもなにいってるかわからなくなってきました。 要は、通常C#では例外を出さないように、 事前チェックですべてを処理しようとするのか、 それで本当に例外を排除できるのか、 ということが聞きたいわけです。
もう寝ろよ
>>859 , 861
>テキストの入力に整数を期待していて、事前チェックで文字列の場合は警告するようにしたとします。
>でも、ここで実数を入力されたときの処理を忘れてます。
>それなら一度関数に入れて、例外が出れば警告する、という方法をJavaではとってきました。
わけ分からん入力をわけ分からん入力のまま扱おうとするなよ。
それ想定外の入力が入るっていうバグだから例外はいて落ちるほうが正解
あと一応。WinFormsだとApplication.ThreadExceptionみれ
結局851は何が言いたいのかな? ユーザー入力の妥当性検査に例外を流用しちゃうボクを認めてくれよ、って話か?w 碇シンジ君だなそりゃ
>>860 >いや、自分がほしいのはすべての例外を処理する方法なんです。
この場合の処理って例外に応じた適切な処理ってことだよね?
そんなエスパーみたいなコードかけるなら今の給料の2倍でいいんでうちの会社に来てほしい。
漏れはテキストの入力は正規表現でチェックしとるよ
正規表現はうっかり漏れがありそうで怖いんだよな 複雑になってくると テスト項目作るのも大変
漏れだけに
まだ漏れとかガキ臭い言葉つかってる奴がいるんだな。 漏 れw ファーストネームはフランソワーズか?w
871 :
851 :2007/05/02(水) 14:48:10
>>866 逆に疑問なんですが、C#では潜在的に例外が処理されない可能性を
残したままソフトウェアをリリースしてるんですか?
それに例外に応じた処理をかけるっていうのがそれほどすごいことではないと思うんですが。
単に投げられる主要な例外をすべてキャッチすればいいだけの話ですし。
もちろん、絶対に投げられないような例外処理は書く必要がありませんし、
Javaでもゼロ除算など(上で上げられた OutOfMemoryException なども)基本的なものは
例外処理を強制されませんが。
>>871 例外について再学習する事をお勧めする。
そもそも「例外を処理する」って具体的に何するの?
>>871 探せばJavaからの移行ガイドみたいなのがいくつかあったはずだから
先にそっちに目を通すことをおすすめする。
別におまいさんのやり方を否定したいわけじゃないんだが、考え方それぞれだ。
ドキュメントコメントにはexceptionタグがあって そこに投げる例外を書いとくとインテリセンスのメンバ説明に表示されるよ そういう話ではないのはわかってるが
お舞らの例外についての処理基準を書け。 さすれば彼もニュアンスを汲み取れるであろう。
>>874 わかりました。いわれれば例外をJavaとC#でまったく同じものと思いこんでいました。
シンタックスが同じなので、使い方も全く同じと思っていました。
すぐにJavaとC#の例外の違いについて調べてみます。
>>876 たしかにそれが一番良い方法かもしれません。
よろしければ、C#でどういったときに例外として処理するかを教えてください。
再三の質問、すみませんがよろしくお願いします。
例外処理にC#もjavaもないと思うけど俺は。。
こういうのは言語の設計思想だからその言語のやり方に慣れるしかないと思う。 .NETでJava風の例外機構がどうしても使いたいならJ#とかどうよ。 微妙に両方が混ざってカイカンだぞ。
いやだから「例外」って概念にjavaもC#も糞もあるかってw
throws 使った宣言の話よね? あれを導入しようと思ったら、.NET 対応の全言語に同様の機構用意しないと意味ないから、 C# にだけ導入するのは避けたって話よね。 つーか、そんなに例外を受け漏らしたくないなら、 catch(Exception) でもすりゃいいじゃん。 あんまり勧められたもんじゃないけど。
throwsはいろいろと不都合があるから積極的に捨てたんじゃなかったか
> あれを導入しようと思ったら、.NET 対応の全言語に同様の機構用意しないと意味ないから、 > C# にだけ導入するのは避けたって話よね。 .NET に throws の導入を避けたのも、 > catch(Exception) みたいなコードが Java で量産されてて「これじゃ意味無いじゃん」って理由が大きい。
884 :
デフォルトの名無しさん :2007/05/02(水) 20:52:02
例外発生させないようにプログラミングを行うのが一番コストが低いぞ? 予期しない例外が発生した場合のみキャッチするようにするのベスト。 予期しない例外は大抵ログに書き込み、例外の度合に応じて 処理を継続するか異常終了させるか選択する。
C++の例外指定なんて意味を成してないもんな throws()をたまに書く位か
>>885 なるべく例外を発生させないようにするのは当然として
予期できる例外こそcatchすべきじゃないの?
予期できないのはApplication.ThreadExceptionとかにおまかせで
>逆に疑問なんですが、C#では潜在的に例外が処理されない可能性を >残したままソフトウェアをリリースしてるんですか? windowsやieハングした経験はないのか??? お前大丈夫か?
>textboxで求めるものと違う文字列を入力したとしても、 >明示的にキャッチしないとプログラムを強制終了させてしまいます。 どうやったらそうなるのか教えて欲しい。 求めるものに変換できるかどうか1度調べるだけだとおもうけどなあ
オーバーフローとかもあるだろ
オーバーフローするかどうか1度調べるだけだとおもうけどなあ
>textboxで求めるものと違う文字列を入力したとしても、 >明示的にキャッチしないとプログラムを強制終了させてしまいます。 求めるものと違うものを入れたからといって例外吐くのは糞仕様だと思います。
コンバートは例外を吐くんじゃないのか?
そういうとき例外を投げるのはアリだがキャッチすべきじゃないな
自分的にはチェックメソッドでbool返しの理由はoutパラメタですね。 入れたとたんに例外はくようなのは問題外。
>>895 c++使いだな。
それを避けるために例外があるんじゃないのか?
HRESULTと、S_OKと、GetLastErrと、&で直感的でないプログラムの完成。
GetLastErrorとか・・・
なんで昔からout Result resultみたいにせずに戻り値を結果報告に使うの?
>>896 んー何でもかんでも例外はきまくるのは帰ってコードがおかしくなる。
実際にオブジェクト構造とかがおかしくなってるようなときは例外はくけど想定できるエラーとかがあるときは例外はかんよ
ifやwhileなんかの条件に使えるから
TryGetValue : boolは許せるがエラーコードは禁止
取り敢えず予想できない例外がでた場合は、こけさせたほうがいいと思う。 データが失われたらマズイ場合は別だけど。
実際に結果を返す戻り値にエラーコード混ぜるのはどうかと思ったけど、 String.IndexOfの見つからない場合の戻り値は-1は準エラーコードかなあ…
TryHoge の一音節版
ああ、[1]なら一応AppDomain再起動で乗り切るってのはできるか。 ASP.NETとかSQL CLRがこういう動作だっけな。
908 :
858 :2007/05/03(木) 02:46:52
>>877 もう一度最初の話に戻すと、普通は入力値のチェックに例外は使用しない。
しかし
>>860 には「自分がほしいのは全ての例外を処理する方法」とあるので
何が何でも例外で処理したいなら、これ以上何も言えないが…
>>871 は言語と例外処理とその使用法を乱暴に扱いすぎ。
例外の使い道に言語は無関係だし、ゼロ除算が想定できるなら計算前に
分母が0かどうかチェックするのが普通。
数値入力に関してはコストと安全性を考えてサードパーティー製の数値入力
コントロール等を利用したりする。
どうもあなたは例外と条件文の選択を間違えているような気がする。
例外優先で考えてないか?文字通り例外は例外です。
909 :
851 :2007/05/03(木) 04:21:53
いろいろな意見を言ってくださって本当に参考になります。
JavaとC#の比較を行っているサイトは多かったのですが、例外について言及している
ものは少なかったです。
そのなかではこのページがもっとも参考になりました。
C SharpとJavaの比較 - Wikipedia
http://ja.wikipedia.org/wiki/C_Sharp%E3%81%A8Java%E3%81%AE%E6%AF%94%E8%BC%83#_note-2 このなかで初めてチェック済み例外と非チェック済み例外について知ったのですが、
>>884 のリンク先も参照してみると、
>>882 の言われるように、
大規模なプログラムになると破綻するので、チェック済み例外の機能を切り捨てたみたいです。
雑感を書くと、どうやら非チェック済み例外のみのC#を
チェック済み例外と非チェック済み例外両方あるJavaの感覚で利用しようとしたのが、
根本的な原因だったみたいです。
たしかに非チェック済み例外しかない環境では、
>>908 の言われるような例外の考え方がスタンダードのようですね。
今後C#では、例外の扱いと考え方を変えてみようかと思います。
だらだらと一日以上書き続けてしまいましたが、つきあってくださった方、ありがとうございました。
だからそれはjava C#の違いじゃありえないと思うけど。 単に851が「例外」という概念についてずっと勘違いしてただけじゃないの?
[Throws(typeof(IOException), typeof(XmlException))] public void Hoge() {...} とかやっとけば列挙できないこともないが
>>910 JavaとC#の例外処理は全く別。
C#は非チェック済み例外だけだが、Javaはそれに加えてチェック済み例外もある。
>>912 その違いがわかった上で、それでもそこで例外を使うのはおかしいという流れだよ。
>>913 だったらどこで例外を使うんだよ。
そもそも例外をださないようにプログラムするのが常識ってんなら、例外の存在意義って何だ?
失敗したことだけを知るなら例外クラスにヴァリエーションなんていらんだろうが。
出された例外別に対処するためにそれぞれキャッチできるようになってんだろ。
例外そのものがおまけなC++的思考から抜け出せてないんじゃないか?
++厨には難しいよ
Javaの検査例外は関数型言語でよく見るVariantみたいな使い勝手が気に入られているっぽいところはあるね。
「戻り値の型はT型またはU型またはV型」みたいな奴。
Javaだと「戻り値の型はint型またはHogeException型またはFugaException型」みたいなコードが書けていたのが
C#に移ったとたん「そーゆーのは流行んないんだよプゲラ」と言われてムッとなるのは分からんでもない。
そういう人は例えばNemerleにVariantがあるからそっち行ってみるのはどう?
ttp://d.hatena.ne.jp/akiramei/20050323#p2 まあBCL再実装とか現実的じゃないんで結局は「そーゆーのは流行んないん」という話だと思うけど。
>>914 だから入力値のチェックに普通例外は使わないって話をしてるんだよバカ
はっきり言っておくよ。 例外処理はプログラミングの構造から外れた所の処理だけ行えば良い。 構造から外れることが解っている例外処理を行うのはナンセンスだ
はっきり言うわりには意味不明だな
レベルの問題じゃね?。人による入力なんてミスがあって当たり前で、チェックしなきゃまともに動くわけない。 だから、処理コストの高い例外なんか使わずに、きちんとチェックしろよということじゃねーの?
>>917 そういうケースでは.NET2.0以降のC#の場合、outパラメータが使えるからTryParseパターンで対応してる。
JavaのInteger.parseIntは例外の使い方としては?な部分が多いといわれていて、
さらにNumberFormatExceptionがRuntimeExceptionなのでますます謎。
本来はTester-Doerパターンがいいと思うのだけどね。
if (Integer.canParse(str)) i = Integer.parse(str);
これならparseの例外がRuntimeExceptionなのは納得がいく。
はっきり言っておくよ。 エラーは全て例外にして投げておくのが良い。 もしくは全く例外を使わないのが良い。 中間は全てナンセンスだ
タイプライブラリをインポートしたCOMインターフェイスの メソッドの戻り値がすべてvoidで、 エラーはすべて例外になるのはなんで?
機械的に全部HRESULTにするか全部例外にするかしかできないから。 例外にする方を選んだのはそっちの方が多い使われ方だったからだろ。 気に食わなきゃ自分でインポート書けばいいだけの話。
DLLの読み込みをしたいのですが例外が出てしまい読み込めません・・・ C#側のただしい記述方法について教えていただけないでしょうか? C# [DllImport("Util.dll", CallingConvention = CallingConvention.Winapi )] public extern static int CalcChecksum(byte[] buf, int in2); C //Util.dll int WINAPI CalcChecksum(char* pc, int i) { return 0; }
XMLのノードとして追加書き込みしていったログの読み方について質問です。 <log xxx='xxx'/> <log xxx='xxx'/> ・・・ というファイルがあったとき、私はJavaではSequenceInputStreamでルートノードをくっつけてSAXParser で読んだりしていますが、.NetではSequenceInputStreamに該当するクラスが見つかりません。 SequenceInputStreamを自作する必要があるのでしょうか?見落としているだけでしょうか?(ありそう) それとも元々SequenceInputStreamを使っている自分が馬鹿で、別に簡単な方法があるのでしょうか? 全部読むという選択肢は考えていません。 テンポラリファイルに書き出すとスピードが、メモリに読み込むとメモリサイズが犠牲になりますので。
ちなみにSequenceInputStreamとは複数のInputStreamを一本のInputStreamに集約するプロキシです。
J#のライブラリを使えば SequenceInputStream を使えるかもね
>>926 C 側で関数を export してなくね?
つか例外出るならそれ書け。
>>927 そもそもログに XML って相性悪いと思うが。
XmlReader では XML フラグメントの読み取りがサポートされてるが、どうかね?
ありがとうございます。
XML フラグメント」でぐぐり、
http://support.microsoft.com/kb/318504/ja を見つけ、テスト実行してみたら無事読めました。
ログをXMLで書いておくと、出力する内容を追加した時に、以前に書いたログリーダーを修正しなくても使えるという利点があるので
XMLで出すようにしているんです。
csvだとそこいらが・・・だから、ログにXMLは意外と相性いいと思います。
http://support.microsoft.com/kb/318504/ja は古いようで2.0では「このクラスは、互換性のために残されています。」でした。
ちょっと代替方法を調べましたのでメモっておきます。
XmlReaderSettings settings = new XmlReaderSettings();
settings.ConformanceLevel = ConformanceLevel.Fragment;
XmlReader reader = XmlReader.Create(new StringReader(xmlFrag + xmlFrag), settings);
これだけでも XMLフラグメント xmlFrag を並べた文字列を解析できるようです。
フォームの背景画像を連続ではなく、1つだけにする方法を知っている方がいたら教えてください。
.NET 2.0 / VS2005 を使えばプロパティ一つで楽ちん
936 :
934 :2007/05/04(金) 22:03:21
2003なんです。。。 2003ではどうすれば・・・@@
自分で描画するコード書くだけじゃん DrawImage一行書くのがそんなに面倒か?
938 :
934 :2007/05/04(金) 22:58:03
背景指定しておけば勝手に埋め込みリソースになるので自分で読み込んだり描画するのを毛嫌いしてました;; リソースの読み方を調べてpaintイベントにDrawImage書いて解決しました。 ありがとうございました。
XmlSchemaSet sc = new XmlSchemaSet(); sc.Add("urn:bookstore-schema", "books.xsd"); settings.ValidationType = ValidationType.Schema; settings.Schemas = sc; settings.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack); とXmlReaderSettingsに設定すると、books.xsdで検証してくれることを確認。 private static void ValidationCallBack(object sender, ValidationEventArgs e) { Console.WriteLine("Validation Error: {0}", e.Message); Console.WriteLine("line:{0} ({1})", e.Exception.LineNumber, e.Exception.LinePosition); } で、xml内の行番号と桁位置を取得できました。
匿名デリゲートを処理内容で同一判定させることはできませんか? たとえば、EventA+=delegate(Obj o,EA e){};のようにイベントを匿名で 追加した場合、その後イベントから外す方法が知りたいです。 同一インスタンスでなきゃだめなのかな。
匿名デリゲートは宣言ごとにクラス作るから、原理的に無理 さっさとメソッドにしてしまえ 匿名デリゲートにゃ荷が重すぎたのさ
変数にでも代入しとけ。
しかしメンバフィールドの初期化で匿名メソッド使えるのは妙な感じだ。
それは頭がおかしいだけ
??
通常のボタンとツールストリップのボタンを持っているフォームを作っています。 フォームがアクティブじゃないときにマウスで通常のボタンをクリックすると フォームがアクティブになると同時にボタンも押されたことになりますが、 これがツールストリップのボタンだと、 フォームがアクティブになるだけでボタンは押されたことになりません。 結局もう一度ボタンを押して実行しないといけないんですが これを通常のボタンのようにするにはどうしたらよいのでしょうか?
VC#2005(.NET Framework 2.0)使っています。
WebBrowserコントロール上で選択されている文字列を取得しようとしています。
http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.htmldocument.execcommand (VS.80).aspx
こちらの下のほうに載っているサンプルを見ると
object o;
webBrowser1.Document.ExecCommand("Copy", false, ref o);
で取得できるようなことが書いてありますが、同じページ内で
public void ExecCommand (
string command,
bool showUI,
Object value
)
と定義されています。
実際にこの通りコーディングしてコンパイルしてみると
1 'System.Windows.Forms.HtmlDocument.ExecCommand(string, bool, object)' に最も適しているオーバーロード メソッドには無効な引数がいくつか含まれています。
2 引数 '3' を 'ref' キーワードと共に渡すことはできません。
というエラーになります。(当たり前か)
正しい方法をご存知の方いますか?
948 :
946 :2007/05/07(月) 16:12:14
ToolStrip の代わりに ToolBar を使えばできました。 ろくに調べずに質問してすみませんでした。
949 :
947 :2007/05/07(月) 16:24:51
object o = null; web.Document.ExecCommand("Copy", false, o); string text = Clipboard.GetText(); で取得できました。 サンプルがすべてコメントアウトされていた理由がわかった気がします。。。スミマセン
>>949 俺は前やったときInvokeScriptでeval使ってJavaScript実行させて戻り値で取った。
その方法と比べてクリップボードを汚さないけど、Scriptきられていると動かないので
良し悪し。
951 :
947 :2007/05/08(火) 21:42:30
>>950 なるほどそういう手もあるんですね。。。
949の方法だとクリップボードの内容をいちいち退避しなければいけなくて面倒でした。
社内LAN等、ある程度限定された環境ならいけそうですね。
ありがとうございます。
>>947-951 遅レスだが。
IHTMLDocument2 には selection プロパティがあるぜ。
HtmlDocument の DomDocument から先は COM/RCW の世界になっちゃうけど。
955 :
デフォルトの名無しさん :2007/05/09(水) 22:56:12
リモーティングで、自前↓のException を作って、throwしたいのだけど、 [Serializable] public class HogeException : Exception { } 実際にthrowするとcache側(リモーティングのクライアント側) で逆シリアル化を失敗してしまいます。回避作ないですかね? System.Runtime.Serialization.SerializationException: 'AppInterface.HogeException' 型のオブジェクトを逆シリアル化するコンストラクタが見つかりませんでした。 ---> System.Runtime.Serialization.SerializationException: 'AppInterface.HogeException' 型のオブジェクトを逆シリアル化するコンストラクタが見つかりませんでした。 場所 System.Runtime.Serialization.ObjectManager.GetConstructor(Type t, Type[] ctorParams) 場所 System.Runtime.Serialization.ObjectManager.CompleteISerializableObject(Object obj, SerializationInfo info, StreamingContext context) --- 内部例外スタック トレースの終わり --- #MarshalByRefObjectとExceptionの多重継承はできないし・・
たくさんThreadを実行した後、タスクマネージャを見るとハンドル数が妙に多いのです。 Threadのハンドルが閉じられていなくて、ThreadクラスにはDisposeなどハンドルを閉じられそうなメソッドが見あたらなかったです。 多分物理的なスレッドと.NETのスレッドは対応してないことになってるからかなと思ったのですが、 GCが動けばハンドルは解放されるのですが、GCが動く前にハンドル数不足でOutOfMemoryが発生することがあります。 とりあえずThreadの処理が終わるたびに必ずGCを叩いて回避したのですがパフォーマンスが悪化するのが気になるので これをGCを動かす以外に明示的に閉じる方法ってないのでしょうか?
Abort
>MarshalByRefObjectとExceptionの多重継承はできないし・・ きみほんとにRemoting理解してる?
>>957 Threadクラスのリファレンスを隅々まで読んでごらん?
>960 それらしい記述は見あたらないけど。
ファイル1 struct Address{ DWORD id[20000]; DWORD address[20000]; WORD size[20000]; } ファイル2 struct date{ DWORD id; WCHAR name[64]; WCHAR description[255]; BYTE sex; DWORD value1; DWORD value2; DWORD value3; } 上記のようなバイナリファイルがあって ファイル1のn番のdata構造体を取得したいとき Address.address[n]のアドレスから、Address.size[n]分だけ
963 :
962 :2007/05/10(木) 02:31:40
途中送信してしまいました。 取得するプログラムがC++で作ってありまして、 それを全コードC#に移植したいのですがC#で実現するにはどうすればいいのでしょうか? 今仕方なくC++のプログラムをdllにして呼び出してますが 出来ればC#で全て行いたいので。 方法をご存知のかた居ましたらご教授おねがいします
964 :
962 :2007/05/10(木) 02:42:39
あ、間違えました。 >ファイル1のn番のdata構造体を取得したいとき >Address.address[n]のアドレスから、Address.size[n]分だけ ファイル2のn番のdata構造体を取得したいとき ファイル1のAddress.address[n]のアドレスから、Address.size[n]分だけ です。 ちなみに.NET 2003です。 C#側でStructLayoutAttributeで構造体定義して BinaryReaderで読み込んだのはいいもののどうアドレスを指定して構造体にしていいものやら・・・
ファイル1のアドレスってファイル2上のアドレス? そういうウンコな処理をC#でやりたいって動機がワカンネ
Streamで読んで
アドレス分進めて
メモリにコピーして
Marshal.PtrToStructureで構造体ゲット?
べつにC++とやることはあまり変わらないと思うけど
ファイル書き出しをC#でできるならBinaryFormatter使う。
まあ
>>965 に同意
>>957 スレッドプールじゃ駄目なん?
Threadは作成と破棄を繰り返す処理には向いてないってどっかで見た。
しかし、別に
>>967 を揶揄するわけじゃない(むしろ957に対して言いたい)んだけど、
やたらスレッドプールを薦める人っているけど、スレッドプール向きの処理って
実際そんなにあるのかね?
スレッド使うような処理って一定の間(場合によってはアプリが起動してる間)
ずっと回ってる必要がある処理が多いと思うんだけど。
957がどういう処理にスレッドを使ってるのか気になるな
俺は処理時間の読みにくい入出力処理なんかをスレッドプールにポンポン放り込んでるが・・・
971 :
970 :2007/05/10(木) 12:52:17
といっても、ThreadPool.QueueUserWorkItem() ではなく、Delegate.BeginInvoke()/EndInvoke() を使うけど。
>>972 俺も972に同意
【スレッドクラス】
Threadクラス
【スレッドプール系】
スレッドプール
デリゲート
スレッドタイマー
バックグランドワーカー
ThreadPoolを使いすぎると内部でThreadPoolを使うクラスを呼び出すときにスレッドの空きがないと例外が起きるたりするので、 どのクラスが内部でThreadPool使ってるかなんて分かんないのでなるべく空けておかないと 高負荷な時に危険な状況が起きるのでいまいち積極的には使えないと思ってます。 Threadが短い処理をするのに向いてないのは分かってるが長時間動かす時、 たまたまハンドルが解放されない状況が起きると致命的なので GC以外でちゃんと解放する手順を知りたいだけなのですが。
スレッドプールって空いてるスレッドなければキューイングされんじゃないの?
やっぱこの場合はスレッドプール使うべきだろ。 というか少なくとも試すべき。
短い処理こそスレッドプール向き
>スレッドの空きがないと例外が起きるたりするので キュー待ちじゃないの? それからハンドルって何?
ぶっちゃ桁話、スレッドプールぐらいなら独自の仕組み作ったほうが後々幸せになれると思う・・・
なぜ?
あるモノは使う、ないモノは作るが鉄則
あるけれど何かしたいときに微妙なものはスクラッチする主義です。
それでいいと思うよ。 似てても要求を満たさないものは”ないモノ”と一緒だから。
有りモノをそのまま使うのが苦痛なら、作るかラップする。
たまにGraphicsをラップしたい衝動に駆られる
サランラップでくるんだおっぱいに興奮する
俺Graphicsのラップはしたことある・・・
アルミホイルを噛むと歯が浮く
セントリーノ
ニュートリノ
バンビーノ
ノ
ののびっち
グラビティーノ
ーノ
アルレッキーノ
ボーノ!!
ボンジョルノ
999 :
デフォルトの名無しさん :2007/05/11(金) 01:22:21
アルパチーノ
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。