1 :
デフォルトの名無しさん :
2007/09/04(火) 11:20:46
前スレ999 やりたいことは int[] intData = new int[]{ 5,4,3 ]; これだけで済むと思うよ Console.WriteLine(intData[0]); //5 Console.WriteLine(intData[1]); //4 Console.WriteLine(intData[2]); //3 for(int i = 0; i < 3; ++i) { Console.WriteLine(intData[i]); } こんなふうにも出来る
もっというと int[] intData = new int[]{ 5,4,3 }; int[] intData2 = new int[4]; for(int i = 0; i < 3; i++){ intData2[i + 1] = intData[i]; } こんな感じかね
前スレのラストに来た質問、今読んだけど微笑ましいなw 自分のしたいことと、ポインタ/配列の概念がうまく結びついてない感じがする
多分動的に変数名を指定できるスクリプトから来たんだと思うなあ
7 :
996 :2007/09/04(火) 12:43:08
前スレ996です。
999を書いたのは私と別人なようで…。。。
>>3-4 回答ありがとうございます。
ただ…。やりたいことと微妙にズレがあります。
動的に変数名を指定という言葉が近いのかと思いますが、
for(int i = 0; i < 3 ;i++){
[intData + i] = i * 5;
}
といった感じに左辺を動的に指定したいのです。
> 動的に変数名を指定 変数ってのは入れ物であって、値じゃないのよ? ↓じゃダメなの? for(int i=0; i<3 ;i++) intData[i] = i * 5;
9 :
デフォルトの名無しさん :2007/09/04(火) 12:52:37
よろしくお願いします ListViewコントロール をdetailで使用しています。 したいことは、選択されたItemが、常にListViewコントロールの真ん中に表示できるようにしたいです。 矢印キーを押して、行をスクロールさせた時に、選択された行の下3,4行くらいも見える(コントロール内に出てくる)ようにするようにしたいということです。 Item数が少なく、Itemを構成する行がListView内に収まる場合は、すべてが見えてるので問題ありません。
>>7 >ただ…。やりたいことと微妙にズレがあります。
この手の質問ってC#スレで頻出なんですが
残念(に思われるのは996さんだけかもしれませんが)ながら
C#の仕様だと無理なのですよ。
もうみんなうんざりなので最短ルートとして「C#でどう書くか」が
提示されまくってるのをお察し下さいませ。
どうしてもっていうなら Dictinoary<string,int> でも使ってろってこったな
変数名がintDataで、その後に数字が続くだけなら、 配列で出来る。 配列はあらかじめ大きさを指定しなきゃならないので、 それがまずいときは List<int> list = new List<int>(); for(int i = 0; i < 3; ++i){ list.Add(intData[i] * 5); } 動的に大きさが増える配列であるListを使えば出来る。 後、変数以外の名前も指定したければ、その変数を持ったクラスを新しく作って、 そのクラスの配列やListを使う
13 :
996 :2007/09/04(火) 13:24:36
お答えいただいた皆さんありがとうございました。 色々と提示してもらえて助かりました。 どの方法を使うのかが最適か試してみます。
*頻出質問* ・コントロールを名前の文字列から取得したいんですが ・VB6みたいなコントロール配列ってどうやるんですか ・変数を名前で指定したいんですが ・フォーム間でデータを渡したいんですが ・イベントが発生しません。これはバグですね? ・参照型と値渡しと値型と参照渡しがよくわかりません><
>>10 > もうみんなうんざりなので
これからも頻出質問は出続けると思うのでそういうのをまとめたものを作りませんか。
答えるほうもそこへのリンクさすだけで手間無く済みそうですし。一挙両得
>>14 さんも挙げられてるようにこういうものがあればなと思われてる方も
少なからずいるのではないでしょうか。
よろしくお願いします。
>>3 996がやりたいこととは全然違うだろ。
とどのつまり前スレ999さんのいってる事の解決が事件をとく鍵だと思う
>>9 ListViewItem item = ほにゃらら;
item.EnsureVisible();
文字列からなんとしてでも変数を取得したい、 と思ってるやつにはどう答えたらいいんだろう。 それは間違ってるよ、と代替案を提示すべきなのか リフレクション使え、と突き放すべきなのか
C#は静的にコンパイルされてチェックされるのがいいところだからな 動的に変数名を文字列で指定しなきゃならないようなケースは普通ないし そういう場合にはリフレクションなりDictionaryなり使えという話になるな
>リフレクション使え それはないだろ
それはない
>>15 そんなのいらん
このスレは質問者がある特化した質問をして、その特化したシチュエーションに対応する回答を
スレ住人がしてくれるから存在価値があるんだろ
つか、大抵はググれば済むんだから…
動的にクラスを生成しろという話になるのかな やりかた知らんけど
>>18 もう一段前があって、多分こんな感じなんじゃないかな。
1.ループを使えば綺麗に書けるのに
2.ピコーン 「文字列から変数が取れれば解決じゃん?」
3.やり方わかんね -> 2ch
「ループを使えば綺麗に書けるのに」というときの定石には
言語ごとにかなりクセがある。
C#だとそれは最初からループ対応の変数(配列とかListとか)を使うであったり
アクセス用のメソッドを用意するであったりするわけだ。
一方で緩い言語では変数の名前空間自体が一種のDictionaryになっていて
命名ルールを工夫するだけで複数の変数をループ処理できるものもある。
そこまで緩くないC#としては、
「C#でループを書くときの定石を学べ」か
「.NETの機能を駆使して自分でパターンを作れ」になるんだろうなぁ。
>>22 すんませんでした。
”頻出質問”に”うんざり”ということだったので、
あれば便利かなと思って先走ってしまいました。
それではみんなでれっつうんざり!
つーか普通配列で十分だしな なんでそんなことやろうとしてるのかわからん。 あおり楽しかったけどw
ぶっちゃけ、なんかニヤッとする面白い質問だた
class MyObjectBase { public IDictionary<string,object> Properties{get;}; public IDictionary<string,Delegate> Methods{get;}; } もう全部これを継承するようにするとか
こんばんは。 早速ですが質問させていただきます。 C#を用いてExcelを扱うアプリを作ってるんですが 既存のシステムにはCOMを使用し、直接Excelを開いてRangeオブジェクトを ToString()などして値を取得していたんですが、先輩曰くそのやり方は非常に駄目だから VBS使えといわれました。 Excelのデータはデータベースに入れてるんですが VBSを用いて同じことしたいんですがどのようにすればいいでしょうか。
VC#2005で開発しているのですが VScrollBarをフォームにくっつけているのですが 上下左右キーを押した際にスクロールバーにフォーカスを 持って行かれてしまいます。これを回避することは可能でしょうか。 フォームでキー処理をしたいのですがフォーカスをVScrollbarに取られてしまい キーイベントが来ないので困っています。
---色々--- 上 ---Panel--- | ---Form--- 下 とか?
KeyPreview = Trueで普通にいけるでしょ。
33 :
30 :2007/09/04(火) 21:05:55
フォームのIsInputKeyをoverrideすることで解決しました
アクセスキーにFunctionキーを割り付けるにはどうしたらいいですか? お願いします。
>>29 確かにc#だと上手くやらないとゴミ残りまくり。
VBSの使い方?
すれ違い
>>34 アクセラレータ キー?
ショートカットキー?
[intData + i.ToString()] ってどの言語?
何の言語かはわからんがC#コードの一部としてでも有り得る
そういうコードってスクリプト言語の宣伝によく使われる感じがするけど C#でそういうのはほとんど見かけないよな
D言語でもつかってろよ
スクリプト言語では変数名の後に整数の変数を文字列化したものをくっつけて 配列の変数のように使うことも多い
41 :
34 :2007/09/04(火) 23:56:16
>>35 ショートカットキーです。
でもアクセラレータキーも教えてください。
調べたら「便利だな」って思いました
DoubleBufferedプロパティを有効にすれば Paintイベントをバックバッファでやってくれるからちらつかない なんて聞いたんでTrueにしてみたがFalseのときよりちらつくようになった 漏れ、だまされたんでしょうか? それとも手法がいけないんでしょうか?
片方のバッファにしか描いてないんだろうw
つか、OnPaintの外で描いてる?
ふと思ったが、PaintEventArgs e の e.Graphics 使ってる?
CreateGraphics()とe.Graphicsじゃ結果が変わるね
ッタリメー
ダブルバッファの有効範囲をきちんと理解してないからだろう。 コントロールのと描画の範囲は抑えておきましょう。
全画面で実行される別アプリ(ゲーム)の補助ツールを作ろうと思うのですが その別アプリが例外エラーで落ちるときに、エクスプローラのタスクバーが消えたままになってしまうため、 それを常駐させておいた補助プログラムで自動的に検出して、タスクバーの復帰を解決しようと思うのですが、 これらの処理について調べるには、どのようなキーワードで検索すれば良いでしょうか? 稚拙な質問ですがよろしくお願いします。
50 :
デフォルトの名無しさん :2007/09/05(水) 12:32:51
>49 例外で落ちてタスクバーが消える事が問題なんじゃない なぜ例外をキャッチしてないのかと問いたい
何か障害が発生した場合、最初にすべきことは原因の特定。
>>49 は、障害を覆い隠すのではなく、障害の原因を特定し、その解決を考えてみるべきでしょ。
別アプリの例外とかキャッチ出来るの?
ましてゲームと書いてあるのにw
54 :
デフォルトの名無しさん :2007/09/05(水) 12:40:30
>52 だから本アプリでキャッチしようよ。 触れない理由でもあるんかな?
>全画面で実行される別アプリ(ゲーム)の補助ツール よく読みましょう。
56 :
デフォルトの名無しさん :2007/09/05(水) 12:43:22
>55 いや、読んだ。だから別アプリが問題だっていってるわけだが?
57 :
デフォルトの名無しさん :2007/09/05(水) 12:45:01
本当はチートツールですちゃんと嫁
58 :
デフォルトの名無しさん :2007/09/05(水) 12:46:34
>57 そうか、なら死ね
59 :
デフォルトの名無しさん :2007/09/05(水) 12:50:22
うるせぇ解決策だせもしねえでお前がしね
60 :
デフォルトの名無しさん :2007/09/05(水) 12:54:12
>59 DirectX SDK でぐぐれ馬鹿
>>49 explorer.exeのプロセスを定期的に調べて死んでたら起動するとかでは?
消えたタスクボタンを復活させるフリーソフトがあったような。
63 :
49 :2007/09/05(水) 14:00:02
>>56 別アプリはあくまでも別(ゲームなのでソースは公開されてない)なので、
どういう原因で例外が発生しているのかはタイミングを含めてほとんど不明です。
なのでその不慮の自体からの回避をするための補助ツールをと思いまして。
>>57 ,58
結果的にチート扱いになってしまうかも分かりませんが、今回はタスクバーの
表示回復だけが目的です。
>>60 ググって見ます。
>>61 explorer.exeは生きてる状態で、タスクバーが消えてる以外は問題なく動いています。
(Windowsキーを押すとスタートメニューが表示されます。)
>>62 その機能を、補助ツールを常駐させることで自動的に回復したいのです。
64 :
デフォルトの名無しさん :2007/09/05(水) 14:05:36
>63 もう一度ゲームを起動して正常終了してもタスクバーは消えたままですか?
>>60 はノイズだよ
そんなんぐぐっても何も出てこんぜ
66 :
デフォルトの名無しさん :2007/09/05(水) 14:08:32
>65 いや出てくるが?
67 :
49 :2007/09/05(水) 14:11:52
>>64 その場合はタスクバーも表示されています。
プロセス終了時にShell_TrayWndかなんかがVisibleか調べて 表示させればいいんじゃない
>>63 んーじゃあ最初にタスクバーのハンドルを取得して
非表示になってたらShowWindowするとか。
非表示じゃなくて存在自体なくなってたらexplorer.exeをkillして再起動とか。
後者はあまり好ましくないかも知れんがやむを得ないと思われ
>>68 ,69
ありがとうございます。
その方法で調べて試してみます。
>>69 確かにexplorerのkillは最終手段ですね^^;
71 :
デフォルトの名無しさん :2007/09/05(水) 15:29:47
>67 DirectXで画面にクリア処理 それで終わるよ
>>45-46 CreateGraphics()で書いてました
e.Graphicsじゃないといかんのですね
ありがとうございました
どういたしまして^^
74 :
デフォルトの名無しさん :2007/09/05(水) 17:13:21
>72 ヒント 最大化 最小化 createグラフィックが正解 あとはわかるね
>>49 そのゲームの作者かメーカーに修正依頼するのが筋じゃねーの
それが作者は昨年死亡したもので・・・
77 :
デフォルトの名無しさん :2007/09/05(水) 18:00:09
owata
ユーザーコントロールのプロパティに独自に作成したクラスの配列を指定する方法を教えてください。 コンパイルは通るけど、プロパティで設定した値が保存されません。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;} }
>>78 このコードでちゃんと値取れたが、Testへはどうやって値入れてるんだ?
80 :
デフォルトの名無しさん :2007/09/05(水) 20:31:28
エロビデオ専用のプレイヤー作りたいのですが ムービー再生の命令ってありますか?
命令^^
82 :
デフォルトの名無しさん :2007/09/05(水) 20:34:37
何か間違ってますか?
>>79 ユーザーコントロールを新規のフォームに配置 ⇒ プロパティシートから設定しています。
>>80 すまんが、エロビデオのモザイク除去コマンドしか知らね
他スレを当たってみてくれ
そして二度と来んな
86 :
デフォルトの名無しさん :2007/09/05(水) 20:54:57
知らないならレスしないでください!
>>84 ???
プロパティシートからどうやって?
string?
>>85 くだらねぇ
面白いと思ってんのか?
お前が二度とくんな
89 :
デフォルトの名無しさん :2007/09/05(水) 21:17:37
>78 そのSET処理にメッセージボックスを置けばすぐ解るよ
90 :
デフォルトの名無しさん :2007/09/05(水) 22:41:50
C#で String型で誕生日が入っている場合 その誕生日から現在日付を計算して 年齢を取得するにはどうすればいいのでしょうか? つまり誕生日が "1991/09/06"の場合 今日実行すれば、15歳を表示 明日実行すれば、16歳を表示
プロパティシートから?プロパティグリッドのことか?
>>90 DateTimeにパースして
現在の年月日と比較したら?
93 :
デフォルトの名無しさん :2007/09/05(水) 22:58:46
>>90 こんなかんじか?
string tanjyo = "1979/01/27";
DateTime dt = DateTime.Parse(tanjyo);
TimeSpan ts = DateTime.Now - dt;
int nenrei = (int)ts.TotalDays / 365;
MessageBox.Show(nenrei.ToString());
閏年は?
年と月日を別々に比較しないとだめぽ
Calendarがやってくれない?
98 :
72 :2007/09/06(木) 00:38:06
Paintイベントで CreateGraphics()で描いていたのを e.Graphicsを使って描いてDoubleBufferdをTrueにする事で ダブルバッファリングを有効にすることができましたが 意図的にPaintイベントを発生させたいときに Paint(null,null)で呼び出していた手法が使えなくなってしまいました (PaintEventArgs e が nullになってしまうため) 何かいい方法はないでしょうか?
>>98 そういうのは
・スレッドをブロックして即座に描画するんならControl.Refresh
・非同期的に描画するんならControl.Invalidate
を呼ぶ。
通常は後者
>>99 嗚呼、Refreshでよかったのか〜
Invalidateは初めて知りまつた
ありがとうございました
年齢は前日でプラス1だよ
Refresh は、 Invalidate して Update してる
103 :
デフォルトの名無しさん :2007/09/06(木) 09:51:03
>>101 あれ、満年齢って誕生日の前日に数えるんじゃなかったっけ?
104 :
デフォルトの名無しさん :2007/09/06(木) 10:01:26
>>101 すまん、前日+1と読み誤っていた。
前日でプラス1、その通りでございます。
105 :
デフォルトの名無しさん :2007/09/06(木) 10:06:16
VC#2005を使って簡単なブラウザを作りたいんですけど、とりあえずFormに textboxやbuttonとか貼り付けて、buttonの名前を「移動]「戻る」「進む」と 名づけたんだけど、そのボタンにどうやったらその機能を付けたらいいのかが わからないんです。 navigate()やGoback()などのメソッドを使うことは分かったんだけど、実際に どのように記述すればいいのか…
>>105 レンダリングエンジンを自作するつもりでなければ、
WebBrowserコントロールを貼り付ける。
あとはWebBrowserコントロールでググればいろいろ出てくるだろ。
108 :
デフォルトの名無しさん :2007/09/06(木) 10:48:33
>>107 おおっ!ありがとうございます。
参考になります♪
>>87 >>91 プロパティグリッドというのですかね。正確な名称はわかりませんが、
コレクションエディタ? でメンバを追加しています。
>>78 メンバを追加してもメッセージは表示されません。。
110 :
109 :2007/09/06(木) 11:41:39
CollectionBase を派生させたクラスを使用すればよかったみたいですね。 お騒がせしました。
111 :
デフォルトの名無しさん :2007/09/06(木) 11:55:36
>>107 のサイトを見て一応作ったんだけど、この場合だとcomboBoxのプロパティitemに
登録したサイトのみ閲覧できるってことなんですよね?
そうではなくIEみたいにアドレスや検索語をtextBoxに入力して移動buttunを押せば
そのページに飛ぶようなブラウザをつくりたいんですけど、どうすれば…?
どのようにメソッドを記述すればいいんでしょうか?
取りあえず、いきなりブラウザじゃなくて普通に 簡易なソフトを組むところから始めて見た方が良いのでは…。
いきなり自分だけで作ってみるよりも、VisualC#入門 みたいな書籍やサイトを回って 軽く練習してからの方が早いよ
応用のきかないやっちゃ
>>113 嫌です
というかウェブブラウザ以外以外作るきはないんです
一度きりのプログラミングなので知る必要はないと思います
ってまあ騙りなんだろうけど、釣られてみたw
118 :
デフォルトの名無しさん :2007/09/06(木) 12:18:10
誰だって初めからできるわけじゃないでしょが!!
これが所謂ゆとりってやつかね。
120 :
デフォルトの名無しさん :2007/09/06(木) 12:42:18
中身がわからないもの作って何が面白いんだろうか もし入門書を読むのが苦痛ならプログラマには向いていないってことだよ
webBrowser1.Navigate(comboBox1.SelectedItem.ToString()); ↓ webBrowser1.Navigate(textBox1.Text); がんばれ
122 :
デフォルトの名無しさん :2007/09/06(木) 13:39:40
えー、苦痛ならほんとに向いてないでしょ
入門書を読むのはまあ苦痛だろう。
苦痛じゃなくなるのは程よく慣れて思い通りになってくるだいぶ後の話だ。
苦痛だと思ったらプログラマに向いてないなんてちょい言い過ぎ。
>>115 を読むとこいつは人間的にどうかと思うがな。
というか騙りじゃなけりゃ、スキルなくてやる気もないんだから発注しろよって話だな
webBrowser1.DocumentText = "<html><body></body></html>"; HtmlElement he = webBrowser1.Document.Body; if (he == null) { MessageBox.Show("error"); return; } he.InnerHtml += "a"; これを行うとhe==nullがtrueになってしまいます。 Bodyを取得するにはどうしたらよいのでしょうか?
128 :
デフォルトの名無しさん :2007/09/06(木) 17:39:16
よくgenericの例の説明で Swap<T>(ref T,ref T); なんてのがありますけど、 実際にSwapクラス?ってどこかの名前空間にあります?
普通に自作のジェネリクスメソッドじゃね?
130 :
128 :2007/09/06(木) 18:13:49
いやまぁ作るのは簡単なんだけど・・・ 誰が作っても同じだし、汎用的な処理なんであるに決まってると思い込んでた
そんな事までクラスで面倒見ないといけないのか・・・?
使わないだろ 欲しいと思ったことも無いなSwap
コルーチンの説明でフィボナッチ数列求めるようなもんだろ。
134 :
128 :2007/09/06(木) 18:53:26
あぁ、そうか C#みたいな言語では例外安全とかあんまり考えなくていいのね だからSwapも要らないと
考えなくていいわけじゃないけど Swap1こだけあってもそんなにありがたくないような気がする そういうの集めたライブラリとかなら知らんが。
ていうかどのレベルで考えるかによるけとな。 Swapだけそんなに安全に使えてもあんまり意味ないし
例外安全も考えたこと無いな GCされるだけだし、 構造体のコンストラクタでは例外投げられないし
例外安全ってどういうこと? 例外が発生するかどうかはこの場合関係ないような気がするけど・・・ 誰か詳しい人教えて
>138 OutOfMemoryExceptionやThreadAbortExceptionみたいな いつでも起きうる例外もあるから。 例えばAPIでMutexを作って変数に代入する前に例外が起きたりして解放する機会を失ったりとかすると致命傷になる。 swapなら何かのIntPtrを例外安全に入れ替えたいときに必要なのかもしれず。C#使っててそんな機会はまずないかもしれないけど。 まぁ、ThreadAbortExceptionなんかAbortを叩くやつが悪いと思うし 本当のメモリ不足のOutOfMemoryExceptionは例外安全を考えるまでもなく復旧できないだろうし こいつらはあんまり考えなくてもいいかもね。 他にいつでも割り込んで起きうる例外ってあったかなぁ?
例えば片方入れ替えたところで何らかの例外が発生してしまうと、 変数の状態が不正になる ローカル変数とかは普通に書いてりゃ問題ないけど 寿命の長いオブジェクトのフィールドだったりすると 例外が起こった処理以外に影響を与えてしまう。 まあ可能性は普通ものすごく低いので ここまで考慮することはまあそうそうないけどね。 本当にクリティカルなオブジェクトだったりすると そこまで考えなきゃならないこともあったりはする 普通はコード上で想定される例外くらいの考慮でしますけどね Swapは普通問題が起こるのはまれな部類なので そこまで考慮しないのがほとんど
例えばASP.NET環境だと、処理に時間がかかりすぎると スレッドがアボートされるので 思いもよらんところで例外が発生する可能性はある そこまで考慮するかどうかはまた別の問題だが。
どうでもいいし脇道なんだがCERあるのでその辺は「いつでも」は起こらない 2.0になる時に信頼性に関してはかなり手を加えられてたりする、ひっそり まあSQLサーバーのせいだろうけど。
だいたいアンマネージが絡むようなところか セキュリティ上まずいことになる可能性があるところくらいかな ロックなんかが関わってくるところもあるかもしれない
>>142 それはつまりちゃんと対応した場合の話じゃないの?
ってか対応しる手段としてそういうのがあれ
Compact上でのWebResponseの質問なんですが、 WebRequest.Create()でWebRequestを作成した後、GetResponse()で WebResponseを作成するまではいいのですが、ファイルをダウンロード後に Close()しようとしてもなぜかそこでハングしてしまい、WebResponseを閉じる ことが出来ません。試しにGetResponseStream()で取得したStreamの方を Close()してみたのですが、こっちの方でもハングしてしまい止まってしまいました。 ダウンロード対象はファイルとストリーミングデータ両方です。 何かヒントだけでもいただけないでしょうか?
146 :
138 :2007/09/06(木) 21:22:42
>>139-140 なるほどー。そういう問題があったとは気づかなかった。
でもSwapをメソッドにしてもそういう問題は変わらないんじゃない?
それともInterlockedクラスみたいに内部的な処理として実装するって意味なのかな
>>127 判らないけど処理に時間がかかるんじゃないか。
そういうことでしょう。
>>146 そういうことでしょう。
のつもりだったのですよ。
すみません。どれが自作自演でしょうか?
いや、多分、C++では例外安全なプログラムを書くためには Swapが頻出するから、そのメソッドが用意されてないのはなんでじゃろ、 といった程度の話じゃないのかな C++だとSwap以外のほとんどの処理が例外を投げる可能性があって大変らしい StackのPopにいたっては例外安全に記述する方法がないという
>>145 Compactは知らないが、その手のコードはあちこちにある。
それで試したら?
つーかストリーミングの処理はどうやってるのか非常に興味ある。
出来てなさそう。
そりゃそうだろ。 メモリだって100%確実に書き込みできるわけじゃないし。
>>152 PC上で同じコードを実行した場合はハングせずに切断できるので
多分Compact上でやるのがいけないのか、CE機の方に原因がある
のかもしれません。
一応探してみます。
ストリーミングといってもただフレーム単位で流れてくるmp3を
スレッドに分けてConnectStreamから読んでるだけなんですけどね orz
>>151 C++のstd::swapもコピーコンストラクタの実装によっては例外が出ると思うけど・・・
そういうことではない?
c++のスレでどうぞ。
変数名+1という式を実行したいのです すなわちなぜ数字の1と文字列型の1が存在し区別する必要があるのかということです? すごく面倒です
ツマンネ
釣れますか
ゴメンネ
野郎なのに女とはこれいかに
Mutexを使って多重起動を抑止したのはいいんだが ・多重起動してるかチェックしたときにすでに同じEXEが起動してた ・かつ起動済みのEXEが最小化されてる こんなとき、すでに起動済みのEXEのほうの最小化を解除することは可能?
可能だな
>>164 プロセス間通信する必要がある。
IpcChannelとかその辺
168 :
デフォルトの名無しさん :2007/09/06(木) 23:23:12
まあでもchar型の数値と整数型の数字があるって不思議だよな! たとえばprintに渡せないし プログラムしない人にはわからないと思うぜ
>>167 なにその参考先
二回目以降に起動したやつは存在するプロセスに通知するだけにすればいいのに
158==168?
171 :
デフォルトの名無しさん :2007/09/06(木) 23:34:13
int iに年代を入れてカレンダーを作るプログラムを作ったんだけど、 もし i におかしな数字を入れられた時はもう一度入力させるようにwhile文でまわすつもりが、 数字じゃなくてaaaaみたいな文字列を入れられて延々ループが始まってしまいました。 これを防ぐにはどうしたらいいですか?
>はもう一度入力させるようにwhile文でまわすつもりが 意味分からんからコード書いてみ
どのような処理か分かりかねるけど、普通はループ中に条件変わらなければ ループ入る前に評価するのでは?
>>173 int i;
scanf("%d",i);
while( i>1 || i<9999 )
{
printf("もう一度入力してください");
scanf("%d",&y);
}
こんな感じです。
176 :
デフォルトの名無しさん :2007/09/07(金) 00:54:14
あ、すいません 最初のscanfの括弧内のiの前に&書き忘れです。
たびたびすいません・・・・ whileの条件の不等号が逆です・・・
Cかよ
つーかなんで1個目のscanfはiで2個目はyなの
1<i<9999 なら無限ループしたいの?
182 :
175 :2007/09/07(金) 01:03:59
>>180 ぐは;・・・・ちょっとミスしすぎですね。。
yはもともとのコードをyで書いてたんでその癖でそのまま書き写してしまいました・・・
184 :
175 :2007/09/07(金) 01:06:45
>>181 すいません、i<1 || i>9999 の時に正しく入力されるまでループさせたいんです。
でもaaaaなどの文字列を入れられてしまうとなぜかバグみたいに”もう一度入力してください”が延々流れ続けるようになってしまうんです。
scanfじゃね?と冗談で書こうとしたらマジかよ
186 :
175 :2007/09/07(金) 01:07:30
すいません、失礼いたしました。
まあまあどうせ暇なんだし答えてやろうぜ。 ってかすでに無限ループする以外の選択肢しかないだろこれはw
>>186 いや構わんよ
自分はCのスレにも居るから何かあれば遠慮なく聞いて
こんな感じのソースじゃなくてそのものがないとなんともいえんな 処理自体は間違ってないように見える
scanfってこんなんだっけ もうすっかり忘れてるなw なるほどこれはダメだ
こういうの見るとC#やっててよかったと思うわ>scanf
scanfのfってなんですか?
フォーマットのfじゃね? scanf 懐かしいな、講義で教わったときは「使うな」だったけど。
教えといて使うなってのもなw まぁ知らなきゃ使ってしまうかもしれないし当然だが
ファイルの保存ですがオブジェクトを複数個リストにいれてそれを保存なんてことできますか? 取り出し方が思いつかないですけど
シリアライズでぐぐれ
前スレの透過キー問題、結構重要じゃね? リサイズが出来なくなるのは仕様で済ましちゃ問題あると思うんだが。
24bitバグが絡んでると思ったが16bitでも発生するみたいだ
これ釣りですから
?
202 :
デフォルトの名無しさん :2007/09/07(金) 09:54:42
誤爆に10ゲイツ
>>197 正直だめもとで質問したのですが便利なものがあるんですね。難しいけど
ありがとうございました
あるプロジェクトがマネージドなのかアンマネージドなのかを判別する方法あるのでしょうか? 単純に、DllImportなどを指定して、WindowsのAPIとかを呼び出すコードが混じっていたら、 アンマネージドになるのであって、 明示的に、VisualStudioのビルドプロパティのどっかにフラグで指定されているわけでは無いですよね?
プロジェクトファイルの拡張子からして違うように見えるのは俺の気のせいか?
C#(というか.NET)で作ってたらDllImport使ってようとunsafe使ってようと マネージドには違いないだろ
>>204 >DllImportなどを指定して、WindowsのAPIとかを呼び出すコードが混じっていたら、
>アンマネージドになる
ならなねーよ
>>204 アンセーフとごっちゃにしてない?
アンセーフかどうかならプロジェクトのプロパティにあるよ
Win32APIはたしかにアンマネージだが呼び出し側がアンマネージになるわけではない
210 :
デフォルトの名無しさん :2007/09/07(金) 14:59:23
文字列の配列またはListの要素を結合する方法ってありますか? arrray.Joint("区切り文字") 見たいなメソッドがあれば一番良いのですが。。。 今はループで回して+=で結合してるのですあ、もっと良い方法がないかな、と思って
Strings.Join
String.Join
>>210 ちなみに要素数にもよるがループ中で文字列連結はよくない。
要素数だけゴミ(一時オブジェクト)が生成されるので。
そういうときは代わりにStringBuilderを使う。
文字列の連結は今回は関係なおのでは
215 :
213 :2007/09/07(金) 15:18:40
>>214 まあ関係ないけど、一応言っといて損はないでしょ
要素数があらかじめ決まっているならstringの方が最適化されて効率がよくなるらしいよ
>>216 それは"a" + "b" + "c"がstring.Concat("a", "b", "c")になるというだけでは?
ループの連結では関係ないよ
ループでも回数が決まってれば展開される最適化が行われることがあるだろ そしてstring の += が全部一つにまとまってちょっぱやになるだろ
219 :
204 :2007/09/07(金) 16:33:10
皆様、確かにアンセーフとごっちゃにしていました。申し訳ありませんでした。 多分、以下のようになります。 アンマネージ : 昔のDLLなどがアンマネージコード。 .NETから呼び出しても、呼び出した側はマネージドコードのまま。 アンセーフ : ポインタなどを使ったコードで、unsafe{}句で記述する。 ビルドプロパティで許可の設定をしないとビルドエラーとなる。
>>218 なんねーよ
ループの展開ってどれだけ膨大なコードになるんだw
JITでループが展開されることはあるんじゃなかったっけ まあstringの連結の展開には無関係だけど
繰り返し構造が3回以内なら展開される
最小化されているFormを元の状態に戻すにはどうしたらいいんでしょうか? もとの状態が最大化だったら最大化した状態に戻したいのですが。
ShowWindow( hWnd, SW_RESTORE );
>>224 どうもです。
やっぱWin32APIを使わないと無理なんでしょうかね?
なんでだよw 要は最小化される前の状態を「覚えて」おけばいつでも元に戻せるだろ? 小学校1年生でもわかる理屈だと思うけど
227 :
223 :2007/09/08(土) 02:29:21
>>226 そうなんですけど覚えておける状況にあるとは限らないんで。
228 :
155 :2007/09/08(土) 02:37:48
すいません、詰ったのでもう一度質問させてください orz あの後、いろいろ実験したのですが、どうやらファイルを完全にダウンロード完了しないと 回線が切断されないようで、単品のファイルをダウンロードする場合はちゃんと切断できるの ですが、ラジオ放送などの終わりがいつになるかわからないものだと放送が終了するまで 切断できないようです。 ですが、さすがにそれだと通信帯域的や、コネクション数の制限的にまずいのでどうにかして 切断したいのですが、どうしたらいいでしょうか?
適当に強制Closeしてやりゃいいんじゃねーの?
>>229 usingで囲ってるのですが、どうしてもそうするとClose出来なくて
ハングしてしまい抜け出せません orz
スレッドを作ってその中からClose
232 :
デフォルトの名無しさん :2007/09/08(土) 18:04:50
>>223 ウインドウステートプロパティで
最大化か最小化か普通か取得できるからそれみて
最小化されてたら設定かえてやるだけでよくね?
まあ、「覚えておけない状態」っていうのがどういう状態のことなのか 227に聞いてみたいものだねw
234 :
デフォルトの名無しさん :2007/09/08(土) 18:26:45
>>231 スレッドは嫌韓雑誌なのでNGです
テコンダー朴がすごすぎです
235 :
デフォルトの名無しさん :2007/09/08(土) 19:00:06
C#を無料で入手できるサイトってありますか?
>>235 ネタ?
.Net framework sdkかC# Expressで検索。
237 :
223 :2007/09/08(土) 19:27:09
>>233 単に対象のフォームを作成時から面倒みれるわけではないというだけです。
まあライブラリ的なもんだと考えてもらえばわかりやすいかと。
>>232 元の状態がわからないのでそれではできないです。
Form.WindowStateプロパティで取れるっていってんだろうがボケナス
239 :
223 :2007/09/08(土) 19:48:34
>>238 いや、だから現在の状態は取得できても元の状態は取得できないんですが・・・
240 :
デフォルトの名無しさん :2007/09/08(土) 19:51:06
なら元の状態を記録しておけよ?
241 :
223 :2007/09/08(土) 19:59:41
223はプログラマ向いてないんじゃないか? なんかネタじゃなさそうだし....
ズレてるのは
>>238 だろ
public void RestoreWindow(Form f) {
if (f.WindowState == FormWindowState.Minimized) {
//
}
}
これをどう書くかって話だろ?
まあ多分ShowWindow使うしかないと思うけど。
なんで事前にインスタンスを登録しとく形ではダメなの?
きっと「クラス」ライブラリという考え方が理解できないのでしょうw ライブラリといえばスタティックメソッドのことだと思い込んでるんだよ
246 :
デフォルトの名無しさん :2007/09/08(土) 20:24:05
C#で各プロジェクト共通に使えるクラスを作成して そのクラスをまとめて格納するフォルダを作りました。 それを別フォルダにあるプロジェクトからそのフォルダにあるクラスを プロジェクト→既存項目の追加で追加すると同じプロジェクト内の フォルダへコピーされてしまいました。 やりたい事はコピーでなくその共通フォルダにあるクラスそのものを参照して 共通フォルダのクラスを変更するだけですべてのプロジェクトが修正されている 仕組みにしたいのですがやり方がわかりません。VB6なら汎用モジュールを格納する フォルダを作りその中のファイルをIDEで追加するとできたのですが・・・ コピーされてしまうと各プロジェクト分同じファイルができてしまい メンテナンスが大変になりそうなので・・・ どなたか、共通ファイルを複数プロジェクトで共有する方法を教えて下さい。
追加するときのファイルダイアログの「追加」ボタンの右の三角をクリック リンクとして追加(だったかな)を選ぶ DLLにした方がいいと思うけどね
>>246 プロジェクトとリソルーションの区別がついてないと見た。
まずはそれを理解するのが先決だと思う。
249 :
デフォルトの名無しさん :2007/09/08(土) 20:29:56
>>246 共通ファイルをクラスライブラリーにしてそのDLLを各プロジェクトで参照すればいいんじゃね
250 :
223 :2007/09/08(土) 20:41:52
>>243 大体そんな感じです。やっぱAPI使うしかないですね。
>>244 API使えばわざわざそういう方式にする必要もないので。
>>245 ライブラリって言葉はまずかったですかね?
でもそれはあくまでも補足で、その前の一行を読めば十分わかると思ったんですけどね。
まあというわけでWin32APIを使うことにします。
どうもありがとうございました。
>>246 共通に使えるクラスを集めたプロジェクトを作って
そのプロジェクト自体をソリューションに追加するといいよ
ファイルを直接参照するんじゃなくてDLLができちゃうけど気にするな
DLLの存在は全く意識せずに扱えるようになってるから
>>250 馬鹿なくせに頑なお方だねえw
>その前の一行を読めば十分わかると思ったんですけどね。
じゃないよw
何もわかってないのはお前さんの方。
君のような性格の奴はぜったに伸びないよ。
>>251 246が望んでいるのは、恐らく複数の「リソルーション」から同じクラスライブラリを
参照することで、君がいっているようなこととは微妙に違うと思うよ。
ごめん ×リソルーション ○ソルーション(ソリューション)
254 :
251 :2007/09/08(土) 20:52:55
>>252 >複数の「リソルーション」から同じクラスライブラリを参照すること
いやその意味で言ったんだ
>>251 の「そのプロジェクト」は利用側じゃなくて
「共通に使えるクラスを集めたプロジェクト」を指してるつもりだった
255 :
デフォルトの名無しさん :2007/09/08(土) 21:07:43
このスレッドは 「どんなにくだらないC#プログラミングに関する発言でも誰かが優しくレスをしてくれるスレッド」です。
>>256 君223か?あるいは
>>243 ?
このレベルのことが理解できなお馬鹿がそんなに多いとも思えない。
まあこれ以上騒がれてももうっとうしいから
一応簡単に223のどこが「馬鹿」か書くことにする。
223は、フォームが最小化される前の状態がわからないからできない、
と言っているがこれは愚かな発言だ。
わからない(不可知)なのではなく、223にわかるようなコードが書けないだけだ。
「わかる」ようなコードを書けよ。
>>257 くだらない質問をするのは問題ないが、無知を認められない頑なさ故に
自ら答えを知ろうとしない人間をなだめすかして手取り足取り教えてやるほど
誰もお人よしじゃないだろ。
おまえら、もうほっといてやれよ これから相手にしたやつも同じくらいバカってことで↓
>>258 放置できないんなら君もヽ( ・∀・)人(・∀・ )ノナカーマ
261 :
デフォルトの名無しさん :2007/09/08(土) 22:07:01
つーか ShowWindow( hWnd, SW_RESTORE ); と fm.WindowState= FormWindowState.Normal; って挙動いっしょじゃないのか?
262 :
155 :2007/09/08(土) 22:36:19
>>231 返信遅れてしまってすいません。
元からThreadで回す予定だったので長くとも1分以内に切れてくれるならいいのですが、
いつまで経っても切れないのでメインスレッドに持って来て実験すると案の定
Closeのところでハングしてるんです orz
263 :
デフォルトの名無しさん :2007/09/08(土) 23:58:04
ACSESSをC#からオートメーションで動かしたいのですが VB6だと 'AccessをVB6でオートメーションで動かす Public Sub AutoAccess() Dim objAcc As Access.Application Set objAcc = CreateObject("Access.Application") With objAcc .OpenCurrentDatabase "C:\test\test.mdb" .DoCmd.OpenQuery "Q_クエリーテスト" .CloseCurrentDatabase End With End Sub となります。 C#だとどう書けばよろしいのでしょうか?
VSTO
265 :
デフォルトの名無しさん :2007/09/09(日) 00:14:26
>>264 VSTOはありません。ACCESS97です。
266 :
デフォルトの名無しさん :2007/09/09(日) 00:31:20
>263 VB.NETを使って書いて作ったdllをC#から呼ぶ。 Missing.Valueが面倒なんだよねぇ……
268 :
デフォルトの名無しさん :2007/09/09(日) 00:57:53
>>267 Missing.Valueとは何でしょうか?
Valueさんがいなくて寂しいわ
270 :
デフォルトの名無しさん :2007/09/09(日) 03:09:44
>>266 具体的なコード例があれば助かるのですが・・・
271 :
デフォルトの名無しさん :2007/09/09(日) 03:17:23
272 :
デフォルトの名無しさん :2007/09/09(日) 08:41:35
System.Runtime.InteropServices
274 :
デフォルトの名無しさん :2007/09/09(日) 11:47:55
文字列の "$実行("hoge",1,"nage")" を解析して 「$実行」 と 「"hoge"」「1」「"nage"」 を返してほしいのだがどうすればよいでしょうか? 正規表現でやれると思うけど引数部分が何回繰り返されるかわからないのです。 この引数の部分はobject[]に格納したいです。
その前に文字列になってないような…
Match と Group 使いこなせばどうとでもなる 確か @IT に .NET の正規表現講座があったからそれで勉強してみれ
正規表現使わないほうが楽なんでないの? "hoge"に [ , ( ) ]が含まれているかも知れないし。
それは面倒ではないが、" のエスケープがあると面倒だな
TextFieldParser で超手抜きw
なんかC#からExcelとかAccess使うのは かなり評判が悪いみたいですね COM開放しわすれて残骸が残るから? それとも遅いから? VSTOつかえといっても高いしアレ おとなしくVSスクリプトでも使ってなさいってこと?
追加:Missing.Value面倒
初心者です。どなたか教えてください。 interfaceを作って、そのままクラスの中で宣言して使ってる サンプルソースによく出くわすのですが、 interfaceってクラスで実装して初めて使えるものではないのでしょうか? たとえば、IShellLinkのサンプルやseasarのオマケでついてくるサンプルなどです。 よろしくお願いします。
COM参照のインターフェイスは特別 seasarのおまけとやらは知らん
>>283 ちとエスパーしてみるが、
ファクトリが返してきたインスタンスをインターフェイスで受けてるケースのことか?
インターフェイスだけでインスタンスは作れないが、変数(参照の受け皿)は宣言できる。
IABC abc = ABC.Factory();
もっと端的に書けばこういうこと。 interface IAbc {} class Abc : IAbc {} IAbc abc = new Abc();
287 :
デフォルトの名無しさん :2007/09/09(日) 14:14:03
そのためのインターフェースだしな
みなさまありがとうございます。
>>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 さんの言われるように特別な例なのでしょうか?
よろしくお願いします。
宣言はそりゃできるわさ。問題は初期化。 CoClass 属性がなけりゃ直接 new はできんはずだが。 ていうかそのサンプルってのはどこにあるのさ?
>>288 特別な例なので半年後ぐらいに見直すといいよ。
言語の機能というよりはランタイムライブラリの機能だし。
COM っていう昔使われてた(今も使われてるけど)異言語間のやり取り用の取り決めがあって、 .NET でその取り決めに従うための特別な記述だ。 まああんまり今は気にするな。結局大して役に立たんし。
>>291 >その間、充分勉強してスキルアップしろという意味でしょうね。
まあCOMについて半年も勉強してても飽きると思うが。
COMを知らなくてもC#の勉強はできるし、
普通なら先に知るべきことはたくさんあるので
半年ぐらい忘れてもいいぐらいだと思う。
そのページはCOMInteropを自作してるのか(笑) 初心者向きじゃないと思うぞ。 ヒントを言えばShellLinkクラスはCOMオブジェクトそのものじゃなくて、 COMオブジェクトをC#から利用するための中間クラス。 インターフェイスの実装はCOMモジュールの中にあるから安心しろ。
295 :
291 :2007/09/09(日) 15:39:36
>>292 今の私には「決まり」としてしか理解できないようです。
おまじないのようなものだと思っておきます。
アドバイスありがとうございました。
>>293 ありがとうございます。
まずはもっとほかの事を勉強してみます。
296 :
291 :2007/09/09(日) 15:47:18
>>294 COMってDLLの一種というくらいの認識しかないのですが、
COMが実装してryinterfaceの仕様をCOMをりようするプログラムのほうで
書き直しているのでしょうか?でもinterfaceを書き直しても実装してるプログラムには
影響ないように思えるのですが。
書いててよくわかんなくなってきました・・・
もしよろしければコクラスの機能だけでも教えていただけたらと思います。
よろしくお願いします。
>>296 [
uuid(11219420-1768-11D1-95BE-00609797EA4F),
helpstring("Shell Link object")
]
coclass ShellLinkObject {
[default] interface IShellLinkDual;
};
VC++/ATLでCOMサーバーを作れるようになったらも一回挑戦してみろ。
上のIDLが読めないようだと理解は無理。
ちなみにCOMInteropは「参照の追加」「COM」「Microsoft Shell Controls and Automation」で
自動的にDLLにしてくれるからこれを使うのが普通。
>>297 レスありがとうございます。
VC、ATL、COMサーバー・・・どれひとつマスターしておりません・・・。
でもプログラムとう世界の奥深さは実感できました。
いつか理解できる日を夢見ていろいろ勉強してみます。
ありがとうございました!
>>298 ただ混乱しているだけの質問をしてご迷惑をおかけしております。
たくさんの書籍の紹介ありがとうございます。
今の私には真に理解できるとは思えませんが、
少しずつでも勉強したいと思っております。
ありがとうございました。
>281 解放忘れでオブジェクトの残骸が残ってしまうのはVB.NETでも共通だけど、 やっぱ、単純に書きづらいんだよ。 VBでは省略可能な引数をMissing.Valueで埋めなきゃいけない。 普段全引数を指定とかしないから気づかないけどOfficeのバージョンによって引数の数がさりげなく違うなんてこともある。 これがVB.NETならVB6までと同じように書けるようにできている。 同じことができてもっと楽に扱えるVB.NETがあるのにC#で無理に書かなくてもいいんでない?
俺はType.Missingを使ってるけどMissing.Value派のひとも多そうだな。 どっちが推奨なんだろ。
> Missing フィールドは、パラメータの既定値を取得するリフレクションによる呼び出しのために使用します。 だから、普通のときは Missing.Value なんじゃね
MethodInfo.InvokeでやっちゃってるMSのサンプルを見た覚えがある
それはレイトバインドのサンプルだろ多分。
306 :
304 :2007/09/09(日) 19:16:06
しかしいつ見てもこの oMissing の羅列はありえないよな
オーバーロードのソースコード生成するしかないか
private object InvokeMethod(object obj, string name, params object[] args){
return oApp.GetType().InvokeMember(name, BindingFlags.Default | BindingFlags.InvokeMethod, null, obj, args);
}
oBook = (Excel._Workbook)InvokeMethod(oBooks, "Open", "c:\\book1.xls");
>>360 によると、こうすればmissing付けなくてもいいみたいだよ
>302 そもそもインスタンスは1つしかないのでどっちも同じだろ。 Missing.Valueを使ったサンプルの方が圧倒的に多いと思うが。 >309 遅延バインディングだな。
VSTO用のプロジェクトを作るとmissingというのが自動生成されていてこれを使えということらしい。 global::System.Object missing = global::System.Type.Missing; 英語のドキュメントをみるとどちらの量もどっこいなのだが、 日本語化されてるドキュメントだとSystem.Refrection.Missing.Valueが多い。 System.Type.MissingのMSDNのリフレクション云々のくだりはVB前提で書かれていて、 VBであってもリフレクションを使う場合はOptionalにはType.Missingが必要になりますの意味。 結局同じものだからどちらでもいいのだろう。MSも混乱してるし。
office2007ってXML形式のファイルに対応してるらしいけど 既存のバイナリファイルいじるのでなければ 直接XMLなファイルを生成するプログラムにしたほうが COMでがんばるよりはるかに楽な気がしまつ ExcelはCOMつかわないでCSVでがんばってる人も多いと勝手に妄想
すみません。 イベントとデリゲートについてよく分かりません。 デリゲートはインスタンス化したもののアドレスを入れるもの(?) と認識しました。 イベントとデリゲートの関係がよくわからず、イベントがさっぱり分かりません。 どなたか簡単に教えていただけないでしょうか? 変なお願いと思いますが、どうしてもわからなくて。 どうやったらイベントのメソッドに飛んでいくのかが全然わからない 状況です
デリゲートはメソッド呼び出し手続きそのものをオブジェクトにすることでほかのオブジェクトとのやり取りに使用できるようにしたもの。 イベントはデリゲートを利用してあるタイミングを通知してもらうための機構。 って言葉で言っても理解できないと思うけど。 ・このインスタンスのこのメソッドを呼び出す手続きはこのデリゲートにある。 これさえあれば元のインスタンスもメソッドも知る必要はない。 てのがデリゲート(とそのデリゲートの実体)。 ・このデリゲートを渡しておくから、こういう状況が発生したときに登録した手続きを呼んでくれ。 てのがイベント。 ますます分からんな。
マルチキャストデリゲートが事態をややこしくしているのは間違いない。
デリゲートは「型」。intとかStringとかclass ほにゃららと一緒。 delegate void Foo(); ↑これが class Foo{...} とかと同じ、型の「定義」。 イベントは型の「メンバー」の種類のひとつ。フィールドやメソッド、 プロパティと一緒。 event Foo Bar; ↑これが int Bar() {...} (この場合メソッド)とかと一緒でイベントメンバーの定義。
317 :
313 :2007/09/09(日) 22:05:59
>>314 さっそくありがとうございます。確かにまだまだわかりません。
質問させてください
例えばデリゲートA、オブジェクトB、オブジェクトCがあったとして、
オブジェクトB,CにデリゲートAを持たせるということですか?
なんかインターフェースと同じ感じがするんですが、見当違いのこと言ってますか?
>>これさえあれば元のインスタンスもメソッドも知る必要はない。
ということは、何かの手続き(一連の流れ)を実行するものがデリゲート?
ってことですか?
じゃあ、メソッドが一つだけのインターフェイスのようなものだといったらわかる? Javaなんかだといちいち内部クラスでインターフェイスを実装したりしてたけど、 それが面倒だから言語に組み込んだだけ。 イベントはイベントハンドラを登録するメソッドと削除するメソッドを 一つにまとめたプロパティみたいなもの
319 :
313 :2007/09/09(日) 22:19:07
>>315 マルチキャストデリゲートですか?
ちょっとくぐってみます。ご指摘ありがとうございます。
>>316 classとintやstringが一緒ですか?
ちょっとこんがらがってきちゃいました。
classについてもう一度調べてみます
ありがとうございます
class String (クラス型) struct Int32 (構造体型) enum Keys (列挙型) delegate EventHandler (デリゲート型) 上の二つは今作った言葉だから使わないでね
デリゲートは、 ある型の引数を取りある型の戻り値を返すメソッドを なんでもいいから受け取って(インスタンスメソッドでも スタティックメソッドでもいい)、それを受け取った側が 好きなタイミング(ボタンが押された時とか)で実行できる仕組み 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でも出来る。
> delegateとeventはほとんと同じものだが、
これはねーだろ、折角
>>316 が解説してくれたのに
delegateとそのインスタンスはこういう場合きっちり言葉を区別しようや
323 :
313 :2007/09/09(日) 22:35:29
みなさん、親切にありがとうございます。 ただ私、ただいま頭がパンクしそうです。 一個ずつ整理していますので、レス遅れます。 すみません。
324 :
313 :2007/09/09(日) 22:41:08
>>318 そうなると、インターフェースとデリゲートは一緒ということ?
例えばどんな場合にインターフェースでどんな時にデリゲートを使うんでしょうか?
しかしdelegateのインスタンスもデリゲートというのだよな デリゲートの使い方1 public delegate Result Hoge(Arg1 arg1, Arg2 arg2); こんな感じで引数と戻り値の型を規定する機能 デリゲートの使い方2 規定された型のメソッドを実際に保持するものもデリゲートという class Foo{ public Hoge Delegate; public event Hoge Event; } //実際のメソッド Result Method(Arg1 arg1, Arg2 arg2){ ... } Foo foo = new Foo(); foo.Delegate = new Hoge(Method); foo.Delegate = Method; //こうでもいい foo.Event += Method;
313じゃないが盛れのバカな頭もパンクしそうでつ デリゲートの項目だけは何度復習しても理解不能なんだが ↑みてたら理解できそ・・・・・うにもないorz
インターフェースとデリゲートは全然違うもの
たとえばあるクラスに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
プロパティにそっくりなのがわかると思う
328 :
313 :2007/09/09(日) 23:00:11
>>325 使い方1はインターフェースのようなもの。
使い方2は実際の処理を+=などで保持するもの。
ということでいいでしょうか?
>>313 たぶん具象を知らずに抽象を知ろうとするからわからなくなるんだろうな。
とりあえず第一次接近としては、デリゲートは関数ポインタみたいなもの
だと考えればいいと思う。
つまり、メソッドのメモリ上の位置(アドレス)に関する情報を格納するための
データ型だと、とりあえずは思えばいいと思う。
デリゲート型の変数にはメソッドの位置情報が入っているわけだから、
当然その位置情報を利用してメソッドを呼び出すことも可能なはずだ。
イベントは、何らかの出来事(たとえばユーザーがボタンをクリックしたとき)に
シバかれるデリゲート型のフィールドみたいなものだと思えばいい。
だから「ユーザーがクリックしたときにシバかれる」デリゲートに対して
予めフォームの中の適当なメソッドの位置情報をぶち込んでおいてやれば、
ユーザーがボタンをクリックした時にそのメソッドが呼ばれるというわけだ。
まああくまで第一次接近だからあんまり真に受けてもダメだけど、
概念的な理解としてはこれでいいと思う。
330 :
313 :2007/09/09(日) 23:15:26
>>326 私も何度本を読んでみても理解できないのでここに書き込むことにしました。
お互いがんばりましょう。
>>327 これはイベントのことになるんでしょうか?
EventHandler hoge にはadd_Hoge(EventHandler value)で追加された
ものが入っているということでいいですか?
>>329 デリゲートはポインタのようなもので、そこに実行させたい処理を入れる(+=で
複数登録できるんですよね?)
そして、イベントが実行されたら、デリゲートのさすアドレスの処理(↑で登録したもの)
を実行するって感じでいいでしょうか?
ボタン押した時実行させたい処理を入れるとか、 List<int> list = new List<int>(); list.Add(1);list.Add(2);list.Add(3); List<string> strList = list.ConvertAll<string>(IntToString); string IntToString(int x){ return x.ToString(); } コレクション全体に実行させたい処理を入れるとか、 使い道はいろいろだ
332 :
313 :2007/09/09(日) 23:42:05
自分が理解できない箇所がわかりました! イベントを登録するときに delegate 戻り値の型 イベントハンドラの名前(パラメータリスト); と宣言しますよね。このdelegateが曲者でした。 私の解釈ですが、 デリゲートは様々な処理をあるアドレスに入れておくもの。 イベントは何かされたとき(クリック等)にデリゲートに定義された 処理を行うこと。 というふうに理解しましたが、あってますか? なんかちょっと違う気がしてきましたが。
>>332 実際のところeventを無視してdelegateだけきっちり理解しておけば当面はそれでいいよ。
自分でGUIコントロール作ったりしない限りeventを自分で作ることはないから。
先にdelegateを完璧にしなはれ。
デリゲート(のインスタンス)は、単にある特定のメソッドを表している(指している)。 じゃ駄目なのかな? インスタンスメソッドとスタティックで微妙とかマルチキャストはとかあるけど、 その辺はおいおい理解していけばいいわけで、 まずは、デリゲートとは、なんらかのメソッドを指しているもの。
>>332 そうじゃないよ。
だから関数ポインタのようなものだとまずは理解せよ、と言っているじゃないか。
「様々な処理をあるアドレスに入れておく」(これちなみに意味不明だよ)のではなく、
処理のコードが書かれているメモリ上の位置、すなわちアドレス「を」入れておくんだよ。
>>333 >自分でGUIコントロール作ったりしない限りeventを自分で作ることはないから。
これはおかしいというより、完全に認識違いだよ「w
イベントっていうのはGUIにまったく限らない。
典型的には何らかのデバイスの状態が変化したときとかね。
例えばCDドライブを抽象化したクラスがあるとして、
トレーが開かれたときにイベントでそれを通知する、というのは想像しやすいシナリオでしょ。
内部のことを言えば、スタティックメソッドを登録した場合はメソッドのポインタ インスタンスメソッドを登録した場合はメソッドのポインタ+インスタンスのポインタ をデリゲートは持っている デリゲートを実行すると、ポインタを辿り、そのインスタンスのそのメソッドを実行する といった感じ
>>332 うん、いやだからdelegateは型だって。もっというと特殊なclass。
ここをまずは押さえよう。とりあえずeventは忘れて。
順番に行こう。まずdelegate型を定義してみる。
internal delegate void Foo();
書き方はクラスとずいぶん違ってみえるけどね。
で、delegateはclassだからclassっぽく使える。
Foo foo = new Foo(HogeMethod);
こんな感じに。Fooクラスの変数fooにFooクラスをnewしてぶちこんでるわけだ。
コンストラクタにメソッドを渡してね。コンストラクタがちょっと特殊なだけだね。
class Hoge {
private Foo foo=null;
}
こうも使える。Foo型のフィールドね。
void Hoge(Foo foo){
//...
}
メソッドのパラメータにも。
338 :
333 :2007/09/10(月) 01:39:06
>>335 >これはおかしいというより、完全に認識違いだよ「w
すまん、確かに言うとおりだが、
>トレーが開かれたときにイベントでそれを通知する、というのは想像しやすいシナリオでしょ。
そんなクラスを
>>332 が作るというのは本当に想像しやすいかw
>>332 が「CDドライブを抽象化したクラス」の必要を感じるころには多分イベントで困ることもなかろう。
正直どんな場合にせよeventを使おうとは思わないんだよな delegateだって+=も-=も出来るし、代入して入れ替えることも出来る +=と-=だけに制限する意味がわからない タスクトレイが開いた時の動作だって入れ替えたくなる時があると思うんだよな
340 :
デフォルトの名無しさん :2007/09/10(月) 02:12:03
>>339 イベントを通知されるクラスが、他の通知されるクラスを意識しなくていい様にするためじゃね
=で上書きしたら他に通知されるクラスに上書きを通知しなくちゃいけなくなる
デリゲートは理解するのに自分も結構苦労たなぁ
>>320 が理解できてればなんとなくわかると思う。
>>332 補足
internal delegate void Foo();
これでFooと言うデータ型を作った、と考えればいいと思う。
つまり、戻り値がvoidで引数を取らないメソッドを代入できるデータ型。
Fooはデータ型なので、変数を定義するときに使用する
ただ、そもそもデータ型という単語の使い方が間違ってないかすごく不安。誰か教えてorz
int型はデータ型だけど、元をたどれば構造体ってことを考えれば、
C#におけるデータ型の意味は、定義されたもの全般・・・と考えてます
ごめんミス つまり、戻り値がvoidで引数を取らないメソッドを代入できるデータ型。 ↓ 戻り値がvoidで引数を取らないメソッド(のアドレス)を代入できる変数、を作るデータ型。
まあC#も3.0にもなれば、継承やinterfaceを使ってたところは 大部分がdelegateとラムダ式に置き換わると思うから ここは理解しといて損は無いというか必須になっていくと思うよ
344 :
313 :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と同じように型になるってことですね?
>>344 まずはデリゲートの機能の物理的イメージを持つのが先決だと思う。
多分ここのほかの人が言ってるような「デリゲートは型でイベントはクラスの
メンバで〜」みたいな抽象的な話を聞いても、余計わからなくなるだけ。
>ポインタだからメモリ上のどこかにアドレスが割り当てられる。ということですよね。
>あとはこのアドレスから呼び出す処理をすれば、そのアドレスにある
>処理が実行されるってことでいいですか?
だから、たぶん変に誤解してるよ。
プログラムというのはメモリ上に置かれる、というのはOK?
だから関数(メソッド)というのも当然メモリ上の位置というものを持つはずだ。
関数ポインタという変数は、その関数のメモリ上の位置を格納するための変数だ。
もちろん「関数ポインタ」という変数自身もメモリ上の特定の位置に存在する
わけだが、それはとりあえずデリゲートを理解するためにはどうでもいい。
関数ポインタは関数がメモリ上のどこの位置に存在するかを「知っている」から、
それを利用すれば関数を呼び出すことができるでしょ?
以上のようなイメージを理解することが先決だと思うよ。
ただ、これはあくまでたとえ話であって正確じゃないことを理解しておくことも
一方で重要。
すいません。馬鹿みたいな質問ですが、よろしくお願いします。 double result = Math.Cos(1/4); とした場合、result には 1.0 が入ってしまいます。 私としては 0.999990 がほしいのですが、勝手に四捨五入されてしまいます。 どうしたらよいのでしょうか。
>>347 ありがとうございます。
これみても double は、0.99999 を扱えると思うのですが・・・
>>349 すいません間違えました。
double result = Math.Cos(1/30);
です。
>>350 そうじゃなくて。
1/30 は整数/整数で答えは整数の 0 だろ
1.0/30 とかでやってみそ
>>346 0.999990が四捨五入されて1.0になってると思ってるのなら大間違い
VBだと/使うと演算結果はオペランドの型によらずdoubleになるのが基本だけど、 これはc#のルールの方がシンプルでむしろ初心者向きに感じるな。
355 :
313 :2007/09/10(月) 12:40:30
>>345 ありがとうございます。メモリ上に関数ポインタが割り当てられ、その関数ポインタにはメソッドのアドレスが格納している。
この辺りはOKです。(私の表現は下手ですが)
デリゲートは関数ポインタということでいいですよね?
初めて携帯から書くので見にくかったらすみません
>>354 CもC++も、C#と同じだと思ったけど
VB / 商が実数になる割り算 ¥商が整数になる割り算
delegateって typedef void* Foo ≒ delegate void Foo って覚えたらだめなの? 俺の場合C#が先だったから、関数ポインタは delegate void Foo ≒ typedef void* Foo って覚えたんだけど…
割ったら切り捨てだろ 少数なんて邪道だぜ
361 :
360 :2007/09/10(月) 14:32:37
ごめん。勘違い。
すごくいいIDの男発見!!!!!!!!
715 :私事ですが名無しです:2007/09/10(月) 14:27:10 ID:TAkaKazu0
ところで俺のIDを見てくれ こいつをどう思う?
716 :私事ですが名無しです:2007/09/10(月) 14:44:34 ID:R76+t3Z/0
すごく・・・いいです
717 :私事ですが名無しです:2007/09/10(月) 14:44:45 ID:H/zeEu5e0
記念かきこw
http://news21.2ch.net/test/read.cgi/news7/1189188763/
コピペ君って馬鹿だな、まで読んだ。
>>358 スレチなんで適当に答えるが関数ポインタ間違ってるぞ
あとインスタンスメソッドの場合のポインタはもう一息いる
まあdelegateありがたがりやがれという話だ
ラムダ式が中心になったら脱落者続出だなあ
366 :
313 :2007/09/10(月) 22:43:33
今また調べていたんですけど、どうもデリゲートの使い方というか、 どのタイミングで使うかがいまいちピンときません。 あるデリゲートを個々のクラスで定義して、様々なメソッドから呼び出す ため?ということでしょうか? またバカな質問してる気がしますが。
>>366 ぴんと来ないなら使う必要なし。
必要になったら使え。
>>366 とりあえずはイベントハンドラとしてだけ使っとけばいいだろ
372 :
313 :2007/09/10(月) 23:22:10
川俣かよ
前任者がどこで使ってたかソース見ればなんとなくわかるんじゃないか?
>>373 人物はアレだが書いてることは別におかしくないだろw
というか、読んでみると結構わかりやすくていい記事だぞ
376 :
デフォルトの名無しさん :2007/09/11(火) 00:56:19
interfaceのメソッド実装するとき、直入力が面倒なんですが、 インテリセンスを効かせる方法ってありますか?
ああ、Eclipseのアレみたいなのか それ自分も知りたかった
>>376 class Hoge : IHage
のIHageにマウスのせるでてくるやつじゃなくて?
379 :
デフォルトの名無しさん :2007/09/11(火) 01:35:12
あー、そこから右クリックでメニューでますね メソッド名途中入力とかの線しか考えてなかったので目から鱗です。 これでちょっと楽になりそうです。ありがとうございました。
なるほど 俺からもありがとう
私はJava経験者ですが、今C#を勉強中で分からないことがあるので質問です。 親クラスのメソッドを上書きするとき、Javaでは常にオーバーライドですが、 C#ではnewによって新しいメソッドとして定義する方法と、 overrideによってオーバーライドする方法があるじゃないですか。 この2つのうち、newでやる方法の価値が分からなく、教えてもらいたいです。 ちなみに、実装時のnewとoverrideの違いは把握してます。 今の私の考えでは、全部overrideでいいのでは?と思うし、 むしろnewなど無い方がよいとさえ思っています。
ベースクラス実装者が想定していないオーバーライドを許可すべき ではないかつ継承先のことを考えながらコード書くことのほうが少ない かつvirtualメソッドのほうが高コストとかもろもろ newがよく使われているのは経験上staticメソッドが重複する場合、 コンポーネントメンバの属性値の変更、COMインポートなインターフェイス、 内部的にはもうちょいあったかな
383 :
381 :2007/09/11(火) 07:50:32
>>382 >ベースクラス実装者が想定していないオーバーライドを許可すべき
>ではないかつ継承先のことを考えながらコード書くことのほうが少ない
でもそれって、virtualにしなければいいというだけの事ですよね。
オーバーライドされたくないなら、そのシグネチャのメソッドは
「子クラスでは実装禁止!」でいいじゃないですか?
何であえて、newとか使って再定義できるようにしてるのかが、
分からないんです。
ちなみに、何でnewを悪者扱いするかというと、例えば
クラスBはクラスAを継承してて、
さらに、AのhogeメソッドをBクラスがnewで書き換えてるとして、
--------------------
A a = new B();
a.hoge();
--------------------
この場合実行されるhoge()はAの実装の方ですよね?
それってつまり、親クラスの型に子クラスのインスタンスを代入するという事が
安全じゃないって事だと思います。メソッドの引数や戻り値に関しても同じで、
作ったインスタンスは、その型のままにしておけという事になります。
そうなると、引数や戻り値に親クラスを指定できなくなり、
汎用性を持たせられなくなってしまいます。
私がnewに否定的な理由はこれですね。
ちなみに、staticメソッドの場合はいいと思うんですよ、
staticはあくまでもその「型」にくっついているわけだし。
と、長く書いてしまいましたが、よろしくお願いします
もし、前提知識がそもそも間違っているとかありましたら、すいません。。
>>383 あのね、そんな馬鹿でも分かる例あげる前に俺があげた例調べた?
BCLで標準的に使われているものや経験上必要だったものを挙げたんだが
聞く気がないんなら帰ってくれ
あとJavaやってたらしいから前段はvirtualがデフォじゃない説明だから
わかってるなら読み飛ばして。
そんなの調べろっていわれても困るでしょ
そんな能力あったらこんなスレで質問しねえよw
間違ってるか?
>>383 むしろAの型の変数に入っていれば安心してAとして扱えることを
保障するための仕組みじゃないの?
>>385 なら〜ってなんですか?って聞けよ
こっちが挙げてみたら分かりきってる講釈たれてそれに反応なし、
同意だけ求めてるのが透けて見えるだけの確証バイアス野郎じゃねーか
>>381 >この場合実行されるhoge()はAの実装の方ですよね?
それでいいんじゃん。わざわざAの参照で宣言してるんだから、欲しいのは
Aの規約に則った実装でしょ。なんでAとは無関係の実装であることを
newで明治したメソッドが派生型で定義できると困るの?
ちゅーかnewって、派生型で既に定義されているシグネチャが
あとから基底型で定義されてしまった場合に、派生型を前提とした
コードへの影響を最小限に抑えるための一時しのぎって印象なんだけど。
派生クラスとたまたまシグネチャが被るインターフェイスのメソッドを実装したいときとか インターフェイスの明示的実装というのもあるけど、それだとインターフェイスのメソッドの方が隠れちゃうから どうしてもインターフェイスのメソッドの方を見せたいとき そんな場合本当にあるのか知らんけどw
390 :
389 :2007/09/11(火) 10:17:06
>>381 =387
この人は既に固定観念に捕らわれているし、聞く耳もたない
みたいだから何言っても無駄かと。
393 :
381 :2007/09/11(火) 11:22:02
>>384 >>386 まだ、調べていませんが、私が知りたいのは用途ではなく、
存在意義だとか利用価値だとか、少し概念的な事だったんです。
それが伝わっていなかったようなので、
>>383 で自分の考えを述べて、
これについての意見をもらおうと思ったんです。
このことを
>>383 でちゃんと書いておくべきでした。
決して無視したつもりではないんですが、結果的にそう取られてしまったようで…
>>385 でも仮にBがhogeをoverrideしてた場合は、Bのhogeになるわけですが、
使う側はそのメソッドがnewなのかoverrideなのか判断でないし、
使い分けもできません…よね?(できるのかな?)
そう考えると、今hoge()を実行しようとしているけど
果たして「どの型に定義された実装を使うべきなのか?」
という疑問が、使用者に常に付きまとってくるわけで、
そのような不安要素を作り出してるだけのような気がするのです。
>>388 AのサブクラスでB1,B2があるとして
状況によって、B1とB2のどちらかのインスタンスを返すメソッドがあった場合。
戻り値の型はAにすると思います。
そのメソッドとしては、戻り値をB1やB2として使って欲しい。つまりB1やB2のhogeを使って欲しい。
しかし、使用者としては、戻り値の型がAだから、Aのhogeを使わざるを得ない。
という状況になり、メソッドの作成者の意図と違う使われ方をしてしまいます。
親クラスを後から修正した場合の影響を抑えるっていうのは、確かにそうですね。
親は、子がどれだけ存在していて、どんなメソッド定義してるかなんて知らないですもんね。
なるほど。。それはそうですね。
394 :
381 :2007/09/11(火) 11:22:51
>>389 でも、違うメソッドなら違うシグネチャであるべきなのでは?
逆に同じシグネチャのメソッドなら、オーバーライドされるべきなのでは?
と思ってしまいますw
>>391 私は387ではないですよw
たしかに、固定観念にとらわれているかもしれないです。
395 :
381 :2007/09/11(火) 11:32:02
なんか、
>>394 途中で切れたw
>>389 でも、違うメソッドなら違うシグネチャであるべきなのでは?
逆に同じシグネチャのメソッドなら、オーバーライドされるべきなのでは?
と思ってしまいますw
>>391 私は387ではないですよw
たしかに、固定観念にとらわれているかもしれないです。
でも聞く耳を持ってないわけじゃなく、自分なりに納得のいく解答が得たいと思っているだけです。
おかしなことを言っていたら、そこを指摘してくれると助かりますw
>>393 >でも仮にBがhogeをoverrideしてた場合は、Bのhogeになるわけですが、
>使う側はそのメソッドがnewなのかoverrideなのか判断でないし、
>使い分けもできません…
判断も使い分けもできる。そのために宣言にnewやoverrideをはっきり付けてるわけだし、
似た機能の、インターフェイスの明示的実装もあわせてMSDNに全部明記されてる。
読むの疲れるからもっと質問は簡潔にしてくれ…。 俺は初心者で勉強のつもりでこのスレ見てるけど、めっさ疲れるわ。 あと…自演してないだろうな?w
>>393 BCLっつー模範的なライブラリで使用されてたりする手法や実際に
使われている手法を先に知らないで存在意義やら糞もあるのかよ。
399 :
385 :2007/09/11(火) 12:24:03
>>393 反論になってないと思うなあ。。
短いレスだからもう一度よく読みなおして欲しいよ。
個人的にはメソッドのシャドウの意義を知るには、
Winフォームのコントロールをいろいろカスタマイズしてみるのがいいと思う。
きっと、「そうかこういう場面で必要になるのか」ということが体感できると思う。
ところで、
>>383 の場合でさらにBを継承するクラスCがあったとして
CでAのhogeをオーバーライドすることは不可能なの?
俺は381じゃないよ
402 :
381 :2007/09/11(火) 12:59:28
>>396 >判断も使い分けもできる。そのために宣言にnewやoverrideをはっきり付けてる
それは、呼び出される側のコードを見て判断しろということですか?
あと、一応MSDNのその辺の情報は目を押してるつもりです。
>>397 文章力のなさが問題ですね。申し訳ない…色んな事が未熟者の私です。
とりあえず、一番言いたいことは
>>393 で書いた
>>388 へのレスかなー
あと、自演などしてないですww
>>398 効果が分かっていて、その効果自体がいまいち納得できないので、
使い方云々の話ではないのと考えてます。
とはいっても、BCLとかは勉強の為に参考にしてみようとは思ってますが。
>>399 >むしろAの型の変数に入っていれば安心してAとして扱えることを保障する
というのに対して、「もしoverrideだったら、実行されるhogeはAの実装の方じゃなくなるから
保障はされてないじゃないですか。」と言ったつもりで、
それが反論になってると思いましたが。。
一応プログラムも、作ったりしてるんですが、今はまだ体感できてないですね。
その時を待つしかないのかな。。。
う〜ん、
メソッドの戻り値や引数を親クラス型で定義出来ないじゃん
っていうのが、本当に言いたいことなんですが。
なんか、伝わってなかったりしてるのかな
403 :
デフォルトの名無しさん :2007/09/11(火) 12:59:52
お前らなんでも継承して楽しようとしてんじゃねぇぞゴルァ 男だったら1からつくれ
>>393 >しかし、使用者としては、戻り値の型がAだから、Aのhogeを使わざるを得ない。
>という状況になり、メソッドの作成者の意図と違う使われ方をしてしまいます。
そのメソッドの作成者はAのhogeとは関係無いhogeを持つというBの規約を知っているはずでしょ。
それなのにAを返すのはAのhogeを使って欲しいからなんじゃないの?
ちゅーかnewの存在意義は
>>388 の下半分だけで考えてくれよ。
仮に、新規に派生した時に基底のメソッドと同じシグネチャをnewで宣言しちまうような
馬鹿が出てきたとしても、newを導入しないと回避できない問題なんだから。
newは、オーバーライドしないという意図をはっきり示すものだろ 基底クラスのメソッドが呼ばれてもいいと考えてやってるんだから何の問題もない
うん、BCLとか使用法とか以前のレベルな気がしてきた。 実際に使ってるものを使い方もしろうともせんでいきなり「いらないですよね!」 ってわけわかめなことのたまうから気にもとめてなかったが
407 :
381 :2007/09/11(火) 13:59:11
>>400 リンク先読みました。それと
>>388 から考えると、
newとoverrideの2つが存在する理由は、親クラスへの変更が後から入った場合でも、
既存のクラスへの影響を小さくする為って事なんでしょうね。
>>404 >そのメソッドの作成者はAのhogeとは関係無いhogeを持つというBの規約を知っているはずでしょ。
それは知らないという前提でした。
でも、そこまで意識して作るのがC#のコーディングスタイルってことなんですかね。
>それなのにAを返すのはAのhogeを使って欲しいからなんじゃないの?
どのメソッドを使って欲しいとか、そういうのは意識してなくて、
単純にB1とB2を両方扱えるからっていう理由で、Aにしたんです。
>ちゅーかnewの存在意義は
そこは理解できました。親の変更の影響を受けないためですね!
>>405 >基底クラスのメソッドが呼ばれてもいいと考えてやってる
えっ、そういうものですか?
呼んで欲しいから、実装してるんだと思いますが。。
先にBのhogeがあって、その存在を関知しない人が後からAにhogeというメソッドを追加したら、 そればBのhogeと名前は同じだけど意味が違うものだろ BのhogeはBのhogeとして使ってほしいから実装されたものであって、 勝手にAのhogeとして呼び出されるようになっちゃったら困る
C#はC++の進化系という建て前なので、 C++に隠蔽があるからサポートしてみましたじゃダメなのかな。 C++でデフォルトvirtualじゃなくて隠蔽なのは主にパフォーマンス上の理由だが、 .NETにそれがあるかどうかはわからん。 overrideに対してvirtualがあるのにnewに対してnewable(?)がないのは、 継承もとのクラスに対してなんら影響がないからだろう。
410 :
デフォルトの名無しさん :2007/09/11(火) 14:43:29
BCLラジオ?
newってsealedされてるメソッドやらプロパティを派生先で上書きするための 裏技的キーワードだと思ってたんだけど、違うのか…
ICloneableなんか実装してみると便利さも分かる。 まあICloneableを実装することはあまりないが、イメージとして。
そういえばなんでsealedメンバを隠すときはnew付けないといけないんだろう どうせ継承できないんだから無意味なんじゃないの?
>>413 親クラスに同名のメソッドがあることを忘れて上書きしちゃうとバグの原因。
>>412 トップレベルのクラスがClone()の中でMemberwiseClone()を
使ってくれてなければ隠蔽するしかないものな。
newはたとえば戻り値を元の型の子クラスやなんかにしたいときに 便利だぞ
>412 返り値の型がね微妙なんだよ。返ってくる型は決まってるのにダウンキャストが必須というのはアホな実装だと思うんだよ。 インターフェースの明示実装と型指定のCloneを両方実装したら そのクラスを継承した時返り値の型が違うCloneを実装できないわけでやはり微妙なんだよ。 そうなるとGenericsで何とかならんのかと思ったが何ともならなくて残念だったよ。 だからICloneableみたいな微妙なのはない方がいいよ。
new(とうかベースクラスのメンバのシャドウ)の意義が、ベースクラスに後から 自由に(派生クラスのことを気にせず)メンバを追加することを可能にすることにある、 って意見は俺はまったく見当違いだと思うなあ。 それはただ、「そういう風にも使える」ってことに過ぎないでしょ。 第一そんな事態はめったにないし、シャドウは問題の完全な解決には全然ならないもん。 困らないのはコンパイラだけじゃんw メインの用途は本来オーバーライドできないメンバへのアクセスにフックを入れることでしょ。
>>419 >メインの用途は本来オーバーライドできないメンバへのアクセスにフックを入れることでしょ。
new使って本気でhookできると思ってるのか、それとも俺様定義のhookなのかどっち?
>>420 たぶん君が「フック」の意味を俺様定義とうか、
変に狭義に理解してるだけだと思うけど。。
まあフックという言葉がお気に召さないのなら「フックを入れる」の部分を
「処理を割り込ませる」あるいは「処理をとっかえる」と読んでもらっていいよ。
>>421 ごめん。
もしかして世間では下のようなのもhookって言うの?
だったら俺が悪かったってことで許してくれ。
public class Base
{
public sealed override string ToString()
{
return "Base! Base!";
}
public sealed override int GetHashCode()
{
return 1;
}
}
public class Deriv : Base
{
public new string ToString()
{
return "とっかえたよ!";
}
public new int GetHashCode()
{
Console.WriteLine("割り込んだよ!");
return base.GetHashCode();
}
}
>419 そのような思想の元に Dispose()をnewで置き換えてあったクラスを見た。 Dispose(bool)もなにやら別の実装があった。 IDisposable.Dispose()も明示実装されていたがそれも実装が違っていた。 それが継承されてまたDispose()がnewで… 変なことやり出すと害があるだけでまともに動かないものになるだけだぞ。
>>419 逆でしょ。バージョン管理がnewの主目的であって、「そういう風にも使える」ように
見えてしまうのは任意のメソッド置換の方。
そもそもC++では無言で隠されてしまうところをなんでわざわざコンパイラが警告出して
newで潰す必要があるのか考えてみてよ。
それ以前にC#において「オーバーライドできないメソッドにフックを入れる」の
意味が全然わからん。
>>421 それ「も」フックの一種でしょ。
それ「が」フックとは言わないけど。
>>423 思考が倒錯しとるよ。
そもそも「害がある」と予想されるからオーバーライド禁止してるわけ。
それを承知でやるのがシャドウだよ。
>422 HashtableのキーにnewでGetHashCodeとEqualsを置き換えたクラスを使ったら 間違いなくobjectのGetHashCodeが呼ばれる。newで置き換えた方は呼ばれることはない。 だけど、そういうクラスを実装した人はnewで置き換えたメソッドが呼ばれることを期待してバグだって騒ぐんだと思うよ。 newでの隠蔽はJavaでは避ける手段がなかった基底クラスがバージョンが上がってメソッド名がかぶったときの変更の影響を なんとかするための必要悪なものなんで普段は使うべきじゃない。
427 :
デフォルトの名無しさん :2007/09/11(火) 21:23:02
アンマネージリソースを安全に管理するために、 SafeHandleクラスを継承しようと思っているんですが、 ReleaseHandleとIsInvalidをオーバーライドするだけでいいんでしょうか (実際にはCreateToolhelp32Snapshotでプロセスのスナップショットを得たいので、 CriticalHandleMinusOneIsInvalidから継承したハンドル管理クラスを作る) 具体例的に解説しているサイト等あったら教えてください。 MSDNのサンプルには [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] なんて属性もでてきたりするんですが、意味がわからなくて・・・
ふらっとの域を超えてないか?
ちなみに私はついてけないぜ。 既に基本的な用語と思われるフックもシャドウもわかってなくて今必死に読んでる始末。
相談室ががらんとしてる。
431 :
427 :2007/09/11(火) 22:56:24
失礼しました。 相談室で聞いてきます・・・
432 :
429 :2007/09/11(火) 23:09:07
と思ったらすぐ出てきた。シャドウってVBでの隠蔽newに対応するキーワードなのね
フックに関しては・・・とりあえずいじくっちゃいけなげなイベント処理を強引に差し替えるもの?
>>420 を察するに本来はオーバーライドとか隠蔽とかイベント差し替えとか全部さすっぽいけど
>>427 の内容はまだ当分自分には縁がなさそうだ・・・
あと手元の入門書だと隠蔽newの使い道は、
既に完成したプログラムを改造・拡張するときに、
そのプログラムにあったの汎化クラスを継承する際、virtual指定されてないメソッドを上書きしたい時。
と書いてあったけどこれじゃだめなん?
シャドウとかシャドーイングってVBと関係ないんじゃない? 文字通り隠蔽の意味だけど。 ローカル変数がフィールドをシャドウする、みたいに普通に言うと思うんだけど。
>virtual指定されてないメソッドを上書きしたい時。 どこぞのコンパイル時メタプログラミングじゃあるまいし、それがC#でなんの役に立つのかしら。 それができるようになっちゃうからnewが必要悪と言われる所以だと思うんだけど。 その本のタイトルぷりーず。
>432 その入門書に書いてある文章からはしょったかして意味が変わってる気がする。 基底クラスは他者の作成したライブラリ、サブクラスを自分が作成したプログラムで 基底クラスがバージョンアップに伴ってメソッドが増えて 自分の作成したサブクラスに基底クラスと同じ名前のメソッドが発生したときに メソッド名を変更するのは影響範囲がでかい時に変更の影響を小さくするためにnewで隠蔽を使う みたいな感じに書いてなかったか?
だからそれはそんな風にも使えますよ、ってだけの話だって。 当たり前じゃん。 外人さんが書いた本だとたいていそういうことが書いてあるよね。 でもそういうのは「アカデミックな」話題としては興味深いし面白いとも思うが、 そんな実用性がゼロに近い用途が主目的なはずがないだろう。
virtual指定されてないメソッドを上書きしちゃダメに決まってるだろ ベースクラスとして実行した時と動作が変わったら混乱の元にしかならない そんなんnewしなくても名前を変えればいいだけの話だろう 戻り値の型を変えたいときなんてのはnewしたメソッドもoverrideしたメソッドも 全く同じ動作をするけど戻り値の型がより正確になってキャストが不要になるというだけの話だし それ以外でnewを使っていいのはベースクラスが勝手にメンバ追加して名前がかぶっちゃった時だけ というか継承自体するべきじゃない
>>437 言わんとしていることはよく分かるのでちょっと指摘しておくと
>virtual指定されてないメソッドを上書きしちゃダメに決まってるだろ
は
>戻り値の型を変えたいときなんてのはnewしたメソッドもoverrideしたメソッドも
>全く同じ動作をするけど戻り値の型がより正確になってキャストが不要になるというだけの話だし
の引数版としてあり得るかな。
Genericsが無かった時代は基底クラスが object get/set なメソッドになりがちで
派生クラスのメソッドやインデクサをtypedにするには隠蔽が結構便利だった。
ただ、その用途は Generics の登場によって激減してるので、
最近ではバージョン管理の方に魅力を見いだす人が増えてるとしても
そこまで不思議じゃないのかもしれん。
言わんとしていることはよく分かるのであんまり気にしないでくれ。
439 :
438 :2007/09/12(水) 00:27:16
>>437 ごめん。
「virtual指定されてない」ってのの意味がやっとわかった
>>438 は忘れてくれ。
何言ってるかよくわからん 引数の型が違うならnewできないんじゃねえの というかoverrideできないものをnewで上書きしたら動作が変わるだろ
441 :
440 :2007/09/12(水) 00:29:00
すまん入れ違いになった
ファイルの末尾をシークするって、 ファイルの末尾に移動する、見たいな意味でいいんですよね?
いやよくない
テキストボックスに12桁の数字を打ち込んで、奇数桁だけ取得するにはどうすればいいですか?
445 :
デフォルトの名無しさん :2007/09/12(水) 15:47:06
string s って定義してあれば、s[0],s[1]とかで、一文字ずつアクセスできるから後はがんばって抽出すればよい
すいません。P/Invoke の質問です。 P/Invoke で構造体を取得するのですが、この構造体のメンバは int と、さらに構造体が配列で含まれています。 今のところ、この構造体の int は取得できているのですが、配列に格納されている構造体が取得できていません。 P/Invoke で、構造体中に含まれた構造体の配列を取得することは可能なのでしょうか?
447 :
デフォルトの名無しさん :2007/09/12(水) 17:01:08
charみたいだな。string恐るべし
StringクラスのインデクサがCharAt()メソッドのエイリアスになっているから。
>>444 のケースなら
textBox1.Text[ n * 2 + 1 ]
みたいにすればよかろ。
>446 多分無理。 方法があったら教えて欲しい。 byte[]で受け取ってそれをfixedしてサイズ分1個ずつMarshal.PtrToStructureで取得してくとかでできるがあんまりスマートじゃない。
>>449 やはりそうですか。
SDK 2.0 のサンプルに構造体を取得したり、構造体の配列を取得したりはあったのですが
さらに複雑なものはありませんでした。
スマートじゃないですが byte[] で受け取っていく方法もありますね。
この方法を試されたかたはいらっしゃいますか?
>>446 複雑なP/InvokeはC++/CLIでラップするのも一手。
配置を真似した構造体を定義してunsafeで無理矢理
IntPtrとかGCHandle 組み合わせてるなあ
textBox1のAllowDropをtrueに設定して、 以下のコードを書き、ファイルを2回ドロップすると、 なぜか2回分のMessageBoxが表示されます。 3回だと3回分表示されます。 しかしcountの値は下がっていきます。 なぜなのでしょうか? 何か対処法があればお願いします。 private void textBox1_DragEnter(object sender, DragEventArgs e) { int count = 0; if (e.Data.GetDataPresent(DataFormats.FileDrop)) { e.Effect = DragDropEffects.Copy; } else { e.Effect = DragDropEffects.None; } textBox1.DragDrop += delegate { string s = ((string[])e.Data.GetData(DataFormats.FileDrop))[0]; MessageBox.Show(s, count.ToString()); count = count+1; }; }
>>446 今外出先なので検証できんのですが……
構造体配列の各要素の先頭アドレスを計算して、各々に対してMarshal.PtrToStructure()を使えば取得できるかもしれん。
>>454 DragEnterの度にイベントハンドラが増えてるからじゃないのか
>>454 毎回countを宣言&初期化しなおしてるじゃねえか。
>>449-450 どう考えても普通に可能だと思うけど。。
そんな程度のこと何度もやってるぞ。
MSDNライブラリにサンプル書いてあるじゃないか。
まあ、その構造体(および構造体の中の構造体)のシグネチャが判らないと
断言はできないけど。
459 :
454 :2007/09/12(水) 19:29:48
>>456-457 すいません。いまいち意味が分かってないです。
DragEnterのスコープから外れるとDragDropイベントハンドラも初期化されると思うのですが。
ですが、毎回メッセージボックスが増えていくと言うことはそうじゃないと。
だとすると、それを回避して通常のD&Dの動作をさすのに
何かいい方法はあるのでしょうか?
>>459 >DragEnterのスコープから外れるとDragDropイベントハンドラも初期化されると思うのですが。
されません
初期化されないのが匿名メソッドの特徴なんだからあたりまえ 変なこと考えずに普通にDragDropにイベントハンドラを追加すればいいだけだろ コンストラクタかデザイナで
>初期化されないのが匿名メソッドの特徴 簡単に記述できるのがいいと思ってたのに 嫌な仕様ですね
>>454 君は「スコープ」という言葉の意味をよく理解していないね。
DragDropイベントハンドラが毎回初期化されないのは、スコープとは別の問題。
textBox1はDragDropイベントハンドラの外で宣言されたものであって、イベントハンドラとは無関係に存在している。だから、textBox1に加えた変更はイベントハンドラに入ろうが抜けようが維持される。
countが上がっていかないのはスコープの問題。
countはDragDropイベントハンドラの中で宣言されているから、イベントハンドラを抜けると一旦破棄され、次にイベントハンドラに入った時、改めて確保される。 一回ごとに、中身は別物になる。
464 :
463 :2007/09/12(水) 20:00:43
>>462 そりゃ君が匿名メソッドの使い方を間違えてるだけだ。
簡単に記述できることと、それが君の都合どおりに動くことは、別の問題だろ。
偉そうになってすまん。
VS2005 C# コンボボックスのDrawModeをOwnerDrawFixedにし、 (プロパティ?のほうで)コンボボックスにデータバインドで アイテムを追加し、DrawItemイベントで特定のアイテムだけ ForeColorを変えようとしているのですが バインドされたアイテムのテキストがすべてSystem.Data.DataRowViewに なってしまいます。 バインドを使わずロードイベントでアイテムをAddした場合は 正しくテキストが表示されます。 データバインドを使用してオーナードローでコンボボックスの アイテムのテキストを正しく表示することは可能でしょうか?
言ってることよくわからんが"DrawItemイベント"でアイテムを描画してるのは 君が書いたコードのはずだと思うんだが。。 〜になってしまいます、ってお前さんが自分で書いたコードのバグなだけちゃうんかい? ちなみに、そんなの普通に簡単に可能なはずだよ。 BackColorをアイテムごとに個別にしようと思うと意外と面倒だったりするけど。
GetItemText
468 :
313 :2007/09/12(水) 21:51:30
いつも勉強になります。 以前デリゲートについて色々聞いていた者です。 その節は色々教えていただきありがとうございました。 371さんに教えてもらったHPを見てきました。 難しくて、まだ理解がいま一つのところもあるのですが。 ふと思ったんですが、デリゲートの非同期処理を使えば、 マルチスレッドにする必要はなくなる、というイメージは正しいでしょうか?
?? デリゲートの非同期処理=マルチスレッド(スレッドプール)
>>468 > マルチスレッドにする必要はなくなる
まあ、的を大きく外してはいないと思う。
デリゲートの非同期処理を使ってもマルチスレッドにはなるんだけど、スレッドに関するややこしい処理は隠蔽される、ってこと。
471 :
313 :2007/09/12(水) 22:18:16
>>469 >>470 マルチスレッドとデリゲートは=なんですね。
以前、何も分からないまま、HPの通り
Thread thread = new Thread
のようなことをして、マルチスレッドを使ったことがあったので、
違うものだと思ってました。
ありがとうございます。
デリゲート自体はマルチスレッドと無関係だぞw 非同期呼び出し機能は単なるオマケ
誤解五回
>450 今外なんで正確なコードは書けないが fixedでポインタにしてIntPtrのコンストラクタに渡してMarshal.PtrToStructureを呼ぶ。 後は構造体のサイズ分ずつポインタをずらして配列数分処理するだけ。 >458 構造体のメンバに構造体の配列があるサンプルはないだろ。 あるならurlを挙げてくれ。
475 :
313 :2007/09/12(水) 22:31:48
なんか私、すっごくはまってそう。 ご指摘ありがとうございます。 おまけに目を取られてしまって。 教えてください。 デリゲートって何で使うのか? これがいつまでたっても分かりません。 どこかで「同じような処理をするのだけど、少しだけ処理が違う時がある。 その時に使うのがデリゲートです」みたいなことを読みました。 こういうときに使うんですか? いろいろあると思うんですが、代表的なもの、よく使われる使い方を 教えてください。 お願いします。
476 :
デフォルトの名無しさん :2007/09/12(水) 22:36:25
どこかで「同じような処理をするのだけど、少しだけ処理が違う時がある。 その時に使うのがデリゲートです」みたいなことを読みました。 なにこれw
458じゃないが
> 構造体のメンバに構造体の配列があるサンプルはないだろ。
意外になかった。
というか、構造体配列が固定長かポインタなのかでもまた別になるんで、それを抜きに話し進めてもな。
構造体内の固定長配列は.NET2.0からのサポートだったっけ、確か。
>>475 List<T>.Sort とか。
Array.Find<T> とか。
Regex.Replace とか。
>>475 ゆとり乙
実行するメソッドを変数のように変えられるんだぜ?
479 :
465 :2007/09/12(水) 22:44:15
e.Graphics.DrawString(comboBox1.Items[e.Index].ToString(), font, solidBrush, e.Bounds.X, e.Bounds.Y); では無理だったけど e.Graphics.DrawString(comboBox1.GetItemText(comboBox1.Items[e.Index]), font, solidBrush, e.Bounds.X, e.Bounds.Y); に変更したら正しく取得できました。 テラサンクス!
480 :
313 :2007/09/12(水) 22:46:10
>>478 なんか分かりそうで分からない、もう少しで答えがでそうって
感じなんですが・・・
パンクしそうなので、もう少し頭を冷やして考えてみます。
ヒント、ありがとうございます。
(答えなのかも?)
>>474 ごめんマンマのサンプルは見当たらないね。
でも構造体配列のフィールドに普通にMarshalAs属性でByValArray指定するだけで
問題ないと思うんだけど。
>477 ポインタだったらIntPtrで受け取るから配列だと思ってたよ。 .NET2.0では対応してたんだ。普段1.1しか使ってないから知らなかったよ。 サンプルは1.1の時の名残でないんではと思う。
>>480 超大づかみに説明するとだな。
メソッドそのものを代入できる変数がデリゲート。
その機能を利用して、何かが起きた時に呼んでほしいメソッドを代入しておけるのがイベント。
>>313 お前もう最初の方で教えてもらったこと忘れてるだろ。
そんなんじゃどこまでいってもループだよ。
一回じっくりと消化してみろ。
イメージのわきやすそうなデリゲートの使用例を挙げると・・・
・予め基本クラスのメソッドにprotectedなイベントを仕込んで、メソッド処理を<追加>できるようにする。(差し替えではない)
・後で追加する機能があるかもしれないので、とりあえずイベントを仕込んでおく。
・任意の複数のメソッドを、一度の命令で処理したいとき。
>>483 え、イベント発生とかイベント受け取りとか言うし、デリゲートが実際に使用される時のメッセージのことじゃないの?
イベントという語にはそういう使い方もあるね
virtualメソッドにしていたところとか interfaceを実装させたりしていたところなんかを 全部delegateにしたらいい いまはあまりメリットを享受できないかもしれないけど C# 3.0になってラムダ式を使えるようになれば interfaceなんかと比べて五倍ぐらいシンプルで読みやすくなるし、 書きやすさも段違いになる
covariance、contravarianceは置いておいて、 delegate=非同期も可能なchainパターン と認識してるけど間違い?
?
delegateは第一に関数オブジェクトだろ 関数を渡したり保持したりするもの chainも非同期実行も出来るというだけで
>delegate=非同期も可能なchainパターン 非同期時にはChainできないぜぇ
ASP.NETなんですが、SQLでデータを取得、結果をDataGridなどで表示させるのですが その際に、1行1行にヘッダーをつけれるようにしたいのですが可能ですか?
そういうのはヘッダとは言わない
System.ArraySegment<T>構造体の存在を最近知ったんだけど 微妙に便利そうに見えるのに.MSのクラスライブラリ内でもほとんど使われてないみたいだね インデクサが付いてないのは濫用するなという意味なのかな
亀でごめんなんだけど、
>>474 の
>fixedでポインタにして
ってわざわざunsafeで括ってまでfixed使った方がいいの?
GCHandle.AllocしてMarshal.UnsafeAddrOfPinnedArrayElementのが
unsafeで括る必要なくていい様な気がするんだけど
>495 GCHandleだと配列の2つ目以降の構造体を取得するときに サイズ分IntPtrの位置をずらしたりできないからfixedでやったんだけど 実はできたのかな?
>>496 多分出来ないわ。
位置ずらすの忘れてた orz
でもなんかunsafeって精神衛生上あんましよろしくない気がする
思い切ってクラスの宣言にunsafe付けたらすっきりするよ!
すみません。0〜9、A〜Z、a〜z の文字を半角文字に置き換えるメソッドはありますか?
Microsoft.VisualBasicを参照設定に追加すれば Microsoft.VisualBasic.Strings.StrConv("ABCD01234", VbStrConv.Narrow, 0) でいけるよ。
Microsoft.VisualBasic は微妙なので……w IDictionary<char, char> に全部突っ込んで何とかするべきなのか、 あるいはもっと楽な方法があるのか、そういうのを知りたいです。
どの辺が微妙なのか詳しく
旧VBはドカタ用のウンコ言語だから笑いの対象でしかない といったことじゃないか
できるものは同じなのに
でもなんかそういう見方はあるよな 面接にいったとこのオヤジが うちはみんな優秀でVisualBasicなんだぜ!って自慢してるのみて 馬鹿じゃねーのって思ったが
>>501 そんなあほな方法考えながらなにが微妙なんだか。
まあ、あほといえばあほだけど
別にディクショナリに突っ込んどいてもいいんじゃない?
そんなことするくらいならもうVBの機能使っちゃうけどね。
そもそも全角を半角に変換しないでFA
それ2.0からライブラリの機能として用意されてる気がしたけど、 何を使うんだったか思い出せない
周りが言っているからVBはしょぼいとか安直に思っている 輩なんでしょうな。
バカでも使えるツールってすごいと思うのだが
うむ、VBを作った側は凄い。 VBを使う側はショボイ。
>502 501ではないが予想外な変換を勝手に丁寧にやってくれることがあってVBのメソッドはちょっとと思うことはある。 なんか丁寧にやってくれるパターンがあるおかげかいまいち速度が速くないので呼び出し回数が多い場面では使いたくない。 そんなんで、VBのメソッドを利用して実装してたら最初はあまり呼ばれないつもりが気づいたらいろんなところから呼ばれててパフォーマンスが気になって自前で実装し直そうとしたとき 予想外なよけいなお世話の変換もされててそういうのに依存した処理がそこら中にいたりして苦労するので 最初から必要最小限の変換処理をするのをVB以外ので実装されてるのを探したくなる。
全角英数なんてたいした数じゃないし 半角とマッピングするDictionaryを自作するのが一番いいんじゃない
そういう問題かw そこは誰も難しいと思ってないよw 置換というのは置換の前に置換対象を抽出する必要があるわけだが、 それ考えてるか?
Dictionary使うのか… ゆとり世代ってすごいなあw
すいません質問です。 構造体とクラスの使い分けはどういったときにすれば有効でしょうか? データメンバが少なければ 値型なので構造体の方が生成処理・使用処理が早い(時もある)見たいな事はかかれているのですが。
>>517 MSDNのどこかに使い分けのガイドラインがあったはずだから、探してみてくれ
全部クラスでいいよ
>>517 いろいろと面倒だから素直にクラスにしとけ。
小さいのを大量につくるときは構造体。
あとつまらないものも構造体。
Dictionary使わないってのはなんだ 配列使うのか まあこの二択だろ
なにそれw
ありがとうございます。普通にありました。 参考ついでにコピーでも。 ・プリミティブ型 (整数、倍精度浮動小数点数など) に似た単一の値を論理的に表す。 ・インスタンスのサイズが 16 バイト未満である。 ・変更できない。 ・頻繁にボックス化する必要がない。 この全てに当てはまれば構造体の方がほぼパフォーマンスがいいようです。 ただ、どういうときにボックス化を行ってるかわからないです。 interfaceによる多態性や、List<>の要素に変数を代入・順番に使用、とかはボックス化は行ってるのでしょうか?
>>525 インターフェイスへのキャストはボックス化を伴う。
List<int>にintを入れるときにはボックス化は行われない。
static void Main(string[] args) { int offset; int zenkaku = (int)'A'; int hankaku = (int)'A'; offset =zenkaku - hankaku; Console.Out.WriteLine("offset:"+offset); for (; zenkaku <= (int)'Z'; zenkaku++, hankaku++) { if((zenkaku-hankaku)!=offset) Console.Out.Write("offsetが違う!"); } Console.In.ReadLine(); }
Dictionary<char,char> dict; ... char hankakuku = dict[zenkaku]; こうか、 char[] array = new char[char.MaxValue]; ... char hankaku = array[(int)zenkaku]; こうだ。これ以外の実装はまずない。 怪しい処理するVBの関数使うより 処理内容が明らかなほうがいいだろ
>>526 ありがとうございます、やっぱりそうですか。
多態性に関する記事を漁ってたら、どう考えても参照型でなければ実現できそうにない感じです。
List<>のほうも、インターフェイスが関わってくると動きが少し変わってくるようです。
>char[] array = new char[char.MaxValue]; 正気ですか?
あればあるだけ使う派なんだねw
まあ実際問題としてPCでやるという前提とCharが16bitってこと考えたら配列持ちもありではあるなぁ 自由度低いからよほどピーキーな所じゃなきゃやらないけど
534 :
531 :2007/09/13(木) 23:05:15
charのmaxvalueがいくつかわかってないのかね たかが13kbyteのテーブルだぞ
535 :
531 :2007/09/13(木) 23:06:50
ちが、130kか
数十個しか値がないのにFFFF個(6万)配列取るのはなぜ?
最速かどうかはやや怪しいな。
知恵が足りないから。
539 :
531 :2007/09/13(木) 23:12:32
速度が欲しい時はこれだろ 普通はDictionaryで十分だと思うけど
16bitで65535じゃないのか
541 :
531 :2007/09/13(木) 23:23:34
charが65536個で約130kだろ
static public string ToHankaku(this string source) { StringBuilder sb = new StringBuilder(source.Length); foreach (char c in source) sb.Append(c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z' ? (char)(c - 65248) : c); return sb.ToString(); } これで十分だろ。
543 :
531 :2007/09/13(木) 23:35:18
65248きめうちでいいのか 案外シンプルだな
>Dictionary<char,char> dict; >... >char hankakuku = dict[zenkaku]; >こうか、 > >char[] array = new char[char.MaxValue]; >... >char hankaku = array[(int)zenkaku]; >こうだ。これ以外の実装はまずない。 わらかすな。
>Dictionary<char,char> dict; >... >char hankakuku = dict[zenkaku]; ありえんわ
547 :
531 :2007/09/14(金) 01:22:39
本来ifのいらないアルゴリズムにif書いちゃう気持ち悪さを感じないかね
感じないよ
夜中に見たら寒気したww同時に吹いたけどww もっとコードに美を求めようぜ
>Dictionary<char,char> ifどころちゃうわw
VBのStrConvが怪しい動きをするという例を教えてくれんか
お題だとa−ZA−Z0−9を半角へってことだから全角カナは無視しないといけないのか
t
構造体中の配列構造体の P/Invoke の質問を書いた者です。 みなさまお返事をいろいろとありがとうございました。結局、構造体をすべてフラットにするラッパを 同僚に作ってもらいました。 ところで SWIG という便利なものがあるらしいのですが、どなたか試した型いらっしゃいますか?
だからそんなことわざわざしなくてもByValArray指定するだけだと思うんですが。。
>Dictionary<char,char> dict; >... >char hankakuku = dict[zenkaku]; これってなんかまずいんですが?
>>557 ふむふむ
何がどのようにまずいんですか?
559 :
デフォルトの名無しさん :2007/09/14(金) 13:57:43
わざわざディクショナリ使うのに全値域を埋める前提になってる。 ディクショナリの意味全くなし。
あー、なるほど。
>>557 は富豪的すぎるってことですね。
納得しました。ありがとうございます。
562 :
531 :2007/09/14(金) 18:07:12
よく考えようぜ
事前にテーブル用意すれば判定6回は全部消せるんだ
しかしこれだけ規則がシンプルなら毎回判定しても別に問題はない
だが判定がこの五倍もあったらだいたい誰もが気持ち悪がって
事前にテーブル用意するだろう
じゃあどこからテーブルにして、どこまでなら毎回判定するのか
そこの基準があいまいになる
全部をテーブルでやれば、自分のコードを統一された規則で書くことが出来る
仕様変更があって判定の規則が増えて、テーブルにするはめになっても、
「このぐちゃぐちゃのif文をテーブルに落とさないと、うわー」
ということにならなくて済む
>>560 Dictionaryなのに全部使うわけないだろ
それなら配列使うわ
564 :
531 :2007/09/14(金) 18:20:27
じゃあインデクサ付けてテーブルっぽくしたクラス作っといて 中で存分に気持ち悪い判定すれば
566 :
531 :2007/09/14(金) 18:28:48
>>565 外部からのインターフェースはそれでいいだろうけど
if文をテーブルに直す時の問題は何も解決しとらんぜ
>>562 だったらディクショナリにインデクサでアクセスしたらだめだろ。
自分でそういう「コード例」書いといて何言ってやがる。
いまはそんだけしか判定がない前提だろう。 後々に備えてという考え方自体は否定しないが、 今回のはちょっとオーバースペックだ。 だいたいテーブル埋める時点で同じような泥臭い処理が入るだろ、 まあ工夫はいくらでもできるけども。
ifがごちゃごちゃしてたところでテーブル埋めるのに何の工夫がいるんだ?
570 :
531 :2007/09/14(金) 19:15:18
>>567 本来TryGetValueだな申し訳ない
適当に書いてしまった
571 :
デフォルトの名無しさん :2007/09/14(金) 20:03:22
ディクショナリーの処理コストがIF文6回以下で収まるわけ無いじゃん クラス呼び出しだけでも全レジスタスタックするんだぜ
クラス呼び出しってなんぞ
Dictionary にすると変換ルールを動的に変更できるから後々便利だってばっちゃが言ってた。 けど結局、無駄に switch を使うことにしました。
ディクショナリ内でのハッシュ取得や等値比較は どうしてもインターフェイス経由になるため、 衝突が一切発生しなくても結構なコストになる。 それにその他諸々の処理を合わせると、 愚直な判定に比べてかなり負荷がかかる。 それでもまあそれほどたいした問題にはならないとは思うが。
575 :
デフォルトの名無しさん :2007/09/14(金) 21:05:04
>>572 IF文とか単純なやつならILにコンパイルしたとき素直に展開されるだけだが
Dictionaryなんかを使えば..net Framework内のプログラムをコールする形になるだろ
そのコールする処理だけでIF文6回を超えるメモリーアクセスが発生するんだよ
もし配列に全部展開する形ならIf文6回以下のコストで実行できる可能性はあるけど
(処理回数と前処理の量次第)Dictionaryを使った時点で駄目だね
VB関数呼び出しの負荷はどんなもんなんだろ
577 :
デフォルトの名無しさん :2007/09/14(金) 21:16:59
VB関数はDictionaryのような汎用性を持たせる必要が無いからそれほどでないと思うよ 速度と可読性を考えたら一番バランスがいいと思う
誰も測ってない罠
>>547 本来 if がいるはず。
それを配列で誤魔化しているだけだろ?
マーシャリングとか入らんの?
581 :
デフォルトの名無しさん :2007/09/14(金) 21:23:41
VB関数ってCOMじゃないからマーシャリングは無いだろ
582 :
516 :2007/09/14(金) 21:36:26
>>531 本当のところ、高校生だろ?
まさか職業プログra...
VBの関数と同等の機能ってだけで、VBのランタイムを呼んでるわけじゃない。
584 :
531 :2007/09/14(金) 21:45:19
>>582 別に俺の身分を明かす気はないが、お前こそ
事前にテーブルを用意する発想もなければ
インデックスを変換に使うテクニックも知らない
ifを書き散らすことしかできないVBドカタじゃないのか
最終的にはLCMapStringだしな
ここは初心者用スレじゃないのか 516もあんまりあおるな
>>584 >事前にテーブルを用意する発想もなければ
>インデックスを変換に使うテクニックも知らない
知らないわけないだろ。
こっちはz80から20年以上コードかいてるからな。
531も516も偉そうなこと言っている割には全然役に立つことを書かない件
590 :
516 :2007/09/14(金) 22:20:58
役に立つことはかかないよw Dictionary使ったら速度は10分の1程度になるよ! でもそんなのかんけいね〜
まちがえた! Dictionary使ったら10分の1程度の時間で処理が終わるよ!!
arrayだとifとたいして変わらない。
593 :
531 :2007/09/14(金) 23:11:23
いや、正直なこといえば あんな簡単に変換できるなら事前にテーブル用意しようとは思わんけどな 一文字一文字対応させるようなややこしい変換規則になると思ってた
594 :
516 :2007/09/14(金) 23:19:23
偽者って… timeSpan 結果発表 if >00:00:00.8412096 Dictionary >00:00:02.0329232 Array >00:00:01.0014400
まだこの話題引きずってんのかw
596 :
516 :2007/09/14(金) 23:22:20
>>589 できるでしょ。
というかできない理由が思い浮かばない。
それに俺は過去に実際やったことあるよ。
c# ByValArray
>>594 ちょっとArrayが遅すぎないか?
ああ文字列変換としてやったときの時間?
にしてもArrayのがIfより遅いのは珍しいかも。
状況にもよるが、判定だけならIfより配列の方が5倍程度速い。
まあメモリ、CPUいろんな条件で結構変わるかもしれんが。
文字列変換までまとめたら1割程度の差でであまり変わらんけどな。
>状況にもよるが、判定だけならIfより配列の方が5倍程度速い。 ああもちろんこれは俺の環境での話。
ちなみにDictionaryだとIfのさらに7倍程度遅い。 つまり俺の環境では、だいたい 配列:If:Dictionary=1:5:35 程度ってことだな。
あーひょっとして変換かかる文字ばっかでチェックしたとかかな? 上のは、ほとんどが変換されない文字(ループ変数をchar範囲でAndとってcharにしたもの) でやったので、そういう意味では特にIfがかなり不利な条件だな。
>597 1.1まではできなかった。2.0からできるようになった。 ドキュメント読んでも1.1までとあんまり扱いが変わってるような印象を受けないので 1.1の時やろうとしてさんざん苦労してできないとわかった人はその印象が強いと思うよ。 新しいenumの値が増えてるわけでもなく、1.1で大抵の人がまず指定してみて もろに失敗したByValArrayというのも駄目だと思うよ。 2.0からできるようになりましたって大きく取り上げられたわけでもないと思うし。
ちんこまんこしっこうんこ
>601 StrConvも速度の参考程度になるように比較対象に混ぜてあげてください。
文字列を変換した場合 ※かかった時間のおおよその比率 配列:8 Dictionary:19 If:9 StrConv:50 な感じだたよ?
暇だったから適当にやってみた。テキストは全角・半角英数字をランダムに100万文字、 タイムは10回平均。 if :00:00:00.2571167 Array :00:00:00.0206023 Dictionary:00:00:00.0713178 StrConv :00:00:00.1486586 なんかおかしくね?
おかしいw
ほんとかそれ?
Ifってどんなの?
ちなみに
>>606 とかのは
return ('0' <= c && c <= '9' || 'A' <= c && c <= 'Z' || 'a' <= c && c <= 'z') ? (char)(c - 65248) : c;
見たいな判定してる(IfじゃないけどまあIfと変わらん)。
直った。 if :00:00:00.0279734 Array :00:00:00.0181842 Dictionary:00:00:00.0707453 StrConv :00:00:00.1461418 何を思ったのかコピペした後foreachからforに変えてたのが原因でした。 そら毎度毎度インデクサ使ってたら遅くなる罠 orz
611 :
デフォルトの名無しさん :2007/09/15(土) 02:55:43
クラスの入れ子っていうんですか? class{ ・・・ class{ ・・・ } } これってどういう意味があるんですか インスタンス作ったときに中のクラスのインスタンスも一緒にできるんですかね?
>>611 C# でクラスをネストさせても Java のようにはならずに
インスタンスは作られないよ
>>611 内クラスは外クラスのメンバに自由にアクセスできる。private でも。
// もちろん非静的なメンバにアクセスする場合は外クラスのインスタンスが必要。
あとはまあ外クラスに強く結びついているクラスとか。
ただし多用は薦められていない(ガイドライン参照)。
IEnumerator の実装クラスとか。
> インスタンス作ったときに中のクラスのインスタンスも一緒にできるんですかね?
できない。
615 :
611 :2007/09/15(土) 08:28:10
なるほどいろいろ利点?があるみたいですね 実験してみよっとありがとうございました
>>603 ByValArray をつけても構造体の配列は取得できなかった。null になってしまった。
他の int のメンバは取得できた。
何が悪いんだろう?
アンマネージドの方の定義とC#の定義を見せてもらわん限りなんとも言いようがない
619 :
デフォルトの名無しさん :2007/09/15(土) 12:27:19
プラグイン機能のあるアプリケーションを作りたいんですが、 基本的な話として、各プラグインのアセンブリってやっぱり それぞれAppDomain作ってそこにロードすべきなんでしょうか? なんか数が多かったらどんどんAppDomainが増えそうじゃないですか? これってまずい? かといって一つのAppDomainにロードしたら 各アセンブリを個別にアンロードできないですよね
普通のアプリでアンロードとか考える意味ないよ
解像度選択の列挙体で、VGAとかXGAとかの名称使うのは誤用だとわかっていても許せる? ライブラリ作っててふと思ったので。
まあ解像度自体本来誤用なんだから別に良いんじゃない
>>619 どんなプラグインか知らんが、普通に考えて
>それぞれAppDomain作ってそこにロードすべきなんでしょうか?
それはきびしいだろ。
AppDomain管理するコストの方がプラグインのアセンブリロードしとくよりきつそうだ。
動的におきかえなきゃならんのなら仕方がないが、そうでなけりゃ気にする必要ないでしょ。
AppDomainを活用するのはそう簡単じゃないよ。
626 :
624 :2007/09/15(土) 13:01:25
>>619 ちょっと追記。
もしプロトタイプ作るなら、個人的にはIronPython使ってみるのをおすすめする。
将来的にはDLRが.NETのアドインシステムの中核を担うと期待している。
>>625 >AppDomainを活用するのはそう簡単じゃないよ。
それに挑戦したのがSystem.AddIn名前空間の奴。
まあ案の定WCFみたいになった。
627 :
621 :2007/09/15(土) 13:07:41
>>622 wiki見てて始めて知った。おk、もう正しいとか正しくないとかどうでもいいわ。
>>623 VGAとかは解像度をあらわす単語じゃないはず・・・本来は。
>>619 じゃないけど、
>>624 Assembly.LoadFile(file).GetTypes()じゃだめなの?
>619 アンロードが必須ならAppDomainを作るしかない。 そこまで不要ならAppDomainを分けずにやってしまった方が手っ取り早い。 多少多めのAppDomainでもそれほどきつくはないと思う。 それぞれ通信するプラグインとそれを管理するexeがログ表示などするアプリはやったが そこそこの数のプラグインがいても特に問題なく動いている。 最大でせいぜい20くらいでいくらでも増えるわけじゃなかったからそれで大丈夫だった。 >628 それ、アンロードできないじゃん。 アンロードをはなから諦めるってのもありだと思うが、プラグインのdllをつかみっぱなしになるのが困らないか? 本体が実行中にプラグインだけ入れ替えたいとか使ってないのにファイルは捕まれてるのはちょっと気持ち悪い。 そういうのがいらないならありだと思う。
プラグインのタイプによるけど、 結構ホスト側と密に連携しようとしてることが多いからね〜 独立性の高いプラグイン機構ならまだいいんだけど
LoadFileの場合って、パスが異なれば違うアセンブリだと 認識させたりとかできるんだっけか? もしそれができるならロード前にファイルをコピーしてとかできるかな? 違うアセンブリだと認識させられないんなら無理だが。 もしくはILmeargeで無理やりアセンブリを独立化だw いやそれならilasmのほがましか?
もう全部実行時にコンパイルしちゃえ
FileStreamでbyte[]にコピーしてAssembly.Load()とかw
634 :
619 :2007/09/15(土) 14:33:28
アドバイスありがとうございました。
とりあえずカレントのAppDomainでロードしてみます。
(問題はプラグイン仕様を後で変えずにロード法を変えられるかですが)
>>633 Load(byte[])のオーバーロードって
ファイルそのもののバイト配列じゃないっしょ?
以前これ見てウホッと喜んで試したけど動かなかった気が。
つかCOFFイメージってなんだこりゃ
>>634 何も知らない頃俺これで動かしてたが…
LoadFromだったかな?
さすがに今はやってないがw
すいません質問です あるインターフェイスを実装したクラスを継承したら、 継承クラスももちろんインターフェイスを実装してますよね。 そのとき、インターフェイスから実装されたメソッドはvirtualもoverrideもかかれてませんが、 overrideできちゃうんですかね?
ためせ
>>634 いやファイルそのもののイメージであってる。
exeなりdllなりをバイト配列でそのまま渡す。
試さなくても分かるだろw それが分からないのは結局継承もインターフェイスも中途半端にしか 理解してないからだよ。
値が重複しないコンテナってありますか? List<string> container = new List<string>(); container.Add("foo"); container.Add("bar"); container.Add("foo"); // 追加されない
KeyedByTypeCollection<TItem> あたりかしらん?
んなむちゃなw
自分でIList<T>積んだクラスを作るか、List<T>を継承してAddいじれば?
3.5のHashSetかな。 今ならKeyedCollection派生か Dictionary<,>のラッパー作るか、かな?
Addはoverrideできないだろ 順序を保持しないならDictionaryのラッパー 保持するならListのラッパーを作ればいいんじゃね
overrideできない?
overrideできないな。 class ListEx<T> : List<T> { new public void Add(T item) { if (!Contains(item)) base.Add(item); } } これでAddは対応できるな。
なんで隠蔽する必要があるの?w ていうか、それ仮にaddがオーバライド可だとしてもすべきじゃないでしょ。 動作の意味が違うじゃん。 別のメソッドを追加する対応にすべきだ。
ていうかList<T>使うのがおかしい。 Collection<T>を派生元にすべき。
クラス名に重複なしが明示されてるならAddでもいいと思う 語尾にwを付ける必要はないと思う
それにしてもシャドウイングは不味いだろ
どうしてもAddにしたいなら継承を使うべきではないね。 まあ確かに、大人数で使うとか売り物にするとかのライブラリでなければ そこまで拘る必要ないじゃん、と言われればそれも一理あるけどさ。
IList<T>を自分で実装するくらいそんなに大したことじゃないし Collection<T>使えば簡単にできるし わざわざList<T>を継承する意味がわからん
馬鹿だから
グラフィックのDrawImageで質問です bmp0からbmp1へと別のとこへのコピーはできたのですが bmp0からbmp0へと同一bmp内でのコピーはできませんでした これはできない仕様なんですか できる方法はありますか?
bmp0と同じサイズの新しいBitmapオブジェクトを作ってそれにbmp0をDrawImageして その上に何か好きに描いたりすればいいだろ
やりました ただ スピードの面で直接1回で描けたらいいなと思って
GetPixelとSetPixelでもできるだろうけどかえって遅くなるから LockBits使って気持ち悪いことやるといいよ
やっぱり同一BMP内ではコピーできないんですかね LockBits 配列を使うやつですね 調べてみます
質問してる奴の言ってることもよくわからんが 回答してる奴の言ってることもよくわからん 本当何のこっちゃw
エスパー質問者にエスパー回答者 いや両方アホなだけか
>>647 IList<T>にキャストしたら
Addの動作が変わって値が重複するだろ
new厨目を覚ませ
はあ?
あは
666 :
デフォルトの名無しさん :2007/09/17(月) 21:55:05
色々調べてC#でACCESSをオートメーションで動かす事に成功しました。 下記コードです。 Access.ApplicationClass oAccess = new Access.ApplicationClass(); oAccess.Visible = false; oAccess.OpenCurrentDatabase("C:\\TEST\\TEST.mdb", true); oAccess.DoCmd.OpenQuery("Q_TEST", Access.AcView.acViewNormal, Access.AcOpenDataMode.acEdit); oAccess.CloseCurrentDatabase(); oAccess.DoCmd.Quit(Access.AcQuitOption.acQuitSaveNone); System.Runtime.InteropServices.Marshal.ReleaseComObject(oAccess); oAccess = null; 見よう見まねで書いたので oAccess.OpenCurrentDatabase("C:\\TEST\\TEST.mdb", true);の大に引数trueの意味と oAccess.DoCmd.OpenQuery("Q_TEST", Access.AcView.acViewNormal, Access.AcOpenDataMode.acEdit); の第2、3引数Access.AcView.acViewNormal, Access.AcOpenDataMode.acEditが何を意味しているのか 良く分かりせん。どなたか教えて下さい。
667 :
666 :2007/09/17(月) 22:00:36
自己レスです。 oAccess.OpenCurrentDatabase("C:\\TEST\\TEST.mdb", true);の第2引数trueの意味だけは わかりました。trueは排他モード、falseは共有モードということです。
OpenQuery にしてもそのままぐぐったら先頭に解説が見つかったんだが
669 :
デフォルトの名無しさん :2007/09/17(月) 22:28:13
@View(第2引数)に指定する定数 acViewDesign デザインビューで開きます。 acViewNormal 選択クエリーならデータシートビューで開きます。 アクションクエリーならデータの追加、更新、削除を行います。 acViewPivotChart ピボットチャートビューで開きます。(選択クエリーのみ) acViewPivotTable ピボットテーブルビューで開きます。(選択クエリーのみ) acViewPreview 印刷プレビューで開きます。(選択クエリーのみ) ADataMode(第3引数)に指定する定数(選択クエリー時のみ有効) acAdd 追加専用モードです。 acEdit 編集・追加・削除モードです。 acReadOnly 読み取り専用モードです。
これぐらいだったらリークしないよなあ これぐらいだったら…
リークって言うとどことなくかっこいいから禁止 お漏らしと言え
すいません、ジェネリックに関して質問です。 クローズ構築とはなんですか? 説明読む限り型パラメータが固定/ないジェネリックとしか読めないのですが・・・ どのようなときに使うのでしょうか?
インスタンスを作れるのがクローズ構築型。List<int> とか。 オープン構築型は型パラメータが未定義なのでインスタンスを作れない。List<T> とか。
「要素にHoge型しか受け入れないコレクションを作成するために、 Collection<T>に対するクローズ構築型であるCollection<Hoge>を継承して HogeCollection(非ジェネリック)を作った」 というような使い方でいいのかなあ
ま、どうせリフレクションでしか使わんような言葉だから大して気にする必要もないよ
プロパティって配列とかジェネリックを返すものって作れまつか? int X=10; public int プロパティA { get { return X; } } とかで Xを配列にしたりジェネリックにしたりとか
やってみれば?
確かにこのスレできくより コンパイラにきいた方がはやいなw
private void Button1_Click(...) { Class2 c2 = new Class2(); //適当な処理 Form2 f2 = new Form2(); f2.ShowDialog(); //適当な処理 } としたとき、Form2はDisposeが必要なのに Class2はDisposeしなくていいのは何故?
知るかよ。Class2ってなんだよ
Formは内部でリソースを使ってる もしClass2の内部でリソース使ってるなら解放が必要 IDisposableならusing節推奨
>>681 リソースとはコントロールって事でしょうか?
Class2は呼び出し元のForm1で指定したURLを読み込んで
System.Net.WebClientクラスを使った処理をしています。
Form1に書いても良かったのですが、同様の処理が複数あるので
それぞれ別クラスに書きました。
IDisposableについては初めて知ったのでこれから勉強します。
>Class2はDisposeしなくていいのは何故? Class2でDisposeするかしないか決めるのは実装者のあなた
Class2がIDisposableなクラスを使ってるならDisposeしなきゃだめだろうな 普通はしなくても平気だけど
685 :
デフォルトの名無しさん :2007/09/19(水) 08:43:06
C#でダブルクォーテーションを文字列変数に格納したいとき string A = """C:\\Program Files\\Test.exe""” +" /p" + """C:\\Program Files\\Test.arg""” のように"を2つかさなればよいのでしょうか? 要は "C:\Program Files\Test.exe” /p "C:\Program Files\Test.arg” でパラメータを指定して 起動していのです。 exeのショートカットではでそのままはリンク先に"C:\Program Files\Test.exe” /p "C:\Program Files\Test.arg”を 指定してうまくいったのですが System.Diagnostics.Process.Start(A);とすると起動できないのです。"(ダブルクォーテーションの使い方が悪い?)
686 :
685 :2007/09/19(水) 08:44:44
>>685 一部ダブルクオーテーションが全角になってますが実際は半角です。
エスケープしろ
\"
>>685 " 'C:\Program Files\Test.exe' "でできないっけ?
@"C:\Program Files\test.exe"
質問です。クラス名(名前空間除く)をstringで取得する方法はないのでしょうか? てっきり規定のメンバで存在すると思っていたのですが、見つかりません。
typeof(MyClass).Name
Object.GetType().Name; Object.GetType().FullName;
アクセス許可とかアセンブリの項目見てると頭痛くなる(-o-;)
つ バファリン
SQLの SELECT A AS でb竅翌使おうとするとエラーが出る・・・これらを表示させたい場合にはどうすればいいでしょうか?
"で囲む 予約語で具具って美奈代
intを返す関数を作ったんですが retrnで返そうとすると そんな変数存在しねぇぞ(゚Д゚)ゴルァ!って怒られるんですけどなんで? 宣言を int a =new int()のようにしたら大丈夫ですたが int function{ int a return a; } こんなの
ちゃんと動作しなかったソースをコピペで貼ってくれないと。
>>699 初期化してないから
int a = 0;(int a =new int()でも一応おk)
ええ、たったそんなことだったのか 結構はまる人おおそう ありがとうございました
>>702 残念ながら嵌らない。
第一
int a;
return a;
なんてaを宣言して初期化せずにそれを返すなんてことはしない。
参照型なら例外処理とかで
object a;
…
catch
{
a = null;
return a;
}
とかやる場合もあるが。
居ません
>>692 ,693
ありがとうございます。独立したメソッドでしたか・・・
いや中でif分で値を入れてたんだが どれにもあてはまらないパターンがあったようだ ローカル変数以外は初期化されるんだっけ?やはり基本は大事か
= new int(); とやるとInt32が持つInt32型のメンバ変数が自動で規定値に初期化されるから 初期化したことになるというよくわからん理屈
>>706 初期化されない。
つか、フィールドはコンストラクタで、ローカルは宣言時に初期化するだろ普通。
>>708 メンバ変数は確か 0 に初期化されたんじゃ。
もちろん、初期化してないと Warning は出るけど。
フィールドは初期化してなければコンストラクタで型の既定値で初期化されるッてだけ
なにがもちろんだ、警告なんかでんわい。
値が代入される可能性が無いフィールドがあるときに出る警告と勘違いしてるんだろう
ローカル変数以外は0で初期化される 参照型はnull,値型は0になる
プリミティブ型のフィールド以外は必要がなければ自動初期化に任せてる プロパティ用のフィールドにいちいち全部null代入するとか無意味だろ
class C1 { public int i; } class C2 { public int i; public void Set(int i) { this.i = i; } } C1 c1 = new C1(); // CS0649の既定値を使用しますの警告 C1 c1 = new C1(); c1.i = 9; // フィールドに直接代入すれば警告はない C2 c2 = new C2(); // Set() を呼ばなくても警告は出ない
publicフィールドが規定値であることを知れるからな ていねいなコンパイラや
なにげにコンパイル速いしな。
VisualStudio2005を使用し、C#で開発してるんですが 部品のメソッド一覧を作成するときに使えそうなツールってありますか? メソッド一覧には「メソッド名」「引数」「機能」「例」「使用先」を載せたいです
sandcastleとか 最終的な生成に何を使うにしろC#はドキュメントコメントがコンパイラに組み込まれてるから 書き方はそれに従うように
720 :
デフォルトの名無しさん :2007/09/20(木) 16:26:07
VBをC#で書き換え中なのですが・・・ 質問です. VBで PixelsToTwipsX とは, 座標変換をするためのもの というところまでわかりましたが C#ではどのように記述すればよいのかわかりません. 現在,サンプルプログラム(VB)を参考に C#でプログラムを組んでいます. 初心者的な質問ですがご教授願います.
722 :
デフォルトの名無しさん :2007/09/20(木) 16:38:59
描画時にGraphicsで使える単位に変換して実寸指定すればいいんだろ
twipはpointの二十分の一なんだろ Font font = new Font("MS Gothic", twip / 20F, GraphicsUnit.Point); こんな感じじゃね?
スクリーンの解像度(dpi)みないと駄目っしょ
726 :
デフォルトの名無しさん :2007/09/20(木) 19:36:06
.NETの例外はJavaのように実際に例外を起こした行を取得できないのかな? .NET EXEから.NET DLLを参照するようにしてるんだけど、 DLL側の情報がStackTraceに見当たらない・・・
>726 Application.ThreadExceptionイベント
デバッグ情報なしだと不可能だったような 言語や最適化でいくらでも変わる
アプリケーションのバージョンをチェックして 指定の場所から最新のアプリを取得してくるアップデータをつくったのはいんだが アップデータのそのもののアップデートをどうやってやればいいか悩んでまつ アップデータそのものがアップデートを実行してるのでEXEに上書きできないわけだが なにかいい案はありませんか賢い人
>>729 テンポラリディレクトリに自分自身をコピーして実行すればいいだけだろ
アップデータのアセンブリを実行時に生成しちゃうとか
うちの会社の場合… 最初に起動するのはチェック用プログラム。 アップデートなしだとターゲット起動
ゴメ チェック用プログラム=アップデータなんだね。 ターゲットがアップデータverチェックだな。 ターゲットが起動したらアップデータ終了だし。
734 :
デフォルトの名無しさん :2007/09/20(木) 21:42:32
わかった。チェック用のプログラムを作ってアップデータを確認すればいいんじゃね チェックが不具合あったらチェックのチェック用を用意してさらにチェックのチェックノチェ・・・ 俺って天才じゃね
テンポラリに最新版おいて アップデータ置き換えバッチ書いてスタートアップに保存 アップデータ起動時にバッチ削除
JITコンパイルされたコードを VirtualProtectでも呼んで動的に書き換えちまえばいいんじゃね やった事ないけど
>729 手抜きでいいんなら元のexeをリネームしてどかして入れ替えで。 リネームした方は新しいexeで起動したときにでも削除で。
バージョンチェッカーが自身とメインモジュールの最新版をWorkにダウンロード ↓ チェッカーは自身のプロセスIDを引数にしつつ、アップデータを起動、自身は終了させる。 ↓ アップデータはチェッカーの終了を待った後、それぞれの最新版と入れ替える ↓ アップデータはメインモジュールを起動する(更新がなかった場合は、チェッカーが起動させる) アップデータをWorkに置くようにすれば、たぶん全てのモジュールが更新できる。
>>738 俺はそれでアップデータをチェッカーのリソースにつっこんで
アップデートのたびに生成したな。
アップデータが存在したらその回はアップデータを消すだけで
バージョンチェック省けるし。
740 :
729 :2007/09/20(木) 23:59:44
ん〜、 つまり、 (アップデートする人)(ソフト本体)のほかに (チェックをする人?)を作れってことでつか? ソフト本体がアップデートする人のアップデート情報を 取得できてたら差し替える って方法でいこうとおもってるんでつが
素直にClickOnce使おうぜ
>>740 ソフト本体が他の媒体の面倒をみる設計で問題なければそれでいいんじゃないか。
落として来るものをデータじゃなく実行可能なものにする。 アプリは落として実行してすぐ終了。後は落としてきたものに任せる。柔軟性高し おすすめはmspかそれを実行するexe。署名で一般ユーザーでも更新可能になる。 が、この利点は会社、組織じゃないと駄目なのが珠にきず
>>741 フレムワク1.1だからだめぽ
データ差分も1時間おきにでるので
クリックワンコだけじゃだめぽ
というわけでつ
>>742 トン
>>743 アー、まるでクリックワンコみたいな動作をアップデータにさせるわけでつね
たしかにそれなら柔軟かもしれないです
mspってのはどのmsp・・・?
745 :
デフォルトの名無しさん :2007/09/21(金) 07:48:43
AccessC#からオートメーションで操作させるときのインスタンス生成で Access.ApplicationClass oAccess = new Access.ApplicationClass(); と Access.Application oAccess = new Access.Application(); 2種類ありますがこの2つはどう違うのでしょうか?
変わらないと考えていい
>>744 とりあえずmsp何?なら諦めとけ。WindowsInstallerのパッチ形式だが
知識ないと作るの難しいから
クリックワンスとか以前に、ようはパッチを落として起動するだけの話
VS2003、ASP.NETのDataGridで、bニいう列を作りそこにSQLで得た結果DataSetに入れ その行数を1,2,3・・・・という形に表示させたいのですが、どのようにすればいいでしょうか?
SQLをいじる。連番振りの方法はDBMSによりけり
PropertyGridでネストされているクラスを展開させたいのですが、どうしたらいいでしょうか? ネストされていなければ、TypeConverterでExpandableObjectConverterを指定すれば 簡単にできるのですが、展開したクラスの中に、さらに自前のクラスがあると、 それがうまく展開されないです…。
BinaryFormatterとかで保存したList<>って 保存時の順番が保持されるかどうかって保証されてないんだっけ?
さっきー大暴走!!!!
誤爆った。
質問です。 Delegate型(delegateキーワードを使って作った型ではない)の変数に メソッドを入れるとき、いちいちdelegateで型を作っているとものすごい数になるので 直接メソッドグループをDelegate型の変数のなかに入れたいのですが、 'メソッド グループ' から 'System.Delegate' に変換できません。 と言われて入れることが出来ません。 どうにかして入れたいのですが、delegateで型を作るしかないですかね?
>>754 >いちいちdelegateで型を作っているとものすごい数になるので
この目的だと、
.NET 3.5 から、Action デリゲートと Func デリゲートが標準で用意されてるんで、
それを使えばいいと思う。
>>751 されてるはずだけど、何でそう思ったの?
>>754 メソッドグループって何だっけ?
シグネチャさえあってれば1つでいいはずだけど。
>>755 .NET 2.0なので無いです… orz
>>756 引数が全部ばらばらなので無理です。
MethodInfoを使えば何とかなりそうだけど、遅いんだよなぁ orz
>>757 引数や戻り値を全部objectにするとか。
delegate object FooHandler(object o)
>>758 でもそれだと全てのメソッドの引数もobjectにしなければならないので
今からだと厳しいです。
>>759 リフレクションを使うのでMethodInfoを取得するのが重いんですよ
>>760 確かにリフレクションは速くはないけど、
MethodInfoの取得がボトルネックになるような場面ってあんまり思いつかないなぁ。
具体的に何やってるの?
>>757 Action とか Func に相当するものは、2.0 でも自分で書けるよ。
ちょっと面倒だけど、↓みたいにしとけば、3.5 になったときに修正も不要なはず。
delegate void Action();
delegate void Action<T>(T x);
delegate void Action<T1, T2>(T1 x1, T2, x2); ・・・
delegate R Func<R>();
delegate R Func<R, T>(T x);
delegate R Func<R, T1, T2>(T1 x1, T2, x2); ・・・
ああ、でも、引数が全部ばらばらだとちょっと困るか。
↑のAction とか Func を object[] に格納しといてキャストして使うか、
リフレクション使うか。
てか、そんな引数タイプが異なるものを使おうとすると、
リフレクション使わなくてもリフレクション並みに処理重たそう。
>>754 >メソッドを入れるとき、いちいちdelegateで型を作っているとものすごい数になるので
>直接メソッドグループをDelegate型の変数のなかに入れたいのですが、
C#の文法はそういう用途をサポートしていないので
自分で簡易コンパイラを作るか、
C#のコードを生成するコードジェネレータでも作ればいいんじゃね?
コンパイル時にまでに必要なメソッドは確定してるんだよね?
>>761 やり直し・元に戻す処理を保存するのにわざわざ条件分けして処理するのも大変なので
Delegateを使おうと思ったのですが、こんなことになるとは orz
>>762 そんなジェネリックだらけの物だったんですねそれ…
それなら何とかなりそうですが、数十個分のを書くとなるとちと面倒ですね
>>764 >やり直し・元に戻す処理を保存するのにわざわざ条件分けして処理するのも大変なので
>Delegateを使おうと思ったのですが、こんなことになるとは orz
そういうのはIronPythonとかIronRuby使った方がさくっと書けるんじゃないかねぇ。
C#+Delegateでやるなとは言わないけど、
少なくとも手段に対して実力が伴っていないような印象は受ける。
はじめからそれぞれの操作をオブジェクトとして表現しとけばよかったんじゃね まだC#にはそういう方法の方が合ってる気がする
System.DelegateにキャストしてしまったらDynamicInvoke()を使うことになるから、 MethodInfoでリフレクションでやるのと変わらない気がする。
それに引数・戻り値がばらばらなら、 実行時にどのシグネチャをもつdelegateかの判別が必要なんじゃ? そこでどうせ分岐するんじゃね?
引数には、それを通していろんなものを引っ張ってこれる「なんでもオブジェクト」的なものを渡すようにして シグネチャを統一してしまった方がいいんじゃね
>>766 それはどのようにするのでしょうか?
enumとかで条件分けするってことでしょうか?
>>767 そうなんですよね。しかし、MethodInfoで試そうと
Type.GetMethod()をしてもパブリックメソッドしか引っかからないのでどうしようかなと。
>>768 DynamicInvoke()を使うのでパラメータはobject[]にすれば判別する必要が無くなります。
>>769 それがまさしくobjectだと思うのですが、毎度毎度キャストするのも重たいし…
>DynamicInvoke()を使うのでパラメータはobject[]にすれば判別する必要が無くなります。 などと平気で言いながら、 キャストが重いとか言う…
772 :
769 :2007/09/21(金) 19:08:43
objectで渡すなら呼び出し先の判別が必要だろ 実際の型として何を要求してるかはメソッドによって違うんだから。 MouseEventArgsなんかはそれを一つ渡すだけだけど中にいろんなオブジェクトが入ってるだろ? そのおかげでマウス関連のイベントハンドラはMouseEventArgsに統一できる。 「なんでもオブジェクト」はそういう意味で言った
C#からExcelのファイルを生成したいんだが ここ見ると評判悪いみたいだね VSTOを買うわけにもいかないし 何かいい方法はないだろうか
774 :
726 :2007/09/21(金) 19:09:58
throw ex; が原因だった。ごめんね。 てか throw; って・・・
初歩的な質問ですいません。 特定の数値やbool値を保存したり読み込んだりするには、どうすればいいのでしょうか?
>>777 初歩的な指摘ですみません。
どこに保存するつもりですか?
779 :
777 :2007/09/21(金) 20:49:24
すいません 実行ファイルに組み込んで保存できるならそこで、出来ないなら適当に所謂datファイルとしてです。 アプリケーションのオプション設定などを保存しておきたいのです。
780 :
デフォルトの名無しさん :2007/09/21(金) 20:55:29
レジストリを使うか2.0以上なら設定ファイルってやつがある 1.1の時にはデータセットのreadXMLとWriteXMLを使って保存したこともあったな
設定用のクラス作ってXmlSerializerでXMLファイルに/BinaryFormatterでバイナリファイルにシリアライズするか レジストリに書き込むか C# 設定 保存 でぐぐればいくらでもでてくるっしょ
782 :
777 :2007/09/21(金) 21:14:07
やはり入門書に載ってないと混乱する癖は何とかしなくては・・・ 確かに検索したら一発でした。 ・・・というか・・・すごく楽ですね!!びっくりしました。
abstract これなんて読めばいいんですか?
抽象
いや・・・意味じゃなくて、読み方です; 784さんは、なんて読んでいますか?
chusho
786さん・・・笑 これは諦めたほうがいいんですかね。。。
マジレスするとアブストラクトなんだけど、辞書で調べろよ
中学時代はずっと、ぼーとしてたんで。。。すいません;
興味ないことは覚えない学ばない! 社会人の特権だよな
Funcは Func<T1,T2,TResult>だぜ
793 :
デフォルトの名無しさん :2007/09/21(金) 22:08:38
それって誘拐っていみじゃないですか!?
>>770 Redoしたいのが
SomeMethod(Arg1 arg1, Arg2 arg2)
といったアクションだったら
class SomeMethodObj : IActionObj
{
Action<Arg1,Arg2> action;
Arg1 arg1; Arg2 arg2;
public SomeMethodObj(Action<Arg1, Arg2> action, Arg1 arg1, Arg2 arg2){
this.action = action; this.arg1 = arg1; this.arg2 = arg2;
}
public void Invoke(){
action(arg1, arg2);
}
}
引数までオブジェクトに囲い込めばいいんじゃないの
匿名メソッド使えばオブジェクト作る必要すらなくなる
795 :
デフォルトの名無しさん :2007/09/21(金) 22:35:05
http://www.atmarkit.co.jp/fdotnet/vsexpress/vsexpress_02/vsexpress_02_03.html に書かれているコードについて質問します。
> // フィールド
> 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) を宣言するときにアクセス修飾子が使われていないのでしょうか。
1) フィールドです 2) 既定のアクセスレベルが定められているからです
メンバのアクセスレベルを省略したらprivateになる lwwsUrlは重要だから目立つように最後に書いてるんじゃね
一行空けてんだから汲んでやれよ
ああ、プロパティ用のフィールドじゃないから別扱いにしてあるのか。
>>793 アブダクションだっけ?
UFOのやつね。
801 :
デフォルトの名無しさん :2007/09/21(金) 23:21:19
>>796-799 ありがとうございました。
・ lwwsUrlもフィールドであるけれども、 特にプロパティ用のフィールドを 「フィールド」 としてまとめている。
・ アクセス修飾子は省略でき、 省略するとprivateになる。
というわけですね。
もう1つ質問します。
>>795 のコードでは、 プロパティ用のフィールド名の先頭にアンダースコアを付けて、 それとわかるようにしていると思うのですが、
そのような書き方は一般的なのでしょうか。
>>795 のような書き方だと、
「プロパティ用のフィールドは直接触るな。クラス内部でもプロパティを通せ」
という意思表示のようにも見えるけどそうはなってないね
> ・ アクセス修飾子は(snip)省略するとprivateになる。
必ずしも真ではない。詳しくはMSDN
言語によっても異なるしな。
>
>>795 のコードでは、 プロパティ用のフィールド名の先頭にアンダースコアを付けて、 それとわかるようにしていると思うのですが、
> そのような書き方は一般的なのでしょうか。
それなりに見かける。インテリセンスで前の方に集まって見やすいという主張もある。
でもおいらはアンダースコアつけない。
外部に見せないものは趣味の範囲だし。
もちろん複数人でコードを共有する場合はきちんと規約を作るべきだが。
アンダーバー頭につけるのは視覚的に見難い気がするよ。 昔ながらの小文字のm一文字がやっぱり一番しっくりくる。 なぜかあまりやってる人見ないけど。
>>803 > 言語によっても異なるしな。
少なくともここはC#のスレだと思うんだが
クラスのことじゃね
>>797 はメンバと言ってるけどな
privrateなフィールドにアンダーバーを付けるのはIronRubyのソースでも見た。 thisは省略。 そっちの方が分かりやすいかなぁ。
俺はなんもつけないぞ それが一番多数派じゃね
>>805 でもVB.NETのソースとか結構読むことあるし
810 :
デフォルトの名無しさん :2007/09/21(金) 23:49:23
foreach( Hage hage in Hoge.Hages){}みたいな感じで使う HageCollectionクラスを作る必要ができました。 上の方で「なんでList<T>から継承するの? 馬鹿?」みたいな話がありましたが ICollection<T>とかIList<T>とかから継承して、全部自分で実装するべきなんですか? List<T>を継承して動作変えたいところだけnewで隠蔽するんじゃ駄目ですか? (sealedなクラスで他の用途は無いんですが)
811 :
デフォルトの名無しさん :2007/09/21(金) 23:51:59
アンダースコアを付けるのは、 皆がやっているわけではないのですね。 「C#におけるメンバは」 宣言時にアクセス修飾子を省略するとprivateになる、 という理解でよいのでしょうか。
Collection<T>使えよ
List<T>(たぶん派生したものも同じ)オブジェクトって publicメンバとして公開してはいけないことになってたような List<T>はパフォーマンスが目的であってカスタマイズできないからCollection<T>を使えと MSDNのどっかに書いてあった覚えがある
SortとかForEachとかFindとかがList<T>にしかないのが気に食わんけどな 3.5は遠い
全部自分で実装するったってList<Hoge>をメンバに持って そのメソッドを呼び出すだけ 動作変えたいなら変えればいいし なんでわざわざ制限が多くてわかりにくい継承を使いたがるのかわからん
>>810 お作法的にはダメだろうね。
でも所詮一人で書いてるコードで自分で自分の罠に落ちない自信が持てるなら
別にかまわんでしょ。
818 :
デフォルトの名無しさん :2007/09/22(土) 00:18:27
>>817 C#の言語仕様はもっと複雑なのですね。
皆さんありがとうございました。
インラインアセンブラが使え無い言語は 基本的に劣っていると考えたい・・・
ILGeneratorがあるじゃないか
メンバはprivateになるさ
822 :
デフォルトの名無しさん :2007/09/22(土) 00:39:51
VB6からC#へ移行時の質門です。 VB6である行範囲をコピーして別の行範囲にコピーしたいのです。 ***VB6のコード:*** Dim oExcel As Excel.Application Set oExcel = CreateObject("Excel.Application") oExcel.Workbooks.Open FileName:="C:\TEST\TEST.xls" oExcel.Application.Sheets("TEST").Select oExcel.Application.Rows("1:42").Copy oExcel.Application.Rows("43:84") をC#で置き換えしようと思い以下のように書きましたが シートの選択の記述が分からなかったのでとりあえずActiveSheetにして みました。 Excel.ApplicationClass oExcel = new Excel.ApplicationClass(); Excel._Workbook oWB; oWB = (Excel._Workbook)(oExcel.Workbooks.Open(@"C:\TEST\TEST.xls", Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value)); oSheet = (Excel._Worksheet)oWB.ActiveSheet; シート選択わからなかったのでとりあえず oExcel.Application.Rows.Copy["1:42"] oExcel.Application.Rows["43:84"]???ここがよく分からない しかし上記コードでは行範囲コピーでエラーが発生してうまくいきません。 Excel8.0 Object Libraryを参照設定しています。どなたか教えて下さい。
>>810 勘違いしてそうだけど継承するのは全然構わないよ、MSのサンプルコードでもやってるし。
ただ、動作を変えるのならnewで隠さず名前も変えろってだけの話。
>>819 インラインアセンブラは、言語じゃなくコンパイラの仕様だろ
Dは言語仕様にx86アセンブリを含んでるけどな
827 :
デフォルトの名無しさん :2007/09/22(土) 05:39:55
>>800 お前のせいでUFOに誘拐されたアメリカ人の証言が頭の中で舞ってしまったじゃないか
Imageクラス(というかGDI+)についての質問です。 あるファイルなりメモリ上のデータなりを、Imageクラスでデコードできるかどうか、を知る方法はないでしょうか。 現在はtryブロック内でImage.From*を使い、例外が発生するかどうかで判断しているのですが、いちいちImageクラスのインスタンスが生成されたり例外が発生したりするので無駄が多いように思いまして……
それしかない
自力でヘッダ解析するしかないんじゃないかな
>>822 ((Excel.Range)oExcel.Application.Rows["1:42", Missing.Value]).Copy(oExcel.Application.Rows["43:84", Missing.Value]);
コンパイルエラーと実行時エラーくらいはっきり区別しようよ
エクセル操作する部分だけvb.netでライブラリ化した方がいいんじゃない?
>>831 に書いてあるような調子のコードってメンテ不能じゃないか?
質問です。 Windowsのアドレス帳ファイル(.wab)のバイナリデータを読み込みたいと思っています。 バイナリデータの仕様はどこかで公開されているのでしょうか? 特定のライブラリやAPIがあるようでしたらばそれでもOKです。
835 :
833 :2007/09/22(土) 18:11:32
>>834 ありがとうございます。
軽く目を通したんですが、MS系の開発は初めてで解読できませんでした。
諦めてCSVでエクスポートする方法を提案したいかと思います。
どんだけあきらめいいんだよw
837 :
833 :2007/09/22(土) 19:53:17
自分、専門はJavaなんでMSDNを読んでいると眩暈がw そもそも簡単ならやってくれる?程度の優先度低い話なんですよ
838 :
デフォルトの名無しさん :2007/09/22(土) 22:00:38
>>831 ありがとうございます。
もっと勉強します。
>>832 VBの方がやはりいいのでしょうか?
C#からExcelを扱うのは一般ではあまりやらないのでしょうか?
VB.NETでもやっぱり面倒だよ たくさんExcelを操作するコードを書くならVBAのマクロを生成して それを呼び出すという手もある
>>838 エクセルの操縦に限れば遥かに楽だね。
エクセルの設計のいい加減さと、VB.NETの旧VBを引きずってるいい加減さが
親和的なんだよね。
List とかジェネリッククラスを継承した場合って、Add とかのメソッドの override が 出来ないのね。知らんかった。 どうしてできないの?
委譲するべきだから ほぼありとあらゆる場合に継承はするべきじゃない
.NETではオーバーライドを許可するメソッドは テンプレートパターンのためのもののみに限定する方針みたいだね むしろオーバーライドできないのが普通 Collection<T>にはカスタマイズ目的でオーバーライドさせるためのメソッドがあるよ
virtualにするとパフォーマンスが落ちるしな
845 :
デフォルトの名無しさん :2007/09/22(土) 22:50:53
C#のフリーコンパイラでお勧めのものを教えてくださいおっ [条件] ・.NET FRAMEWORK 1.1でコンパイルできるもの ・デバッガ付 ・VSに似ているもの
なにいってんだこいつ
「どんなにくだらないC#プログラミングに関する発言でも誰かが優しくレスをしてくれるスレッド」です。
>>845 Visual C# 2005 Express Edition
SharpDevelop
>>848 ありがとうございます。
早速さがしてみます。
>>840 vb.net使っても開放忘れるとかなりシステムが不安定になったりする。
VBAかVB6のほうがよい。
null代入じゃなくてcom開放ね。 上のコードだと、oExcel,oWB,oSheetもちゃんと開放しないといけない。 おまけ。 oExcel.Application.Sheets["TEST"].Select
なんかちゃんとラップしないと使い物にならなさそうだな
うん。だからあまり使われてない。
誰かがラッパー作ってそうだけど見つからないな 中途半端にできるからダメなのか
>>850 それ逆だよw
VB6からのエクセルのオートメーション操作は問題多すぎだった。
っていうか、VBAって何を言ってるんだw
>>850 そうなのか俺はラッキーだったのか.
VBAでできるものはVBAで。
じゃあWSHで
C#はoperator overloadができるようですが、 「同じオブジェクトを指しているかどうか調べる」には obj1 == obj2 ではダメな場合があるって事ですか? あと、オブジェクトを特定のブロック内で「確実に」破棄させる(C++のスタックに置いたオブジェクトのように)には、 usingを使えば問題ないのでしょうか。それともtry...finallyでDisposeさせるのでしょうか。
はい 条件付はい
>>859 ==がoverrideされた典型的な例がStringクラス。
imutableクラス以外で==のoverrideはあまり見たことがない。
後者はいいえだな
オブジェクトの破棄と呼んでいるものは2つの意味を持ってて、 オブジェクトの終了コードの実行とオブジェクトが占有している領域の開放。 C#では領域の開放はあくまでもGCが行う。
usingで問題ない なんだったらコンストラクタを潰して 匿名メソッドでコードブロックを引数にとらないと使えない形にして、 コードブロック終了後Disposeとかすればもっと確実かな
基本的に放置するしかないよ Disposeはあくまでメンバに持ってるアンマネージリソースを開放するためのチャンス
StringDictionaryってKeyで指定してValue取り出せないの? foreach使って取り出す以外使えない?
インデクサ使え
>StringDictionaryってKeyで指定してValue取り出せないの? >foreach使って取り出す以外使えない? どうしてその疑問に行き当たったのか不思議だw
インデクサはItemプロパティで説明されてるから見つけにくいのかもしれんね。 演算子のoverloadもop_Equality のような名前になっている。
C#に限った説明じゃないからな
ただ、それってDictionaryとかでも一緒じゃん。 なにも考えずに使ったら使えたってなりそうじゃん。
なんでインデクサがわからないような人がStringDictionaryのようなマイナーなものを使うに至ったのか気になる Tips系のサイトで見つけたならそこに使い方も書いてあるはず もし.NET 2.0ならDictionary<String>が使えるから存在価値は無いね
略語に関する質問です。 ・CIL⊃MSIL? CIL≒MSIL? ・CLS⊃CLI? (CLT+CLS+MSIL+JIT)→CLI→CLR≒.net Framework→.NET言語⊃C#? うち、CLT、MSILおよびCLIから先はMicrosoftが作った用語で合ってますか?
CLRはMSによるCLIの実装だったかな
>>874 MSILはCILに若干の拡張を加えたもの
StringDictionaryよりDictionary<string,string>の方が1.5倍強処理早いね
やっぱそうなんか。 StringCollectionよりList<string>の方が速いのは知ってたが
StringDictionaryは大小文字を区別しないとかカルチャ意識するとかそういう比較をしてたと思う。
C#はパクり元のDelphiみたいに、動的配列や集合型はないの?
>>880 そういう質問をするときはまずDelphiの動的配列や集合型の説明をするのが礼儀だよ。
パクり元・・・
パクリもなにも同じヘジたんだしな。
PictureBox ってフォーカスが移動しないのでしょうか? ボタンなどはフォーカスが移動すると、ボタンの表面に点線が引かれ フォーカスがある状態になります。 PictureBox にもフォーカスを移動させるにはどうしたらよいでしょうか?
フォーカスってのはキーボード入力受付を意味するもんで、絵が入力受け取ってもねぇ?
>>885 複数の絵を表示したいので、PictureBox で→を押したら次の絵に進みたいのです。
>>886 不可視のコントロール置いて代わりにすれば?
>>887 なるほど。
不可視のコントロールをおいて、そこの KeyDown イベントで PictureBox を制御すると。
ところで不可視のコントロールって何を使えばよいのでしょうか?
TextBox.Visible = false;
てな感じかな?
form.KeyPreview = true にして親フォームでキー見たら?
カスタムコントロールでSetStyle(ControlStyles.Selectable, true)として OnPaintを自分で実装したら? たかが画像一枚描画するだけでしょ
どもです。 不可視のほうも、form.KeyPreview = true の方もうまくいきました! もうちょっと実装を進めて、良いほうを最終的に使いたいと思います。
どこからも使われてないprivateメソッドが存在しても、コンパイラは警告も何も言わないんですが、 C#ではprivateメソッドにクラス外からアクセスすることができるって事ですか? それとも、ただコンパイラが頭悪いだけですか? C#作った人が前の会社で作った、Pascal風の言語のコンパイラでは、ちゃんと教えてくれるんですが。
>>892 リフレクションを使えば、privateメンバにもアクセスできる。
クラス外からリフレクションで触られるのはさすがに考慮しなくていいだろうけど クラス内からリフレクションで触ってるってこともありうる
FxCopを使う。いろいろ出すぎてわけわからなくなるけど。
ShouldSerializePropertyはprivateが多かったべかな まあなんにしろFxCopの役割やわなあそれ
897 :
896 :2007/09/24(月) 16:13:30
これじゃ分かりにくいべさ。 privateで外部から触られる→ShouldSerializeProperty
FormにTextBoxを配置しているのですが、Formの空いた部分をクリックすると TextBoxの方にフォーカスが行ってしまいます。 普通にFormにもフォーカスを当てたいのですがどのようにすればよいのでしょうか。 MouseDownイベントでFocus()メソッドを呼んでも結果は同じでした。
>>898 の考える、フォームにフォーカスが当たっている状態、ってどんな状態だ?
900 :
898 :2007/09/24(月) 17:52:30
>>899 とりあえずキー入力がFormの方に行く状態と考えてます。
>>839 サンプルコードがあるHPとかありまつか?
>>どこからも使われてないprivateメソッドが存在してもコンパイラは警告も何も言わないんですが、 そんなことでいちいち報告されたらたまらん。
>>892 蛇足な機能はちゃんと削除したという報告ですか
ごくろうさん
>>902 それはあんたの発想の方が変だw
もしくは余程物を知らないか
どうでもいいと思う俺は技術者に向いてないんだろうか
>>904 いつどのようなときにひつようなの?
ひらがなでしつれいします。
かいとうがないようだ。 論破!
>>892 それがコンパイラの仕事かどうかはしらんがReSharperで警告してくれるよ。
VisualStudioのアドインね。
どう考えても意図的に外してるだろ 中の人が何考えて外したのかは知らんが
910 :
デフォルトの名無しさん :2007/09/25(火) 21:16:15
oExcel = new Excel.Application(); // 指定したファイルをオープン oWorkbook = (Excel.Workbook)(oExcel.Workbooks.Open(@"C:\AAA\AAA.xls, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value)); oSheet = (Excel.Worksheet)oWorkbook.ActiveSheet; oRange = ((Excel.Range)oExcel.Application.Rows["1:42", Missing.Value]); oRange.Copy(oExcel.Application.Rows["43:81", Missing.Value]); oRange1 = (Excel.Range)oSheet.Cells[8, 1]; oRange1.Value ="aaa"; oExcel.DisplayAlerts = false; oExcel.ActiveWorkbook.SaveAs(strFileName, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Excel.XlSaveAsAccessMode.xlNoChange, Missing.Value, Missing.Value, Missing.Value, Missing.Value); oExcel.DisplayAlerts = true; //元に戻す System.Runtime.InteropServices.Marshal.IsComObject(oRange); //oRangeの解放 System.Runtime.InteropServices.Marshal.IsComObject(oRange1); //oRange1の解放 System.Runtime.InteropServices.Marshal.IsComObject(oSheet); //oSheetの解放 System.Runtime.InteropServices.Marshal.IsComObject(oWorkbook); //oWorkbookの解放 oExcel.ActiveWorkbook.Saved = true; oExcel.Quit(); //Excelを終了する System.Runtime.InteropServices.Marshal.IsComObject(oExcel); //oExcel を解放 GC.Collect(); 上記コードでExcelのプロセスが残ってしまいます。EXE終了するとプロセスは消えます。 COMは解放していると思うのですが・・・どなたか教えて下さい。
nullに代入してないぞ!!! どこかの馬鹿がnull代入必要ないとか逝ってたけど嘘だぞ。
nullに → nullを
913 :
910 :2007/09/25(火) 21:23:25
>>911 回答ありがとうございます。
最後のところ
System.Runtime.InteropServices.Marshal.IsComObject(oExcel); //oExcel を解放
oExcel = null;
GC.Collect();
としたのですがやはり同じ現象でした。
IsComObjectって何だよw いや「どこかの馬鹿」が言ったのはReleaseComObjectなんてイラネ、でしょ。 しかし、ほとんど嫌がらせに近いコードだな
oRange oRange1 oWorkbook
null代入は関係ないだろ常識的に考えて…… >oRange = ((Excel.Range)oExcel.Application.Rows["1:42", Missing.Value]); とか >oExcel.ActiveWorkbook.SaveAs(... あたりに問題ありそう。変数にうけないとまずくない? Excel使ったことないけど。
IsComObject?
>>916 >GC.Collect();
は無視か?
俺の言ってる馬鹿ってのは…
だからReleaseComObjectなんて要らないってw
922 :
デフォルトの名無しさん :2007/09/25(火) 21:38:24
/// <summary>
/// COM オブジェクトへの参照を解放するプロシージャ(既存のファイルを開く場合も共用)
/// </summary>
/// <param name="objCom"></param>
private void MRComObject(ref object objCom)
{
//COM オブジェクトの使用後、明示的に COM オブジェクトへの参照を解放する
try
{
//提供されたランタイム呼び出し可能ラッパーの参照カウントをデクリメント
if (objCom != null && System.Runtime.InteropServices.Marshal.IsComObject(objCom))
{
int i;
do
{
i = System.Runtime.InteropServices.Marshal.ReleaseComObject(objCom);
}
while (i > 0);
}
}
finally
{
objCom = null;
}
}
上記のメソッドを
http://hanatyan.sakura.ne.jp/dotnet/index.html (VB版)を見てC#に置き換えたのですが
MRComObject(ref oSheet);とするとオブジェクトの変換ができない旨のエラーが発生します。
VBと違ってC#のobject型は何でも受けることができないのでしょうか?
923 :
デフォルトの名無しさん :2007/09/25(火) 21:42:28
>>914 すみません。
System.Runtime.InteropServices.Marshal.ReleaseComObjectの間違いでした。
でも上記に修正しても駄目でした。
ref のせい。いらん。 あと2.0以降ならわざわざループせんでもFinalReleaseComObjectがある。
EXEを終了させればEXCELのプロセスが消えるのなら大筋は間違ってないと思う。 ファイナライザがあるオブジェクトの場合、 参照が消えてもGC.Collect()1回で回収されるわけではなく大体2〜3回後くらいになる。 目安として、1回目でファイナライザの実行予定としてリストされ、 2回目でファイナライザ実行、3回目でメモリ回収。
>>923 FinalReleaseComObjectにしたらいけたよ。
929 :
デフォルトの名無しさん :2007/09/25(火) 22:07:45
>>924 VBの場合Private Sub MRComObject(ByRef objCom As Object)なんですが
参照渡しじゃなくてもいいのでしょうか?
でもFinalReleaseComObjectは使っていいのかな? 他のアプリから使っていても大丈夫か?
931 :
デフォルトの名無しさん :2007/09/25(火) 22:12:03
>>928 FinalReleaseComObjectですか!ありがとうございます!
>>930 問題ない。
RCWからの参照をきるだけだから。
COMオブジェクトの管理する参照カウンタとは別。
>>930 RCWの参照カウンタはCOMの参照カウンタとはべつものなのでその心配はない。
このソースだとoExcel.Application.ほにゃららを無駄に何度も呼んでるから、
ApplicationオブジェクトのRCWのカウンタが1より大きく増えてる可能性があるな。
つかReleaseComObjectを使うなら中間で取得したCOMオブジェクトは全部変数に入れとけ。
こういう書き方をすると捕捉出来ないオブジェクトが無駄に増えてるぞ。
>oRange.Copy(oExcel.Application.Rows["43:81", Missing.Value]);
oRange.Copy(..) はobjectを返すのでちゃんと変数で受けて あとでReleaseComObjectする必要があるのはわかるか?
しかしまあしみじみ.NETでOfficeオートメーションなんかするもんじゃないと思うな プロセス分けてそっちでやらすか
だからReleaseComObjectなんていらんて。 実際やってみりゃ分かると思うが。
937 :
デフォルトの名無しさん :2007/09/25(火) 22:39:49
>>934 すみません。どうしてオブジェクトを返す事が分かったのでしょうか?
私はどんなオブジェクトが返る事が分かりませんでしたし、どんな
オブジェクトかも分かりません(;;)
↓null代入とかReleaseComObject要/不要の議論禁止
>>937 ならExcelのオブジェクトモデルが分かってないってことで、
それじゃお話にならんのじゃないかい?
正直この話はまたかという感じで飽きたな。 VB.NETにCOM専用の参照カウンタGCを搭載すれば問題の大半は解決すると思うのだが。
941 :
デフォルトの名無しさん :2007/09/25(火) 23:11:19
>>939 すみません。VB6のときはあまり気にせずともできてしまったので・・・
オブジェクトはRangeが返ってくるのでしょうか?
>>910 Excel11 のタイプリブを使ったので若干OpenとSaveAsの引数が増えてる。
ファイル名や範囲もいじってるので注意されたし。
string strFileName = @"D:\AAA\AAA2.xls";
Excel.Application oExcel = new Excel.Application();
//oExcel.Visible = true;
Excel.Workbooks oWorkbooks = oExcel.Workbooks;
Excel.Workbook oWorkbook = oWorkbooks.Open(@"D:\AAA\AAA.xls",
Missing.Value, Missing.Value, Missing.Value, Missing.Value,
Missing.Value, Missing.Value, Missing.Value, Missing.Value,
Missing.Value, Missing.Value, Missing.Value, Missing.Value,
Missing.Value, Missing.Value);
Excel.Sheets oSheets = oWorkbook.Worksheets;
Excel.Worksheet oSheet = (Excel.Worksheet) oSheets[1];
Excel.Range oRange0 = oSheet.Rows;
Excel.Range oRange = (Excel.Range) oRange0["1:1", Missing.Value];
Excel.Range oRange2 = (Excel.Range) oRange0["5:5", Missing.Value];
oRange.Copy(oRange2);
Excel.Range oRange3 = oSheet.Cells;
Excel.Range oRange1 = (Excel.Range) oRange3[8, 1];
oRange1.set_Value(Excel.XlRangeValueDataType.xlRangeValueDefault, "aaa");
続く
947 :
946 :2007/09/26(水) 01:02:46
続き oExcel.DisplayAlerts = false; oWorkbook.SaveAs(strFileName, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Excel.XlSaveAsAccessMode.xlNoChange, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value); oExcel.DisplayAlerts = true; //元に戻す oWorkbook.Saved = true; //oWorkbook.Close(false, Missing.Value, Missing.Value); //oWorkbooks.Close(); oExcel.Quit(); //Excelを終了する Marshal.ReleaseComObject(oRange0); Marshal.ReleaseComObject(oRange); //oRangeの解放 Marshal.ReleaseComObject(oRange1); //oRange1の解放 Marshal.ReleaseComObject(oRange2); Marshal.ReleaseComObject(oRange3); Marshal.ReleaseComObject(oSheet); //oSheetの解放 Marshal.ReleaseComObject(oSheets); Marshal.ReleaseComObject(oWorkbook); //oWorkbookの解放 Marshal.ReleaseComObject(oWorkbooks); Marshal.ReleaseComObject(oExcel); //oExcel を解放
948 :
946 :2007/09/26(水) 01:13:16
前々からこれも疑問でしょうがないんだが、 >oExcel.Quit(); //Excelを終了する これって、まあもちろんエクセルの使われ方にもよるんだけど ほとんどの場合、ユーザーの使い勝手の観点から言えば不要じゃないだろうか。 というか、こんなことするから「プロセスが残る」なんて問題が起こるんじゃん。 俺はこの手のコード見るたびに、世の中手を動かしてコピペするだけで 頭を使わない馬鹿が多いんだな、と思っちゃうよ。
950 :
デフォルトの名無しさん :2007/09/26(水) 11:07:33
>>934 > oRange.Copy(..) はobjectを返すのでちゃんと変数で受けて
> あとでReleaseComObjectする必要があるのはわかるか?
試しに
ojject oTest;
oTest = oRange.Copy(..) としてみましたが
voidが返ってくる旨のエラーメッセージが出るのですが・・・
951 :
デフォルトの名無しさん :2007/09/26(水) 11:12:24
>>946 ご教授ありがとうございます。サンプル例まで提示して頂いて感謝します。
953 :
デフォルトの名無しさん :2007/09/26(水) 11:42:03
>>952 回答ありがとうございます。色々難しいですね。
>>949 使ったことがないのがみえみえじゃん(笑
Officeのオートメーションは操作自動化のためのインターフェイスで、
手で操作するのと同じことがCOM経由で出来るというもの。
マクロのようにApplication#Visible = trueの表示状態で使うのが本来の使い方なのだと思う。
つまり立ち上げたExcelは別途ユーザーに閉じさせる前提で起動したままにしておくということ。
ただ現実の使われ方はOffice文書を作ったり印刷させたりするため
非表示のまま使用することがほとんどであり、
ユーザーのニーズにOfficeのオートメーションの仕組みがあっていないといえる。
お触り禁止
>>954 >ただ現実の使われ方はOffice文書を作ったり印刷させたりするため
>非表示のまま使用することがほとんどであり、
なるほど確かにそういう使い方なら意味はある。というか必須だね。
ただそういう使い方が「ほとんど」かどうかは疑問だけど。
コメントに文句言ってるのかと思った。 ソースと同内容のコメントは余計だよなあ
>>954 本来はという話ならVBAマクロやVSTOのように、
EXCELやWORDの機能を拡張するためのオートメーションなんだろう。
アプリケーションからEXCELを呼び出すのは方向が逆。
>>956 てか最初からそういう前提の話しかしてないだろ
非表示だと動かない機能があって…
どんな昨日だよwExcelにそんなの無いだろ
あるよ
どの機能?
964 :
デフォルトの名無しさん :2007/09/26(水) 23:17:23
プレビュー?
非表示でもフォーカス当てたり、アクティブに出来るの? sendkeys使える?
>>965 フォーカス、アクティブ、sendkeysってどういうときに使うの?
もうやめとけってw 昔VB6とかからエクセル操作する場合には、操作する対象のオブジェクトは かならず表示状態にして、かつアクティブにすべし、みたいなことが 「おまじない」的に推奨されてたから、それをいまだに信じている人がいるんだよたぶん。 某花ちゃんなんたらってサイトとか見てみるといいよ。
968 :
デフォルトの名無しさん :2007/09/27(木) 23:37:36
>>967 ド素人にVB6でExcel操作させると、画面のリフレッシュとかプログレスバーの表示なんて処理を考えずに作るから
固まってるかどうか判別しにくくなるだろうから表示状態にするのは正解かもね
.netでも非表示にさせると偉い目にあいそう
office2007ってファイル出力にXMLが選択できるそうだが 中身解析すれば手軽に直接ファイル生成ができると思っておk?
仕様が公開されてるでそ
おkじゃない
XPSのこと?あれは複雑っぽいな。
xml+圧縮かかってたような
Office Open XMLだろ ほんとにただのXML
ただじゃないxmlてどんなん?
docxやxlsx
Panelコントロールについての質問なんですが、 AutoScrollをtrueにしたPanelをDock.FillでFormに置き、 Panel.ClientSizeChangedでサイズを変更するようにした幅がPanelClientSize.Widthな コントロールをPanelの中に置いたのですが、Formを最大化後に元に戻すと ちゃんとClientSizeChangedが発生し、コントロールのサイズも変わってるにもかかわらず 横スクロールバーが表示されてしまいます。 コントロールのLeftは0で、横にスクロールしてもWidthがPanelのサイズをオーバーしてる とは思えません。 WndProc()でWM_RESTOREを拾ってリサイズしても変わりませんでした。 このPanelの横スクロールバーを消すにはどうしたらいいでしょうか?
class MyClass : IMyInterface とするとき、 object obj = new MyClass(); MyClass my = (MyClass)obj; と IMyInterface interface = new MyClass(); MyClass my = (MyClass)interface; って速度変わらないですかね?
979 :
デフォルトの名無しさん :2007/09/28(金) 19:50:46
で、結局どうなんよ 直接ファイル生成できそう? それとも無理? 2007使ってる香具師回答きぼんぬ
速度気にするんなら通常のキャストじゃなくて as キャストだろ
>>980 asって値型だと型が合致しなかった場合はdefault(struct)になるんですかね?
ならない。 Nullableな値型ならnullが返される。非Nullableな値型ならコンパイルエラー。
>>979 Office System 互換機能パックで 2003でもいけた。 hoge.xmlで保存してちょ。
<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:html="
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>
984 :
983 :2007/09/28(金) 20:47:53
あらかじめExcelで雛形作っておいて部分的に書き換えるのがよさそう。 テンプレートエンジンがあれば使えそうだ。
つかただのxmlスプレッドシートで事足りんじゃねーの?
っていうよりただのxmlスプレッドシート? 互換パックすらいらないんじゃ…
次スレ余路。
>988 asの方が早いし型が違う場合に例外が飛ばずにnullが返る。 キャストで型が違って例外が飛ぶと結構重いし。 でも、ダウンキャストしなくても済むようにインターフェースを作る方がいいんじゃない?
>asの方が早いし型が違う場合に例外が飛ばずにnullが返る。 asのが早いってそんな違いがあるの? 例外とぶって飛ばなきゃ使う側でNullReference〜になるかチェックが必要になるわけで 正しい型が入っているはず、という状況なら普通のキャストの方がまだ望ましい動きじゃないかい?
>992 正しい型が必ず入ってる場面ではチェックは不要なんだからasの方が速いのでasを使う。 違う型のものが入ってるかもしれない場面でダウンキャストするってのは何か作りがおかしいので考慮する必要ってあんまりないと思うよ。
msdnをみるとis演算子の分asの方が命令数が多いように見える。 >as 演算子はキャストと似ていますが、変換エラーの時に、 >例外を発生せずに null を返す点が異なります。次に式の形式を示します。 >expression as type >これは、次と同じ意味になります。 >expression is type ? (type)expression : (type)null
995 :
994 :2007/09/29(土) 03:59:31
IL上は1命令違うだけで差はなかった。 IL_0002: isinst A IL_0002: castclass A
結局asは早くも遅くもないのか
じゃあ、Delphiのasはキャストより速いの?遅いの?
>違う型のものが入ってるかもしれない場面でダウンキャストするってのは >何か作りがおかしいので考慮する必要ってあんまりないと思うよ。 だからこそキャストで例外になるようにするんじゃねーかよ。 まあNull参照例外でも似たようなもんではあるけど、 キャスト例外のがまし。
>正しい型が必ず入ってる場面ではチェックは不要なんだからasの方が速いのでasを使う。 asの方が早いってのは思い込みじゃねーのか?といってる。
is演算子が面白い。 o is CLASS1 が o as CLASS1 != null と同じコードを吐いている。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。