ふらっとC♯, C#(初心者用) Part19
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2007/09/04(火) 11:20:46「どんなにくだらないC#プログラミングに関する発言でも誰かが優しくレスをしてくれるスレッド」です。
ほかのスレッドでは恐ろしくて書き込めないような低レベル、もしくは質問者自身なんだか意味がよく分からない質問など、
勇気をもって書き込んでください。
内容に応じて、他スレ・他板へ行くことを勧められる、あるいは誘導される場合がありますがご了承下さい。
前スレ: ふらっとC♯, C#(初心者用) Part18
http://pc11.2ch.net/test/read.cgi/tech/1186550904/
前前スレ: ふらっとC♯, C#(初心者用) Part17
http://pc11.2ch.net/test/read.cgi/tech/1182948981/
(,,゜Д゜)∩先生助けてくださいです!
....世の中には貴方の助けを必要としている人がいるぽ....
2 名前: デフォルトの名無しさん [sage] 投稿日: 2007/08/08(水
0002デフォルトの名無しさん
2007/09/04(火) 11:56:43乙
0003デフォルトの名無しさん
2007/09/04(火) 12:01:53やりたいことは
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]);
}
こんなふうにも出来る
0004デフォルトの名無しさん
2007/09/04(火) 12:09:11int[] intData = new int[]{ 5,4,3 };
int[] intData2 = new int[4];
for(int i = 0; i < 3; i++){
intData2[i + 1] = intData[i];
}
こんな感じかね
0005デフォルトの名無しさん
2007/09/04(火) 12:09:14自分のしたいことと、ポインタ/配列の概念がうまく結びついてない感じがする
0006デフォルトの名無しさん
2007/09/04(火) 12:10:290007996
2007/09/04(火) 12:43:08999を書いたのは私と別人なようで…。。。
>>3-4
回答ありがとうございます。
ただ…。やりたいことと微妙にズレがあります。
動的に変数名を指定という言葉が近いのかと思いますが、
for(int i = 0; i < 3 ;i++){
[intData + i] = i * 5;
}
といった感じに左辺を動的に指定したいのです。
0008デフォルトの名無しさん
2007/09/04(火) 12:50:28変数ってのは入れ物であって、値じゃないのよ?
↓じゃダメなの?
for(int i=0; i<3 ;i++)
intData[i] = i * 5;
0009デフォルトの名無しさん
2007/09/04(火) 12:52:37ListViewコントロール をdetailで使用しています。
したいことは、選択されたItemが、常にListViewコントロールの真ん中に表示できるようにしたいです。
矢印キーを押して、行をスクロールさせた時に、選択された行の下3,4行くらいも見える(コントロール内に出てくる)ようにするようにしたいということです。
Item数が少なく、Itemを構成する行がListView内に収まる場合は、すべてが見えてるので問題ありません。
0010デフォルトの名無しさん
2007/09/04(火) 12:54:07>ただ…。やりたいことと微妙にズレがあります。
この手の質問ってC#スレで頻出なんですが
残念(に思われるのは996さんだけかもしれませんが)ながら
C#の仕様だと無理なのですよ。
もうみんなうんざりなので最短ルートとして「C#でどう書くか」が
提示されまくってるのをお察し下さいませ。
0011デフォルトの名無しさん
2007/09/04(火) 12:55:100012デフォルトの名無しさん
2007/09/04(火) 13:09:21配列で出来る。
配列はあらかじめ大きさを指定しなきゃならないので、
それがまずいときは
List<int> list = new List<int>();
for(int i = 0; i < 3; ++i){
list.Add(intData[i] * 5);
}
動的に大きさが増える配列であるListを使えば出来る。
後、変数以外の名前も指定したければ、その変数を持ったクラスを新しく作って、
そのクラスの配列やListを使う
0013996
2007/09/04(火) 13:24:36色々と提示してもらえて助かりました。
どの方法を使うのかが最適か試してみます。
0014デフォルトの名無しさん
2007/09/04(火) 13:32:29・コントロールを名前の文字列から取得したいんですが
・VB6みたいなコントロール配列ってどうやるんですか
・変数を名前で指定したいんですが
・フォーム間でデータを渡したいんですが
・イベントが発生しません。これはバグですね?
・参照型と値渡しと値型と参照渡しがよくわかりません><
0015デフォルトの名無しさん
2007/09/04(火) 13:52:51> もうみんなうんざりなので
これからも頻出質問は出続けると思うのでそういうのをまとめたものを作りませんか。
答えるほうもそこへのリンクさすだけで手間無く済みそうですし。一挙両得
>>14さんも挙げられてるようにこういうものがあればなと思われてる方も
少なからずいるのではないでしょうか。
よろしくお願いします。
0016デフォルトの名無しさん
2007/09/04(火) 13:59:47996がやりたいこととは全然違うだろ。
とどのつまり前スレ999さんのいってる事の解決が事件をとく鍵だと思う
0017デフォルトの名無しさん
2007/09/04(火) 13:59:51ListViewItem item = ほにゃらら;
item.EnsureVisible();
0018デフォルトの名無しさん
2007/09/04(火) 14:04:12と思ってるやつにはどう答えたらいいんだろう。
それは間違ってるよ、と代替案を提示すべきなのか
リフレクション使え、と突き放すべきなのか
0019デフォルトの名無しさん
2007/09/04(火) 14:07:42動的に変数名を文字列で指定しなきゃならないようなケースは普通ないし
そういう場合にはリフレクションなりDictionaryなり使えという話になるな
0020デフォルトの名無しさん
2007/09/04(火) 14:08:05それはないだろ
0021デフォルトの名無しさん
2007/09/04(火) 14:20:530022デフォルトの名無しさん
2007/09/04(火) 14:25:49そんなのいらん
このスレは質問者がある特化した質問をして、その特化したシチュエーションに対応する回答を
スレ住人がしてくれるから存在価値があるんだろ
つか、大抵はググれば済むんだから…
0023デフォルトの名無しさん
2007/09/04(火) 14:30:23やりかた知らんけど
0024デフォルトの名無しさん
2007/09/04(火) 14:31:04もう一段前があって、多分こんな感じなんじゃないかな。
1.ループを使えば綺麗に書けるのに
2.ピコーン 「文字列から変数が取れれば解決じゃん?」
3.やり方わかんね -> 2ch
「ループを使えば綺麗に書けるのに」というときの定石には
言語ごとにかなりクセがある。
C#だとそれは最初からループ対応の変数(配列とかListとか)を使うであったり
アクセス用のメソッドを用意するであったりするわけだ。
一方で緩い言語では変数の名前空間自体が一種のDictionaryになっていて
命名ルールを工夫するだけで複数の変数をループ処理できるものもある。
そこまで緩くないC#としては、
「C#でループを書くときの定石を学べ」か
「.NETの機能を駆使して自分でパターンを作れ」になるんだろうなぁ。
0025デフォルトの名無しさん
2007/09/04(火) 14:34:33すんませんでした。
”頻出質問”に”うんざり”ということだったので、
あれば便利かなと思って先走ってしまいました。
それではみんなでれっつうんざり!
0026デフォルトの名無しさん
2007/09/04(火) 14:58:45なんでそんなことやろうとしてるのかわからん。
あおり楽しかったけどw
0027デフォルトの名無しさん
2007/09/04(火) 16:42:090028デフォルトの名無しさん
2007/09/04(火) 16:48:48public IDictionary<string,object> Properties{get;};
public IDictionary<string,Delegate> Methods{get;};
}
もう全部これを継承するようにするとか
0029デフォルトの名無しさん
2007/09/04(火) 20:10:16早速ですが質問させていただきます。
C#を用いてExcelを扱うアプリを作ってるんですが
既存のシステムにはCOMを使用し、直接Excelを開いてRangeオブジェクトを
ToString()などして値を取得していたんですが、先輩曰くそのやり方は非常に駄目だから
VBS使えといわれました。
Excelのデータはデータベースに入れてるんですが
VBSを用いて同じことしたいんですがどのようにすればいいでしょうか。
0030デフォルトの名無しさん
2007/09/04(火) 20:15:39VScrollBarをフォームにくっつけているのですが
上下左右キーを押した際にスクロールバーにフォーカスを
持って行かれてしまいます。これを回避することは可能でしょうか。
フォームでキー処理をしたいのですがフォーカスをVScrollbarに取られてしまい
キーイベントが来ないので困っています。
0031デフォルトの名無しさん
2007/09/04(火) 20:43:53---Panel--- |
---Form--- 下
とか?
0032デフォルトの名無しさん
2007/09/04(火) 20:47:31003330
2007/09/04(火) 21:05:550034デフォルトの名無しさん
2007/09/04(火) 21:40:45お願いします。
0035デフォルトの名無しさん
2007/09/04(火) 22:17:31確かにc#だと上手くやらないとゴミ残りまくり。
VBSの使い方?
すれ違い
>>34
アクセラレータ キー?
ショートカットキー?
0036デフォルトの名無しさん
2007/09/04(火) 22:31:490037デフォルトの名無しさん
2007/09/04(火) 22:36:180038デフォルトの名無しさん
2007/09/04(火) 22:38:20C#でそういうのはほとんど見かけないよな
0039デフォルトの名無しさん
2007/09/04(火) 22:41:190040デフォルトの名無しさん
2007/09/04(火) 23:39:51配列の変数のように使うことも多い
0042デフォルトの名無しさん
2007/09/05(水) 01:01:22Paintイベントをバックバッファでやってくれるからちらつかない
なんて聞いたんでTrueにしてみたがFalseのときよりちらつくようになった
漏れ、だまされたんでしょうか?
それとも手法がいけないんでしょうか?
0043デフォルトの名無しさん
2007/09/05(水) 04:07:390044デフォルトの名無しさん
2007/09/05(水) 04:10:480045デフォルトの名無しさん
2007/09/05(水) 04:15:53e.Graphics 使ってる?
0046デフォルトの名無しさん
2007/09/05(水) 04:18:340047デフォルトの名無しさん
2007/09/05(水) 05:07:420048デフォルトの名無しさん
2007/09/05(水) 08:14:39コントロールのと描画の範囲は抑えておきましょう。
0049デフォルトの名無しさん
2007/09/05(水) 11:28:58その別アプリが例外エラーで落ちるときに、エクスプローラのタスクバーが消えたままになってしまうため、
それを常駐させておいた補助プログラムで自動的に検出して、タスクバーの復帰を解決しようと思うのですが、
これらの処理について調べるには、どのようなキーワードで検索すれば良いでしょうか?
稚拙な質問ですがよろしくお願いします。
0050デフォルトの名無しさん
2007/09/05(水) 12:32:51例外で落ちてタスクバーが消える事が問題なんじゃない
なぜ例外をキャッチしてないのかと問いたい
0051デフォルトの名無しさん
2007/09/05(水) 12:38:06>>49は、障害を覆い隠すのではなく、障害の原因を特定し、その解決を考えてみるべきでしょ。
0052デフォルトの名無しさん
2007/09/05(水) 12:38:250053デフォルトの名無しさん
2007/09/05(水) 12:39:190054デフォルトの名無しさん
2007/09/05(水) 12:40:30だから本アプリでキャッチしようよ。
触れない理由でもあるんかな?
0055デフォルトの名無しさん
2007/09/05(水) 12:42:04よく読みましょう。
0056デフォルトの名無しさん
2007/09/05(水) 12:43:22いや、読んだ。だから別アプリが問題だっていってるわけだが?
0057デフォルトの名無しさん
2007/09/05(水) 12:45:010058デフォルトの名無しさん
2007/09/05(水) 12:46:34そうか、なら死ね
0059デフォルトの名無しさん
2007/09/05(水) 12:50:220060デフォルトの名無しさん
2007/09/05(水) 12:54:12DirectX SDK
でぐぐれ馬鹿
0061デフォルトの名無しさん
2007/09/05(水) 12:55:40explorer.exeのプロセスを定期的に調べて死んでたら起動するとかでは?
0062デフォルトの名無しさん
2007/09/05(水) 13:10:39006349
2007/09/05(水) 14:00:02別アプリはあくまでも別(ゲームなのでソースは公開されてない)なので、
どういう原因で例外が発生しているのかはタイミングを含めてほとんど不明です。
なのでその不慮の自体からの回避をするための補助ツールをと思いまして。
>>57,58
結果的にチート扱いになってしまうかも分かりませんが、今回はタスクバーの
表示回復だけが目的です。
>>60
ググって見ます。
>>61
explorer.exeは生きてる状態で、タスクバーが消えてる以外は問題なく動いています。
(Windowsキーを押すとスタートメニューが表示されます。)
>>62
その機能を、補助ツールを常駐させることで自動的に回復したいのです。
0064デフォルトの名無しさん
2007/09/05(水) 14:05:36もう一度ゲームを起動して正常終了してもタスクバーは消えたままですか?
0065デフォルトの名無しさん
2007/09/05(水) 14:06:33そんなんぐぐっても何も出てこんぜ
0066デフォルトの名無しさん
2007/09/05(水) 14:08:32いや出てくるが?
0068デフォルトの名無しさん
2007/09/05(水) 14:13:34表示させればいいんじゃない
0069デフォルトの名無しさん
2007/09/05(水) 14:16:08んーじゃあ最初にタスクバーのハンドルを取得して
非表示になってたらShowWindowするとか。
非表示じゃなくて存在自体なくなってたらexplorer.exeをkillして再起動とか。
後者はあまり好ましくないかも知れんがやむを得ないと思われ
0070デフォルトの名無しさん
2007/09/05(水) 14:27:31ありがとうございます。
その方法で調べて試してみます。
>>69
確かにexplorerのkillは最終手段ですね^^;
0071デフォルトの名無しさん
2007/09/05(水) 15:29:47DirectXで画面にクリア処理
それで終わるよ
0072デフォルトの名無しさん
2007/09/05(水) 17:04:32CreateGraphics()で書いてました
e.Graphicsじゃないといかんのですね
ありがとうございました
0073デフォルトの名無しさん
2007/09/05(水) 17:08:210074デフォルトの名無しさん
2007/09/05(水) 17:13:21ヒント
最大化
最小化
createグラフィックが正解
あとはわかるね
0075デフォルトの名無しさん
2007/09/05(水) 17:26:53そのゲームの作者かメーカーに修正依頼するのが筋じゃねーの
0076デフォルトの名無しさん
2007/09/05(水) 17:38:160077デフォルトの名無しさん
2007/09/05(水) 18:00:090078デフォルトの名無しさん
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;}
}
0079デフォルトの名無しさん
2007/09/05(水) 19:02:13このコードでちゃんと値取れたが、Testへはどうやって値入れてるんだ?
0080デフォルトの名無しさん
2007/09/05(水) 20:31:28ムービー再生の命令ってありますか?
0081デフォルトの名無しさん
2007/09/05(水) 20:33:020082デフォルトの名無しさん
2007/09/05(水) 20:34:370083デフォルトの名無しさん
2007/09/05(水) 20:47:10(&1)
(&2)
(&12
0084デフォルトの名無しさん
2007/09/05(水) 20:47:18ユーザーコントロールを新規のフォームに配置 ⇒ プロパティシートから設定しています。
0085デフォルトの名無しさん
2007/09/05(水) 20:47:50すまんが、エロビデオのモザイク除去コマンドしか知らね
他スレを当たってみてくれ
そして二度と来んな
0086デフォルトの名無しさん
2007/09/05(水) 20:54:570087デフォルトの名無しさん
2007/09/05(水) 20:55:23???
プロパティシートからどうやって?
string?
0088デフォルトの名無しさん
2007/09/05(水) 21:10:43くだらねぇ
面白いと思ってんのか?
お前が二度とくんな
0089デフォルトの名無しさん
2007/09/05(水) 21:17:37そのSET処理にメッセージボックスを置けばすぐ解るよ
0090デフォルトの名無しさん
2007/09/05(水) 22:41:50String型で誕生日が入っている場合
その誕生日から現在日付を計算して
年齢を取得するにはどうすればいいのでしょうか?
つまり誕生日が
"1991/09/06"の場合
今日実行すれば、15歳を表示
明日実行すれば、16歳を表示
0091デフォルトの名無しさん
2007/09/05(水) 22:44:300092デフォルトの名無しさん
2007/09/05(水) 22:58:01DateTimeにパースして
現在の年月日と比較したら?
0093デフォルトの名無しさん
2007/09/05(水) 22:58:46>"1991/09/06"の場合
>今日実行すれば、15歳を表示
>明日実行すれば、16歳を表示
これはどうやって計算した?
基本的にはその計算した過程をプログラムすれば良い。
ここが参考になるんじゃない
ttp://jeanne.wankuma.com/tips/datetime/
0094デフォルトの名無しさん
2007/09/05(水) 22:59:15こんなかんじか?
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());
0095デフォルトの名無しさん
2007/09/05(水) 23:01:020096デフォルトの名無しさん
2007/09/05(水) 23:02:530097デフォルトの名無しさん
2007/09/05(水) 23:07:51009872
2007/09/06(木) 00:38:06CreateGraphics()で描いていたのを
e.Graphicsを使って描いてDoubleBufferdをTrueにする事で
ダブルバッファリングを有効にすることができましたが
意図的にPaintイベントを発生させたいときに
Paint(null,null)で呼び出していた手法が使えなくなってしまいました
(PaintEventArgs e が nullになってしまうため)
何かいい方法はないでしょうか?
0099デフォルトの名無しさん
2007/09/06(木) 00:43:23そういうのは
・スレッドをブロックして即座に描画するんならControl.Refresh
・非同期的に描画するんならControl.Invalidate
を呼ぶ。
通常は後者
0100デフォルトの名無しさん
2007/09/06(木) 00:49:22嗚呼、Refreshでよかったのか〜
Invalidateは初めて知りまつた
ありがとうございました
0101デフォルトの名無しさん
2007/09/06(木) 09:18:280102デフォルトの名無しさん
2007/09/06(木) 09:47:120103デフォルトの名無しさん
2007/09/06(木) 09:51:03あれ、満年齢って誕生日の前日に数えるんじゃなかったっけ?
0104デフォルトの名無しさん
2007/09/06(木) 10:01:26すまん、前日+1と読み誤っていた。
前日でプラス1、その通りでございます。
0105デフォルトの名無しさん
2007/09/06(木) 10:06:16textboxやbuttonとか貼り付けて、buttonの名前を「移動]「戻る」「進む」と
名づけたんだけど、そのボタンにどうやったらその機能を付けたらいいのかが
わからないんです。
navigate()やGoback()などのメソッドを使うことは分かったんだけど、実際に
どのように記述すればいいのか…
0106デフォルトの名無しさん
2007/09/06(木) 10:25:58レンダリングエンジンを自作するつもりでなければ、
WebBrowserコントロールを貼り付ける。
あとはWebBrowserコントロールでググればいろいろ出てくるだろ。
0107デフォルトの名無しさん
2007/09/06(木) 10:29:00このへんが参考になるかな。
ttp://www.microsoft.com/japan/msdn/vstudio/express/vcsharp/develop/createwindowsapp/
0108デフォルトの名無しさん
2007/09/06(木) 10:48:33おおっ!ありがとうございます。
参考になります♪
0109デフォルトの名無しさん
2007/09/06(木) 11:17:40>>91
プロパティグリッドというのですかね。正確な名称はわかりませんが、
コレクションエディタ? でメンバを追加しています。
>>78
メンバを追加してもメッセージは表示されません。。
0110109
2007/09/06(木) 11:41:39お騒がせしました。
0111デフォルトの名無しさん
2007/09/06(木) 11:55:36登録したサイトのみ閲覧できるってことなんですよね?
そうではなくIEみたいにアドレスや検索語をtextBoxに入力して移動buttunを押せば
そのページに飛ぶようなブラウザをつくりたいんですけど、どうすれば…?
どのようにメソッドを記述すればいいんでしょうか?
0112デフォルトの名無しさん
2007/09/06(木) 11:58:44簡易なソフトを組むところから始めて見た方が良いのでは…。
0113デフォルトの名無しさん
2007/09/06(木) 12:01:45軽く練習してからの方が早いよ
0114デフォルトの名無しさん
2007/09/06(木) 12:09:380115デフォルトの名無しさん
2007/09/06(木) 12:14:48嫌です
というかウェブブラウザ以外以外作るきはないんです
一度きりのプログラミングなので知る必要はないと思います
0116デフォルトの名無しさん
2007/09/06(木) 12:16:17>>111程度のこともできないんじゃ無理だね
0117デフォルトの名無しさん
2007/09/06(木) 12:16:510118デフォルトの名無しさん
2007/09/06(木) 12:18:100119デフォルトの名無しさん
2007/09/06(木) 12:35:500120デフォルトの名無しさん
2007/09/06(木) 12:42:18もし入門書を読むのが苦痛ならプログラマには向いていないってことだよ
0121デフォルトの名無しさん
2007/09/06(木) 12:47:04↓
webBrowser1.Navigate(textBox1.Text);
がんばれ
0122デフォルトの名無しさん
2007/09/06(木) 13:39:40誰でも苦痛だと思うが
0123デフォルトの名無しさん
2007/09/06(木) 13:44:570124デフォルトの名無しさん
2007/09/06(木) 13:57:27苦痛じゃなくなるのは程よく慣れて思い通りになってくるだいぶ後の話だ。
苦痛だと思ったらプログラマに向いてないなんてちょい言い過ぎ。
>>115を読むとこいつは人間的にどうかと思うがな。
0125デフォルトの名無しさん
2007/09/06(木) 14:07:37だから練習しろといってるw
0126デフォルトの名無しさん
2007/09/06(木) 14:20:200127デフォルトの名無しさん
2007/09/06(木) 16:59:46HtmlElement he = webBrowser1.Document.Body;
if (he == null) {
MessageBox.Show("error");
return;
}
he.InnerHtml += "a";
これを行うとhe==nullがtrueになってしまいます。
Bodyを取得するにはどうしたらよいのでしょうか?
0128デフォルトの名無しさん
2007/09/06(木) 17:39:16Swap<T>(ref T,ref T);
なんてのがありますけど、
実際にSwapクラス?ってどこかの名前空間にあります?
0129デフォルトの名無しさん
2007/09/06(木) 18:04:100130128
2007/09/06(木) 18:13:49誰が作っても同じだし、汎用的な処理なんであるに決まってると思い込んでた
0131デフォルトの名無しさん
2007/09/06(木) 18:28:260132デフォルトの名無しさん
2007/09/06(木) 18:39:35欲しいと思ったことも無いなSwap
0133デフォルトの名無しさん
2007/09/06(木) 18:44:400134128
2007/09/06(木) 18:53:26C#みたいな言語では例外安全とかあんまり考えなくていいのね
だからSwapも要らないと
0135デフォルトの名無しさん
2007/09/06(木) 20:15:57Swap1こだけあってもそんなにありがたくないような気がする
そういうの集めたライブラリとかなら知らんが。
0136デフォルトの名無しさん
2007/09/06(木) 20:18:03Swapだけそんなに安全に使えてもあんまり意味ないし
0137デフォルトの名無しさん
2007/09/06(木) 20:21:23GCされるだけだし、
構造体のコンストラクタでは例外投げられないし
0138デフォルトの名無しさん
2007/09/06(木) 20:43:43例外が発生するかどうかはこの場合関係ないような気がするけど・・・
誰か詳しい人教えて
0139デフォルトの名無しさん
2007/09/06(木) 21:04:44OutOfMemoryExceptionやThreadAbortExceptionみたいな
いつでも起きうる例外もあるから。
例えばAPIでMutexを作って変数に代入する前に例外が起きたりして解放する機会を失ったりとかすると致命傷になる。
swapなら何かのIntPtrを例外安全に入れ替えたいときに必要なのかもしれず。C#使っててそんな機会はまずないかもしれないけど。
まぁ、ThreadAbortExceptionなんかAbortを叩くやつが悪いと思うし
本当のメモリ不足のOutOfMemoryExceptionは例外安全を考えるまでもなく復旧できないだろうし
こいつらはあんまり考えなくてもいいかもね。
他にいつでも割り込んで起きうる例外ってあったかなぁ?
0140デフォルトの名無しさん
2007/09/06(木) 21:11:16変数の状態が不正になる
ローカル変数とかは普通に書いてりゃ問題ないけど
寿命の長いオブジェクトのフィールドだったりすると
例外が起こった処理以外に影響を与えてしまう。
まあ可能性は普通ものすごく低いので
ここまで考慮することはまあそうそうないけどね。
本当にクリティカルなオブジェクトだったりすると
そこまで考えなきゃならないこともあったりはする
普通はコード上で想定される例外くらいの考慮でしますけどね
Swapは普通問題が起こるのはまれな部類なので
そこまで考慮しないのがほとんど
0141デフォルトの名無しさん
2007/09/06(木) 21:15:39スレッドがアボートされるので
思いもよらんところで例外が発生する可能性はある
そこまで考慮するかどうかはまた別の問題だが。
0142デフォルトの名無しさん
2007/09/06(木) 21:17:512.0になる時に信頼性に関してはかなり手を加えられてたりする、ひっそり
まあSQLサーバーのせいだろうけど。
0143デフォルトの名無しさん
2007/09/06(木) 21:18:28セキュリティ上まずいことになる可能性があるところくらいかな
ロックなんかが関わってくるところもあるかもしれない
0144デフォルトの名無しさん
2007/09/06(木) 21:20:20それはつまりちゃんと対応した場合の話じゃないの?
ってか対応しる手段としてそういうのがあれ
0145デフォルトの名無しさん
2007/09/06(木) 21:20:36WebRequest.Create()でWebRequestを作成した後、GetResponse()で
WebResponseを作成するまではいいのですが、ファイルをダウンロード後に
Close()しようとしてもなぜかそこでハングしてしまい、WebResponseを閉じる
ことが出来ません。試しにGetResponseStream()で取得したStreamの方を
Close()してみたのですが、こっちの方でもハングしてしまい止まってしまいました。
ダウンロード対象はファイルとストリーミングデータ両方です。
何かヒントだけでもいただけないでしょうか?
0146138
2007/09/06(木) 21:22:42なるほどー。そういう問題があったとは気づかなかった。
でもSwapをメソッドにしてもそういう問題は変わらないんじゃない?
それともInterlockedクラスみたいに内部的な処理として実装するって意味なのかな
0147デフォルトの名無しさん
2007/09/06(木) 21:50:37判らないけど処理に時間がかかるんじゃないか。
0148デフォルトの名無しさん
2007/09/06(木) 21:51:000149デフォルトの名無しさん
2007/09/06(木) 21:51:30のつもりだったのですよ。
0150デフォルトの名無しさん
2007/09/06(木) 21:53:410151デフォルトの名無しさん
2007/09/06(木) 22:04:24Swapが頻出するから、そのメソッドが用意されてないのはなんでじゃろ、
といった程度の話じゃないのかな
C++だとSwap以外のほとんどの処理が例外を投げる可能性があって大変らしい
StackのPopにいたっては例外安全に記述する方法がないという
0152デフォルトの名無しさん
2007/09/06(木) 22:23:00Compactは知らないが、その手のコードはあちこちにある。
それで試したら?
つーかストリーミングの処理はどうやってるのか非常に興味ある。
出来てなさそう。
0153デフォルトの名無しさん
2007/09/06(木) 22:25:28C++は基本的に例外安全か否かの2値しか考えないからねぇ。
ttp://msdn2.microsoft.com/ja-jp/library/system.runtime.constrainedexecution.consistency(VS.80).aspx
これで言うと、C++な人たちの世界では
Consistency.WillNotCorruptState
Consistency.MayCorruptProcess
のどちらか。
そうじゃなくて、状態の一貫性が失われることはあるのは前提で、
どこまで状態が不定になるかを分類するというアプローチもあると。
0154デフォルトの名無しさん
2007/09/06(木) 22:28:19メモリだって100%確実に書き込みできるわけじゃないし。
0155デフォルトの名無しさん
2007/09/06(木) 22:29:05PC上で同じコードを実行した場合はハングせずに切断できるので
多分Compact上でやるのがいけないのか、CE機の方に原因がある
のかもしれません。
一応探してみます。
ストリーミングといってもただフレーム単位で流れてくるmp3を
スレッドに分けてConnectStreamから読んでるだけなんですけどね orz
0156デフォルトの名無しさん
2007/09/06(木) 22:34:46C++のstd::swapもコピーコンストラクタの実装によっては例外が出ると思うけど・・・
そういうことではない?
0157デフォルトの名無しさん
2007/09/06(木) 22:37:300158デフォルトの名無しさん
2007/09/06(木) 22:39:09すなわちなぜ数字の1と文字列型の1が存在し区別する必要があるのかということです?
すごく面倒です
0159デフォルトの名無しさん
2007/09/06(木) 22:46:260160デフォルトの名無しさん
2007/09/06(木) 22:47:010161デフォルトの名無しさん
2007/09/06(木) 22:47:050162デフォルトの名無しさん
2007/09/06(木) 22:53:20と思っているに違いない。
>>160は女。
0163デフォルトの名無しさん
2007/09/06(木) 22:54:400164デフォルトの名無しさん
2007/09/06(木) 22:58:22・多重起動してるかチェックしたときにすでに同じEXEが起動してた
・かつ起動済みのEXEが最小化されてる
こんなとき、すでに起動済みのEXEのほうの最小化を解除することは可能?
0165デフォルトの名無しさん
2007/09/06(木) 23:03:300166デフォルトの名無しさん
2007/09/06(木) 23:11:03プロセス間通信する必要がある。
IpcChannelとかその辺
0167デフォルトの名無しさん
2007/09/06(木) 23:17:07Win32API呼べばいけると思う。
参考
ttp://program.station.ez-net.jp/special/visual_studio/csharp/2005.mutex.asp
0168デフォルトの名無しさん
2007/09/06(木) 23:23:12たとえばprintに渡せないし
プログラムしない人にはわからないと思うぜ
0169デフォルトの名無しさん
2007/09/06(木) 23:24:57なにその参考先
二回目以降に起動したやつは存在するプロセスに通知するだけにすればいいのに
0170デフォルトの名無しさん
2007/09/06(木) 23:25:120171デフォルトの名無しさん
2007/09/06(木) 23:34:130172デフォルトの名無しさん
2007/09/07(金) 00:33:32もし i におかしな数字を入れられた時はもう一度入力させるようにwhile文でまわすつもりが、
数字じゃなくてaaaaみたいな文字列を入れられて延々ループが始まってしまいました。
これを防ぐにはどうしたらいいですか?
0173デフォルトの名無しさん
2007/09/07(金) 00:38:45意味分からんからコード書いてみ
0174デフォルトの名無しさん
2007/09/07(金) 00:44:18ループ入る前に評価するのでは?
0175デフォルトの名無しさん
2007/09/07(金) 00:53:25int i;
scanf("%d",i);
while( i>1 || i<9999 )
{
printf("もう一度入力してください");
scanf("%d",&y);
}
こんな感じです。
0176デフォルトの名無しさん
2007/09/07(金) 00:54:14どんなコードかすごい興味あるw
0177デフォルトの名無しさん
2007/09/07(金) 00:54:43最初のscanfの括弧内のiの前に&書き忘れです。
0178デフォルトの名無しさん
2007/09/07(金) 00:56:34whileの条件の不等号が逆です・・・
0179デフォルトの名無しさん
2007/09/07(金) 00:56:470180デフォルトの名無しさん
2007/09/07(金) 00:58:070181デフォルトの名無しさん
2007/09/07(金) 00:59:230183デフォルトの名無しさん
2007/09/07(金) 01:04:40CとC#は別の言語だよ
自分が勉強してる言語の名前くらいちゃんと覚えとけ
この質問は>>180でFAだが次からこっち行けよ
http://pc11.2ch.net/test/read.cgi/tech/1170338926/
0184175
2007/09/07(金) 01:06:45すいません、i<1 || i>9999 の時に正しく入力されるまでループさせたいんです。
でもaaaaなどの文字列を入れられてしまうとなぜかバグみたいに”もう一度入力してください”が延々流れ続けるようになってしまうんです。
0185デフォルトの名無しさん
2007/09/07(金) 01:07:270186175
2007/09/07(金) 01:07:300187デフォルトの名無しさん
2007/09/07(金) 01:09:29ってかすでに無限ループする以外の選択肢しかないだろこれはw
0188デフォルトの名無しさん
2007/09/07(金) 01:11:28いや構わんよ
自分はCのスレにも居るから何かあれば遠慮なく聞いて
0189デフォルトの名無しさん
2007/09/07(金) 01:12:04処理自体は間違ってないように見える
0190デフォルトの名無しさん
2007/09/07(金) 01:19:55http://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
0191デフォルトの名無しさん
2007/09/07(金) 01:24:58もうすっかり忘れてるなw
なるほどこれはダメだ
0192デフォルトの名無しさん
2007/09/07(金) 01:28:190193デフォルトの名無しさん
2007/09/07(金) 01:33:360194デフォルトの名無しさん
2007/09/07(金) 01:36:41scanf 懐かしいな、講義で教わったときは「使うな」だったけど。
0195デフォルトの名無しさん
2007/09/07(金) 01:44:28まぁ知らなきゃ使ってしまうかもしれないし当然だが
0196デフォルトの名無しさん
2007/09/07(金) 04:06:43取り出し方が思いつかないですけど
0197デフォルトの名無しさん
2007/09/07(金) 04:12:560198デフォルトの名無しさん
2007/09/07(金) 05:09:53リサイズが出来なくなるのは仕様で済ましちゃ問題あると思うんだが。
0199デフォルトの名無しさん
2007/09/07(金) 08:05:440200デフォルトの名無しさん
2007/09/07(金) 09:14:160201デフォルトの名無しさん
2007/09/07(金) 09:15:020202デフォルトの名無しさん
2007/09/07(金) 09:54:420203デフォルトの名無しさん
2007/09/07(金) 11:27:00正直だめもとで質問したのですが便利なものがあるんですね。難しいけど
ありがとうございました
0204デフォルトの名無しさん
2007/09/07(金) 11:55:10単純に、DllImportなどを指定して、WindowsのAPIとかを呼び出すコードが混じっていたら、
アンマネージドになるのであって、
明示的に、VisualStudioのビルドプロパティのどっかにフラグで指定されているわけでは無いですよね?
0205デフォルトの名無しさん
2007/09/07(金) 12:35:570206デフォルトの名無しさん
2007/09/07(金) 13:48:21マネージドには違いないだろ
0207デフォルトの名無しさん
2007/09/07(金) 13:51:32>DllImportなどを指定して、WindowsのAPIとかを呼び出すコードが混じっていたら、
>アンマネージドになる
ならなねーよ
0208デフォルトの名無しさん
2007/09/07(金) 14:20:27ここの>CLRに準処 の意味がわからん
CLIに準処したCLR上で動作する の間違いか?
0209デフォルトの名無しさん
2007/09/07(金) 14:52:05アンセーフとごっちゃにしてない?
アンセーフかどうかならプロジェクトのプロパティにあるよ
Win32APIはたしかにアンマネージだが呼び出し側がアンマネージになるわけではない
0210デフォルトの名無しさん
2007/09/07(金) 14:59:23arrray.Joint("区切り文字")
見たいなメソッドがあれば一番良いのですが。。。
今はループで回して+=で結合してるのですあ、もっと良い方法がないかな、と思って
0211デフォルトの名無しさん
2007/09/07(金) 15:03:140212デフォルトの名無しさん
2007/09/07(金) 15:04:080213デフォルトの名無しさん
2007/09/07(金) 15:07:09ちなみに要素数にもよるがループ中で文字列連結はよくない。
要素数だけゴミ(一時オブジェクト)が生成されるので。
そういうときは代わりにStringBuilderを使う。
0214デフォルトの名無しさん
2007/09/07(金) 15:15:090216デフォルトの名無しさん
2007/09/07(金) 15:22:460217デフォルトの名無しさん
2007/09/07(金) 15:57:55それは"a" + "b" + "c"がstring.Concat("a", "b", "c")になるというだけでは?
ループの連結では関係ないよ
0218デフォルトの名無しさん
2007/09/07(金) 16:25:28そしてstring の += が全部一つにまとまってちょっぱやになるだろ
0219204
2007/09/07(金) 16:33:10多分、以下のようになります。
アンマネージ :
昔のDLLなどがアンマネージコード。
.NETから呼び出しても、呼び出した側はマネージドコードのまま。
アンセーフ :
ポインタなどを使ったコードで、unsafe{}句で記述する。
ビルドプロパティで許可の設定をしないとビルドエラーとなる。
0220デフォルトの名無しさん
2007/09/07(金) 16:53:15なんねーよ
ループの展開ってどれだけ膨大なコードになるんだw
0221デフォルトの名無しさん
2007/09/07(金) 17:29:59まあstringの連結の展開には無関係だけど
0222デフォルトの名無しさん
2007/09/07(金) 17:31:090223デフォルトの名無しさん
2007/09/07(金) 23:26:05もとの状態が最大化だったら最大化した状態に戻したいのですが。
0224デフォルトの名無しさん
2007/09/07(金) 23:44:450225デフォルトの名無しさん
2007/09/08(土) 01:31:23どうもです。
やっぱWin32APIを使わないと無理なんでしょうかね?
0226デフォルトの名無しさん
2007/09/08(土) 01:46:02要は最小化される前の状態を「覚えて」おけばいつでも元に戻せるだろ?
小学校1年生でもわかる理屈だと思うけど
0228155
2007/09/08(土) 02:37:48あの後、いろいろ実験したのですが、どうやらファイルを完全にダウンロード完了しないと
回線が切断されないようで、単品のファイルをダウンロードする場合はちゃんと切断できるの
ですが、ラジオ放送などの終わりがいつになるかわからないものだと放送が終了するまで
切断できないようです。
ですが、さすがにそれだと通信帯域的や、コネクション数の制限的にまずいのでどうにかして
切断したいのですが、どうしたらいいでしょうか?
0229デフォルトの名無しさん
2007/09/08(土) 03:49:500230デフォルトの名無しさん
2007/09/08(土) 04:25:25usingで囲ってるのですが、どうしてもそうするとClose出来なくて
ハングしてしまい抜け出せません orz
0231デフォルトの名無しさん
2007/09/08(土) 13:37:040232デフォルトの名無しさん
2007/09/08(土) 18:04:50ウインドウステートプロパティで
最大化か最小化か普通か取得できるからそれみて
最小化されてたら設定かえてやるだけでよくね?
0233デフォルトの名無しさん
2007/09/08(土) 18:10:13227に聞いてみたいものだねw
0234デフォルトの名無しさん
2007/09/08(土) 18:26:45スレッドは嫌韓雑誌なのでNGです
テコンダー朴がすごすぎです
0235デフォルトの名無しさん
2007/09/08(土) 19:00:060236デフォルトの名無しさん
2007/09/08(土) 19:05:16ネタ?
.Net framework sdkかC# Expressで検索。
0237223
2007/09/08(土) 19:27:09単に対象のフォームを作成時から面倒みれるわけではないというだけです。
まあライブラリ的なもんだと考えてもらえばわかりやすいかと。
>>232
元の状態がわからないのでそれではできないです。
0238デフォルトの名無しさん
2007/09/08(土) 19:30:470240デフォルトの名無しさん
2007/09/08(土) 19:51:060242デフォルトの名無しさん
2007/09/08(土) 20:01:08なんかネタじゃなさそうだし....
0243デフォルトの名無しさん
2007/09/08(土) 20:16:26public void RestoreWindow(Form f) {
if (f.WindowState == FormWindowState.Minimized) {
//
}
}
これをどう書くかって話だろ?
まあ多分ShowWindow使うしかないと思うけど。
0244デフォルトの名無しさん
2007/09/08(土) 20:19:110245デフォルトの名無しさん
2007/09/08(土) 20:22:25ライブラリといえばスタティックメソッドのことだと思い込んでるんだよ
0246デフォルトの名無しさん
2007/09/08(土) 20:24:05そのクラスをまとめて格納するフォルダを作りました。
それを別フォルダにあるプロジェクトからそのフォルダにあるクラスを
プロジェクト→既存項目の追加で追加すると同じプロジェクト内の
フォルダへコピーされてしまいました。
やりたい事はコピーでなくその共通フォルダにあるクラスそのものを参照して
共通フォルダのクラスを変更するだけですべてのプロジェクトが修正されている
仕組みにしたいのですがやり方がわかりません。VB6なら汎用モジュールを格納する
フォルダを作りその中のファイルをIDEで追加するとできたのですが・・・
コピーされてしまうと各プロジェクト分同じファイルができてしまい
メンテナンスが大変になりそうなので・・・
どなたか、共通ファイルを複数プロジェクトで共有する方法を教えて下さい。
0247デフォルトの名無しさん
2007/09/08(土) 20:27:13リンクとして追加(だったかな)を選ぶ
DLLにした方がいいと思うけどね
0248デフォルトの名無しさん
2007/09/08(土) 20:28:21プロジェクトとリソルーションの区別がついてないと見た。
まずはそれを理解するのが先決だと思う。
0249デフォルトの名無しさん
2007/09/08(土) 20:29:56共通ファイルをクラスライブラリーにしてそのDLLを各プロジェクトで参照すればいいんじゃね
0250223
2007/09/08(土) 20:41:52大体そんな感じです。やっぱAPI使うしかないですね。
>>244
API使えばわざわざそういう方式にする必要もないので。
>>245
ライブラリって言葉はまずかったですかね?
でもそれはあくまでも補足で、その前の一行を読めば十分わかると思ったんですけどね。
まあというわけでWin32APIを使うことにします。
どうもありがとうございました。
0251デフォルトの名無しさん
2007/09/08(土) 20:42:00共通に使えるクラスを集めたプロジェクトを作って
そのプロジェクト自体をソリューションに追加するといいよ
ファイルを直接参照するんじゃなくてDLLができちゃうけど気にするな
DLLの存在は全く意識せずに扱えるようになってるから
0252デフォルトの名無しさん
2007/09/08(土) 20:47:40馬鹿なくせに頑なお方だねえw
>その前の一行を読めば十分わかると思ったんですけどね。
じゃないよw
何もわかってないのはお前さんの方。
君のような性格の奴はぜったに伸びないよ。
>>251
246が望んでいるのは、恐らく複数の「リソルーション」から同じクラスライブラリを
参照することで、君がいっているようなこととは微妙に違うと思うよ。
0253デフォルトの名無しさん
2007/09/08(土) 20:51:11×リソルーション
○ソルーション(ソリューション)
0254251
2007/09/08(土) 20:52:55>複数の「リソルーション」から同じクラスライブラリを参照すること
いやその意味で言ったんだ
>>251の「そのプロジェクト」は利用側じゃなくて
「共通に使えるクラスを集めたプロジェクト」を指してるつもりだった
0255デフォルトの名無しさん
2007/09/08(土) 21:07:43回答ありがとうございます。
0256デフォルトの名無しさん
2007/09/08(土) 21:24:150257デフォルトの名無しさん
2007/09/08(土) 21:28:35「どんなにくだらないC#プログラミングに関する発言でも誰かが優しくレスをしてくれるスレッド」です。
0258デフォルトの名無しさん
2007/09/08(土) 21:42:07君223か?あるいは>>243?
このレベルのことが理解できなお馬鹿がそんなに多いとも思えない。
まあこれ以上騒がれてももうっとうしいから
一応簡単に223のどこが「馬鹿」か書くことにする。
223は、フォームが最小化される前の状態がわからないからできない、
と言っているがこれは愚かな発言だ。
わからない(不可知)なのではなく、223にわかるようなコードが書けないだけだ。
「わかる」ようなコードを書けよ。
>>257
くだらない質問をするのは問題ないが、無知を認められない頑なさ故に
自ら答えを知ろうとしない人間をなだめすかして手取り足取り教えてやるほど
誰もお人よしじゃないだろ。
0259デフォルトの名無しさん
2007/09/08(土) 21:48:37これから相手にしたやつも同じくらいバカってことで↓
0260デフォルトの名無しさん
2007/09/08(土) 21:54:23放置できないんなら君もヽ( ・∀・)人(・∀・ )ノナカーマ
0261デフォルトの名無しさん
2007/09/08(土) 22:07:01ShowWindow( hWnd, SW_RESTORE );
と
fm.WindowState= FormWindowState.Normal;
って挙動いっしょじゃないのか?
0262155
2007/09/08(土) 22:36:19返信遅れてしまってすいません。
元からThreadで回す予定だったので長くとも1分以内に切れてくれるならいいのですが、
いつまで経っても切れないのでメインスレッドに持って来て実験すると案の定
Closeのところでハングしてるんです orz
0263デフォルトの名無しさん
2007/09/08(土) 23:58:04VB6だと
'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#だとどう書けばよろしいのでしょうか?
0264デフォルトの名無しさん
2007/09/08(土) 23:59:270265デフォルトの名無しさん
2007/09/09(日) 00:14:26VSTOはありません。ACCESS97です。
0266デフォルトの名無しさん
2007/09/09(日) 00:31:20http://support.microsoft.com/kb/302295/ja
0267デフォルトの名無しさん
2007/09/09(日) 00:51:55VB.NETを使って書いて作ったdllをC#から呼ぶ。
Missing.Valueが面倒なんだよねぇ……
0268デフォルトの名無しさん
2007/09/09(日) 00:57:53Missing.Valueとは何でしょうか?
0269デフォルトの名無しさん
2007/09/09(日) 01:32:030270デフォルトの名無しさん
2007/09/09(日) 03:09:44具体的なコード例があれば助かるのですが・・・
0271デフォルトの名無しさん
2007/09/09(日) 03:17:230272デフォルトの名無しさん
2007/09/09(日) 08:41:350273デフォルトの名無しさん
2007/09/09(日) 09:56:07簡単なことだったらググレカス。
キーワード位判るだろ!!!!
c# access オートメーション
ttp://support.microsoft.com/kb/317114/ja
でもな、c#からoffice使うのは勧めない。VB6やVBAからのほうがよい。
0274デフォルトの名無しさん
2007/09/09(日) 11:47:55"$実行("hoge",1,"nage")"
を解析して
「$実行」
と
「"hoge"」「1」「"nage"」
を返してほしいのだがどうすればよいでしょうか?
正規表現でやれると思うけど引数部分が何回繰り返されるかわからないのです。
この引数の部分はobject[]に格納したいです。
0275デフォルトの名無しさん
2007/09/09(日) 11:50:270276デフォルトの名無しさん
2007/09/09(日) 11:55:48地道にコード書けば?
0277デフォルトの名無しさん
2007/09/09(日) 11:56:21確か @IT に .NET の正規表現講座があったからそれで勉強してみれ
0278デフォルトの名無しさん
2007/09/09(日) 11:59:28"hoge"に [ , ( ) ]が含まれているかも知れないし。
0279デフォルトの名無しさん
2007/09/09(日) 12:01:190280デフォルトの名無しさん
2007/09/09(日) 12:12:070281デフォルトの名無しさん
2007/09/09(日) 12:28:47かなり評判が悪いみたいですね
COM開放しわすれて残骸が残るから?
それとも遅いから?
VSTOつかえといっても高いしアレ
おとなしくVSスクリプトでも使ってなさいってこと?
0282デフォルトの名無しさん
2007/09/09(日) 12:30:470283デフォルトの名無しさん
2007/09/09(日) 13:54:14interfaceを作って、そのままクラスの中で宣言して使ってる
サンプルソースによく出くわすのですが、
interfaceってクラスで実装して初めて使えるものではないのでしょうか?
たとえば、IShellLinkのサンプルやseasarのオマケでついてくるサンプルなどです。
よろしくお願いします。
0284デフォルトの名無しさん
2007/09/09(日) 13:57:30seasarのおまけとやらは知らん
0285デフォルトの名無しさん
2007/09/09(日) 14:00:25ちとエスパーしてみるが、
ファクトリが返してきたインスタンスをインターフェイスで受けてるケースのことか?
インターフェイスだけでインスタンスは作れないが、変数(参照の受け皿)は宣言できる。
IABC abc = ABC.Factory();
0286デフォルトの名無しさん
2007/09/09(日) 14:13:00interface IAbc {}
class Abc : IAbc {}
IAbc abc = new Abc();
0287デフォルトの名無しさん
2007/09/09(日) 14:14:030288デフォルトの名無しさん
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さんの言われるように特別な例なのでしょうか?
よろしくお願いします。
0289デフォルトの名無しさん
2007/09/09(日) 15:08:07CoClass 属性がなけりゃ直接 new はできんはずだが。
ていうかそのサンプルってのはどこにあるのさ?
0290デフォルトの名無しさん
2007/09/09(日) 15:16:52特別な例なので半年後ぐらいに見直すといいよ。
言語の機能というよりはランタイムライブラリの機能だし。
0291デフォルトの名無しさん
2007/09/09(日) 15:23:18たしかにコクラスというのがあります!
他サイトへのリンクについて言及していないようなので貼ってみます。
以下のサイトのサンプルです。
http://smdn.invisiblefulmoon.net/ikimasshoy/dotnettips/tips043.html
コクラスについて調べてみましたがさっぱり意味がわかりませんでした。
この機能の目的についてだけでも教えていただけますか?
あとは参考にすればよい本などがあれば・・・
よろしくお願いします。
>>290
半年後ですか・・・なにもせずに半年というわけではなく、
その間、充分勉強してスキルアップしろという意味でしょうね。
真摯に受け止めます。ありがとうございます。
0292デフォルトの名無しさん
2007/09/09(日) 15:31:12.NET でその取り決めに従うための特別な記述だ。
まああんまり今は気にするな。結局大して役に立たんし。
0293デフォルトの名無しさん
2007/09/09(日) 15:34:15>その間、充分勉強してスキルアップしろという意味でしょうね。
まあCOMについて半年も勉強してても飽きると思うが。
COMを知らなくてもC#の勉強はできるし、
普通なら先に知るべきことはたくさんあるので
半年ぐらい忘れてもいいぐらいだと思う。
0294デフォルトの名無しさん
2007/09/09(日) 15:37:39初心者向きじゃないと思うぞ。
ヒントを言えばShellLinkクラスはCOMオブジェクトそのものじゃなくて、
COMオブジェクトをC#から利用するための中間クラス。
インターフェイスの実装はCOMモジュールの中にあるから安心しろ。
0295291
2007/09/09(日) 15:39:36今の私には「決まり」としてしか理解できないようです。
おまじないのようなものだと思っておきます。
アドバイスありがとうございました。
>>293
ありがとうございます。
まずはもっとほかの事を勉強してみます。
0296291
2007/09/09(日) 15:47:18COMってDLLの一種というくらいの認識しかないのですが、
COMが実装してryinterfaceの仕様をCOMをりようするプログラムのほうで
書き直しているのでしょうか?でもinterfaceを書き直しても実装してるプログラムには
影響ないように思えるのですが。
書いててよくわかんなくなってきました・・・
もしよろしければコクラスの機能だけでも教えていただけたらと思います。
よろしくお願いします。
0297デフォルトの名無しさん
2007/09/09(日) 16:18:34[
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にしてくれるからこれを使うのが普通。
0298デフォルトの名無しさん
2007/09/09(日) 16:23:03ごめん。
COMとは10年以上のつきあいだけどそれでも質問の意味がわかんねぇす。
いわゆる入門書は先にC++の仮想関数テーブルとかIUnknownを説明した上で
その後「coclassとは」みたいな流れを踏むので、
いきなりcoclassだけ説明して下さいってのは無理ってもんだし
かえって遠回りなんじゃないかな。
忠告を無視してまでどうしても知りたければ
この辺の本読んでみるところから初めてみたらいいんじゃない?
http://www.amazon.co.jp/dp/4881356992
http://www.amazon.co.jp/dp/4756132804
http://www.amazon.co.jp/dp/4881357557
C++も分からなければもちろんC++の基礎も勉強と。
そのあと『Essential .NET』と『プログラミングMicrosoft .NET Framework 第2版』
を読破すると。
そこまでやってくれれば、多分ここの書き込み文字数制限程度の分量で
coclassの説明もできると思う。
0299デフォルトの名無しさん
2007/09/09(日) 16:24:36レスありがとうございます。
VC、ATL、COMサーバー・・・どれひとつマスターしておりません・・・。
でもプログラムとう世界の奥深さは実感できました。
いつか理解できる日を夢見ていろいろ勉強してみます。
ありがとうございました!
0300デフォルトの名無しさん
2007/09/09(日) 16:30:41ただ混乱しているだけの質問をしてご迷惑をおかけしております。
たくさんの書籍の紹介ありがとうございます。
今の私には真に理解できるとは思えませんが、
少しずつでも勉強したいと思っております。
ありがとうございました。
0301デフォルトの名無しさん
2007/09/09(日) 18:29:00解放忘れでオブジェクトの残骸が残ってしまうのはVB.NETでも共通だけど、
やっぱ、単純に書きづらいんだよ。
VBでは省略可能な引数をMissing.Valueで埋めなきゃいけない。
普段全引数を指定とかしないから気づかないけどOfficeのバージョンによって引数の数がさりげなく違うなんてこともある。
これがVB.NETならVB6までと同じように書けるようにできている。
同じことができてもっと楽に扱えるVB.NETがあるのにC#で無理に書かなくてもいいんでない?
0302デフォルトの名無しさん
2007/09/09(日) 18:43:36どっちが推奨なんだろ。
0303デフォルトの名無しさん
2007/09/09(日) 18:46:52だから、普通のときは Missing.Value なんじゃね
0304デフォルトの名無しさん
2007/09/09(日) 18:49:340305デフォルトの名無しさん
2007/09/09(日) 19:01:190306304
2007/09/09(日) 19:16:06ちょっと記憶が違ってたけど見つけた
0307デフォルトの名無しさん
2007/09/09(日) 19:18:360308デフォルトの名無しさん
2007/09/09(日) 19:26:040309デフォルトの名無しさん
2007/09/09(日) 19:43:09return oApp.GetType().InvokeMember(name, BindingFlags.Default | BindingFlags.InvokeMethod, null, obj, args);
}
oBook = (Excel._Workbook)InvokeMethod(oBooks, "Open", "c:\\book1.xls");
>>360によると、こうすればmissing付けなくてもいいみたいだよ
0310デフォルトの名無しさん
2007/09/09(日) 20:11:34そもそもインスタンスは1つしかないのでどっちも同じだろ。
Missing.Valueを使ったサンプルの方が圧倒的に多いと思うが。
>309
遅延バインディングだな。
0311デフォルトの名無しさん
2007/09/09(日) 21:13:32global::System.Object missing = global::System.Type.Missing;
英語のドキュメントをみるとどちらの量もどっこいなのだが、
日本語化されてるドキュメントだとSystem.Refrection.Missing.Valueが多い。
System.Type.MissingのMSDNのリフレクション云々のくだりはVB前提で書かれていて、
VBであってもリフレクションを使う場合はOptionalにはType.Missingが必要になりますの意味。
結局同じものだからどちらでもいいのだろう。MSも混乱してるし。
0312デフォルトの名無しさん
2007/09/09(日) 21:30:53既存のバイナリファイルいじるのでなければ
直接XMLなファイルを生成するプログラムにしたほうが
COMでがんばるよりはるかに楽な気がしまつ
ExcelはCOMつかわないでCSVでがんばってる人も多いと勝手に妄想
0313デフォルトの名無しさん
2007/09/09(日) 21:36:00イベントとデリゲートについてよく分かりません。
デリゲートはインスタンス化したもののアドレスを入れるもの(?)
と認識しました。
イベントとデリゲートの関係がよくわからず、イベントがさっぱり分かりません。
どなたか簡単に教えていただけないでしょうか?
変なお願いと思いますが、どうしてもわからなくて。
どうやったらイベントのメソッドに飛んでいくのかが全然わからない
状況です
0314デフォルトの名無しさん
2007/09/09(日) 21:47:15イベントはデリゲートを利用してあるタイミングを通知してもらうための機構。
って言葉で言っても理解できないと思うけど。
・このインスタンスのこのメソッドを呼び出す手続きはこのデリゲートにある。
これさえあれば元のインスタンスもメソッドも知る必要はない。
てのがデリゲート(とそのデリゲートの実体)。
・このデリゲートを渡しておくから、こういう状況が発生したときに登録した手続きを呼んでくれ。
てのがイベント。
ますます分からんな。
0315デフォルトの名無しさん
2007/09/09(日) 21:54:560316デフォルトの名無しさん
2007/09/09(日) 22:03:54delegate void Foo();
↑これが class Foo{...} とかと同じ、型の「定義」。
イベントは型の「メンバー」の種類のひとつ。フィールドやメソッド、
プロパティと一緒。
event Foo Bar;
↑これが int Bar() {...} (この場合メソッド)とかと一緒でイベントメンバーの定義。
0317313
2007/09/09(日) 22:05:59さっそくありがとうございます。確かにまだまだわかりません。
質問させてください
例えばデリゲートA、オブジェクトB、オブジェクトCがあったとして、
オブジェクトB,CにデリゲートAを持たせるということですか?
なんかインターフェースと同じ感じがするんですが、見当違いのこと言ってますか?
>>これさえあれば元のインスタンスもメソッドも知る必要はない。
ということは、何かの手続き(一連の流れ)を実行するものがデリゲート?
ってことですか?
0318デフォルトの名無しさん
2007/09/09(日) 22:13:17Javaなんかだといちいち内部クラスでインターフェイスを実装したりしてたけど、
それが面倒だから言語に組み込んだだけ。
イベントはイベントハンドラを登録するメソッドと削除するメソッドを
一つにまとめたプロパティみたいなもの
0319313
2007/09/09(日) 22:19:07マルチキャストデリゲートですか?
ちょっとくぐってみます。ご指摘ありがとうございます。
>>316
classとintやstringが一緒ですか?
ちょっとこんがらがってきちゃいました。
classについてもう一度調べてみます
ありがとうございます
0320デフォルトの名無しさん
2007/09/09(日) 22:30:26struct Int32 (構造体型)
enum Keys (列挙型)
delegate EventHandler (デリゲート型)
上の二つは今作った言葉だから使わないでね
0321デフォルトの名無しさん
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でも出来る。
0322デフォルトの名無しさん
2007/09/09(日) 22:34:59これはねーだろ、折角>>316が解説してくれたのに
delegateとそのインスタンスはこういう場合きっちり言葉を区別しようや
0323313
2007/09/09(日) 22:35:29ただ私、ただいま頭がパンクしそうです。
一個ずつ整理していますので、レス遅れます。
すみません。
0324313
2007/09/09(日) 22:41:08そうなると、インターフェースとデリゲートは一緒ということ?
例えばどんな場合にインターフェースでどんな時にデリゲートを使うんでしょうか?
0325デフォルトの名無しさん
2007/09/09(日) 22:47:20デリゲートの使い方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;
0326デフォルトの名無しさん
2007/09/09(日) 22:57:52デリゲートの項目だけは何度復習しても理解不能なんだが
↑みてたら理解できそ・・・・・うにもないorz
0327デフォルトの名無しさん
2007/09/09(日) 22:59:13たとえばあるクラスにHogeという名前のイベントがあったら、イメージとしてはそのクラス内に
add_Hoge(EventHandler value)//valueをhogeに追加するメソッド
remove_Hoge(EventHandler value)//valueをhogeから削除するメソッド
EventHandler hoge //登録されたデリゲートを保持する実体(これ自身もデリゲート)
これらが生成されると考えるといいよ。
クラス外部からのデリゲートの実体へのアクセスを登録と削除のみに制限するのが目的。
実際、addとremoveの処理を完全に自分で定義してしまうこともできて
http://msdn2.microsoft.com/ja-jp/library/z4ka55h8(VS.80).aspx
プロパティにそっくりなのがわかると思う
0329デフォルトの名無しさん
2007/09/09(日) 23:00:12たぶん具象を知らずに抽象を知ろうとするからわからなくなるんだろうな。
とりあえず第一次接近としては、デリゲートは関数ポインタみたいなもの
だと考えればいいと思う。
つまり、メソッドのメモリ上の位置(アドレス)に関する情報を格納するための
データ型だと、とりあえずは思えばいいと思う。
デリゲート型の変数にはメソッドの位置情報が入っているわけだから、
当然その位置情報を利用してメソッドを呼び出すことも可能なはずだ。
イベントは、何らかの出来事(たとえばユーザーがボタンをクリックしたとき)に
シバかれるデリゲート型のフィールドみたいなものだと思えばいい。
だから「ユーザーがクリックしたときにシバかれる」デリゲートに対して
予めフォームの中の適当なメソッドの位置情報をぶち込んでおいてやれば、
ユーザーがボタンをクリックした時にそのメソッドが呼ばれるというわけだ。
まああくまで第一次接近だからあんまり真に受けてもダメだけど、
概念的な理解としてはこれでいいと思う。
0330313
2007/09/09(日) 23:15:26私も何度本を読んでみても理解できないのでここに書き込むことにしました。
お互いがんばりましょう。
>>327
これはイベントのことになるんでしょうか?
EventHandler hoge にはadd_Hoge(EventHandler value)で追加された
ものが入っているということでいいですか?
>>329
デリゲートはポインタのようなもので、そこに実行させたい処理を入れる(+=で
複数登録できるんですよね?)
そして、イベントが実行されたら、デリゲートのさすアドレスの処理(↑で登録したもの)
を実行するって感じでいいでしょうか?
0331デフォルトの名無しさん
2007/09/09(日) 23:30:57List<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();
}
コレクション全体に実行させたい処理を入れるとか、
使い道はいろいろだ
0332313
2007/09/09(日) 23:42:05イベントを登録するときに
delegate 戻り値の型 イベントハンドラの名前(パラメータリスト);
と宣言しますよね。このdelegateが曲者でした。
私の解釈ですが、
デリゲートは様々な処理をあるアドレスに入れておくもの。
イベントは何かされたとき(クリック等)にデリゲートに定義された
処理を行うこと。
というふうに理解しましたが、あってますか?
なんかちょっと違う気がしてきましたが。
0333デフォルトの名無しさん
2007/09/09(日) 23:58:37実際のところeventを無視してdelegateだけきっちり理解しておけば当面はそれでいいよ。
自分でGUIコントロール作ったりしない限りeventを自分で作ることはないから。
先にdelegateを完璧にしなはれ。
0334デフォルトの名無しさん
2007/09/10(月) 00:04:15じゃ駄目なのかな?
インスタンスメソッドとスタティックで微妙とかマルチキャストはとかあるけど、
その辺はおいおい理解していけばいいわけで、
まずは、デリゲートとは、なんらかのメソッドを指しているもの。
0335デフォルトの名無しさん
2007/09/10(月) 00:21:41そうじゃないよ。
だから関数ポインタのようなものだとまずは理解せよ、と言っているじゃないか。
「様々な処理をあるアドレスに入れておく」(これちなみに意味不明だよ)のではなく、
処理のコードが書かれているメモリ上の位置、すなわちアドレス「を」入れておくんだよ。
>>333
>自分でGUIコントロール作ったりしない限りeventを自分で作ることはないから。
これはおかしいというより、完全に認識違いだよ「w
イベントっていうのはGUIにまったく限らない。
典型的には何らかのデバイスの状態が変化したときとかね。
例えばCDドライブを抽象化したクラスがあるとして、
トレーが開かれたときにイベントでそれを通知する、というのは想像しやすいシナリオでしょ。
0336デフォルトの名無しさん
2007/09/10(月) 00:25:02インスタンスメソッドを登録した場合はメソッドのポインタ+インスタンスのポインタ
をデリゲートは持っている
デリゲートを実行すると、ポインタを辿り、そのインスタンスのそのメソッドを実行する
といった感じ
0337デフォルトの名無しさん
2007/09/10(月) 00:38:01うん、いやだから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){
//...
}
メソッドのパラメータにも。
0338333
2007/09/10(月) 01:39:06>これはおかしいというより、完全に認識違いだよ「w
すまん、確かに言うとおりだが、
>トレーが開かれたときにイベントでそれを通知する、というのは想像しやすいシナリオでしょ。
そんなクラスを>>332が作るというのは本当に想像しやすいかw
>>332が「CDドライブを抽象化したクラス」の必要を感じるころには多分イベントで困ることもなかろう。
0339デフォルトの名無しさん
2007/09/10(月) 02:03:24delegateだって+=も-=も出来るし、代入して入れ替えることも出来る
+=と-=だけに制限する意味がわからない
タスクトレイが開いた時の動作だって入れ替えたくなる時があると思うんだよな
0340デフォルトの名無しさん
2007/09/10(月) 02:12:03イベントを通知されるクラスが、他の通知されるクラスを意識しなくていい様にするためじゃね
=で上書きしたら他に通知されるクラスに上書きを通知しなくちゃいけなくなる
0341デフォルトの名無しさん
2007/09/10(月) 03:33:56>>320が理解できてればなんとなくわかると思う。
>>332補足
internal delegate void Foo();
これでFooと言うデータ型を作った、と考えればいいと思う。
つまり、戻り値がvoidで引数を取らないメソッドを代入できるデータ型。
Fooはデータ型なので、変数を定義するときに使用する
ただ、そもそもデータ型という単語の使い方が間違ってないかすごく不安。誰か教えてorz
int型はデータ型だけど、元をたどれば構造体ってことを考えれば、
C#におけるデータ型の意味は、定義されたもの全般・・・と考えてます
0342デフォルトの名無しさん
2007/09/10(月) 03:39:42つまり、戻り値がvoidで引数を取らないメソッドを代入できるデータ型。
↓
戻り値がvoidで引数を取らないメソッド(のアドレス)を代入できる変数、を作るデータ型。
0343デフォルトの名無しさん
2007/09/10(月) 03:47:26大部分がdelegateとラムダ式に置き換わると思うから
ここは理解しといて損は無いというか必須になっていくと思うよ
0344313
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と同じように型になるってことですね?
0345デフォルトの名無しさん
2007/09/10(月) 08:30:08まずはデリゲートの機能の物理的イメージを持つのが先決だと思う。
多分ここのほかの人が言ってるような「デリゲートは型でイベントはクラスの
メンバで〜」みたいな抽象的な話を聞いても、余計わからなくなるだけ。
>ポインタだからメモリ上のどこかにアドレスが割り当てられる。ということですよね。
>あとはこのアドレスから呼び出す処理をすれば、そのアドレスにある
>処理が実行されるってことでいいですか?
だから、たぶん変に誤解してるよ。
プログラムというのはメモリ上に置かれる、というのはOK?
だから関数(メソッド)というのも当然メモリ上の位置というものを持つはずだ。
関数ポインタという変数は、その関数のメモリ上の位置を格納するための変数だ。
もちろん「関数ポインタ」という変数自身もメモリ上の特定の位置に存在する
わけだが、それはとりあえずデリゲートを理解するためにはどうでもいい。
関数ポインタは関数がメモリ上のどこの位置に存在するかを「知っている」から、
それを利用すれば関数を呼び出すことができるでしょ?
以上のようなイメージを理解することが先決だと思うよ。
ただ、これはあくまでたとえ話であって正確じゃないことを理解しておくことも
一方で重要。
0346デフォルトの名無しさん
2007/09/10(月) 11:11:09double result = Math.Cos(1/4);
とした場合、result には 1.0 が入ってしまいます。
私としては 0.999990 がほしいのですが、勝手に四捨五入されてしまいます。
どうしたらよいのでしょうか。
0347デフォルトの名無しさん
2007/09/10(月) 11:16:370348デフォルトの名無しさん
2007/09/10(月) 11:23:23ありがとうございます。
これみても double は、0.99999 を扱えると思うのですが・・・
0349デフォルトの名無しさん
2007/09/10(月) 11:29:301/4がいくつか知ってるか。
0350デフォルトの名無しさん
2007/09/10(月) 11:33:28すいません間違えました。
double result = Math.Cos(1/30);
です。
0351デフォルトの名無しさん
2007/09/10(月) 11:34:29そうじゃなくて。
1/30 は整数/整数で答えは整数の 0 だろ
1.0/30 とかでやってみそ
0352デフォルトの名無しさん
2007/09/10(月) 11:36:300.999990が四捨五入されて1.0になってると思ってるのなら大間違い
0353デフォルトの名無しさん
2007/09/10(月) 11:40:20大間違いしてました!ありがとうございますm(__)m
0354デフォルトの名無しさん
2007/09/10(月) 12:37:40これはc#のルールの方がシンプルでむしろ初心者向きに感じるな。
0355313
2007/09/10(月) 12:40:30ありがとうございます。メモリ上に関数ポインタが割り当てられ、その関数ポインタにはメソッドのアドレスが格納している。
この辺りはOKです。(私の表現は下手ですが)
デリゲートは関数ポインタということでいいですよね?
初めて携帯から書くので見にくかったらすみません
0356デフォルトの名無しさん
2007/09/10(月) 12:46:03CもC++も、C#と同じだと思ったけど
0357デフォルトの名無しさん
2007/09/10(月) 13:09:48/ 商が実数になる割り算
¥商が整数になる割り算
0358デフォルトの名無しさん
2007/09/10(月) 13:51:20typedef void* Foo ≒ delegate void Foo
って覚えたらだめなの?
俺の場合C#が先だったから、関数ポインタは
delegate void Foo ≒ typedef void* Foo
って覚えたんだけど…
0359デフォルトの名無しさん
2007/09/10(月) 13:57:44少数なんて邪道だぜ
0360デフォルトの名無しさん
2007/09/10(月) 14:14:29なんか間違ってないか?
0361360
2007/09/10(月) 14:32:37715 :私事ですが名無しです: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
http://news21.2ch.net/test/read.cgi/news7/1189188763/
0363デフォルトの名無しさん
2007/09/10(月) 19:33:290364デフォルトの名無しさん
2007/09/10(月) 20:41:09スレチなんで適当に答えるが関数ポインタ間違ってるぞ
あとインスタンスメソッドの場合のポインタはもう一息いる
まあdelegateありがたがりやがれという話だ
0365デフォルトの名無しさん
2007/09/10(月) 22:38:020366313
2007/09/10(月) 22:43:33どのタイミングで使うかがいまいちピンときません。
あるデリゲートを個々のクラスで定義して、様々なメソッドから呼び出す
ため?ということでしょうか?
またバカな質問してる気がしますが。
0367デフォルトの名無しさん
2007/09/10(月) 22:44:27中心ってなんだろうねw
0368デフォルトの名無しさん
2007/09/10(月) 22:46:39ぴんと来ないなら使う必要なし。
必要になったら使え。
0369デフォルトの名無しさん
2007/09/10(月) 22:49:09いったいなんだろうねw
0370デフォルトの名無しさん
2007/09/10(月) 22:49:26とりあえずはイベントハンドラとしてだけ使っとけばいいだろ
0371デフォルトの名無しさん
2007/09/10(月) 22:59:18@ITの記事は読んだ?
http://www.atmarkit.co.jp/fdotnet/onepoint/onepoint03/onepoint03_01.html
あと、川俣のc#入門は?
http://www.atmarkit.co.jp/fdotnet/csharp_abc2/csabc2_013/cs2_013_01.html
とりあえずこれ読んでからだな。タダで読めるんだし。
0372313
2007/09/10(月) 23:22:10仕事で、外部の人が作ったものを私がUpdateすることになったんです。
C#使える人がこの会社にいないんで。。。
>>371
参考URLありがとうございます。
私はいつも下のHPを見ていました。
http://ufcpp.net/study/csharp/sp_delegate.html
http://www.kumei.ne.jp/c_lang/cs/cs_45.htm
教えていただいたHPで勉強して出直します。
ありがとうございました
0373デフォルトの名無しさん
2007/09/10(月) 23:36:230374デフォルトの名無しさん
2007/09/10(月) 23:37:140375デフォルトの名無しさん
2007/09/10(月) 23:42:53人物はアレだが書いてることは別におかしくないだろw
というか、読んでみると結構わかりやすくていい記事だぞ
0376デフォルトの名無しさん
2007/09/11(火) 00:56:19インテリセンスを効かせる方法ってありますか?
0377デフォルトの名無しさん
2007/09/11(火) 01:01:03それ自分も知りたかった
0378デフォルトの名無しさん
2007/09/11(火) 01:21:23class Hoge : IHage
のIHageにマウスのせるでてくるやつじゃなくて?
0379デフォルトの名無しさん
2007/09/11(火) 01:35:12メソッド名途中入力とかの線しか考えてなかったので目から鱗です。
これでちょっと楽になりそうです。ありがとうございました。
0380デフォルトの名無しさん
2007/09/11(火) 01:37:19俺からもありがとう
0381デフォルトの名無しさん
2007/09/11(火) 04:30:07親クラスのメソッドを上書きするとき、Javaでは常にオーバーライドですが、
C#ではnewによって新しいメソッドとして定義する方法と、
overrideによってオーバーライドする方法があるじゃないですか。
この2つのうち、newでやる方法の価値が分からなく、教えてもらいたいです。
ちなみに、実装時のnewとoverrideの違いは把握してます。
今の私の考えでは、全部overrideでいいのでは?と思うし、
むしろnewなど無い方がよいとさえ思っています。
0382デフォルトの名無しさん
2007/09/11(火) 05:24:51ではないかつ継承先のことを考えながらコード書くことのほうが少ない
かつvirtualメソッドのほうが高コストとかもろもろ
newがよく使われているのは経験上staticメソッドが重複する場合、
コンポーネントメンバの属性値の変更、COMインポートなインターフェイス、
内部的にはもうちょいあったかな
0383381
2007/09/11(火) 07:50:32>ベースクラス実装者が想定していないオーバーライドを許可すべき
>ではないかつ継承先のことを考えながらコード書くことのほうが少ない
でもそれって、virtualにしなければいいというだけの事ですよね。
オーバーライドされたくないなら、そのシグネチャのメソッドは
「子クラスでは実装禁止!」でいいじゃないですか?
何であえて、newとか使って再定義できるようにしてるのかが、
分からないんです。
ちなみに、何でnewを悪者扱いするかというと、例えば
クラスBはクラスAを継承してて、
さらに、AのhogeメソッドをBクラスがnewで書き換えてるとして、
--------------------
A a = new B();
a.hoge();
--------------------
この場合実行されるhoge()はAの実装の方ですよね?
それってつまり、親クラスの型に子クラスのインスタンスを代入するという事が
安全じゃないって事だと思います。メソッドの引数や戻り値に関しても同じで、
作ったインスタンスは、その型のままにしておけという事になります。
そうなると、引数や戻り値に親クラスを指定できなくなり、
汎用性を持たせられなくなってしまいます。
私がnewに否定的な理由はこれですね。
ちなみに、staticメソッドの場合はいいと思うんですよ、
staticはあくまでもその「型」にくっついているわけだし。
と、長く書いてしまいましたが、よろしくお願いします
もし、前提知識がそもそも間違っているとかありましたら、すいません。。
0384デフォルトの名無しさん
2007/09/11(火) 08:19:30あのね、そんな馬鹿でも分かる例あげる前に俺があげた例調べた?
BCLで標準的に使われているものや経験上必要だったものを挙げたんだが
聞く気がないんなら帰ってくれ
あとJavaやってたらしいから前段はvirtualがデフォじゃない説明だから
わかってるなら読み飛ばして。
0385デフォルトの名無しさん
2007/09/11(火) 08:24:58そんな能力あったらこんなスレで質問しねえよw
間違ってるか?
>>383
むしろAの型の変数に入っていれば安心してAとして扱えることを
保障するための仕組みじゃないの?
0386デフォルトの名無しさん
2007/09/11(火) 08:38:45なら〜ってなんですか?って聞けよ
こっちが挙げてみたら分かりきってる講釈たれてそれに反応なし、
同意だけ求めてるのが透けて見えるだけの確証バイアス野郎じゃねーか
0387デフォルトの名無しさん
2007/09/11(火) 08:46:18終了
0388デフォルトの名無しさん
2007/09/11(火) 09:04:39>この場合実行されるhoge()はAの実装の方ですよね?
それでいいんじゃん。わざわざAの参照で宣言してるんだから、欲しいのは
Aの規約に則った実装でしょ。なんでAとは無関係の実装であることを
newで明治したメソッドが派生型で定義できると困るの?
ちゅーかnewって、派生型で既に定義されているシグネチャが
あとから基底型で定義されてしまった場合に、派生型を前提とした
コードへの影響を最小限に抑えるための一時しのぎって印象なんだけど。
0389デフォルトの名無しさん
2007/09/11(火) 10:14:52インターフェイスの明示的実装というのもあるけど、それだとインターフェイスのメソッドの方が隠れちゃうから
どうしてもインターフェイスのメソッドの方を見せたいとき
そんな場合本当にあるのか知らんけどw
0391デフォルトの名無しさん
2007/09/11(火) 10:42:53この人は既に固定観念に捕らわれているし、聞く耳もたない
みたいだから何言っても無駄かと。
0392デフォルトの名無しさん
2007/09/11(火) 10:52:23お前こそちゃんと読め
0393381
2007/09/11(火) 11:22:02まだ、調べていませんが、私が知りたいのは用途ではなく、
存在意義だとか利用価値だとか、少し概念的な事だったんです。
それが伝わっていなかったようなので、>>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を使わざるを得ない。
という状況になり、メソッドの作成者の意図と違う使われ方をしてしまいます。
親クラスを後から修正した場合の影響を抑えるっていうのは、確かにそうですね。
親は、子がどれだけ存在していて、どんなメソッド定義してるかなんて知らないですもんね。
なるほど。。それはそうですね。
0394381
2007/09/11(火) 11:22:51でも、違うメソッドなら違うシグネチャであるべきなのでは?
逆に同じシグネチャのメソッドなら、オーバーライドされるべきなのでは?
と思ってしまいますw
>>391
私は387ではないですよw
たしかに、固定観念にとらわれているかもしれないです。
0395381
2007/09/11(火) 11:32:02>>389
でも、違うメソッドなら違うシグネチャであるべきなのでは?
逆に同じシグネチャのメソッドなら、オーバーライドされるべきなのでは?
と思ってしまいますw
>>391
私は387ではないですよw
たしかに、固定観念にとらわれているかもしれないです。
でも聞く耳を持ってないわけじゃなく、自分なりに納得のいく解答が得たいと思っているだけです。
おかしなことを言っていたら、そこを指摘してくれると助かりますw
0396デフォルトの名無しさん
2007/09/11(火) 11:32:41>でも仮にBがhogeをoverrideしてた場合は、Bのhogeになるわけですが、
>使う側はそのメソッドがnewなのかoverrideなのか判断でないし、
>使い分けもできません…
判断も使い分けもできる。そのために宣言にnewやoverrideをはっきり付けてるわけだし、
似た機能の、インターフェイスの明示的実装もあわせてMSDNに全部明記されてる。
0397デフォルトの名無しさん
2007/09/11(火) 12:16:51俺は初心者で勉強のつもりでこのスレ見てるけど、めっさ疲れるわ。
あと…自演してないだろうな?w
0398デフォルトの名無しさん
2007/09/11(火) 12:18:11BCLっつー模範的なライブラリで使用されてたりする手法や実際に
使われている手法を先に知らないで存在意義やら糞もあるのかよ。
0399385
2007/09/11(火) 12:24:03反論になってないと思うなあ。。
短いレスだからもう一度よく読みなおして欲しいよ。
個人的にはメソッドのシャドウの意義を知るには、
Winフォームのコントロールをいろいろカスタマイズしてみるのがいいと思う。
きっと、「そうかこういう場面で必要になるのか」ということが体感できると思う。
0400デフォルトの名無しさん
2007/09/11(火) 12:31:04>でも、違うメソッドなら違うシグネチャであるべきなのでは?
>逆に同じシグネチャのメソッドなら、オーバーライドされるべきなのでは?
同じ人が同時に開発してるならね。
この辺も読んでみるといいのでは?
ttp://d.hatena.ne.jp/siokoshou/20070901#2
ttp://d.hatena.ne.jp/siokoshou/20070903
0401デフォルトの名無しさん
2007/09/11(火) 12:57:25CでAのhogeをオーバーライドすることは不可能なの?
俺は381じゃないよ
0402381
2007/09/11(火) 12:59:28>判断も使い分けもできる。そのために宣言にnewやoverrideをはっきり付けてる
それは、呼び出される側のコードを見て判断しろということですか?
あと、一応MSDNのその辺の情報は目を押してるつもりです。
>>397
文章力のなさが問題ですね。申し訳ない…色んな事が未熟者の私です。
とりあえず、一番言いたいことは>>393で書いた>>388へのレスかなー
あと、自演などしてないですww
>>398
効果が分かっていて、その効果自体がいまいち納得できないので、
使い方云々の話ではないのと考えてます。
とはいっても、BCLとかは勉強の為に参考にしてみようとは思ってますが。
>>399
>むしろAの型の変数に入っていれば安心してAとして扱えることを保障する
というのに対して、「もしoverrideだったら、実行されるhogeはAの実装の方じゃなくなるから
保障はされてないじゃないですか。」と言ったつもりで、
それが反論になってると思いましたが。。
一応プログラムも、作ったりしてるんですが、今はまだ体感できてないですね。
その時を待つしかないのかな。。。
う〜ん、
メソッドの戻り値や引数を親クラス型で定義出来ないじゃん
っていうのが、本当に言いたいことなんですが。
なんか、伝わってなかったりしてるのかな
0403デフォルトの名無しさん
2007/09/11(火) 12:59:52男だったら1からつくれ
0404デフォルトの名無しさん
2007/09/11(火) 13:11:33>しかし、使用者としては、戻り値の型がAだから、Aのhogeを使わざるを得ない。
>という状況になり、メソッドの作成者の意図と違う使われ方をしてしまいます。
そのメソッドの作成者はAのhogeとは関係無いhogeを持つというBの規約を知っているはずでしょ。
それなのにAを返すのはAのhogeを使って欲しいからなんじゃないの?
ちゅーかnewの存在意義は>>388の下半分だけで考えてくれよ。
仮に、新規に派生した時に基底のメソッドと同じシグネチャをnewで宣言しちまうような
馬鹿が出てきたとしても、newを導入しないと回避できない問題なんだから。
0405デフォルトの名無しさん
2007/09/11(火) 13:19:37基底クラスのメソッドが呼ばれてもいいと考えてやってるんだから何の問題もない
0406デフォルトの名無しさん
2007/09/11(火) 13:58:27実際に使ってるものを使い方もしろうともせんでいきなり「いらないですよね!」
ってわけわかめなことのたまうから気にもとめてなかったが
0407381
2007/09/11(火) 13:59:11リンク先読みました。それと>>388から考えると、
newとoverrideの2つが存在する理由は、親クラスへの変更が後から入った場合でも、
既存のクラスへの影響を小さくする為って事なんでしょうね。
>>404
>そのメソッドの作成者はAのhogeとは関係無いhogeを持つというBの規約を知っているはずでしょ。
それは知らないという前提でした。
でも、そこまで意識して作るのがC#のコーディングスタイルってことなんですかね。
>それなのにAを返すのはAのhogeを使って欲しいからなんじゃないの?
どのメソッドを使って欲しいとか、そういうのは意識してなくて、
単純にB1とB2を両方扱えるからっていう理由で、Aにしたんです。
>ちゅーかnewの存在意義は
そこは理解できました。親の変更の影響を受けないためですね!
>>405
>基底クラスのメソッドが呼ばれてもいいと考えてやってる
えっ、そういうものですか?
呼んで欲しいから、実装してるんだと思いますが。。
0408デフォルトの名無しさん
2007/09/11(火) 14:29:47そればBのhogeと名前は同じだけど意味が違うものだろ
BのhogeはBのhogeとして使ってほしいから実装されたものであって、
勝手にAのhogeとして呼び出されるようになっちゃったら困る
0409デフォルトの名無しさん
2007/09/11(火) 14:32:39C++に隠蔽があるからサポートしてみましたじゃダメなのかな。
C++でデフォルトvirtualじゃなくて隠蔽なのは主にパフォーマンス上の理由だが、
.NETにそれがあるかどうかはわからん。
overrideに対してvirtualがあるのにnewに対してnewable(?)がないのは、
継承もとのクラスに対してなんら影響がないからだろう。
0410デフォルトの名無しさん
2007/09/11(火) 14:43:290411デフォルトの名無しさん
2007/09/11(火) 14:46:17裏技的キーワードだと思ってたんだけど、違うのか…
0412デフォルトの名無しさん
2007/09/11(火) 14:46:31まあICloneableを実装することはあまりないが、イメージとして。
0413デフォルトの名無しさん
2007/09/11(火) 14:59:09どうせ継承できないんだから無意味なんじゃないの?
0414デフォルトの名無しさん
2007/09/11(火) 15:41:13親クラスに同名のメソッドがあることを忘れて上書きしちゃうとバグの原因。
0415デフォルトの名無しさん
2007/09/11(火) 15:48:32トップレベルのクラスがClone()の中でMemberwiseClone()を
使ってくれてなければ隠蔽するしかないものな。
0416デフォルトの名無しさん
2007/09/11(火) 15:55:13便利だぞ
0417デフォルトの名無しさん
2007/09/11(火) 16:42:310418デフォルトの名無しさん
2007/09/11(火) 19:00:18返り値の型がね微妙なんだよ。返ってくる型は決まってるのにダウンキャストが必須というのはアホな実装だと思うんだよ。
インターフェースの明示実装と型指定のCloneを両方実装したら
そのクラスを継承した時返り値の型が違うCloneを実装できないわけでやはり微妙なんだよ。
そうなるとGenericsで何とかならんのかと思ったが何ともならなくて残念だったよ。
だからICloneableみたいな微妙なのはない方がいいよ。
0419デフォルトの名無しさん
2007/09/11(火) 19:06:40自由に(派生クラスのことを気にせず)メンバを追加することを可能にすることにある、
って意見は俺はまったく見当違いだと思うなあ。
それはただ、「そういう風にも使える」ってことに過ぎないでしょ。
第一そんな事態はめったにないし、シャドウは問題の完全な解決には全然ならないもん。
困らないのはコンパイラだけじゃんw
メインの用途は本来オーバーライドできないメンバへのアクセスにフックを入れることでしょ。
0420デフォルトの名無しさん
2007/09/11(火) 19:17:03>メインの用途は本来オーバーライドできないメンバへのアクセスにフックを入れることでしょ。
new使って本気でhookできると思ってるのか、それとも俺様定義のhookなのかどっち?
0421デフォルトの名無しさん
2007/09/11(火) 19:26:20たぶん君が「フック」の意味を俺様定義とうか、
変に狭義に理解してるだけだと思うけど。。
まあフックという言葉がお気に召さないのなら「フックを入れる」の部分を
「処理を割り込ませる」あるいは「処理をとっかえる」と読んでもらっていいよ。
0422デフォルトの名無しさん
2007/09/11(火) 19:57:30ごめん。
もしかして世間では下のようなのも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();
}
}
0423デフォルトの名無しさん
2007/09/11(火) 19:57:44そのような思想の元に
Dispose()をnewで置き換えてあったクラスを見た。
Dispose(bool)もなにやら別の実装があった。
IDisposable.Dispose()も明示実装されていたがそれも実装が違っていた。
それが継承されてまたDispose()がnewで…
変なことやり出すと害があるだけでまともに動かないものになるだけだぞ。
0424デフォルトの名無しさん
2007/09/11(火) 20:39:08逆でしょ。バージョン管理がnewの主目的であって、「そういう風にも使える」ように
見えてしまうのは任意のメソッド置換の方。
そもそもC++では無言で隠されてしまうところをなんでわざわざコンパイラが警告出して
newで潰す必要があるのか考えてみてよ。
それ以前にC#において「オーバーライドできないメソッドにフックを入れる」の
意味が全然わからん。
0425デフォルトの名無しさん
2007/09/11(火) 20:57:14それ「も」フックの一種でしょ。
それ「が」フックとは言わないけど。
>>423
思考が倒錯しとるよ。
そもそも「害がある」と予想されるからオーバーライド禁止してるわけ。
それを承知でやるのがシャドウだよ。
0426デフォルトの名無しさん
2007/09/11(火) 21:16:11HashtableのキーにnewでGetHashCodeとEqualsを置き換えたクラスを使ったら
間違いなくobjectのGetHashCodeが呼ばれる。newで置き換えた方は呼ばれることはない。
だけど、そういうクラスを実装した人はnewで置き換えたメソッドが呼ばれることを期待してバグだって騒ぐんだと思うよ。
newでの隠蔽はJavaでは避ける手段がなかった基底クラスがバージョンが上がってメソッド名がかぶったときの変更の影響を
なんとかするための必要悪なものなんで普段は使うべきじゃない。
0427デフォルトの名無しさん
2007/09/11(火) 21:23:02SafeHandleクラスを継承しようと思っているんですが、
ReleaseHandleとIsInvalidをオーバーライドするだけでいいんでしょうか
(実際にはCreateToolhelp32Snapshotでプロセスのスナップショットを得たいので、
CriticalHandleMinusOneIsInvalidから継承したハンドル管理クラスを作る)
具体例的に解説しているサイト等あったら教えてください。
MSDNのサンプルには
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
なんて属性もでてきたりするんですが、意味がわからなくて・・・
0428デフォルトの名無しさん
2007/09/11(火) 22:12:130429デフォルトの名無しさん
2007/09/11(火) 22:32:32既に基本的な用語と思われるフックもシャドウもわかってなくて今必死に読んでる始末。
0430デフォルトの名無しさん
2007/09/11(火) 22:38:270431427
2007/09/11(火) 22:56:24相談室で聞いてきます・・・
0432429
2007/09/11(火) 23:09:07フックに関しては・・・とりあえずいじくっちゃいけなげなイベント処理を強引に差し替えるもの?
>>420を察するに本来はオーバーライドとか隠蔽とかイベント差し替えとか全部さすっぽいけど
>>427の内容はまだ当分自分には縁がなさそうだ・・・
あと手元の入門書だと隠蔽newの使い道は、
既に完成したプログラムを改造・拡張するときに、
そのプログラムにあったの汎化クラスを継承する際、virtual指定されてないメソッドを上書きしたい時。
と書いてあったけどこれじゃだめなん?
0433デフォルトの名無しさん
2007/09/11(火) 23:31:02文字通り隠蔽の意味だけど。
ローカル変数がフィールドをシャドウする、みたいに普通に言うと思うんだけど。
0434デフォルトの名無しさん
2007/09/11(火) 23:47:41どこぞのコンパイル時メタプログラミングじゃあるまいし、それがC#でなんの役に立つのかしら。
それができるようになっちゃうからnewが必要悪と言われる所以だと思うんだけど。
その本のタイトルぷりーず。
0435デフォルトの名無しさん
2007/09/11(火) 23:51:00その入門書に書いてある文章からはしょったかして意味が変わってる気がする。
基底クラスは他者の作成したライブラリ、サブクラスを自分が作成したプログラムで
基底クラスがバージョンアップに伴ってメソッドが増えて
自分の作成したサブクラスに基底クラスと同じ名前のメソッドが発生したときに
メソッド名を変更するのは影響範囲がでかい時に変更の影響を小さくするためにnewで隠蔽を使う
みたいな感じに書いてなかったか?
0436デフォルトの名無しさん
2007/09/11(火) 23:55:51当たり前じゃん。
外人さんが書いた本だとたいていそういうことが書いてあるよね。
でもそういうのは「アカデミックな」話題としては興味深いし面白いとも思うが、
そんな実用性がゼロに近い用途が主目的なはずがないだろう。
0437デフォルトの名無しさん
2007/09/12(水) 00:08:53ベースクラスとして実行した時と動作が変わったら混乱の元にしかならない
そんなんnewしなくても名前を変えればいいだけの話だろう
戻り値の型を変えたいときなんてのはnewしたメソッドもoverrideしたメソッドも
全く同じ動作をするけど戻り値の型がより正確になってキャストが不要になるというだけの話だし
それ以外でnewを使っていいのはベースクラスが勝手にメンバ追加して名前がかぶっちゃった時だけ
というか継承自体するべきじゃない
0438デフォルトの名無しさん
2007/09/12(水) 00:19:45言わんとしていることはよく分かるのでちょっと指摘しておくと
>virtual指定されてないメソッドを上書きしちゃダメに決まってるだろ
は
>戻り値の型を変えたいときなんてのはnewしたメソッドもoverrideしたメソッドも
>全く同じ動作をするけど戻り値の型がより正確になってキャストが不要になるというだけの話だし
の引数版としてあり得るかな。
Genericsが無かった時代は基底クラスが object get/set なメソッドになりがちで
派生クラスのメソッドやインデクサをtypedにするには隠蔽が結構便利だった。
ただ、その用途は Generics の登場によって激減してるので、
最近ではバージョン管理の方に魅力を見いだす人が増えてるとしても
そこまで不思議じゃないのかもしれん。
言わんとしていることはよく分かるのであんまり気にしないでくれ。
0440デフォルトの名無しさん
2007/09/12(水) 00:28:16引数の型が違うならnewできないんじゃねえの
というかoverrideできないものをnewで上書きしたら動作が変わるだろ
0441440
2007/09/12(水) 00:29:000442デフォルトの名無しさん
2007/09/12(水) 13:54:33ファイルの末尾に移動する、見たいな意味でいいんですよね?
0443デフォルトの名無しさん
2007/09/12(水) 14:32:530444デフォルトの名無しさん
2007/09/12(水) 15:31:430445デフォルトの名無しさん
2007/09/12(水) 15:47:060446デフォルトの名無しさん
2007/09/12(水) 16:38:58P/Invoke で構造体を取得するのですが、この構造体のメンバは int と、さらに構造体が配列で含まれています。
今のところ、この構造体の int は取得できているのですが、配列に格納されている構造体が取得できていません。
P/Invoke で、構造体中に含まれた構造体の配列を取得することは可能なのでしょうか?
0447デフォルトの名無しさん
2007/09/12(水) 17:01:080448デフォルトの名無しさん
2007/09/12(水) 17:14:08>>444のケースなら
textBox1.Text[ n * 2 + 1 ]
みたいにすればよかろ。
0449デフォルトの名無しさん
2007/09/12(水) 17:59:55多分無理。
方法があったら教えて欲しい。
byte[]で受け取ってそれをfixedしてサイズ分1個ずつMarshal.PtrToStructureで取得してくとかでできるがあんまりスマートじゃない。
0450デフォルトの名無しさん
2007/09/12(水) 18:09:03やはりそうですか。
SDK 2.0 のサンプルに構造体を取得したり、構造体の配列を取得したりはあったのですが
さらに複雑なものはありませんでした。
スマートじゃないですが byte[] で受け取っていく方法もありますね。
この方法を試されたかたはいらっしゃいますか?
0451デフォルトの名無しさん
2007/09/12(水) 18:23:14複雑なP/InvokeはC++/CLIでラップするのも一手。
0452デフォルトの名無しさん
2007/09/12(水) 18:33:080453デフォルトの名無しさん
2007/09/12(水) 18:38:360454デフォルトの名無しさん
2007/09/12(水) 18:48:38以下のコードを書き、ファイルを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;
};
}
0455デフォルトの名無しさん
2007/09/12(水) 18:55:57今外出先なので検証できんのですが……
構造体配列の各要素の先頭アドレスを計算して、各々に対してMarshal.PtrToStructure()を使えば取得できるかもしれん。
0456デフォルトの名無しさん
2007/09/12(水) 18:56:57DragEnterの度にイベントハンドラが増えてるからじゃないのか
0457デフォルトの名無しさん
2007/09/12(水) 18:59:06毎回countを宣言&初期化しなおしてるじゃねえか。
0458デフォルトの名無しさん
2007/09/12(水) 18:59:12どう考えても普通に可能だと思うけど。。
そんな程度のこと何度もやってるぞ。
MSDNライブラリにサンプル書いてあるじゃないか。
まあ、その構造体(および構造体の中の構造体)のシグネチャが判らないと
断言はできないけど。
0459454
2007/09/12(水) 19:29:48すいません。いまいち意味が分かってないです。
DragEnterのスコープから外れるとDragDropイベントハンドラも初期化されると思うのですが。
ですが、毎回メッセージボックスが増えていくと言うことはそうじゃないと。
だとすると、それを回避して通常のD&Dの動作をさすのに
何かいい方法はあるのでしょうか?
0460デフォルトの名無しさん
2007/09/12(水) 19:35:38>DragEnterのスコープから外れるとDragDropイベントハンドラも初期化されると思うのですが。
されません
0461デフォルトの名無しさん
2007/09/12(水) 19:36:51変なこと考えずに普通にDragDropにイベントハンドラを追加すればいいだけだろ
コンストラクタかデザイナで
0462デフォルトの名無しさん
2007/09/12(水) 19:43:58簡単に記述できるのがいいと思ってたのに
嫌な仕様ですね
0463デフォルトの名無しさん
2007/09/12(水) 19:55:18君は「スコープ」という言葉の意味をよく理解していないね。
DragDropイベントハンドラが毎回初期化されないのは、スコープとは別の問題。
textBox1はDragDropイベントハンドラの外で宣言されたものであって、イベントハンドラとは無関係に存在している。だから、textBox1に加えた変更はイベントハンドラに入ろうが抜けようが維持される。
countが上がっていかないのはスコープの問題。
countはDragDropイベントハンドラの中で宣言されているから、イベントハンドラを抜けると一旦破棄され、次にイベントハンドラに入った時、改めて確保される。 一回ごとに、中身は別物になる。
0464463
2007/09/12(水) 20:00:43そりゃ君が匿名メソッドの使い方を間違えてるだけだ。
簡単に記述できることと、それが君の都合どおりに動くことは、別の問題だろ。
偉そうになってすまん。
0465デフォルトの名無しさん
2007/09/12(水) 20:53:50コンボボックスのDrawModeをOwnerDrawFixedにし、
(プロパティ?のほうで)コンボボックスにデータバインドで
アイテムを追加し、DrawItemイベントで特定のアイテムだけ
ForeColorを変えようとしているのですが
バインドされたアイテムのテキストがすべてSystem.Data.DataRowViewに
なってしまいます。
バインドを使わずロードイベントでアイテムをAddした場合は
正しくテキストが表示されます。
データバインドを使用してオーナードローでコンボボックスの
アイテムのテキストを正しく表示することは可能でしょうか?
0466デフォルトの名無しさん
2007/09/12(水) 21:02:04君が書いたコードのはずだと思うんだが。。
〜になってしまいます、ってお前さんが自分で書いたコードのバグなだけちゃうんかい?
ちなみに、そんなの普通に簡単に可能なはずだよ。
BackColorをアイテムごとに個別にしようと思うと意外と面倒だったりするけど。
0467デフォルトの名無しさん
2007/09/12(水) 21:15:130468313
2007/09/12(水) 21:51:30以前デリゲートについて色々聞いていた者です。
その節は色々教えていただきありがとうございました。
371さんに教えてもらったHPを見てきました。
難しくて、まだ理解がいま一つのところもあるのですが。
ふと思ったんですが、デリゲートの非同期処理を使えば、
マルチスレッドにする必要はなくなる、というイメージは正しいでしょうか?
0469デフォルトの名無しさん
2007/09/12(水) 21:55:53デリゲートの非同期処理=マルチスレッド(スレッドプール)
0470デフォルトの名無しさん
2007/09/12(水) 22:01:14> マルチスレッドにする必要はなくなる
まあ、的を大きく外してはいないと思う。
デリゲートの非同期処理を使ってもマルチスレッドにはなるんだけど、スレッドに関するややこしい処理は隠蔽される、ってこと。
0471313
2007/09/12(水) 22:18:16マルチスレッドとデリゲートは=なんですね。
以前、何も分からないまま、HPの通り
Thread thread = new Thread
のようなことをして、マルチスレッドを使ったことがあったので、
違うものだと思ってました。
ありがとうございます。
0472デフォルトの名無しさん
2007/09/12(水) 22:20:44非同期呼び出し機能は単なるオマケ
0473デフォルトの名無しさん
2007/09/12(水) 22:23:420474デフォルトの名無しさん
2007/09/12(水) 22:31:43今外なんで正確なコードは書けないが
fixedでポインタにしてIntPtrのコンストラクタに渡してMarshal.PtrToStructureを呼ぶ。
後は構造体のサイズ分ずつポインタをずらして配列数分処理するだけ。
>458
構造体のメンバに構造体の配列があるサンプルはないだろ。
あるならurlを挙げてくれ。
0475313
2007/09/12(水) 22:31:48ご指摘ありがとうございます。
おまけに目を取られてしまって。
教えてください。
デリゲートって何で使うのか?
これがいつまでたっても分かりません。
どこかで「同じような処理をするのだけど、少しだけ処理が違う時がある。
その時に使うのがデリゲートです」みたいなことを読みました。
こういうときに使うんですか?
いろいろあると思うんですが、代表的なもの、よく使われる使い方を
教えてください。
お願いします。
0476デフォルトの名無しさん
2007/09/12(水) 22:36:25その時に使うのがデリゲートです」みたいなことを読みました。
なにこれw
0477デフォルトの名無しさん
2007/09/12(水) 22:39:21> 構造体のメンバに構造体の配列があるサンプルはないだろ。
意外になかった。
というか、構造体配列が固定長かポインタなのかでもまた別になるんで、それを抜きに話し進めてもな。
構造体内の固定長配列は.NET2.0からのサポートだったっけ、確か。
>>475
List<T>.Sort とか。
Array.Find<T> とか。
Regex.Replace とか。
0478デフォルトの名無しさん
2007/09/12(水) 22:40:09ゆとり乙
実行するメソッドを変数のように変えられるんだぜ?
0479465
2007/09/12(水) 22:44:15では無理だったけど
e.Graphics.DrawString(comboBox1.GetItemText(comboBox1.Items[e.Index]), font, solidBrush, e.Bounds.X, e.Bounds.Y);
に変更したら正しく取得できました。
テラサンクス!
0480313
2007/09/12(水) 22:46:10なんか分かりそうで分からない、もう少しで答えがでそうって
感じなんですが・・・
パンクしそうなので、もう少し頭を冷やして考えてみます。
ヒント、ありがとうございます。
(答えなのかも?)
0481デフォルトの名無しさん
2007/09/12(水) 22:47:08ごめんマンマのサンプルは見当たらないね。
でも構造体配列のフィールドに普通にMarshalAs属性でByValArray指定するだけで
問題ないと思うんだけど。
0482デフォルトの名無しさん
2007/09/12(水) 22:49:12ポインタだったらIntPtrで受け取るから配列だと思ってたよ。
.NET2.0では対応してたんだ。普段1.1しか使ってないから知らなかったよ。
サンプルは1.1の時の名残でないんではと思う。
0483デフォルトの名無しさん
2007/09/12(水) 23:16:24超大づかみに説明するとだな。
メソッドそのものを代入できる変数がデリゲート。
その機能を利用して、何かが起きた時に呼んでほしいメソッドを代入しておけるのがイベント。
0484デフォルトの名無しさん
2007/09/12(水) 23:33:42お前もう最初の方で教えてもらったこと忘れてるだろ。
そんなんじゃどこまでいってもループだよ。
一回じっくりと消化してみろ。
0485デフォルトの名無しさん
2007/09/13(木) 02:44:33・予め基本クラスのメソッドにprotectedなイベントを仕込んで、メソッド処理を<追加>できるようにする。(差し替えではない)
・後で追加する機能があるかもしれないので、とりあえずイベントを仕込んでおく。
・任意の複数のメソッドを、一度の命令で処理したいとき。
>>483
え、イベント発生とかイベント受け取りとか言うし、デリゲートが実際に使用される時のメッセージのことじゃないの?
0486デフォルトの名無しさん
2007/09/13(木) 02:58:250487デフォルトの名無しさん
2007/09/13(木) 03:23:40interfaceを実装させたりしていたところなんかを
全部delegateにしたらいい
いまはあまりメリットを享受できないかもしれないけど
C# 3.0になってラムダ式を使えるようになれば
interfaceなんかと比べて五倍ぐらいシンプルで読みやすくなるし、
書きやすさも段違いになる
0488デフォルトの名無しさん
2007/09/13(木) 03:30:56delegate=非同期も可能なchainパターン
と認識してるけど間違い?
0489デフォルトの名無しさん
2007/09/13(木) 03:35:450490デフォルトの名無しさん
2007/09/13(木) 04:00:20関数を渡したり保持したりするもの
chainも非同期実行も出来るというだけで
0491デフォルトの名無しさん
2007/09/13(木) 08:45:35非同期時にはChainできないぜぇ
0492デフォルトの名無しさん
2007/09/13(木) 10:50:59その際に、1行1行にヘッダーをつけれるようにしたいのですが可能ですか?
0493デフォルトの名無しさん
2007/09/13(木) 11:58:000494デフォルトの名無しさん
2007/09/13(木) 12:34:56微妙に便利そうに見えるのに.MSのクラスライブラリ内でもほとんど使われてないみたいだね
インデクサが付いてないのは濫用するなという意味なのかな
0495デフォルトの名無しさん
2007/09/13(木) 13:25:25>fixedでポインタにして
ってわざわざunsafeで括ってまでfixed使った方がいいの?
GCHandle.AllocしてMarshal.UnsafeAddrOfPinnedArrayElementのが
unsafeで括る必要なくていい様な気がするんだけど
0496デフォルトの名無しさん
2007/09/13(木) 15:04:05GCHandleだと配列の2つ目以降の構造体を取得するときに
サイズ分IntPtrの位置をずらしたりできないからfixedでやったんだけど
実はできたのかな?
0497デフォルトの名無しさん
2007/09/13(木) 15:13:50多分出来ないわ。
位置ずらすの忘れてた orz
でもなんかunsafeって精神衛生上あんましよろしくない気がする
0498デフォルトの名無しさん
2007/09/13(木) 16:00:060499デフォルトの名無しさん
2007/09/13(木) 17:02:190500デフォルトの名無しさん
2007/09/13(木) 17:16:13Microsoft.VisualBasic.Strings.StrConv("ABCD01234", VbStrConv.Narrow, 0)
でいけるよ。
0501デフォルトの名無しさん
2007/09/13(木) 17:28:00IDictionary<char, char> に全部突っ込んで何とかするべきなのか、
あるいはもっと楽な方法があるのか、そういうのを知りたいです。
0502デフォルトの名無しさん
2007/09/13(木) 17:49:450503デフォルトの名無しさん
2007/09/13(木) 17:59:20どこが笑いどころなのか分からん
0504デフォルトの名無しさん
2007/09/13(木) 18:08:49といったことじゃないか
0505デフォルトの名無しさん
2007/09/13(木) 18:37:100506デフォルトの名無しさん
2007/09/13(木) 18:50:17面接にいったとこのオヤジが
うちはみんな優秀でVisualBasicなんだぜ!って自慢してるのみて
馬鹿じゃねーのって思ったが
0507デフォルトの名無しさん
2007/09/13(木) 19:21:46そんなあほな方法考えながらなにが微妙なんだか。
まあ、あほといえばあほだけど
別にディクショナリに突っ込んどいてもいいんじゃない?
そんなことするくらいならもうVBの機能使っちゃうけどね。
0508デフォルトの名無しさん
2007/09/13(木) 19:53:430509デフォルトの名無しさん
2007/09/13(木) 20:05:07何を使うんだったか思い出せない
0510デフォルトの名無しさん
2007/09/13(木) 20:16:32輩なんでしょうな。
0511デフォルトの名無しさん
2007/09/13(木) 20:26:080512デフォルトの名無しさん
2007/09/13(木) 20:28:54VBを使う側はショボイ。
0513デフォルトの名無しさん
2007/09/13(木) 20:28:55501ではないが予想外な変換を勝手に丁寧にやってくれることがあってVBのメソッドはちょっとと思うことはある。
なんか丁寧にやってくれるパターンがあるおかげかいまいち速度が速くないので呼び出し回数が多い場面では使いたくない。
そんなんで、VBのメソッドを利用して実装してたら最初はあまり呼ばれないつもりが気づいたらいろんなところから呼ばれててパフォーマンスが気になって自前で実装し直そうとしたとき
予想外なよけいなお世話の変換もされててそういうのに依存した処理がそこら中にいたりして苦労するので
最初から必要最小限の変換処理をするのをVB以外ので実装されてるのを探したくなる。
0514デフォルトの名無しさん
2007/09/13(木) 20:54:34半角とマッピングするDictionaryを自作するのが一番いいんじゃない
0515デフォルトの名無しさん
2007/09/13(木) 21:08:16そこは誰も難しいと思ってないよw
置換というのは置換の前に置換対象を抽出する必要があるわけだが、
それ考えてるか?
0516デフォルトの名無しさん
2007/09/13(木) 21:53:19ゆとり世代ってすごいなあw
0517デフォルトの名無しさん
2007/09/13(木) 21:53:33構造体とクラスの使い分けはどういったときにすれば有効でしょうか?
データメンバが少なければ
値型なので構造体の方が生成処理・使用処理が早い(時もある)見たいな事はかかれているのですが。
0518デフォルトの名無しさん
2007/09/13(木) 21:55:20MSDNのどこかに使い分けのガイドラインがあったはずだから、探してみてくれ
0519デフォルトの名無しさん
2007/09/13(木) 22:01:480520デフォルトの名無しさん
2007/09/13(木) 22:02:16いろいろと面倒だから素直にクラスにしとけ。
小さいのを大量につくるときは構造体。
あとつまらないものも構造体。
0521デフォルトの名無しさん
2007/09/13(木) 22:11:29趣味か宿題だからいいんじゃね?
0522デフォルトの名無しさん
2007/09/13(木) 22:23:27配列使うのか
まあこの二択だろ
0523デフォルトの名無しさん
2007/09/13(木) 22:27:510524デフォルトの名無しさん
2007/09/13(木) 22:31:09高校生?
0525デフォルトの名無しさん
2007/09/13(木) 22:32:58参考ついでにコピーでも。
・プリミティブ型 (整数、倍精度浮動小数点数など) に似た単一の値を論理的に表す。
・インスタンスのサイズが 16 バイト未満である。
・変更できない。
・頻繁にボックス化する必要がない。
この全てに当てはまれば構造体の方がほぼパフォーマンスがいいようです。
ただ、どういうときにボックス化を行ってるかわからないです。
interfaceによる多態性や、List<>の要素に変数を代入・順番に使用、とかはボックス化は行ってるのでしょうか?
0526デフォルトの名無しさん
2007/09/13(木) 22:43:59インターフェイスへのキャストはボックス化を伴う。
List<int>にintを入れるときにはボックス化は行われない。
0527デフォルトの名無しさん
2007/09/13(木) 22:52:03{
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();
}
0528デフォルトの名無しさん
2007/09/13(木) 22:54:38...
char hankakuku = dict[zenkaku];
こうか、
char[] array = new char[char.MaxValue];
...
char hankaku = array[(int)zenkaku];
こうだ。これ以外の実装はまずない。
怪しい処理するVBの関数使うより
処理内容が明らかなほうがいいだろ
0529デフォルトの名無しさん
2007/09/13(木) 22:55:40ありがとうございます、やっぱりそうですか。
多態性に関する記事を漁ってたら、どう考えても参照型でなければ実現できそうにない感じです。
List<>のほうも、インターフェイスが関わってくると動きが少し変わってくるようです。
0530デフォルトの名無しさん
2007/09/13(木) 22:58:03正気ですか?
0531デフォルトの名無しさん
2007/09/13(木) 23:00:05正気も何も最速の実装じゃん
0532デフォルトの名無しさん
2007/09/13(木) 23:02:230533デフォルトの名無しさん
2007/09/13(木) 23:04:51自由度低いからよほどピーキーな所じゃなきゃやらないけど
0534531
2007/09/13(木) 23:05:15たかが13kbyteのテーブルだぞ
0535531
2007/09/13(木) 23:06:500536デフォルトの名無しさん
2007/09/13(木) 23:10:130537デフォルトの名無しさん
2007/09/13(木) 23:12:200538デフォルトの名無しさん
2007/09/13(木) 23:12:290539531
2007/09/13(木) 23:12:32普通はDictionaryで十分だと思うけど
0540デフォルトの名無しさん
2007/09/13(木) 23:12:560541531
2007/09/13(木) 23:23:340542デフォルトの名無しさん
2007/09/13(木) 23:27:19{
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();
}
これで十分だろ。
0543531
2007/09/13(木) 23:35:18案外シンプルだな
0544デフォルトの名無しさん
2007/09/13(木) 23:35:58m9(^Д^)プギャー
0545デフォルトの名無しさん
2007/09/13(木) 23:57:49>...
>char hankakuku = dict[zenkaku];
>こうか、
>
>char[] array = new char[char.MaxValue];
>...
>char hankaku = array[(int)zenkaku];
>こうだ。これ以外の実装はまずない。
わらかすな。
0546デフォルトの名無しさん
2007/09/13(木) 23:58:51>...
>char hankakuku = dict[zenkaku];
ありえんわ
0547531
2007/09/14(金) 01:22:390548デフォルトの名無しさん
2007/09/14(金) 01:50:540549デフォルトの名無しさん
2007/09/14(金) 02:21:37もっとコードに美を求めようぜ
0550デフォルトの名無しさん
2007/09/14(金) 02:44:51if文より君に気持ち悪さ感じてる
0551デフォルトの名無しさん
2007/09/14(金) 02:53:55ifどころちゃうわw
0552デフォルトの名無しさん
2007/09/14(金) 08:30:580553デフォルトの名無しさん
2007/09/14(金) 08:41:560554デフォルトの名無しさん
2007/09/14(金) 08:55:340555デフォルトの名無しさん
2007/09/14(金) 09:03:23みなさまお返事をいろいろとありがとうございました。結局、構造体をすべてフラットにするラッパを
同僚に作ってもらいました。
ところで SWIG という便利なものがあるらしいのですが、どなたか試した型いらっしゃいますか?
0556デフォルトの名無しさん
2007/09/14(金) 12:18:340557デフォルトの名無しさん
2007/09/14(金) 12:53:55>...
>char hankakuku = dict[zenkaku];
これってなんかまずいんですが?
0558デフォルトの名無しさん
2007/09/14(金) 13:23:57ふむふむ
何がどのようにまずいんですか?
0560デフォルトの名無しさん
2007/09/14(金) 14:32:28ディクショナリの意味全くなし。
0561デフォルトの名無しさん
2007/09/14(金) 14:32:35>>557は富豪的すぎるってことですね。
納得しました。ありがとうございます。
0562531
2007/09/14(金) 18:07:12事前にテーブル用意すれば判定6回は全部消せるんだ
しかしこれだけ規則がシンプルなら毎回判定しても別に問題はない
だが判定がこの五倍もあったらだいたい誰もが気持ち悪がって
事前にテーブル用意するだろう
じゃあどこからテーブルにして、どこまでなら毎回判定するのか
そこの基準があいまいになる
全部をテーブルでやれば、自分のコードを統一された規則で書くことが出来る
仕様変更があって判定の規則が増えて、テーブルにするはめになっても、
「このぐちゃぐちゃのif文をテーブルに落とさないと、うわー」
ということにならなくて済む
>>560
Dictionaryなのに全部使うわけないだろ
それなら配列使うわ
0563デフォルトの名無しさん
2007/09/14(金) 18:10:18普通はジェネレータを使います
0565デフォルトの名無しさん
2007/09/14(金) 18:22:56中で存分に気持ち悪い判定すれば
0567デフォルトの名無しさん
2007/09/14(金) 19:03:20だったらディクショナリにインデクサでアクセスしたらだめだろ。
自分でそういう「コード例」書いといて何言ってやがる。
0568デフォルトの名無しさん
2007/09/14(金) 19:10:01後々に備えてという考え方自体は否定しないが、
今回のはちょっとオーバースペックだ。
だいたいテーブル埋める時点で同じような泥臭い処理が入るだろ、
まあ工夫はいくらでもできるけども。
0569デフォルトの名無しさん
2007/09/14(金) 19:12:530571デフォルトの名無しさん
2007/09/14(金) 20:03:22クラス呼び出しだけでも全レジスタスタックするんだぜ
0572デフォルトの名無しさん
2007/09/14(金) 20:45:330573デフォルトの名無しさん
2007/09/14(金) 20:46:16けど結局、無駄に switch を使うことにしました。
0574デフォルトの名無しさん
2007/09/14(金) 20:58:44どうしてもインターフェイス経由になるため、
衝突が一切発生しなくても結構なコストになる。
それにその他諸々の処理を合わせると、
愚直な判定に比べてかなり負荷がかかる。
それでもまあそれほどたいした問題にはならないとは思うが。
0575デフォルトの名無しさん
2007/09/14(金) 21:05:04IF文とか単純なやつならILにコンパイルしたとき素直に展開されるだけだが
Dictionaryなんかを使えば..net Framework内のプログラムをコールする形になるだろ
そのコールする処理だけでIF文6回を超えるメモリーアクセスが発生するんだよ
もし配列に全部展開する形ならIf文6回以下のコストで実行できる可能性はあるけど
(処理回数と前処理の量次第)Dictionaryを使った時点で駄目だね
0576デフォルトの名無しさん
2007/09/14(金) 21:11:350577デフォルトの名無しさん
2007/09/14(金) 21:16:59速度と可読性を考えたら一番バランスがいいと思う
0578デフォルトの名無しさん
2007/09/14(金) 21:17:130579デフォルトの名無しさん
2007/09/14(金) 21:20:29本来 if がいるはず。
それを配列で誤魔化しているだけだろ?
0580デフォルトの名無しさん
2007/09/14(金) 21:20:550581デフォルトの名無しさん
2007/09/14(金) 21:23:410583デフォルトの名無しさん
2007/09/14(金) 21:37:440584531
2007/09/14(金) 21:45:19別に俺の身分を明かす気はないが、お前こそ
事前にテーブルを用意する発想もなければ
インデックスを変換に使うテクニックも知らない
ifを書き散らすことしかできないVBドカタじゃないのか
0585デフォルトの名無しさん
2007/09/14(金) 21:45:580586デフォルトの名無しさん
2007/09/14(金) 21:46:18516もあんまりあおるな
0587デフォルトの名無しさん
2007/09/14(金) 22:02:12>事前にテーブルを用意する発想もなければ
>インデックスを変換に使うテクニックも知らない
知らないわけないだろ。
こっちはz80から20年以上コードかいてるからな。
0588デフォルトの名無しさん
2007/09/14(金) 22:08:550589デフォルトの名無しさん
2007/09/14(金) 22:10:11できないつーの
0590516
2007/09/14(金) 22:20:58Dictionary使ったら速度は10分の1程度になるよ!
でもそんなのかんけいね〜
0591デフォルトの名無しさん
2007/09/14(金) 22:22:27Dictionary使ったら10分の1程度の時間で処理が終わるよ!!
0592デフォルトの名無しさん
2007/09/14(金) 22:40:140593531
2007/09/14(金) 23:11:23あんな簡単に変換できるなら事前にテーブル用意しようとは思わんけどな
一文字一文字対応させるようなややこしい変換規則になると思ってた
0594516
2007/09/14(金) 23:19:23timeSpan
結果発表
if >00:00:00.8412096
Dictionary >00:00:02.0329232
Array >00:00:01.0014400
0595デフォルトの名無しさん
2007/09/14(金) 23:21:190597デフォルトの名無しさん
2007/09/14(金) 23:30:11できるでしょ。
というかできない理由が思い浮かばない。
それに俺は過去に実際やったことあるよ。
0598デフォルトの名無しさん
2007/09/14(金) 23:38:340599デフォルトの名無しさん
2007/09/14(金) 23:48:35ちょっとArrayが遅すぎないか?
ああ文字列変換としてやったときの時間?
にしてもArrayのがIfより遅いのは珍しいかも。
状況にもよるが、判定だけならIfより配列の方が5倍程度速い。
まあメモリ、CPUいろんな条件で結構変わるかもしれんが。
文字列変換までまとめたら1割程度の差でであまり変わらんけどな。
0600デフォルトの名無しさん
2007/09/14(金) 23:49:16ああもちろんこれは俺の環境での話。
0601デフォルトの名無しさん
2007/09/14(金) 23:52:12つまり俺の環境では、だいたい
配列:If:Dictionary=1:5:35
程度ってことだな。
0602デフォルトの名無しさん
2007/09/14(金) 23:54:47上のは、ほとんどが変換されない文字(ループ変数をchar範囲でAndとってcharにしたもの)
でやったので、そういう意味では特にIfがかなり不利な条件だな。
0603デフォルトの名無しさん
2007/09/14(金) 23:57:421.1まではできなかった。2.0からできるようになった。
ドキュメント読んでも1.1までとあんまり扱いが変わってるような印象を受けないので
1.1の時やろうとしてさんざん苦労してできないとわかった人はその印象が強いと思うよ。
新しいenumの値が増えてるわけでもなく、1.1で大抵の人がまず指定してみて
もろに失敗したByValArrayというのも駄目だと思うよ。
2.0からできるようになりましたって大きく取り上げられたわけでもないと思うし。
0604デフォルトの名無しさん
2007/09/15(土) 01:01:110605デフォルトの名無しさん
2007/09/15(土) 01:05:32StrConvも速度の参考程度になるように比較対象に混ぜてあげてください。
0606デフォルトの名無しさん
2007/09/15(土) 01:11:38※かかった時間のおおよその比率
配列:8
Dictionary:19
If:9
StrConv:50
な感じだたよ?
0607デフォルトの名無しさん
2007/09/15(土) 02:07:01タイムは10回平均。
if :00:00:00.2571167
Array :00:00:00.0206023
Dictionary:00:00:00.0713178
StrConv :00:00:00.1486586
なんかおかしくね?
0608デフォルトの名無しさん
2007/09/15(土) 02:10:00ほんとかそれ?
Ifってどんなの?
ちなみに>>606とかのは
return ('0' <= c && c <= '9' || 'A' <= c && c <= 'Z' || 'a' <= c && c <= 'z') ? (char)(c - 65248) : c;
見たいな判定してる(IfじゃないけどまあIfと変わらん)。
0609デフォルトの名無しさん
2007/09/15(土) 02:16:07条件式ってか、ifは上にあった>>542をコピペした。
どっか間違えたかな…
0610デフォルトの名無しさん
2007/09/15(土) 02:25:42if :00:00:00.0279734
Array :00:00:00.0181842
Dictionary:00:00:00.0707453
StrConv :00:00:00.1461418
何を思ったのかコピペした後foreachからforに変えてたのが原因でした。
そら毎度毎度インデクサ使ってたら遅くなる罠 orz
0611デフォルトの名無しさん
2007/09/15(土) 02:55:43class{
・・・
class{
・・・
}
}
これってどういう意味があるんですか
インスタンス作ったときに中のクラスのインスタンスも一緒にできるんですかね?
0612デフォルトの名無しさん
2007/09/15(土) 03:03:18C# でクラスをネストさせても Java のようにはならずに
インスタンスは作られないよ
0613デフォルトの名無しさん
2007/09/15(土) 03:13:25内クラスは外クラスのメンバに自由にアクセスできる。private でも。
// もちろん非静的なメンバにアクセスする場合は外クラスのインスタンスが必要。
あとはまあ外クラスに強く結びついているクラスとか。
ただし多用は薦められていない(ガイドライン参照)。
IEnumerator の実装クラスとか。
> インスタンス作ったときに中のクラスのインスタンスも一緒にできるんですかね?
できない。
0614デフォルトの名無しさん
2007/09/15(土) 03:29:230615611
2007/09/15(土) 08:28:10実験してみよっとありがとうございました
0616デフォルトの名無しさん
2007/09/15(土) 11:36:49じゃあ >>449 は、1.1 の話?
0617デフォルトの名無しさん
2007/09/15(土) 11:39:44ByValArray をつけても構造体の配列は取得できなかった。null になってしまった。
他の int のメンバは取得できた。
何が悪いんだろう?
0618デフォルトの名無しさん
2007/09/15(土) 11:43:510619デフォルトの名無しさん
2007/09/15(土) 12:27:19基本的な話として、各プラグインのアセンブリってやっぱり
それぞれAppDomain作ってそこにロードすべきなんでしょうか?
なんか数が多かったらどんどんAppDomainが増えそうじゃないですか?
これってまずい?
かといって一つのAppDomainにロードしたら
各アセンブリを個別にアンロードできないですよね
0620デフォルトの名無しさん
2007/09/15(土) 12:36:260621デフォルトの名無しさん
2007/09/15(土) 12:41:01ライブラリ作っててふと思ったので。
0622デフォルトの名無しさん
2007/09/15(土) 12:45:250623デフォルトの名無しさん
2007/09/15(土) 12:47:07誤用って?
0624デフォルトの名無しさん
2007/09/15(土) 12:48:21プラグインに関してはまだ.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界全体として、まだベストプラクティスが定まってない分野だと思うよ。
0625デフォルトの名無しさん
2007/09/15(土) 12:50:09どんなプラグインか知らんが、普通に考えて
>それぞれAppDomain作ってそこにロードすべきなんでしょうか?
それはきびしいだろ。
AppDomain管理するコストの方がプラグインのアセンブリロードしとくよりきつそうだ。
動的におきかえなきゃならんのなら仕方がないが、そうでなけりゃ気にする必要ないでしょ。
AppDomainを活用するのはそう簡単じゃないよ。
0626624
2007/09/15(土) 13:01:25ちょっと追記。
もしプロトタイプ作るなら、個人的にはIronPython使ってみるのをおすすめする。
将来的にはDLRが.NETのアドインシステムの中核を担うと期待している。
>>625
>AppDomainを活用するのはそう簡単じゃないよ。
それに挑戦したのがSystem.AddIn名前空間の奴。
まあ案の定WCFみたいになった。
0627621
2007/09/15(土) 13:07:41wiki見てて始めて知った。おk、もう正しいとか正しくないとかどうでもいいわ。
>>623
VGAとかは解像度をあらわす単語じゃないはず・・・本来は。
0628デフォルトの名無しさん
2007/09/15(土) 13:13:56>>624
Assembly.LoadFile(file).GetTypes()じゃだめなの?
0629デフォルトの名無しさん
2007/09/15(土) 13:57:29アンロードが必須ならAppDomainを作るしかない。
そこまで不要ならAppDomainを分けずにやってしまった方が手っ取り早い。
多少多めのAppDomainでもそれほどきつくはないと思う。
それぞれ通信するプラグインとそれを管理するexeがログ表示などするアプリはやったが
そこそこの数のプラグインがいても特に問題なく動いている。
最大でせいぜい20くらいでいくらでも増えるわけじゃなかったからそれで大丈夫だった。
>628
それ、アンロードできないじゃん。
アンロードをはなから諦めるってのもありだと思うが、プラグインのdllをつかみっぱなしになるのが困らないか?
本体が実行中にプラグインだけ入れ替えたいとか使ってないのにファイルは捕まれてるのはちょっと気持ち悪い。
そういうのがいらないならありだと思う。
0630デフォルトの名無しさん
2007/09/15(土) 14:02:32結構ホスト側と密に連携しようとしてることが多いからね〜
独立性の高いプラグイン機構ならまだいいんだけど
0631デフォルトの名無しさん
2007/09/15(土) 14:08:59認識させたりとかできるんだっけか?
もしそれができるならロード前にファイルをコピーしてとかできるかな?
違うアセンブリだと認識させられないんなら無理だが。
もしくはILmeargeで無理やりアセンブリを独立化だw
いやそれならilasmのほがましか?
0632デフォルトの名無しさん
2007/09/15(土) 14:11:030633デフォルトの名無しさん
2007/09/15(土) 14:25:210634619
2007/09/15(土) 14:33:28とりあえずカレントのAppDomainでロードしてみます。
(問題はプラグイン仕様を後で変えずにロード法を変えられるかですが)
>>633
Load(byte[])のオーバーロードって
ファイルそのもののバイト配列じゃないっしょ?
以前これ見てウホッと喜んで試したけど動かなかった気が。
つかCOFFイメージってなんだこりゃ
0635デフォルトの名無しさん
2007/09/15(土) 14:35:06何も知らない頃俺これで動かしてたが…
LoadFromだったかな?
さすがに今はやってないがw
0636デフォルトの名無しさん
2007/09/15(土) 18:37:01あるインターフェイスを実装したクラスを継承したら、
継承クラスももちろんインターフェイスを実装してますよね。
そのとき、インターフェイスから実装されたメソッドはvirtualもoverrideもかかれてませんが、
overrideできちゃうんですかね?
0637デフォルトの名無しさん
2007/09/15(土) 18:37:360638デフォルトの名無しさん
2007/09/15(土) 18:43:06いやファイルそのもののイメージであってる。
exeなりdllなりをバイト配列でそのまま渡す。
0639デフォルトの名無しさん
2007/09/15(土) 18:44:12それが分からないのは結局継承もインターフェイスも中途半端にしか
理解してないからだよ。
0640デフォルトの名無しさん
2007/09/16(日) 01:26:35List<string> container = new List<string>();
container.Add("foo");
container.Add("bar");
container.Add("foo"); // 追加されない
0641デフォルトの名無しさん
2007/09/16(日) 01:32:410642デフォルトの名無しさん
2007/09/16(日) 02:03:120643デフォルトの名無しさん
2007/09/16(日) 02:29:110644デフォルトの名無しさん
2007/09/16(日) 03:05:18今ならKeyedCollection派生か
Dictionary<,>のラッパー作るか、かな?
0645デフォルトの名無しさん
2007/09/16(日) 03:27:56順序を保持しないならDictionaryのラッパー
保持するならListのラッパーを作ればいいんじゃね
0646デフォルトの名無しさん
2007/09/16(日) 10:26:170647デフォルトの名無しさん
2007/09/16(日) 11:47:36class ListEx<T> : List<T>
{
new public void Add(T item)
{
if (!Contains(item)) base.Add(item);
}
}
これでAddは対応できるな。
0648デフォルトの名無しさん
2007/09/16(日) 11:55:39ていうか、それ仮にaddがオーバライド可だとしてもすべきじゃないでしょ。
動作の意味が違うじゃん。
別のメソッドを追加する対応にすべきだ。
0649デフォルトの名無しさん
2007/09/16(日) 12:02:54Collection<T>を派生元にすべき。
0650デフォルトの名無しさん
2007/09/16(日) 14:01:35語尾にwを付ける必要はないと思う
0651デフォルトの名無しさん
2007/09/16(日) 14:23:450652デフォルトの名無しさん
2007/09/16(日) 14:34:36まあ確かに、大人数で使うとか売り物にするとかのライブラリでなければ
そこまで拘る必要ないじゃん、と言われればそれも一理あるけどさ。
0653デフォルトの名無しさん
2007/09/16(日) 14:37:49Collection<T>使えば簡単にできるし
わざわざList<T>を継承する意味がわからん
0654デフォルトの名無しさん
2007/09/16(日) 14:42:460655デフォルトの名無しさん
2007/09/16(日) 15:08:45bmp0からbmp1へと別のとこへのコピーはできたのですが
bmp0からbmp0へと同一bmp内でのコピーはできませんでした
これはできない仕様なんですか できる方法はありますか?
0656デフォルトの名無しさん
2007/09/16(日) 15:11:58その上に何か好きに描いたりすればいいだろ
0657デフォルトの名無しさん
2007/09/16(日) 15:15:52スピードの面で直接1回で描けたらいいなと思って
0658デフォルトの名無しさん
2007/09/16(日) 15:21:58LockBits使って気持ち悪いことやるといいよ
0659デフォルトの名無しさん
2007/09/16(日) 15:29:56LockBits 配列を使うやつですね 調べてみます
0660デフォルトの名無しさん
2007/09/16(日) 15:41:59回答してる奴の言ってることもよくわからん
本当何のこっちゃw
0661デフォルトの名無しさん
2007/09/16(日) 18:10:13いや両方アホなだけか
0662デフォルトの名無しさん
2007/09/16(日) 18:54:23IList<T>にキャストしたら
Addの動作が変わって値が重複するだろ
new厨目を覚ませ
0663デフォルトの名無しさん
2007/09/16(日) 21:18:470664デフォルトの名無しさん
2007/09/16(日) 22:18:590665デフォルトの名無しさん
2007/09/16(日) 22:21:580666デフォルトの名無しさん
2007/09/17(月) 21:55:05下記コードです。
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が何を意味しているのか
良く分かりせん。どなたか教えて下さい。
0667666
2007/09/17(月) 22:00:36oAccess.OpenCurrentDatabase("C:\\TEST\\TEST.mdb", true);の第2引数trueの意味だけは
わかりました。trueは排他モード、falseは共有モードということです。
0668デフォルトの名無しさん
2007/09/17(月) 22:16:030669デフォルトの名無しさん
2007/09/17(月) 22:28:13acViewDesign デザインビューで開きます。
acViewNormal 選択クエリーならデータシートビューで開きます。
アクションクエリーならデータの追加、更新、削除を行います。
acViewPivotChart ピボットチャートビューで開きます。(選択クエリーのみ)
acViewPivotTable ピボットテーブルビューで開きます。(選択クエリーのみ)
acViewPreview 印刷プレビューで開きます。(選択クエリーのみ)
�ADataMode(第3引数)に指定する定数(選択クエリー時のみ有効)
acAdd 追加専用モードです。
acEdit 編集・追加・削除モードです。
acReadOnly 読み取り専用モードです。
0670デフォルトの名無しさん
2007/09/18(火) 23:30:46これぐらいだったら…
0671デフォルトの名無しさん
2007/09/18(火) 23:34:11お漏らしと言え
0672デフォルトの名無しさん
2007/09/18(火) 23:59:55クローズ構築とはなんですか?
説明読む限り型パラメータが固定/ないジェネリックとしか読めないのですが・・・
どのようなときに使うのでしょうか?
0673デフォルトの名無しさん
2007/09/19(水) 00:07:50オープン構築型は型パラメータが未定義なのでインスタンスを作れない。List<T> とか。
0674デフォルトの名無しさん
2007/09/19(水) 00:09:34Collection<T>に対するクローズ構築型であるCollection<Hoge>を継承して
HogeCollection(非ジェネリック)を作った」
というような使い方でいいのかなあ
0675デフォルトの名無しさん
2007/09/19(水) 00:15:380676デフォルトの名無しさん
2007/09/19(水) 00:39:29int X=10;
public int プロパティA
{
get
{
return X;
}
}
とかで Xを配列にしたりジェネリックにしたりとか
0677デフォルトの名無しさん
2007/09/19(水) 00:41:190678デフォルトの名無しさん
2007/09/19(水) 00:50:57コンパイラにきいた方がはやいなw
0679デフォルトの名無しさん
2007/09/19(水) 01:26:15{
Class2 c2 = new Class2();
//適当な処理
Form2 f2 = new Form2();
f2.ShowDialog();
//適当な処理
}
としたとき、Form2はDisposeが必要なのに
Class2はDisposeしなくていいのは何故?
0680デフォルトの名無しさん
2007/09/19(水) 01:39:590681デフォルトの名無しさん
2007/09/19(水) 01:43:48もしClass2の内部でリソース使ってるなら解放が必要
IDisposableならusing節推奨
0682デフォルトの名無しさん
2007/09/19(水) 01:55:11リソースとはコントロールって事でしょうか?
Class2は呼び出し元のForm1で指定したURLを読み込んで
System.Net.WebClientクラスを使った処理をしています。
Form1に書いても良かったのですが、同様の処理が複数あるので
それぞれ別クラスに書きました。
IDisposableについては初めて知ったのでこれから勉強します。
0683デフォルトの名無しさん
2007/09/19(水) 01:57:40Class2でDisposeするかしないか決めるのは実装者のあなた
0684デフォルトの名無しさん
2007/09/19(水) 02:17:09普通はしなくても平気だけど
0685デフォルトの名無しさん
2007/09/19(水) 08:43:06string 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);とすると起動できないのです。"(ダブルクォーテーションの使い方が悪い?)
0686685
2007/09/19(水) 08:44:44一部ダブルクオーテーションが全角になってますが実際は半角です。
0687デフォルトの名無しさん
2007/09/19(水) 08:49:010688デフォルトの名無しさん
2007/09/19(水) 09:02:580689デフォルトの名無しさん
2007/09/19(水) 09:20:49" 'C:\Program Files\Test.exe' "でできないっけ?
0690デフォルトの名無しさん
2007/09/19(水) 10:07:110691デフォルトの名無しさん
2007/09/19(水) 10:27:00てっきり規定のメンバで存在すると思っていたのですが、見つかりません。
0692デフォルトの名無しさん
2007/09/19(水) 10:30:140693デフォルトの名無しさん
2007/09/19(水) 10:44:53Object.GetType().FullName;
0694デフォルトの名無しさん
2007/09/19(水) 10:55:52ProcessStartInfo使え
0695デフォルトの名無しさん
2007/09/19(水) 13:54:580696デフォルトの名無しさん
2007/09/19(水) 13:58:460697デフォルトの名無しさん
2007/09/19(水) 13:58:490698デフォルトの名無しさん
2007/09/19(水) 14:30:15予約語で具具って美奈代
0699デフォルトの名無しさん
2007/09/19(水) 15:05:07retrnで返そうとすると
そんな変数存在しねぇぞ(゚Д゚)ゴルァ!って怒られるんですけどなんで?
宣言を int a =new int()のようにしたら大丈夫ですたが
int function{
int a
return a;
}
こんなの
0700デフォルトの名無しさん
2007/09/19(水) 15:06:360701デフォルトの名無しさん
2007/09/19(水) 15:12:03初期化してないから
int a = 0;(int a =new int()でも一応おk)
0702デフォルトの名無しさん
2007/09/19(水) 15:16:28結構はまる人おおそう
ありがとうございました
0703デフォルトの名無しさん
2007/09/19(水) 15:52:08残念ながら嵌らない。
第一
int a;
return a;
なんてaを宣言して初期化せずにそれを返すなんてことはしない。
参照型なら例外処理とかで
object a;
…
catch
{
a = null;
return a;
}
とかやる場合もあるが。
0704デフォルトの名無しさん
2007/09/19(水) 15:57:330705デフォルトの名無しさん
2007/09/19(水) 16:03:58ありがとうございます。独立したメソッドでしたか・・・
0706デフォルトの名無しさん
2007/09/19(水) 16:08:43どれにもあてはまらないパターンがあったようだ
ローカル変数以外は初期化されるんだっけ?やはり基本は大事か
0707デフォルトの名無しさん
2007/09/19(水) 16:24:55とやるとInt32が持つInt32型のメンバ変数が自動で規定値に初期化されるから
初期化したことになるというよくわからん理屈
0708デフォルトの名無しさん
2007/09/19(水) 16:25:39初期化されない。
つか、フィールドはコンストラクタで、ローカルは宣言時に初期化するだろ普通。
0709デフォルトの名無しさん
2007/09/19(水) 16:41:16メンバ変数は確か 0 に初期化されたんじゃ。
もちろん、初期化してないと Warning は出るけど。
0710デフォルトの名無しさん
2007/09/19(水) 18:21:500711デフォルトの名無しさん
2007/09/19(水) 18:30:200712デフォルトの名無しさん
2007/09/19(水) 18:45:200713デフォルトの名無しさん
2007/09/19(水) 18:57:17参照型はnull,値型は0になる
0714デフォルトの名無しさん
2007/09/19(水) 19:12:08プロパティ用のフィールドにいちいち全部null代入するとか無意味だろ
0715デフォルトの名無しさん
2007/09/19(水) 19:56:13class 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() を呼ばなくても警告は出ない
0716デフォルトの名無しさん
2007/09/19(水) 20:18:02ていねいなコンパイラや
0717デフォルトの名無しさん
2007/09/20(木) 00:18:560718デフォルトの名無しさん
2007/09/20(木) 14:40:25部品のメソッド一覧を作成するときに使えそうなツールってありますか?
メソッド一覧には「メソッド名」「引数」「機能」「例」「使用先」を載せたいです
0719デフォルトの名無しさん
2007/09/20(木) 16:14:43最終的な生成に何を使うにしろC#はドキュメントコメントがコンパイラに組み込まれてるから
書き方はそれに従うように
0720デフォルトの名無しさん
2007/09/20(木) 16:26:07質問です.
VBで PixelsToTwipsX とは,
座標変換をするためのもの
というところまでわかりましたが
C#ではどのように記述すればよいのかわかりません.
現在,サンプルプログラム(VB)を参考に
C#でプログラムを組んでいます.
初心者的な質問ですがご教授願います.
0721デフォルトの名無しさん
2007/09/20(木) 16:28:16http://ja.wikipedia.org/wiki/Twip
0722デフォルトの名無しさん
2007/09/20(木) 16:38:59関数のようだが・・・
http://msdn2.microsoft.com/ja-jp/library/9a59w6f5(VS.80).aspx
0723デフォルトの名無しさん
2007/09/20(木) 16:43:250724デフォルトの名無しさん
2007/09/20(木) 18:34:47Font font = new Font("MS Gothic", twip / 20F, GraphicsUnit.Point);
こんな感じじゃね?
0725デフォルトの名無しさん
2007/09/20(木) 18:48:380726デフォルトの名無しさん
2007/09/20(木) 19:36:06.NET EXEから.NET DLLを参照するようにしてるんだけど、
DLL側の情報がStackTraceに見当たらない・・・
0727デフォルトの名無しさん
2007/09/20(木) 19:43:09Application.ThreadExceptionイベント
0728デフォルトの名無しさん
2007/09/20(木) 19:52:09言語や最適化でいくらでも変わる
0729デフォルトの名無しさん
2007/09/20(木) 20:02:37指定の場所から最新のアプリを取得してくるアップデータをつくったのはいんだが
アップデータのそのもののアップデートをどうやってやればいいか悩んでまつ
アップデータそのものがアップデートを実行してるのでEXEに上書きできないわけだが
なにかいい案はありませんか賢い人
0730デフォルトの名無しさん
2007/09/20(木) 20:23:43テンポラリディレクトリに自分自身をコピーして実行すればいいだけだろ
0731デフォルトの名無しさん
2007/09/20(木) 20:30:370732デフォルトの名無しさん
2007/09/20(木) 21:02:42最初に起動するのはチェック用プログラム。
アップデートなしだとターゲット起動
0733デフォルトの名無しさん
2007/09/20(木) 21:07:35チェック用プログラム=アップデータなんだね。
ターゲットがアップデータverチェックだな。
ターゲットが起動したらアップデータ終了だし。
0734デフォルトの名無しさん
2007/09/20(木) 21:42:32チェックが不具合あったらチェックのチェック用を用意してさらにチェックのチェックノチェ・・・
俺って天才じゃね
0735デフォルトの名無しさん
2007/09/20(木) 22:32:00アップデータ置き換えバッチ書いてスタートアップに保存
アップデータ起動時にバッチ削除
0736デフォルトの名無しさん
2007/09/20(木) 22:41:19VirtualProtectでも呼んで動的に書き換えちまえばいいんじゃね
やった事ないけど
0737デフォルトの名無しさん
2007/09/20(木) 22:56:32手抜きでいいんなら元のexeをリネームしてどかして入れ替えで。
リネームした方は新しいexeで起動したときにでも削除で。
0738デフォルトの名無しさん
2007/09/20(木) 23:09:34↓
チェッカーは自身のプロセスIDを引数にしつつ、アップデータを起動、自身は終了させる。
↓
アップデータはチェッカーの終了を待った後、それぞれの最新版と入れ替える
↓
アップデータはメインモジュールを起動する(更新がなかった場合は、チェッカーが起動させる)
アップデータをWorkに置くようにすれば、たぶん全てのモジュールが更新できる。
0739デフォルトの名無しさん
2007/09/20(木) 23:31:24俺はそれでアップデータをチェッカーのリソースにつっこんで
アップデートのたびに生成したな。
アップデータが存在したらその回はアップデータを消すだけで
バージョンチェック省けるし。
0740729
2007/09/20(木) 23:59:44(アップデートする人)(ソフト本体)のほかに
(チェックをする人?)を作れってことでつか?
ソフト本体がアップデートする人のアップデート情報を
取得できてたら差し替える って方法でいこうとおもってるんでつが
0741デフォルトの名無しさん
2007/09/21(金) 00:02:230742デフォルトの名無しさん
2007/09/21(金) 00:07:53ソフト本体が他の媒体の面倒をみる設計で問題なければそれでいいんじゃないか。
0743デフォルトの名無しさん
2007/09/21(金) 00:52:05アプリは落として実行してすぐ終了。後は落としてきたものに任せる。柔軟性高し
おすすめはmspかそれを実行するexe。署名で一般ユーザーでも更新可能になる。
が、この利点は会社、組織じゃないと駄目なのが珠にきず
0744デフォルトの名無しさん
2007/09/21(金) 01:09:50フレムワク1.1だからだめぽ
データ差分も1時間おきにでるので
クリックワンコだけじゃだめぽ
というわけでつ
>>742
トン
>>743
アー、まるでクリックワンコみたいな動作をアップデータにさせるわけでつね
たしかにそれなら柔軟かもしれないです
mspってのはどのmsp・・・?
0745デフォルトの名無しさん
2007/09/21(金) 07:48:43Access.ApplicationClass oAccess = new Access.ApplicationClass();
と
Access.Application oAccess = new Access.Application();
2種類ありますがこの2つはどう違うのでしょうか?
0746デフォルトの名無しさん
2007/09/21(金) 07:55:460747デフォルトの名無しさん
2007/09/21(金) 08:32:20とりあえずmsp何?なら諦めとけ。WindowsInstallerのパッチ形式だが
知識ないと作るの難しいから
クリックワンスとか以前に、ようはパッチを落として起動するだけの話
0748デフォルトの名無しさん
2007/09/21(金) 09:20:33その行数を1,2,3・・・・という形に表示させたいのですが、どのようにすればいいでしょうか?
0749デフォルトの名無しさん
2007/09/21(金) 09:26:490750デフォルトの名無しさん
2007/09/21(金) 12:02:56ネストされていなければ、TypeConverterでExpandableObjectConverterを指定すれば
簡単にできるのですが、展開したクラスの中に、さらに自前のクラスがあると、
それがうまく展開されないです…。
0751デフォルトの名無しさん
2007/09/21(金) 14:09:00保存時の順番が保持されるかどうかって保証されてないんだっけ?
0752デフォルトの名無しさん
2007/09/21(金) 14:34:300753デフォルトの名無しさん
2007/09/21(金) 14:36:200754デフォルトの名無しさん
2007/09/21(金) 16:50:04Delegate型(delegateキーワードを使って作った型ではない)の変数に
メソッドを入れるとき、いちいちdelegateで型を作っているとものすごい数になるので
直接メソッドグループをDelegate型の変数のなかに入れたいのですが、
'メソッド グループ' から 'System.Delegate' に変換できません。
と言われて入れることが出来ません。
どうにかして入れたいのですが、delegateで型を作るしかないですかね?
0755デフォルトの名無しさん
2007/09/21(金) 17:09:16>いちいちdelegateで型を作っているとものすごい数になるので
この目的だと、
.NET 3.5 から、Action デリゲートと Func デリゲートが標準で用意されてるんで、
それを使えばいいと思う。
0756デフォルトの名無しさん
2007/09/21(金) 17:13:24されてるはずだけど、何でそう思ったの?
>>754
メソッドグループって何だっけ?
シグネチャさえあってれば1つでいいはずだけど。
0757デフォルトの名無しさん
2007/09/21(金) 17:20:07.NET 2.0なので無いです… orz
>>756
引数が全部ばらばらなので無理です。
MethodInfoを使えば何とかなりそうだけど、遅いんだよなぁ orz
0758デフォルトの名無しさん
2007/09/21(金) 17:27:01引数や戻り値を全部objectにするとか。
delegate object FooHandler(object o)
0759デフォルトの名無しさん
2007/09/21(金) 17:28:02よくわからんけど何が遅いの?
0760デフォルトの名無しさん
2007/09/21(金) 17:36:36でもそれだと全てのメソッドの引数もobjectにしなければならないので
今からだと厳しいです。
>>759
リフレクションを使うのでMethodInfoを取得するのが重いんですよ
0761デフォルトの名無しさん
2007/09/21(金) 17:42:12確かにリフレクションは速くはないけど、
MethodInfoの取得がボトルネックになるような場面ってあんまり思いつかないなぁ。
具体的に何やってるの?
0762デフォルトの名無しさん
2007/09/21(金) 17:50:31Action とか 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[] に格納しといてキャストして使うか、
リフレクション使うか。
てか、そんな引数タイプが異なるものを使おうとすると、
リフレクション使わなくてもリフレクション並みに処理重たそう。
0763デフォルトの名無しさん
2007/09/21(金) 18:00:24>メソッドを入れるとき、いちいちdelegateで型を作っているとものすごい数になるので
>直接メソッドグループをDelegate型の変数のなかに入れたいのですが、
C#の文法はそういう用途をサポートしていないので
自分で簡易コンパイラを作るか、
C#のコードを生成するコードジェネレータでも作ればいいんじゃね?
コンパイル時にまでに必要なメソッドは確定してるんだよね?
0764デフォルトの名無しさん
2007/09/21(金) 18:02:18やり直し・元に戻す処理を保存するのにわざわざ条件分けして処理するのも大変なので
Delegateを使おうと思ったのですが、こんなことになるとは orz
>>762
そんなジェネリックだらけの物だったんですねそれ…
それなら何とかなりそうですが、数十個分のを書くとなるとちと面倒ですね
0765デフォルトの名無しさん
2007/09/21(金) 18:05:34>やり直し・元に戻す処理を保存するのにわざわざ条件分けして処理するのも大変なので
>Delegateを使おうと思ったのですが、こんなことになるとは orz
そういうのはIronPythonとかIronRuby使った方がさくっと書けるんじゃないかねぇ。
C#+Delegateでやるなとは言わないけど、
少なくとも手段に対して実力が伴っていないような印象は受ける。
0766デフォルトの名無しさん
2007/09/21(金) 18:21:42まだC#にはそういう方法の方が合ってる気がする
0767デフォルトの名無しさん
2007/09/21(金) 18:29:18MethodInfoでリフレクションでやるのと変わらない気がする。
0768デフォルトの名無しさん
2007/09/21(金) 18:33:15実行時にどのシグネチャをもつdelegateかの判別が必要なんじゃ?
そこでどうせ分岐するんじゃね?
0769デフォルトの名無しさん
2007/09/21(金) 18:37:45シグネチャを統一してしまった方がいいんじゃね
0770デフォルトの名無しさん
2007/09/21(金) 18:52:06それはどのようにするのでしょうか?
enumとかで条件分けするってことでしょうか?
>>767
そうなんですよね。しかし、MethodInfoで試そうと
Type.GetMethod()をしてもパブリックメソッドしか引っかからないのでどうしようかなと。
>>768
DynamicInvoke()を使うのでパラメータはobject[]にすれば判別する必要が無くなります。
>>769
それがまさしくobjectだと思うのですが、毎度毎度キャストするのも重たいし…
0771デフォルトの名無しさん
2007/09/21(金) 19:07:00などと平気で言いながら、
キャストが重いとか言う…
0772769
2007/09/21(金) 19:08:43実際の型として何を要求してるかはメソッドによって違うんだから。
MouseEventArgsなんかはそれを一つ渡すだけだけど中にいろんなオブジェクトが入ってるだろ?
そのおかげでマウス関連のイベントハンドラはMouseEventArgsに統一できる。
「なんでもオブジェクト」はそういう意味で言った
0773デフォルトの名無しさん
2007/09/21(金) 19:09:22ここ見ると評判悪いみたいだね
VSTOを買うわけにもいかないし
何かいい方法はないだろうか
0774726
2007/09/21(金) 19:09:58てか throw; って・・・
0775デフォルトの名無しさん
2007/09/21(金) 19:22:09そこだけVB.NETを使う。
0776デフォルトの名無しさん
2007/09/21(金) 19:28:23生成にExcelは使っていいの?
0777デフォルトの名無しさん
2007/09/21(金) 20:24:45特定の数値やbool値を保存したり読み込んだりするには、どうすればいいのでしょうか?
0778デフォルトの名無しさん
2007/09/21(金) 20:25:51初歩的な指摘ですみません。
どこに保存するつもりですか?
0779777
2007/09/21(金) 20:49:24実行ファイルに組み込んで保存できるならそこで、出来ないなら適当に所謂datファイルとしてです。
アプリケーションのオプション設定などを保存しておきたいのです。
0780デフォルトの名無しさん
2007/09/21(金) 20:55:291.1の時にはデータセットのreadXMLとWriteXMLを使って保存したこともあったな
0781デフォルトの名無しさん
2007/09/21(金) 20:57:59レジストリに書き込むか
C# 設定 保存
でぐぐればいくらでもでてくるっしょ
0782777
2007/09/21(金) 21:14:07確かに検索したら一発でした。
・・・というか・・・すごく楽ですね!!びっくりしました。
0783デフォルトの名無しさん
2007/09/21(金) 21:35:24これなんて読めばいいんですか?
0784デフォルトの名無しさん
2007/09/21(金) 21:37:260785デフォルトの名無しさん
2007/09/21(金) 21:39:40784さんは、なんて読んでいますか?
0786デフォルトの名無しさん
2007/09/21(金) 21:40:150787デフォルトの名無しさん
2007/09/21(金) 21:41:13これは諦めたほうがいいんですかね。。。
0788デフォルトの名無しさん
2007/09/21(金) 21:41:28辞書引けばいいじゃん。中学生?
0789デフォルトの名無しさん
2007/09/21(金) 21:41:410790デフォルトの名無しさん
2007/09/21(金) 21:42:400791デフォルトの名無しさん
2007/09/21(金) 21:44:52社会人の特権だよな
0792デフォルトの名無しさん
2007/09/21(金) 21:59:00Func<T1,T2,TResult>だぜ
0793デフォルトの名無しさん
2007/09/21(金) 22:08:380794デフォルトの名無しさん
2007/09/21(金) 22:17:34Redoしたいのが
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);
}
}
引数までオブジェクトに囲い込めばいいんじゃないの
匿名メソッド使えばオブジェクト作る必要すらなくなる
0795デフォルトの名無しさん
2007/09/21(金) 22:35:05に書かれているコードについて質問します。
> // フィールド
> string _tenki; // 例:曇時々雨
> string _title; // 例:東京都 東京 - 今日の天気
> string _link; // 例:http://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) を宣言するときにアクセス修飾子が使われていないのでしょうか。
0796デフォルトの名無しさん
2007/09/21(金) 22:36:182) 既定のアクセスレベルが定められているからです
0797デフォルトの名無しさん
2007/09/21(金) 22:37:38lwwsUrlは重要だから目立つように最後に書いてるんじゃね
0798デフォルトの名無しさん
2007/09/21(金) 22:38:050799デフォルトの名無しさん
2007/09/21(金) 22:43:000800デフォルトの名無しさん
2007/09/21(金) 22:56:05アブダクションだっけ?
UFOのやつね。
0801デフォルトの名無しさん
2007/09/21(金) 23:21:19ありがとうございました。
・ lwwsUrlもフィールドであるけれども、 特にプロパティ用のフィールドを 「フィールド」 としてまとめている。
・ アクセス修飾子は省略でき、 省略するとprivateになる。
というわけですね。
もう1つ質問します。
>>795のコードでは、 プロパティ用のフィールド名の先頭にアンダースコアを付けて、 それとわかるようにしていると思うのですが、
そのような書き方は一般的なのでしょうか。
0802デフォルトの名無しさん
2007/09/21(金) 23:28:41「プロパティ用のフィールドは直接触るな。クラス内部でもプロパティを通せ」
という意思表示のようにも見えるけどそうはなってないね
0803デフォルトの名無しさん
2007/09/21(金) 23:33:07必ずしも真ではない。詳しくはMSDN
言語によっても異なるしな。
> >>795のコードでは、 プロパティ用のフィールド名の先頭にアンダースコアを付けて、 それとわかるようにしていると思うのですが、
> そのような書き方は一般的なのでしょうか。
それなりに見かける。インテリセンスで前の方に集まって見やすいという主張もある。
でもおいらはアンダースコアつけない。
外部に見せないものは趣味の範囲だし。
もちろん複数人でコードを共有する場合はきちんと規約を作るべきだが。
0804デフォルトの名無しさん
2007/09/21(金) 23:36:15昔ながらの小文字のm一文字がやっぱり一番しっくりくる。
なぜかあまりやってる人見ないけど。
0805デフォルトの名無しさん
2007/09/21(金) 23:36:26> 言語によっても異なるしな。
少なくともここはC#のスレだと思うんだが
0806デフォルトの名無しさん
2007/09/21(金) 23:38:57>>797はメンバと言ってるけどな
0807デフォルトの名無しさん
2007/09/21(金) 23:41:11thisは省略。
そっちの方が分かりやすいかなぁ。
0808デフォルトの名無しさん
2007/09/21(金) 23:46:25それが一番多数派じゃね
0809デフォルトの名無しさん
2007/09/21(金) 23:48:58でもVB.NETのソースとか結構読むことあるし
0810デフォルトの名無しさん
2007/09/21(金) 23:49:23HageCollectionクラスを作る必要ができました。
上の方で「なんでList<T>から継承するの? 馬鹿?」みたいな話がありましたが
ICollection<T>とかIList<T>とかから継承して、全部自分で実装するべきなんですか?
List<T>を継承して動作変えたいところだけnewで隠蔽するんじゃ駄目ですか?
(sealedなクラスで他の用途は無いんですが)
0811デフォルトの名無しさん
2007/09/21(金) 23:51:59「C#におけるメンバは」 宣言時にアクセス修飾子を省略するとprivateになる、 という理解でよいのでしょうか。
0812デフォルトの名無しさん
2007/09/21(金) 23:52:330813デフォルトの名無しさん
2007/09/21(金) 23:55:38publicメンバとして公開してはいけないことになってたような
List<T>はパフォーマンスが目的であってカスタマイズできないからCollection<T>を使えと
MSDNのどっかに書いてあった覚えがある
0814デフォルトの名無しさん
2007/09/22(土) 00:00:063.5は遠い
0815デフォルトの名無しさん
2007/09/22(土) 00:00:43そのメソッドを呼び出すだけ
動作変えたいなら変えればいいし
なんでわざわざ制限が多くてわかりにくい継承を使いたがるのかわからん
0816デフォルトの名無しさん
2007/09/22(土) 00:01:03お作法的にはダメだろうね。
でも所詮一人で書いてるコードで自分で自分の罠に落ちない自信が持てるなら
別にかまわんでしょ。
0817デフォルトの名無しさん
2007/09/22(土) 00:01:07残念ながら間違い
0818デフォルトの名無しさん
2007/09/22(土) 00:18:27C#の言語仕様はもっと複雑なのですね。
皆さんありがとうございました。
0819デフォルトの名無しさん
2007/09/22(土) 00:28:42基本的に劣っていると考えたい・・・
0820デフォルトの名無しさん
2007/09/22(土) 00:29:170821デフォルトの名無しさん
2007/09/22(土) 00:31:500822デフォルトの名無しさん
2007/09/22(土) 00:39:51VB6である行範囲をコピーして別の行範囲にコピーしたいのです。
***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を参照設定しています。どなたか教えて下さい。
0823デフォルトの名無しさん
2007/09/22(土) 00:45:16勘違いしてそうだけど継承するのは全然構わないよ、MSのサンプルコードでもやってるし。
ただ、動作を変えるのならnewで隠さず名前も変えろってだけの話。
0824デフォルトの名無しさん
2007/09/22(土) 00:49:00いい
0825デフォルトの名無しさん
2007/09/22(土) 02:00:21インラインアセンブラは、言語じゃなくコンパイラの仕様だろ
0826デフォルトの名無しさん
2007/09/22(土) 02:52:570827デフォルトの名無しさん
2007/09/22(土) 05:39:55お前のせいでUFOに誘拐されたアメリカ人の証言が頭の中で舞ってしまったじゃないか
0828デフォルトの名無しさん
2007/09/22(土) 11:18:08あるファイルなりメモリ上のデータなりを、Imageクラスでデコードできるかどうか、を知る方法はないでしょうか。
現在はtryブロック内でImage.From*を使い、例外が発生するかどうかで判断しているのですが、いちいちImageクラスのインスタンスが生成されたり例外が発生したりするので無駄が多いように思いまして……
0829デフォルトの名無しさん
2007/09/22(土) 14:12:160830デフォルトの名無しさん
2007/09/22(土) 14:18:190831デフォルトの名無しさん
2007/09/22(土) 15:42:53((Excel.Range)oExcel.Application.Rows["1:42", Missing.Value]).Copy(oExcel.Application.Rows["43:84", Missing.Value]);
コンパイルエラーと実行時エラーくらいはっきり区別しようよ
0832デフォルトの名無しさん
2007/09/22(土) 16:31:50>>831に書いてあるような調子のコードってメンテ不能じゃないか?
0833デフォルトの名無しさん
2007/09/22(土) 17:46:09Windowsのアドレス帳ファイル(.wab)のバイナリデータを読み込みたいと思っています。
バイナリデータの仕様はどこかで公開されているのでしょうか?
特定のライブラリやAPIがあるようでしたらばそれでもOKです。
0834デフォルトの名無しさん
2007/09/22(土) 17:54:56FILE: 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
0835833
2007/09/22(土) 18:11:32ありがとうございます。
軽く目を通したんですが、MS系の開発は初めてで解読できませんでした。
諦めてCSVでエクスポートする方法を提案したいかと思います。
0836デフォルトの名無しさん
2007/09/22(土) 19:49:140837833
2007/09/22(土) 19:53:17そもそも簡単ならやってくれる?程度の優先度低い話なんですよ
0838デフォルトの名無しさん
2007/09/22(土) 22:00:38ありがとうございます。
もっと勉強します。
>>832
VBの方がやはりいいのでしょうか?
C#からExcelを扱うのは一般ではあまりやらないのでしょうか?
0839デフォルトの名無しさん
2007/09/22(土) 22:12:23たくさんExcelを操作するコードを書くならVBAのマクロを生成して
それを呼び出すという手もある
0840デフォルトの名無しさん
2007/09/22(土) 22:13:52エクセルの操縦に限れば遥かに楽だね。
エクセルの設計のいい加減さと、VB.NETの旧VBを引きずってるいい加減さが
親和的なんだよね。
0841デフォルトの名無しさん
2007/09/22(土) 22:35:52出来ないのね。知らんかった。
どうしてできないの?
0842デフォルトの名無しさん
2007/09/22(土) 22:40:21ほぼありとあらゆる場合に継承はするべきじゃない
0843デフォルトの名無しさん
2007/09/22(土) 22:50:09テンプレートパターンのためのもののみに限定する方針みたいだね
むしろオーバーライドできないのが普通
Collection<T>にはカスタマイズ目的でオーバーライドさせるためのメソッドがあるよ
0844デフォルトの名無しさん
2007/09/22(土) 22:50:440845デフォルトの名無しさん
2007/09/22(土) 22:50:53[条件]
・.NET FRAMEWORK 1.1でコンパイルできるもの
・デバッガ付
・VSに似ているもの
0846デフォルトの名無しさん
2007/09/22(土) 22:52:450847デフォルトの名無しさん
2007/09/22(土) 22:54:160848デフォルトの名無しさん
2007/09/22(土) 22:55:55Visual C# 2005 Express Edition
SharpDevelop
0849デフォルトの名無しさん
2007/09/22(土) 22:57:04ありがとうございます。
早速さがしてみます。
0850デフォルトの名無しさん
2007/09/22(土) 23:49:17vb.net使っても開放忘れるとかなりシステムが不安定になったりする。
VBAかVB6のほうがよい。
0851デフォルトの名無しさん
2007/09/22(土) 23:56:06上のコードだと、oExcel,oWB,oSheetもちゃんと開放しないといけない。
おまけ。
oExcel.Application.Sheets["TEST"].Select
0852デフォルトの名無しさん
2007/09/23(日) 00:00:460853デフォルトの名無しさん
2007/09/23(日) 00:02:270854デフォルトの名無しさん
2007/09/23(日) 00:10:12中途半端にできるからダメなのか
0855デフォルトの名無しさん
2007/09/23(日) 00:17:22それ逆だよw
VB6からのエクセルのオートメーション操作は問題多すぎだった。
っていうか、VBAって何を言ってるんだw
0856デフォルトの名無しさん
2007/09/23(日) 00:25:46そうなのか俺はラッキーだったのか.
VBAでできるものはVBAで。
0857デフォルトの名無しさん
2007/09/23(日) 00:25:46VB.NET質問スレ http://pc11.2ch.net/test/read.cgi/tech/1189038267/10-38
0858デフォルトの名無しさん
2007/09/23(日) 00:29:590859デフォルトの名無しさん
2007/09/23(日) 00:31:03「同じオブジェクトを指しているかどうか調べる」には obj1 == obj2 ではダメな場合があるって事ですか?
あと、オブジェクトを特定のブロック内で「確実に」破棄させる(C++のスタックに置いたオブジェクトのように)には、
usingを使えば問題ないのでしょうか。それともtry...finallyでDisposeさせるのでしょうか。
0860デフォルトの名無しさん
2007/09/23(日) 00:33:03条件付はい
0861デフォルトの名無しさん
2007/09/23(日) 00:34:50==がoverrideされた典型的な例がStringクラス。
imutableクラス以外で==のoverrideはあまり見たことがない。
0862デフォルトの名無しさん
2007/09/23(日) 00:35:350863デフォルトの名無しさん
2007/09/23(日) 00:44:20オブジェクトの終了コードの実行とオブジェクトが占有している領域の開放。
C#では領域の開放はあくまでもGCが行う。
0864デフォルトの名無しさん
2007/09/23(日) 00:48:05なんだったらコンストラクタを潰して
匿名メソッドでコードブロックを引数にとらないと使えない形にして、
コードブロック終了後Disposeとかすればもっと確実かな
0865デフォルトの名無しさん
2007/09/23(日) 10:37:56Disposeはあくまでメンバに持ってるアンマネージリソースを開放するためのチャンス
0866デフォルトの名無しさん
2007/09/23(日) 11:10:02foreach使って取り出す以外使えない?
0867デフォルトの名無しさん
2007/09/23(日) 11:14:370868デフォルトの名無しさん
2007/09/23(日) 12:09:20>foreach使って取り出す以外使えない?
どうしてその疑問に行き当たったのか不思議だw
0869デフォルトの名無しさん
2007/09/23(日) 12:40:20まずはMSDNライブラリくらい見てみたら?
http://msdn2.microsoft.com/ja-jp/library/xfhwa508(VS.80).aspx
0870デフォルトの名無しさん
2007/09/23(日) 14:28:46演算子のoverloadもop_Equality のような名前になっている。
0871デフォルトの名無しさん
2007/09/23(日) 15:40:120872デフォルトの名無しさん
2007/09/23(日) 16:18:31なにも考えずに使ったら使えたってなりそうじゃん。
0873デフォルトの名無しさん
2007/09/23(日) 16:28:38Tips系のサイトで見つけたならそこに使い方も書いてあるはず
もし.NET 2.0ならDictionary<String>が使えるから存在価値は無いね
0874デフォルトの名無しさん
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が作った用語で合ってますか?
0875デフォルトの名無しさん
2007/09/23(日) 21:39:370876デフォルトの名無しさん
2007/09/23(日) 22:01:08MSILはCILに若干の拡張を加えたもの
0877デフォルトの名無しさん
2007/09/24(月) 02:06:430878デフォルトの名無しさん
2007/09/24(月) 03:00:46StringCollectionよりList<string>の方が速いのは知ってたが
0879デフォルトの名無しさん
2007/09/24(月) 03:05:480880デフォルトの名無しさん
2007/09/24(月) 03:06:510881デフォルトの名無しさん
2007/09/24(月) 03:09:58そういう質問をするときはまずDelphiの動的配列や集合型の説明をするのが礼儀だよ。
0882デフォルトの名無しさん
2007/09/24(月) 03:10:000883デフォルトの名無しさん
2007/09/24(月) 03:11:030884デフォルトの名無しさん
2007/09/24(月) 08:56:21ボタンなどはフォーカスが移動すると、ボタンの表面に点線が引かれ
フォーカスがある状態になります。
PictureBox にもフォーカスを移動させるにはどうしたらよいでしょうか?
0885デフォルトの名無しさん
2007/09/24(月) 09:08:360886デフォルトの名無しさん
2007/09/24(月) 10:21:39複数の絵を表示したいので、PictureBox で→を押したら次の絵に進みたいのです。
0887デフォルトの名無しさん
2007/09/24(月) 11:14:02不可視のコントロール置いて代わりにすれば?
0888デフォルトの名無しさん
2007/09/24(月) 11:25:59なるほど。
不可視のコントロールをおいて、そこの KeyDown イベントで PictureBox を制御すると。
ところで不可視のコントロールって何を使えばよいのでしょうか?
TextBox.Visible = false;
てな感じかな?
0889デフォルトの名無しさん
2007/09/24(月) 11:27:57にして親フォームでキー見たら?
0890デフォルトの名無しさん
2007/09/24(月) 11:30:32OnPaintを自分で実装したら?
たかが画像一枚描画するだけでしょ
0891デフォルトの名無しさん
2007/09/24(月) 11:53:20不可視のほうも、form.KeyPreview = true の方もうまくいきました!
もうちょっと実装を進めて、良いほうを最終的に使いたいと思います。
0892デフォルトの名無しさん
2007/09/24(月) 13:10:16C#ではprivateメソッドにクラス外からアクセスすることができるって事ですか?
それとも、ただコンパイラが頭悪いだけですか?
C#作った人が前の会社で作った、Pascal風の言語のコンパイラでは、ちゃんと教えてくれるんですが。
0893デフォルトの名無しさん
2007/09/24(月) 13:12:59リフレクションを使えば、privateメンバにもアクセスできる。
0894デフォルトの名無しさん
2007/09/24(月) 13:18:41クラス内からリフレクションで触ってるってこともありうる
0895デフォルトの名無しさん
2007/09/24(月) 15:13:450896デフォルトの名無しさん
2007/09/24(月) 16:09:11まあなんにしろFxCopの役割やわなあそれ
0897896
2007/09/24(月) 16:13:30privateで外部から触られる→ShouldSerializeProperty
0898デフォルトの名無しさん
2007/09/24(月) 16:30:00TextBoxの方にフォーカスが行ってしまいます。
普通にFormにもフォーカスを当てたいのですがどのようにすればよいのでしょうか。
MouseDownイベントでFocus()メソッドを呼んでも結果は同じでした。
0899デフォルトの名無しさん
2007/09/24(月) 17:15:050901デフォルトの名無しさん
2007/09/24(月) 20:29:11サンプルコードがあるHPとかありまつか?
0902デフォルトの名無しさん
2007/09/24(月) 20:37:14そんなことでいちいち報告されたらたまらん。
0903デフォルトの名無しさん
2007/09/24(月) 20:42:04蛇足な機能はちゃんと削除したという報告ですか
ごくろうさん
0904デフォルトの名無しさん
2007/09/24(月) 20:42:30それはあんたの発想の方が変だw
もしくは余程物を知らないか
0905デフォルトの名無しさん
2007/09/24(月) 20:46:390906デフォルトの名無しさん
2007/09/24(月) 20:59:17いつどのようなときにひつようなの?
ひらがなでしつれいします。
0907デフォルトの名無しさん
2007/09/24(月) 21:10:26論破!
0908デフォルトの名無しさん
2007/09/24(月) 21:11:42それがコンパイラの仕事かどうかはしらんがReSharperで警告してくれるよ。
VisualStudioのアドインね。
0909デフォルトの名無しさん
2007/09/25(火) 11:25:40中の人が何考えて外したのかは知らんが
0910デフォルトの名無しさん
2007/09/25(火) 21:16:15// 指定したファイルをオープン
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は解放していると思うのですが・・・どなたか教えて下さい。
0911デフォルトの名無しさん
2007/09/25(火) 21:20:05どこかの馬鹿がnull代入必要ないとか逝ってたけど嘘だぞ。
0912デフォルトの名無しさん
2007/09/25(火) 21:22:320913910
2007/09/25(火) 21:23:25回答ありがとうございます。
最後のところ
System.Runtime.InteropServices.Marshal.IsComObject(oExcel); //oExcel を解放
oExcel = null;
GC.Collect();
としたのですがやはり同じ現象でした。
0914デフォルトの名無しさん
2007/09/25(火) 21:24:42いや「どこかの馬鹿」が言ったのはReleaseComObjectなんてイラネ、でしょ。
しかし、ほとんど嫌がらせに近いコードだな
0915デフォルトの名無しさん
2007/09/25(火) 21:24:46oRange1
oWorkbook
0916デフォルトの名無しさん
2007/09/25(火) 21:26:17>oRange = ((Excel.Range)oExcel.Application.Rows["1:42", Missing.Value]);
とか
>oExcel.ActiveWorkbook.SaveAs(...
あたりに問題ありそう。変数にうけないとまずくない? Excel使ったことないけど。
0917デフォルトの名無しさん
2007/09/25(火) 21:28:450918デフォルトの名無しさん
2007/09/25(火) 21:28:50>GC.Collect();
は無視か?
俺の言ってる馬鹿ってのは…
0919デフォルトの名無しさん
2007/09/25(火) 21:32:300920デフォルトの名無しさん
2007/09/25(火) 21:34:270921デフォルトの名無しさん
2007/09/25(火) 21:37:320922デフォルトの名無しさん
2007/09/25(火) 21:38:24/// 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;
}
}
上記のメソッドをhttp://hanatyan.sakura.ne.jp/dotnet/index.html(VB版)を見てC#に置き換えたのですが
MRComObject(ref oSheet);とするとオブジェクトの変換ができない旨のエラーが発生します。
VBと違ってC#のobject型は何でも受けることができないのでしょうか?
0923デフォルトの名無しさん
2007/09/25(火) 21:42:28すみません。
System.Runtime.InteropServices.Marshal.ReleaseComObjectの間違いでした。
でも上記に修正しても駄目でした。
0924デフォルトの名無しさん
2007/09/25(火) 21:43:08あと2.0以降ならわざわざループせんでもFinalReleaseComObjectがある。
0925デフォルトの名無しさん
2007/09/25(火) 21:44:15試してないだろ?
0926デフォルトの名無しさん
2007/09/25(火) 21:47:09>>920
つまり
http://jeanne.wankuma.com/tips/programing/releasecom.html
0927デフォルトの名無しさん
2007/09/25(火) 21:47:11ファイナライザがあるオブジェクトの場合、
参照が消えてもGC.Collect()1回で回収されるわけではなく大体2〜3回後くらいになる。
目安として、1回目でファイナライザの実行予定としてリストされ、
2回目でファイナライザ実行、3回目でメモリ回収。
0928デフォルトの名無しさん
2007/09/25(火) 22:05:17FinalReleaseComObjectにしたらいけたよ。
0929デフォルトの名無しさん
2007/09/25(火) 22:07:45VBの場合Private Sub MRComObject(ByRef objCom As Object)なんですが
参照渡しじゃなくてもいいのでしょうか?
0930デフォルトの名無しさん
2007/09/25(火) 22:08:28他のアプリから使っていても大丈夫か?
0931デフォルトの名無しさん
2007/09/25(火) 22:12:03FinalReleaseComObjectですか!ありがとうございます!
0932デフォルトの名無しさん
2007/09/25(火) 22:17:26問題ない。
RCWからの参照をきるだけだから。
COMオブジェクトの管理する参照カウンタとは別。
0933デフォルトの名無しさん
2007/09/25(火) 22:21:35RCWの参照カウンタはCOMの参照カウンタとはべつものなのでその心配はない。
このソースだとoExcel.Application.ほにゃららを無駄に何度も呼んでるから、
ApplicationオブジェクトのRCWのカウンタが1より大きく増えてる可能性があるな。
つかReleaseComObjectを使うなら中間で取得したCOMオブジェクトは全部変数に入れとけ。
こういう書き方をすると捕捉出来ないオブジェクトが無駄に増えてるぞ。
>oRange.Copy(oExcel.Application.Rows["43:81", Missing.Value]);
0934デフォルトの名無しさん
2007/09/25(火) 22:26:59あとでReleaseComObjectする必要があるのはわかるか?
0935デフォルトの名無しさん
2007/09/25(火) 22:35:10プロセス分けてそっちでやらすか
0936デフォルトの名無しさん
2007/09/25(火) 22:35:51実際やってみりゃ分かると思うが。
0937デフォルトの名無しさん
2007/09/25(火) 22:39:49すみません。どうしてオブジェクトを返す事が分かったのでしょうか?
私はどんなオブジェクトが返る事が分かりませんでしたし、どんな
オブジェクトかも分かりません(;;)
0938デフォルトの名無しさん
2007/09/25(火) 22:46:110939デフォルトの名無しさん
2007/09/25(火) 22:48:40ならExcelのオブジェクトモデルが分かってないってことで、
それじゃお話にならんのじゃないかい?
0940デフォルトの名無しさん
2007/09/25(火) 22:55:55VB.NETにCOM専用の参照カウンタGCを搭載すれば問題の大半は解決すると思うのだが。
0941デフォルトの名無しさん
2007/09/25(火) 23:11:19すみません。VB6のときはあまり気にせずともできてしまったので・・・
オブジェクトはRangeが返ってくるのでしょうか?
0942デフォルトの名無しさん
2007/09/25(火) 23:19:22むしろこっち。
ttp://blogs.wankuma.com/jeanne/archive/2006/07/25/33568.aspx
0943デフォルトの名無しさん
2007/09/25(火) 23:20:06http://msdn2.microsoft.com/ja-jp/library/microsoft.office.interop.excel(VS.80).aspx
0944デフォルトの名無しさん
2007/09/25(火) 23:30:410945デフォルトの名無しさん
2007/09/25(火) 23:32:59もうちょっときれいに書けないか?
0946デフォルトの名無しさん
2007/09/26(水) 01:01:37Excel11 のタイプリブを使ったので若干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");
続く
0947946
2007/09/26(水) 01:02:46oExcel.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 を解放
0948946
2007/09/26(水) 01:13:16戻してるようなのでReleaseComObjectは不要だった。
もれなくReleaseComObjectするのはたいていのことではない。
あきらめてGCに任せるのもひとつの方法だと考えよう。
VB6ではなぜ出来る限り早くEXCELを開放してしまわないといけなかったか、
.NETではそれが必ずしも重要ではなくなったかの理由は以下を参照されたし。
http://pc11.2ch.net/test/read.cgi/tech/1189038267/37-38
0949デフォルトの名無しさん
2007/09/26(水) 08:17:10>oExcel.Quit(); //Excelを終了する
これって、まあもちろんエクセルの使われ方にもよるんだけど
ほとんどの場合、ユーザーの使い勝手の観点から言えば不要じゃないだろうか。
というか、こんなことするから「プロセスが残る」なんて問題が起こるんじゃん。
俺はこの手のコード見るたびに、世の中手を動かしてコピペするだけで
頭を使わない馬鹿が多いんだな、と思っちゃうよ。
0950デフォルトの名無しさん
2007/09/26(水) 11:07:33> oRange.Copy(..) はobjectを返すのでちゃんと変数で受けて
> あとでReleaseComObjectする必要があるのはわかるか?
試しに
ojject oTest;
oTest = oRange.Copy(..) としてみましたが
voidが返ってくる旨のエラーメッセージが出るのですが・・・
0951デフォルトの名無しさん
2007/09/26(水) 11:12:24ご教授ありがとうございます。サンプル例まで提示して頂いて感謝します。
0952デフォルトの名無しさん
2007/09/26(水) 11:32:16Excelのversionの違いかもしれんね。
boxingされたSystem.Bool、処理に成功するとTrueが戻ってるよ。
msdnでもobjectが戻ってくることになっている。ただし内容の説明がない。
http://msdn2.microsoft.com/ja-jp/library/microsoft.office.interop.excel.range.copy(VS.80).aspx
0953デフォルトの名無しさん
2007/09/26(水) 11:42:03回答ありがとうございます。色々難しいですね。
0954デフォルトの名無しさん
2007/09/26(水) 12:08:22使ったことがないのがみえみえじゃん(笑
Officeのオートメーションは操作自動化のためのインターフェイスで、
手で操作するのと同じことがCOM経由で出来るというもの。
マクロのようにApplication#Visible = trueの表示状態で使うのが本来の使い方なのだと思う。
つまり立ち上げたExcelは別途ユーザーに閉じさせる前提で起動したままにしておくということ。
ただ現実の使われ方はOffice文書を作ったり印刷させたりするため
非表示のまま使用することがほとんどであり、
ユーザーのニーズにOfficeのオートメーションの仕組みがあっていないといえる。
0955デフォルトの名無しさん
2007/09/26(水) 12:09:040956デフォルトの名無しさん
2007/09/26(水) 12:21:02>ただ現実の使われ方はOffice文書を作ったり印刷させたりするため
>非表示のまま使用することがほとんどであり、
なるほど確かにそういう使い方なら意味はある。というか必須だね。
ただそういう使い方が「ほとんど」かどうかは疑問だけど。
0957デフォルトの名無しさん
2007/09/26(水) 12:24:23ソースと同内容のコメントは余計だよなあ
0958デフォルトの名無しさん
2007/09/26(水) 12:53:25本来はという話ならVBAマクロやVSTOのように、
EXCELやWORDの機能を拡張するためのオートメーションなんだろう。
アプリケーションからEXCELを呼び出すのは方向が逆。
0959デフォルトの名無しさん
2007/09/26(水) 13:59:470960デフォルトの名無しさん
2007/09/26(水) 22:46:470961デフォルトの名無しさん
2007/09/26(水) 22:52:030962デフォルトの名無しさん
2007/09/26(水) 23:08:020963デフォルトの名無しさん
2007/09/26(水) 23:11:400964デフォルトの名無しさん
2007/09/26(水) 23:17:230965デフォルトの名無しさん
2007/09/27(木) 22:28:06sendkeys使える?
0966デフォルトの名無しさん
2007/09/27(木) 22:50:04フォーカス、アクティブ、sendkeysってどういうときに使うの?
0967デフォルトの名無しさん
2007/09/27(木) 23:22:38昔VB6とかからエクセル操作する場合には、操作する対象のオブジェクトは
かならず表示状態にして、かつアクティブにすべし、みたいなことが
「おまじない」的に推奨されてたから、それをいまだに信じている人がいるんだよたぶん。
某花ちゃんなんたらってサイトとか見てみるといいよ。
0968デフォルトの名無しさん
2007/09/27(木) 23:37:36ド素人にVB6でExcel操作させると、画面のリフレッシュとかプログレスバーの表示なんて処理を考えずに作るから
固まってるかどうか判別しにくくなるだろうから表示状態にするのは正解かもね
.netでも非表示にさせると偉い目にあいそう
0969デフォルトの名無しさん
2007/09/28(金) 00:28:17中身解析すれば手軽に直接ファイル生成ができると思っておk?
0970デフォルトの名無しさん
2007/09/28(金) 00:54:570971デフォルトの名無しさん
2007/09/28(金) 01:11:520972デフォルトの名無しさん
2007/09/28(金) 01:16:450973デフォルトの名無しさん
2007/09/28(金) 03:11:540974デフォルトの名無しさん
2007/09/28(金) 11:34:10ほんとにただのXML
0975デフォルトの名無しさん
2007/09/28(金) 12:12:010976デフォルトの名無しさん
2007/09/28(金) 13:40:480977デフォルトの名無しさん
2007/09/28(金) 14:17:55AutoScrollをtrueにしたPanelをDock.FillでFormに置き、
Panel.ClientSizeChangedでサイズを変更するようにした幅がPanelClientSize.Widthな
コントロールをPanelの中に置いたのですが、Formを最大化後に元に戻すと
ちゃんとClientSizeChangedが発生し、コントロールのサイズも変わってるにもかかわらず
横スクロールバーが表示されてしまいます。
コントロールのLeftは0で、横にスクロールしてもWidthがPanelのサイズをオーバーしてる
とは思えません。
WndProc()でWM_RESTOREを拾ってリサイズしても変わりませんでした。
このPanelの横スクロールバーを消すにはどうしたらいいでしょうか?
0978デフォルトの名無しさん
2007/09/28(金) 19:50:42とするとき、
object obj = new MyClass();
MyClass my = (MyClass)obj;
と
IMyInterface interface = new MyClass();
MyClass my = (MyClass)interface;
って速度変わらないですかね?
0979デフォルトの名無しさん
2007/09/28(金) 19:50:46直接ファイル生成できそう?
それとも無理?
2007使ってる香具師回答きぼんぬ
0980デフォルトの名無しさん
2007/09/28(金) 19:58:550981デフォルトの名無しさん
2007/09/28(金) 20:03:10asって値型だと型が合致しなかった場合はdefault(struct)になるんですかね?
0982デフォルトの名無しさん
2007/09/28(金) 20:33:06Nullableな値型ならnullが返される。非Nullableな値型ならコンパイルエラー。
0983デフォルトの名無しさん
2007/09/28(金) 20:45:28Office 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="http://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>
0984983
2007/09/28(金) 20:47:53テンプレートエンジンがあれば使えそうだ。
0985デフォルトの名無しさん
2007/09/28(金) 22:33:340986デフォルトの名無しさん
2007/09/28(金) 22:35:01互換パックすらいらないんじゃ…
0987デフォルトの名無しさん
2007/09/28(金) 22:35:420988デフォルトの名無しさん
2007/09/28(金) 23:11:50as キャストの方が早いの?
0989デフォルトの名無しさん
2007/09/29(土) 00:43:120990デフォルトの名無しさん
2007/09/29(土) 02:08:18asの方が早いし型が違う場合に例外が飛ばずにnullが返る。
キャストで型が違って例外が飛ぶと結構重いし。
でも、ダウンキャストしなくても済むようにインターフェースを作る方がいいんじゃない?
0991デフォルトの名無しさん
2007/09/29(土) 02:51:500992デフォルトの名無しさん
2007/09/29(土) 02:54:15asのが早いってそんな違いがあるの?
例外とぶって飛ばなきゃ使う側でNullReference〜になるかチェックが必要になるわけで
正しい型が入っているはず、という状況なら普通のキャストの方がまだ望ましい動きじゃないかい?
0993デフォルトの名無しさん
2007/09/29(土) 03:28:45正しい型が必ず入ってる場面ではチェックは不要なんだからasの方が速いのでasを使う。
違う型のものが入ってるかもしれない場面でダウンキャストするってのは何か作りがおかしいので考慮する必要ってあんまりないと思うよ。
0994デフォルトの名無しさん
2007/09/29(土) 03:41:11>as 演算子はキャストと似ていますが、変換エラーの時に、
>例外を発生せずに null を返す点が異なります。次に式の形式を示します。
>expression as type
>これは、次と同じ意味になります。
>expression is type ? (type)expression : (type)null
0995994
2007/09/29(土) 03:59:31IL_0002: isinst A
IL_0002: castclass A
0996デフォルトの名無しさん
2007/09/29(土) 04:09:220997デフォルトの名無しさん
2007/09/29(土) 04:15:580998デフォルトの名無しさん
2007/09/29(土) 06:59:24>何か作りがおかしいので考慮する必要ってあんまりないと思うよ。
だからこそキャストで例外になるようにするんじゃねーかよ。
まあNull参照例外でも似たようなもんではあるけど、
キャスト例外のがまし。
0999デフォルトの名無しさん
2007/09/29(土) 07:00:16asの方が早いってのは思い込みじゃねーのか?といってる。
1000デフォルトの名無しさん
2007/09/29(土) 07:08:03o is CLASS1 が o as CLASS1 != null と同じコードを吐いている。
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。