1 名前:デフォルトの名無しさん [2007/09/04(火) 11:20:46 ] このスレッドは 「どんなにくだらないC#プログラミングに関する発言でも誰かが優しくレスをしてくれるスレッド」です。 ほかのスレッドでは恐ろしくて書き込めないような低レベル、もしくは質問者自身なんだか意味がよく分からない質問など、 勇気をもって書き込んでください。 内容に応じて、他スレ・他板へ行くことを勧められる、あるいは誘導される場合がありますがご了承下さい。 前スレ: ふらっとC♯, C#(初心者用) Part18 pc11.2ch.net/test/read.cgi/tech/1186550904/ 前前スレ: ふらっとC♯, C#(初心者用) Part17 pc11.2ch.net/test/read.cgi/tech/1182948981/ (,,゜Д゜)∩先生助けてくださいです! ....世の中には貴方の助けを必要としている人がいるぽ.... 2 名前: デフォルトの名無しさん [sage] 投稿日: 2007/08/08(水
2 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 11:56:43 ] >>1 乙
3 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 12:01:53 ] 前スレ999 やりたいことは int[] intData = new int[]{ 5,4,3 ]; これだけで済むと思うよ Console.WriteLine(intData[0]); //5 Console.WriteLine(intData[1]); //4 Console.WriteLine(intData[2]); //3 for(int i = 0; i < 3; ++i) { Console.WriteLine(intData[i]); } こんなふうにも出来る
4 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 12:09:11 ] もっというと int[] intData = new int[]{ 5,4,3 }; int[] intData2 = new int[4]; for(int i = 0; i < 3; i++){ intData2[i + 1] = intData[i]; } こんな感じかね
5 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 12:09:14 ] 前スレのラストに来た質問、今読んだけど微笑ましいなw 自分のしたいことと、ポインタ/配列の概念がうまく結びついてない感じがする
6 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 12:10:29 ] 多分動的に変数名を指定できるスクリプトから来たんだと思うなあ
7 名前:996 mailto:sage [2007/09/04(火) 12:43:08 ] 前スレ996です。 999を書いたのは私と別人なようで…。。。 >>3-4 回答ありがとうございます。 ただ…。やりたいことと微妙にズレがあります。 動的に変数名を指定という言葉が近いのかと思いますが、 for(int i = 0; i < 3 ;i++){ [intData + i] = i * 5; } といった感じに左辺を動的に指定したいのです。
8 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 12:50:28 ] > 動的に変数名を指定 変数ってのは入れ物であって、値じゃないのよ? ↓じゃダメなの? for(int i=0; i<3 ;i++) intData[i] = i * 5;
9 名前:デフォルトの名無しさん [2007/09/04(火) 12:52:37 ] よろしくお願いします ListViewコントロール をdetailで使用しています。 したいことは、選択されたItemが、常にListViewコントロールの真ん中に表示できるようにしたいです。 矢印キーを押して、行をスクロールさせた時に、選択された行の下3,4行くらいも見える(コントロール内に出てくる)ようにするようにしたいということです。 Item数が少なく、Itemを構成する行がListView内に収まる場合は、すべてが見えてるので問題ありません。
10 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 12:54:07 ] >>7 >ただ…。やりたいことと微妙にズレがあります。 この手の質問ってC#スレで頻出なんですが 残念(に思われるのは996さんだけかもしれませんが)ながら C#の仕様だと無理なのですよ。 もうみんなうんざりなので最短ルートとして「C#でどう書くか」が 提示されまくってるのをお察し下さいませ。
11 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 12:55:10 ] どうしてもっていうなら Dictinoary<string,int> でも使ってろってこったな
12 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 13:09:21 ] 変数名がintDataで、その後に数字が続くだけなら、 配列で出来る。 配列はあらかじめ大きさを指定しなきゃならないので、 それがまずいときは List<int> list = new List<int>(); for(int i = 0; i < 3; ++i){ list.Add(intData[i] * 5); } 動的に大きさが増える配列であるListを使えば出来る。 後、変数以外の名前も指定したければ、その変数を持ったクラスを新しく作って、 そのクラスの配列やListを使う
13 名前:996 mailto:sage [2007/09/04(火) 13:24:36 ] お答えいただいた皆さんありがとうございました。 色々と提示してもらえて助かりました。 どの方法を使うのかが最適か試してみます。
14 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 13:32:29 ] *頻出質問* ・コントロールを名前の文字列から取得したいんですが ・VB6みたいなコントロール配列ってどうやるんですか ・変数を名前で指定したいんですが ・フォーム間でデータを渡したいんですが ・イベントが発生しません。これはバグですね? ・参照型と値渡しと値型と参照渡しがよくわかりません><
15 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 13:52:51 ] >>10 > もうみんなうんざりなので これからも頻出質問は出続けると思うのでそういうのをまとめたものを作りませんか。 答えるほうもそこへのリンクさすだけで手間無く済みそうですし。一挙両得 >>14 さんも挙げられてるようにこういうものがあればなと思われてる方も 少なからずいるのではないでしょうか。 よろしくお願いします。
16 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 13:59:47 ] >>3 996がやりたいこととは全然違うだろ。 とどのつまり前スレ999さんのいってる事の解決が事件をとく鍵だと思う
17 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 13:59:51 ] >>9 ListViewItem item = ほにゃらら; item.EnsureVisible();
18 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 14:04:12 ] 文字列からなんとしてでも変数を取得したい、 と思ってるやつにはどう答えたらいいんだろう。 それは間違ってるよ、と代替案を提示すべきなのか リフレクション使え、と突き放すべきなのか
19 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 14:07:42 ] C#は静的にコンパイルされてチェックされるのがいいところだからな 動的に変数名を文字列で指定しなきゃならないようなケースは普通ないし そういう場合にはリフレクションなりDictionaryなり使えという話になるな
20 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 14:08:05 ] >リフレクション使え それはないだろ
21 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 14:20:53 ] それはない
22 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 14:25:49 ] >>15 そんなのいらん このスレは質問者がある特化した質問をして、その特化したシチュエーションに対応する回答を スレ住人がしてくれるから存在価値があるんだろ つか、大抵はググれば済むんだから…
23 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 14:30:23 ] 動的にクラスを生成しろという話になるのかな やりかた知らんけど
24 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 14:31:04 ] >>18 もう一段前があって、多分こんな感じなんじゃないかな。 1.ループを使えば綺麗に書けるのに 2.ピコーン 「文字列から変数が取れれば解決じゃん?」 3.やり方わかんね -> 2ch 「ループを使えば綺麗に書けるのに」というときの定石には 言語ごとにかなりクセがある。 C#だとそれは最初からループ対応の変数(配列とかListとか)を使うであったり アクセス用のメソッドを用意するであったりするわけだ。 一方で緩い言語では変数の名前空間自体が一種のDictionaryになっていて 命名ルールを工夫するだけで複数の変数をループ処理できるものもある。 そこまで緩くないC#としては、 「C#でループを書くときの定石を学べ」か 「.NETの機能を駆使して自分でパターンを作れ」になるんだろうなぁ。
25 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 14:34:33 ] >>22 すんませんでした。 ”頻出質問”に”うんざり”ということだったので、 あれば便利かなと思って先走ってしまいました。 それではみんなでれっつうんざり!
26 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 14:58:45 ] つーか普通配列で十分だしな なんでそんなことやろうとしてるのかわからん。 あおり楽しかったけどw
27 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 16:42:09 ] ぶっちゃけ、なんかニヤッとする面白い質問だた
28 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 16:48:48 ] class MyObjectBase { public IDictionary<string,object> Properties{get;}; public IDictionary<string,Delegate> Methods{get;}; } もう全部これを継承するようにするとか
29 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 20:10:16 ] こんばんは。 早速ですが質問させていただきます。 C#を用いてExcelを扱うアプリを作ってるんですが 既存のシステムにはCOMを使用し、直接Excelを開いてRangeオブジェクトを ToString()などして値を取得していたんですが、先輩曰くそのやり方は非常に駄目だから VBS使えといわれました。 Excelのデータはデータベースに入れてるんですが VBSを用いて同じことしたいんですがどのようにすればいいでしょうか。
30 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 20:15:39 ] VC#2005で開発しているのですが VScrollBarをフォームにくっつけているのですが 上下左右キーを押した際にスクロールバーにフォーカスを 持って行かれてしまいます。これを回避することは可能でしょうか。 フォームでキー処理をしたいのですがフォーカスをVScrollbarに取られてしまい キーイベントが来ないので困っています。
31 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 20:43:53 ] ---色々--- 上 ---Panel--- | ---Form--- 下 とか?
32 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 20:47:31 ] KeyPreview = Trueで普通にいけるでしょ。
33 名前:30 mailto:sage [2007/09/04(火) 21:05:55 ] フォームのIsInputKeyをoverrideすることで解決しました
34 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 21:40:45 ] アクセスキーにFunctionキーを割り付けるにはどうしたらいいですか? お願いします。
35 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 22:17:31 ] >>29 確かにc#だと上手くやらないとゴミ残りまくり。 VBSの使い方? すれ違い >>34 アクセラレータ キー? ショートカットキー?
36 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 22:31:49 ] [intData + i.ToString()] ってどの言語?
37 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 22:36:18 ] 何の言語かはわからんがC#コードの一部としてでも有り得る
38 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 22:38:20 ] そういうコードってスクリプト言語の宣伝によく使われる感じがするけど C#でそういうのはほとんど見かけないよな
39 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 22:41:19 ] D言語でもつかってろよ
40 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 23:39:51 ] スクリプト言語では変数名の後に整数の変数を文字列化したものをくっつけて 配列の変数のように使うことも多い
41 名前:34 mailto:sage [2007/09/04(火) 23:56:16 ] >>35 ショートカットキーです。 でもアクセラレータキーも教えてください。 調べたら「便利だな」って思いました
42 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 01:01:22 ] DoubleBufferedプロパティを有効にすれば Paintイベントをバックバッファでやってくれるからちらつかない なんて聞いたんでTrueにしてみたがFalseのときよりちらつくようになった 漏れ、だまされたんでしょうか? それとも手法がいけないんでしょうか?
43 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 04:07:39 ] 片方のバッファにしか描いてないんだろうw
44 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 04:10:48 ] つか、OnPaintの外で描いてる?
45 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 04:15:53 ] ふと思ったが、PaintEventArgs e の e.Graphics 使ってる?
46 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 04:18:34 ] CreateGraphics()とe.Graphicsじゃ結果が変わるね
47 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 05:07:42 ] ッタリメー
48 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 08:14:39 ] ダブルバッファの有効範囲をきちんと理解してないからだろう。 コントロールのと描画の範囲は抑えておきましょう。
49 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 11:28:58 ] 全画面で実行される別アプリ(ゲーム)の補助ツールを作ろうと思うのですが その別アプリが例外エラーで落ちるときに、エクスプローラのタスクバーが消えたままになってしまうため、 それを常駐させておいた補助プログラムで自動的に検出して、タスクバーの復帰を解決しようと思うのですが、 これらの処理について調べるには、どのようなキーワードで検索すれば良いでしょうか? 稚拙な質問ですがよろしくお願いします。
50 名前:デフォルトの名無しさん [2007/09/05(水) 12:32:51 ] >49 例外で落ちてタスクバーが消える事が問題なんじゃない なぜ例外をキャッチしてないのかと問いたい
51 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 12:38:06 ] 何か障害が発生した場合、最初にすべきことは原因の特定。 >>49 は、障害を覆い隠すのではなく、障害の原因を特定し、その解決を考えてみるべきでしょ。
52 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 12:38:25 ] 別アプリの例外とかキャッチ出来るの?
53 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 12:39:19 ] ましてゲームと書いてあるのにw
54 名前:デフォルトの名無しさん [2007/09/05(水) 12:40:30 ] >52 だから本アプリでキャッチしようよ。 触れない理由でもあるんかな?
55 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 12:42:04 ] >全画面で実行される別アプリ(ゲーム)の補助ツール よく読みましょう。
56 名前:デフォルトの名無しさん [2007/09/05(水) 12:43:22 ] >55 いや、読んだ。だから別アプリが問題だっていってるわけだが?
57 名前:デフォルトの名無しさん [2007/09/05(水) 12:45:01 ] 本当はチートツールですちゃんと嫁
58 名前:デフォルトの名無しさん [2007/09/05(水) 12:46:34 ] >57 そうか、なら死ね
59 名前:デフォルトの名無しさん [2007/09/05(水) 12:50:22 ] うるせぇ解決策だせもしねえでお前がしね
60 名前:デフォルトの名無しさん [2007/09/05(水) 12:54:12 ] >59 DirectX SDK でぐぐれ馬鹿
61 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 12:55:40 ] >>49 explorer.exeのプロセスを定期的に調べて死んでたら起動するとかでは?
62 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 13:10:39 ] 消えたタスクボタンを復活させるフリーソフトがあったような。
63 名前:49 mailto:sage [2007/09/05(水) 14:00:02 ] >>56 別アプリはあくまでも別(ゲームなのでソースは公開されてない)なので、 どういう原因で例外が発生しているのかはタイミングを含めてほとんど不明です。 なのでその不慮の自体からの回避をするための補助ツールをと思いまして。 >>57 ,58 結果的にチート扱いになってしまうかも分かりませんが、今回はタスクバーの 表示回復だけが目的です。 >>60 ググって見ます。 >>61 explorer.exeは生きてる状態で、タスクバーが消えてる以外は問題なく動いています。 (Windowsキーを押すとスタートメニューが表示されます。) >>62 その機能を、補助ツールを常駐させることで自動的に回復したいのです。
64 名前:デフォルトの名無しさん [2007/09/05(水) 14:05:36 ] >63 もう一度ゲームを起動して正常終了してもタスクバーは消えたままですか?
65 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 14:06:33 ] >>60 はノイズだよ そんなんぐぐっても何も出てこんぜ
66 名前:デフォルトの名無しさん [2007/09/05(水) 14:08:32 ] >65 いや出てくるが?
67 名前:49 mailto:sage [2007/09/05(水) 14:11:52 ] >>64 その場合はタスクバーも表示されています。
68 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 14:13:34 ] プロセス終了時にShell_TrayWndかなんかがVisibleか調べて 表示させればいいんじゃない
69 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 14:16:08 ] >>63 んーじゃあ最初にタスクバーのハンドルを取得して 非表示になってたらShowWindowするとか。 非表示じゃなくて存在自体なくなってたらexplorer.exeをkillして再起動とか。 後者はあまり好ましくないかも知れんがやむを得ないと思われ
70 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 14:27:31 ] >>68 ,69 ありがとうございます。 その方法で調べて試してみます。 >>69 確かにexplorerのkillは最終手段ですね^^;
71 名前:デフォルトの名無しさん [2007/09/05(水) 15:29:47 ] >67 DirectXで画面にクリア処理 それで終わるよ
72 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 17:04:32 ] >>45-46 CreateGraphics()で書いてました e.Graphicsじゃないといかんのですね ありがとうございました
73 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 17:08:21 ] どういたしまして^^
74 名前:デフォルトの名無しさん [2007/09/05(水) 17:13:21 ] >72 ヒント 最大化 最小化 createグラフィックが正解 あとはわかるね
75 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 17:26:53 ] >>49 そのゲームの作者かメーカーに修正依頼するのが筋じゃねーの
76 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 17:38:16 ] それが作者は昨年死亡したもので・・・
77 名前:デフォルトの名無しさん [2007/09/05(水) 18:00:09 ] owata
78 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 18:44:41 ] ユーザーコントロールのプロパティに独自に作成したクラスの配列を指定する方法を教えてください。 コンパイルは通るけど、プロパティで設定した値が保存されません。string型の配列とかだと問題ないのですが orz ・TestClass.cs public class dataClass{ private string _member; public string Member{ set { _member = value; } get { return _member;} } } ・ユーザーコントロール.cs private dataClass[] _test; [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public dataClass[] Test{ set { _test = value;} get { return _test;} }
79 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 19:02:13 ] >>78 このコードでちゃんと値取れたが、Testへはどうやって値入れてるんだ?
80 名前:デフォルトの名無しさん [2007/09/05(水) 20:31:28 ] エロビデオ専用のプレイヤー作りたいのですが ムービー再生の命令ってありますか?
81 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 20:33:02 ] 命令^^
82 名前:デフォルトの名無しさん [2007/09/05(水) 20:34:37 ] 何か間違ってますか?
83 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 20:47:10 ] >>41 (&1) (&2) (&12
84 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 20:47:18 ] >>79 ユーザーコントロールを新規のフォームに配置 ⇒ プロパティシートから設定しています。
85 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 20:47:50 ] >>80 すまんが、エロビデオのモザイク除去コマンドしか知らね 他スレを当たってみてくれ そして二度と来んな
86 名前:デフォルトの名無しさん [2007/09/05(水) 20:54:57 ] 知らないならレスしないでください!
87 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 20:55:23 ] >>84 ??? プロパティシートからどうやって? string?
88 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 21:10:43 ] >>85 くだらねぇ 面白いと思ってんのか? お前が二度とくんな
89 名前:デフォルトの名無しさん [2007/09/05(水) 21:17:37 ] >78 そのSET処理にメッセージボックスを置けばすぐ解るよ
90 名前:デフォルトの名無しさん [2007/09/05(水) 22:41:50 ] C#で String型で誕生日が入っている場合 その誕生日から現在日付を計算して 年齢を取得するにはどうすればいいのでしょうか? つまり誕生日が "1991/09/06"の場合 今日実行すれば、15歳を表示 明日実行すれば、16歳を表示
91 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 22:44:30 ] プロパティシートから?プロパティグリッドのことか?
92 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 22:58:01 ] >>90 DateTimeにパースして 現在の年月日と比較したら?
93 名前:デフォルトの名無しさん [2007/09/05(水) 22:58:46 ] >>90 >"1991/09/06"の場合 >今日実行すれば、15歳を表示 >明日実行すれば、16歳を表示 これはどうやって計算した? 基本的にはその計算した過程をプログラムすれば良い。 ここが参考になるんじゃない ttp://jeanne.wankuma.com/tips/datetime/
94 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 22:59:15 ] >>90 こんなかんじか? string tanjyo = "1979/01/27"; DateTime dt = DateTime.Parse(tanjyo); TimeSpan ts = DateTime.Now - dt; int nenrei = (int)ts.TotalDays / 365; MessageBox.Show(nenrei.ToString());
95 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 23:01:02 ] 閏年は?
96 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 23:02:53 ] 年と月日を別々に比較しないとだめぽ
97 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 23:07:51 ] Calendarがやってくれない?
98 名前:72 mailto:sage [2007/09/06(木) 00:38:06 ] Paintイベントで CreateGraphics()で描いていたのを e.Graphicsを使って描いてDoubleBufferdをTrueにする事で ダブルバッファリングを有効にすることができましたが 意図的にPaintイベントを発生させたいときに Paint(null,null)で呼び出していた手法が使えなくなってしまいました (PaintEventArgs e が nullになってしまうため) 何かいい方法はないでしょうか?
99 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 00:43:23 ] >>98 そういうのは ・スレッドをブロックして即座に描画するんならControl.Refresh ・非同期的に描画するんならControl.Invalidate を呼ぶ。 通常は後者
100 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 00:49:22 ] >>99 嗚呼、Refreshでよかったのか〜 Invalidateは初めて知りまつた ありがとうございました
101 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 09:18:28 ] 年齢は前日でプラス1だよ
102 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 09:47:12 ] Refresh は、 Invalidate して Update してる
103 名前:デフォルトの名無しさん [2007/09/06(木) 09:51:03 ] >>101 あれ、満年齢って誕生日の前日に数えるんじゃなかったっけ?
104 名前:デフォルトの名無しさん [2007/09/06(木) 10:01:26 ] >>101 すまん、前日+1と読み誤っていた。 前日でプラス1、その通りでございます。
105 名前:デフォルトの名無しさん [2007/09/06(木) 10:06:16 ] VC#2005を使って簡単なブラウザを作りたいんですけど、とりあえずFormに textboxやbuttonとか貼り付けて、buttonの名前を「移動]「戻る」「進む」と 名づけたんだけど、そのボタンにどうやったらその機能を付けたらいいのかが わからないんです。 navigate()やGoback()などのメソッドを使うことは分かったんだけど、実際に どのように記述すればいいのか…
106 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 10:25:58 ] >>105 レンダリングエンジンを自作するつもりでなければ、 WebBrowserコントロールを貼り付ける。 あとはWebBrowserコントロールでググればいろいろ出てくるだろ。
107 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 10:29:00 ] >>105 このへんが参考になるかな。 ttp://www.microsoft.com/japan/msdn/vstudio/express/vcsharp/develop/createwindowsapp/
108 名前:デフォルトの名無しさん [2007/09/06(木) 10:48:33 ] >>107 おおっ!ありがとうございます。 参考になります♪
109 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 11:17:40 ] >>87 >>91 プロパティグリッドというのですかね。正確な名称はわかりませんが、 コレクションエディタ? でメンバを追加しています。 >>78 メンバを追加してもメッセージは表示されません。。
110 名前:109 mailto:sage [2007/09/06(木) 11:41:39 ] CollectionBase を派生させたクラスを使用すればよかったみたいですね。 お騒がせしました。
111 名前:デフォルトの名無しさん [2007/09/06(木) 11:55:36 ] >>107 のサイトを見て一応作ったんだけど、この場合だとcomboBoxのプロパティitemに 登録したサイトのみ閲覧できるってことなんですよね? そうではなくIEみたいにアドレスや検索語をtextBoxに入力して移動buttunを押せば そのページに飛ぶようなブラウザをつくりたいんですけど、どうすれば…? どのようにメソッドを記述すればいいんでしょうか?
112 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 11:58:44 ] 取りあえず、いきなりブラウザじゃなくて普通に 簡易なソフトを組むところから始めて見た方が良いのでは…。
113 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 12:01:45 ] いきなり自分だけで作ってみるよりも、VisualC#入門 みたいな書籍やサイトを回って 軽く練習してからの方が早いよ
114 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 12:09:38 ] 応用のきかないやっちゃ
115 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 12:14:48 ] >>113 嫌です というかウェブブラウザ以外以外作るきはないんです 一度きりのプログラミングなので知る必要はないと思います
116 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 12:16:17 ] >>115 >>111 程度のこともできないんじゃ無理だね
117 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 12:16:51 ] ってまあ騙りなんだろうけど、釣られてみたw
118 名前:デフォルトの名無しさん [2007/09/06(木) 12:18:10 ] 誰だって初めからできるわけじゃないでしょが!!
119 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 12:35:50 ] これが所謂ゆとりってやつかね。
120 名前:デフォルトの名無しさん [2007/09/06(木) 12:42:18 ] 中身がわからないもの作って何が面白いんだろうか もし入門書を読むのが苦痛ならプログラマには向いていないってことだよ
121 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 12:47:04 ] webBrowser1.Navigate(comboBox1.SelectedItem.ToString()); ↓ webBrowser1.Navigate(textBox1.Text); がんばれ
122 名前:デフォルトの名無しさん [2007/09/06(木) 13:39:40 ] >>120 誰でも苦痛だと思うが
123 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 13:44:57 ] えー、苦痛ならほんとに向いてないでしょ
124 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 13:57:27 ] 入門書を読むのはまあ苦痛だろう。 苦痛じゃなくなるのは程よく慣れて思い通りになってくるだいぶ後の話だ。 苦痛だと思ったらプログラマに向いてないなんてちょい言い過ぎ。 >>115 を読むとこいつは人間的にどうかと思うがな。
125 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 14:07:37 ] >>118 ワロタ だから練習しろといってるw
126 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 14:20:20 ] というか騙りじゃなけりゃ、スキルなくてやる気もないんだから発注しろよって話だな
127 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 16:59:46 ] webBrowser1.DocumentText = "<html><body></body></html>"; HtmlElement he = webBrowser1.Document.Body; if (he == null) { MessageBox.Show("error"); return; } he.InnerHtml += "a"; これを行うとhe==nullがtrueになってしまいます。 Bodyを取得するにはどうしたらよいのでしょうか?
128 名前:デフォルトの名無しさん [2007/09/06(木) 17:39:16 ] よくgenericの例の説明で Swap<T>(ref T,ref T); なんてのがありますけど、 実際にSwapクラス?ってどこかの名前空間にあります?
129 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 18:04:10 ] 普通に自作のジェネリクスメソッドじゃね?
130 名前:128 mailto:sage [2007/09/06(木) 18:13:49 ] いやまぁ作るのは簡単なんだけど・・・ 誰が作っても同じだし、汎用的な処理なんであるに決まってると思い込んでた
131 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 18:28:26 ] そんな事までクラスで面倒見ないといけないのか・・・?
132 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 18:39:35 ] 使わないだろ 欲しいと思ったことも無いなSwap
133 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 18:44:40 ] コルーチンの説明でフィボナッチ数列求めるようなもんだろ。
134 名前:128 mailto:sage [2007/09/06(木) 18:53:26 ] あぁ、そうか C#みたいな言語では例外安全とかあんまり考えなくていいのね だからSwapも要らないと
135 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 20:15:57 ] 考えなくていいわけじゃないけど Swap1こだけあってもそんなにありがたくないような気がする そういうの集めたライブラリとかなら知らんが。
136 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 20:18:03 ] ていうかどのレベルで考えるかによるけとな。 Swapだけそんなに安全に使えてもあんまり意味ないし
137 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 20:21:23 ] 例外安全も考えたこと無いな GCされるだけだし、 構造体のコンストラクタでは例外投げられないし
138 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 20:43:43 ] 例外安全ってどういうこと? 例外が発生するかどうかはこの場合関係ないような気がするけど・・・ 誰か詳しい人教えて
139 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 21:04:44 ] >138 OutOfMemoryExceptionやThreadAbortExceptionみたいな いつでも起きうる例外もあるから。 例えばAPIでMutexを作って変数に代入する前に例外が起きたりして解放する機会を失ったりとかすると致命傷になる。 swapなら何かのIntPtrを例外安全に入れ替えたいときに必要なのかもしれず。C#使っててそんな機会はまずないかもしれないけど。 まぁ、ThreadAbortExceptionなんかAbortを叩くやつが悪いと思うし 本当のメモリ不足のOutOfMemoryExceptionは例外安全を考えるまでもなく復旧できないだろうし こいつらはあんまり考えなくてもいいかもね。 他にいつでも割り込んで起きうる例外ってあったかなぁ?
140 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 21:11:16 ] 例えば片方入れ替えたところで何らかの例外が発生してしまうと、 変数の状態が不正になる ローカル変数とかは普通に書いてりゃ問題ないけど 寿命の長いオブジェクトのフィールドだったりすると 例外が起こった処理以外に影響を与えてしまう。 まあ可能性は普通ものすごく低いので ここまで考慮することはまあそうそうないけどね。 本当にクリティカルなオブジェクトだったりすると そこまで考えなきゃならないこともあったりはする 普通はコード上で想定される例外くらいの考慮でしますけどね Swapは普通問題が起こるのはまれな部類なので そこまで考慮しないのがほとんど
141 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 21:15:39 ] 例えばASP.NET環境だと、処理に時間がかかりすぎると スレッドがアボートされるので 思いもよらんところで例外が発生する可能性はある そこまで考慮するかどうかはまた別の問題だが。
142 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 21:17:51 ] どうでもいいし脇道なんだがCERあるのでその辺は「いつでも」は起こらない 2.0になる時に信頼性に関してはかなり手を加えられてたりする、ひっそり まあSQLサーバーのせいだろうけど。
143 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 21:18:28 ] だいたいアンマネージが絡むようなところか セキュリティ上まずいことになる可能性があるところくらいかな ロックなんかが関わってくるところもあるかもしれない
144 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 21:20:20 ] >>142 それはつまりちゃんと対応した場合の話じゃないの? ってか対応しる手段としてそういうのがあれ
145 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 21:20:36 ] Compact上でのWebResponseの質問なんですが、 WebRequest.Create()でWebRequestを作成した後、GetResponse()で WebResponseを作成するまではいいのですが、ファイルをダウンロード後に Close()しようとしてもなぜかそこでハングしてしまい、WebResponseを閉じる ことが出来ません。試しにGetResponseStream()で取得したStreamの方を Close()してみたのですが、こっちの方でもハングしてしまい止まってしまいました。 ダウンロード対象はファイルとストリーミングデータ両方です。 何かヒントだけでもいただけないでしょうか?
146 名前:138 mailto:sage [2007/09/06(木) 21:22:42 ] >>139-140 なるほどー。そういう問題があったとは気づかなかった。 でもSwapをメソッドにしてもそういう問題は変わらないんじゃない? それともInterlockedクラスみたいに内部的な処理として実装するって意味なのかな
147 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 21:50:37 ] >>127 判らないけど処理に時間がかかるんじゃないか。
148 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 21:51:00 ] そういうことでしょう。
149 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 21:51:30 ] >>146 そういうことでしょう。 のつもりだったのですよ。
150 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 21:53:41 ] すみません。どれが自作自演でしょうか?
151 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 22:04:24 ] いや、多分、C++では例外安全なプログラムを書くためには Swapが頻出するから、そのメソッドが用意されてないのはなんでじゃろ、 といった程度の話じゃないのかな C++だとSwap以外のほとんどの処理が例外を投げる可能性があって大変らしい StackのPopにいたっては例外安全に記述する方法がないという
152 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 22:23:00 ] >>145 Compactは知らないが、その手のコードはあちこちにある。 それで試したら? つーかストリーミングの処理はどうやってるのか非常に興味ある。 出来てなさそう。
153 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 22:25:28 ] >>151 C++は基本的に例外安全か否かの2値しか考えないからねぇ。 ttp://msdn2.microsoft.com/ja-jp/library/system.runtime.constrainedexecution.consistency(VS.80).aspx これで言うと、C++な人たちの世界では Consistency.WillNotCorruptState Consistency.MayCorruptProcess のどちらか。 そうじゃなくて、状態の一貫性が失われることはあるのは前提で、 どこまで状態が不定になるかを分類するというアプローチもあると。
154 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 22:28:19 ] そりゃそうだろ。 メモリだって100%確実に書き込みできるわけじゃないし。
155 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 22:29:05 ] >>152 PC上で同じコードを実行した場合はハングせずに切断できるので 多分Compact上でやるのがいけないのか、CE機の方に原因がある のかもしれません。 一応探してみます。 ストリーミングといってもただフレーム単位で流れてくるmp3を スレッドに分けてConnectStreamから読んでるだけなんですけどね orz
156 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 22:34:46 ] >>151 C++のstd::swapもコピーコンストラクタの実装によっては例外が出ると思うけど・・・ そういうことではない?
157 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 22:37:30 ] c++のスレでどうぞ。
158 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 22:39:09 ] 変数名+1という式を実行したいのです すなわちなぜ数字の1と文字列型の1が存在し区別する必要があるのかということです? すごく面倒です
159 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 22:46:26 ] ツマンネ
160 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 22:47:01 ] 釣れますか
161 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 22:47:05 ] ゴメンネ
162 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 22:53:20 ] >>161 は>>159 に絶妙のレスを入れようとしたのに>>160 の野郎が邪魔しやがって、 と思っているに違いない。 >>160 は女。
163 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 22:54:40 ] 野郎なのに女とはこれいかに
164 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 22:58:22 ] Mutexを使って多重起動を抑止したのはいいんだが ・多重起動してるかチェックしたときにすでに同じEXEが起動してた ・かつ起動済みのEXEが最小化されてる こんなとき、すでに起動済みのEXEのほうの最小化を解除することは可能?
165 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 23:03:30 ] 可能だな
166 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 23:11:03 ] >>164 プロセス間通信する必要がある。 IpcChannelとかその辺
167 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 23:17:07 ] >>164 Win32API呼べばいけると思う。 参考 ttp://program.station.ez-net.jp/special/visual_studio/csharp/2005.mutex.asp
168 名前:デフォルトの名無しさん [2007/09/06(木) 23:23:12 ] まあでもchar型の数値と整数型の数字があるって不思議だよな! たとえばprintに渡せないし プログラムしない人にはわからないと思うぜ
169 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 23:24:57 ] >>167 なにその参考先 二回目以降に起動したやつは存在するプロセスに通知するだけにすればいいのに
170 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 23:25:12 ] 158==168?
171 名前:デフォルトの名無しさん [2007/09/06(木) 23:34:13 ] >>158 は前スレのベストセレクションだな
172 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 00:33:32 ] int iに年代を入れてカレンダーを作るプログラムを作ったんだけど、 もし i におかしな数字を入れられた時はもう一度入力させるようにwhile文でまわすつもりが、 数字じゃなくてaaaaみたいな文字列を入れられて延々ループが始まってしまいました。 これを防ぐにはどうしたらいいですか?
173 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 00:38:45 ] >はもう一度入力させるようにwhile文でまわすつもりが 意味分からんからコード書いてみ
174 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 00:44:18 ] どのような処理か分かりかねるけど、普通はループ中に条件変わらなければ ループ入る前に評価するのでは?
175 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 00:53:25 ] >>173 int i; scanf("%d",i); while( i>1 || i<9999 ) { printf("もう一度入力してください"); scanf("%d",&y); } こんな感じです。
176 名前:デフォルトの名無しさん [2007/09/07(金) 00:54:14 ] >>172 どんなコードかすごい興味あるw
177 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 00:54:43 ] あ、すいません 最初のscanfの括弧内のiの前に&書き忘れです。
178 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 00:56:34 ] たびたびすいません・・・・ whileの条件の不等号が逆です・・・
179 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 00:56:47 ] Cかよ
180 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 00:58:07 ] つーかなんで1個目のscanfはiで2個目はyなの
181 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 00:59:23 ] 1<i<9999 なら無限ループしたいの?
182 名前:175 mailto:sage [2007/09/07(金) 01:03:59 ] >>180 ぐは;・・・・ちょっとミスしすぎですね。。 yはもともとのコードをyで書いてたんでその癖でそのまま書き写してしまいました・・・
183 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 01:04:40 ] スレ違い CとC#は別の言語だよ 自分が勉強してる言語の名前くらいちゃんと覚えとけ この質問は>>180 でFAだが次からこっち行けよ pc11.2ch.net/test/read.cgi/tech/1170338926/
184 名前:175 mailto:sage [2007/09/07(金) 01:06:45 ] >>181 すいません、i<1 || i>9999 の時に正しく入力されるまでループさせたいんです。 でもaaaaなどの文字列を入れられてしまうとなぜかバグみたいに”もう一度入力してください”が延々流れ続けるようになってしまうんです。
185 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 01:07:27 ] scanfじゃね?と冗談で書こうとしたらマジかよ
186 名前:175 mailto:sage [2007/09/07(金) 01:07:30 ] すいません、失礼いたしました。
187 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 01:09:29 ] まあまあどうせ暇なんだし答えてやろうぜ。 ってかすでに無限ループする以外の選択肢しかないだろこれはw
188 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 01:11:28 ] >>186 いや構わんよ 自分はCのスレにも居るから何かあれば遠慮なく聞いて
189 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 01:12:04 ] こんな感じのソースじゃなくてそのものがないとなんともいえんな 処理自体は間違ってないように見える
190 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 01:19:55 ] >>189 ja.wikipedia.org/wiki/Scanf#.E7.95.B0.E5.B8.B8.E3.81.AA.E5.85.A5.E5.8A.9B.E3.81.8C.E8.A1.8C.E3.82.8F.E3.82.8C.E3.81.9F.E6.99.82.E3.81.AE.E5.87.A6.E7.90.86
191 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 01:24:58 ] scanfってこんなんだっけ もうすっかり忘れてるなw なるほどこれはダメだ
192 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 01:28:19 ] こういうの見るとC#やっててよかったと思うわ>scanf
193 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 01:33:36 ] scanfのfってなんですか?
194 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 01:36:41 ] フォーマットのfじゃね? scanf 懐かしいな、講義で教わったときは「使うな」だったけど。
195 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 01:44:28 ] 教えといて使うなってのもなw まぁ知らなきゃ使ってしまうかもしれないし当然だが
196 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 04:06:43 ] ファイルの保存ですがオブジェクトを複数個リストにいれてそれを保存なんてことできますか? 取り出し方が思いつかないですけど
197 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 04:12:56 ] シリアライズでぐぐれ
198 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 05:09:53 ] 前スレの透過キー問題、結構重要じゃね? リサイズが出来なくなるのは仕様で済ましちゃ問題あると思うんだが。
199 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 08:05:44 ] 24bitバグが絡んでると思ったが16bitでも発生するみたいだ
200 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 09:14:16 ] これ釣りですから
201 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 09:15:02 ] ?
202 名前:デフォルトの名無しさん [2007/09/07(金) 09:54:42 ] 誤爆に10ゲイツ
203 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 11:27:00 ] >>197 正直だめもとで質問したのですが便利なものがあるんですね。難しいけど ありがとうございました
204 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 11:55:10 ] あるプロジェクトがマネージドなのかアンマネージドなのかを判別する方法あるのでしょうか? 単純に、DllImportなどを指定して、WindowsのAPIとかを呼び出すコードが混じっていたら、 アンマネージドになるのであって、 明示的に、VisualStudioのビルドプロパティのどっかにフラグで指定されているわけでは無いですよね?
205 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 12:35:57 ] プロジェクトファイルの拡張子からして違うように見えるのは俺の気のせいか?
206 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 13:48:21 ] C#(というか.NET)で作ってたらDllImport使ってようとunsafe使ってようと マネージドには違いないだろ
207 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 13:51:32 ] >>204 >DllImportなどを指定して、WindowsのAPIとかを呼び出すコードが混じっていたら、 >アンマネージドになる ならなねーよ
208 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 14:20:27 ] www.atmarkit.co.jp/icd/root/18/21224318.html ここの>CLRに準処 の意味がわからん CLIに準処したCLR上で動作する の間違いか?
209 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 14:52:05 ] >>204 アンセーフとごっちゃにしてない? アンセーフかどうかならプロジェクトのプロパティにあるよ Win32APIはたしかにアンマネージだが呼び出し側がアンマネージになるわけではない
210 名前:デフォルトの名無しさん [2007/09/07(金) 14:59:23 ] 文字列の配列またはListの要素を結合する方法ってありますか? arrray.Joint("区切り文字") 見たいなメソッドがあれば一番良いのですが。。。 今はループで回して+=で結合してるのですあ、もっと良い方法がないかな、と思って
211 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 15:03:14 ] Strings.Join
212 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 15:04:08 ] String.Join
213 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 15:07:09 ] >>210 ちなみに要素数にもよるがループ中で文字列連結はよくない。 要素数だけゴミ(一時オブジェクト)が生成されるので。 そういうときは代わりにStringBuilderを使う。
214 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 15:15:09 ] 文字列の連結は今回は関係なおのでは
215 名前:213 mailto:sage [2007/09/07(金) 15:18:40 ] >>214 まあ関係ないけど、一応言っといて損はないでしょ
216 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 15:22:46 ] 要素数があらかじめ決まっているならstringの方が最適化されて効率がよくなるらしいよ
217 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 15:57:55 ] >>216 それは"a" + "b" + "c"がstring.Concat("a", "b", "c")になるというだけでは? ループの連結では関係ないよ
218 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 16:25:28 ] ループでも回数が決まってれば展開される最適化が行われることがあるだろ そしてstring の += が全部一つにまとまってちょっぱやになるだろ
219 名前:204 mailto:sage [2007/09/07(金) 16:33:10 ] 皆様、確かにアンセーフとごっちゃにしていました。申し訳ありませんでした。 多分、以下のようになります。 アンマネージ : 昔のDLLなどがアンマネージコード。 .NETから呼び出しても、呼び出した側はマネージドコードのまま。 アンセーフ : ポインタなどを使ったコードで、unsafe{}句で記述する。 ビルドプロパティで許可の設定をしないとビルドエラーとなる。
220 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 16:53:15 ] >>218 なんねーよ ループの展開ってどれだけ膨大なコードになるんだw
221 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 17:29:59 ] JITでループが展開されることはあるんじゃなかったっけ まあstringの連結の展開には無関係だけど
222 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 17:31:09 ] 繰り返し構造が3回以内なら展開される
223 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 23:26:05 ] 最小化されているFormを元の状態に戻すにはどうしたらいいんでしょうか? もとの状態が最大化だったら最大化した状態に戻したいのですが。
224 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 23:44:45 ] ShowWindow( hWnd, SW_RESTORE );
225 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 01:31:23 ] >>224 どうもです。 やっぱWin32APIを使わないと無理なんでしょうかね?
226 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 01:46:02 ] なんでだよw 要は最小化される前の状態を「覚えて」おけばいつでも元に戻せるだろ? 小学校1年生でもわかる理屈だと思うけど
227 名前:223 mailto:sage [2007/09/08(土) 02:29:21 ] >>226 そうなんですけど覚えておける状況にあるとは限らないんで。
228 名前:155 mailto:sage [2007/09/08(土) 02:37:48 ] すいません、詰ったのでもう一度質問させてください orz あの後、いろいろ実験したのですが、どうやらファイルを完全にダウンロード完了しないと 回線が切断されないようで、単品のファイルをダウンロードする場合はちゃんと切断できるの ですが、ラジオ放送などの終わりがいつになるかわからないものだと放送が終了するまで 切断できないようです。 ですが、さすがにそれだと通信帯域的や、コネクション数の制限的にまずいのでどうにかして 切断したいのですが、どうしたらいいでしょうか?
229 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 03:49:50 ] 適当に強制Closeしてやりゃいいんじゃねーの?
230 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 04:25:25 ] >>229 usingで囲ってるのですが、どうしてもそうするとClose出来なくて ハングしてしまい抜け出せません orz
231 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 13:37:04 ] スレッドを作ってその中からClose
232 名前:デフォルトの名無しさん [2007/09/08(土) 18:04:50 ] >>223 ウインドウステートプロパティで 最大化か最小化か普通か取得できるからそれみて 最小化されてたら設定かえてやるだけでよくね?
233 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 18:10:13 ] まあ、「覚えておけない状態」っていうのがどういう状態のことなのか 227に聞いてみたいものだねw
234 名前:デフォルトの名無しさん [2007/09/08(土) 18:26:45 ] >>231 スレッドは嫌韓雑誌なのでNGです テコンダー朴がすごすぎです
235 名前:デフォルトの名無しさん [2007/09/08(土) 19:00:06 ] C#を無料で入手できるサイトってありますか?
236 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 19:05:16 ] >>235 ネタ? .Net framework sdkかC# Expressで検索。
237 名前:223 mailto:sage [2007/09/08(土) 19:27:09 ] >>233 単に対象のフォームを作成時から面倒みれるわけではないというだけです。 まあライブラリ的なもんだと考えてもらえばわかりやすいかと。 >>232 元の状態がわからないのでそれではできないです。
238 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 19:30:47 ] Form.WindowStateプロパティで取れるっていってんだろうがボケナス
239 名前:223 mailto:sage [2007/09/08(土) 19:48:34 ] >>238 いや、だから現在の状態は取得できても元の状態は取得できないんですが・・・
240 名前:デフォルトの名無しさん [2007/09/08(土) 19:51:06 ] なら元の状態を記録しておけよ?
241 名前:223 mailto:sage [2007/09/08(土) 19:59:41 ] >>240 とりあえず>>237 の前半を読んでもらえないですかね?
242 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 20:01:08 ] 223はプログラマ向いてないんじゃないか? なんかネタじゃなさそうだし....
243 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 20:16:26 ] ズレてるのは>>238 だろ public void RestoreWindow(Form f) { if (f.WindowState == FormWindowState.Minimized) { // } } これをどう書くかって話だろ? まあ多分ShowWindow使うしかないと思うけど。
244 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 20:19:11 ] なんで事前にインスタンスを登録しとく形ではダメなの?
245 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 20:22:25 ] きっと「クラス」ライブラリという考え方が理解できないのでしょうw ライブラリといえばスタティックメソッドのことだと思い込んでるんだよ
246 名前:デフォルトの名無しさん [2007/09/08(土) 20:24:05 ] C#で各プロジェクト共通に使えるクラスを作成して そのクラスをまとめて格納するフォルダを作りました。 それを別フォルダにあるプロジェクトからそのフォルダにあるクラスを プロジェクト→既存項目の追加で追加すると同じプロジェクト内の フォルダへコピーされてしまいました。 やりたい事はコピーでなくその共通フォルダにあるクラスそのものを参照して 共通フォルダのクラスを変更するだけですべてのプロジェクトが修正されている 仕組みにしたいのですがやり方がわかりません。VB6なら汎用モジュールを格納する フォルダを作りその中のファイルをIDEで追加するとできたのですが・・・ コピーされてしまうと各プロジェクト分同じファイルができてしまい メンテナンスが大変になりそうなので・・・ どなたか、共通ファイルを複数プロジェクトで共有する方法を教えて下さい。
247 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 20:27:13 ] 追加するときのファイルダイアログの「追加」ボタンの右の三角をクリック リンクとして追加(だったかな)を選ぶ DLLにした方がいいと思うけどね
248 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 20:28:21 ] >>246 プロジェクトとリソルーションの区別がついてないと見た。 まずはそれを理解するのが先決だと思う。
249 名前:デフォルトの名無しさん [2007/09/08(土) 20:29:56 ] >>246 共通ファイルをクラスライブラリーにしてそのDLLを各プロジェクトで参照すればいいんじゃね
250 名前:223 mailto:sage [2007/09/08(土) 20:41:52 ] >>243 大体そんな感じです。やっぱAPI使うしかないですね。 >>244 API使えばわざわざそういう方式にする必要もないので。 >>245 ライブラリって言葉はまずかったですかね? でもそれはあくまでも補足で、その前の一行を読めば十分わかると思ったんですけどね。 まあというわけでWin32APIを使うことにします。 どうもありがとうございました。
251 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 20:42:00 ] >>246 共通に使えるクラスを集めたプロジェクトを作って そのプロジェクト自体をソリューションに追加するといいよ ファイルを直接参照するんじゃなくてDLLができちゃうけど気にするな DLLの存在は全く意識せずに扱えるようになってるから
252 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 20:47:40 ] >>250 馬鹿なくせに頑なお方だねえw >その前の一行を読めば十分わかると思ったんですけどね。 じゃないよw 何もわかってないのはお前さんの方。 君のような性格の奴はぜったに伸びないよ。 >>251 246が望んでいるのは、恐らく複数の「リソルーション」から同じクラスライブラリを 参照することで、君がいっているようなこととは微妙に違うと思うよ。
253 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 20:51:11 ] ごめん ×リソルーション ○ソルーション(ソリューション)
254 名前:251 mailto:sage [2007/09/08(土) 20:52:55 ] >>252 >複数の「リソルーション」から同じクラスライブラリを参照すること いやその意味で言ったんだ >>251 の「そのプロジェクト」は利用側じゃなくて 「共通に使えるクラスを集めたプロジェクト」を指してるつもりだった
255 名前:デフォルトの名無しさん [2007/09/08(土) 21:07:43 ] >>247 回答ありがとうございます。
256 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 21:24:15 ] どうみても馬鹿は>>252 です。ありがたくない。
257 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 21:28:35 ] このスレッドは 「どんなにくだらないC#プログラミングに関する発言でも誰かが優しくレスをしてくれるスレッド」です。
258 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 21:42:07 ] >>256 君223か?あるいは>>243 ? このレベルのことが理解できなお馬鹿がそんなに多いとも思えない。 まあこれ以上騒がれてももうっとうしいから 一応簡単に223のどこが「馬鹿」か書くことにする。 223は、フォームが最小化される前の状態がわからないからできない、 と言っているがこれは愚かな発言だ。 わからない(不可知)なのではなく、223にわかるようなコードが書けないだけだ。 「わかる」ようなコードを書けよ。 >>257 くだらない質問をするのは問題ないが、無知を認められない頑なさ故に 自ら答えを知ろうとしない人間をなだめすかして手取り足取り教えてやるほど 誰もお人よしじゃないだろ。
259 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 21:48:37 ] おまえら、もうほっといてやれよ これから相手にしたやつも同じくらいバカってことで↓
260 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 21:54:23 ] >>258 放置できないんなら君もヽ( ・∀・)人(・∀・ )ノナカーマ
261 名前:デフォルトの名無しさん [2007/09/08(土) 22:07:01 ] つーか ShowWindow( hWnd, SW_RESTORE ); と fm.WindowState= FormWindowState.Normal; って挙動いっしょじゃないのか?
262 名前:155 mailto:sage [2007/09/08(土) 22:36:19 ] >>231 返信遅れてしまってすいません。 元からThreadで回す予定だったので長くとも1分以内に切れてくれるならいいのですが、 いつまで経っても切れないのでメインスレッドに持って来て実験すると案の定 Closeのところでハングしてるんです orz
263 名前:デフォルトの名無しさん [2007/09/08(土) 23:58:04 ] ACSESSをC#からオートメーションで動かしたいのですが VB6だと 'AccessをVB6でオートメーションで動かす Public Sub AutoAccess() Dim objAcc As Access.Application Set objAcc = CreateObject("Access.Application") With objAcc .OpenCurrentDatabase "C:\test\test.mdb" .DoCmd.OpenQuery "Q_クエリーテスト" .CloseCurrentDatabase End With End Sub となります。 C#だとどう書けばよろしいのでしょうか?
264 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 23:59:27 ] VSTO
265 名前:デフォルトの名無しさん [2007/09/09(日) 00:14:26 ] >>264 VSTOはありません。ACCESS97です。
266 名前:デフォルトの名無しさん [2007/09/09(日) 00:31:20 ] つ Visual C# .NET を使用して Office オートメーション サーバーのウィンドウ ハン… support.microsoft.com/kb/302295/ja
267 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 00:51:55 ] >263 VB.NETを使って書いて作ったdllをC#から呼ぶ。 Missing.Valueが面倒なんだよねぇ……
268 名前:デフォルトの名無しさん [2007/09/09(日) 00:57:53 ] >>267 Missing.Valueとは何でしょうか?
269 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 01:32:03 ] Valueさんがいなくて寂しいわ
270 名前:デフォルトの名無しさん [2007/09/09(日) 03:09:44 ] >>266 具体的なコード例があれば助かるのですが・・・
271 名前:デフォルトの名無しさん [2007/09/09(日) 03:17:23 ] つstore.yahoo.co.jp/komakineji/1004075.html
272 名前:デフォルトの名無しさん [2007/09/09(日) 08:41:35 ] System.Runtime.InteropServices
273 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 09:56:07 ] いいかげんしろや 簡単なことだったらググレカス。 キーワード位判るだろ!!!! c# access オートメーション ttp://support.microsoft.com/kb/317114/ja でもな、c#からoffice使うのは勧めない。VB6やVBAからのほうがよい。
274 名前:デフォルトの名無しさん [2007/09/09(日) 11:47:55 ] 文字列の "$実行("hoge",1,"nage")" を解析して 「$実行」 と 「"hoge"」「1」「"nage"」 を返してほしいのだがどうすればよいでしょうか? 正規表現でやれると思うけど引数部分が何回繰り返されるかわからないのです。 この引数の部分はobject[]に格納したいです。
275 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 11:50:27 ] その前に文字列になってないような…
276 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 11:55:48 ] >>274 地道にコード書けば?
277 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 11:56:21 ] Match と Group 使いこなせばどうとでもなる 確か @IT に .NET の正規表現講座があったからそれで勉強してみれ
278 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 11:59:28 ] 正規表現使わないほうが楽なんでないの? "hoge"に [ , ( ) ]が含まれているかも知れないし。
279 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 12:01:19 ] それは面倒ではないが、" のエスケープがあると面倒だな
280 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 12:12:07 ] TextFieldParser で超手抜きw
281 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 12:28:47 ] なんかC#からExcelとかAccess使うのは かなり評判が悪いみたいですね COM開放しわすれて残骸が残るから? それとも遅いから? VSTOつかえといっても高いしアレ おとなしくVSスクリプトでも使ってなさいってこと?
282 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 12:30:47 ] 追加:Missing.Value面倒
283 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 13:54:14 ] 初心者です。どなたか教えてください。 interfaceを作って、そのままクラスの中で宣言して使ってる サンプルソースによく出くわすのですが、 interfaceってクラスで実装して初めて使えるものではないのでしょうか? たとえば、IShellLinkのサンプルやseasarのオマケでついてくるサンプルなどです。 よろしくお願いします。
284 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 13:57:30 ] COM参照のインターフェイスは特別 seasarのおまけとやらは知らん
285 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 14:00:25 ] >>283 ちとエスパーしてみるが、 ファクトリが返してきたインスタンスをインターフェイスで受けてるケースのことか? インターフェイスだけでインスタンスは作れないが、変数(参照の受け皿)は宣言できる。 IABC abc = ABC.Factory();
286 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 14:13:00 ] もっと端的に書けばこういうこと。 interface IAbc {} class Abc : IAbc {} IAbc abc = new Abc();
287 名前:デフォルトの名無しさん [2007/09/09(日) 14:14:03 ] そのためのインターフェースだしな
288 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 15:01:23 ] みなさまありがとうございます。 >>286 であれば理解できるのですが、 class Abc : IAbc {} にあたる部分が見当たらないのです。 強いていえば、interfaceのはじめに [ComImport] [Guid("000214EE-0000-0000-C000-000000000046")] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] internal interface IShellLinkA メソッドなどの宣言では、 void GetWorkingDirectory( [Out, MarshalAs(UnmanagedType.LPStr)] StringBuilder pszDir, int cch ); みたいに書いてあるのですが。 その後は実装なしにinterfaceの型で変数を宣言してそのまま使ってるように見えます。 >>284 さんの言われるように特別な例なのでしょうか? よろしくお願いします。
289 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 15:08:07 ] 宣言はそりゃできるわさ。問題は初期化。 CoClass 属性がなけりゃ直接 new はできんはずだが。 ていうかそのサンプルってのはどこにあるのさ?
290 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 15:16:52 ] >>288 特別な例なので半年後ぐらいに見直すといいよ。 言語の機能というよりはランタイムライブラリの機能だし。
291 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 15:23:18 ] >>289 たしかにコクラスというのがあります! 他サイトへのリンクについて言及していないようなので貼ってみます。 以下のサイトのサンプルです。 smdn.invisiblefulmoon.net/ikimasshoy/dotnettips/tips043.html コクラスについて調べてみましたがさっぱり意味がわかりませんでした。 この機能の目的についてだけでも教えていただけますか? あとは参考にすればよい本などがあれば・・・ よろしくお願いします。 >>290 半年後ですか・・・なにもせずに半年というわけではなく、 その間、充分勉強してスキルアップしろという意味でしょうね。 真摯に受け止めます。ありがとうございます。
292 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 15:31:12 ] COM っていう昔使われてた(今も使われてるけど)異言語間のやり取り用の取り決めがあって、 .NET でその取り決めに従うための特別な記述だ。 まああんまり今は気にするな。結局大して役に立たんし。
293 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 15:34:15 ] >>291 >その間、充分勉強してスキルアップしろという意味でしょうね。 まあCOMについて半年も勉強してても飽きると思うが。 COMを知らなくてもC#の勉強はできるし、 普通なら先に知るべきことはたくさんあるので 半年ぐらい忘れてもいいぐらいだと思う。
294 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 15:37:39 ] そのページはCOMInteropを自作してるのか(笑) 初心者向きじゃないと思うぞ。 ヒントを言えばShellLinkクラスはCOMオブジェクトそのものじゃなくて、 COMオブジェクトをC#から利用するための中間クラス。 インターフェイスの実装はCOMモジュールの中にあるから安心しろ。
295 名前:291 mailto:sage [2007/09/09(日) 15:39:36 ] >>292 今の私には「決まり」としてしか理解できないようです。 おまじないのようなものだと思っておきます。 アドバイスありがとうございました。 >>293 ありがとうございます。 まずはもっとほかの事を勉強してみます。
296 名前:291 mailto:sage [2007/09/09(日) 15:47:18 ] >>294 COMってDLLの一種というくらいの認識しかないのですが、 COMが実装してryinterfaceの仕様をCOMをりようするプログラムのほうで 書き直しているのでしょうか?でもinterfaceを書き直しても実装してるプログラムには 影響ないように思えるのですが。 書いててよくわかんなくなってきました・・・ もしよろしければコクラスの機能だけでも教えていただけたらと思います。 よろしくお願いします。
297 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 16:18:34 ] >>296 [ uuid(11219420-1768-11D1-95BE-00609797EA4F), helpstring("Shell Link object") ] coclass ShellLinkObject { [default] interface IShellLinkDual; }; VC++/ATLでCOMサーバーを作れるようになったらも一回挑戦してみろ。 上のIDLが読めないようだと理解は無理。 ちなみにCOMInteropは「参照の追加」「COM」「Microsoft Shell Controls and Automation」で 自動的にDLLにしてくれるからこれを使うのが普通。
298 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 16:23:03 ] >>296 ごめん。 COMとは10年以上のつきあいだけどそれでも質問の意味がわかんねぇす。 いわゆる入門書は先にC++の仮想関数テーブルとかIUnknownを説明した上で その後「coclassとは」みたいな流れを踏むので、 いきなりcoclassだけ説明して下さいってのは無理ってもんだし かえって遠回りなんじゃないかな。 忠告を無視してまでどうしても知りたければ この辺の本読んでみるところから初めてみたらいいんじゃない? www.amazon.co.jp/dp/4881356992 www.amazon.co.jp/dp/4756132804 www.amazon.co.jp/dp/4881357557 C++も分からなければもちろんC++の基礎も勉強と。 そのあと『Essential .NET』と『プログラミングMicrosoft .NET Framework 第2版』 を読破すると。 そこまでやってくれれば、多分ここの書き込み文字数制限程度の分量で coclassの説明もできると思う。
299 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 16:24:36 ] >>297 レスありがとうございます。 VC、ATL、COMサーバー・・・どれひとつマスターしておりません・・・。 でもプログラムとう世界の奥深さは実感できました。 いつか理解できる日を夢見ていろいろ勉強してみます。 ありがとうございました!
300 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 16:30:41 ] >>298 ただ混乱しているだけの質問をしてご迷惑をおかけしております。 たくさんの書籍の紹介ありがとうございます。 今の私には真に理解できるとは思えませんが、 少しずつでも勉強したいと思っております。 ありがとうございました。
301 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 18:29:00 ] >281 解放忘れでオブジェクトの残骸が残ってしまうのはVB.NETでも共通だけど、 やっぱ、単純に書きづらいんだよ。 VBでは省略可能な引数をMissing.Valueで埋めなきゃいけない。 普段全引数を指定とかしないから気づかないけどOfficeのバージョンによって引数の数がさりげなく違うなんてこともある。 これがVB.NETならVB6までと同じように書けるようにできている。 同じことができてもっと楽に扱えるVB.NETがあるのにC#で無理に書かなくてもいいんでない?
302 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 18:43:36 ] 俺はType.Missingを使ってるけどMissing.Value派のひとも多そうだな。 どっちが推奨なんだろ。
303 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 18:46:52 ] > Missing フィールドは、パラメータの既定値を取得するリフレクションによる呼び出しのために使用します。 だから、普通のときは Missing.Value なんじゃね
304 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 18:49:34 ] MethodInfo.InvokeでやっちゃってるMSのサンプルを見た覚えがある
305 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 19:01:19 ] それはレイトバインドのサンプルだろ多分。
306 名前:304 mailto:sage [2007/09/09(日) 19:16:06 ] support.microsoft.com/kb/306683/ja ちょっと記憶が違ってたけど見つけた
307 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 19:18:36 ] しかしいつ見てもこの oMissing の羅列はありえないよな
308 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 19:26:04 ] オーバーロードのソースコード生成するしかないか
309 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 19:43:09 ] private object InvokeMethod(object obj, string name, params object[] args){ return oApp.GetType().InvokeMember(name, BindingFlags.Default | BindingFlags.InvokeMethod, null, obj, args); } oBook = (Excel._Workbook)InvokeMethod(oBooks, "Open", "c:\\book1.xls"); >>360 によると、こうすればmissing付けなくてもいいみたいだよ
310 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 20:11:34 ] >302 そもそもインスタンスは1つしかないのでどっちも同じだろ。 Missing.Valueを使ったサンプルの方が圧倒的に多いと思うが。 >309 遅延バインディングだな。
311 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 21:13:32 ] VSTO用のプロジェクトを作るとmissingというのが自動生成されていてこれを使えということらしい。 global::System.Object missing = global::System.Type.Missing; 英語のドキュメントをみるとどちらの量もどっこいなのだが、 日本語化されてるドキュメントだとSystem.Refrection.Missing.Valueが多い。 System.Type.MissingのMSDNのリフレクション云々のくだりはVB前提で書かれていて、 VBであってもリフレクションを使う場合はOptionalにはType.Missingが必要になりますの意味。 結局同じものだからどちらでもいいのだろう。MSも混乱してるし。
312 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 21:30:53 ] office2007ってXML形式のファイルに対応してるらしいけど 既存のバイナリファイルいじるのでなければ 直接XMLなファイルを生成するプログラムにしたほうが COMでがんばるよりはるかに楽な気がしまつ ExcelはCOMつかわないでCSVでがんばってる人も多いと勝手に妄想
313 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 21:36:00 ] すみません。 イベントとデリゲートについてよく分かりません。 デリゲートはインスタンス化したもののアドレスを入れるもの(?) と認識しました。 イベントとデリゲートの関係がよくわからず、イベントがさっぱり分かりません。 どなたか簡単に教えていただけないでしょうか? 変なお願いと思いますが、どうしてもわからなくて。 どうやったらイベントのメソッドに飛んでいくのかが全然わからない 状況です
314 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 21:47:15 ] デリゲートはメソッド呼び出し手続きそのものをオブジェクトにすることでほかのオブジェクトとのやり取りに使用できるようにしたもの。 イベントはデリゲートを利用してあるタイミングを通知してもらうための機構。 って言葉で言っても理解できないと思うけど。 ・このインスタンスのこのメソッドを呼び出す手続きはこのデリゲートにある。 これさえあれば元のインスタンスもメソッドも知る必要はない。 てのがデリゲート(とそのデリゲートの実体)。 ・このデリゲートを渡しておくから、こういう状況が発生したときに登録した手続きを呼んでくれ。 てのがイベント。 ますます分からんな。
315 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 21:54:56 ] マルチキャストデリゲートが事態をややこしくしているのは間違いない。
316 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 22:03:54 ] デリゲートは「型」。intとかStringとかclass ほにゃららと一緒。 delegate void Foo(); ↑これが class Foo{...} とかと同じ、型の「定義」。 イベントは型の「メンバー」の種類のひとつ。フィールドやメソッド、 プロパティと一緒。 event Foo Bar; ↑これが int Bar() {...} (この場合メソッド)とかと一緒でイベントメンバーの定義。
317 名前:313 mailto:sage [2007/09/09(日) 22:05:59 ] >>314 さっそくありがとうございます。確かにまだまだわかりません。 質問させてください 例えばデリゲートA、オブジェクトB、オブジェクトCがあったとして、 オブジェクトB,CにデリゲートAを持たせるということですか? なんかインターフェースと同じ感じがするんですが、見当違いのこと言ってますか? >>これさえあれば元のインスタンスもメソッドも知る必要はない。 ということは、何かの手続き(一連の流れ)を実行するものがデリゲート? ってことですか?
318 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 22:13:17 ] じゃあ、メソッドが一つだけのインターフェイスのようなものだといったらわかる? Javaなんかだといちいち内部クラスでインターフェイスを実装したりしてたけど、 それが面倒だから言語に組み込んだだけ。 イベントはイベントハンドラを登録するメソッドと削除するメソッドを 一つにまとめたプロパティみたいなもの
319 名前:313 mailto:sage [2007/09/09(日) 22:19:07 ] >>315 マルチキャストデリゲートですか? ちょっとくぐってみます。ご指摘ありがとうございます。 >>316 classとintやstringが一緒ですか? ちょっとこんがらがってきちゃいました。 classについてもう一度調べてみます ありがとうございます
320 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 22:30:26 ] class String (クラス型) struct Int32 (構造体型) enum Keys (列挙型) delegate EventHandler (デリゲート型) 上の二つは今作った言葉だから使わないでね
321 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 22:31:43 ] デリゲートは、 ある型の引数を取りある型の戻り値を返すメソッドを なんでもいいから受け取って(インスタンスメソッドでも スタティックメソッドでもいい)、それを受け取った側が 好きなタイミング(ボタンが押された時とか)で実行できる仕組み delegateとeventはほとんと同じものだが、 eventに対しては+=と-=しか出来ない。 class Hoge{ public Action<int> Delegate; public event Action<int> Event; } Hoge hoge = new Hoge(); hoge.Delegate = new Action<int>(...); //ok hoge.Event = new Action<int>(...); //代入はNG hoge.Event += new Action<int>(...); //ok hoge.Event -= new Action<int>(...); //ok hoge.Delegate += new Action<int>(...); //ok.+=や-=もdelegateでも出来る。
322 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 22:34:59 ] > delegateとeventはほとんと同じものだが、 これはねーだろ、折角>>316 が解説してくれたのに delegateとそのインスタンスはこういう場合きっちり言葉を区別しようや
323 名前:313 mailto:sage [2007/09/09(日) 22:35:29 ] みなさん、親切にありがとうございます。 ただ私、ただいま頭がパンクしそうです。 一個ずつ整理していますので、レス遅れます。 すみません。
324 名前:313 mailto:sage [2007/09/09(日) 22:41:08 ] >>318 そうなると、インターフェースとデリゲートは一緒ということ? 例えばどんな場合にインターフェースでどんな時にデリゲートを使うんでしょうか?
325 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 22:47:20 ] しかしdelegateのインスタンスもデリゲートというのだよな デリゲートの使い方1 public delegate Result Hoge(Arg1 arg1, Arg2 arg2); こんな感じで引数と戻り値の型を規定する機能 デリゲートの使い方2 規定された型のメソッドを実際に保持するものもデリゲートという class Foo{ public Hoge Delegate; public event Hoge Event; } //実際のメソッド Result Method(Arg1 arg1, Arg2 arg2){ ... } Foo foo = new Foo(); foo.Delegate = new Hoge(Method); foo.Delegate = Method; //こうでもいい foo.Event += Method;
326 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 22:57:52 ] 313じゃないが盛れのバカな頭もパンクしそうでつ デリゲートの項目だけは何度復習しても理解不能なんだが ↑みてたら理解できそ・・・・・うにもないorz
327 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 22:59:13 ] インターフェースとデリゲートは全然違うもの たとえばあるクラスにHogeという名前のイベントがあったら、イメージとしてはそのクラス内に add_Hoge(EventHandler value)//valueをhogeに追加するメソッド remove_Hoge(EventHandler value)//valueをhogeから削除するメソッド EventHandler hoge //登録されたデリゲートを保持する実体(これ自身もデリゲート) これらが生成されると考えるといいよ。 クラス外部からのデリゲートの実体へのアクセスを登録と削除のみに制限するのが目的。 実際、addとremoveの処理を完全に自分で定義してしまうこともできて msdn2.microsoft.com/ja-jp/library/z4ka55h8 (VS.80).aspx プロパティにそっくりなのがわかると思う
328 名前:313 mailto:sage [2007/09/09(日) 23:00:11 ] >>325 使い方1はインターフェースのようなもの。 使い方2は実際の処理を+=などで保持するもの。 ということでいいでしょうか?
329 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 23:00:12 ] >>313 たぶん具象を知らずに抽象を知ろうとするからわからなくなるんだろうな。 とりあえず第一次接近としては、デリゲートは関数ポインタみたいなもの だと考えればいいと思う。 つまり、メソッドのメモリ上の位置(アドレス)に関する情報を格納するための データ型だと、とりあえずは思えばいいと思う。 デリゲート型の変数にはメソッドの位置情報が入っているわけだから、 当然その位置情報を利用してメソッドを呼び出すことも可能なはずだ。 イベントは、何らかの出来事(たとえばユーザーがボタンをクリックしたとき)に シバかれるデリゲート型のフィールドみたいなものだと思えばいい。 だから「ユーザーがクリックしたときにシバかれる」デリゲートに対して 予めフォームの中の適当なメソッドの位置情報をぶち込んでおいてやれば、 ユーザーがボタンをクリックした時にそのメソッドが呼ばれるというわけだ。 まああくまで第一次接近だからあんまり真に受けてもダメだけど、 概念的な理解としてはこれでいいと思う。
330 名前:313 mailto:sage [2007/09/09(日) 23:15:26 ] >>326 私も何度本を読んでみても理解できないのでここに書き込むことにしました。 お互いがんばりましょう。 >>327 これはイベントのことになるんでしょうか? EventHandler hoge にはadd_Hoge(EventHandler value)で追加された ものが入っているということでいいですか? >>329 デリゲートはポインタのようなもので、そこに実行させたい処理を入れる(+=で 複数登録できるんですよね?) そして、イベントが実行されたら、デリゲートのさすアドレスの処理(↑で登録したもの) を実行するって感じでいいでしょうか?
331 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 23:30:57 ] ボタン押した時実行させたい処理を入れるとか、 List<int> list = new List<int>(); list.Add(1);list.Add(2);list.Add(3); List<string> strList = list.ConvertAll<string>(IntToString); string IntToString(int x){ return x.ToString(); } コレクション全体に実行させたい処理を入れるとか、 使い道はいろいろだ
332 名前:313 mailto:sage [2007/09/09(日) 23:42:05 ] 自分が理解できない箇所がわかりました! イベントを登録するときに delegate 戻り値の型 イベントハンドラの名前(パラメータリスト); と宣言しますよね。このdelegateが曲者でした。 私の解釈ですが、 デリゲートは様々な処理をあるアドレスに入れておくもの。 イベントは何かされたとき(クリック等)にデリゲートに定義された 処理を行うこと。 というふうに理解しましたが、あってますか? なんかちょっと違う気がしてきましたが。
333 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 23:58:37 ] >>332 実際のところeventを無視してdelegateだけきっちり理解しておけば当面はそれでいいよ。 自分でGUIコントロール作ったりしない限りeventを自分で作ることはないから。 先にdelegateを完璧にしなはれ。
334 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 00:04:15 ] デリゲート(のインスタンス)は、単にある特定のメソッドを表している(指している)。 じゃ駄目なのかな? インスタンスメソッドとスタティックで微妙とかマルチキャストはとかあるけど、 その辺はおいおい理解していけばいいわけで、 まずは、デリゲートとは、なんらかのメソッドを指しているもの。
335 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 00:21:41 ] >>332 そうじゃないよ。 だから関数ポインタのようなものだとまずは理解せよ、と言っているじゃないか。 「様々な処理をあるアドレスに入れておく」(これちなみに意味不明だよ)のではなく、 処理のコードが書かれているメモリ上の位置、すなわちアドレス「を」入れておくんだよ。 >>333 >自分でGUIコントロール作ったりしない限りeventを自分で作ることはないから。 これはおかしいというより、完全に認識違いだよ「w イベントっていうのはGUIにまったく限らない。 典型的には何らかのデバイスの状態が変化したときとかね。 例えばCDドライブを抽象化したクラスがあるとして、 トレーが開かれたときにイベントでそれを通知する、というのは想像しやすいシナリオでしょ。
336 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 00:25:02 ] 内部のことを言えば、スタティックメソッドを登録した場合はメソッドのポインタ インスタンスメソッドを登録した場合はメソッドのポインタ+インスタンスのポインタ をデリゲートは持っている デリゲートを実行すると、ポインタを辿り、そのインスタンスのそのメソッドを実行する といった感じ
337 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 00:38:01 ] >>332 うん、いやだからdelegateは型だって。もっというと特殊なclass。 ここをまずは押さえよう。とりあえずeventは忘れて。 順番に行こう。まずdelegate型を定義してみる。 internal delegate void Foo(); 書き方はクラスとずいぶん違ってみえるけどね。 で、delegateはclassだからclassっぽく使える。 Foo foo = new Foo(HogeMethod); こんな感じに。Fooクラスの変数fooにFooクラスをnewしてぶちこんでるわけだ。 コンストラクタにメソッドを渡してね。コンストラクタがちょっと特殊なだけだね。 class Hoge { private Foo foo=null; } こうも使える。Foo型のフィールドね。 void Hoge(Foo foo){ //... } メソッドのパラメータにも。
338 名前:333 mailto:sage [2007/09/10(月) 01:39:06 ] >>335 >これはおかしいというより、完全に認識違いだよ「w すまん、確かに言うとおりだが、 >トレーが開かれたときにイベントでそれを通知する、というのは想像しやすいシナリオでしょ。 そんなクラスを>>332 が作るというのは本当に想像しやすいかw >>332 が「CDドライブを抽象化したクラス」の必要を感じるころには多分イベントで困ることもなかろう。
339 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 02:03:24 ] 正直どんな場合にせよeventを使おうとは思わないんだよな delegateだって+=も-=も出来るし、代入して入れ替えることも出来る +=と-=だけに制限する意味がわからない タスクトレイが開いた時の動作だって入れ替えたくなる時があると思うんだよな
340 名前:デフォルトの名無しさん [2007/09/10(月) 02:12:03 ] >>339 イベントを通知されるクラスが、他の通知されるクラスを意識しなくていい様にするためじゃね =で上書きしたら他に通知されるクラスに上書きを通知しなくちゃいけなくなる
341 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 03:33:56 ] デリゲートは理解するのに自分も結構苦労たなぁ >>320 が理解できてればなんとなくわかると思う。 >>332 補足 internal delegate void Foo(); これでFooと言うデータ型を作った、と考えればいいと思う。 つまり、戻り値がvoidで引数を取らないメソッドを代入できるデータ型。 Fooはデータ型なので、変数を定義するときに使用する ただ、そもそもデータ型という単語の使い方が間違ってないかすごく不安。誰か教えてorz int型はデータ型だけど、元をたどれば構造体ってことを考えれば、 C#におけるデータ型の意味は、定義されたもの全般・・・と考えてます
342 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 03:39:42 ] ごめんミス つまり、戻り値がvoidで引数を取らないメソッドを代入できるデータ型。 ↓ 戻り値がvoidで引数を取らないメソッド(のアドレス)を代入できる変数、を作るデータ型。
343 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 03:47:26 ] まあC#も3.0にもなれば、継承やinterfaceを使ってたところは 大部分がdelegateとラムダ式に置き換わると思うから ここは理解しといて損は無いというか必須になっていくと思うよ
344 名前:313 mailto:sage [2007/09/10(月) 07:44:08 ] みなさん、ありがとうございます。 >>335 ポインタだからメモリ上のどこかにアドレスが割り当てられる。ということですよね。 あとはこのアドレスから呼び出す処理をすれば、そのアドレスにある 処理が実行されるってことでいいですか? >>337 デリゲートは型。 Foo foo = new Foo(HogeMethod); でFool型のfooをインスタンス化する。 このときにメソッドを引数ととる。 classは引数にint型やstring型をとるが、デリゲートはメソッドを引数にとることができる。 class Hoge { private Foo foo=null; } int i = nullのようにデリゲートにもnullが代入できるってことですよね? ゆえにデリゲートはclassやint,stringと同じように型になるってことですね?
345 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 08:30:08 ] >>344 まずはデリゲートの機能の物理的イメージを持つのが先決だと思う。 多分ここのほかの人が言ってるような「デリゲートは型でイベントはクラスの メンバで〜」みたいな抽象的な話を聞いても、余計わからなくなるだけ。 >ポインタだからメモリ上のどこかにアドレスが割り当てられる。ということですよね。 >あとはこのアドレスから呼び出す処理をすれば、そのアドレスにある >処理が実行されるってことでいいですか? だから、たぶん変に誤解してるよ。 プログラムというのはメモリ上に置かれる、というのはOK? だから関数(メソッド)というのも当然メモリ上の位置というものを持つはずだ。 関数ポインタという変数は、その関数のメモリ上の位置を格納するための変数だ。 もちろん「関数ポインタ」という変数自身もメモリ上の特定の位置に存在する わけだが、それはとりあえずデリゲートを理解するためにはどうでもいい。 関数ポインタは関数がメモリ上のどこの位置に存在するかを「知っている」から、 それを利用すれば関数を呼び出すことができるでしょ? 以上のようなイメージを理解することが先決だと思うよ。 ただ、これはあくまでたとえ話であって正確じゃないことを理解しておくことも 一方で重要。
346 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 11:11:09 ] すいません。馬鹿みたいな質問ですが、よろしくお願いします。 double result = Math.Cos(1/4); とした場合、result には 1.0 が入ってしまいます。 私としては 0.999990 がほしいのですが、勝手に四捨五入されてしまいます。 どうしたらよいのでしょうか。
347 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 11:16:37 ] www.atmarkit.co.jp/fdotnet/csharp_abc2/csabc2_005/cs2_005_02.html
348 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 11:23:23 ] >>347 ありがとうございます。 これみても double は、0.99999 を扱えると思うのですが・・・
349 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 11:29:30 ] >>348 1/4がいくつか知ってるか。
350 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 11:33:28 ] >>349 すいません間違えました。 double result = Math.Cos(1/30); です。
351 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 11:34:29 ] >>350 そうじゃなくて。 1/30 は整数/整数で答えは整数の 0 だろ 1.0/30 とかでやってみそ
352 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 11:36:30 ] >>346 0.999990が四捨五入されて1.0になってると思ってるのなら大間違い
353 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 11:40:20 ] >>351-352 大間違いしてました!ありがとうございますm(__)m
354 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 12:37:40 ] VBだと/使うと演算結果はオペランドの型によらずdoubleになるのが基本だけど、 これはc#のルールの方がシンプルでむしろ初心者向きに感じるな。
355 名前:313 mailto:sage [2007/09/10(月) 12:40:30 ] >>345 ありがとうございます。メモリ上に関数ポインタが割り当てられ、その関数ポインタにはメソッドのアドレスが格納している。 この辺りはOKです。(私の表現は下手ですが) デリゲートは関数ポインタということでいいですよね? 初めて携帯から書くので見にくかったらすみません
356 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 12:46:03 ] >>354 CもC++も、C#と同じだと思ったけど
357 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 13:09:48 ] VB / 商が実数になる割り算 ¥商が整数になる割り算
358 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 13:51:20 ] delegateって typedef void* Foo ≒ delegate void Foo って覚えたらだめなの? 俺の場合C#が先だったから、関数ポインタは delegate void Foo ≒ typedef void* Foo って覚えたんだけど…
359 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 13:57:44 ] 割ったら切り捨てだろ 少数なんて邪道だぜ
360 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 14:14:29 ] >>357 なんか間違ってないか?
361 名前:360 mailto:sage [2007/09/10(月) 14:32:37 ] ごめん。勘違い。
362 名前:ガチャピンの外の人 ◆GaTtuN/dqE mailto:age [2007/09/10(月) 18:45:14 BE:254472252-2BP(1300)] すごくいいIDの男発見!!!!!!!! 715 :私事ですが名無しです:2007/09/10(月) 14:27:10 ID:TAkaKazu0 ところで俺のIDを見てくれ こいつをどう思う? 716 :私事ですが名無しです:2007/09/10(月) 14:44:34 ID:R76+t3Z/0 すごく・・・いいです 717 :私事ですが名無しです:2007/09/10(月) 14:44:45 ID:H/zeEu5e0 記念かきこw news21.2ch.net/test/read.cgi/news7/1189188763/
363 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 19:33:29 ] コピペ君って馬鹿だな、まで読んだ。
364 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 20:41:09 ] >>358 スレチなんで適当に答えるが関数ポインタ間違ってるぞ あとインスタンスメソッドの場合のポインタはもう一息いる まあdelegateありがたがりやがれという話だ
365 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 22:38:02 ] ラムダ式が中心になったら脱落者続出だなあ
366 名前:313 mailto:sage [2007/09/10(月) 22:43:33 ] 今また調べていたんですけど、どうもデリゲートの使い方というか、 どのタイミングで使うかがいまいちピンときません。 あるデリゲートを個々のクラスで定義して、様々なメソッドから呼び出す ため?ということでしょうか? またバカな質問してる気がしますが。
367 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 22:44:27 ] >>365 中心ってなんだろうねw
368 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 22:46:39 ] >>366 ぴんと来ないなら使う必要なし。 必要になったら使え。
369 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 22:49:09 ] >>367 いったいなんだろうねw
370 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 22:49:26 ] >>366 とりあえずはイベントハンドラとしてだけ使っとけばいいだろ
371 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 22:59:18 ] >>366 @ITの記事は読んだ? www.atmarkit.co.jp/fdotnet/onepoint/onepoint03/onepoint03_01.html あと、川俣のc#入門は? www.atmarkit.co.jp/fdotnet/csharp_abc2/csabc2_013/cs2_013_01.html とりあえずこれ読んでからだな。タダで読めるんだし。
372 名前:313 mailto:sage [2007/09/10(月) 23:22:10 ] >>368 仕事で、外部の人が作ったものを私がUpdateすることになったんです。 C#使える人がこの会社にいないんで。。。 >>371 参考URLありがとうございます。 私はいつも下のHPを見ていました。 ufcpp.net/study/csharp/sp_delegate.html www.kumei.ne.jp/c_lang/cs/cs_45.htm 教えていただいたHPで勉強して出直します。 ありがとうございました
373 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 23:36:23 ] 川俣かよ
374 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 23:37:14 ] 前任者がどこで使ってたかソース見ればなんとなくわかるんじゃないか?
375 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 23:42:53 ] >>373 人物はアレだが書いてることは別におかしくないだろw というか、読んでみると結構わかりやすくていい記事だぞ
376 名前:デフォルトの名無しさん [2007/09/11(火) 00:56:19 ] interfaceのメソッド実装するとき、直入力が面倒なんですが、 インテリセンスを効かせる方法ってありますか?
377 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 01:01:03 ] ああ、Eclipseのアレみたいなのか それ自分も知りたかった
378 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 01:21:23 ] >>376 class Hoge : IHage のIHageにマウスのせるでてくるやつじゃなくて?
379 名前:デフォルトの名無しさん [2007/09/11(火) 01:35:12 ] あー、そこから右クリックでメニューでますね メソッド名途中入力とかの線しか考えてなかったので目から鱗です。 これでちょっと楽になりそうです。ありがとうございました。
380 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 01:37:19 ] なるほど 俺からもありがとう
381 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 04:30:07 ] 私はJava経験者ですが、今C#を勉強中で分からないことがあるので質問です。 親クラスのメソッドを上書きするとき、Javaでは常にオーバーライドですが、 C#ではnewによって新しいメソッドとして定義する方法と、 overrideによってオーバーライドする方法があるじゃないですか。 この2つのうち、newでやる方法の価値が分からなく、教えてもらいたいです。 ちなみに、実装時のnewとoverrideの違いは把握してます。 今の私の考えでは、全部overrideでいいのでは?と思うし、 むしろnewなど無い方がよいとさえ思っています。
382 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 05:24:51 ] ベースクラス実装者が想定していないオーバーライドを許可すべき ではないかつ継承先のことを考えながらコード書くことのほうが少ない かつvirtualメソッドのほうが高コストとかもろもろ newがよく使われているのは経験上staticメソッドが重複する場合、 コンポーネントメンバの属性値の変更、COMインポートなインターフェイス、 内部的にはもうちょいあったかな
383 名前:381 mailto:sage [2007/09/11(火) 07:50:32 ] >>382 >ベースクラス実装者が想定していないオーバーライドを許可すべき >ではないかつ継承先のことを考えながらコード書くことのほうが少ない でもそれって、virtualにしなければいいというだけの事ですよね。 オーバーライドされたくないなら、そのシグネチャのメソッドは 「子クラスでは実装禁止!」でいいじゃないですか? 何であえて、newとか使って再定義できるようにしてるのかが、 分からないんです。 ちなみに、何でnewを悪者扱いするかというと、例えば クラスBはクラスAを継承してて、 さらに、AのhogeメソッドをBクラスがnewで書き換えてるとして、 -------------------- A a = new B(); a.hoge(); -------------------- この場合実行されるhoge()はAの実装の方ですよね? それってつまり、親クラスの型に子クラスのインスタンスを代入するという事が 安全じゃないって事だと思います。メソッドの引数や戻り値に関しても同じで、 作ったインスタンスは、その型のままにしておけという事になります。 そうなると、引数や戻り値に親クラスを指定できなくなり、 汎用性を持たせられなくなってしまいます。 私がnewに否定的な理由はこれですね。 ちなみに、staticメソッドの場合はいいと思うんですよ、 staticはあくまでもその「型」にくっついているわけだし。 と、長く書いてしまいましたが、よろしくお願いします もし、前提知識がそもそも間違っているとかありましたら、すいません。。
384 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 08:19:30 ] >>383 あのね、そんな馬鹿でも分かる例あげる前に俺があげた例調べた? BCLで標準的に使われているものや経験上必要だったものを挙げたんだが 聞く気がないんなら帰ってくれ あとJavaやってたらしいから前段はvirtualがデフォじゃない説明だから わかってるなら読み飛ばして。
385 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 08:24:58 ] そんなの調べろっていわれても困るでしょ そんな能力あったらこんなスレで質問しねえよw 間違ってるか? >>383 むしろAの型の変数に入っていれば安心してAとして扱えることを 保障するための仕組みじゃないの?
386 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 08:38:45 ] >>385 なら〜ってなんですか?って聞けよ こっちが挙げてみたら分かりきってる講釈たれてそれに反応なし、 同意だけ求めてるのが透けて見えるだけの確証バイアス野郎じゃねーか
387 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 08:46:18 ] >>381 はただしいよ 終了
388 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 09:04:39 ] >>381 >この場合実行されるhoge()はAの実装の方ですよね? それでいいんじゃん。わざわざAの参照で宣言してるんだから、欲しいのは Aの規約に則った実装でしょ。なんでAとは無関係の実装であることを newで明治したメソッドが派生型で定義できると困るの? ちゅーかnewって、派生型で既に定義されているシグネチャが あとから基底型で定義されてしまった場合に、派生型を前提とした コードへの影響を最小限に抑えるための一時しのぎって印象なんだけど。
389 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 10:14:52 ] 派生クラスとたまたまシグネチャが被るインターフェイスのメソッドを実装したいときとか インターフェイスの明示的実装というのもあるけど、それだとインターフェイスのメソッドの方が隠れちゃうから どうしてもインターフェイスのメソッドの方を見せたいとき そんな場合本当にあるのか知らんけどw
390 名前:389 mailto:sage [2007/09/11(火) 10:17:06 ] >>389 訂正 ×派生クラス ○基底クラス
391 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 10:42:53 ] >>381 =387 この人は既に固定観念に捕らわれているし、聞く耳もたない みたいだから何言っても無駄かと。
392 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 10:52:23 ] >>391 お前こそちゃんと読め
393 名前:381 mailto:sage [2007/09/11(火) 11:22:02 ] >>384 >>386 まだ、調べていませんが、私が知りたいのは用途ではなく、 存在意義だとか利用価値だとか、少し概念的な事だったんです。 それが伝わっていなかったようなので、>>383 で自分の考えを述べて、 これについての意見をもらおうと思ったんです。 このことを>>383 でちゃんと書いておくべきでした。 決して無視したつもりではないんですが、結果的にそう取られてしまったようで… >>385 でも仮にBがhogeをoverrideしてた場合は、Bのhogeになるわけですが、 使う側はそのメソッドがnewなのかoverrideなのか判断でないし、 使い分けもできません…よね?(できるのかな?) そう考えると、今hoge()を実行しようとしているけど 果たして「どの型に定義された実装を使うべきなのか?」 という疑問が、使用者に常に付きまとってくるわけで、 そのような不安要素を作り出してるだけのような気がするのです。 >>388 AのサブクラスでB1,B2があるとして 状況によって、B1とB2のどちらかのインスタンスを返すメソッドがあった場合。 戻り値の型はAにすると思います。 そのメソッドとしては、戻り値をB1やB2として使って欲しい。つまりB1やB2のhogeを使って欲しい。 しかし、使用者としては、戻り値の型がAだから、Aのhogeを使わざるを得ない。 という状況になり、メソッドの作成者の意図と違う使われ方をしてしまいます。 親クラスを後から修正した場合の影響を抑えるっていうのは、確かにそうですね。 親は、子がどれだけ存在していて、どんなメソッド定義してるかなんて知らないですもんね。 なるほど。。それはそうですね。
394 名前:381 mailto:sage [2007/09/11(火) 11:22:51 ] >>389 でも、違うメソッドなら違うシグネチャであるべきなのでは? 逆に同じシグネチャのメソッドなら、オーバーライドされるべきなのでは? と思ってしまいますw >>391 私は387ではないですよw たしかに、固定観念にとらわれているかもしれないです。
395 名前:381 mailto:sage [2007/09/11(火) 11:32:02 ] なんか、>>394 途中で切れたw >>389 でも、違うメソッドなら違うシグネチャであるべきなのでは? 逆に同じシグネチャのメソッドなら、オーバーライドされるべきなのでは? と思ってしまいますw >>391 私は387ではないですよw たしかに、固定観念にとらわれているかもしれないです。 でも聞く耳を持ってないわけじゃなく、自分なりに納得のいく解答が得たいと思っているだけです。 おかしなことを言っていたら、そこを指摘してくれると助かりますw
396 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 11:32:41 ] >>393 >でも仮にBがhogeをoverrideしてた場合は、Bのhogeになるわけですが、 >使う側はそのメソッドがnewなのかoverrideなのか判断でないし、 >使い分けもできません… 判断も使い分けもできる。そのために宣言にnewやoverrideをはっきり付けてるわけだし、 似た機能の、インターフェイスの明示的実装もあわせてMSDNに全部明記されてる。
397 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 12:16:51 ] 読むの疲れるからもっと質問は簡潔にしてくれ…。 俺は初心者で勉強のつもりでこのスレ見てるけど、めっさ疲れるわ。 あと…自演してないだろうな?w
398 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 12:18:11 ] >>393 BCLっつー模範的なライブラリで使用されてたりする手法や実際に 使われている手法を先に知らないで存在意義やら糞もあるのかよ。
399 名前:385 mailto:sage [2007/09/11(火) 12:24:03 ] >>393 反論になってないと思うなあ。。 短いレスだからもう一度よく読みなおして欲しいよ。 個人的にはメソッドのシャドウの意義を知るには、 Winフォームのコントロールをいろいろカスタマイズしてみるのがいいと思う。 きっと、「そうかこういう場面で必要になるのか」ということが体感できると思う。
400 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 12:31:04 ] >>395 >でも、違うメソッドなら違うシグネチャであるべきなのでは? >逆に同じシグネチャのメソッドなら、オーバーライドされるべきなのでは? 同じ人が同時に開発してるならね。 この辺も読んでみるといいのでは? ttp://d.hatena.ne.jp/siokoshou/20070901#2 ttp://d.hatena.ne.jp/siokoshou/20070903
401 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 12:57:25 ] ところで、>>383 の場合でさらにBを継承するクラスCがあったとして CでAのhogeをオーバーライドすることは不可能なの? 俺は381じゃないよ
402 名前:381 mailto:sage [2007/09/11(火) 12:59:28 ] >>396 >判断も使い分けもできる。そのために宣言にnewやoverrideをはっきり付けてる それは、呼び出される側のコードを見て判断しろということですか? あと、一応MSDNのその辺の情報は目を押してるつもりです。 >>397 文章力のなさが問題ですね。申し訳ない…色んな事が未熟者の私です。 とりあえず、一番言いたいことは>>393 で書いた>>388 へのレスかなー あと、自演などしてないですww >>398 効果が分かっていて、その効果自体がいまいち納得できないので、 使い方云々の話ではないのと考えてます。 とはいっても、BCLとかは勉強の為に参考にしてみようとは思ってますが。 >>399 >むしろAの型の変数に入っていれば安心してAとして扱えることを保障する というのに対して、「もしoverrideだったら、実行されるhogeはAの実装の方じゃなくなるから 保障はされてないじゃないですか。」と言ったつもりで、 それが反論になってると思いましたが。。 一応プログラムも、作ったりしてるんですが、今はまだ体感できてないですね。 その時を待つしかないのかな。。。 う〜ん、 メソッドの戻り値や引数を親クラス型で定義出来ないじゃん っていうのが、本当に言いたいことなんですが。 なんか、伝わってなかったりしてるのかな
403 名前:デフォルトの名無しさん [2007/09/11(火) 12:59:52 ] お前らなんでも継承して楽しようとしてんじゃねぇぞゴルァ 男だったら1からつくれ
404 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 13:11:33 ] >>393 >しかし、使用者としては、戻り値の型がAだから、Aのhogeを使わざるを得ない。 >という状況になり、メソッドの作成者の意図と違う使われ方をしてしまいます。 そのメソッドの作成者はAのhogeとは関係無いhogeを持つというBの規約を知っているはずでしょ。 それなのにAを返すのはAのhogeを使って欲しいからなんじゃないの? ちゅーかnewの存在意義は>>388 の下半分だけで考えてくれよ。 仮に、新規に派生した時に基底のメソッドと同じシグネチャをnewで宣言しちまうような 馬鹿が出てきたとしても、newを導入しないと回避できない問題なんだから。
405 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 13:19:37 ] newは、オーバーライドしないという意図をはっきり示すものだろ 基底クラスのメソッドが呼ばれてもいいと考えてやってるんだから何の問題もない
406 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 13:58:27 ] うん、BCLとか使用法とか以前のレベルな気がしてきた。 実際に使ってるものを使い方もしろうともせんでいきなり「いらないですよね!」 ってわけわかめなことのたまうから気にもとめてなかったが
407 名前:381 mailto:sage [2007/09/11(火) 13:59:11 ] >>400 リンク先読みました。それと>>388 から考えると、 newとoverrideの2つが存在する理由は、親クラスへの変更が後から入った場合でも、 既存のクラスへの影響を小さくする為って事なんでしょうね。 >>404 >そのメソッドの作成者はAのhogeとは関係無いhogeを持つというBの規約を知っているはずでしょ。 それは知らないという前提でした。 でも、そこまで意識して作るのがC#のコーディングスタイルってことなんですかね。 >それなのにAを返すのはAのhogeを使って欲しいからなんじゃないの? どのメソッドを使って欲しいとか、そういうのは意識してなくて、 単純にB1とB2を両方扱えるからっていう理由で、Aにしたんです。 >ちゅーかnewの存在意義は そこは理解できました。親の変更の影響を受けないためですね! >>405 >基底クラスのメソッドが呼ばれてもいいと考えてやってる えっ、そういうものですか? 呼んで欲しいから、実装してるんだと思いますが。。
408 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 14:29:47 ] 先にBのhogeがあって、その存在を関知しない人が後からAにhogeというメソッドを追加したら、 そればBのhogeと名前は同じだけど意味が違うものだろ BのhogeはBのhogeとして使ってほしいから実装されたものであって、 勝手にAのhogeとして呼び出されるようになっちゃったら困る
409 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 14:32:39 ] C#はC++の進化系という建て前なので、 C++に隠蔽があるからサポートしてみましたじゃダメなのかな。 C++でデフォルトvirtualじゃなくて隠蔽なのは主にパフォーマンス上の理由だが、 .NETにそれがあるかどうかはわからん。 overrideに対してvirtualがあるのにnewに対してnewable(?)がないのは、 継承もとのクラスに対してなんら影響がないからだろう。
410 名前:デフォルトの名無しさん [2007/09/11(火) 14:43:29 ] BCLラジオ?
411 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 14:46:17 ] newってsealedされてるメソッドやらプロパティを派生先で上書きするための 裏技的キーワードだと思ってたんだけど、違うのか…
412 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 14:46:31 ] ICloneableなんか実装してみると便利さも分かる。 まあICloneableを実装することはあまりないが、イメージとして。
413 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 14:59:09 ] そういえばなんでsealedメンバを隠すときはnew付けないといけないんだろう どうせ継承できないんだから無意味なんじゃないの?
414 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 15:41:13 ] >>413 親クラスに同名のメソッドがあることを忘れて上書きしちゃうとバグの原因。
415 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 15:48:32 ] >>412 トップレベルのクラスがClone()の中でMemberwiseClone()を 使ってくれてなければ隠蔽するしかないものな。
416 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 15:55:13 ] newはたとえば戻り値を元の型の子クラスやなんかにしたいときに 便利だぞ
417 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 16:42:31 ] >>412 はつまり>>416 と同じことが言いたかった。
418 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 19:00:18 ] >412 返り値の型がね微妙なんだよ。返ってくる型は決まってるのにダウンキャストが必須というのはアホな実装だと思うんだよ。 インターフェースの明示実装と型指定のCloneを両方実装したら そのクラスを継承した時返り値の型が違うCloneを実装できないわけでやはり微妙なんだよ。 そうなるとGenericsで何とかならんのかと思ったが何ともならなくて残念だったよ。 だからICloneableみたいな微妙なのはない方がいいよ。
419 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 19:06:40 ] new(とうかベースクラスのメンバのシャドウ)の意義が、ベースクラスに後から 自由に(派生クラスのことを気にせず)メンバを追加することを可能にすることにある、 って意見は俺はまったく見当違いだと思うなあ。 それはただ、「そういう風にも使える」ってことに過ぎないでしょ。 第一そんな事態はめったにないし、シャドウは問題の完全な解決には全然ならないもん。 困らないのはコンパイラだけじゃんw メインの用途は本来オーバーライドできないメンバへのアクセスにフックを入れることでしょ。
420 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 19:17:03 ] >>419 >メインの用途は本来オーバーライドできないメンバへのアクセスにフックを入れることでしょ。 new使って本気でhookできると思ってるのか、それとも俺様定義のhookなのかどっち?
421 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 19:26:20 ] >>420 たぶん君が「フック」の意味を俺様定義とうか、 変に狭義に理解してるだけだと思うけど。。 まあフックという言葉がお気に召さないのなら「フックを入れる」の部分を 「処理を割り込ませる」あるいは「処理をとっかえる」と読んでもらっていいよ。
422 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 19:57:30 ] >>421 ごめん。 もしかして世間では下のようなのもhookって言うの? だったら俺が悪かったってことで許してくれ。 public class Base { public sealed override string ToString() { return "Base! Base!"; } public sealed override int GetHashCode() { return 1; } } public class Deriv : Base { public new string ToString() { return "とっかえたよ!"; } public new int GetHashCode() { Console.WriteLine("割り込んだよ!"); return base.GetHashCode(); } }
423 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 19:57:44 ] >419 そのような思想の元に Dispose()をnewで置き換えてあったクラスを見た。 Dispose(bool)もなにやら別の実装があった。 IDisposable.Dispose()も明示実装されていたがそれも実装が違っていた。 それが継承されてまたDispose()がnewで… 変なことやり出すと害があるだけでまともに動かないものになるだけだぞ。
424 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 20:39:08 ] >>419 逆でしょ。バージョン管理がnewの主目的であって、「そういう風にも使える」ように 見えてしまうのは任意のメソッド置換の方。 そもそもC++では無言で隠されてしまうところをなんでわざわざコンパイラが警告出して newで潰す必要があるのか考えてみてよ。 それ以前にC#において「オーバーライドできないメソッドにフックを入れる」の 意味が全然わからん。
425 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 20:57:14 ] >>421 それ「も」フックの一種でしょ。 それ「が」フックとは言わないけど。 >>423 思考が倒錯しとるよ。 そもそも「害がある」と予想されるからオーバーライド禁止してるわけ。 それを承知でやるのがシャドウだよ。
426 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 21:16:11 ] >422 HashtableのキーにnewでGetHashCodeとEqualsを置き換えたクラスを使ったら 間違いなくobjectのGetHashCodeが呼ばれる。newで置き換えた方は呼ばれることはない。 だけど、そういうクラスを実装した人はnewで置き換えたメソッドが呼ばれることを期待してバグだって騒ぐんだと思うよ。 newでの隠蔽はJavaでは避ける手段がなかった基底クラスがバージョンが上がってメソッド名がかぶったときの変更の影響を なんとかするための必要悪なものなんで普段は使うべきじゃない。
427 名前:デフォルトの名無しさん [2007/09/11(火) 21:23:02 ] アンマネージリソースを安全に管理するために、 SafeHandleクラスを継承しようと思っているんですが、 ReleaseHandleとIsInvalidをオーバーライドするだけでいいんでしょうか (実際にはCreateToolhelp32Snapshotでプロセスのスナップショットを得たいので、 CriticalHandleMinusOneIsInvalidから継承したハンドル管理クラスを作る) 具体例的に解説しているサイト等あったら教えてください。 MSDNのサンプルには [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] なんて属性もでてきたりするんですが、意味がわからなくて・・・
428 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 22:12:13 ] ふらっとの域を超えてないか?
429 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 22:32:32 ] ちなみに私はついてけないぜ。 既に基本的な用語と思われるフックもシャドウもわかってなくて今必死に読んでる始末。
430 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 22:38:27 ] 相談室ががらんとしてる。
431 名前:427 mailto:sage [2007/09/11(火) 22:56:24 ] 失礼しました。 相談室で聞いてきます・・・
432 名前:429 mailto:sage [2007/09/11(火) 23:09:07 ] と思ったらすぐ出てきた。シャドウってVBでの隠蔽newに対応するキーワードなのね フックに関しては・・・とりあえずいじくっちゃいけなげなイベント処理を強引に差し替えるもの? >>420 を察するに本来はオーバーライドとか隠蔽とかイベント差し替えとか全部さすっぽいけど >>427 の内容はまだ当分自分には縁がなさそうだ・・・ あと手元の入門書だと隠蔽newの使い道は、 既に完成したプログラムを改造・拡張するときに、 そのプログラムにあったの汎化クラスを継承する際、virtual指定されてないメソッドを上書きしたい時。 と書いてあったけどこれじゃだめなん?
433 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 23:31:02 ] シャドウとかシャドーイングってVBと関係ないんじゃない? 文字通り隠蔽の意味だけど。 ローカル変数がフィールドをシャドウする、みたいに普通に言うと思うんだけど。
434 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 23:47:41 ] >virtual指定されてないメソッドを上書きしたい時。 どこぞのコンパイル時メタプログラミングじゃあるまいし、それがC#でなんの役に立つのかしら。 それができるようになっちゃうからnewが必要悪と言われる所以だと思うんだけど。 その本のタイトルぷりーず。
435 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 23:51:00 ] >432 その入門書に書いてある文章からはしょったかして意味が変わってる気がする。 基底クラスは他者の作成したライブラリ、サブクラスを自分が作成したプログラムで 基底クラスがバージョンアップに伴ってメソッドが増えて 自分の作成したサブクラスに基底クラスと同じ名前のメソッドが発生したときに メソッド名を変更するのは影響範囲がでかい時に変更の影響を小さくするためにnewで隠蔽を使う みたいな感じに書いてなかったか?
436 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 23:55:51 ] だからそれはそんな風にも使えますよ、ってだけの話だって。 当たり前じゃん。 外人さんが書いた本だとたいていそういうことが書いてあるよね。 でもそういうのは「アカデミックな」話題としては興味深いし面白いとも思うが、 そんな実用性がゼロに近い用途が主目的なはずがないだろう。
437 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 00:08:53 ] virtual指定されてないメソッドを上書きしちゃダメに決まってるだろ ベースクラスとして実行した時と動作が変わったら混乱の元にしかならない そんなんnewしなくても名前を変えればいいだけの話だろう 戻り値の型を変えたいときなんてのはnewしたメソッドもoverrideしたメソッドも 全く同じ動作をするけど戻り値の型がより正確になってキャストが不要になるというだけの話だし それ以外でnewを使っていいのはベースクラスが勝手にメンバ追加して名前がかぶっちゃった時だけ というか継承自体するべきじゃない
438 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 00:19:45 ] >>437 言わんとしていることはよく分かるのでちょっと指摘しておくと >virtual指定されてないメソッドを上書きしちゃダメに決まってるだろ は >戻り値の型を変えたいときなんてのはnewしたメソッドもoverrideしたメソッドも >全く同じ動作をするけど戻り値の型がより正確になってキャストが不要になるというだけの話だし の引数版としてあり得るかな。 Genericsが無かった時代は基底クラスが object get/set なメソッドになりがちで 派生クラスのメソッドやインデクサをtypedにするには隠蔽が結構便利だった。 ただ、その用途は Generics の登場によって激減してるので、 最近ではバージョン管理の方に魅力を見いだす人が増えてるとしても そこまで不思議じゃないのかもしれん。 言わんとしていることはよく分かるのであんまり気にしないでくれ。
439 名前:438 mailto:sage [2007/09/12(水) 00:27:16 ] >>437 ごめん。 「virtual指定されてない」ってのの意味がやっとわかった >>438 は忘れてくれ。
440 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 00:28:16 ] 何言ってるかよくわからん 引数の型が違うならnewできないんじゃねえの というかoverrideできないものをnewで上書きしたら動作が変わるだろ
441 名前:440 mailto:sage [2007/09/12(水) 00:29:00 ] すまん入れ違いになった
442 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 13:54:33 ] ファイルの末尾をシークするって、 ファイルの末尾に移動する、見たいな意味でいいんですよね?
443 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 14:32:53 ] いやよくない
444 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 15:31:43 ] テキストボックスに12桁の数字を打ち込んで、奇数桁だけ取得するにはどうすればいいですか?
445 名前:デフォルトの名無しさん [2007/09/12(水) 15:47:06 ] string s って定義してあれば、s[0],s[1]とかで、一文字ずつアクセスできるから後はがんばって抽出すればよい
446 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 16:38:58 ] すいません。P/Invoke の質問です。 P/Invoke で構造体を取得するのですが、この構造体のメンバは int と、さらに構造体が配列で含まれています。 今のところ、この構造体の int は取得できているのですが、配列に格納されている構造体が取得できていません。 P/Invoke で、構造体中に含まれた構造体の配列を取得することは可能なのでしょうか?
447 名前:デフォルトの名無しさん [2007/09/12(水) 17:01:08 ] charみたいだな。string恐るべし
448 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 17:14:08 ] StringクラスのインデクサがCharAt()メソッドのエイリアスになっているから。 >>444 のケースなら textBox1.Text[ n * 2 + 1 ] みたいにすればよかろ。
449 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 17:59:55 ] >446 多分無理。 方法があったら教えて欲しい。 byte[]で受け取ってそれをfixedしてサイズ分1個ずつMarshal.PtrToStructureで取得してくとかでできるがあんまりスマートじゃない。
450 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 18:09:03 ] >>449 やはりそうですか。 SDK 2.0 のサンプルに構造体を取得したり、構造体の配列を取得したりはあったのですが さらに複雑なものはありませんでした。 スマートじゃないですが byte[] で受け取っていく方法もありますね。 この方法を試されたかたはいらっしゃいますか?
451 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 18:23:14 ] >>446 複雑なP/InvokeはC++/CLIでラップするのも一手。
452 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 18:33:08 ] 配置を真似した構造体を定義してunsafeで無理矢理
453 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 18:38:36 ] IntPtrとかGCHandle 組み合わせてるなあ
454 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 18:48:38 ] textBox1のAllowDropをtrueに設定して、 以下のコードを書き、ファイルを2回ドロップすると、 なぜか2回分のMessageBoxが表示されます。 3回だと3回分表示されます。 しかしcountの値は下がっていきます。 なぜなのでしょうか? 何か対処法があればお願いします。 private void textBox1_DragEnter(object sender, DragEventArgs e) { int count = 0; if (e.Data.GetDataPresent(DataFormats.FileDrop)) { e.Effect = DragDropEffects.Copy; } else { e.Effect = DragDropEffects.None; } textBox1.DragDrop += delegate { string s = ((string[])e.Data.GetData(DataFormats.FileDrop))[0]; MessageBox.Show(s, count.ToString()); count = count+1; }; }
455 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 18:55:57 ] >>446 今外出先なので検証できんのですが…… 構造体配列の各要素の先頭アドレスを計算して、各々に対してMarshal.PtrToStructure()を使えば取得できるかもしれん。
456 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 18:56:57 ] >>454 DragEnterの度にイベントハンドラが増えてるからじゃないのか
457 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 18:59:06 ] >>454 毎回countを宣言&初期化しなおしてるじゃねえか。
458 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 18:59:12 ] >>449-450 どう考えても普通に可能だと思うけど。。 そんな程度のこと何度もやってるぞ。 MSDNライブラリにサンプル書いてあるじゃないか。 まあ、その構造体(および構造体の中の構造体)のシグネチャが判らないと 断言はできないけど。
459 名前:454 mailto:sage [2007/09/12(水) 19:29:48 ] >>456-457 すいません。いまいち意味が分かってないです。 DragEnterのスコープから外れるとDragDropイベントハンドラも初期化されると思うのですが。 ですが、毎回メッセージボックスが増えていくと言うことはそうじゃないと。 だとすると、それを回避して通常のD&Dの動作をさすのに 何かいい方法はあるのでしょうか?
460 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 19:35:38 ] >>459 >DragEnterのスコープから外れるとDragDropイベントハンドラも初期化されると思うのですが。 されません
461 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 19:36:51 ] 初期化されないのが匿名メソッドの特徴なんだからあたりまえ 変なこと考えずに普通にDragDropにイベントハンドラを追加すればいいだけだろ コンストラクタかデザイナで
462 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 19:43:58 ] >初期化されないのが匿名メソッドの特徴 簡単に記述できるのがいいと思ってたのに 嫌な仕様ですね
463 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 19:55:18 ] >>454 君は「スコープ」という言葉の意味をよく理解していないね。 DragDropイベントハンドラが毎回初期化されないのは、スコープとは別の問題。 textBox1はDragDropイベントハンドラの外で宣言されたものであって、イベントハンドラとは無関係に存在している。だから、textBox1に加えた変更はイベントハンドラに入ろうが抜けようが維持される。 countが上がっていかないのはスコープの問題。 countはDragDropイベントハンドラの中で宣言されているから、イベントハンドラを抜けると一旦破棄され、次にイベントハンドラに入った時、改めて確保される。 一回ごとに、中身は別物になる。
464 名前:463 mailto:sage [2007/09/12(水) 20:00:43 ] >>462 そりゃ君が匿名メソッドの使い方を間違えてるだけだ。 簡単に記述できることと、それが君の都合どおりに動くことは、別の問題だろ。 偉そうになってすまん。
465 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 20:53:50 ] VS2005 C# コンボボックスのDrawModeをOwnerDrawFixedにし、 (プロパティ?のほうで)コンボボックスにデータバインドで アイテムを追加し、DrawItemイベントで特定のアイテムだけ ForeColorを変えようとしているのですが バインドされたアイテムのテキストがすべてSystem.Data.DataRowViewに なってしまいます。 バインドを使わずロードイベントでアイテムをAddした場合は 正しくテキストが表示されます。 データバインドを使用してオーナードローでコンボボックスの アイテムのテキストを正しく表示することは可能でしょうか?
466 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 21:02:04 ] 言ってることよくわからんが"DrawItemイベント"でアイテムを描画してるのは 君が書いたコードのはずだと思うんだが。。 〜になってしまいます、ってお前さんが自分で書いたコードのバグなだけちゃうんかい? ちなみに、そんなの普通に簡単に可能なはずだよ。 BackColorをアイテムごとに個別にしようと思うと意外と面倒だったりするけど。
467 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 21:15:13 ] GetItemText
468 名前:313 mailto:sage [2007/09/12(水) 21:51:30 ] いつも勉強になります。 以前デリゲートについて色々聞いていた者です。 その節は色々教えていただきありがとうございました。 371さんに教えてもらったHPを見てきました。 難しくて、まだ理解がいま一つのところもあるのですが。 ふと思ったんですが、デリゲートの非同期処理を使えば、 マルチスレッドにする必要はなくなる、というイメージは正しいでしょうか?
469 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 21:55:53 ] ?? デリゲートの非同期処理=マルチスレッド(スレッドプール)
470 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 22:01:14 ] >>468 > マルチスレッドにする必要はなくなる まあ、的を大きく外してはいないと思う。 デリゲートの非同期処理を使ってもマルチスレッドにはなるんだけど、スレッドに関するややこしい処理は隠蔽される、ってこと。
471 名前:313 mailto:sage [2007/09/12(水) 22:18:16 ] >>469 >>470 マルチスレッドとデリゲートは=なんですね。 以前、何も分からないまま、HPの通り Thread thread = new Thread のようなことをして、マルチスレッドを使ったことがあったので、 違うものだと思ってました。 ありがとうございます。
472 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 22:20:44 ] デリゲート自体はマルチスレッドと無関係だぞw 非同期呼び出し機能は単なるオマケ
473 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 22:23:42 ] 誤解五回
474 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 22:31:43 ] >450 今外なんで正確なコードは書けないが fixedでポインタにしてIntPtrのコンストラクタに渡してMarshal.PtrToStructureを呼ぶ。 後は構造体のサイズ分ずつポインタをずらして配列数分処理するだけ。 >458 構造体のメンバに構造体の配列があるサンプルはないだろ。 あるならurlを挙げてくれ。
475 名前:313 mailto:sage [2007/09/12(水) 22:31:48 ] なんか私、すっごくはまってそう。 ご指摘ありがとうございます。 おまけに目を取られてしまって。 教えてください。 デリゲートって何で使うのか? これがいつまでたっても分かりません。 どこかで「同じような処理をするのだけど、少しだけ処理が違う時がある。 その時に使うのがデリゲートです」みたいなことを読みました。 こういうときに使うんですか? いろいろあると思うんですが、代表的なもの、よく使われる使い方を 教えてください。 お願いします。
476 名前:デフォルトの名無しさん [2007/09/12(水) 22:36:25 ] どこかで「同じような処理をするのだけど、少しだけ処理が違う時がある。 その時に使うのがデリゲートです」みたいなことを読みました。 なにこれw
477 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 22:39:21 ] 458じゃないが > 構造体のメンバに構造体の配列があるサンプルはないだろ。 意外になかった。 というか、構造体配列が固定長かポインタなのかでもまた別になるんで、それを抜きに話し進めてもな。 構造体内の固定長配列は.NET2.0からのサポートだったっけ、確か。 >>475 List<T>.Sort とか。 Array.Find<T> とか。 Regex.Replace とか。
478 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 22:40:09 ] >>475 ゆとり乙 実行するメソッドを変数のように変えられるんだぜ?
479 名前:465 mailto:sage [2007/09/12(水) 22:44:15 ] e.Graphics.DrawString(comboBox1.Items[e.Index].ToString(), font, solidBrush, e.Bounds.X, e.Bounds.Y); では無理だったけど e.Graphics.DrawString(comboBox1.GetItemText(comboBox1.Items[e.Index]), font, solidBrush, e.Bounds.X, e.Bounds.Y); に変更したら正しく取得できました。 テラサンクス!
480 名前:313 mailto:sage [2007/09/12(水) 22:46:10 ] >>478 なんか分かりそうで分からない、もう少しで答えがでそうって 感じなんですが・・・ パンクしそうなので、もう少し頭を冷やして考えてみます。 ヒント、ありがとうございます。 (答えなのかも?)
481 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 22:47:08 ] >>474 ごめんマンマのサンプルは見当たらないね。 でも構造体配列のフィールドに普通にMarshalAs属性でByValArray指定するだけで 問題ないと思うんだけど。
482 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 22:49:12 ] >477 ポインタだったらIntPtrで受け取るから配列だと思ってたよ。 .NET2.0では対応してたんだ。普段1.1しか使ってないから知らなかったよ。 サンプルは1.1の時の名残でないんではと思う。
483 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 23:16:24 ] >>480 超大づかみに説明するとだな。 メソッドそのものを代入できる変数がデリゲート。 その機能を利用して、何かが起きた時に呼んでほしいメソッドを代入しておけるのがイベント。
484 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 23:33:42 ] >>313 お前もう最初の方で教えてもらったこと忘れてるだろ。 そんなんじゃどこまでいってもループだよ。 一回じっくりと消化してみろ。
485 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 02:44:33 ] イメージのわきやすそうなデリゲートの使用例を挙げると・・・ ・予め基本クラスのメソッドにprotectedなイベントを仕込んで、メソッド処理を<追加>できるようにする。(差し替えではない) ・後で追加する機能があるかもしれないので、とりあえずイベントを仕込んでおく。 ・任意の複数のメソッドを、一度の命令で処理したいとき。 >>483 え、イベント発生とかイベント受け取りとか言うし、デリゲートが実際に使用される時のメッセージのことじゃないの?
486 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 02:58:25 ] イベントという語にはそういう使い方もあるね
487 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 03:23:40 ] virtualメソッドにしていたところとか interfaceを実装させたりしていたところなんかを 全部delegateにしたらいい いまはあまりメリットを享受できないかもしれないけど C# 3.0になってラムダ式を使えるようになれば interfaceなんかと比べて五倍ぐらいシンプルで読みやすくなるし、 書きやすさも段違いになる
488 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 03:30:56 ] covariance、contravarianceは置いておいて、 delegate=非同期も可能なchainパターン と認識してるけど間違い?
489 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 03:35:45 ] ?
490 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 04:00:20 ] delegateは第一に関数オブジェクトだろ 関数を渡したり保持したりするもの chainも非同期実行も出来るというだけで
491 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 08:45:35 ] >delegate=非同期も可能なchainパターン 非同期時にはChainできないぜぇ
492 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 10:50:59 ] ASP.NETなんですが、SQLでデータを取得、結果をDataGridなどで表示させるのですが その際に、1行1行にヘッダーをつけれるようにしたいのですが可能ですか?
493 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 11:58:00 ] そういうのはヘッダとは言わない
494 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 12:34:56 ] System.ArraySegment<T>構造体の存在を最近知ったんだけど 微妙に便利そうに見えるのに.MSのクラスライブラリ内でもほとんど使われてないみたいだね インデクサが付いてないのは濫用するなという意味なのかな
495 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 13:25:25 ] 亀でごめんなんだけど、>>474 の >fixedでポインタにして ってわざわざunsafeで括ってまでfixed使った方がいいの? GCHandle.AllocしてMarshal.UnsafeAddrOfPinnedArrayElementのが unsafeで括る必要なくていい様な気がするんだけど
496 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 15:04:05 ] >495 GCHandleだと配列の2つ目以降の構造体を取得するときに サイズ分IntPtrの位置をずらしたりできないからfixedでやったんだけど 実はできたのかな?
497 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 15:13:50 ] >>496 多分出来ないわ。 位置ずらすの忘れてた orz でもなんかunsafeって精神衛生上あんましよろしくない気がする
498 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 16:00:06 ] 思い切ってクラスの宣言にunsafe付けたらすっきりするよ!
499 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 17:02:19 ] すみません。0〜9、A〜Z、a〜z の文字を半角文字に置き換えるメソッドはありますか?
500 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 17:16:13 ] Microsoft.VisualBasicを参照設定に追加すれば Microsoft.VisualBasic.Strings.StrConv("ABCD01234", VbStrConv.Narrow, 0) でいけるよ。
501 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 17:28:00 ] Microsoft.VisualBasic は微妙なので……w IDictionary<char, char> に全部突っ込んで何とかするべきなのか、 あるいはもっと楽な方法があるのか、そういうのを知りたいです。
502 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 17:49:45 ] どの辺が微妙なのか詳しく
503 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 17:59:20 ] >>501 どこが笑いどころなのか分からん
504 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 18:08:49 ] 旧VBはドカタ用のウンコ言語だから笑いの対象でしかない といったことじゃないか
505 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 18:37:10 ] できるものは同じなのに
506 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 18:50:17 ] でもなんかそういう見方はあるよな 面接にいったとこのオヤジが うちはみんな優秀でVisualBasicなんだぜ!って自慢してるのみて 馬鹿じゃねーのって思ったが
507 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 19:21:46 ] >>501 そんなあほな方法考えながらなにが微妙なんだか。 まあ、あほといえばあほだけど 別にディクショナリに突っ込んどいてもいいんじゃない? そんなことするくらいならもうVBの機能使っちゃうけどね。
508 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 19:53:43 ] そもそも全角を半角に変換しないでFA
509 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 20:05:07 ] それ2.0からライブラリの機能として用意されてる気がしたけど、 何を使うんだったか思い出せない
510 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 20:16:32 ] 周りが言っているからVBはしょぼいとか安直に思っている 輩なんでしょうな。
511 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 20:26:08 ] バカでも使えるツールってすごいと思うのだが
512 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 20:28:54 ] うむ、VBを作った側は凄い。 VBを使う側はショボイ。
513 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 20:28:55 ] >502 501ではないが予想外な変換を勝手に丁寧にやってくれることがあってVBのメソッドはちょっとと思うことはある。 なんか丁寧にやってくれるパターンがあるおかげかいまいち速度が速くないので呼び出し回数が多い場面では使いたくない。 そんなんで、VBのメソッドを利用して実装してたら最初はあまり呼ばれないつもりが気づいたらいろんなところから呼ばれててパフォーマンスが気になって自前で実装し直そうとしたとき 予想外なよけいなお世話の変換もされててそういうのに依存した処理がそこら中にいたりして苦労するので 最初から必要最小限の変換処理をするのをVB以外ので実装されてるのを探したくなる。
514 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 20:54:34 ] 全角英数なんてたいした数じゃないし 半角とマッピングするDictionaryを自作するのが一番いいんじゃない
515 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 21:08:16 ] そういう問題かw そこは誰も難しいと思ってないよw 置換というのは置換の前に置換対象を抽出する必要があるわけだが、 それ考えてるか?
516 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 21:53:19 ] Dictionary使うのか… ゆとり世代ってすごいなあw
517 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 21:53:33 ] すいません質問です。 構造体とクラスの使い分けはどういったときにすれば有効でしょうか? データメンバが少なければ 値型なので構造体の方が生成処理・使用処理が早い(時もある)見たいな事はかかれているのですが。
518 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 21:55:20 ] >>517 MSDNのどこかに使い分けのガイドラインがあったはずだから、探してみてくれ
519 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 22:01:48 ] 全部クラスでいいよ
520 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 22:02:16 ] >>517 いろいろと面倒だから素直にクラスにしとけ。 小さいのを大量につくるときは構造体。 あとつまらないものも構造体。
521 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 22:11:29 ] >>516 趣味か宿題だからいいんじゃね?
522 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 22:23:27 ] Dictionary使わないってのはなんだ 配列使うのか まあこの二択だろ
523 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 22:27:51 ] なにそれw
524 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 22:31:09 ] >>522 高校生?
525 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 22:32:58 ] ありがとうございます。普通にありました。 参考ついでにコピーでも。 ・プリミティブ型 (整数、倍精度浮動小数点数など) に似た単一の値を論理的に表す。 ・インスタンスのサイズが 16 バイト未満である。 ・変更できない。 ・頻繁にボックス化する必要がない。 この全てに当てはまれば構造体の方がほぼパフォーマンスがいいようです。 ただ、どういうときにボックス化を行ってるかわからないです。 interfaceによる多態性や、List<>の要素に変数を代入・順番に使用、とかはボックス化は行ってるのでしょうか?
526 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 22:43:59 ] >>525 インターフェイスへのキャストはボックス化を伴う。 List<int>にintを入れるときにはボックス化は行われない。
527 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 22:52:03 ] static void Main(string[] args) { int offset; int zenkaku = (int)'A'; int hankaku = (int)'A'; offset =zenkaku - hankaku; Console.Out.WriteLine("offset:"+offset); for (; zenkaku <= (int)'Z'; zenkaku++, hankaku++) { if((zenkaku-hankaku)!=offset) Console.Out.Write("offsetが違う!"); } Console.In.ReadLine(); }
528 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 22:54:38 ] Dictionary<char,char> dict; ... char hankakuku = dict[zenkaku]; こうか、 char[] array = new char[char.MaxValue]; ... char hankaku = array[(int)zenkaku]; こうだ。これ以外の実装はまずない。 怪しい処理するVBの関数使うより 処理内容が明らかなほうがいいだろ
529 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 22:55:40 ] >>526 ありがとうございます、やっぱりそうですか。 多態性に関する記事を漁ってたら、どう考えても参照型でなければ実現できそうにない感じです。 List<>のほうも、インターフェイスが関わってくると動きが少し変わってくるようです。
530 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 22:58:03 ] >char[] array = new char[char.MaxValue]; 正気ですか?
531 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 23:00:05 ] >>530 正気も何も最速の実装じゃん
532 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 23:02:23 ] あればあるだけ使う派なんだねw
533 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 23:04:51 ] まあ実際問題としてPCでやるという前提とCharが16bitってこと考えたら配列持ちもありではあるなぁ 自由度低いからよほどピーキーな所じゃなきゃやらないけど
534 名前:531 mailto:sage [2007/09/13(木) 23:05:15 ] charのmaxvalueがいくつかわかってないのかね たかが13kbyteのテーブルだぞ
535 名前:531 mailto:sage [2007/09/13(木) 23:06:50 ] ちが、130kか
536 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 23:10:13 ] 数十個しか値がないのにFFFF個(6万)配列取るのはなぜ?
537 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 23:12:20 ] 最速かどうかはやや怪しいな。
538 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 23:12:29 ] 知恵が足りないから。
539 名前:531 mailto:sage [2007/09/13(木) 23:12:32 ] 速度が欲しい時はこれだろ 普通はDictionaryで十分だと思うけど
540 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 23:12:56 ] 16bitで65535じゃないのか
541 名前:531 mailto:sage [2007/09/13(木) 23:23:34 ] charが65536個で約130kだろ
542 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 23:27:19 ] static public string ToHankaku(this string source) { StringBuilder sb = new StringBuilder(source.Length); foreach (char c in source) sb.Append(c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z' ? (char)(c - 65248) : c); return sb.ToString(); } これで十分だろ。
543 名前:531 mailto:sage [2007/09/13(木) 23:35:18 ] 65248きめうちでいいのか 案外シンプルだな
544 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 23:35:58 ] >>531 m9(^Д^)プギャー
545 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 23:57:49 ] >Dictionary<char,char> dict; >... >char hankakuku = dict[zenkaku]; >こうか、 > >char[] array = new char[char.MaxValue]; >... >char hankaku = array[(int)zenkaku]; >こうだ。これ以外の実装はまずない。 わらかすな。
546 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 23:58:51 ] >Dictionary<char,char> dict; >... >char hankakuku = dict[zenkaku]; ありえんわ
547 名前:531 mailto:sage [2007/09/14(金) 01:22:39 ] 本来ifのいらないアルゴリズムにif書いちゃう気持ち悪さを感じないかね
548 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 01:50:54 ] 感じないよ
549 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 02:21:37 ] 夜中に見たら寒気したww同時に吹いたけどww もっとコードに美を求めようぜ
550 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 02:44:51 ] >>547 if文より君に気持ち悪さ感じてる
551 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 02:53:55 ] >Dictionary<char,char> ifどころちゃうわw
552 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 08:30:58 ] VBのStrConvが怪しい動きをするという例を教えてくれんか
553 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 08:41:56 ] お題だとa−ZA−Z0−9を半角へってことだから全角カナは無視しないといけないのか
554 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 08:55:34 ] t
555 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 09:03:23 ] 構造体中の配列構造体の P/Invoke の質問を書いた者です。 みなさまお返事をいろいろとありがとうございました。結局、構造体をすべてフラットにするラッパを 同僚に作ってもらいました。 ところで SWIG という便利なものがあるらしいのですが、どなたか試した型いらっしゃいますか?
556 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 12:18:34 ] だからそんなことわざわざしなくてもByValArray指定するだけだと思うんですが。。
557 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 12:53:55 ] >Dictionary<char,char> dict; >... >char hankakuku = dict[zenkaku]; これってなんかまずいんですが?
558 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 13:23:57 ] >>557 ふむふむ 何がどのようにまずいんですか?
559 名前:デフォルトの名無しさん [2007/09/14(金) 13:57:43 ] >>557 一見シンプルだが、内部処理コスト掛かりすぎだろ >>542 なんか判定6回だぞ
560 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 14:32:28 ] わざわざディクショナリ使うのに全値域を埋める前提になってる。 ディクショナリの意味全くなし。
561 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 14:32:35 ] あー、なるほど。 >>557 は富豪的すぎるってことですね。 納得しました。ありがとうございます。
562 名前:531 mailto:sage [2007/09/14(金) 18:07:12 ] よく考えようぜ 事前にテーブル用意すれば判定6回は全部消せるんだ しかしこれだけ規則がシンプルなら毎回判定しても別に問題はない だが判定がこの五倍もあったらだいたい誰もが気持ち悪がって 事前にテーブル用意するだろう じゃあどこからテーブルにして、どこまでなら毎回判定するのか そこの基準があいまいになる 全部をテーブルでやれば、自分のコードを統一された規則で書くことが出来る 仕様変更があって判定の規則が増えて、テーブルにするはめになっても、 「このぐちゃぐちゃのif文をテーブルに落とさないと、うわー」 ということにならなくて済む >>560 Dictionaryなのに全部使うわけないだろ それなら配列使うわ
563 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 18:10:18 ] >>562 普通はジェネレータを使います
564 名前:531 mailto:sage [2007/09/14(金) 18:20:27 ] >>563 意味がよくわからん 詳しく教えてくれ
565 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 18:22:56 ] じゃあインデクサ付けてテーブルっぽくしたクラス作っといて 中で存分に気持ち悪い判定すれば
566 名前:531 mailto:sage [2007/09/14(金) 18:28:48 ] >>565 外部からのインターフェースはそれでいいだろうけど if文をテーブルに直す時の問題は何も解決しとらんぜ
567 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 19:03:20 ] >>562 だったらディクショナリにインデクサでアクセスしたらだめだろ。 自分でそういう「コード例」書いといて何言ってやがる。
568 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 19:10:01 ] いまはそんだけしか判定がない前提だろう。 後々に備えてという考え方自体は否定しないが、 今回のはちょっとオーバースペックだ。 だいたいテーブル埋める時点で同じような泥臭い処理が入るだろ、 まあ工夫はいくらでもできるけども。
569 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 19:12:53 ] ifがごちゃごちゃしてたところでテーブル埋めるのに何の工夫がいるんだ?
570 名前:531 mailto:sage [2007/09/14(金) 19:15:18 ] >>567 本来TryGetValueだな申し訳ない 適当に書いてしまった
571 名前:デフォルトの名無しさん [2007/09/14(金) 20:03:22 ] ディクショナリーの処理コストがIF文6回以下で収まるわけ無いじゃん クラス呼び出しだけでも全レジスタスタックするんだぜ
572 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 20:45:33 ] クラス呼び出しってなんぞ
573 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 20:46:16 ] Dictionary にすると変換ルールを動的に変更できるから後々便利だってばっちゃが言ってた。 けど結局、無駄に switch を使うことにしました。
574 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 20:58:44 ] ディクショナリ内でのハッシュ取得や等値比較は どうしてもインターフェイス経由になるため、 衝突が一切発生しなくても結構なコストになる。 それにその他諸々の処理を合わせると、 愚直な判定に比べてかなり負荷がかかる。 それでもまあそれほどたいした問題にはならないとは思うが。
575 名前:デフォルトの名無しさん [2007/09/14(金) 21:05:04 ] >>572 IF文とか単純なやつならILにコンパイルしたとき素直に展開されるだけだが Dictionaryなんかを使えば..net Framework内のプログラムをコールする形になるだろ そのコールする処理だけでIF文6回を超えるメモリーアクセスが発生するんだよ もし配列に全部展開する形ならIf文6回以下のコストで実行できる可能性はあるけど (処理回数と前処理の量次第)Dictionaryを使った時点で駄目だね
576 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 21:11:35 ] VB関数呼び出しの負荷はどんなもんなんだろ
577 名前:デフォルトの名無しさん [2007/09/14(金) 21:16:59 ] VB関数はDictionaryのような汎用性を持たせる必要が無いからそれほどでないと思うよ 速度と可読性を考えたら一番バランスがいいと思う
578 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 21:17:13 ] 誰も測ってない罠
579 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 21:20:29 ] >>547 本来 if がいるはず。 それを配列で誤魔化しているだけだろ?
580 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 21:20:55 ] マーシャリングとか入らんの?
581 名前:デフォルトの名無しさん [2007/09/14(金) 21:23:41 ] VB関数ってCOMじゃないからマーシャリングは無いだろ
582 名前:516 mailto:sage [2007/09/14(金) 21:36:26 ] >>531 本当のところ、高校生だろ? まさか職業プログra...
583 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 21:37:44 ] VBの関数と同等の機能ってだけで、VBのランタイムを呼んでるわけじゃない。
584 名前:531 mailto:sage [2007/09/14(金) 21:45:19 ] >>582 別に俺の身分を明かす気はないが、お前こそ 事前にテーブルを用意する発想もなければ インデックスを変換に使うテクニックも知らない ifを書き散らすことしかできないVBドカタじゃないのか
585 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 21:45:58 ] 最終的にはLCMapStringだしな
586 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 21:46:18 ] ここは初心者用スレじゃないのか 516もあんまりあおるな
587 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 22:02:12 ] >>584 >事前にテーブルを用意する発想もなければ >インデックスを変換に使うテクニックも知らない 知らないわけないだろ。 こっちはz80から20年以上コードかいてるからな。
588 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 22:08:55 ] 531も516も偉そうなこと言っている割には全然役に立つことを書かない件
589 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 22:10:11 ] >>556 できないつーの
590 名前:516 mailto:sage [2007/09/14(金) 22:20:58 ] 役に立つことはかかないよw Dictionary使ったら速度は10分の1程度になるよ! でもそんなのかんけいね〜
591 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 22:22:27 ] まちがえた! Dictionary使ったら10分の1程度の時間で処理が終わるよ!!
592 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 22:40:14 ] arrayだとifとたいして変わらない。
593 名前:531 mailto:sage [2007/09/14(金) 23:11:23 ] いや、正直なこといえば あんな簡単に変換できるなら事前にテーブル用意しようとは思わんけどな 一文字一文字対応させるようなややこしい変換規則になると思ってた
594 名前:516 mailto:sage [2007/09/14(金) 23:19:23 ] 偽者って… timeSpan 結果発表 if >00:00:00.8412096 Dictionary >00:00:02.0329232 Array >00:00:01.0014400
595 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 23:21:19 ] まだこの話題引きずってんのかw
596 名前:516 mailto:sage [2007/09/14(金) 23:22:20 ] >>593 これも偽者か?
597 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 23:30:11 ] >>589 できるでしょ。 というかできない理由が思い浮かばない。 それに俺は過去に実際やったことあるよ。
598 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 23:38:34 ] c# ByValArray
599 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 23:48:35 ] >>594 ちょっとArrayが遅すぎないか? ああ文字列変換としてやったときの時間? にしてもArrayのがIfより遅いのは珍しいかも。 状況にもよるが、判定だけならIfより配列の方が5倍程度速い。 まあメモリ、CPUいろんな条件で結構変わるかもしれんが。 文字列変換までまとめたら1割程度の差でであまり変わらんけどな。
600 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 23:49:16 ] >状況にもよるが、判定だけならIfより配列の方が5倍程度速い。 ああもちろんこれは俺の環境での話。
601 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 23:52:12 ] ちなみにDictionaryだとIfのさらに7倍程度遅い。 つまり俺の環境では、だいたい 配列:If:Dictionary=1:5:35 程度ってことだな。
602 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 23:54:47 ] あーひょっとして変換かかる文字ばっかでチェックしたとかかな? 上のは、ほとんどが変換されない文字(ループ変数をchar範囲でAndとってcharにしたもの) でやったので、そういう意味では特にIfがかなり不利な条件だな。
603 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 23:57:42 ] >597 1.1まではできなかった。2.0からできるようになった。 ドキュメント読んでも1.1までとあんまり扱いが変わってるような印象を受けないので 1.1の時やろうとしてさんざん苦労してできないとわかった人はその印象が強いと思うよ。 新しいenumの値が増えてるわけでもなく、1.1で大抵の人がまず指定してみて もろに失敗したByValArrayというのも駄目だと思うよ。 2.0からできるようになりましたって大きく取り上げられたわけでもないと思うし。
604 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 01:01:11 ] ちんこまんこしっこうんこ
605 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 01:05:32 ] >601 StrConvも速度の参考程度になるように比較対象に混ぜてあげてください。
606 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 01:11:38 ] 文字列を変換した場合 ※かかった時間のおおよその比率 配列:8 Dictionary:19 If:9 StrConv:50 な感じだたよ?
607 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 02:07:01 ] 暇だったから適当にやってみた。テキストは全角・半角英数字をランダムに100万文字、 タイムは10回平均。 if :00:00:00.2571167 Array :00:00:00.0206023 Dictionary:00:00:00.0713178 StrConv :00:00:00.1486586 なんかおかしくね?
608 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 02:10:00 ] おかしいw ほんとかそれ? Ifってどんなの? ちなみに>>606 とかのは return ('0' <= c && c <= '9' || 'A' <= c && c <= 'Z' || 'a' <= c && c <= 'z') ? (char)(c - 65248) : c; 見たいな判定してる(IfじゃないけどまあIfと変わらん)。
609 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 02:16:07 ] >>608 条件式ってか、ifは上にあった>>542 をコピペした。 どっか間違えたかな…
610 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 02:25:42 ] 直った。 if :00:00:00.0279734 Array :00:00:00.0181842 Dictionary:00:00:00.0707453 StrConv :00:00:00.1461418 何を思ったのかコピペした後foreachからforに変えてたのが原因でした。 そら毎度毎度インデクサ使ってたら遅くなる罠 orz
611 名前:デフォルトの名無しさん [2007/09/15(土) 02:55:43 ] クラスの入れ子っていうんですか? class{ ・・・ class{ ・・・ } } これってどういう意味があるんですか インスタンス作ったときに中のクラスのインスタンスも一緒にできるんですかね?
612 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 03:03:18 ] >>611 C# でクラスをネストさせても Java のようにはならずに インスタンスは作られないよ
613 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 03:13:25 ] >>611 内クラスは外クラスのメンバに自由にアクセスできる。private でも。 // もちろん非静的なメンバにアクセスする場合は外クラスのインスタンスが必要。 あとはまあ外クラスに強く結びついているクラスとか。 ただし多用は薦められていない(ガイドライン参照)。 IEnumerator の実装クラスとか。 > インスタンス作ったときに中のクラスのインスタンスも一緒にできるんですかね? できない。
614 名前:デフォルトの名無しさん mailto:age [2007/09/15(土) 03:29:23 ] livetube.cc/%E3%83%A9%E3%82%AF%E5%A4%AA%E9%83%8E/%E3%83%A9%E3%82%AF%E5%A4%AA%E9%83%8E%2829%29
615 名前:611 mailto:sage [2007/09/15(土) 08:28:10 ] なるほどいろいろ利点?があるみたいですね 実験してみよっとありがとうございました
616 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 11:36:49 ] >>603 じゃあ >>449 は、1.1 の話?
617 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 11:39:44 ] >>603 ByValArray をつけても構造体の配列は取得できなかった。null になってしまった。 他の int のメンバは取得できた。 何が悪いんだろう?
618 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 11:43:51 ] アンマネージドの方の定義とC#の定義を見せてもらわん限りなんとも言いようがない
619 名前:デフォルトの名無しさん [2007/09/15(土) 12:27:19 ] プラグイン機能のあるアプリケーションを作りたいんですが、 基本的な話として、各プラグインのアセンブリってやっぱり それぞれAppDomain作ってそこにロードすべきなんでしょうか? なんか数が多かったらどんどんAppDomainが増えそうじゃないですか? これってまずい? かといって一つのAppDomainにロードしたら 各アセンブリを個別にアンロードできないですよね
620 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 12:36:26 ] 普通のアプリでアンロードとか考える意味ないよ
621 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 12:41:01 ] 解像度選択の列挙体で、VGAとかXGAとかの名称使うのは誤用だとわかっていても許せる? ライブラリ作っててふと思ったので。
622 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 12:45:25 ] まあ解像度自体本来誤用なんだから別に良いんじゃない
623 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 12:47:07 ] >>621 誤用って?
624 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 12:48:21 ] >>619 プラグインに関してはまだ.NETの世界そのものに実績が少ない点に注意。 まずいかどうか、実際やってみての経験ベースの話は実際かなり少ない。 内製ソフトだと、ひとつの画面にひとつのDLLとか変な縛りで作らされてる人が それなりに挑戦してみるみたいだけど その手の情報はあんまり表に出てきてないっぽい。 .NET 3.5でプラグイン用のフレームワークが追加されるんだけど WCF並にfatな仕組みで、個人的にはあんまり好きになれなかった。 あとまだベータ段階のため仕様が時々変わってる。 おかげでいくつかのサンプルはビルドできなくなってる。 ttp://blogs.msdn.com/clraddins/default.aspx ttp://msdn.microsoft.com/msdnmag/issues/07/03/CLRInsideOut/default.aspx?loc=jp 結論としては、ダメ元で軽くプロトタイプ作ってみて うまくいきそうなら1年ぐらいそれで様子を見てみるとかどう? .NET界全体として、まだベストプラクティスが定まってない分野だと思うよ。
625 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 12:50:09 ] >>619 どんなプラグインか知らんが、普通に考えて >それぞれAppDomain作ってそこにロードすべきなんでしょうか? それはきびしいだろ。 AppDomain管理するコストの方がプラグインのアセンブリロードしとくよりきつそうだ。 動的におきかえなきゃならんのなら仕方がないが、そうでなけりゃ気にする必要ないでしょ。 AppDomainを活用するのはそう簡単じゃないよ。
626 名前:624 mailto:sage [2007/09/15(土) 13:01:25 ] >>619 ちょっと追記。 もしプロトタイプ作るなら、個人的にはIronPython使ってみるのをおすすめする。 将来的にはDLRが.NETのアドインシステムの中核を担うと期待している。 >>625 >AppDomainを活用するのはそう簡単じゃないよ。 それに挑戦したのがSystem.AddIn名前空間の奴。 まあ案の定WCFみたいになった。
627 名前:621 mailto:sage [2007/09/15(土) 13:07:41 ] >>622 wiki見てて始めて知った。おk、もう正しいとか正しくないとかどうでもいいわ。 >>623 VGAとかは解像度をあらわす単語じゃないはず・・・本来は。
628 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 13:13:56 ] >>619 じゃないけど、 >>624 Assembly.LoadFile(file).GetTypes()じゃだめなの?
629 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 13:57:29 ] >619 アンロードが必須ならAppDomainを作るしかない。 そこまで不要ならAppDomainを分けずにやってしまった方が手っ取り早い。 多少多めのAppDomainでもそれほどきつくはないと思う。 それぞれ通信するプラグインとそれを管理するexeがログ表示などするアプリはやったが そこそこの数のプラグインがいても特に問題なく動いている。 最大でせいぜい20くらいでいくらでも増えるわけじゃなかったからそれで大丈夫だった。 >628 それ、アンロードできないじゃん。 アンロードをはなから諦めるってのもありだと思うが、プラグインのdllをつかみっぱなしになるのが困らないか? 本体が実行中にプラグインだけ入れ替えたいとか使ってないのにファイルは捕まれてるのはちょっと気持ち悪い。 そういうのがいらないならありだと思う。
630 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 14:02:32 ] プラグインのタイプによるけど、 結構ホスト側と密に連携しようとしてることが多いからね〜 独立性の高いプラグイン機構ならまだいいんだけど
631 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 14:08:59 ] LoadFileの場合って、パスが異なれば違うアセンブリだと 認識させたりとかできるんだっけか? もしそれができるならロード前にファイルをコピーしてとかできるかな? 違うアセンブリだと認識させられないんなら無理だが。 もしくはILmeargeで無理やりアセンブリを独立化だw いやそれならilasmのほがましか?
632 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 14:11:03 ] もう全部実行時にコンパイルしちゃえ
633 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 14:25:21 ] FileStreamでbyte[]にコピーしてAssembly.Load()とかw
634 名前:619 mailto:sage [2007/09/15(土) 14:33:28 ] アドバイスありがとうございました。 とりあえずカレントのAppDomainでロードしてみます。 (問題はプラグイン仕様を後で変えずにロード法を変えられるかですが) >>633 Load(byte[])のオーバーロードって ファイルそのもののバイト配列じゃないっしょ? 以前これ見てウホッと喜んで試したけど動かなかった気が。 つかCOFFイメージってなんだこりゃ
635 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 14:35:06 ] >>634 何も知らない頃俺これで動かしてたが… LoadFromだったかな? さすがに今はやってないがw
636 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 18:37:01 ] すいません質問です あるインターフェイスを実装したクラスを継承したら、 継承クラスももちろんインターフェイスを実装してますよね。 そのとき、インターフェイスから実装されたメソッドはvirtualもoverrideもかかれてませんが、 overrideできちゃうんですかね?
637 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 18:37:36 ] ためせ
638 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 18:43:06 ] >>634 いやファイルそのもののイメージであってる。 exeなりdllなりをバイト配列でそのまま渡す。
639 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 18:44:12 ] 試さなくても分かるだろw それが分からないのは結局継承もインターフェイスも中途半端にしか 理解してないからだよ。
640 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 01:26:35 ] 値が重複しないコンテナってありますか? List<string> container = new List<string>(); container.Add("foo"); container.Add("bar"); container.Add("foo"); // 追加されない
641 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 01:32:41 ] KeyedByTypeCollection<TItem> あたりかしらん?
642 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 02:03:12 ] んなむちゃなw
643 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 02:29:11 ] 自分でIList<T>積んだクラスを作るか、List<T>を継承してAddいじれば?
644 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 03:05:18 ] 3.5のHashSetかな。 今ならKeyedCollection派生か Dictionary<,>のラッパー作るか、かな?
645 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 03:27:56 ] Addはoverrideできないだろ 順序を保持しないならDictionaryのラッパー 保持するならListのラッパーを作ればいいんじゃね
646 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 10:26:17 ] overrideできない?
647 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 11:47:36 ] overrideできないな。 class ListEx<T> : List<T> { new public void Add(T item) { if (!Contains(item)) base.Add(item); } } これでAddは対応できるな。
648 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 11:55:39 ] なんで隠蔽する必要があるの?w ていうか、それ仮にaddがオーバライド可だとしてもすべきじゃないでしょ。 動作の意味が違うじゃん。 別のメソッドを追加する対応にすべきだ。
649 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 12:02:54 ] ていうかList<T>使うのがおかしい。 Collection<T>を派生元にすべき。
650 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 14:01:35 ] クラス名に重複なしが明示されてるならAddでもいいと思う 語尾にwを付ける必要はないと思う
651 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 14:23:45 ] それにしてもシャドウイングは不味いだろ
652 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 14:34:36 ] どうしてもAddにしたいなら継承を使うべきではないね。 まあ確かに、大人数で使うとか売り物にするとかのライブラリでなければ そこまで拘る必要ないじゃん、と言われればそれも一理あるけどさ。
653 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 14:37:49 ] IList<T>を自分で実装するくらいそんなに大したことじゃないし Collection<T>使えば簡単にできるし わざわざList<T>を継承する意味がわからん
654 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 14:42:46 ] 馬鹿だから
655 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 15:08:45 ] グラフィックのDrawImageで質問です bmp0からbmp1へと別のとこへのコピーはできたのですが bmp0からbmp0へと同一bmp内でのコピーはできませんでした これはできない仕様なんですか できる方法はありますか?
656 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 15:11:58 ] bmp0と同じサイズの新しいBitmapオブジェクトを作ってそれにbmp0をDrawImageして その上に何か好きに描いたりすればいいだろ
657 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 15:15:52 ] やりました ただ スピードの面で直接1回で描けたらいいなと思って
658 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 15:21:58 ] GetPixelとSetPixelでもできるだろうけどかえって遅くなるから LockBits使って気持ち悪いことやるといいよ
659 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 15:29:56 ] やっぱり同一BMP内ではコピーできないんですかね LockBits 配列を使うやつですね 調べてみます
660 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 15:41:59 ] 質問してる奴の言ってることもよくわからんが 回答してる奴の言ってることもよくわからん 本当何のこっちゃw
661 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 18:10:13 ] エスパー質問者にエスパー回答者 いや両方アホなだけか
662 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 18:54:23 ] >>647 IList<T>にキャストしたら Addの動作が変わって値が重複するだろ new厨目を覚ませ
663 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 21:18:47 ] >>381 からの流れがまるで無駄になっててワロタ
664 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 22:18:59 ] はあ?
665 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 22:21:58 ] あは
666 名前:デフォルトの名無しさん [2007/09/17(月) 21:55:05 ] 色々調べてC#でACCESSをオートメーションで動かす事に成功しました。 下記コードです。 Access.ApplicationClass oAccess = new Access.ApplicationClass(); oAccess.Visible = false; oAccess.OpenCurrentDatabase("C:\\TEST\\TEST.mdb", true); oAccess.DoCmd.OpenQuery("Q_TEST", Access.AcView.acViewNormal, Access.AcOpenDataMode.acEdit); oAccess.CloseCurrentDatabase(); oAccess.DoCmd.Quit(Access.AcQuitOption.acQuitSaveNone); System.Runtime.InteropServices.Marshal.ReleaseComObject(oAccess); oAccess = null; 見よう見まねで書いたので oAccess.OpenCurrentDatabase("C:\\TEST\\TEST.mdb", true);の大に引数trueの意味と oAccess.DoCmd.OpenQuery("Q_TEST", Access.AcView.acViewNormal, Access.AcOpenDataMode.acEdit); の第2、3引数Access.AcView.acViewNormal, Access.AcOpenDataMode.acEditが何を意味しているのか 良く分かりせん。どなたか教えて下さい。
667 名前:666 [2007/09/17(月) 22:00:36 ] 自己レスです。 oAccess.OpenCurrentDatabase("C:\\TEST\\TEST.mdb", true);の第2引数trueの意味だけは わかりました。trueは排他モード、falseは共有モードということです。
668 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 22:16:03 ] OpenQuery にしてもそのままぐぐったら先頭に解説が見つかったんだが
669 名前:デフォルトの名無しさん [2007/09/17(月) 22:28:13 ] @View(第2引数)に指定する定数 acViewDesign デザインビューで開きます。 acViewNormal 選択クエリーならデータシートビューで開きます。 アクションクエリーならデータの追加、更新、削除を行います。 acViewPivotChart ピボットチャートビューで開きます。(選択クエリーのみ) acViewPivotTable ピボットテーブルビューで開きます。(選択クエリーのみ) acViewPreview 印刷プレビューで開きます。(選択クエリーのみ) ADataMode(第3引数)に指定する定数(選択クエリー時のみ有効) acAdd 追加専用モードです。 acEdit 編集・追加・削除モードです。 acReadOnly 読み取り専用モードです。
670 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 23:30:46 ] これぐらいだったらリークしないよなあ これぐらいだったら…
671 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 23:34:11 ] リークって言うとどことなくかっこいいから禁止 お漏らしと言え
672 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 23:59:55 ] すいません、ジェネリックに関して質問です。 クローズ構築とはなんですか? 説明読む限り型パラメータが固定/ないジェネリックとしか読めないのですが・・・ どのようなときに使うのでしょうか?
673 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 00:07:50 ] インスタンスを作れるのがクローズ構築型。List<int> とか。 オープン構築型は型パラメータが未定義なのでインスタンスを作れない。List<T> とか。
674 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 00:09:34 ] 「要素にHoge型しか受け入れないコレクションを作成するために、 Collection<T>に対するクローズ構築型であるCollection<Hoge>を継承して HogeCollection(非ジェネリック)を作った」 というような使い方でいいのかなあ
675 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 00:15:38 ] ま、どうせリフレクションでしか使わんような言葉だから大して気にする必要もないよ
676 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 00:39:29 ] プロパティって配列とかジェネリックを返すものって作れまつか? int X=10; public int プロパティA { get { return X; } } とかで Xを配列にしたりジェネリックにしたりとか
677 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 00:41:19 ] やってみれば?
678 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 00:50:57 ] 確かにこのスレできくより コンパイラにきいた方がはやいなw
679 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 01:26:15 ] private void Button1_Click(...) { Class2 c2 = new Class2(); //適当な処理 Form2 f2 = new Form2(); f2.ShowDialog(); //適当な処理 } としたとき、Form2はDisposeが必要なのに Class2はDisposeしなくていいのは何故?
680 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 01:39:59 ] 知るかよ。Class2ってなんだよ
681 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 01:43:48 ] Formは内部でリソースを使ってる もしClass2の内部でリソース使ってるなら解放が必要 IDisposableならusing節推奨
682 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 01:55:11 ] >>681 リソースとはコントロールって事でしょうか? Class2は呼び出し元のForm1で指定したURLを読み込んで System.Net.WebClientクラスを使った処理をしています。 Form1に書いても良かったのですが、同様の処理が複数あるので それぞれ別クラスに書きました。 IDisposableについては初めて知ったのでこれから勉強します。
683 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 01:57:40 ] >Class2はDisposeしなくていいのは何故? Class2でDisposeするかしないか決めるのは実装者のあなた
684 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 02:17:09 ] Class2がIDisposableなクラスを使ってるならDisposeしなきゃだめだろうな 普通はしなくても平気だけど
685 名前:デフォルトの名無しさん [2007/09/19(水) 08:43:06 ] C#でダブルクォーテーションを文字列変数に格納したいとき string A = """C:\\Program Files\\Test.exe""” +" /p" + """C:\\Program Files\\Test.arg""” のように"を2つかさなればよいのでしょうか? 要は "C:\Program Files\Test.exe” /p "C:\Program Files\Test.arg” でパラメータを指定して 起動していのです。 exeのショートカットではでそのままはリンク先に"C:\Program Files\Test.exe” /p "C:\Program Files\Test.arg”を 指定してうまくいったのですが System.Diagnostics.Process.Start(A);とすると起動できないのです。"(ダブルクォーテーションの使い方が悪い?)
686 名前:685 [2007/09/19(水) 08:44:44 ] >>685 一部ダブルクオーテーションが全角になってますが実際は半角です。
687 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 08:49:01 ] エスケープしろ
688 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 09:02:58 ] \"
689 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 09:20:49 ] >>685 " 'C:\Program Files\Test.exe' "でできないっけ?
690 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 10:07:11 ] @"C:\Program Files\test.exe"
691 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 10:27:00 ] 質問です。クラス名(名前空間除く)をstringで取得する方法はないのでしょうか? てっきり規定のメンバで存在すると思っていたのですが、見つかりません。
692 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 10:30:14 ] typeof(MyClass).Name
693 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 10:44:53 ] Object.GetType().Name; Object.GetType().FullName;
694 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 10:55:52 ] >>685 ProcessStartInfo使え
695 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 13:54:58 ] アクセス許可とかアセンブリの項目見てると頭痛くなる(-o-;)
696 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 13:58:46 ] つ バファリン
697 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 13:58:49 ] SQLの SELECT A AS でb竅翌使おうとするとエラーが出る・・・これらを表示させたい場合にはどうすればいいでしょうか?
698 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 14:30:15 ] "で囲む 予約語で具具って美奈代
699 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 15:05:07 ] intを返す関数を作ったんですが retrnで返そうとすると そんな変数存在しねぇぞ(゚Д゚)ゴルァ!って怒られるんですけどなんで? 宣言を int a =new int()のようにしたら大丈夫ですたが int function{ int a return a; } こんなの
700 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 15:06:36 ] ちゃんと動作しなかったソースをコピペで貼ってくれないと。
701 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 15:12:03 ] >>699 初期化してないから int a = 0;(int a =new int()でも一応おk)
702 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 15:16:28 ] ええ、たったそんなことだったのか 結構はまる人おおそう ありがとうございました
703 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 15:52:08 ] >>702 残念ながら嵌らない。 第一 int a; return a; なんてaを宣言して初期化せずにそれを返すなんてことはしない。 参照型なら例外処理とかで object a; … catch { a = null; return a; } とかやる場合もあるが。
704 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 15:57:33 ] 居ません
705 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 16:03:58 ] >>692 ,693 ありがとうございます。独立したメソッドでしたか・・・
706 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 16:08:43 ] いや中でif分で値を入れてたんだが どれにもあてはまらないパターンがあったようだ ローカル変数以外は初期化されるんだっけ?やはり基本は大事か
707 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 16:24:55 ] = new int(); とやるとInt32が持つInt32型のメンバ変数が自動で規定値に初期化されるから 初期化したことになるというよくわからん理屈
708 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 16:25:39 ] >>706 初期化されない。 つか、フィールドはコンストラクタで、ローカルは宣言時に初期化するだろ普通。
709 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 16:41:16 ] >>708 メンバ変数は確か 0 に初期化されたんじゃ。 もちろん、初期化してないと Warning は出るけど。
710 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 18:21:50 ] フィールドは初期化してなければコンストラクタで型の既定値で初期化されるッてだけ
711 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 18:30:20 ] なにがもちろんだ、警告なんかでんわい。
712 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 18:45:20 ] 値が代入される可能性が無いフィールドがあるときに出る警告と勘違いしてるんだろう
713 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 18:57:17 ] ローカル変数以外は0で初期化される 参照型はnull,値型は0になる
714 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 19:12:08 ] プリミティブ型のフィールド以外は必要がなければ自動初期化に任せてる プロパティ用のフィールドにいちいち全部null代入するとか無意味だろ
715 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 19:56:13 ] class C1 { public int i; } class C2 { public int i; public void Set(int i) { this.i = i; } } C1 c1 = new C1(); // CS0649の既定値を使用しますの警告 C1 c1 = new C1(); c1.i = 9; // フィールドに直接代入すれば警告はない C2 c2 = new C2(); // Set() を呼ばなくても警告は出ない
716 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 20:18:02 ] publicフィールドが規定値であることを知れるからな ていねいなコンパイラや
717 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 00:18:56 ] なにげにコンパイル速いしな。
718 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 14:40:25 ] VisualStudio2005を使用し、C#で開発してるんですが 部品のメソッド一覧を作成するときに使えそうなツールってありますか? メソッド一覧には「メソッド名」「引数」「機能」「例」「使用先」を載せたいです
719 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 16:14:43 ] sandcastleとか 最終的な生成に何を使うにしろC#はドキュメントコメントがコンパイラに組み込まれてるから 書き方はそれに従うように
720 名前:デフォルトの名無しさん [2007/09/20(木) 16:26:07 ] VBをC#で書き換え中なのですが・・・ 質問です. VBで PixelsToTwipsX とは, 座標変換をするためのもの というところまでわかりましたが C#ではどのように記述すればよいのかわかりません. 現在,サンプルプログラム(VB)を参考に C#でプログラムを組んでいます. 初心者的な質問ですがご教授願います.
721 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 16:28:16 ] >>720 ja.wikipedia.org/wiki/Twip
722 名前:デフォルトの名無しさん [2007/09/20(木) 16:38:59 ] PixelsToTwipsX 関数のようだが・・・ msdn2.microsoft.com/ja-jp/library/9a59w6f5 (VS.80).aspx
723 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 16:43:25 ] 描画時にGraphicsで使える単位に変換して実寸指定すればいいんだろ
724 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 18:34:47 ] twipはpointの二十分の一なんだろ Font font = new Font("MS Gothic", twip / 20F, GraphicsUnit.Point); こんな感じじゃね?
725 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 18:48:38 ] スクリーンの解像度(dpi)みないと駄目っしょ
726 名前:デフォルトの名無しさん [2007/09/20(木) 19:36:06 ] .NETの例外はJavaのように実際に例外を起こした行を取得できないのかな? .NET EXEから.NET DLLを参照するようにしてるんだけど、 DLL側の情報がStackTraceに見当たらない・・・
727 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 19:43:09 ] >726 Application.ThreadExceptionイベント
728 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 19:52:09 ] デバッグ情報なしだと不可能だったような 言語や最適化でいくらでも変わる
729 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 20:02:37 ] アプリケーションのバージョンをチェックして 指定の場所から最新のアプリを取得してくるアップデータをつくったのはいんだが アップデータのそのもののアップデートをどうやってやればいいか悩んでまつ アップデータそのものがアップデートを実行してるのでEXEに上書きできないわけだが なにかいい案はありませんか賢い人
730 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 20:23:43 ] >>729 テンポラリディレクトリに自分自身をコピーして実行すればいいだけだろ
731 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 20:30:37 ] アップデータのアセンブリを実行時に生成しちゃうとか
732 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 21:02:42 ] うちの会社の場合… 最初に起動するのはチェック用プログラム。 アップデートなしだとターゲット起動
733 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 21:07:35 ] ゴメ チェック用プログラム=アップデータなんだね。 ターゲットがアップデータverチェックだな。 ターゲットが起動したらアップデータ終了だし。
734 名前:デフォルトの名無しさん [2007/09/20(木) 21:42:32 ] わかった。チェック用のプログラムを作ってアップデータを確認すればいいんじゃね チェックが不具合あったらチェックのチェック用を用意してさらにチェックのチェックノチェ・・・ 俺って天才じゃね
735 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 22:32:00 ] テンポラリに最新版おいて アップデータ置き換えバッチ書いてスタートアップに保存 アップデータ起動時にバッチ削除
736 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 22:41:19 ] JITコンパイルされたコードを VirtualProtectでも呼んで動的に書き換えちまえばいいんじゃね やった事ないけど
737 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 22:56:32 ] >729 手抜きでいいんなら元のexeをリネームしてどかして入れ替えで。 リネームした方は新しいexeで起動したときにでも削除で。
738 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 23:09:34 ] バージョンチェッカーが自身とメインモジュールの最新版をWorkにダウンロード ↓ チェッカーは自身のプロセスIDを引数にしつつ、アップデータを起動、自身は終了させる。 ↓ アップデータはチェッカーの終了を待った後、それぞれの最新版と入れ替える ↓ アップデータはメインモジュールを起動する(更新がなかった場合は、チェッカーが起動させる) アップデータをWorkに置くようにすれば、たぶん全てのモジュールが更新できる。
739 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 23:31:24 ] >>738 俺はそれでアップデータをチェッカーのリソースにつっこんで アップデートのたびに生成したな。 アップデータが存在したらその回はアップデータを消すだけで バージョンチェック省けるし。
740 名前:729 mailto:sage [2007/09/20(木) 23:59:44 ] ん〜、 つまり、 (アップデートする人)(ソフト本体)のほかに (チェックをする人?)を作れってことでつか? ソフト本体がアップデートする人のアップデート情報を 取得できてたら差し替える って方法でいこうとおもってるんでつが
741 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 00:02:23 ] 素直にClickOnce使おうぜ
742 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 00:07:53 ] >>740 ソフト本体が他の媒体の面倒をみる設計で問題なければそれでいいんじゃないか。
743 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 00:52:05 ] 落として来るものをデータじゃなく実行可能なものにする。 アプリは落として実行してすぐ終了。後は落としてきたものに任せる。柔軟性高し おすすめはmspかそれを実行するexe。署名で一般ユーザーでも更新可能になる。 が、この利点は会社、組織じゃないと駄目なのが珠にきず
744 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 01:09:50 ] >>741 フレムワク1.1だからだめぽ データ差分も1時間おきにでるので クリックワンコだけじゃだめぽ というわけでつ >>742 トン >>743 アー、まるでクリックワンコみたいな動作をアップデータにさせるわけでつね たしかにそれなら柔軟かもしれないです mspってのはどのmsp・・・?
745 名前:デフォルトの名無しさん [2007/09/21(金) 07:48:43 ] AccessC#からオートメーションで操作させるときのインスタンス生成で Access.ApplicationClass oAccess = new Access.ApplicationClass(); と Access.Application oAccess = new Access.Application(); 2種類ありますがこの2つはどう違うのでしょうか?
746 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 07:55:46 ] 変わらないと考えていい
747 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 08:32:20 ] >>744 とりあえずmsp何?なら諦めとけ。WindowsInstallerのパッチ形式だが 知識ないと作るの難しいから クリックワンスとか以前に、ようはパッチを落として起動するだけの話
748 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 09:20:33 ] VS2003、ASP.NETのDataGridで、bニいう列を作りそこにSQLで得た結果DataSetに入れ その行数を1,2,3・・・・という形に表示させたいのですが、どのようにすればいいでしょうか?
749 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 09:26:49 ] SQLをいじる。連番振りの方法はDBMSによりけり
750 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 12:02:56 ] PropertyGridでネストされているクラスを展開させたいのですが、どうしたらいいでしょうか? ネストされていなければ、TypeConverterでExpandableObjectConverterを指定すれば 簡単にできるのですが、展開したクラスの中に、さらに自前のクラスがあると、 それがうまく展開されないです…。
751 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 14:09:00 ] BinaryFormatterとかで保存したList<>って 保存時の順番が保持されるかどうかって保証されてないんだっけ?
752 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 14:34:30 ] さっきー大暴走!!!!
753 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 14:36:20 ] 誤爆った。
754 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 16:50:04 ] 質問です。 Delegate型(delegateキーワードを使って作った型ではない)の変数に メソッドを入れるとき、いちいちdelegateで型を作っているとものすごい数になるので 直接メソッドグループをDelegate型の変数のなかに入れたいのですが、 'メソッド グループ' から 'System.Delegate' に変換できません。 と言われて入れることが出来ません。 どうにかして入れたいのですが、delegateで型を作るしかないですかね?
755 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 17:09:16 ] >>754 >いちいちdelegateで型を作っているとものすごい数になるので この目的だと、 .NET 3.5 から、Action デリゲートと Func デリゲートが標準で用意されてるんで、 それを使えばいいと思う。
756 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 17:13:24 ] >>751 されてるはずだけど、何でそう思ったの? >>754 メソッドグループって何だっけ? シグネチャさえあってれば1つでいいはずだけど。
757 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 17:20:07 ] >>755 .NET 2.0なので無いです… orz >>756 引数が全部ばらばらなので無理です。 MethodInfoを使えば何とかなりそうだけど、遅いんだよなぁ orz
758 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 17:27:01 ] >>757 引数や戻り値を全部objectにするとか。 delegate object FooHandler(object o)
759 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 17:28:02 ] >>757 よくわからんけど何が遅いの?
760 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 17:36:36 ] >>758 でもそれだと全てのメソッドの引数もobjectにしなければならないので 今からだと厳しいです。 >>759 リフレクションを使うのでMethodInfoを取得するのが重いんですよ
761 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 17:42:12 ] >>760 確かにリフレクションは速くはないけど、 MethodInfoの取得がボトルネックになるような場面ってあんまり思いつかないなぁ。 具体的に何やってるの?
762 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 17:50:31 ] >>757 Action とか Func に相当するものは、2.0 でも自分で書けるよ。 ちょっと面倒だけど、↓みたいにしとけば、3.5 になったときに修正も不要なはず。 delegate void Action(); delegate void Action<T>(T x); delegate void Action<T1, T2>(T1 x1, T2, x2); ・・・ delegate R Func<R>(); delegate R Func<R, T>(T x); delegate R Func<R, T1, T2>(T1 x1, T2, x2); ・・・ ああ、でも、引数が全部ばらばらだとちょっと困るか。 ↑のAction とか Func を object[] に格納しといてキャストして使うか、 リフレクション使うか。 てか、そんな引数タイプが異なるものを使おうとすると、 リフレクション使わなくてもリフレクション並みに処理重たそう。
763 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 18:00:24 ] >>754 >メソッドを入れるとき、いちいちdelegateで型を作っているとものすごい数になるので >直接メソッドグループをDelegate型の変数のなかに入れたいのですが、 C#の文法はそういう用途をサポートしていないので 自分で簡易コンパイラを作るか、 C#のコードを生成するコードジェネレータでも作ればいいんじゃね? コンパイル時にまでに必要なメソッドは確定してるんだよね?
764 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 18:02:18 ] >>761 やり直し・元に戻す処理を保存するのにわざわざ条件分けして処理するのも大変なので Delegateを使おうと思ったのですが、こんなことになるとは orz >>762 そんなジェネリックだらけの物だったんですねそれ… それなら何とかなりそうですが、数十個分のを書くとなるとちと面倒ですね
765 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 18:05:34 ] >>764 >やり直し・元に戻す処理を保存するのにわざわざ条件分けして処理するのも大変なので >Delegateを使おうと思ったのですが、こんなことになるとは orz そういうのはIronPythonとかIronRuby使った方がさくっと書けるんじゃないかねぇ。 C#+Delegateでやるなとは言わないけど、 少なくとも手段に対して実力が伴っていないような印象は受ける。
766 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 18:21:42 ] はじめからそれぞれの操作をオブジェクトとして表現しとけばよかったんじゃね まだC#にはそういう方法の方が合ってる気がする
767 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 18:29:18 ] System.DelegateにキャストしてしまったらDynamicInvoke()を使うことになるから、 MethodInfoでリフレクションでやるのと変わらない気がする。
768 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 18:33:15 ] それに引数・戻り値がばらばらなら、 実行時にどのシグネチャをもつdelegateかの判別が必要なんじゃ? そこでどうせ分岐するんじゃね?
769 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 18:37:45 ] 引数には、それを通していろんなものを引っ張ってこれる「なんでもオブジェクト」的なものを渡すようにして シグネチャを統一してしまった方がいいんじゃね
770 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 18:52:06 ] >>766 それはどのようにするのでしょうか? enumとかで条件分けするってことでしょうか? >>767 そうなんですよね。しかし、MethodInfoで試そうと Type.GetMethod()をしてもパブリックメソッドしか引っかからないのでどうしようかなと。 >>768 DynamicInvoke()を使うのでパラメータはobject[]にすれば判別する必要が無くなります。 >>769 それがまさしくobjectだと思うのですが、毎度毎度キャストするのも重たいし…
771 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 19:07:00 ] >DynamicInvoke()を使うのでパラメータはobject[]にすれば判別する必要が無くなります。 などと平気で言いながら、 キャストが重いとか言う…
772 名前:769 mailto:sage [2007/09/21(金) 19:08:43 ] objectで渡すなら呼び出し先の判別が必要だろ 実際の型として何を要求してるかはメソッドによって違うんだから。 MouseEventArgsなんかはそれを一つ渡すだけだけど中にいろんなオブジェクトが入ってるだろ? そのおかげでマウス関連のイベントハンドラはMouseEventArgsに統一できる。 「なんでもオブジェクト」はそういう意味で言った
773 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 19:09:22 ] C#からExcelのファイルを生成したいんだが ここ見ると評判悪いみたいだね VSTOを買うわけにもいかないし 何かいい方法はないだろうか
774 名前:726 mailto:sage [2007/09/21(金) 19:09:58 ] throw ex; が原因だった。ごめんね。 てか throw; って・・・
775 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 19:22:09 ] >>773 そこだけVB.NETを使う。
776 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 19:28:23 ] >>773 生成にExcelは使っていいの?
777 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 20:24:45 ] 初歩的な質問ですいません。 特定の数値やbool値を保存したり読み込んだりするには、どうすればいいのでしょうか?
778 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 20:25:51 ] >>777 初歩的な指摘ですみません。 どこに保存するつもりですか?
779 名前:777 mailto:sage [2007/09/21(金) 20:49:24 ] すいません 実行ファイルに組み込んで保存できるならそこで、出来ないなら適当に所謂datファイルとしてです。 アプリケーションのオプション設定などを保存しておきたいのです。
780 名前:デフォルトの名無しさん [2007/09/21(金) 20:55:29 ] レジストリを使うか2.0以上なら設定ファイルってやつがある 1.1の時にはデータセットのreadXMLとWriteXMLを使って保存したこともあったな
781 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 20:57:59 ] 設定用のクラス作ってXmlSerializerでXMLファイルに/BinaryFormatterでバイナリファイルにシリアライズするか レジストリに書き込むか C# 設定 保存 でぐぐればいくらでもでてくるっしょ
782 名前:777 mailto:sage [2007/09/21(金) 21:14:07 ] やはり入門書に載ってないと混乱する癖は何とかしなくては・・・ 確かに検索したら一発でした。 ・・・というか・・・すごく楽ですね!!びっくりしました。
783 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 21:35:24 ] abstract これなんて読めばいいんですか?
784 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 21:37:26 ] 抽象
785 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 21:39:40 ] いや・・・意味じゃなくて、読み方です; 784さんは、なんて読んでいますか?
786 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 21:40:15 ] chusho
787 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 21:41:13 ] 786さん・・・笑 これは諦めたほうがいいんですかね。。。
788 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 21:41:28 ] >>785 辞書引けばいいじゃん。中学生?
789 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 21:41:41 ] マジレスするとアブストラクトなんだけど、辞書で調べろよ
790 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 21:42:40 ] 中学時代はずっと、ぼーとしてたんで。。。すいません;
791 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 21:44:52 ] 興味ないことは覚えない学ばない! 社会人の特権だよな
792 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 21:59:00 ] Funcは Func<T1,T2,TResult>だぜ
793 名前:デフォルトの名無しさん [2007/09/21(金) 22:08:38 ] それって誘拐っていみじゃないですか!?
794 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 22:17:34 ] >>770 Redoしたいのが SomeMethod(Arg1 arg1, Arg2 arg2) といったアクションだったら class SomeMethodObj : IActionObj { Action<Arg1,Arg2> action; Arg1 arg1; Arg2 arg2; public SomeMethodObj(Action<Arg1, Arg2> action, Arg1 arg1, Arg2 arg2){ this.action = action; this.arg1 = arg1; this.arg2 = arg2; } public void Invoke(){ action(arg1, arg2); } } 引数までオブジェクトに囲い込めばいいんじゃないの 匿名メソッド使えばオブジェクト作る必要すらなくなる
795 名前:デフォルトの名無しさん [2007/09/21(金) 22:35:05 ] www.atmarkit.co.jp/fdotnet/vsexpress/vsexpress_02/vsexpress_02_03.html に書かれているコードについて質問します。 > // フィールド > string _tenki; // 例:曇時々雨 > string _title; // 例:東京都 東京 - 今日の天気 > string _link; // 例:weather.livedoor.com/area/13/63.html?v=1 > bool _available; // データが正しく取得できればtrue > DateTime _publicTime; // 予報の発表日時 > Icon _icon; // タスクトレイ用のアイコン > > // プロパティ > public string Tenki { get { return _tenki; } } > public string Title { get { return _title; } } > public string Link { get { return _link; } } > public bool Available { get { return _available; } } > public DateTime PublicTime { get { return _publicTime; } } > public Icon Icon { get { return _icon; } } > > string lwwsUrl; // お天気WebサービスのURL > (略) lwwsUrlはフィールドではないのでしょうか。 それと、 なぜフィールド (とフィールドかもしれないlwwsUrl) を宣言するときにアクセス修飾子が使われていないのでしょうか。
796 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 22:36:18 ] 1) フィールドです 2) 既定のアクセスレベルが定められているからです
797 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 22:37:38 ] メンバのアクセスレベルを省略したらprivateになる lwwsUrlは重要だから目立つように最後に書いてるんじゃね
798 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 22:38:05 ] 一行空けてんだから汲んでやれよ
799 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 22:43:00 ] ああ、プロパティ用のフィールドじゃないから別扱いにしてあるのか。
800 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 22:56:05 ] >>793 アブダクションだっけ? UFOのやつね。
801 名前:デフォルトの名無しさん [2007/09/21(金) 23:21:19 ] >>796-799 ありがとうございました。 ・ lwwsUrlもフィールドであるけれども、 特にプロパティ用のフィールドを 「フィールド」 としてまとめている。 ・ アクセス修飾子は省略でき、 省略するとprivateになる。 というわけですね。 もう1つ質問します。 >>795 のコードでは、 プロパティ用のフィールド名の先頭にアンダースコアを付けて、 それとわかるようにしていると思うのですが、 そのような書き方は一般的なのでしょうか。
802 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 23:28:41 ] >>795 のような書き方だと、 「プロパティ用のフィールドは直接触るな。クラス内部でもプロパティを通せ」 という意思表示のようにも見えるけどそうはなってないね
803 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 23:33:07 ] > ・ アクセス修飾子は(snip)省略するとprivateになる。 必ずしも真ではない。詳しくはMSDN 言語によっても異なるしな。 > >>795 のコードでは、 プロパティ用のフィールド名の先頭にアンダースコアを付けて、 それとわかるようにしていると思うのですが、 > そのような書き方は一般的なのでしょうか。 それなりに見かける。インテリセンスで前の方に集まって見やすいという主張もある。 でもおいらはアンダースコアつけない。 外部に見せないものは趣味の範囲だし。 もちろん複数人でコードを共有する場合はきちんと規約を作るべきだが。
804 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 23:36:15 ] アンダーバー頭につけるのは視覚的に見難い気がするよ。 昔ながらの小文字のm一文字がやっぱり一番しっくりくる。 なぜかあまりやってる人見ないけど。
805 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 23:36:26 ] >>803 > 言語によっても異なるしな。 少なくともここはC#のスレだと思うんだが
806 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 23:38:57 ] クラスのことじゃね >>797 はメンバと言ってるけどな
807 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 23:41:11 ] privrateなフィールドにアンダーバーを付けるのはIronRubyのソースでも見た。 thisは省略。 そっちの方が分かりやすいかなぁ。
808 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 23:46:25 ] 俺はなんもつけないぞ それが一番多数派じゃね
809 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 23:48:58 ] >>805 でもVB.NETのソースとか結構読むことあるし
810 名前:デフォルトの名無しさん [2007/09/21(金) 23:49:23 ] foreach( Hage hage in Hoge.Hages){}みたいな感じで使う HageCollectionクラスを作る必要ができました。 上の方で「なんでList<T>から継承するの? 馬鹿?」みたいな話がありましたが ICollection<T>とかIList<T>とかから継承して、全部自分で実装するべきなんですか? List<T>を継承して動作変えたいところだけnewで隠蔽するんじゃ駄目ですか? (sealedなクラスで他の用途は無いんですが)
811 名前:デフォルトの名無しさん [2007/09/21(金) 23:51:59 ] アンダースコアを付けるのは、 皆がやっているわけではないのですね。 「C#におけるメンバは」 宣言時にアクセス修飾子を省略するとprivateになる、 という理解でよいのでしょうか。
812 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 23:52:33 ] Collection<T>使えよ
813 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 23:55:38 ] List<T>(たぶん派生したものも同じ)オブジェクトって publicメンバとして公開してはいけないことになってたような List<T>はパフォーマンスが目的であってカスタマイズできないからCollection<T>を使えと MSDNのどっかに書いてあった覚えがある
814 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 00:00:06 ] SortとかForEachとかFindとかがList<T>にしかないのが気に食わんけどな 3.5は遠い
815 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 00:00:43 ] 全部自分で実装するったってList<Hoge>をメンバに持って そのメソッドを呼び出すだけ 動作変えたいなら変えればいいし なんでわざわざ制限が多くてわかりにくい継承を使いたがるのかわからん
816 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 00:01:03 ] >>810 お作法的にはダメだろうね。 でも所詮一人で書いてるコードで自分で自分の罠に落ちない自信が持てるなら 別にかまわんでしょ。
817 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 00:01:07 ] >>811 残念ながら間違い
818 名前:デフォルトの名無しさん [2007/09/22(土) 00:18:27 ] >>817 C#の言語仕様はもっと複雑なのですね。 皆さんありがとうございました。
819 名前:デフォルトの名無しさん mailto:age [2007/09/22(土) 00:28:42 ] インラインアセンブラが使え無い言語は 基本的に劣っていると考えたい・・・
820 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 00:29:17 ] ILGeneratorがあるじゃないか
821 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 00:31:50 ] メンバはprivateになるさ
822 名前:デフォルトの名無しさん [2007/09/22(土) 00:39:51 ] VB6からC#へ移行時の質門です。 VB6である行範囲をコピーして別の行範囲にコピーしたいのです。 ***VB6のコード:*** Dim oExcel As Excel.Application Set oExcel = CreateObject("Excel.Application") oExcel.Workbooks.Open FileName:="C:\TEST\TEST.xls" oExcel.Application.Sheets("TEST").Select oExcel.Application.Rows("1:42").Copy oExcel.Application.Rows("43:84") をC#で置き換えしようと思い以下のように書きましたが シートの選択の記述が分からなかったのでとりあえずActiveSheetにして みました。 Excel.ApplicationClass oExcel = new Excel.ApplicationClass(); Excel._Workbook oWB; oWB = (Excel._Workbook)(oExcel.Workbooks.Open(@"C:\TEST\TEST.xls", Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value)); oSheet = (Excel._Worksheet)oWB.ActiveSheet; シート選択わからなかったのでとりあえず oExcel.Application.Rows.Copy["1:42"] oExcel.Application.Rows["43:84"]???ここがよく分からない しかし上記コードでは行範囲コピーでエラーが発生してうまくいきません。 Excel8.0 Object Libraryを参照設定しています。どなたか教えて下さい。
823 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 00:45:16 ] >>810 勘違いしてそうだけど継承するのは全然構わないよ、MSのサンプルコードでもやってるし。 ただ、動作を変えるのならnewで隠さず名前も変えろってだけの話。
824 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 00:49:00 ] >>811 いい
825 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 02:00:21 ] >>819 インラインアセンブラは、言語じゃなくコンパイラの仕様だろ
826 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 02:52:57 ] Dは言語仕様にx86アセンブリを含んでるけどな
827 名前:デフォルトの名無しさん [2007/09/22(土) 05:39:55 ] >>800 お前のせいでUFOに誘拐されたアメリカ人の証言が頭の中で舞ってしまったじゃないか
828 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 11:18:08 ] Imageクラス(というかGDI+)についての質問です。 あるファイルなりメモリ上のデータなりを、Imageクラスでデコードできるかどうか、を知る方法はないでしょうか。 現在はtryブロック内でImage.From*を使い、例外が発生するかどうかで判断しているのですが、いちいちImageクラスのインスタンスが生成されたり例外が発生したりするので無駄が多いように思いまして……
829 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 14:12:16 ] それしかない
830 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 14:18:19 ] 自力でヘッダ解析するしかないんじゃないかな
831 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 15:42:53 ] >>822 ((Excel.Range)oExcel.Application.Rows["1:42", Missing.Value]).Copy(oExcel.Application.Rows["43:84", Missing.Value]); コンパイルエラーと実行時エラーくらいはっきり区別しようよ
832 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 16:31:50 ] エクセル操作する部分だけvb.netでライブラリ化した方がいいんじゃない? >>831 に書いてあるような調子のコードってメンテ不能じゃないか?
833 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 17:46:09 ] 質問です。 Windowsのアドレス帳ファイル(.wab)のバイナリデータを読み込みたいと思っています。 バイナリデータの仕様はどこかで公開されているのでしょうか? 特定のライブラリやAPIがあるようでしたらばそれでもOKです。
834 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 17:54:56 ] この辺? FILE: Windows Address Book (WAB) Documentation ttp://support.microsoft.com/kb/266347 MSDN Online Web & Internet Samples - WAB Property Inspector Tool ttp://msdn.microsoft.com/archive/en-us/samples/internet/messaging/wabtool/default.asp?frame=true
835 名前:833 mailto:sage [2007/09/22(土) 18:11:32 ] >>834 ありがとうございます。 軽く目を通したんですが、MS系の開発は初めてで解読できませんでした。 諦めてCSVでエクスポートする方法を提案したいかと思います。
836 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 19:49:14 ] どんだけあきらめいいんだよw
837 名前:833 mailto:sage [2007/09/22(土) 19:53:17 ] 自分、専門はJavaなんでMSDNを読んでいると眩暈がw そもそも簡単ならやってくれる?程度の優先度低い話なんですよ
838 名前:デフォルトの名無しさん [2007/09/22(土) 22:00:38 ] >>831 ありがとうございます。 もっと勉強します。 >>832 VBの方がやはりいいのでしょうか? C#からExcelを扱うのは一般ではあまりやらないのでしょうか?
839 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 22:12:23 ] VB.NETでもやっぱり面倒だよ たくさんExcelを操作するコードを書くならVBAのマクロを生成して それを呼び出すという手もある
840 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 22:13:52 ] >>838 エクセルの操縦に限れば遥かに楽だね。 エクセルの設計のいい加減さと、VB.NETの旧VBを引きずってるいい加減さが 親和的なんだよね。
841 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 22:35:52 ] List とかジェネリッククラスを継承した場合って、Add とかのメソッドの override が 出来ないのね。知らんかった。 どうしてできないの?
842 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 22:40:21 ] 委譲するべきだから ほぼありとあらゆる場合に継承はするべきじゃない
843 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 22:50:09 ] .NETではオーバーライドを許可するメソッドは テンプレートパターンのためのもののみに限定する方針みたいだね むしろオーバーライドできないのが普通 Collection<T>にはカスタマイズ目的でオーバーライドさせるためのメソッドがあるよ
844 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 22:50:44 ] virtualにするとパフォーマンスが落ちるしな
845 名前:デフォルトの名無しさん [2007/09/22(土) 22:50:53 ] C#のフリーコンパイラでお勧めのものを教えてくださいおっ [条件] ・.NET FRAMEWORK 1.1でコンパイルできるもの ・デバッガ付 ・VSに似ているもの
846 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 22:52:45 ] なにいってんだこいつ
847 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 22:54:16 ] 「どんなにくだらないC#プログラミングに関する発言でも誰かが優しくレスをしてくれるスレッド」です。
848 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 22:55:55 ] >>845 Visual C# 2005 Express Edition SharpDevelop
849 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 22:57:04 ] >>848 ありがとうございます。 早速さがしてみます。
850 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 23:49:17 ] >>840 vb.net使っても開放忘れるとかなりシステムが不安定になったりする。 VBAかVB6のほうがよい。
851 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 23:56:06 ] null代入じゃなくてcom開放ね。 上のコードだと、oExcel,oWB,oSheetもちゃんと開放しないといけない。 おまけ。 oExcel.Application.Sheets["TEST"].Select
852 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 00:00:46 ] なんかちゃんとラップしないと使い物にならなさそうだな
853 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 00:02:27 ] うん。だからあまり使われてない。
854 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 00:10:12 ] 誰かがラッパー作ってそうだけど見つからないな 中途半端にできるからダメなのか
855 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 00:17:22 ] >>850 それ逆だよw VB6からのエクセルのオートメーション操作は問題多すぎだった。 っていうか、VBAって何を言ってるんだw
856 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 00:25:46 ] >>850 そうなのか俺はラッキーだったのか. VBAでできるものはVBAで。
857 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 00:25:46 ] だいぶ飛び飛びだが.NETからExcel/Wordを使う場合の話題はこの辺でされていた。 VB.NET質問スレ pc11.2ch.net/test/read.cgi/tech/1189038267/10-38
858 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 00:29:59 ] じゃあWSHで
859 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 00:31:03 ] C#はoperator overloadができるようですが、 「同じオブジェクトを指しているかどうか調べる」には obj1 == obj2 ではダメな場合があるって事ですか? あと、オブジェクトを特定のブロック内で「確実に」破棄させる(C++のスタックに置いたオブジェクトのように)には、 usingを使えば問題ないのでしょうか。それともtry...finallyでDisposeさせるのでしょうか。
860 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 00:33:03 ] はい 条件付はい
861 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 00:34:50 ] >>859 ==がoverrideされた典型的な例がStringクラス。 imutableクラス以外で==のoverrideはあまり見たことがない。
862 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 00:35:35 ] 後者はいいえだな
863 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 00:44:20 ] オブジェクトの破棄と呼んでいるものは2つの意味を持ってて、 オブジェクトの終了コードの実行とオブジェクトが占有している領域の開放。 C#では領域の開放はあくまでもGCが行う。
864 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 00:48:05 ] usingで問題ない なんだったらコンストラクタを潰して 匿名メソッドでコードブロックを引数にとらないと使えない形にして、 コードブロック終了後Disposeとかすればもっと確実かな
865 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 10:37:56 ] 基本的に放置するしかないよ Disposeはあくまでメンバに持ってるアンマネージリソースを開放するためのチャンス
866 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 11:10:02 ] StringDictionaryってKeyで指定してValue取り出せないの? foreach使って取り出す以外使えない?
867 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 11:14:37 ] インデクサ使え
868 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 12:09:20 ] >StringDictionaryってKeyで指定してValue取り出せないの? >foreach使って取り出す以外使えない? どうしてその疑問に行き当たったのか不思議だw
869 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 12:40:20 ] >>866 まずはMSDNライブラリくらい見てみたら? msdn2.microsoft.com/ja-jp/library/xfhwa508 (VS.80).aspx
870 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 14:28:46 ] インデクサはItemプロパティで説明されてるから見つけにくいのかもしれんね。 演算子のoverloadもop_Equality のような名前になっている。
871 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 15:40:12 ] C#に限った説明じゃないからな
872 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 16:18:31 ] ただ、それってDictionaryとかでも一緒じゃん。 なにも考えずに使ったら使えたってなりそうじゃん。
873 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 16:28:38 ] なんでインデクサがわからないような人がStringDictionaryのようなマイナーなものを使うに至ったのか気になる Tips系のサイトで見つけたならそこに使い方も書いてあるはず もし.NET 2.0ならDictionary<String>が使えるから存在価値は無いね
874 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 21:35:22 ] 略語に関する質問です。 ・CIL⊃MSIL? CIL≒MSIL? ・CLS⊃CLI? (CLT+CLS+MSIL+JIT)→CLI→CLR≒.net Framework→.NET言語⊃C#? うち、CLT、MSILおよびCLIから先はMicrosoftが作った用語で合ってますか?
875 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 21:39:37 ] CLRはMSによるCLIの実装だったかな
876 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 22:01:08 ] >>874 MSILはCILに若干の拡張を加えたもの
877 名前:デフォルトの名無しさん mailto:sage [2007/09/24(月) 02:06:43 ] StringDictionaryよりDictionary<string,string>の方が1.5倍強処理早いね
878 名前:デフォルトの名無しさん mailto:sage [2007/09/24(月) 03:00:46 ] やっぱそうなんか。 StringCollectionよりList<string>の方が速いのは知ってたが
879 名前:デフォルトの名無しさん mailto:sage [2007/09/24(月) 03:05:48 ] StringDictionaryは大小文字を区別しないとかカルチャ意識するとかそういう比較をしてたと思う。
880 名前:デフォルトの名無しさん mailto:sage [2007/09/24(月) 03:06:51 ] C#はパクり元のDelphiみたいに、動的配列や集合型はないの?
881 名前:デフォルトの名無しさん mailto:sage [2007/09/24(月) 03:09:58 ] >>880 そういう質問をするときはまずDelphiの動的配列や集合型の説明をするのが礼儀だよ。
882 名前:デフォルトの名無しさん mailto:sage [2007/09/24(月) 03:10:00 ] パクり元・・・
883 名前:デフォルトの名無しさん mailto:sage [2007/09/24(月) 03:11:03 ] パクリもなにも同じヘジたんだしな。
884 名前:デフォルトの名無しさん mailto:sage [2007/09/24(月) 08:56:21 ] PictureBox ってフォーカスが移動しないのでしょうか? ボタンなどはフォーカスが移動すると、ボタンの表面に点線が引かれ フォーカスがある状態になります。 PictureBox にもフォーカスを移動させるにはどうしたらよいでしょうか?
885 名前:デフォルトの名無しさん mailto:sage [2007/09/24(月) 09:08:36 ] フォーカスってのはキーボード入力受付を意味するもんで、絵が入力受け取ってもねぇ?
886 名前:デフォルトの名無しさん mailto:sage [2007/09/24(月) 10:21:39 ] >>885 複数の絵を表示したいので、PictureBox で→を押したら次の絵に進みたいのです。
887 名前:デフォルトの名無しさん mailto:sage [2007/09/24(月) 11:14:02 ] >>886 不可視のコントロール置いて代わりにすれば?
888 名前:デフォルトの名無しさん mailto:sage [2007/09/24(月) 11:25:59 ] >>887 なるほど。 不可視のコントロールをおいて、そこの KeyDown イベントで PictureBox を制御すると。 ところで不可視のコントロールって何を使えばよいのでしょうか? TextBox.Visible = false; てな感じかな?
889 名前:デフォルトの名無しさん mailto:sage [2007/09/24(月) 11:27:57 ] form.KeyPreview = true にして親フォームでキー見たら?
890 名前:デフォルトの名無しさん mailto:sage [2007/09/24(月) 11:30:32 ] カスタムコントロールでSetStyle(ControlStyles.Selectable, true)として OnPaintを自分で実装したら? たかが画像一枚描画するだけでしょ
891 名前:デフォルトの名無しさん mailto:sage [2007/09/24(月) 11:53:20 ] どもです。 不可視のほうも、form.KeyPreview = true の方もうまくいきました! もうちょっと実装を進めて、良いほうを最終的に使いたいと思います。
892 名前:デフォルトの名無しさん mailto:sage [2007/09/24(月) 13:10:16 ] どこからも使われてないprivateメソッドが存在しても、コンパイラは警告も何も言わないんですが、 C#ではprivateメソッドにクラス外からアクセスすることができるって事ですか? それとも、ただコンパイラが頭悪いだけですか? C#作った人が前の会社で作った、Pascal風の言語のコンパイラでは、ちゃんと教えてくれるんですが。
893 名前:デフォルトの名無しさん mailto:sage [2007/09/24(月) 13:12:59 ] >>892 リフレクションを使えば、privateメンバにもアクセスできる。
894 名前:デフォルトの名無しさん mailto:sage [2007/09/24(月) 13:18:41 ] クラス外からリフレクションで触られるのはさすがに考慮しなくていいだろうけど クラス内からリフレクションで触ってるってこともありうる
895 名前:デフォルトの名無しさん mailto:sage [2007/09/24(月) 15:13:45 ] FxCopを使う。いろいろ出すぎてわけわからなくなるけど。
896 名前:デフォルトの名無しさん mailto:sage [2007/09/24(月) 16:09:11 ] ShouldSerializePropertyはprivateが多かったべかな まあなんにしろFxCopの役割やわなあそれ
897 名前:896 mailto:sage [2007/09/24(月) 16:13:30 ] これじゃ分かりにくいべさ。 privateで外部から触られる→ShouldSerializeProperty
898 名前:デフォルトの名無しさん mailto:sage [2007/09/24(月) 16:30:00 ] FormにTextBoxを配置しているのですが、Formの空いた部分をクリックすると TextBoxの方にフォーカスが行ってしまいます。 普通にFormにもフォーカスを当てたいのですがどのようにすればよいのでしょうか。 MouseDownイベントでFocus()メソッドを呼んでも結果は同じでした。
899 名前:デフォルトの名無しさん mailto:sage [2007/09/24(月) 17:15:05 ] >>898 の考える、フォームにフォーカスが当たっている状態、ってどんな状態だ?
900 名前:898 mailto:sage [2007/09/24(月) 17:52:30 ] >>899 とりあえずキー入力がFormの方に行く状態と考えてます。
901 名前:デフォルトの名無しさん mailto:sage [2007/09/24(月) 20:29:11 ] >>839 サンプルコードがあるHPとかありまつか?
902 名前:デフォルトの名無しさん mailto:sage [2007/09/24(月) 20:37:14 ] >>どこからも使われてないprivateメソッドが存在してもコンパイラは警告も何も言わないんですが、 そんなことでいちいち報告されたらたまらん。
903 名前:デフォルトの名無しさん mailto:sage [2007/09/24(月) 20:42:04 ] >>892 蛇足な機能はちゃんと削除したという報告ですか ごくろうさん
904 名前:デフォルトの名無しさん mailto:sage [2007/09/24(月) 20:42:30 ] >>902 それはあんたの発想の方が変だw もしくは余程物を知らないか
905 名前:デフォルトの名無しさん mailto:sage [2007/09/24(月) 20:46:39 ] どうでもいいと思う俺は技術者に向いてないんだろうか
906 名前:デフォルトの名無しさん mailto:sage [2007/09/24(月) 20:59:17 ] >>904 いつどのようなときにひつようなの? ひらがなでしつれいします。
907 名前:デフォルトの名無しさん mailto:sage [2007/09/24(月) 21:10:26 ] かいとうがないようだ。 論破!
908 名前:デフォルトの名無しさん mailto:sage [2007/09/24(月) 21:11:42 ] >>892 それがコンパイラの仕事かどうかはしらんがReSharperで警告してくれるよ。 VisualStudioのアドインね。
909 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 11:25:40 ] どう考えても意図的に外してるだろ 中の人が何考えて外したのかは知らんが
910 名前:デフォルトの名無しさん [2007/09/25(火) 21:16:15 ] oExcel = new Excel.Application(); // 指定したファイルをオープン oWorkbook = (Excel.Workbook)(oExcel.Workbooks.Open(@"C:\AAA\AAA.xls, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value)); oSheet = (Excel.Worksheet)oWorkbook.ActiveSheet; oRange = ((Excel.Range)oExcel.Application.Rows["1:42", Missing.Value]); oRange.Copy(oExcel.Application.Rows["43:81", Missing.Value]); oRange1 = (Excel.Range)oSheet.Cells[8, 1]; oRange1.Value ="aaa"; oExcel.DisplayAlerts = false; oExcel.ActiveWorkbook.SaveAs(strFileName, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Excel.XlSaveAsAccessMode.xlNoChange, Missing.Value, Missing.Value, Missing.Value, Missing.Value); oExcel.DisplayAlerts = true; //元に戻す System.Runtime.InteropServices.Marshal.IsComObject(oRange); //oRangeの解放 System.Runtime.InteropServices.Marshal.IsComObject(oRange1); //oRange1の解放 System.Runtime.InteropServices.Marshal.IsComObject(oSheet); //oSheetの解放 System.Runtime.InteropServices.Marshal.IsComObject(oWorkbook); //oWorkbookの解放 oExcel.ActiveWorkbook.Saved = true; oExcel.Quit(); //Excelを終了する System.Runtime.InteropServices.Marshal.IsComObject(oExcel); //oExcel を解放 GC.Collect(); 上記コードでExcelのプロセスが残ってしまいます。EXE終了するとプロセスは消えます。 COMは解放していると思うのですが・・・どなたか教えて下さい。
911 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 21:20:05 ] nullに代入してないぞ!!! どこかの馬鹿がnull代入必要ないとか逝ってたけど嘘だぞ。
912 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 21:22:32 ] nullに → nullを
913 名前:910 [2007/09/25(火) 21:23:25 ] >>911 回答ありがとうございます。 最後のところ System.Runtime.InteropServices.Marshal.IsComObject(oExcel); //oExcel を解放 oExcel = null; GC.Collect(); としたのですがやはり同じ現象でした。
914 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 21:24:42 ] IsComObjectって何だよw いや「どこかの馬鹿」が言ったのはReleaseComObjectなんてイラネ、でしょ。 しかし、ほとんど嫌がらせに近いコードだな
915 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 21:24:46 ] oRange oRange1 oWorkbook
916 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 21:26:17 ] null代入は関係ないだろ常識的に考えて…… >oRange = ((Excel.Range)oExcel.Application.Rows["1:42", Missing.Value]); とか >oExcel.ActiveWorkbook.SaveAs(... あたりに問題ありそう。変数にうけないとまずくない? Excel使ったことないけど。
917 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 21:28:45 ] IsComObject?
918 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 21:28:50 ] >>916 >GC.Collect(); は無視か? 俺の言ってる馬鹿ってのは…
919 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 21:32:30 ] >>911 &>>918 のことだろ。知ってるよ!
920 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 21:34:27 ] ttp://blogs.wankuma.com/jeanne/archive/2005/12/20/20102.aspx
921 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 21:37:32 ] だからReleaseComObjectなんて要らないってw
922 名前:デフォルトの名無しさん [2007/09/25(火) 21:38:24 ] /// <summary> /// COM オブジェクトへの参照を解放するプロシージャ(既存のファイルを開く場合も共用) /// </summary> /// <param name="objCom"></param> private void MRComObject(ref object objCom) { //COM オブジェクトの使用後、明示的に COM オブジェクトへの参照を解放する try { //提供されたランタイム呼び出し可能ラッパーの参照カウントをデクリメント if (objCom != null && System.Runtime.InteropServices.Marshal.IsComObject(objCom)) { int i; do { i = System.Runtime.InteropServices.Marshal.ReleaseComObject(objCom); } while (i > 0); } } finally { objCom = null; } } 上記のメソッドをhanatyan.sakura.ne.jp/dotnet/index.html (VB版)を見てC#に置き換えたのですが MRComObject(ref oSheet);とするとオブジェクトの変換ができない旨のエラーが発生します。 VBと違ってC#のobject型は何でも受けることができないのでしょうか?
923 名前:デフォルトの名無しさん [2007/09/25(火) 21:42:28 ] >>914 すみません。 System.Runtime.InteropServices.Marshal.ReleaseComObjectの間違いでした。 でも上記に修正しても駄目でした。
924 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 21:43:08 ] ref のせい。いらん。 あと2.0以降ならわざわざループせんでもFinalReleaseComObjectがある。
925 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 21:44:15 ] >>921 試してないだろ?
926 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 21:47:09 ] >>923 >>920 つまり jeanne.wankuma.com/tips/programing/releasecom.html
927 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 21:47:11 ] EXEを終了させればEXCELのプロセスが消えるのなら大筋は間違ってないと思う。 ファイナライザがあるオブジェクトの場合、 参照が消えてもGC.Collect()1回で回収されるわけではなく大体2〜3回後くらいになる。 目安として、1回目でファイナライザの実行予定としてリストされ、 2回目でファイナライザ実行、3回目でメモリ回収。
928 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 22:05:17 ] >>923 FinalReleaseComObjectにしたらいけたよ。
929 名前:デフォルトの名無しさん [2007/09/25(火) 22:07:45 ] >>924 VBの場合Private Sub MRComObject(ByRef objCom As Object)なんですが 参照渡しじゃなくてもいいのでしょうか?
930 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 22:08:28 ] でもFinalReleaseComObjectは使っていいのかな? 他のアプリから使っていても大丈夫か?
931 名前:デフォルトの名無しさん [2007/09/25(火) 22:12:03 ] >>928 FinalReleaseComObjectですか!ありがとうございます!
932 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 22:17:26 ] >>930 問題ない。 RCWからの参照をきるだけだから。 COMオブジェクトの管理する参照カウンタとは別。
933 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 22:21:35 ] >>930 RCWの参照カウンタはCOMの参照カウンタとはべつものなのでその心配はない。 このソースだとoExcel.Application.ほにゃららを無駄に何度も呼んでるから、 ApplicationオブジェクトのRCWのカウンタが1より大きく増えてる可能性があるな。 つかReleaseComObjectを使うなら中間で取得したCOMオブジェクトは全部変数に入れとけ。 こういう書き方をすると捕捉出来ないオブジェクトが無駄に増えてるぞ。 >oRange.Copy(oExcel.Application.Rows["43:81", Missing.Value]);
934 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 22:26:59 ] oRange.Copy(..) はobjectを返すのでちゃんと変数で受けて あとでReleaseComObjectする必要があるのはわかるか?
935 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 22:35:10 ] しかしまあしみじみ.NETでOfficeオートメーションなんかするもんじゃないと思うな プロセス分けてそっちでやらすか
936 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 22:35:51 ] だからReleaseComObjectなんていらんて。 実際やってみりゃ分かると思うが。
937 名前:デフォルトの名無しさん [2007/09/25(火) 22:39:49 ] >>934 すみません。どうしてオブジェクトを返す事が分かったのでしょうか? 私はどんなオブジェクトが返る事が分かりませんでしたし、どんな オブジェクトかも分かりません(;;)
938 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 22:46:11 ] ↓null代入とかReleaseComObject要/不要の議論禁止
939 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 22:48:40 ] >>937 ならExcelのオブジェクトモデルが分かってないってことで、 それじゃお話にならんのじゃないかい?
940 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 22:55:55 ] 正直この話はまたかという感じで飽きたな。 VB.NETにCOM専用の参照カウンタGCを搭載すれば問題の大半は解決すると思うのだが。
941 名前:デフォルトの名無しさん [2007/09/25(火) 23:11:19 ] >>939 すみません。VB6のときはあまり気にせずともできてしまったので・・・ オブジェクトはRangeが返ってくるのでしょうか?
942 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 23:19:22 ] >>920 むしろこっち。 ttp://blogs.wankuma.com/jeanne/archive/2006/07/25/33568.aspx
943 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 23:20:06 ] >>941 msdn2.microsoft.com/ja-jp/library/microsoft.office.interop.excel (VS.80).aspx
944 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 23:30:41 ] >>936 またおまえか
945 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 23:32:59 ] >>926 もうちょっときれいに書けないか?
946 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 01:01:37 ] >>910 Excel11 のタイプリブを使ったので若干OpenとSaveAsの引数が増えてる。 ファイル名や範囲もいじってるので注意されたし。 string strFileName = @"D:\AAA\AAA2.xls"; Excel.Application oExcel = new Excel.Application(); //oExcel.Visible = true; Excel.Workbooks oWorkbooks = oExcel.Workbooks; Excel.Workbook oWorkbook = oWorkbooks.Open(@"D:\AAA\AAA.xls", Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value); Excel.Sheets oSheets = oWorkbook.Worksheets; Excel.Worksheet oSheet = (Excel.Worksheet) oSheets[1]; Excel.Range oRange0 = oSheet.Rows; Excel.Range oRange = (Excel.Range) oRange0["1:1", Missing.Value]; Excel.Range oRange2 = (Excel.Range) oRange0["5:5", Missing.Value]; oRange.Copy(oRange2); Excel.Range oRange3 = oSheet.Cells; Excel.Range oRange1 = (Excel.Range) oRange3[8, 1]; oRange1.set_Value(Excel.XlRangeValueDataType.xlRangeValueDefault, "aaa"); 続く
947 名前:946 mailto:sage [2007/09/26(水) 01:02:46 ] 続き oExcel.DisplayAlerts = false; oWorkbook.SaveAs(strFileName, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Excel.XlSaveAsAccessMode.xlNoChange, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value); oExcel.DisplayAlerts = true; //元に戻す oWorkbook.Saved = true; //oWorkbook.Close(false, Missing.Value, Missing.Value); //oWorkbooks.Close(); oExcel.Quit(); //Excelを終了する Marshal.ReleaseComObject(oRange0); Marshal.ReleaseComObject(oRange); //oRangeの解放 Marshal.ReleaseComObject(oRange1); //oRange1の解放 Marshal.ReleaseComObject(oRange2); Marshal.ReleaseComObject(oRange3); Marshal.ReleaseComObject(oSheet); //oSheetの解放 Marshal.ReleaseComObject(oSheets); Marshal.ReleaseComObject(oWorkbook); //oWorkbookの解放 Marshal.ReleaseComObject(oWorkbooks); Marshal.ReleaseComObject(oExcel); //oExcel を解放
948 名前:946 mailto:sage [2007/09/26(水) 01:13:16 ] oRange.Copy(oRange2) はobjectで実体はboolを 戻してるようなのでReleaseComObjectは不要だった。 もれなくReleaseComObjectするのはたいていのことではない。 あきらめてGCに任せるのもひとつの方法だと考えよう。 VB6ではなぜ出来る限り早くEXCELを開放してしまわないといけなかったか、 .NETではそれが必ずしも重要ではなくなったかの理由は以下を参照されたし。 pc11.2ch.net/test/read.cgi/tech/1189038267/37-38
949 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 08:17:10 ] 前々からこれも疑問でしょうがないんだが、 >oExcel.Quit(); //Excelを終了する これって、まあもちろんエクセルの使われ方にもよるんだけど ほとんどの場合、ユーザーの使い勝手の観点から言えば不要じゃないだろうか。 というか、こんなことするから「プロセスが残る」なんて問題が起こるんじゃん。 俺はこの手のコード見るたびに、世の中手を動かしてコピペするだけで 頭を使わない馬鹿が多いんだな、と思っちゃうよ。
950 名前:デフォルトの名無しさん [2007/09/26(水) 11:07:33 ] >>934 > oRange.Copy(..) はobjectを返すのでちゃんと変数で受けて > あとでReleaseComObjectする必要があるのはわかるか? 試しに ojject oTest; oTest = oRange.Copy(..) としてみましたが voidが返ってくる旨のエラーメッセージが出るのですが・・・
951 名前:デフォルトの名無しさん [2007/09/26(水) 11:12:24 ] >>946 ご教授ありがとうございます。サンプル例まで提示して頂いて感謝します。
952 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 11:32:16 ] >>950 Excelのversionの違いかもしれんね。 boxingされたSystem.Bool、処理に成功するとTrueが戻ってるよ。 msdnでもobjectが戻ってくることになっている。ただし内容の説明がない。 msdn2.microsoft.com/ja-jp/library/microsoft.office.interop.excel.range.copy (VS.80).aspx
953 名前:デフォルトの名無しさん [2007/09/26(水) 11:42:03 ] >>952 回答ありがとうございます。色々難しいですね。
954 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 12:08:22 ] >>949 使ったことがないのがみえみえじゃん(笑 Officeのオートメーションは操作自動化のためのインターフェイスで、 手で操作するのと同じことがCOM経由で出来るというもの。 マクロのようにApplication#Visible = trueの表示状態で使うのが本来の使い方なのだと思う。 つまり立ち上げたExcelは別途ユーザーに閉じさせる前提で起動したままにしておくということ。 ただ現実の使われ方はOffice文書を作ったり印刷させたりするため 非表示のまま使用することがほとんどであり、 ユーザーのニーズにOfficeのオートメーションの仕組みがあっていないといえる。
955 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 12:09:04 ] お触り禁止
956 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 12:21:02 ] >>954 >ただ現実の使われ方はOffice文書を作ったり印刷させたりするため >非表示のまま使用することがほとんどであり、 なるほど確かにそういう使い方なら意味はある。というか必須だね。 ただそういう使い方が「ほとんど」かどうかは疑問だけど。
957 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 12:24:23 ] コメントに文句言ってるのかと思った。 ソースと同内容のコメントは余計だよなあ
958 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 12:53:25 ] >>954 本来はという話ならVBAマクロやVSTOのように、 EXCELやWORDの機能を拡張するためのオートメーションなんだろう。 アプリケーションからEXCELを呼び出すのは方向が逆。
959 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 13:59:47 ] >>956 てか最初からそういう前提の話しかしてないだろ
960 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 22:46:47 ] 非表示だと動かない機能があって…
961 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 22:52:03 ] どんな昨日だよwExcelにそんなの無いだろ
962 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 23:08:02 ] あるよ
963 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 23:11:40 ] どの機能?
964 名前:デフォルトの名無しさん [2007/09/26(水) 23:17:23 ] プレビュー?
965 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 22:28:06 ] 非表示でもフォーカス当てたり、アクティブに出来るの? sendkeys使える?
966 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 22:50:04 ] >>965 フォーカス、アクティブ、sendkeysってどういうときに使うの?
967 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 23:22:38 ] もうやめとけってw 昔VB6とかからエクセル操作する場合には、操作する対象のオブジェクトは かならず表示状態にして、かつアクティブにすべし、みたいなことが 「おまじない」的に推奨されてたから、それをいまだに信じている人がいるんだよたぶん。 某花ちゃんなんたらってサイトとか見てみるといいよ。
968 名前:デフォルトの名無しさん [2007/09/27(木) 23:37:36 ] >>967 ド素人にVB6でExcel操作させると、画面のリフレッシュとかプログレスバーの表示なんて処理を考えずに作るから 固まってるかどうか判別しにくくなるだろうから表示状態にするのは正解かもね .netでも非表示にさせると偉い目にあいそう
969 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 00:28:17 ] office2007ってファイル出力にXMLが選択できるそうだが 中身解析すれば手軽に直接ファイル生成ができると思っておk?
970 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 00:54:57 ] 仕様が公開されてるでそ
971 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 01:11:52 ] おkじゃない
972 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 01:16:45 ] XPSのこと?あれは複雑っぽいな。
973 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 03:11:54 ] xml+圧縮かかってたような
974 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 11:34:10 ] Office Open XMLだろ ほんとにただのXML
975 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 12:12:01 ] ただじゃないxmlてどんなん?
976 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 13:40:48 ] docxやxlsx
977 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 14:17:55 ] Panelコントロールについての質問なんですが、 AutoScrollをtrueにしたPanelをDock.FillでFormに置き、 Panel.ClientSizeChangedでサイズを変更するようにした幅がPanelClientSize.Widthな コントロールをPanelの中に置いたのですが、Formを最大化後に元に戻すと ちゃんとClientSizeChangedが発生し、コントロールのサイズも変わってるにもかかわらず 横スクロールバーが表示されてしまいます。 コントロールのLeftは0で、横にスクロールしてもWidthがPanelのサイズをオーバーしてる とは思えません。 WndProc()でWM_RESTOREを拾ってリサイズしても変わりませんでした。 このPanelの横スクロールバーを消すにはどうしたらいいでしょうか?
978 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 19:50:42 ] class MyClass : IMyInterface とするとき、 object obj = new MyClass(); MyClass my = (MyClass)obj; と IMyInterface interface = new MyClass(); MyClass my = (MyClass)interface; って速度変わらないですかね?
979 名前:デフォルトの名無しさん [2007/09/28(金) 19:50:46 ] で、結局どうなんよ 直接ファイル生成できそう? それとも無理? 2007使ってる香具師回答きぼんぬ
980 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 19:58:55 ] 速度気にするんなら通常のキャストじゃなくて as キャストだろ
981 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 20:03:10 ] >>980 asって値型だと型が合致しなかった場合はdefault(struct)になるんですかね?
982 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 20:33:06 ] ならない。 Nullableな値型ならnullが返される。非Nullableな値型ならコンパイルエラー。
983 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 20:45:28 ] >>979 Office System 互換機能パックで 2003でもいけた。 hoge.xmlで保存してちょ。 <?xml version="1.0"?> <?mso-application progid="Excel.Sheet"?> <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="www.w3.org/TR/REC-html40"> <Worksheet ss:Name="XmlSheet"> <Table> <Row> <Cell><Data ss:Type="Number">1</Data></Cell> <Cell><Data ss:Type="Number">2</Data></Cell> </Row> <Row ss:Index="3"> <Cell><Data ss:Type="String">aaa</Data></Cell> <Cell><Data ss:Type="String">bbb</Data></Cell> </Row> </Table> </Worksheet> </Workbook>
984 名前:983 mailto:sage [2007/09/28(金) 20:47:53 ] あらかじめExcelで雛形作っておいて部分的に書き換えるのがよさそう。 テンプレートエンジンがあれば使えそうだ。
985 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 22:33:34 ] つかただのxmlスプレッドシートで事足りんじゃねーの?
986 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 22:35:01 ] っていうよりただのxmlスプレッドシート? 互換パックすらいらないんじゃ…
987 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 22:35:42 ] >>986
988 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 23:11:50 ] >>980 as キャストの方が早いの?
989 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 00:43:12 ] 次スレ余路。
990 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 02:08:18 ] >988 asの方が早いし型が違う場合に例外が飛ばずにnullが返る。 キャストで型が違って例外が飛ぶと結構重いし。 でも、ダウンキャストしなくても済むようにインターフェースを作る方がいいんじゃない?
991 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 02:51:50 ] >>980 があほなんだろ。
992 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 02:54:15 ] >asの方が早いし型が違う場合に例外が飛ばずにnullが返る。 asのが早いってそんな違いがあるの? 例外とぶって飛ばなきゃ使う側でNullReference〜になるかチェックが必要になるわけで 正しい型が入っているはず、という状況なら普通のキャストの方がまだ望ましい動きじゃないかい?
993 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 03:28:45 ] >992 正しい型が必ず入ってる場面ではチェックは不要なんだからasの方が速いのでasを使う。 違う型のものが入ってるかもしれない場面でダウンキャストするってのは何か作りがおかしいので考慮する必要ってあんまりないと思うよ。
994 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 03:41:11 ] msdnをみるとis演算子の分asの方が命令数が多いように見える。 >as 演算子はキャストと似ていますが、変換エラーの時に、 >例外を発生せずに null を返す点が異なります。次に式の形式を示します。 >expression as type >これは、次と同じ意味になります。 >expression is type ? (type)expression : (type)null
995 名前:994 mailto:sage [2007/09/29(土) 03:59:31 ] IL上は1命令違うだけで差はなかった。 IL_0002: isinst A IL_0002: castclass A
996 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 04:09:22 ] 結局asは早くも遅くもないのか
997 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 04:15:58 ] じゃあ、Delphiのasはキャストより速いの?遅いの?
998 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 06:59:24 ] >違う型のものが入ってるかもしれない場面でダウンキャストするってのは >何か作りがおかしいので考慮する必要ってあんまりないと思うよ。 だからこそキャストで例外になるようにするんじゃねーかよ。 まあNull参照例外でも似たようなもんではあるけど、 キャスト例外のがまし。
999 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 07:00:16 ] >正しい型が必ず入ってる場面ではチェックは不要なんだからasの方が速いのでasを使う。 asの方が早いってのは思い込みじゃねーのか?といってる。
1000 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 07:08:03 ] is演算子が面白い。 o is CLASS1 が o as CLASS1 != null と同じコードを吐いている。
1001 名前:1001 [Over 1000 Thread] このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。