ふらっとC#,C♯,C#(初心者用) Part25
1 :
デフォルトの名無しさん :
2008/02/27(水) 18:24:40 このスレッドは
「どんなにくだらないC#プログラミングに関する発言でも誰かが優しくレスをしてくれるスレッド」です。
ほかのスレッドでは恐ろしくて書き込めないような低レベル、もしくは質問者自身なんだか意味がよく分からない質問など、
勇気をもって書き込んでください。
内容に応じて、他スレ・他板へ行くことを勧められる、あるいは誘導される場合がありますがご了承下さい。
前スレ
ふらっとC#,C♯,C#(初心者用) Part24
http://pc11.2ch.net/test/read.cgi/tech/1202028267/
>>950 を踏んだ人は新スレを立てて下さい。
>>950 が無理な場合、話し合って新スレ立てる人を決めて下さい。
誰も建てないので立てますた。
4 :
前962 :2008/02/27(水) 18:43:58
>>前967 ありがとうございます。 どうしても同じスコープにするのは難しそうです、現状は大雑把なキャンセルということで満足しておくことにします
>>1 乙。
>>前スレ998
わざわざ匿名メソッドとか使うまでもなく
OwnerForm.Invoke(new Action(OwnerForm.Show));
>>5 たしかにその通りですねw
おかげでコードがシンプルになりました。
ありがとうございます。
パネルのどこでダブルクリックをしても同じ動作をしたいのですが、 FlowLayoutPanel.MouseDoubleClickイベントは上に何も乗っていない場所でしか起きないようです。 上に載せたコントロール全てに同じイベントを設定してあげなければいけないのでしょうか? それとも何かワザがあるのでしょうか?
>>7 俺はそのワザというのがちょっと思いつかんけど、
俺だったらPanelの子コントロールコレクションをForeachでループして
一行イベント追加の構文書いて実現するね。
3行でいけるっしょ。
>>8 !=7ですが面白い手ですね、自分は諦めてました
10 :
7 :2008/02/27(水) 19:35:42
>>8 ありがとうございます。踏ん切りが付きました。
質問です。 例えばデフォルトのForm1クラスのような、継承やインスタンスの生成を1度しかしないクラスがあったとした場合 クラス内メンバ全てにstaticをつけた方が良いのでしょうか? また、通常の設計などがわからず、インターネットで調べつつ色々作ってみています。 エントリポイントである以下の部分には通常手を加えるものなのでしょうか?(Program.cs) static class Program { [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Properties.Form1()); } } 全てForm1クラス内で済ませているのですがどうにも不自然に感じてきています おかしなことを言っていたらすいません、それではよろしくお願いします
>>11 パフォーマンスの点ではstaticをつければ、パーマネント領域に移ってガベージコレクト対象から外れるのでいいかもね。
汎用性をとるなら、普通にメンバにしておいたほうがいいんじゃないかな。
自分は "クラス名.メソッド()" と書くとコードがシンプルになるらな迷わずstaticを選ぶね。
エントリーポイントは時に変更が必要不可欠になる事がある、そのときのために触らなくて済む限り触らない、綺麗なままにしておく。
13 :
11 :2008/02/27(水) 20:04:56
>>12 ありがとうございます。
主要処理部分をとりあえずstaticにしておくことにしました。
エントリポイントについては把握しました。
自分の場合Form1クラスを中心に他を操作するような感じでいけばいいわけですね
staticにするとコントロールに触れないよ? だからってコントロールもstaticにするとかアホなことするくらいなら迷わずインスタンスメソッドにする
15 :
11 :2008/02/27(水) 20:31:59
コントロールをstaticにすると何か問題があるのでしょうか? まず最初にコントロールをstaticにしてましたorz 一応色々調整してうまく動いています
デストラクタで全コントロールをDispose()すればいいんじゃね、と初心者が行ってみる
>>15 >何か問題
コードの読み手(一ヵ月後の自分だってそうだ)を無意味に惑わすのが問題。
普通の能力の読み手なら「あえて」staticにしているのには何か意味があるはずだ、
と考えると思うんだが、実際には何の意味もない(あったら教えてくれ)ってのは
大問題でしょ。
エスパーするとステータスバーだけpublic staticにするといい
どう「いい」のかねw
エスパーするとって書いてあるんだから馬鹿にするんだからどうエスパーしたかわかってるんだろうな、すごいなw
>>16 コントロールをstaticにしてたらGCの対象から外れるからデストラクタが呼ばれない
>前スレ992 2秒差で無茶ゆうなよw
>前スレ992 こ れ は ひ ど い
>>21 呼ばれるよ、アプリが終了する時までには。
実行中はガベコレの対象にならないというだけで、他にもこのパーマネント領域にはクラスのTypeのオブジェクト等がいる。
匿名型で System.Collections.Generic.List は簡単に作れないのでしょうか? var tmp_array = new[] { new { Col1 = 10 , Col2 = "あ" } , new { Col1 = 20 , Col2 = "い" } , new { Col1 = 30 , Col2 = "う" } , }; var list = tmp_array.ToList(); とりあえずこんな具合に作ってみたのですが、どうにも無駄っぽい感じがします。
エクスプローラの左側みたいなデスクトップがルートのツリービューを作りたいんだけど そういうコントロールって無いの? TreeView使って自分で項目追加するしかないのかなあ。
>>26 Microsoft.VisualBasic.Compatibility.VB6.DirListBoxとか、使った事無いけどそれっぽいの出るよ。
>>25 var list = new[] {
new { Col1 = 10 , Col2 = "あ" } ,
new { Col1 = 20 , Col2 = "い" } ,
new { Col1 = 30 , Col2 = "う" } ,
}.ToList();
これでいいんじゃない?
ひさびさにツールボックスの追加項目色々ながめてみたら結構色々よさげなの多いね 言語の壁を越えられるライブラリはすばらしい
C/C++で言うところのstatic修飾されたローカル変数と同様の動作をするローカル変数を定義することはできないのでしょうか?
31 :
26 :2008/02/28(木) 00:45:25
>>27 うーん、見た目がなんか古臭いし、デスクトップがルートじゃないのも…
自分で作るしかないか。
シェルネームスペース関連のクラスって無いですよね?
その辺も整備しないといかんのか…
>>31 Com側も探してみたら、なんか色々あるよ。
もっともComインターフェイス系のクラスは、どれも表示できても使い勝手悪そうだけど……
>>32 それでも実装できるんですが、一つのメソッドでしか使用しない変数なので他のメソッドにもスコープを広げるのはどうかと思いまして・・・
>>34 privateしかないですね、C#は、というか.NETはリフレクションという機能があって、
自分自身のコードをプログラムから覗く機能があって、スコープ概念は実質ないというか使えません。
たとえば、あるクラスにどんな変数や関数があるのかプログラム中で一覧を列挙できるんですよ。
この機能はC++では、templateメタプログラミングで代用ですね。
>>35 細かい解説ありがとうございます。privateメンバで実装したいと思います
C++でもtemplateが絡むと static ローカル変数は怖いんだよ Microsoft じゃない方の M の付く会社で作っている、なんとかリャーとかいうコンパイラは 型が違うなら別々のインスタンスにすべき所を纏めて一つだけとって重複バグをやらかしたりその反対やらかしたりと・・・
エビフリャー?
おんどりゃー!
クロージャ使えばそれっぽいことできるよ 実質メソッドごとに内部クラス定義してるのと一緒だけど
こう書くとwhileのループに捕まってしまう事があるのですが何か良い方法はありませんでしょうか? WebBrowser wb = new WebBrowser(); wb.Navigate(uri); while (wb.Url == null) { Thread.Sleep(1000); Application.DoEvents(); }
Navigated イベントとか使えよ
今はイベントでやっているのですがイベント無しだと無理なのですね。
イベント前提のフレームワークなんだから
int a = 0; a = a++; ってやるとaの値が0のままなんだけど、これはどういう理屈? C++だとインクリメントされた値になるんだが
a = ++a;なら1になるのでは?
馬鹿は黙っててください
仕様に逆らって喜んでいる基地外に言われたくない
は?
a = a++; 右辺から評価されていく。 aをインクリメントし、式としてはインクリメントする前の値を返す。 すなわち a = 0;
今時こんなバカな話がでるとは
C++とC#で挙動が違うって言うのはちょっと面白い。
C++だと未定義で動作は処理系依存じゃなかったっけ?
>>53 代入演算ですらそんな挙動するっけ?
確かに、x = f(a) + g(b) みたいなのは、f と g のどっちが先に呼ばれるか
未定義・処理系依存だったと思うけど。
C++ は思った以上に処理系依存動作多いもんなぁ。
>>45 int a=0;
a++;
で
a=1
になるんですよ、クソガキ
57 :
デフォルトの名無しさん :2008/02/29(金) 02:45:36
物凄い勢いで走るスレッドがあるのですが、 ウェイトは下記のどちらが良いのでしょうか? // 1 System.Threading.Thread.Sleep(1); Application.DoEvent(); // 2 Application.DoEvent(); System.Threading.Thread.Sleep(1);
58 :
デフォルトの名無しさん :2008/02/29(金) 02:54:39
1しかあるまい
>>57 そのスレッドはUIスレッドなのか?
そうじゃないならプライオリティを下げるのが常套。
Application.DoEvent()はいらないでしょ。 これはマルチスレッド使えないVB6のDoEventsからから恐らく来てるわけで、 つまりUIスレッドでビジーループで仕事してもUIが無反応にならないように したい場合に使うわけでしょ。 つまりCドトネトでは普通は使い道はあまりないはずと思うが。
62 :
デフォルトの名無しさん :2008/02/29(金) 11:32:24
Cでいうところの自己参照構造体を実現したいのですが、 どうすればよいでしょうか? <C> typedef struct hoge { long foo; struct hoge* bar; /* 自己参照 */ } hoge; →OK <C#> struct hoge{ public int foo; public hoge bar; /* 自己参照 */ } →エラー。以下メッセージ。 型 'hoge' の構造体メンバ 'hoge.bar'により、 構造体レイアウトで循環参照が発生します
参照
構造体じゃなくてクラスを使う
ListViewの背景をいろいろ描写したいと思って OnPaintBackgroundを継承したのですが、 背景は描写されましたがアイテムが描写されません。 背景以外は普通に描画したいのですが。
66 :
65 :2008/02/29(金) 14:10:33
コード。 using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms; class ListViewEx : ListView{ public ListViewEx(){ this.OwnerDraw = true; this.SetStyle(ControlStyles.UserPaint, true); } protected override void OnPaintBackground(PaintEventArgs e){ using (LinearGradientBrush lgb = new LinearGradientBrush(this.ClientRectangle, Color.Black, Color.White, LinearGradientMode.Vertical)){ e.Graphics.FillRectangle(lgb, this.ClientRectangle); } }
67 :
65 :2008/02/29(金) 14:11:04
protected override void OnDrawColumnHeader(DrawListViewColumnHeaderEventArgs e){ e.DrawDefault = true; base.OnDrawColumnHeader(e); } protected override void OnDrawItem(DrawListViewItemEventArgs e){ e.DrawDefault = true; base.OnDrawItem(e); } protected override void OnDrawSubItem(DrawListViewSubItemEventArgs e){ e.DrawDefault = true; base.OnDrawSubItem(e); } static void Main(){ Form form = new Form(); ListViewEx list = new ListViewEx(); list.Dock = DockStyle.Fill; list.Items.Add("unko");list.Items.Add("unko");list.Items.Add("unko"); form.Controls.Add(list); form.ShowDialog(); } }
68 :
デフォルトの名無しさん :2008/02/29(金) 14:17:49
スレッド4本上で.NET Remotingを使って10MB/100ファイルくらいを 一気に取得するプログラムを作っているのですが、高負荷になると クライアント側のWindows(2003)が毎回ブルースクリーンになって しまいます。 クライアントのハードウェアが壊れているのかと思い手持ちの3機種で 試してみたのですが、どれも同じ結果でした。 mouclass.sysなど、毎回違うところで止まっているので原因がサッパリ わかりません。
>>65 OwnerDrawのときは
OnDrawItemやOnDrawSubItemで自前描画しないと駄目よ
base.OnDrawItem等を呼んでもなにもしてくれないよ
70 :
65 :2008/02/29(金) 14:35:03
>>69 そうなんだ。
e.DrawBackground()とかすればいいんですね。
となるとDrawDefaultはどういうときに使うんでしょう。
ネットに転がってるサンプルだとOwnerDraw = trueでも
e.DrawDefalt = trueしてそのままになってる。
>>68 よくわかんないけど、ブルースクリーンになるのはディバイスドライバの障害だよ
どこかのドライバがバグっている。
このListWiewを使うと、グラフィックソフトにレイヤー機能を持たせるのが簡単になりますか? いまグラフィックソフトを作ってますが、レイヤーごとにGraphicオブジェクトを用意してそこへ描画してるんだけど、 管理が複雑になってしまって。
>>72 フォトショップのレイヤーみたいなもの?
もしそれなら、自前で作ったほうが無難な予感がするな。
未来志向ならWPFという手もあるかもしれない、使った事無いけど。(←ぉぃぉぃ)
(←ぉぃぉぃ)って何?
Paint.NETのソースコードをパクれば
自己突っ込みでつ
その辺よりデザイナを色々なんとかしてくれ。XAML養成ギブスとか 言われないぐらいには。 コード書いたら負けかなと思えるぐらいに柔軟なのはわかったから
MS「ないものは自分で作ればいいお」
listview.Items.Add("text").Name = ""; listview.Items[""].Selected = true; これだとエラーになるのですね。
Visual Studio2005の話なのですが、プロパティを作成すると フォームのプロパティに表示されるものとされないものがあります。 表示されるものとされないものの違いがよくわからないので教えてもらえないでしょうか
>>82 悩んでいたのは操作方法ではなく追加方法なのですが、自己解決しました。
恥ずかしいことに継承せずにプロパティを追加するだけでプロパティブラウザに追加できると勘違いしておりました。
リンク先の内容を役立てることができそうです。ありがとうございました。
84 :
デフォルトの名無しさん :2008/03/01(土) 17:30:13
C#3.0になってから var キーワードができましたが、ぱっと見た目で型がわからないので、不便なんですが・・・ コーディング中に簡単に型を知る便利なテクニックとかないですかね? var instance = object.Method() ; ↑ ここにマウスカーソルを置いたら型が分るとかだったら便利なんですけど・・・出ない
>>84 VS 使ってるならそれで型分かるよ。
あと、個人的には右辺値から型が分かりにくいときはあんまり var 使いたくないなぁ。
using System.IO; DirectoryInfo info = new DirectoryInfo( @"C:\"); info. ← ここで候補が出てこないのは何故?
メソッド内じゃないからじゃね?
コンソールでベーマガ風のテキストベースのゲーム作ろうと思ったら どういうクラス、API使えばいいの? 80x25の配列を用意して適当に着色して■Ωとか配置してキー入力を受け付けられればいいんだけど。
Console
いい加減静的型言語の悪癖から抜けろよ varで分からなくなるってどんな変数名つけてんだよ
94 :
デフォルトの名無しさん :2008/03/01(土) 23:07:21
クラスのFieldに番号を付けて、その番号のFieldを呼び出すってことがしたいのですが、 属性を作成してその属性に番号を格納してってことをしてみたところで、 属性の内容からFieldを取得する方法が分からず挫折してしまいました。 なんとかしてFieldを取得する方法はありませんか?
>>93 場所によっては分りにくくなることもあるべぇよ、大半問題ないけどね。
ちなみにC#の var は静的な型だよ。
var i = 0 ;
と書いたら
object i = 0 ではなくて int i = 0 だから。
>>91 そりゃもう System.Drawing.Graphics を使って直書きしかないね、
普通に印刷したらプロポーショナルに美しく表示されてしまいますからw
詳しい説明いるかい?
必要なら追記しましょう。
>>94 フィールド列挙してそれぞれの属性調べてく
でも属性でやる必要あるの?
インデックスを引数にとるメソッド一つ用意すればよくない?
>>94 ちょっと作ってみた
public class MyAttribute : System.Attribute
{
public int IntData { get;set;}
public MyAttribute(int intData) { IntData = intData ; }
};
public class SumpleClass
{
[My(10)]
public int Field = 5 ;
};
void f(){
var tmp = new SumpleClass() ;
var attrs = tmp.GetType().GetField( "Field" ).GetCustomAttributes( false ) ;
for (int i = 0; i < attrs.GetLength(0); ++i)
{
var myattr = attrs[i] as MyAttribute ;
if (myattr == null) continue;
System.Console.WriteLine("{0}", myattr.IntData);
}
}
98 :
デフォルトの名無しさん :2008/03/01(土) 23:25:54
>>96 インデックスですか・・・?
class C
{
DateTime d1;
int i1;
string s1;
DateTime d2;
}
って感じなのですが、
上から順番にd1には0番の値を、i1には1番の値をって代入していきたいんですよ。
objcet[] data = //データ
for(int i = 0; i < data.Length; i++)
{
field[i] = data[i];
}
というかんじが理想なんですが・・・
インデックスってのがよくわからないので詳しく教えてもらえませんか?
>>98 >>97 の GetField を GetFields にして、あとはアトリビュート検索して、所望のものがあったらそのフィールドに代入してくださいな。
フィールド名から代入方法が分らないなら、また書く。
public void SetValue(int index, object value) { switch (index) { case 0: hoge = (...)value; break; } } みたいな。つかこれくらいならインデクサでいいか。
101 :
デフォルトの名無しさん :2008/03/01(土) 23:40:26
>>97 すみません、属性の番号がiと一致するものの名前の取得まではできるんですが・・・
どうやってそこに代入するかが難しいです。。。
>>99 すみません、代入方法お願い致します。
>>100 なるほど・・・
でもswitch分が3ケタ超えるのは・・・
そっちのほうが保守やパフォーマンス的にはいいのでしょうか?
>>101 ほい、フィールド名を検索してないけどそのへんは適当によろしく
var tmp = new SumpleClass() ;
var attrs = tmp.GetType().GetField( "Field" ).GetCustomAttributes( false ) ;
for (int i = 0; i < attrs.GetLength(0); ++i)
{
var myattr = attrs[i] as MyAttribute ;
if (myattr == null) continue;
System.Console.WriteLine("{0}", myattr.IntData);
System.Console.WriteLine("{0}", tmp.Field);
tmp.GetType().GetField("Field").SetValue(tmp, 100);
System.Console.WriteLine("{0}", tmp.Field);
}
>>101 パフォーマンスはswitchの方が圧倒的に高いよ。
やり方しだいじゃありますが・・・
フィールド100オーバーなクラスって・・・
フィールド名の最後の数字をとってくればいいんだろ var fields = obj.GetType().GetFields(); var regex = new Regex(@"(\d+)$"); foreach(var field in fields) { string numStr = regex.Match(field.Name).Groups[1].Value; if(field.FieldType == typeof(DateTime)) { field.SetValue(obj, dateTimeTable[int.Parse(numStr)]); } } こんな感じか?
>>104 C#3.0になってから普通に作れそうだけどねwww
匿名クラス楽でいいわ
107 :
デフォルトの名無しさん :2008/03/01(土) 23:57:54
>>102 すみません、よく理解できませんでしたのでswitch文にします。
>>104 >>105 すみません、フィールドの種類・名前は先に与えられていて、
そこはいじれないもので。
とりあえず field.SetValue(instance, value); 探してるのはこれじゃないの?
109 :
102 :2008/03/02(日) 00:00:55
>>107 ゆっり憶えればよろしい、まずは今できる方法じゃ
100オーバーのフィールドに属性つけてく方が大変だしな
111 :
102 :2008/03/02(日) 00:02:42
>>110 100オーバーのスイッチ文とか考えたくも無いけどなwww
C c = new C(); FieldInfo[] fields = c.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance); for(int i = 0; i < fields.Length; ++i) { fields[i].SetValue(c, data[i]); } こうだろ
>>112 GetFieldsの返す順を信頼できるあなたが素敵☆
俺が試した限りではフィールドの宣言順は保持されてたけど よく知らんな
保障されているものじゃないから利用すべきじゃないな
まぁ無保証だろうな、変わることもなさそうに思えるけど。
で、Releaseビルドで裏切られるとw
しかし一個一個属性つけるくらいならswitchも何も使わずに直接代入してった方が早いぞ
※このソースをReleaseビルドするのはやめてください
>>118 エクセルで一覧作っといて、あとで叩き込むとか結構俺は便利につかってるぞ
せっかくC#がJavaとの差別化として実装した自慢の機能なんだから利用してやらにゃ損
>>108 それがわかっただけでも聞いてみたかいがありました。
ありがとうございます。
>>112 案の一つとしてメモっておきます。
ありがとうございます。
他のみなさまも親身な回答をありがとうございました。
また詰まったら頼らせてください。
フィールドが100オーバーだろ ソースコード生成するのが早いか、手作業でやるのが早いか悩むところだな
>>122 そこでCodeDOMですよ、自己生成自己コンパイル自己実行www
hoge func(out int a, ref int b) {} というメソッドがあるとします。 引数のa, bのどちらか、または両方省略できるようにしたいです。 そこで hoge func(out int a) {} hoge func(ref int b) {} hoge func() {} を追加しようとしたのですが、上の2つがrefとoutの違いだけではオーバーロードできません。 こういう場合どういう設計にしたらいいのでしょうか?
>>124 hoge funcWithAAndB(out int a, ref int b){}
hoge funcWithA(out int a){}
hoge funcWithB(ref int b){}
hoge func(){}
>>125 VBとか、その他で省略能力のある言語との連携があるなら
使う側で対処する
func( out Type.Missing , ref data ) ;
といった感じ、Type.Missingが省略の意味。
C#オンリーなら素直にメソッド分けよう。
あっ、いかんこのケースでは使えんかった
あっ、いかんこのケースでは使えんかった、は 126 の事。
あれ、安価みすっとる 126 のアンカは
>>124 ね、
class Result { public int A; public hoge hoge; } Result func(ref int b) Result func() こうかな
131 :
124 :2008/03/02(日) 01:00:40
メソッド名変えた方が良さそうですね。 ありがとうございました。
132 :
102 :2008/03/02(日) 02:40:42
ためしに完全動作版を作ってみた、パフォーマンス的にも問題ないと思う using System.Linq ; public static class FieldIndexer { class LookupTable { public System.Collections.Generic.Dictionary<int, System.Reflection.FieldInfo> mapIndexToField; public LookupTable( System.Type type ) { mapIndexToField = new System.Collections.Generic.Dictionary<int, System.Reflection.FieldInfo>(); foreach (var fieldInfo in type.GetFields()) { var customAttributes = fieldInfo.GetCustomAttributes(true).OfType<FieldIndexerAttribute>(); var count = customAttributes.Count(); if (count == 0) continue; if (count != 1) throw new System.Exception("FieldIndexerAttributeが二つ以上ついているフィールドを発見"); var index = customAttributes.First().Index; mapIndexToField.Add(index, fieldInfo); } } } static object syncRoot = new object() ; static System.Collections.Generic.Dictionary<Type, LookupTable> tables = new Dictionary<Type, LookupTable>();
133 :
102 :2008/03/02(日) 02:41:25
static LookupTable GetLookupTable( System.Type type ) { if (!tables.ContainsKey(type)) { lock (syncRoot) { if (!tables.ContainsKey(type)) { var tmp = new LookupTable( type ); tables.Add(type, tmp); return tmp; } } } return tables[type]; }
134 :
102 :2008/03/02(日) 02:42:00
public static object GetValue(object dataClass, int index) { try { return GetLookupTable(dataClass.GetType()).mapIndexToField[index].GetValue(dataClass); } catch (System.Collections.Generic.KeyNotFoundException) { throw new System.Exception("指定のインデックスの設定されたフィールドが存在しなかった"); } } public static void SetValue(object dataClass, int index, object value) { try { GetLookupTable(dataClass.GetType()).mapIndexToField[index].SetValue(dataClass, value); } catch (System.Collections.Generic.KeyNotFoundException) { throw new System.Exception("指定のインデックスの設定されたフィールドが存在しなかった"); } } }
135 :
102 :2008/03/02(日) 02:43:17
public class FieldIndexerAttribute : System.Attribute { public int Index { get;set;} public FieldIndexerAttribute(int index) { Index = index; } }; ここまでで、ライブラリ化する。
136 :
102 :2008/03/02(日) 02:44:11
使用例 public class SampleClass { [FieldIndexer(10)] public int FieldA; [FieldIndexer(20)] public string FieldB; }; void SampleProgram() { var tmp = new SampleClass(); tmp.FieldA = 10; tmp.FieldB = "ABC"; System.Console.WriteLine("{0}", FieldIndexer.GetValue(tmp, 10)); System.Console.WriteLine("{0}", FieldIndexer.GetValue(tmp, 20)); FieldIndexer.SetValue(tmp, 10,1234); FieldIndexer.SetValue(tmp, 20,"XYZ"); System.Console.WriteLine("{0}", tmp.FieldA); System.Console.WriteLine("{0}", tmp.FieldB); }
プロジェクトフォルダを見てみたらコンパイルの中間ファイルのようなものが見あたりません コンパイルの度にプロジェクトに含まれる全ての.csをコンパイルしているのでしょうか? それともどこか別の場所に置いてあるのでしょうか? プロジェクトが大きくなってきてコンパイル時間が気になり始めたので もし全てリコンパイルしているならdllに分割しようかと思っています。
中間ファイルなんて基本存在しない ので適切にDLLに分ける
Generic使えばもっとシンプルになりそうだな。 ディクショナリじゃなくて配列で十分そうだな。 あとほんとはハンドルだけ保持しとくほうがいいかもな。
中間ファイルはどっかにあるだろ 知らんけど dll分けると余計に時間がかかる しかし設計としてはどんどん分けた方がいい 依存関係が強制されinternalが有効に使える
>>139 おっと、インデックスが好きに付けられるなら配列はやっぱまずいか…
>>102 さん
ありがとうございます。
ぜひ使わせていただきます。
>>140 ソースファイルには無い リソースやxamlにはあるけど
/obj/xxxにも直接アセンブリが作られる
もちろんソースその他に変更の無いアセンブリはコンパイル対象にならない
全部をコンパイルしなおすなんてそんな馬鹿なことをするわけがないだろう 中間ファイルが見当たらないことからそんな結論が導かれるわけがない
>>107 >>105 のやつは
dataを
foreach(object obj in data)
{
if(obj is DateTime)
{
dateTimeTable.Add((DateTime)obj);
}
if(obj is int)
{
intTable.Add((int)obj);
}
...
}
とやっていって、フィールド名の最後の数字を取得して、
field.SetValue(instance, dateTimeTable[num - 1]);
こうやっていけばきっちり出来るんじゃないかという話だ
フィールドはいじらなくていい
構造体にまとめといてunsafeでbyte[]から無理矢理代入すればいいんじゃね
C#ってなんでビットフィールドないの?
BitArrayで我慢してください つかいらんだろあんなの
あとBitVector32
ビットフィールドと共用体便利だったのになー
>>147 >>150 プロセッサ非依存の.NETでは避けた方がいい、ビッグエンディアンで大変な事態に陥るから。
安易な実装事故の元
初心者なんですが実際のソフトウェア開発なんかでビット単位で何かを扱うなんてことあるんですか? どんな場合に使うかちょっと想像できないでいます
>>152 いろいろある、データ圧縮では定番のテクニックの一つ
154 :
152 :2008/03/02(日) 14:06:40
データ圧縮ですか…ということは限定的なソフトウェアに限る、のかな
アーカイバならC#で作らんだろう
DGCAが気になってる最近
でも、MSIL上でビット単位の処理できても嬉しくないよね 消費リソースを抑えたいなら、結局はそこだけnativeにする形になるし
>>152 ネットワークプログラミングやバイナリファイルの読み込みではビットオーダーに気をつけないといけないね。
自分で作ったクラスライブラリのファイルを複数のプロジェクトで利用する事は出来ないのでしょうか?。 プロジェクト毎にコピーされるのではなく1つのクラスライブラリファイルを複数のプロジェクトで共有したい。
>>158 環境非依存ビットストリームライブラリは欲しいと思うけど、なおnativeは今後の事を考えると問題を引き起こす可能性が高いから止めるべき。
そもそもCom相互運用では処理速度が低下してかえって良くない状態に陥る。
>>160 普通にできるよ、追加のところのメニューをくまなく探す
まあ、新興の言語だとビットフィールドを採用しない傾向にあるからね。 intrinsicなビット操作命令は持ってたりするけど。
自作板のAHCIスレから来ました。 「iata75_cd.exeに-a -aって起動オプションをつけて走らせる。」 って言われたんですが、-a -aって起動オプションをつけて 走らせるにはどうしたらいいですか? 何か書き換えるためのプログラムが必要なんでしょうか。
スレ違いだコマンドラインでググれ低能
>>152 GUIの設定(ラジオボタン)とかはよくビットでデータ持つよ
>>168 あー、チェックが入ってるか否かを0と1でって感じでしょうか?
bool型とかにしてもそんな問題ない気はするけど実際はそういう話でもないのかな
>>169 boolで一つ一つ持つよりも、ビットでまとめて
マスク処理とかした方が分岐させやすい
>>167 コマンドラインですか><
了解しますた。
iata75_cd.exeでぐぐるとあら不思議w
盛大なマルチだな
174 :
102 :2008/03/03(月) 01:48:41
>>142 結構便利なので自分でも使い始めたのですが・・・
ダブルチェックドロックングの処理にバグを発見してしまいました、使うならこちらを使って下さい。
前出のコードではマルチスレッドで過負荷をかけると、Dictionary が壊れます。
>>139 氏の意見も取り入れて、ジェネリックにしてみました、実は当初も考えたのですが、
C++のように static 関数からジェネリックなシングルトンとなるオブジェクトを作り出す方法が思いつかなくて、
とりあえず object で実装していましたが、やり方を発見したので実装してみました。
ハッシュテーブルが一つになってさらに高速化したと思われます、またその過程でマルチスレッドバグも取れました。
あと、ハンドルの意味分りません、
>>139 氏、説明お願いできますか?
さらに高速化するなら、LINQ のようにアクセス部分をコンパイルして switch 文にしまうか……
それは今後の課題にでもしておきます。
使い方は変わりません。
public class FieldIndexerAttribute : System.Attribute
{
public int Index { get;set;}
public FieldIndexerAttribute(int index) { Index = index; }
};
175 :
102 :2008/03/03(月) 01:49:31
public static class FieldIndexer { class LookupTable<TSource> { public static LookupTable<TSource> Instance = new LookupTable<TSource>(); public System.Collections.Generic.Dictionary<int, System.Reflection.FieldInfo> mapIndexToField; public LookupTable() { mapIndexToField = new System.Collections.Generic.Dictionary<int, System.Reflection.FieldInfo>(); foreach (var fieldInfo in typeof(TSource).GetFields()) { var customAttributes = fieldInfo.GetCustomAttributes(true).OfType<FieldIndexerAttribute>(); var count = customAttributes.Count(); if (count == 0) continue; if (count != 1) throw new System.Exception("FieldIndexerAttributeが二つ以上ついているフィールドを発見"); int key = customAttributes.First().Index; if (mapIndexToField.ContainsKey(key)) throw new System.Exception("同じ値の FieldIndexerAttribute ついているフィールドを発見"); mapIndexToField.Add(key, fieldInfo); } } }
176 :
102 :2008/03/03(月) 01:50:11
public static object GetValue<TDataClass>(TDataClass obj, int index) { try { return LookupTable<TDataClass>.Instance.mapIndexToField[index].GetValue(obj); } catch (System.Collections.Generic.KeyNotFoundException) { throw new System.Exception("指定のインデックスの設定されたフィールドが存在しなかった"); } } public static void SetValue<TDataClass>(TDataClass obj, int index, object value) { try { LookupTable<TDataClass>.Instance.mapIndexToField[index].SetValue(obj, value); } catch (System.Collections.Generic.KeyNotFoundException) { throw new System.Exception("指定のインデックスの設定されたフィールドが存在しなかった"); } } }
マルチスレッド云々ならば性的コンストラクタ使えばいいじゃん
C#ってswitch文でbreakかかなくてもだーっと全部実行されないの?
関数ポインタ使えないだけですごい構文崩れるなぁ
>>179 フォールスルーしたいなら明示的にgoto
caseラベル間が空白でない場合は、break/return/gotoが必要
>>178 >>170 じゃないけど、たとえば
class MyClass
{
public int X, Y, Z;
public string Str1, Str2, Str3;
public bool flag1, flag2, flag3;
}
class Program
{
static MyClass[] tmp = new MyClass[] {//何か入ってる };
static void Main()
{
foreach (MyClass item in tmp)
{
if (item.flag1)
{
//処理
}
}
}
}
フラグを読んで色々処理を変えたいようなクラスを作ったとする。
運用上、格納するフラグを増やす必要が出てきたときにどうする?
MyClassをライブラリとして作成するような場合、そのライブラリの回収が必要になってくる。
もしフラグ自体をboolじゃなくて例えばintで持っていたとすると、
1ビットに1フラグを割り当てておけばよいから、32種類のフラグを格納できる。
上の例だと、フラグが3つあるということは残り29ビットは予備の領域として確保できる。
運用を変えるだけでフラグを簡単に増やせるようであれば、ライブラリ化してあるMyClassの回収の必要がないので便利。
>>178 あとは本題のマスク処理というのは、多分こういうことだと思う。
class MyClass
{
public int X, Y, Z;
public string Str1, Str2, Str3;
public int flag; //ビット単位でフラグを格納
public bool flag1, flag2, flag3, flag4; //全てboolで格納
}
フラグ1と3と4が立っている場合の条件分岐を考える。
boolで各フラグを格納しているクラスを使う場合、
bool f = flag1 && flag3 && flag4;
一方、intで格納しているクラスを使う場合、
int ff = 1 + 4 + 8; //それぞれflag1,flag3,flag4を表す
bool f = (flag & ff) == ff
また、全てのフラグをリセット(false)にしたいときなんかは、
flag1 = false;
flag2 = false;
flag3 = false;
flag4 = false;
intでフラグを格納してあれば当然、
flag = 0;
これだけで済む。
MyClassの中身が複雑になればなるほど、こういう手法は効果的になる。
LINQのある今、ビット操作類もここに統合すると便利かもしれないな bitvector.All() 指定のビットすべてについて true なら true bitvector.Any() 指定のビットのなかに true なものがあれば true はるかに柔軟性があるし。
そんくらい自分で
>>187 BitArrayならOfType<bool>通せば可能だよ
列挙体やBitVectorにも拡張メソッド付けて
flag.ToEnumerable().Anyとかできるようにしたら面白いかもね
ひとつのクラスで何行以上はよろしくないみたいなのはありますか?
なるほど、ないんですかー 今色々試してみてるところで、ちょこっと場当たり的に作ってみたのですが 1つのクラスは2000行ほどなのに対してもうひとつが200行弱ほどで、その2つのみなのでどうも不自然に感じていたようです
あんまり長いのは常識的によろしくないから気になるんだったら切ればいい
切るっていうのはpartialってことではないですよね 主要処理部分のswitchが厄介だしここを別クラスにすべきっぽいかな… ありがとうございました
196 :
102 :2008/03/03(月) 17:20:58
適当に長そうなところを、マウスでにるにるっと選択して 右クリック→リファクタ→メソッドの抽出 ってやればいいんだよ
その機能はしってるんだけれども抽出してどうするんだろう
最近namespaceを namespace ソリューション名.Properties にしているんですが namespace ソリューション名 と違いはあるんでしょうか、普通にやると下になってそれがデフォルトのようですが
199 :
102 :2008/03/03(月) 17:25:39
>>198 こらー、何処にいれちょるかー
そこは、アプリケーションプロパティーの居るべき場所じゃー
まあ名前空間はほんとにただの名前だからどうでもいいといえばどうでもいい
201 :
198 :2008/03/03(月) 17:30:31
最初はソリューション名だけだったけどなぜか途中から切り替えました たしかコードか何か新規項目を追加したときかな で、今戻したらエラーが、Propertiesでいいや
Enum.GetValuesで得られる値の配列と, Enum.GetNamesで得られる名前の配列の 要素の順番の対応は保障されてるの?
されてるって書かれてなかったっけ?
されないよ 同値異名が可能なことを考えれば明らか
>>203 謎の日本語だけれど、期待するなと書かれているように受け止められますな
> 解説
>戻り値の配列の要素は列挙定数の値に基づいて並べ替えられます。同じ値を持つ列挙定数がある場合、対応する名前の順序は指定されていません。
保障も何もどういう順序づけしていいかわかんないだろ
enum Hoge { A = 4, B = 3 } こんなん書けたよな
泉あつの?
209 :
デフォルトの名無しさん :2008/03/03(月) 22:56:46
>>207 書けるんじゃね
続いてCだけを定義すると自動的に4になる
210 :
デフォルトの名無しさん :2008/03/03(月) 23:08:46
211 :
デフォルトの名無しさん :2008/03/03(月) 23:11:11
210です! 問題解決しました!!!!!
CellsもCOMオブジェクト返すんじゃなかったっけ
>>211 どう解決したか書けっつーのカス
書けないなら最初から2chで質問すんな
214 :
デフォルトの名無しさん :2008/03/03(月) 23:23:49
211です。 System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet.Cells); これを入れたら、なんか解放したりしなかったり・・・ VSの問題???
さんざん既出な気がするが回答忘れた
216 :
デフォルトの名無しさん :2008/03/03(月) 23:25:39
211です // Excel を起動しファイルを読み込む // ※ Excel ファイルのパスは適宜修正してください Excel.Application app = new Excel.Application(); Excel._Workbook wb = app.Workbooks.Open( @"C:\test\test.xls", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing ); wb.Application.Visible = false; // 人口のデータを配列に読み込む Excel._Worksheet ws = (Excel.Worksheet)wb.ActiveSheet; ws.Cells[5, 5] = "テスト"; System.Runtime.InteropServices.Marshal.ReleaseComObject(ws.Cells); // ファイルをセーブし、Excel を終了する wb.Save(); app.Quit(); System.Runtime.InteropServices.Marshal.ReleaseComObject(ws); System.Runtime.InteropServices.Marshal.ReleaseComObject(wb); System.Runtime.InteropServices.Marshal.ReleaseComObject(app); これでは解放しない??
もう、GC.Collect(); GC.WaitForPendingFinalizers();でいいよ
218 :
デフォルトの名無しさん :2008/03/03(月) 23:41:22
なんで同じロジックで解放したりしなかったりするんだろうか・・・
たとえば、 app.Workbooks.Open ここで、Workbooksが漏れる wb.Application.Visible = false; ここでApplicationが漏れる
220 :
デフォルトの名無しさん :2008/03/03(月) 23:52:36
>>219 ありがとう、なんか現象として、cellに入れる値を変えてリビルドすると
解放されるんだけど、すぐにもう一回すると解放されない・・・みたいな
221 :
デフォルトの名無しさん :2008/03/03(月) 23:54:55
220です すいません。 リビルドでなくデバックです^^;
ws.Cells[5, 5] = "テスト"; を分解すると a1 = ws.Cells a2 = a1[5, 5] a2.set_Value(Excel.XlRangeValueDataType.xlRangeValueDefault, "テスト"); でa2の開放がもれている。
223 :
デフォルトの名無しさん :2008/03/04(火) 00:00:02
>>222 すいません。
a1,a2はなんの変数でしょうか?
a1も漏れる気がするけど?
a1はRangeでa2もRange。
>>202 ・各要素は列挙定数でソートされる
・列挙定数が同値の要素の順序は不定
Enumとしてはともかく、値だけ見れば対応していると言えるな
列挙定数が同値というのは要するに別名だし
とりあえず、(type)Enum.Parse(type,names[i])==values[i]は真
>>224 開放されてるように見えるが?
念のために補足しておくと、
>>216 でws.Cells[5,5]も解放しろって話だろ
227 :
デフォルトの名無しさん :2008/03/04(火) 00:21:58
解放はされるようになったが、今度は上書きされなくなった orz // 1000 ミリ秒 (1秒) 待機する System.Threading.Thread.Sleep(1000); xlRange.set_Item(3, 5, "テスト"); System.Threading.Thread.Sleep(1000); xlBook.Save(); Rangeにはset_Itemしかなく、何か参照が足りないのでしょうか?? Excel.XlRangeValueDataTypeを書いてもエラーが出ます。
COMラッパの開放漏れをなくすのには限度があるから、諦めれ
ws.Cellsと言った時点でリファレンスカウントが1進むんじゃないの? だからReleaseComObject(ws.Cells)は、増やして減らして意味ない 文かなーと思ったけど
>>229 RCWの参照とCOMの参照カウンタは別。
RCW、つまりマネージ参照をいくらコピーしてもCOMの参照カウンタは増えない。
ReleaseComObject(ws.Cells) は新しいCOMオブジェクトを取ってきてそれを開放するから意味がないだろ。
ws.Cellsは同じオブジェクトを返してくれるの? ExcelのCOMを経由して、あたらしいオブジェクトが2つ、3つとできるんでなくて?
ExcelのCOMインターフェイスはExcelマクロ(VBAやそれに準じるDLLなど)のための機能で 外部の独立したプロセスからExcelを操作することを意図して作られていない。 VSTOもそういう設計思想。
というより単に.NETとCOMの相性が悪い点が見事に現れただけではないの?
デストラクタでReleaseComObjectするラッパ被せてusing使うと大分ましにはなるけど、それでも汚いな
Office.Netマダー?
ふつーのGCみたいに消極追跡(使われていないかを調査)じゃなくて 積極追跡(Excel.Applicationから生み出されたRCWすべてのweakrefリストとか)して まとめてあぼーん、みたいにはできないものかね? まあ、COM一般を対象にするならイマイチつかえない、Office用途な使い方になるけど。
タイプライブラリから生成されるアセンブリに手を加えれば出来ると思うよ。
こんなコード書くくらいならGCにやってもらう方を選ぶね
241 :
デフォルトの名無しさん :2008/03/04(火) 07:36:08
Comが入り込む場合は、出来る限り開放したら、あとはガベージコレクタを無難なタイミングで起動して解放するほうがいいような気がします。 自分はなんとなく全部書ききってしまってますけど・・・
242 :
デフォルトの名無しさん :2008/03/04(火) 07:38:03
↓
なあに?
>>174 フィールドハンドルを保持しといて、必要になった時点で
フィールドインフォを取得するやり方のこと。
まあ必ずしもやる必要はないし、
単純な速度的にはやらない方が有利だけどね。
XmlSerializerを使った場合、BinaryFormatterでの[OnDeserialized()]に相当する機能はないのでしょうか? TreeNode.Parentのように、 あるオブジェクトAの内部で持っているオブジェクトBでオブジェクトAをプロパティParentで持っているのですが、 これを復帰させる方法に悩んでいます。 そのままだと循環参照でエラーになってしまうのでParentには[XmlIgnore]をつけてあります。 Deserialize()したあとに再セット用のメソッドを動かせば済むのですが、 オブジェクトAはList<>の中で持っているのでループを回す必要があることもあって、 あまり美しくないのでできれば避けたいのですが、何かいい方法はないのでしょうか?
246 :
デフォルトの名無しさん :2008/03/04(火) 09:34:44
webbrowserコントロールで navigateを同期的に行う方法ってないですかね? webbrowser.Navigate(url); してDocumentCompletedイベントでDocument拾うと、 コードが分離されてわかりにくいし、遷移先のページごとにあれこれ処理変えたい 場合、複数のイベントハンドラメソッドを定義して イベントにアタッチ、デタッチを 繰り返さないといけないので、ロジックがスパゲッティになっちまうんですが…。 webbrowser.Navigate(url) while(webbrowser.IsBusy) { } でループ回しても、Documentが読み込まれていないタイミングのこともあるんで いまいち信用ならないんですが、IsBusyプロパティ以外になんか判定タイミング ってあるんでしょうか?
.NETの機能を色々試してみようと思い、身近そうなFileやDirectory関係を使ってみていて疑問に思ったことがあります foreach (string file in Directory.GetFiles(dir)) { try { File.Copy(file, destpath, true); } catch { continue; } } 以上のように、複数ファイルをforループで回してコピーや削除を行っています そこで、エラーは表示しなくていいのでコピーや削除でエラーが出たら飛ばしたいなと思い コピーまたは削除処理にをtryで囲み、catchしてcontinueするという風にしています。 まず、コピーや削除が失敗することがあるのか(File.Copy、File.Delete等) 次に、私が上記で示したようにtryで処理を囲みcatchでcontinueするような処理が一般的なのかどうか 次に、出した例ではstringで処理していますがFileInfoなどを利用してみてもいます。 FileInfoを使うことで、他の質問にある答えが変わる場合それも教えて頂きたいです。 最後に、trycatchで処理部分を囲んでいるとして、それをループしています(そこがおそらく一番時間かかる主要処理) その際、処理速度の低下などは気にするほどあるのでしょうか? 以上です、よろしくお願いします
>>246 >遷移先のページごとにあれこれ処理変えたい場合、
>複数のイベントハンドラメソッドを定義して イベントにアタッチ、デタッチを
>繰り返さないといけない
が理解できないが
イベントハンドラ内で分岐すりゃいいだけじゃね?
IsBusyループはあほかって感じ
>>247 >まず、コピーや削除が失敗することがあるのか
当たり前だが、ある。
>tryで処理を囲みcatchでcontinueするような処理が一般的なのか
エラー処理でどんな処理をしたいかによる
一般にcatchで握りつぶすのはよくないが、ファイル操作のときは
仕方ないときもある
>FileInfoを使うことで...
同じ。Fileの静的メソッドは内部でFileInfo使ってる
>trycatchの処理速度の低下
tryはコスト高くない。catchが発生した場合は高コスト
ディスクIOの方が重いだろうけど
249 :
デフォルトの名無しさん :2008/03/04(火) 10:24:58
>>247 > まず、コピーや削除が失敗することがあるのか(File.Copy、File.Delete等)
ありますね。destpathが無効だったり、アクセス許可が無かったり、ファイルがロックされていたり
destpathが既に存在したりしていれば失敗します。
> 次に、私が上記で示したようにtryで処理を囲みcatchでcontinueするような処理が一般的なのかどうか
この例でcontinueがいるとは思えないですが…。。。
> 次に、出した例ではstringで処理していますがFileInfoなどを利用してみてもいます。
> FileInfoを使うことで、他の質問にある答えが変わる場合それも教えて頂きたいです。
同じだと思います。
> 最後に、trycatchで処理部分を囲んでいるとして、それをループしています(そこがおそらく一番時間かかる主要処理)
> その際、処理速度の低下などは気にするほどあるのでしょうか?
try-catchでも例外が起きない限り、ほとんどコストはかからないと思います。
逆にコストが問題になるほどしょっちゅう例外が起きるなら、ロジックを見直すべきだと
思います。
ファイルがらみの例外は種々雑多なので例外処理のコストを嫌ってすべて条件判定
で処理しようとしても、労多く益は少ないと思いますが。
250 :
デフォルトの名無しさん :2008/03/04(火) 10:35:19
>>248 二つや三つの場合分けならいいんですが、たとえば
Aページでフォームに自動記入してBページに飛んで、そこでなんか情報取って
さらにCページへ飛んで、サーバ側やクライアントスクリプト、activeXコンポーネント等で自動
ジャンプさせたのを判定して…Dページでまたフォームを記入して………
などと一連の動作を自動化することを考えると、条件分岐が異常に深くなってしまって、
それはそれでものすごく読みにくいんですわ。
素直にwebclientで同期的にダウンロードしてHTML独自に解析しろって言われそうですが、
ページでスクリプトやらactiveXコンポーネント使っているとお手上げなもんで、どうしても
DOM操作して人間の動作をエミュレートしたいときがあるもんで…。
>>250 よくわからんけど、
abstract class Base {
public abstract void やること();
}
class 処理A : Base{
public override void やること() {
.....
}
}
class 処理B : Base{
public override void やること() {
.....
}
}
みたいにそれぞれの処理用のクラスを定義して、
Navigateする前に該当する処理クラスのオブジェクトを作って、
private Base 今の処理
みたいに保持しておいて
DocumentCompletedで
今の処理.やること()
みたいにすればすっきりするんじゃね?
252 :
247 :2008/03/04(火) 11:15:49
>>248 >>249 ありがとうございます。
trycatchはコストが低いということが聞けて安心しました
もし、以下の処理だけならcatch{}だけでよかったですね、反省
foreach (string file in Directory.GetFiles(dir))
{
try
{
File.Copy(file, destpath, true);
}
catch
{
continue;
}
}
明示的にcatch{}ってしなくていんじゃないの、その例なら
catch{}はしなきゃだめだっての continueはいらんっちゃいらんけど
まあcontinueって書いてても悪くないと思うけどな
MSDNに書いてある例外くらいは事前にチェックして発生させないようにしとくべきだろ キャッチはどっちみち必要だけど
ある程度の事前チェックは必要だと思うけど、どうせ中でチェックして起きた例外をcatchするんだから、 事前に全部チェックしてたら二重になって遅くなりそうだし面倒くさいから俺はやらねえ。
258 :
デフォルトの名無しさん :2008/03/04(火) 14:39:24
>>255 ここではたまたまcontinueがループの最後にきてるから良いけど
continueは後無視してループの頭に戻っちゃうから、場合によっちゃまずくないですか?
259 :
デフォルトの名無しさん :2008/03/04(火) 14:39:47
先物チャートと検証ソフトを作りたいのですが、 C#のフォームとグラフィックを扱った書籍を教えていただけないでしょうか? MDIでの開発の仕方が載っているものがあると助かります。 以前はDelphiを数年バリバリに使っておりましたので、 プログラミング初心者というわけではありません。
260 :
デフォルトの名無しさん :2008/03/04(火) 14:40:14
> C#のフォームとグラフィックを扱った書籍を教えていただけないでしょうか? C#のフォームとグラフィックを扱った書籍のお勧めを教えていただけないでしょうか?
261 :
デフォルトの名無しさん :2008/03/04(火) 14:43:07
>>251 えっと 出していただいた例を今ひとつ理解し切れていない自分ですが、
たとえば、wb_documentcompletedでdocumentを取得して
その中のformをinvokemenber("submit")したりすると、次にやるべき処理の
クラス(baseの子クラス)を設定する場面が無いと思うんですが…。
wb.Navigateを呼び出したルーチンには戻らないでそのまま再びdocumentcompletedに
とんでっちゃうわけで…。
262 :
102 :2008/03/04(火) 18:54:07
>>244 すみません、後学のために教えていただけますでしょうか、フィールドハンドルって何ですか?
知らない知識がまだまだあるみたいです……
>>263 ちゃんとレス辿ってないだけでしょ、彼が
すみません、プログラミング自体の経験は過去にDelphiを少し触って挫折したような者です。
しかし、ひとつ作ってみたいプログラムのアイディアが浮かんだので、
これからC#で作ろうかと思っているのですが、なかなか指針すら立ちません。
どのような設計をすればよいのかアドバイスをお願いいたします。
何を作るのかというと、睡眠日誌というものがあるのですが・・・↓
ttp://www.kaimin.info/part/pdf/nisshi.pdf これを実現するようなアプリを作りたいのです。どうすればよいでしょうか?
睡眠障害のある俺にぴったりじゃないか。 作るかな。 ネタ提供サンクス。
>>265 まず書いて動かすこと
動かせる範囲のものを書くこと
はじめからちゃんとしたものを作ろうとしないで一部分だけでいいからちゃんと動かす
うまく行かなくなったら何度も書き直す
それがうまくやるコツ
268 :
265 :2008/03/04(火) 22:02:27
>>266 なんとありがたい!
あまり突っ込むとスレ違いになりますが、私自身過眠症で必要に迫られてのことで。ぜひともお願いいたします。
後学のため、よろしければどのような感じで作るかの指針をお教えいただけませんでしょうか?
269 :
265 :2008/03/04(火) 22:06:56
>>267 なるほど。一度イメージするUIを紙に書いて、
自分なりにどの部位からコード化していけそうか考えてみます。
アドバイスありがとうございます。
270 :
デフォルトの名無しさん :2008/03/04(火) 22:37:48
>>264 いや、逆にcontinue書かなきゃいけない理由が知りたいですけど
>>270 むしろ後に何か書き加える場合にcontinueがないとぶっ壊れるだろ
形としてはここにcontinueがあるべきで、今必要ないからといって
削除しなきゃならないというものでもない
public bool IsMarked(object obj) { // この部分 } 上記のコメント部のなかで、 引数のobjが宣言時に特定の属性をつけられたかどうかを判別する方法はありますか? たとえば [Marked()]object a; void Test() { if(IsMarked(a)) { Console.WriteLine("True"); } } みたいなことができれば満足です。 詳しい方がたくさんおられるようなので、宜しくお願い致します。
過眠症なんて病気があるんだw なんか最近の医者って新しい病気作るのに必死だよな。
属性はインスタンスには付かないぜ
>>271 > むしろ後に何か書き加える場合にcontinueがないとぶっ壊れるだろ
追加実装の場合は、単なるコーディングミスだろ・・・
> 形としてはここにcontinueがあるべきで
ないべき。
使用しない、意味の無いコードは書いてあっても利益にならない。
なんで使わない変数とかが警告出るか考えろよ。
じゃあifの中が一行しかないのに{}でくくってあったら消すのか?
>>278 ちゃんとレス読んでから書け、読んでてそれなら半年ROMれ。
>>247 だとfor文の最終行にcontinueつけてんのと同じ事。
>>279 同じことだろうが
実行結果に関わらない、単に無駄なだけのコードだ
それに意味があると考えるか考えないかはお前の主観でしかない
ifを{}にいれておくのが望ましいといわれるのは、そこに何か追加することがあるからだ
あのコードは下に追加される可能性が大いにある
その意味ではあのcontinueには意味がある
elseがいらなくてもelseと書いた方が分かりやすいこともある
ケースバイケースだ
それはそれとしてC#ではfor文の最後にcontinueを書かなきゃならなくなることもよくあるぞ
>それはそれとしてC#ではfor文の最後にcontinueを書かなきゃならなくなることもよくあるぞ いいえ
静的コンストラクタが呼ばれるのは >最初のインスタンスが作成される前、または静的メンバが参照される前 と書いてありますが、複数スレッドから同時にアクセスした場合でも正常に動作するのでしょうか?
gotoのラベルがfor文の最後に来る場合、ラベルの下にcontinueを書く必要がある なんでそうなってるのかといえばラベルがforの最後にあるより、その下にcontinueがあったほうが 意味がはっきりするからだろう
>>280 bool flg = false;
if (flg) {
} else {
・・・
}
こんなコード書いちゃう人?
>>284 それはわかりにくいだろう
if(flg == false)
と俺は書くな
俺なら if ( ! flg ) { //・・・ } って書くぜ。 っていうかたまに flg == false とか flg == true って書き方みるけど変じゃね?
if(flg == false)は 普通に左から読んでいけば もしフラグがfalseならば、 と読める !flgは頭の中で変換しなきゃならない flgがよっぽど何のことか分からない名前でなければ==trueとも書かないな しかし変数名がflgだったら==trueと書くかもしれない
!flg程度で頭動かさなきゃならんのは駄目だろ
289 :
デフォルトの名無しさん :2008/03/05(水) 02:21:11
>>271 ちょっとだんだん意味わかんなくなってきたんですけど、
もしかしてcontinueの意味取り違えてません?
あとに何か書き加えたときにcontinueあったら、「後に書き加えた何か」
無視して、次の反復処理に制御を移動されちゃうと思うんですが…。
break→以下無視して反復処理抜ける
continue→以下無視して 次の反復処理へ移動
だと思ってましたが、違いましたっけ?
>>289 何を言っているのか分からないが
後に書き加えた何かは、例外で失敗した後には実行されないものだ
そしてそれはtryブロックの後ろに配置されるべきものだ
全部をtryで囲んで全てをキャッチするというのは悪いコーディングだ
>>283 }の直前など、対応するコードの無い部分にラベル付けられないからだろ
どうしてもラベル付けたいなら、普通は空ステートメントを書く
>>284-288 if(flg == true)と書くやつは、何故if((flg == true) == true)あるいは
if((((flg == true) == true) == true) == true)と書かないのか
という指摘を見たことがあるな
>>292 空ステートメントなんていう異様なものを書くよりは、continueの方がずっと分かりやすいだろう
ちなみにCにはこんな制限はない。C#にわざわざ加えられたものだ。
おそらくcontinueと書かせるためだろう
>f(flg == true)と書くやつは、何故if((flg == true) == true)あるいは
>if((((flg == true) == true) == true) == true)と書かないのか
意味が伝わりにくくなるからだな
プログラムにとって大事なのは意味が伝わりやすいことであり
文の量が最小になることではない
294 :
デフォルトの名無しさん :2008/03/05(水) 03:01:10
>>290 例外で失敗した後には実行されないものはtryブロックの中に入れるべきで
>全部をtryで囲んで全てをキャッチするというのは悪いコーディングだ
とは全然無関係ですよ。
flgっつう名前が悪いだろ bool isHogehoge なら if( isHogehoge ) と書いても違和感はない
>>294 それでは例外で失敗しなかった後に実行された文で起こった例外まで無差別にキャッチする
それはバグを握りつぶしてしまう
よくないコーディングだ
continue より flg の話が気になるな まず flg という名前が論外で、if ... の ... に配置して意味が通るような名前を付けて、flg==true だの flg==false だのは今すぐ止めるべきと思うな それが「プログラムにとって大事なのは意味が伝わりやすいこと」になるんだと思うよ。
298 :
293 :2008/03/05(水) 03:39:42
>プログラムにとって大事なのは意味が伝わりやすいことであり >文の量が最小になることではない まったくもって同感だが、ロジックの複雑さは最小にすべきだ。
300 :
292 :2008/03/05(水) 04:36:35
>>293 continueを書くかどうかは好みの問題だから議論する気はないが、
「continueと書かせるため」というのは誤解を招くので
ラベルの後にステートメントが必須なのはC++からで、
一応、仕様ではlabeled statementということになっている
単にラベル単独では存在し得ないというだけのこと
>>283 ラベルは命令文の前に書く必要がある。命令文は空文でも良い。
for ( .. ) {
....
label_1: ;
}
でOK。
302 :
デフォルトの名無しさん :2008/03/05(水) 06:47:59
DataGridViewでのコンテキストメニューの抑制ができなくて困っています。 自作のコンテキストメニューではなく、標準というかShell(?)のコンテキストメニューです。 DataGridViewTextBoxColumn、DataGridViewTextBoxCellでセル選択後に カーソルがあたった状態で編集可能になったときに 右クリックすると、このコンテキストメニューが出るのを抑えたいのです。 通常のTextBoxでは TextBoxのContextMenuStripに、空のContextMenuStripを設定するなり 新しいContextMenuStripのインスタンスを(newする)設定するなりすれば 抑制できるとことまでは判明して、実行できているのですが DataGridViewの場合に、同様の制御をするための実装方法がわからないのです。 ご存知の方、お教えください。
ifでの条件文の書き方についてのノウハウはCとC#で違うから混同すると議論が噛み合わない。 C++には論理型があるがCとの互換のために穴だらけだから結局Cと同じになる。 一方C#のifには条件文しかかけないし、論理型は単独で条件文たりえる。
>>302 EditingControlShowing とか
文字列をデータとしてファイルに保存してあとで読み込みたいと思っています。 文字列の構成は、9つの行と、行数不定の項目です。 その構成を一つのかたまりとしてたくさん扱いたいのですが、どうしたらいいんでしょうか?
C#というのはどういった場面で使われるんでしょうか?Windows環境で動くソフトウェア全般だとは思うのですが 実際本職の方達はC/C++ベースで作ってそうですし いまいちピンとこないです
>>305 CSVでもXmlSerializeでもいいんじゃないかと。
>>306 ASP.NETとか?
308 :
デフォルトの名無しさん :2008/03/05(水) 08:49:49
>>297 flgの話は 命名法の問題は同意 その先 ==trueとするかどうかは趣味の問題。
>>296 continue書かないなら正解。
continueなんてせっかくの例外処理の構造化をわざわざ壊すようなもんをどうしても
書きたいなら不正解だろ。
>>262 RuntimeFieldHandle
フィールドを一意に識別出来るハンドル。
識別という意味では、FieldInfoに1対1で対応している。
RuntimeFieldHandleとFieldInfoは相互に取り出すことが出来る。
FieldInfoなどのオブジェクトはサイズが大きいため、
常に使い続ける必要がないものはRuntimeFieldHandleで保持しておき、
実際に必要になった時点でRuntimeFieldHandleからFieldInfoを取得する。
こうするとFieldInfoがGC対象となり、頻繁に使われないものはメモリを占有しなくなる。
>>306 いやいや、中小企業で使ってる業務システムには、VisualBasicが多いよ
Cで組んだシステムの方が珍しい。
大企業みたく開発費をかけたくないし、開発期間も短くしたいし、保守性を容易にしたいし、
負荷も少ないしリアルタイム性も求められない用途は多いから。
C#はVisualBasicよりいいし、そういう方面にも使われる
>>307 >>310 なるほど…
来年度から就職でして、使うのかなぁといった感じで質問しました。
C/C++をやりつつC#に手出してて最近はWinAPI関連の本買って手出し始めたので
ちょっと気になりました、ありがとう
どんな分野?それによるからなぁ、逆に低級言語ばっか使うとこもあるし
>>312 そこら辺が明確に教えてもらえてなくって(使う言語とか)
一応エンジニア業と営業のそれを両方出来る人材を…って感じで募集されてて
会社自体は自動車会社のシステム部門です
お前らそういう話大好きだな
>>313 だったら、営業の顧客管理表をC#でちゃちゃっと作ったり
(たいてい、個人が自分の机のPCでエクセルでちまちまやってるから、
活用するときに面倒だったり、顧客表の流出する可能性があったり、
各営業間で共有が出来てなかったり等々。システムを作れば、
顧客の誕生日一週間前にポップアップさせてみたり、
車検前や12ヶ月点検前にポップアップさせてみたり、いろんな活用も出来る)。
また、営業所とエンジニア部門とをLANで結んだ連絡システムを作ったりにも使えるだろ。
stand-aloneなシステムを手早く作るのにも、
離れた部門をLAN経由で結んだシステムにも、C#は向いているし。
文字列に指定の引用符を付けたり(Quote)、外したりする(Dequote)メソッドはないでしょうか?
>>316 です。
ええと。例えば、文字列ABCにダブルクォート"の引用符を付けると、
"ABC"、文字列DE"Fに付けると、"をエスケープ?して、"DE""F"にする
ようなメソッドです。Dequoteはその逆の操作です。
class = new class(); このclassに後から変数を追加するなんて暴挙はできないでしょうか?。
>>318 それくらい自分で作れば
>>319 無理
classのオブジェクトをキーにしたDictionary使うとか
初めまして。 C# 2008 Expressを使ってます。 OpenFileDialogで、画像を選択した際にdialogのウィンドーにプレビュー画像を表示したいのですが、 いったいどうすればいいのでしょうか。
>>304 ありがと。
それでなんとかなりそうです。
323 :
デフォルトの名無しさん :2008/03/05(水) 12:03:02
ボタンにUACのシールドアイコンを付加しようとしているのですが、 VS2005なので SystemIcons.Shieldが利用できません。 なので、APIから行おうとしたのですが、 internal class WinAPI { [DllImport("user32.dll", CharSet = CharSet.Unicode)] extern public static IntPtr SendMessage(IntPtr hWnd, uint msg, IntPtr wp, IntPtr lp); } 〜 WinAPI.SendMessage(Target.Handle, (UInt32)0x160c, IntPtr.Zero, (IntPtr)1); としてもシールドアイコンが表示されません。 何か間違ってるのでしょうか?
324 :
321 :2008/03/05(水) 12:05:32
追加でごめんなさい。 ↑の件ですが、「縮小版」ではなく、クリックしたときにパッと表示してほしいんです。 あと、openFileDialogには大きさのプロパティがありませんが、 実行時にはマウスでドラッグして大きさが変えられますよね。 プログラム上で自動で変更できるんでしょうか。
>>307 ありがとうございます。
XmlSerializeでなんとか出来そうです。
試しに
>>174 をDynamicMethodでif…else if…相当のコードを生成して
毎回リフレクションを使わないようにしてみたら10倍くらい速くなった
もっと速くなると思ったんだけどなあ
328 :
321 :2008/03/05(水) 13:43:14
>>326 ありがとうございます。
敷居が高そうですね・・。もう少し慣れてから挑戦してみます。
>>327 if else は、フィールドの数が増えると遅くなるんじゃねえの、使うならswitchだろ。
どっちもJITコンパイルされれば同じだと思うのだが
switchは遅くならないのかよっ
333 :
デフォルトの名無しさん :2008/03/05(水) 16:13:40
この場合アセンブラだろ お前も基礎を勉強しやがれ
>>334 違うだろ、テーブルルックアップ式 goto label の勉強だ
>>327 FieldIndexerAttributeにAttributeUsage(Attribute)付けるといいかもと思った
あと、
>>139 の言ってるのは多分FieldInfo.FieldHandle/GetFieldFromHandleの事
>>329-332 以下、MSIL生成する言語に限った話しなのでそのように
疑問があれば逆アセンブル(ildasm.exe)してみればいい
判定するのが連続した整数値じゃないときはswitchもif〜elseも大差ない
比較部分は同じで処理部分がサブルーチンかスパゲッティかって感じ
連続した整数値があれば(一部でも可)switchではその部分がまとめられる
MSILから先は分からないが、多分ジャンプ先を数値的に計算してるんだと思う
switchを逆アセンブルしてみると、if,elseとgo,labelの組み合わせだよ
値が連続したところは
>>336 の言うように纏められるよ
あれ手でやるのは面倒
class A { // ildasm.exe static void Main( string [] arg ) { System.Console.WriteLine( arg[0] ) ; switch( (int)arg[0][0] ) { case 0 : System.Console.WriteLine( 'A' ) ; break ; case 1 : System.Console.WriteLine( 'B' ) ; break ; case 2 : System.Console.WriteLine( 'C' ) ; break ; } } }
.method private hidebysig static void Main(string[] arg) cil managed { .entrypoint // コード サイズ 66 (0x42) .maxstack 3 .locals init (int32 V_0) IL_0000: ldarg.0 IL_0001: ldc.i4.0 IL_0002: ldelem.ref IL_0003: call void [mscorlib]System.Console::WriteLine(string) IL_0008: ldarg.0 IL_0009: ldc.i4.0 IL_000a: ldelem.ref IL_000b: ldc.i4.0 IL_000c: callvirt instance char [mscorlib]System.String::get_Chars(int32) IL_0011: stloc.0 IL_0012: ldloc.0 IL_0013: switch ( IL_0026, IL_002f, IL_0038) IL_0024: br.s IL_0041
IL_0024: br.s IL_0041 IL_0026: ldc.i4.s 65 IL_0028: call void [mscorlib]System.Console::WriteLine(char) IL_002d: br.s IL_0041 IL_002f: ldc.i4.s 66 IL_0031: call void [mscorlib]System.Console::WriteLine(char) IL_0036: br.s IL_0041 IL_0038: ldc.i4.s 67 IL_003a: call void [mscorlib]System.Console::WriteLine(char) IL_003f: br.s IL_0041 IL_0041: ret } // end of method A::Main このスレは息を吸うようにウソをつく奴が居るので注意が必要だ
まあ、間違いもあるだろうからそんなわざわざ相手逆なでするような言い方する必要はないと思うけど。 結局、IL レベルで switch 命令ありで、 JIT 時に if-else 式かテーブルルックアップ式かで最適な方選択ってこと?
間違いっつーか、これプログラマなら常識だろ?
自分の常識を人に押し付けるもんじゃないけど、 その常識ってのは、 MSIL が switch 命令を持ってるってのの方か、 一般に switch はルックアップテーブル使って高速化可能って話の方か、どっち?
そんな複雑な事は聞かないし、普通に学校で教えてもらえるだろ、switchの使い方。
CILのswitch命令はJavaバイトコードでいうところのtableswitch命令相当かな。 Javaバイトコードにはもう1つlookupswitchって命令もあって、CILにはこれに相当するものがない。 これがないせいでgotoだらけのコードができることもあるかもね。 あと、C#のswitch caseには文字列を突っ込むこともできて、このときはもはやswitch命令は関係なくなる。 MSのC#コンパイラは、分岐数増えてきたらDictionary<string,int>を裏で作るって実装になってたかと。
347 :
346 :2008/03/05(水) 17:21:07
>このときはもはやswitch命令は関係なくなる。 すまん、これは言い過ぎか。 Dictionary<string,int>を使って無理矢理switch命令用のインデックスを作り出す。 が正しい。
今、色々 IL Disasm して遊んでみてるけど、switch のコンパイル結果、そんな単純でもなさそう。 case が 0 で始まる連続な整数 → IL switch 命令 非 0 から始まっての連続 → sub してから switch 命令 完全に不連続 → beq とか brtrue の連続(= if-else と変わらない) だった。
あと、例えば、 switch(x) { case 0: xxx; break; case 4: xxx; break; case 6: xxx; break; case 9: xxx; break; } みたいなのは、0 のところだけ beq、 それから 4引いてから switch 命令、 その後さらに switch 後の default 句内で case 9 の判定するような妙なコードに。 ラベルが不連続でも、値の近い整数ならある程度最適化かけてるっぽい。
コンパイラの出力にあわせてチューンはすべきじゃないよ 高速化したいなら、コンパイラにキチンと意図の伝わる形でコードすべき 前から準にシーケンシャルに比較をする事を伝えたいなら if else if で 一括比較したいなら switch で、将来のJITのチューンにあやかれるようにね。
Cのswitchの実装は処理系依存だろ。常識って何だよ。
>>351 常識っていうのは、プログラマ間で意思疎通をするのに最低限必要な知識だよ
>常識っていうのは、プログラマ間で意思疎通をするのに最低限必要な知識 これはどこに書いてありますか?
>>350 それは同意。
まあ、ただ、単なる興味本位で、IL の switch 命令に関して。
Java の tableswitch, lookupswitch とはどっちとも違うかも。
単に、スタックの先頭を見て、その値をインデックスにしてジャンプするだけっぽい。
ldloc.1
switch (0x10, 0x20, 0x30)
なら、ローカル変数1の値が 0 なら 0x10 に、1 なら 0x20 にジャンプってだけ。
switch をブランチの羅列にするか、引き算/テーブル参照+switch 命令にするかは
結局コンパイラ次第ね。
こういう議論て、ふらっとスレで行われることが多いのはなんで?
前からずっみみてきたが、誰か約一名、ウソを本当のように自信たっぷり書くアンポンタンが居ついているんだよ コイツ以前マ板にもマルチレスで同僚がswitch文を使って if をごまかしたとか書きまくっていた奴じゃねぇかな こういうキチガイはいっぺん地獄へ落ちればいいんだよ
>>356 一旦的外れな方向に話が行った方が議論が盛り上がるからとか?
>>357 そういう発言はキチガイをよりいっそう近づけるから、
キチガイがいやなら逆に抑えた方がいいよ。
paintイベントを発生させるにはRefresh()だったりを使ってイベントを発生させるけど、 任意のイベントを発生させるにはどうすればいいんでしょうか? たとえば、textbox1でKeyPressが発生した時に、そのキーがエンターキーだった場合、 button1.Clickを発生させるときなどです。
>>359 button1.Click(button1,new MouseEventArgs());
こんな感じか?
クリックをエミュレートするのはPerformClickだな
>>360 上手く動かなかったのでbutton_Clickメソッドを直接呼び出してみました。
button_Click(button1,new MouseEventArgs());
一応意図したとおりに動きましたが他のクラスからだと呼び出せないと思うので常套手段ではなさそうですね…。
>>359 イベントは特定条件がそろった時に内部から発生するものだから、
その条件を無理やりそろえるためのメソッドがないものは基本的に無理
通常はイベントを発生させなくても、イベントハンドラで実行される処理と
同じ処理が実行されれば十分なはず
その例だとPerformClickでもいい
>>363 なるほどそうですか。
同じ処理をしたいだけなので、例のbutton_Clickの処理内容を別のメソッドにして、
そのメソッドを呼び出すのが自然みたいですね。
365 :
デフォルトの名無しさん :2008/03/05(水) 21:59:53
TableRow,TableCellで動的にボタンをいくつか作成して ***** 何回かループ ***** Button objButton = new Button(); objButton.ID = "Btn" + i.ToString(); objButton.Width = 50; objButton.Click += new EventHandler(Button_Click); objTableCell.Controls.Add(objButton); ***** 何回かループ ***** 縦にボタンがループの回数分並んだとして、適当に真ん中辺りのボタンを押した時、 そのボタンのIDって取得出来るの??? ちなみに"Btn" + i.ToString();で順番にボタンのIDをつけてるんだけど private void Button_Click(object sender, EventArgs e) { string 押されたボタンのID = どのようなコード?? }
ヒント: sender
367 :
デフォルトの名無しさん :2008/03/05(水) 22:09:34
senderをなにかのパラメーターとして渡すのでしょうか?? それともsender.Get…という形で使うのでしょうか?^^;
368 :
デフォルトの名無しさん :2008/03/05(水) 22:15:32
とりあえずsender.ToString();でなにが取れるか見てみたら "System.Web.UI.WebControls.Button"としか取れず、色々してみても 特定のIDを取ってくることが出来ませんでした。。
369 :
デフォルトの名無しさん :2008/03/05(水) 22:21:49
わかりました!ありがとうございます!
>>368 それはつまりsenderがButtonにキャストできるということ。
IDとButtonの関係がさっぱり見えない
>>368 的外れな話かもですが、
そのコントロールの定義?のところに書いてある、senderなんちゃらを使ってみるというのは?
質問です。
画面AからダイアログBを呼び表示させました。
ダイアログBのロードメソッドで条件を判定した結果によって、
ダイアログBを閉じたということにしたいのですが、うまくいきません。
ロード処理の中で、ダイアログのクロージングの処理を呼んだのですが、
処理が画面Aの呼び出し元に戻らず、ダイアログが表示されたままになってしまいます。
クロージングの中で使う、CancelEventArgsで何かパラメーターを渡せばよいのでしょうか?
すいません。お願いします。
ListViewのColumnHeaderコレクションエディタでColumnを追加した後、 メンバの順序を↑↓で変更しても反映されないのはバグ??
逆引き本を探しているんですが、オススメないでしょうか。 どれも似たり寄ったりでしょうか? ペイントブラシのようなものに挑戦しているので、グラフィック関係が書かれていると助かります。
>>374 いつのまにか全部入りのExpress Edition出てたのか
単品よりいいね
378 :
323 :2008/03/06(木) 09:45:15
自己解決しました。 ボタンのFlatStyleをSystemにしたら適用されるようになりました。
C#使うなって言われそうだけど、 C#でWin32ネイティブアプリ作れます?
そもそもコンパイラがネイティブコードを吐けないはず。 VC#以外のコンパイラはしらね。
だれか
>>375 を試してみてください。
ListViewのViewプロパティをDetailsにして、Columnsのコレクションをいくつか追加して、
コレクションエディタの↑↓で位置を変えても反映されません。
(DisplayIndexが変更されない?)
>>381 DisplayIndexってわかってるなら自分で直せばいいじゃん。
位置を変えたときに変わらないのは仕様なのかもしれないし。
383 :
382 :2008/03/06(木) 19:20:46
うん。やっばり仕様だと思う。 コレクションエディタの順番は単にListViewItem.SubItemsの順番で、 DisplayIndexが表示の順番なんだと思う。 で、それらは必ずしも一致せず、 ListViewItemを作る部分のコードは変えずに表示の順番を変えることも出来るようになってると。 #実は俺も前に同じように順番が変わらず悩んだことがある。 そのときは.Designer.csにDisplayIndexの指定があるのを見つけて、 なんじゃこりゃと思いつつ手作業で削除した。
MySqlで日本語をインサートしようとすると文字化けするのでSET NAMESでutfやsjisを 投げてみたのですが直らず。どうしたら良いのでしょうか?。
>>384 自己レス、接続時にcharsetを投げたら上手く行きました。
他の言語ではnamesを投げて上手く行っていたのですがc#ではだめなのですね。
そんなに投げちゃいかん
>>383 そうなのね。ありがと。
でもコレクションエディタで順番変えてOK押した一瞬だけ順番が変わってすぐに戻るのがデザイナ上で見えるからバグっぽく見える…
あるクラスを作って、そのインスタンスを複数作ったとき、 それぞれのインスタンスを区別するにはどうしたらいいのですか? たとえばこんなクラスです。 public void 猫() { string kainushi public 猫(string, ka) { this.kainushi = ka } public 好きな遊び{ get; set;} }
クラスってclassで定義するんじゃないの?
区別してどうするの?
区別しない方が難しいだろ。
そんなこと自分で考える前に基本的な文法を勉強した方が
猫[] cats = new 猫[5]; Console.WriteLine(cats[0] == cats[1]); Console.WriteLine(cats[0] == cats[2]); Console.WriteLine(cats[0] == cats[3]); Console.WriteLine(cats[0] == cats[4]); Console.WriteLine(cats[1] == cats[2]); Console.WriteLine(cats[1] == cats[3]); Console.WriteLine(cats[1] == cats[4]); Console.WriteLine(cats[2] == cats[3]); Console.WriteLine(cats[2] == cats[4]); Console.WriteLine(cats[3] == cats[4]); 全部Falseだろ。つまり区別できてる。
猫 → クラス cats[0] → インスタンス cats[1] → インスタンス cats[2] → インスタンス cats[3] → インスタンス cats[4] → インスタンス
>>393 そのまま動かしたら全部trueになっちゃうw
cats[0] → null cats[1] → null cats[2] → null cats[3] → null cats[4] → null
cats[0]がインスタンスと聞いて
ぬる猫がいると聞いて
何で配列にしようと思ったのやら
classの規定の==はそれぞれのインスタンスを区別する 中身が全く同じでもインスタンスが違えば==はfalseになる
>>387 5分くらいで適当に考えた対策だけど多分おk
全選択してDisplayIndexを 列数-1 で並び順になる (0だと逆順)
>>404 何その裏技っぽいのwすごw
でもそれでいけるね!
0指定すると逆順になるけどコレクションエディタと同期してないから同じ事だけど。
最近C#使ってみようと思ってるんですが、 C#3.0ってもうリリースしてるんでしょうか? どうせなら3.0から勉強したいなと・・・^^;
とっくの昔にリリースしとる
>>407 そうでしたか・・・アホな質問してすいません(__)
Wikipediaは見たんですが、言語仕様しか書いてなくて^^;
JavaScriptっぽいらしいですね。JavaScriptは好きなんで楽しみです。
後、C#でP2Pしたいんですがお勧めのページあるでしょうか?
ActionScript3.0がSocketが扱えて同期通信できるようになるって言ってたんですが
当分先そうなんでFlex2からC#に浮気してみようかなと・・・^ω^;
「C#」「P2P」「ページ」の関連性について。
お勧めのページといったらタウンページかMSDNしかないだろう
Wikipediaにも最新リリース: C# 3.0とはっきり書いてある。
412 :
406 :2008/03/07(金) 02:40:14
>>410 でwwwすwwwよwwwねwww
まぁ進捗Blogとか貼ってくれたら儲けもんぐらいに思ってただけなんで、
適当にググッてみますわwwww
>>411 あー・・・右上の表見落としてた・・・
まじすまそ・・・あほすぎ。
なんか覚えたての単語並べてみましたって感じ?
c#からmysqlにinsert set name=val にする時にvalをエスケープしないといけないのですが mysql側に専用のエスケープ関数などあるのでしょうか?。
それはあれだ、C#のソースコード上の文字列をエスケープする関数を探すようなものだな 例えば、文字列リテラルで \" とエスケープせずに、 " と書いて関数でエスケープしたいと
>>416 いじわる!!笑
@の他は正規表現でいちいち書き換えないとだめなのでしょうか?
意地悪ではない。処理のレイヤーが違うから無理と暗にいってる パーサが文字列リテラルを判別するためにエスケープが必要で 関数に渡されるのはパースされた文字列 当たり前すぎて確認してなかったけど、 valは文字列リテラルでエスケープというのは ' => '' とかのことだよな
>>417 そんなことより株取引がんばってください
>>418 言われて見て思ったのでちょっと試したのですがこういう事ですよね。
sqlでインサートできないから安易にエスケープと考えてしまったのですが問題は別にあると
認識し試行錯誤します。
string text = @"\a\a\a'''";
MessageBox.Show(text);
>>419 おうよ!。みずほが下がってる><
2008を使ってますが、2002年に出たC#の本を買っても問題ないでしょうか? 『C#によるプログラミングWindows』上下Charles Petzold (著)が気になっています。
せめてC#2.0(VC#2005)に対応したのにしとけ
PictureBoxに画像+αを表示したいのでPictureBoxのPaintデリゲートに指定した関数の中で 描画処理を行わせるようにしたのですが、その際にPaintEventArgs.Graphicsを利用して描画すると意図通り動くのに対して それを利用せずに関数内でPictureBox.CreateGraphics()により取得したGraphicsオブジェクトを利用して描画した場合には 他のウインドウの影に隠れた場合等に再描画が正常に行われないのですが何故なのでしょうか?
お前さんが再描画してないんだから当然 てか、そのためのPaintイベントじゃないか
>>424 どちらの場合も処理してる関数自体はPictureBox.Paintに登録しているのでクライアント領域が無効化された場合には
再描画のルーチンが実行されると思ったのですが違うのでしょうか?
クリッピングというものがあってな
ああ、そういうことか こんな感じにして何度か再描画すると面白いものがみれるよ void pictureBox1_Paint(object sender, PaintEventArgs e) { e.Graphics.Clear(Color.White); Thread.Sleep(1000); e.Graphics.Clear(Color.Gray); Thread.Sleep(1000); this.pictureBox1.CreateGraphics().Clear(Color.Blue); Thread.Sleep(1000); }
MySqlDataReader.read()って一番最後の行を読んだ時点でfalseになりません? while(MySqlDataReader.read()){ List<string>.Add(val)//これだと一番最後の行が追加されない }
System.Web.WebProxyクラスに設定した、プロキシサーバーが生存中かを 楽に確認する方法ってないでしょうか。 プロキシサーバーにpingを打って、100ms以内に応答がなけれ ば無効と判断するコードの、簡単な書きかたってないでしょうか?
Pingクラスがあるよ
>>428 サードパーティ製ライブラリについて質問するのに、ライブラリの名称もバージョンも書かないとか
どんだけ
街の仲間たちにぬっ殺されろ
>>428 read()の時点で1レコード呼ばれてるってオチだろ
434 :
デフォルトの名無しさん :2008/03/08(土) 03:04:25
C#初心者でございます。 C#もJAVAのように数学の関数などを Math.Sin(); 等とクラス名を書かなければいけないようですが クラス名を省略することは可能なのでしょうか。
using
Java には static import が付いたけど C# には似たようなものってあったっけ
using
ハッシュテーブルのことC#では何言うんだっけ?
ハッシュテーブルだろ
Hashtable Dictionary
おはようございます string[] str = (string[]) List<string>をみたいに簡単に変換する方法はないでしょうか?
ToList
じゃなかったToArray
>>443 こんな便利なものがあったのですね
ありがとうございます
>>434 いきなりSin()とか書かれても面食らうだけだからやめてくれ
446 :
デフォルトの名無しさん :2008/03/08(土) 10:58:30
お答えいただき有難うございます。
usingだと省略できますか。
別名をつけられるのはできたのですが
M.Sin()とかになってしまうのでこれでもまだすっきりしないというか。
できないならできないで仕方ありませんが。
>>445 そうですか?
数学をやるとき「数学の積分(R*数学のSIN(π + θ))」なんて
いちいち書くのは冗長ですよね・・・と思っていたのですが、
sin ,cosと来たら三角関数、というのはもはや非常識なのでしょうかね。
>>446 確かに数値計算系のプログラムではいちいちMathつけると読みにくいというのには同意。
自クラスに
static double sin(double x) { return Math.Sin(x); }
なんて定義するのはダメ?
クラス毎に定義しなきゃいけないのが面倒だが。
VBのモジュール感覚で濫用するアホが出てくるからだろ
doubleの拡張メソッドにしたら
でも確かにDelphiのwith相当のことをやりたいことはたまにあるな。
ヘジは早くプリプロセッサを追加しろよ。
with最凶
>>446 現状で最もましな方法はpartialクラスで
>>447 だと思う
てか、モドキじゃないMix-inが使えればいいのにな
ListViewの詳細をクリックするとアイテムが選択されますが、 プログラムから選択させることって出来ますか? listView1.Items[0].Selected = true; こんな感じにしてみたのですが選択はされていると思うのですが見た目上選択されたようにはなっていません。 見た目も選択されているようにするにはどうしたらいいんでしょうか?
>>454 違うと思うよ。
もっとも「マシ」な方法は、"Mathがうっとうしい"などという感覚を矯正すること。
要するにただの慣れの問題でしょ。
まあ慣れすぎて自分のクラスの静的メソッドでもクラス名つけたくなってくるのも
それはそれで難儀だとは思うけど
あとVBのWithってブロック内のインスタンスの表記を省略できるだけなんだよね。
458 :
466 :2008/03/08(土) 13:40:33
クラス名の省略はとりあえずできない、というのがわかって助かりました。 ありがとうございました。
>>455 HideSelectionがTrueのままになってて、フォーカスが他にあるってオチじゃないよね?
460 :
デフォルトの名無しさん :2008/03/08(土) 14:09:48
>>455 listview.Focus()してもだめ?
461 :
455 :2008/03/08(土) 14:15:32
listView1.Select(); で解決しました。
"続行するには何かキーを押してください . . ."ってどうやるの?
Visualstudioでクラスの名前を変更する時、 ジェネリッククラスだとファイルとクラスの名前が連動しないのは仕様ですかね?
ファイル名に<>使えない
>>464 ごめん。質問の仕方が悪かった。
僕が言いたいのは以下のようなプログラムの場合、
using System;
namespace HelloWorld
{
class Program
{
static void Main()
{
Console.WriteLine("Hello World");
}
}
}
実行すると一瞬コンソールが現れて消えてしまうんだけど「Visual Studio」とかで実行したら
"続行するには何かキーを押してください . . ."って出て終了しないよね?
それでそのようなことをするコマンドプロンプトのオプションがあるのかなあって調べたら無かったからどうやるのかなあってこと。
>>467 Console.Write("続行するには何かキーを押してください . . .");
Console.ReadKey();
>>468 レスどうもありがとう。
でもその方法は知っているんだ。
Visual Studioはいちいちそれを加えてからコンパイルして実行しているの?
違うよね。FileMonitorで監視してみたけど「Console.ReadKey();」が付加されている
exeファイルは見つけることが出来なかった。
僕は今C#用のエディタを作っているんだけどどうしても、
よく見る"続行するには何かキーを押してください . . ."が出来ない。
教えてください。よろしくお願いします。
だから、pause もしくは、コマンドプロンプトから実行すればいい
そして、そのpauseコマンドはC#で作られているわけではない。
インターフェイスの利用価値がわからないんだが、インターフェイスってよく使うもんなのか?
多分知らないうちに一番お世話になってるのはIEnumerableとIEnumerator デリゲートもインターフェイスみたいなもんだな
>>473 んじゃあ、自分でインターフェイスを作る事はそんなに無い感じなのかな?
ありがとう^
>>475 ライブラリつくるときとか
プラグインぽいのつくるときとか
>>476 じゃあ俺にはまだ必要ないな
ありがと^
>>467 に便乗だけど、
Visual C#でコンソールアプリケーションを作成してデバグするときに
ウィンドウが消えないように、Visual C#のオプション設定でできないの?
(
>>468 のようにソースはいじらないで。)
#if DEBUG
(
>>468 )
#endif
でいいだろもう
他の方法ではなく、できるかできないかを聞いている。
>>480 オプションではできないんじゃね?
ってか回答者は機械じゃねぇぞ。
できないならできないと答えろ。
できますん。
そんなきき方じゃできたとしても誰も教えないってなるだけじゃね?
答えられる奴が答えればいい。
>>478 に回答できる奴いないの?
できるよ。やりかたは自分で探してね☆
できるかできないかでいえばできるな。
>>486 おk。
【結論】
Visual C#でコンソールアプリケーションを作成してデバグするときに
ウィンドウが消えないように、Visual C#のオプション設定できる。
以上。
POST送信をデバッグするよい方法ってないですかね? いまのとこ、HttpWebResponseの結果をテキストにしてるのですが、 これじゃPOSTに成功したのかどうかさっぱり・・・。 IEに簡単に表示とか出来ないものでしょうか?
出来ない。
Wiresharkでも眺めてろよとかそーゆーの駄目?
>491 申し訳ない、プロトコルレベルでの通信は成功してます。 チェックしたいのは、掲示板に書き込んだときあとの、 「名前を入力してください」 とかの類です。POSTの送信データが抜けなく遅れてるのかをチェックしたいのです。
正常に送られてるか検証するためには送らないことが必要である
そこはTCPの保証範囲でないの。
ウインドウが消えないようにするには、returnのところでF9を押す
returnのところって何?
Mainメソッドのreturnかなんか
ああ、そういうことね。thx
カラムがクリックされた時にどのカラムがクリックされたのか取得したいのですがどうすればいいんでしょうか? 選択されたカラムの名前が取得できるといいのですが…。
カラムって何?
502 :
499 :2008/03/09(日) 01:27:52
ColumnClickイベントで、e.Column.ToString()でとりあえず番号は取得できますが、 columnHeaderの名前自体は取得できないのですかね…?
インデックスが手に入ってるんだからどうでもなるだろ
例えばどうするんだよ
listView1.Columns[index].Name; こんなことも重いつかんのならプログラミングやめたほうがいい。 向いてないから。
listView.Columns[e.Column]
>>505 index??
それ動きませんよ。
>>507 カラムの名前じゃなくて、カラムのメンバ名を取得したいのです…。
メンバ名とやらを手に入れる意味は無いから安心しろ
511 :
505 :2008/03/09(日) 02:30:47
>>508 string name = listView1.Columns[e.Column].Text;
お前の欲しいものはこれか?
最初っからTextって言えよ馬鹿。
本当に向いてないからやめておけ。
そして二度とくるな。
512 :
499 :2008/03/09(日) 02:32:42
インデックス番号だけしか取得できないとカラムが動的に追加・削除されたら困ると思うのですが…。 メンバ名を取得する方法はないってことですかね??
>>511 さっきから釣りですか?
向いてないんじゃないですか?w
>>512 メンバ名ってprivate ColumnHeader hoge; の hoge だろ?
動的に追加削除したらメンバ名も何も無いじゃん
>>512 >インデックス番号だけしか取得できないとカラムが動的に追加・削除されたら困ると思うのですが…。
困りません。
>メンバ名を取得する方法はないってことですかね??
日本語でおk
死ね
>>505 =
>>511 はチンコ剥いてプログラミングやめて2chもやめた方がいい。
人生だけはやめなくていいから。
>>515-516 動的に追加・削除してインデックスがかぶってしまったら困ると思うのですが…。
例えばインデックス1を削除したあとに、新しく追加したカラムもインデックス1にしたら区別がつかなくなると思うのですが。
>>519 削除したんならもうインデックス存在しないじゃん
>>521 削除した方はもうないから新しい方と区別つかないじゃん。
インデックスがわかればカラムのインスタンスそのものを取得できるのに、それ以上何を望む?
>>523 まあそうですよね。
冗長でもインデックスとは別に取得出来るんじゃないかと思ってしまってました。
ありがとうございました。
>>512 >>519 で区別できなくて困るのってどんな場合だろ
気になってしょうがないから、思いついた人おせーて
ちょっと待て終わらせんなw インスタンスそのものがわかってもインスタンス名が分からないと困る事あるだろ。
インスタンス名ってなに?
変数のことかな?
カラムを動的に追加するときにNameプロパティをちゃんと設定しておけばOK。
例えばあるカラムがstringで数字を表示している時にそのカラムを数値として扱いたくなった時など。 その列以外は数字でもstringで扱いたいのに、その列だけは数値として扱いたい。 そして動的に追加・削除されるものだとしたらインデックスよりインスタンス名が欲しいでしょ?
で、インスタンス名ってなに?
>>529 Nameプロパティが取得できないからこういう流れになってるんだろ
スクリプト脳の弊害ってホント恐ろしいな。 で、インスタンス名って何。
スクリプト脳って?
池沼はスルーしろよ
出た、スルーw
>>525 クリックされた列がある特定のデータ群だった時にだけ処理をしたい場合
「クリックされた列がある特定のデータ群」ってなに?
もう相手すんなよ
名前なんて不安定な要素で判定しないなぁ
出た、もう相手すんなよw
ただの荒らしじゃねえか
A B 1 1 AとBの列があったとして、Aの列(1)にだけ特定の処理をしたい場合困るんじゃね?
何が困るのか全く分からない。
break;
548 :
545 :2008/03/09(日) 04:20:31
>>546 俺に聞いてる?
じゃあ逆にAの列をどうやって特定する?
削除される可能性もあるからインデックスからは特定できないよ。
Aの名前も削除された後に追加されるかもしれないから名前でも特定できない。
List<ColumnHeader>で管理するなりNumberColumnHeaderクラス作るなりどーとでも。
>>548 ColumnClickアクションを拾って、e.Columnでインデックスが取れるよね。
で、アプリはどのカラムが何を意味してるか知ってるはずだよね?
知らないとしたら、それってどういう状況なの??
ListViewからカラムを削除するのはアプリ。 ListViewにカラムを追加するのはアプリ。 何番目のカラムに何を格納するかを決めるのもアプリ。 インデックスが分かればカラムを特定できる。 カラムを特定できればあとはアプリが自由に操作できる。 何が困るのか全く分からない。
>>548 Tag
単純な処理ならint,enumを入れておいてその値で処遇を決めるとか、
ソートするだけならtype(比較可能)を入れておいてキャスト時に使うというのも
複雑な処理をしたければ
>>549-551
>>548 削除された列のクリックイベントってどこから発生するの?
動的に追加削除されるカラムの中の特定のカラムに対して特定の処理をしたいってんなら、
そもそもクリックイベントでインデックスを取るまでもなく、そのカラムの変数名でアクセスすればいいだけ。
というよりも、削除されているであろうカラムのインデックスをクリックイベントで取る意味が分からん。
流れ分かってる?発端は
>>499 だよ
タブコントロールでタブを下に配置した時にFlatButtonsにする方法はないのでしょうか?
混乱させる忍術の稽古はよそでやれ
556 :
デフォルトの名無しさん :2008/03/09(日) 13:10:38
??columnのインスタンス名(??)の話の流れが全く読めないんだが あるインスタンスを格納する変数名を取りたいってことか?? 変数名なんて単なる箱なんだからスコープ違えば役に立たないと おもうんだけど…それとは違うの?
釣りなのか思い込み野郎なのかは知らないけど、気にするな
>>550-551 こういう場合はを想定ごらん。
例えばボタン1を押したらカラム追加、ボタン2を押したらカラム削除するとして、
プログラム上ははじめから配置されているある特定のひとつのカラムだけに操作する必要がある場合。
勿論削除されたら操作しないし、内容も他のカラムと見た目上判断できない。
まあ削除するときに特定のカラムかどうかを判定すればいいんだけど、
>>550-551 は状況を想定できないようなので言ってみた。
>>559 カラムクリックイベントからインデックスを取るという状況の話をしているのに、
なんでボタンのクリックイベントで特定のカラムを操作する話になってんの?
もともとそんな状況の話なんかしてないんだからそんな想定は無意味だ。
>>561 なんでインデックスを取る話になるの?
インデックスじゃ区別つかないからインデックス以外の方法はないかって話題だろ?
>>562 如何様に出来てもインデックス以外の要素で一発で判断できるメンバがあれば楽って話だろ。
例えばエクスプローラでよくあるカラム上の▲▼マークだってオーナードロー駆使すれば如何様にも出来るけど
デザイナ上で一発で出来れば楽だろ。
それと同じ。
>>561 それと、カラムクリックイベントからそのカラムを操作するのと
ボタンクリックから特定のカラムを操作するのとでは条件同じだろ。
どっちにしろ指定されたカラムが”ある特定のカラムか”判断する術はインデックスからは無理って話なんだけど理解できる?
if (numberColumn == listView1.Columns[e.Column]) { .... } なにが無理なの?
お触り禁止
つまんないこというなよ
>>564 >ボタンクリックから特定のカラムを操作するのとでは条件同じだろ。
イベント引数の中身が全然違う。ゆえに条件は同じとは言えない。
>どっちにしろ指定されたカラムが”ある特定のカラムか”判断する術はインデックスからは無理って話なんだけど理解できる?
何言ってんの?
"ある特定のカラム"というからにはそのカラムオブジェクトとインデックスから導かれたカラムの参照が
同じかどうか判定すればいいじゃん。お前もしかして"その特定のカラム"のインスタンスが分からないと
参照が同じかどうか判定できないとでも言いたいわけ?
比べる対象なんだからそんなもの分かっている前提に決まってるだろ。
お前が
>>559 で言っている状況の話を理解できないわけないだろうが。
>>559 の内容がこの話の流れと全く違っていると言ってるのよ。
この話の発端となった
>>499 を百回声に出して読むんだな。
お前以外のやつは
>>449 のアホな質問に対する答えについてどうこう話しているはずだ。
お前だけ流れが読めてない。
まあ元の質問を置いてきぼりにして話が膨らむのはよくあること。
元の内容自体は
>>499 が(もう少しマクロな視点で)目的を言うか、
誰かが質問するかすれば、すぐにでも解決できそうなものなのにな
571 :
499 :2008/03/09(日) 19:43:02
まーまー^^
>>568 そのカラムオブジェクトとインデックスから導かれたカラムの参照が同じかどうか判定
ってどうすればいいの?
必死すぎるやつがいるな
そんなことよりGridLineをスクロールした時のバグは直ってないのか
エクスプローラでドライブにメディアが入っていないときに表示される 「DVD-RAM ドライブ」 といった文字列を取得する方法は、 .NETのライブラリには用意されていないのでしょうか? IShellFolder::GetDisplayNameOfを呼び出すよりも楽に取得する方法はありますか?
ない。シェルをラップしたライブラリでも作れば商売になりそうな気がする。
これをスマートに書くとどうなりますか? private string GetSpecialFolder(string name) { Environment.SpecialFolder esf = new Environment.SpecialFolder(); if (name == "Desktop") { esf = Environment.SpecialFolder.Desktop; } else if (name == "MyDocuments") { esf = Environment.SpecialFolder.MyDocuments; } return Environment.GetFolderPath(esf) + @"\"; }
>>578 Desktop,MyDocumentsをそこらじゅうで使うなら
class Desktop
class MyDocumentsと作って使うメソッドを定義
そこらじゅうで使わないならメソッド自体いらないと思う
>>578 private string GetSpecialFolder(string name)
{
return (Environment.SpecialFolder)TypeDescriptor.GetConverter(typeof(Environment.SpecialFolder)).ConvertFromString(name);
}
GetFolderPath忘れてた。 private string GetSpecialFolder(string name) { return Environment.GetFolderPath((Environment.SpecialFolder)TypeDescriptor.GetConverter(typeof(Environment.SpecialFolder)).ConvertFromString(name)) + @"\"; }
>>579-581 ありがとうございます。
ループの中で使うだけなのでソース上で多用するわけではないので短くある必要は
ないのですが色々と勉強になります。
特にこんなものがあるなんて!。
TypeDescriptor.GetConverter(typeof(Environment.SpecialFolder)).ConvertFromString(name))
何その裏技w
スレ違いなのですがZIP32J.DLLで進行状況のウインドウを出さないようにするコマンドって何かわかりませんか? HP巡回しても行き着かない・・・
物凄く初心者な疑問でごめんなさい。 メモリリークってアプリケーションを終了させてもメモリが開放されない状態を言うんですよね? ガベージコレクタはそうならないように解放してくれるんですよね? だとしたらOSにガベージコレクタを実装すればメモリリークなんてなくなるんじゃないでしょうか???
プロセスが終了したら、そのプロセスが確保したメモリは全てOSが没収して別のプロセスが使えるようにする。 メモリリークってのは、プロセスが動いている間に不要になったメモリをOSに返還し忘れて、溜まっていく状態。
>メモリリークってアプリケーションを終了させてもメモリが開放されない状態を言うんですよね? それもメモリリークに入りますが、C#スレとしてはその定義は間違っています。 >ガベージコレクタはそうならないように解放してくれるんですよね? 違います。 >OSにガベージコレクタを実装すればメモリリークなんてなくなるんじゃないでしょうか??? そうかもしてませんが、現実的ではありません。
C++なんかのガベージコレクタがない言語なんかは解放しないとプロセス終了後も残ってるよ。
配列じゃなくてもいいのですが・・・。 2つの配列があってその配列には1〜9の数字が記録されています。 そこから、1〜9の数字のうち両方で使われていない数字を抽出したいと思います。 たとえば、 A が 1,2,3,4 B が 3,4,5,6 だったら、 C 7,8,9 という答えを得たいです。 配列でもコレクションでもかまわないのですが、 そういう比較を簡単にできる方法はないでしょうか? 現在は配列をforで回して比較しています。
var Universe = Enumerable.Range(1, 9); int[] A = { 1, 2, 3, 4 }, B = { 3, 4, 5, 6 }; var C = Universe.Except(A).Except(B);
592 :
590 :2008/03/11(火) 05:36:03
>>591 ありがとうございます。
LINQはなんとなく避けていたのですが、そろそろ本腰を入れて勉強しないといけないみたいですね。
LINQは怖くないよ
どこにLINQが出てきたの?
Universe.Except(A).Except(B)はLINQのメソッド構文
LINQのメソッド構文というかただの拡張メソッドだよな 拡張メソッドがLINQの本体 ごくまれにクエリ式を使った方がシンプルに書けることがあるけど 普通は拡張メソッドを使った方が早いし見やすいし楽だ
拡張メソッドで書いてもクエリ式で書いてもLINQだよ クエリを書けるようにする技術を総称してそう呼ぶだけで 別にC#にLINQっていう機能が付いてるわけじゃない
それが本当ならCでexit前のfree論争なんて起きるわけがない。 それどころか、WindowsもUnixもファイルハンドルとかの OSに属するプロセス単位の資源はみんなプロセス終了時に片付けるぞ。
「OSに属するプロセス単位の資源」でないものが時々問題になるわけだ。 OSの資源管理がタコだったりバグってたりするとその限りじゃなくなるわけだが。
なるほど
>>589 それは OS による。
>>596 LINQ =
標準クエリ演算子(こういう(拡張)メソッドを用意しときなさいっていう規約)
+ クエリ式構文(C# / VB の言語拡張)
アプリ終了時にメモリが解放されない場合はOSのバグであってプログラマに責任無しってことですか?
マネージドな世界に限ればyes
本当かよそれw だとしたら「プロセス」ってそもそも何よw
Windowsはプロセスが終了したら勝手に解放してくれてる。 COMとかの細かいことはよく知らない。
アプリが終了しても、関連するプロセスが全て終了しているとは限らないのだ。 COMで起動したexcel.exeを終了してなくて、いつの間にか数十ものプロセスがメモリを占有してる、 という事例に出くわしたことがある。
アウトプロセスサーバなんて糞喰らえ
それは別の話だよ staticイベントにイベントハンドラを追加したまま放置すると 呼び出しターゲットのオブジェクトがGCの対象外になってメモリリークする
9xはシステムリソース残り何%って、心配したなあ。 プログラムを起動すると減り、終了すると戻るが プログラムによっては元の値まで戻らないと当時聞いていた。 これがリークしたからなんだろうなと今だから思える。
String.Splitのオーバーロードを見てみると引数はChar[]かString[]でなければならない みたいなんだけど、実際は string str = "Hoge\tFuga\tFugo"; string[] val1 = str.Split('\t'); string[] val2 = str.Split(new char[]{ '\t' }); どちらも問題なくコンパイル及び実行が通ってしまうのだけどなんで? また、どっちでも良いとなればみんなはどっちの書き方してる? new char[]{ '\t' }を渡してやった方が良さそうかなとは思うんだけど、 str.Split('\t');と書く方がスマートにも見えてしまう。 まあどうでもいいことだと言われたらそれまでなんだが、どうも気になってしまう。
params
params char[]だと可変個の引数が許される str.Split('a','b','c',...)でもいいし 配列を入れてもいい
staticメソッドとそうでないメソッドはどう使い分けるものなのでしょうか? public class Hoge{ public int AddOne(int val) { return val + 1; } } のような引数の値を処理して返すだけのメソッドの場合は staticにするのが普通なのでしょうか?
>>616 なるほど。今までparamsの意味が分からなかったけどそういうことだったのね。
勉強になりました。サンクス。
monthCalendarで方向キーで日付を移動しても選択したことにならないので 強制的にDateChangedイベントで monthCalendar1_DateSelected(monthCalendar1, new DateRangeEventArgs(monthCalendar1.SelectionStart, monthCalendar1.SelectionEnd)); のようにDateSelectedを呼び出しました。 期待通りに、方向キーでの移動でもDateSelectedを呼び出せましたが、 方向キーで移動後にマウスで他の日付をクリックすると範囲選択になってしまいます。 期待する動作はドラッグ以外で範囲選択してほしくないのですが、上記の方法自体が間違っている(常套ではない)のでしょうか? 個人的には強制的にイベントを呼び出すのは良くないと思うのですが他に方法が思いつきません。
620 :
619 :2008/03/12(水) 03:27:22
問題提起箇所が複雑になってましたので整理させていただきます。
まず、方向キー入力後にマウスで日付をクリックすると範囲指定になるのはもともと仕様のようなので今回は質問から外します。
monthCalendar1_DateSelected(monthCalendar1, new DateRangeEventArgs(monthCalendar1.SelectionStart, monthCalendar1.SelectionEnd));
という強制的にイベントを呼び出す方法は正しいのでしょうか?という質問に絞らせてください。
過去ログを読んでみると
>>363 のような書き込みがあるのですが、
PerformClickのようなイベントをシミュレートするようなメソッドがどのイベントにも確実にあるのでしょうか?
619に書いてあるような「壮大な勘違い」をするのはOOPとイベンドドリブンの意味が 全然わかってないから。 遠回りでもまずOOPを理解することを考えた方がいいんじゃないの? 「イベントを呼び出す」、なんて普通に書いてるけど、 揚げ足取りじゃなくて意味不明だよ。 まあ初心者にはありがちな「勘違い」の類ではあるけど。
Guidやstringの場合は、まだ設定されていないという状態を 初期化のときに、Guid.Emptyなどを設定することによって 扱っているんですが、DateTimeのときはどうしたら良いのでしょうか? DateTime.Emptyは無いですし‥‥ DateTime.MinValueを使っても良いもんでしょうか?
DateTime?
>>617 基本的にはそんな感じ。
double X = 3.14159265;
string str = X.ToString("F3"); //インスタンスメソッド
double newX = double.Parse(str); //staticメソッド
クラスのインスタンスにより異なる動作をさせたければインスタンスメソッドにする。
double.Parseメソッドがインスタンスメソッドだったらちょっと変でしょ?
>>622 623も書いているけどnull許容型。
>>619 OOPっていうかイベントはそんなに単純じゃないよ
君がやってるのはイベントハンドラ用のメソッドを呼び出してるだけ
別に問題ないけどイベントハンドラに直接処理を書かずに他のメソッドを作って
それをそれぞれのイベントハンドラから呼び出すようにした方が綺麗
>>623 >>625 DateTimeってstructで値型だから、nullにはならないのではないでしょうか?
null にならないから Nullable でラップするんだお
int?とか書くとintまたはnullな型が出来る DateTime?でnullになるDateTimeが出来る 値型じゃなくてclassだけど
nullableは値が与えられているかどうかのフラグと値をもった値型だよ ==nullで比較できるのは構文糖衣
633 :
627 :2008/03/12(水) 11:09:15
皆さんどうも有り難うございます。 nullableって、関数の引数でnullを許容するための構文だと思っていて、 何にでも使えるとは知りませんでした‥‥。びっくり。 どうも有り難うございました。
ツールボックスを右クリック→アイテムの選択→MainMenu お勧めしない
>>635 そのサンプルはMenuStripじゃなくてMainMenuなんじゃね?
知らんけど。
MenuStripならToolStripSystemRenderer継承したクラス作って
好きなように描画するようにしたらいい
VisualStyleを切ればいいよ
>>636 ありがとうございました。
希望の動作を実現することが出来ました。
ところで、どうしてお勧めできないのですか?
>>638 menuStripにVisualStyleというプロパティはありませんでした。
MenuStripに取って代わられたから Obsolete来ても知らないよ
拡張メソッドについての質問なんですが、 class Test { static int GetDigit(this int num) { return (int)Math.Log(num, 10) + 1; } } という拡張メソッドがあったとき、C#3.0からはインスタンスメソッドとして使えますが、ライブラリにしてC#2.0から使うときは インスタンスメソッドとして使えるのでしょうか?それとも、Testクラスのstaticメソッドとして使うことになるのでしょうか?
当然後者
643 :
デフォルトの名無しさん :2008/03/12(水) 15:23:22
あるフォルダにあるファイルの一覧を取得した後に、 そのリストからワイルドカードで検索するにはどうしたら良いのでしょうか。 string[] fileListText = Directory.GetFiles(@"C:\Hoge\", "*.txt"); と同じことを、 string[] fileListAll = Directory.GetFiles(@"C:\Hoge\", "*"); とした後に、fileListAll の中から "*.txt" のファイル名のみ抽出して fileListTex を作成したいのです。
fileListText = fileListAll.Where(s => Path.GetExtension(s.ToLower()) == ".txt").ToArray();
string[] fileListText = Array.FindAll(fileListAll, item => System.IO.Path.GetExtension(item).ToLower() == ".txt"); でも良い
646 :
619 :2008/03/12(水) 16:37:49
>>621 はい、多分そうじゃないかと思ったのでヒントを頂きたく質問しました。
>>626 なるほど。
それだとごく簡単に共通の事が出来ますね。
PerformClickのようなものがあるので他のイベントにも同じような呼び出しでいいのかと思いました。
とすると共通の処理がないときでもイベントハンドラに直接処理を書くのは良くないのですか?
それとも共通の処理が必要になった時にメソッドを分ければいいのでしょうか??
>>646 >とすると共通の処理がないときでもイベントハンドラに直接処理を書くのは良くないのですか?
いいえ。直接処理を書いて問題ないです。
>それとも共通の処理が必要になった時にメソッドを分ければいいのでしょうか??
メソッドを外に書いてそれを呼び出す方がスマートになる場合もあるし、
わざわざそんなことせんでも良い場合もある。そんなに気にしなくていいよ。
俺なんかはbutton1_Click(null, null)なんかで呼び出したりするのは別に汚いともなんとも思わんし。
if(result==false)と書くか、if(!result)と書くかみたいなもんで、ただの趣味の問題。
気にするだけ無駄だと思う。
さすがにbutton2のイベントハンドラからbutton1_Clickを呼び出すのはちょっと…
649 :
647 :2008/03/12(水) 17:45:59
>>648 それも趣味の問題だと俺は思うぞ。
例えば、
void button2_Click(object sender, EventArgs e)
{ button1_Click(null, null); }
void button1_Click(object sender, EventArgs e)
{ /*処理*/ }
こういうように書くより、
void button2_Click(object sender, EventArgs e)
{ SampleMethod(); }
void button1_Click(object sender, EventArgs e)
{ SampleMethod(); }
void SampleMethod()
{ /*処理*/ }
こう書くべきってことを言いたいんだと思うが、
後者の書き方でもまだ汚いと思うやつ(例えば俺)もいるってことだ。
次に俺の書き方を示す。
俺だったらこう書く。 public Form1() { InitializeComponent(); //イベント button1.Click += new EventHandler(Button1or2_Click); button2.Click += new EventHandler(Button1or2_Click); } void Button1or2_Click(object sender, EventArgs e) { //処理 } つまり、処理を行うメソッドを外部に記述しても、それを呼び出すためだけのメソッドを記述している時点で 無駄があると感じる人間もいるんだわ。 処理を行うメソッドを直接イベントに紐付けて、デリゲートがメソッドを直接呼び出す方がスマートに感じるということ。 当然反論もあるかもしれん。イベント引数を扱いたいときなどはこの方法ではまずい場合もあり得る。 要するに俺が言いたいことは、最初から言っているとおり趣味の問題だってこと。 自分が綺麗で可読性があると思えるいうコードを書けばいいじゃんって言うだけの話。 コードはこう書くべきなんて他人がどうこう言うもんじゃない。
652 :
647 :2008/03/12(水) 18:25:17
>>651 ちなみに、強制的にイベントを発生させるということを厳密に行いたいのであれば、
monthCalendarを継承したカスタムクラスで、イベントデリゲートを呼び出してくれるようなメソッドを公開する。
public PerformDataSelected(object sender, DateRangeEventArgs e){
if(this.DataSelected != null)
this.DataSelected(sender, e);
}
ほんで外からそのメソッドを呼び出せばいい...と思う。
もしかしたら俺が何か勘違いしてるかもしれん。
興味あったら試してみて。
>>655 OnDataSelectedを呼ぶべき
最初は動けば良いのではないかと、そういうものは楽しさの中から築きあげて行けば良いし。
658 :
655 :2008/03/12(水) 18:41:32
さっそくミス発見。 public void PerformDataSelected(object sender, DateRangeEventArgs e){ if(this.DataSelected != null) this.DataSelected(sender, e); } voidが抜けてたわ
659 :
655 :2008/03/12(水) 18:42:43
>>656 ほうほう。
実はmouthCalendarというものを使ったことがないもんでなw
勉強になりますw
>>651 だそうです。
MonthCalendarとか関係なくイベントはクラス外から直接呼べない だから派生クラスから呼び出す手段としてOn**メソッドを用意する
>>650 趣味の問題、か。
議論の余地なく間違ってると思うよ。
こういう人は「抽象化」の意味と意義がわかってないんじゃないの。
「状況に応じて適切に判断」かな 好みじゃなくて使い分けるもの
663 :
655 :2008/03/12(水) 19:08:09
>>660 あらま、やはり勘違いしてたみたいね。
派生クラスからでもイベントは呼べないのか。
失礼しました。
>>655 はスルーして下され。
そもそもイベントって「呼ぶ」ものじゃないでしょw 英語だとInvokeとかRaiseだから「起こす」とでも言うのが正解じゃないの?
666 :
643 :2008/03/12(水) 19:34:45
>>644 >>645 そのままでは "=>" が上手く行かなかったのですが、
string[] fileListText = Array.FindAll(
fileListAll,
delegate (string item) { return ( System.IO.Path.GetExtension(item).ToLower() == ".txt" ); }
);
でいけました。
ありがとうございました。
匿名メソッドほんとに冗長だな 設計時から経過措置として認識されてて,後で捨てても影響が出ないように 明示的すぎる書き方になってるのかな
>>665 ええっと、反論ってのは具体例を挙げて行うものなんでしょうか?
それとも理由を添えろって言いたいの?
まあいいやまず
>>661 で言いたかったことをはっきりしておくと、要するに
>>649 の前者のコードは議論の余地なく×で、これは趣味の問題なんかではないということ。
後者のコードは普通は△だが、確かにこのように書いた方がわかりやすい場合も
稀にあるかもしれないことは認める。
通常は
>>650 の書き方を選択すべき。
>>649 の前者がダメなのは、
(1) button1_Click()が羊頭狗肉になってる。
(2) だからbutton2_Click()の処理内容が把握しづらい。
>>668 シグネチャが違うイベントの場合を示せよ。
だから,好みの問題じゃないってことだろ 判断基準は人それぞれとしても,場合によって適切に使い分けるもの
なんだよ示せよって偉そうにw
なんでこういう日本語も満足に使えないたわけってのは例外なく口調が偉そうなのかね。
シグネチャが違うってどういうこと?
>>668 に「通常は」と書いたつもりだけど。
EventHandler<T>と違うシグネチャのイベントを扱うのって通常かな。
>>655 >>663 OnDateSelected使えって指摘は既出の通りで、
引数として渡すイベントソース・データを外部から取るのはだめ
ソースはthis固定、データはコンストラクタの引数だけ外部から取って自前で生成
その例だとこんな感じ
public PerformDateSelected(DateTime start, DateTime end) {
OnDateSelected(this, new DateRangeEventArgs(start,end));
}
>>670 >判断基準は人それぞれとしても,場合によって適切に使い分けるもの
それこそが、まさしく好みとか趣味という言葉の指し示すものである。
674 :
655 :2008/03/12(水) 23:08:50
>>671 普通にあるでしょ。
例えばbutton1が押された時と、textbox1上でエンターキーが押された時に同じ処理をしたい時とか。
この場合は
private void button1_Click(object sender, EventArgs e)
{foo();}
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{foo;}
}
のように
>>649 の後者の書き方になるんじゃない?
あほ
ばか
分布図
delegate int Hoge(); Hoge hoge; hoge += foo1; hoge += foo2; hoge(); とするとfoo1, foo2と呼ばれfoo2の返り値だけが返りますが hogeに登録されているものを個々に呼び出し それらの返り値を得たいのですが、どうやるのでしょうか?
>>679 GetInvocationListでDelegate[]を取得するとか。
>>679 素直にrefまたはoutで渡せばいいじゃん。
>>680 thx
Delegateクラスのメンバ一覧見てたのに全然気が付かなかった・・・
属性の書き方なんですが、下記の2つに違いはあるのでしょうか? [Description("ほげほげ"), DefaultValue(false)] public bool HogeHoge {〜} [Description("ほげほげ")] [DefaultValue(false)] public bool HogeHoge {〜}
ない
Hoge hoge = new Hoge(); // 1 hoge = new Hoge(); // 2 hoge = new Hoge(); // 3 hoge = new Hoge(); // 4 hoge = new Hoge(); // 5 とやったときに1~4までのインスタンス解放を気にする必要が無いってのが ガーベジコレクト機能を持つ言語の利点という理解でよろしいでしょうか?
YES
688 :
685 :2008/03/14(金) 01:53:09
なんからのネイティブリソースを確保してたらアウトだけどね
private void Performed(object sender, EventArgs e) { 処理; } でいいじゃない。 やらないけど。
あほ
なんであほなのか詳しく
テキストを画像に変換したいのですが、 どのように処理したらいいでしょうか? また、変換後の画像の大きさ(高さ・幅)は取得できるでしょうか? 低レベルですみませんがよろしくお願い致します。
694 :
デフォルトの名無しさん :2008/03/14(金) 09:06:28
>>693 > テキストを画像に変換したいのですが、
意味がわからん
GDI+
>>694 例えば「abcde」と入力したら、
abcdeと書かれた画像を生成することです
System.Drawing
>>697 ありがとうございます
生成後のBitmapのサイズは取得できますか?
お前には無理。
>>698 TextRendere.MeasureTextとかで。
>>700 ありがとうございます!
本当に助かりました!
702 :
デフォルトの名無しさん :2008/03/14(金) 10:14:34
704 :
デフォルトの名無しさん :2008/03/14(金) 10:27:37
>>702 ただの釣り
開くとビルゲイツの若かりしころの写真が出てくるだけ
ウィルスバスター2008役にたたねぇorz
これって何? ググってみたらan.to/?で始まるのがあちこちに張りまくられてるみたいだけど。
>>704 写真が出てくるだけじゃないんだが、
telnetつかってごにょごにょっしようとする。
>>706 「これ」が何を指しているのか分かりかねるが、
URLのことなら書いてる通りの転送サービスじゃないのか
内容のことなら見てないので知らない
ProcessStartInfoのArgumentsにスペースを含むファイルを指定しようとしましたが出来ません...
""で囲め
どうもありがとうございました。
GDI+で放射状にグラデーションをかける方法はありますか? WPFのRadialGradientBrushみたいなことがしたいのですが
713 :
712 :2008/03/14(金) 12:28:37
自己解決 using (GraphicsPath path = new GraphicsPath()) { path.AddEllipse(0, 0, width, height); using (PathGradientBrush brush = new PathGradientBrush(path)) { brush.CenterColor = Color.White; brush.SurroundColors = new Color[] { Color.Red }; g.FillEllipse(brush, 0, 0, width, height); } }
たびたびの質問申し訳ありません。 SendKeysでスペースキーを送信したいのですがどのようにすればよいのでしょうか。 よろしくお願いします。
>>714 半角スペースをSendすればいい予感がしました
>>715 10回連続で送信したく思い、
SendKeys.SendWait("{ 10}");
のそうにやってみたわけですが出来ないのでここに書き込みました。
>>716 10回forを回すとか10個の半角スペースをSendすればいい予感がしました
>>717 それ以外に方法が無いのならばそれでしますが...
それ以外に方法がないんだが。
どうもありがとうございました。
このスレの流れを見てるとなんか面白い
722 :
sage :2008/03/15(土) 00:46:41
くだらない質問ですが、ゲームをつくりたいとおもって とりあえずC#でゲームをつくりたいとおもうのですが、 どのようにして習得(勉強)したほうがよいのでしょうか? ネットでしらべるとC#の手引きのようなものがのってますが、 そういうものでいいのでしょうか? おしえてください。
725 :
722 :2008/03/15(土) 01:56:50
>>724 わかりました。とりあえずそこで勉強してみます。
一応参考までに聞きたいのですが皆さんはどうやってC#を習得したのですか?
できればおしえてください
すいません質問です。 現在forが入れ子で4段になっているのですが、 一番内側の場所から一気に1段目や2段目のforまでbreakするにはどうすればいいのでしょうか?
goto
あー!! 忘れてました、そうですね。C#には普通にありましたねgoto
>>725 C# 入門 でググレ。
俺はそのサイトと@ITとMSDNとぐぐる大先生だけで独学で習得したぞ。
細かいところとかは.NET関連の質問スレとかをROMったりしても勉強になった。
本なんぞ別に買わんでもネットで十分OOPはマスターできる。
本買うよりネットで勉強したほうが効率いいですか?
ネットの長所・短所、書籍の長所・短所がわかってればおのずと答えは出るよね
一度は本を通して読んだ方が近道だと思うが
まあどっちにしても、C#とかオブジェクト指向とかの知識はどうにでもなるだろ。 どんなゲームを作りたいのかにもよるんだろうけど、 その先に「画面の描画」って大きなハードルがある気がするなあ。
string.Format()で、文字列をn桁の左寄せで表示するにはどうすればいいでしょうか? printf("%10s %s",first, second); と同じようなことをしたいのです。 例えば、 aaa xxxxx bbbbb yyyy cc zzzzzzzzzzz のような文字列を表示するときに、 左の項目を最低10文字分とるようにしたいのです よろしくお願い致します。
PadLeft
>>735 string.Format("{0,-10} {1}", first, second)
>>737 ありがとうございます
カンマで区切るのですか
MSDNにも載ってないので助かりました
740 :
デフォルトの名無しさん :2008/03/15(土) 09:43:25
複数のwavを繋げて1つにするプログラムを作りたいのですが、どうすればいいでしょうか? 何かライブラリDLLはあるでしょうか?よろしくお願いします。
class TreeEx : TreeView { public TreeEx() { this.Nodes.Add("ほげ"); } } こんなクラスをフォームに貼り付けて実行してみたら "ほげ"というルートノードが2つ作られました。 おかしいと思ってInitializeComponent()を見てみたら "ほげ"ノードを追加する処理が生成されてました。 勝手に追加されると困るのですが、これを止めることってできないんですか?
>>741 デザイナが自動生成しないようにするやり方はわからないけど、
とりあえずDesignModeなら追加しないってやれば回避できると思う。
デザイナで見れなくなるけど。
あと、試してないし出来るかどうかもわかんないけど、 Nodesプロパティをoverrideして、[Browsable(false)]つけてみるとか。
ShouldSerializeなんたらだったかのメソッド書いたらいいんじゃね?
>>742-744 Browsable属性ではできなかったので
public bool ShouldSerializeNodes() { return false; }
public new TreeNodeCollection Nodes { get { return base.Nodes; } }
を書いたら望み通りになりました。
高機能なのはいいんだけどいろいろメンドクサイデスネ
747 :
745 :2008/03/15(土) 12:09:07
'4' の InvalidArgument=Value は 'index' に対して有効ではありません。 パラメータ名: index だからインデックスではなくてそのlistviewitemのsubtime[4]が見つからないのですね。 でも、何で動いたり動かなかったりするのでしょう?。
引数に渡ってきた値ぐらい確認しろよ
749 :
745 :2008/03/15(土) 12:25:57
サブアイテムは20以上あるのですが何故動いたり動かなかったりするのかわかりません。 IComparer.Compare(object x, object y)のオブジェクトは何処から来ているのでしょうか?。 e.Column から __column にインデックスが入ってそれを基準にオブジェクトが返ってきて いるのだと思うのですがIComparer.Compareの内容はどうやったら見れますか?。
750 :
745 :2008/03/15(土) 12:34:18
あぁ、お騒がせしましたorz。たぶん、わかりました。 IDEって凄く便利ですね。デバッグ字に変数にカーソルを合わせると内容まで表示してくれるとは 今まで気付きませんでした。
751 :
デフォルトの名無しさん :2008/03/15(土) 13:34:22
このスレの住人なら知っていますね、あの糞開発ツールのことを ・自分のプログラムのバグなのかコンパイラのバグなのかわからない ・他の仕事に応用できない糞開発ツールの独自世界を必死に学習している ・テキストエディタで書いたほうが効率的なのに糞UIツールを懸命に使っている 糞だけど、政治的な理由で無理やり使わされているんですよね もういい加減、我慢するのはやめませんか? ・糞開発ツールを部下に押し付ける上司の命令は無視しましょう。 上司は糞開発ツールが使われる実績を作ることであの会社のごきげんをとっているのです。 ・あの糞開発ツール提供会社には「糞開発ツールは話にならない」と突き放しましょう。 バグレポートなどしてはいけません。改善要求などもってのほかです。 あの会社はあなたたちのことをテスター/モルモットとしか思っていません。 ・あの会議で「糞開発ツールを使ったら生産性がxx%アップしました」 なんて話が出たら力強く机を叩き、会議室を出ましょう。 あの人たちは糞開発ツールをマンセーすることで立場を確保しているのです。 糞な開発ツールを糞だと言える、そんな当たり前の環境をみんなの力で取り戻しましょう。
リッチテキストボックスまたはテキストボックスのオーナードローってできますか?
俺ならできる
俺にもできる?
無理
757 :
デフォルトの名無しさん :2008/03/15(土) 17:24:14
質問です。 Microsoft Visual C# 2008をつかっていいるのですが、 ビルドして実行すると一瞬だけ(入力まちがあるとき以外)表示されて すぐにきえるのですが、どうすればきえなくなりますか? おしえてください
ブレークポイント
消えないようにするオプションとかなかったっけ?
無いらしい
Console.ReadLine();でも入れれば
それだったらブレイクポイントのほうが。
#if DEBUGでいいじゃない
764 :
デフォルトの名無しさん :2008/03/15(土) 19:01:46
>>757 コマンドプロンプトからexeを起動しろ
マルチスレッドかどうかとstaticかどうかは関係ない
static つけるとマルチスレッドでより扱いにくくなると思うんだが。
>>767 そのメソッド自体を同時にひとつしか動かさないなら、別に変わらないと思うけど。
オブジェクトの状態に依存しないメソッドを意識したらstaticが多くなるんじゃね
>>757 キーアサイン変えてるからキーわからないけど、ステップオーバー押していって実行すれば?
>>768 そういう保証が必要な時点で
扱いにくくなってるということだろう?
>>757 VS上なら「デバッグ開始」じゃなくて「デバッグなしで開始」だと終了後にpauseしてくれる
773 :
765 :2008/03/15(土) 19:35:47
まあ別に気にしないでいいってことなんだな。 ありがとう。
>>773 気にしないでいいというより気にするべきところが違うという話では。
System.Windows.Forms.TextBoxを拡張して、 入力できる文字を制限したテキストボックスを作りたいのですが、 どのメソッドをオーバーライドするのが適切ですか? TextChangedだとテキストが変わってから戻すことになりそうだし、 KeyPressだとコピペに対応できなさそうなイメージがあって、 msdnみてもよくわかりません。 教えて。
>>775 俺も知りたい。
入力中に入力値を評価するのはどうやるんだろうな。
>>775 コピペ対応はあきらめて(ShortcutsEnabled = falseと、コンテクストメニューにダミーをかます)
OnKeyPressで純粋にキー入力にだけ対応するのが一番簡単。
コピペにも対応させたいのならTextChanedで二重にチェックするのが一番簡単で確実じゃないかな。
ペースト対応って難しいの? onPasteあたりをオーバーライドすればいいんじゃないの?
780 :
デフォルトの名無しさん :2008/03/16(日) 02:14:43
Detail表示のListViewで、列ヘッダを押下したときにアイテムをソートさせたいです。 このとき、アイテム内文字列の比較モードを変更できますか? 具体的には、文字列"9"、"88"、"56"をソートした場合 "88","56","9"の順番にならんでほしいのですが、 "9","88","56"の順番になってしまいます。
ListView.ListViewItemSorter プロパティ
継承Controlを作成するときに Controlがフォーカスされたときのイベントってどこに書くんですか? OnClickかとも思ったのですが、これだとTabキーで移動してきたときには動きませんし・・・
Enter/OnEnter
もっと低レベルなのは OnGotFocus/OnLostFocus
PerlとかRubyでゆーWWW::MechanizeみたいなスクレイパってC#に存在する? それとDB使ったツールを作って配布したいんだけど、PerlとかRubyだと一般ユーザに使ってもらえないので…
rubyならexerbつかってexeにすりゃいいじゃん。 スレチだけど
>>778 ここ2日くらいexerbとかrubyscript2exeやってみてたんだけどどうもうまくいかんのだ
790 :
デフォルトの名無しさん :2008/03/16(日) 17:10:36
質問です。以下のコードをビルドするとエラーがおきますが、原因がわかりません。 (bool型とdouble型が〜とでるのですが自分にはわかりませんでした。) どなたかおしえてくださいませ。 using System; class IfSample { public static void Main(){ Console.Write("身長(cm)を入力してください"); double n = double.Parse(Console.ReadLine()); Console.Write("体重を入力してください"); double m = double.Parse(Console.ReadLine()); Console.Write("BMIは{0}です", m / ((n / 100) * (n / 100))); bool bmi = m / ((n / 100) * (n / 100)); switch(bmi) { case (bmi<19.8): Console.Write("痩せ型です"); break; case (19.8<=bmi<24.2): Console.Write("普通です"); break; case (24.2<=bmi<26.4): Console.Write("やや肥満です"); break; case (26.4<=bmi<35.0): Console.Write("肥満です"); break; default: Console.Write("高度な肥満です"); break; } } }
エラーメッセージは完全な状態でこぴぺしろ
>>790 > bool bmi = m / ((n / 100) * (n / 100));
ここかな?
double bmi = ・・・
みたいにしてみれば?
caseには定数式以外は使えない
if (bmi < 19.8) { Console.Write("痩せ型です"); } else if (bmi < 24.2) { Console.Write("普通です"); } else if (bmi < 26.4) { Console.Write("やや肥満です"); } else if (bmi < 35.0) { Console.Write("肥満です"); } else { Console.Write("高度な肥満です"); }
enum型の要素に自動的に割り当てられる値は、 [Flags]属性をつけようがつけまいが同じなのでしょうか? どこかで0,1,2,4になるようなことを読んだような記憶があるのですが、それは勘違いで、 自分で明示的に割り当てなければいけない。というのが正解なのでしょうか?
はい。勘違いです
>>795 俺もそんな話をどっかで読んだな。
どういう属性をつけるかとか、ぜんぜん覚えてないけど。
[Flags]付けるとビットフィールドになるんだろ。
逆 ビットフィールドには[Flags]を付ける「お約束」
実際に試したほうが早いし正確なのに
聞いた方が早い。
>>802 の続き
よく見たら、自動で割り当てるわけじゃなくて、自分で書かないといけないのか。
そのページは大嘘過ぎるな
[Flags]を付けないと、3とか5の値をとれない。
ハァ?
[Flags] public enum ABC { Z = 0, A = 1, B = 2, C = 4} [Flags]を付けないと ABC ab = A|B; でエラーになる。
ならないよ エラーになるような違いが出るんだったら属性じゃなくて言語に直接組み込まれてるだろ
(ABC.A | ABC.B).ToString()で違いが出るね やっぱりコンパイラの動作とは直接関係なくてMSとのお約束なんじゃね
そもそもそのためのFlagsAttributeなんじゃないんでしょうかw
どこが面白いのかわからない
まあさすがに自動でビットフィールドにしてくれるんだったら 属性じゃなくて flags enum ABC { … } みたいにするわな
Form1を閉じても、スレッド2が動いたままなので、 Form1を閉じたら、スレッド2を終了したいのですが、どのようにすれば良いのでしょうか?
Form1を閉じる動作のときスレッド2を終わらせる
スレッド2はループ中なんか?
form1.Closed += (obj,e) => thread.Abort(); こんなんじゃないか?
いちいちそんなんでラムダ式使うなカス
820 :
デフォルトの名無しさん :2008/03/17(月) 16:16:57
smallint型のデータをSqlDataReaderを使って取得し、 int型変数へ入れるにはどうすればよいですか? List<int>へループで入れたいが 一部smallint型が ある場合に上手く出来なくて困ってます。
>>819 むしろそんなんだからラムダ式使うんじゃないかと。
>>817 そうです。break;の条件を、Form1が閉じたときとやりたいのですが、うまく行きません。
static int close1 = 0;
public void Form1_Closed(object sender, System.EventArgs e)
{
close1 = 1;
}
while (close1 == 0)
{
//////////////時計
long tick = DateTime.Now.Ticks;
DateTime d = new DateTime(tick);
Console.WriteLine(d.ToString());
label8.Text = (d.ToString());
Thread.Sleep(1000);
}
>>822 >label8.Text = (d.ToString());
GUIスレッド以外からフォームにアクセスしちゃダメ。
close1をvolatileにするか読み書き時にlockする。
BackgroundWorkerの使用をすすめる。
そもそもTimerじゃいかんのかと思ってしまうサンプルだ
>>821 ぶわぁか、こんなんでC#3.0にしてどうする。
せめて匿名メソッドだうんこ。
>>825 匿名メソッドは面倒だよ。
なげーもん。ラムダ式使ったら2.0には戻れんね。
C#やめてRuby(笑)でもやってろモルモン。
言語の進化についていけない落伍者か Cでもやってりゃいいのに
C++から来てるとλ式とかは読みにくいな
僕はくもん式上がりなのでλ式は余裕です。
C++もそっちの方向でしょ
C++にラムダ式が加えられても落伍者達はわからんわからんとぼやくんだろうな
すみませんλって言いたいだけみたいなのですぐに回収します λ......
λ式は書けても高階関数は書けないんでしょ?
書けるに決まってるだろ
Enumerableクラスなんか高階関数のお花畑
>>829 俺、C#よりC++をよく使うが、ラムダ式が羨ましくて仕方ないんだが。
ここ1年ずっとC#使ってきたらC++書くのがきつくなった・・・
すみません、質問いいですか? FileSystemWatcherってありますよね? あれ凄くイヴェントを取り逃がすような気がするんですけど皆さんどうですか? 使い方がおかしいんでしょうけど、どうおかしいのかすら判りません。 例えばDeletedイベントハンドラってPathで指定したディレクトリ内の Filter指定したファイルが消されると発生するんですよね?
っていうか、ラムダ式って所詮、匿名デリゲートの焼き直しなのに何をそんなに目くじらたてるんだろう。 おまけで式木に変換される機能がついたけど、普通に使う分には匿名デリゲートにしかならない。 今思えば匿名デリゲートの記法を delegate(...){...} にしたのが失敗で、 先にラムダ式を導入していたらこの記法は絶対導入しなかったって中の人も言ってるくらいなのに。
イヴェント
1.匿名メソッドを理解、使えるようになる 2.ラムダ式の便利さに気づく 3.ラムダ式は式木でも書けることに気づく 4.もっと複雑な式木を書きたくなる 5.某カッコだらけの言語の存在を知る 6.某カッコだらけの言語の奥深さを知る 7.某カッコだらけの言語で悟りを開く
843 :
デフォルトの名無しさん :2008/03/17(月) 20:50:17
C#である変数を宣言するときに、アドレスを指定するにはどうすれば いいですか? また、アドレスから値を得るにはどうすればいいですか?
アドレスを指定するって何だよ 変数のエイリアスはつくれねえぞ
845 :
デフォルトの名無しさん :2008/03/17(月) 20:58:40
すいません。。。 質問しなおします。 ある変数Aのアドレスが分かっているとしたとき、アドレスから変数A の値を取得するにはどうすればいいでしょうか?
>>845 アドレスってどういう意味で言ってんの?
*(int*)address
まさかこういうことじゃないよね
849 :
845 :2008/03/17(月) 21:39:03
>847-848 アドバイスありがとうございます。 変数につけられたメモリ上での番号のことを言っています。 簡単なコードを示していただけませんか? 例えば、メモリアドレス1000の値を取得したり、代入する場合など。。。 お願いします。
>839 explorerでけすと、ごみ箱へのMoveだから見逃す、というオチじゃないの?
unsafeつけるとCと変わらない書き方ができる
>>849 int a = 123; int addr = (int)&a; int aValue = *(int*)addr;
こういうこと?
超危険なだけで何の意味もないからせめて普通にポインタ使えよ
1つ値を読み取りたいだけなら、Mashal.Read*メソッドがお手軽かもしれない。
854 :
845 :2008/03/17(月) 22:02:57
>>852 アドバイスありがとうございます。
示していただいたコードで、変数のアドレスを取得することができました。
しかし、アドレス1000に対しての代入?についてはまだ疑問が残ります。。。
849の繰り返しになりますが、例えばメモリアドレス1000に格納されている
データを取得するにはどうすればいいでしょうか?
また、メモリアドレス1000に値を格納するにはどうすればいいでしょうか?
釣りだろjk そんなことをする必要はないし する必要があるならC#を使うはずがない
>>854 実際にこんなことやろうとしても、
割り当てられていないメモリを読み書きしようとしたとして、
OSに止められるだけだからな。
int* p = (int*)10000;
int x = *p;
*p = 666;
int x = Marshal.ReadInt32((IntPtr)10000);
Marshal.WriteInt32((IntPtr)10000, 666);
どうせ構造体のポインタが欲しいだけとエスパー
つかC#でポインタ使うとこってどこ?
Interopとか画像処理とか構造体の配列触るときによっぽどパフォーマンスが大事なときとか
>>854 勘違いしてない?
ここはC♯(シーシャープ)という言語のスレだぞ。
もしかして学校の宿題なら、それは、CとかC++という言語じゃなかったか?
862 :
822 :2008/03/18(火) 00:38:27
>>818 ,823-824
レスサンクス
明日試してみる。
多次元配列は使いそうだけど、ジャグ配列って使わないよな? 覚えるのめんどくさいんだが・・・
>>863 Cから来たら無意識にジャグの方を使う。
>>864 ・・・まじかよ、じゃあ素直に勉強するわ
d
いや勉強するもなにも 宣言と要素アクセスのやり方だけ知ってりゃいいんじゃん ジャグのほうは単なる配列を要素とする配列ってだけの話だし 無意識に使われるジャグ配列って「ジャグ」じゃなくね?
List<int[]> lst = new List<int[]>(); //動的に配列を追加していくループ for(...){ lst.Add(....); } int[][] jag = lst.ToArray(); 格納される配列の要素数が動的に変化するような場合とかもあるし、 ジャグのが柔軟。
普通ジャグにしね? ジャグじゃないとN次元配列が書けんし
そんなことはない。
ジャグ配列ってすごく使いにくいぞ
パフォーマンスはジャグの方が全然良いけどな。
使いにくさで言うと断然多次元配列だと思うけど Sortメソッドも使えない
多次元配列よりジャグの方が直感的なんだよな。気がついたらジャグで作ってることが多い気がする。
初期化するときも使用するときも、機械的にいつも似たようなfor文で処理できるし。
>>871 すごく初耳。
>>873 rectangular の方は a[i, j] → *(a + i *WIDTH + j)
jagged の方は a[i][j] → *(*(a + i) + j)
相当で、一見 rectangular の方が早そう(間接参照よりは掛け算の方が軽い)だけど、
1次元配列の参照は IL が専用命令持ってるけど、
多次元配列参照命令がない関係で jagged の方が早いって聞く。
jagged 配列の方が柔軟だけど、new しまくらないといけないのが面倒なときもあるのよね。
ジャグ配列の方が速いのは一番右の添え字が連続したアクセスの場合だけだったような
メインフォームにおいて、文字キー T とか Y のkeyPressイベントを起こすにはどうしたらいいんですか? private void MainForm_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e) { } の中に記述してもイベントそれ自体が発生しないんですが・・・
フォーカスがないだけだろ
>>876 そのイベントハンドラはちゃんとイベントにバインドしてあるのか
KeyPreview
get,setの利点が不明(C#2.0) public string Hoge{ get{ return this.hoge; }} こう書くと public string getHoge{ return this.hoge; } と書くのに比べて何が幸せなんだぜ?
Console.WriteLine(Hoge); Console.WriteLine(getHoge()); あと,リフレクションとの相性
しりあらいず
リフレクションというかコンポーネントモデルやな。PropertyDescriptor。 …ヘジは1.0からこの辺のものを第一言語要素にする点こそ重要って 言ってた気がするがスルーされっぷりが可哀想というか
getHogeがメソッドでないから、きっと記述方法のことを言ってるんだとエスパー 括弧なしのgetHogeでHogeプロパティ作れと プロパティとアスセサ(メソッド)の違いについてならそういう風に書くだろうし
885 :
デフォルトの名無しさん :2008/03/18(火) 17:35:12
iPod touchみたいな慣性付きスムーズスクロールはどうやるのでしょうか? そもそも普通のスムーズスクロールはどうやるのでしょうか
以下のプログラムから出力される数字を、 wavファイルにするにはどうすればいいでしょうか。 #include <iostream> #include <math.h> using namespace std; const int rate=44100; int p(double q, int f, int t) { const double pi=3.1415; double x; x=sin(2*pi*f/rate*q); cout << int(x*127+128+0.4999); cout << "\n"; if (f<t) p(q,f+1,t); return 0; } int main(void) { p(440.0 , 0, rate); return 0; }
ごめ。 c++スレかと思った・・忘れてください
888 :
デフォルトの名無しさん :2008/03/18(火) 19:03:44
PictureBoxを使って、 Font font = new Font(fontName, size); g.DrawString(code, font, Brushes.White, 0, 0); で、1文字描画します。 この時描画した文字の幅を求める手段を教えてください。
MeasureString
WebColorConverterのインスタンスを取得するにはどうするのが正しいの? MSDNにはTypeConverterのインスタンスは直接作らずにTypeDescriptorを使えと書いてあるけど TypeDesctiptor.GetConverter(typeof(Color))だとColorConverterが返ってきてしまう
宇宙仮面のC#プログラミングってサイトの、ED が点滅するボタンのページ >次に、ツールバーのカスタマイズにより、コンパイルしたアセンブリーをツールバーに登録します。 ってどういうこと? ツールバーのユーザー設定? コンパイルしたアセンブリーって項目があるってこと?
事故解決しましたごめんなさい
class A<T> { ・・・ } とあるとき、Tの型をAのクラスの外から調べて使っていく便利な方法があったら教えてください。 リフレクションを使えばなんでもできますが、できれば使用したくないです。 C++ では class A<T> { typedef T ElementType ; } とできたので話は簡単だったんですが・・・ #VBのLinq to XMLが便利すぎ〜〜〜〜ぐはぁぁぁぁ #ヘジたぁぁぁん
dateTimePickerをパースして1日追加して表示しようとしているのですがなりません 何か勘違いしているのでしょうか? DateTime dt = DateTime.Parse(dateTimePicker.Text); dt.AddDays(1); lvi.SubItems.Add(dt.ToShortDateString());
>>894 なにがしたいのかわからんけど
class A<T>
{
public Type ElementType = typeof(T);
}
こんなんじゃだめなの?
>>895 勘違いでーす
DateTime dt = DateTime.Parse(dateTimePicker.Text);
dt=dt.AddDays(1);
lvi.SubItems.Add(dt.ToShortDateString());
>>896 それだと、
A.ElementType inst = new A.ElementType();
とかできなくて不便なんですよ。
>>898 じゃあ
void Method<T>(A<T> a) where T : new(){
T item = new T();
}
こうじゃねえの
>>898 A<T>にこんなメソッド追加すれば
public T CreateElement()
{
return new T();
}
>>899 それもちょっとなんですよね、全部のメソッドについてやらないといけなくて、場当たり感が・・・
C#に移ってみたもののC++とは勝手が違って難しいです、逆にC#では意外とあっさりできる物なども多いのですが。
>>897 ありがとうございます。
盲目でした・・・。
>>895 なんで
DateTime dt = dateTimePicker.Value.Date.AddDays(1);
じゃだめなの?
どうでもいいところに反論したがる奴がいるなw
903じゃないがどうでもいいかぁ? カスタムフォーマットとかで元のコード落ちたりしないだろうか
大体TをnewするよりA<T>を使う側がそのものずばりをnewする方がうまくいくと思うがなあ
>>906 だよね
使う側はTがなにか知ってるんだし
てか、いろんなA<T>に対して同様の処理をしたいなら それこそ、その関数なりクラスなりをジェネリックにすべきだと思うが
独り言キモイ
馬鹿ってのはどうして自分のことばを自分に適用できないのかねw 統合失調なんじゃないのチミ
>>910 因果関係が逆な気もするぞ。
そういう人間のことを馬鹿というのでは。
VB.NET質問スレ(Part25)
http://pc11.2ch.net/test/read.cgi/tech/1203650042/294 294 名前:デフォルトの名無しさん[sage] 投稿日:2008/03/14(金) 20:29:48
ふーん偉そうに他人を「偉そうだ」と言うのは偉そうじゃないんだ。
本当馬鹿ってのはどうしていつでも自分自身の言葉を自分に適用できないんざんしょ不思議。
まあ基本であることに全然異議はないんだけど、その基本すら理解できない御仁がいらっしゃるから
「偉そうに」貴殿はまちがっておられるぞよ、と進言差し上げたしだいなんでございますがね。
345 名前:デフォルトの名無しさん[sage] 投稿日:2008/03/17(月) 21:08:14
多分「俺」に否定的な言葉を投げる奴はみんな「(また)お前」なんだよw
冗談抜きで最近こういう統合失調一歩手前って人間増えてる気がするね
またお前か。
ふらっとスレだけは荒らさないでくれよな。
どう見てもビョーキだなwww
914 :
デフォルトの名無しさん :2008/03/19(水) 16:04:07
統合失調好きだなあ
>>912 言ってるそばから自分棚上げかよw
本当馬鹿ってのはどうして自分自身の吐いてる言葉を自分に適用できんの?
それから「荒れて」いるのはスレじゃなくてお前さん自身の脆弱な心、でしょ?w
馬鹿で心が弱いお前さんの感情が刺激されること=スレが荒れること、ではないよ。
マ板でやれ
USBカメラを単純にプレビューするだけのサンプルってないですかね? 色々探してみたんだけど、どれも複雑で。。。
919 :
デフォルトの名無しさん :2008/03/20(木) 03:01:04
>>917 WebBrowser.ScriptErrorsSuppressed = true;
なんでVBのサンプルがC#より上にあるんだよ
アルファベット順だろうな
じゃあCの方が上だろ
ゲイツがBASIC世代だから?
xmlでnode名とvalueを指定して 特定箇所のvalueを更新する方法は ありますか? ファイル丸ごと読み込んで書き出す方法しか 知らないので教えて下さい
>>922 Visual BasicとVisual C#とVisual C++だったらVBが先だろ。
>>924 1) 一気に読み込んで、DOMを使って編集する。
2) XmlReaderで少しずつ読みながら、XmlWriterで書き出す。
927 :
デフォルトの名無しさん :2008/03/21(金) 14:02:14
Linqを使い始めたら、yield を使った即席の IEnumerable ができると便利だと思ったのですが・・・ static System.Collections.Generic.IEnumerable<int> CreateInt100() { for (int i = 0; i < 100; ++i) yield return i; } private void button2_Click(object sender, EventArgs e) { System.Collections.Generic.IEnumerable<int> collection = CreateInt100(); foreach (var element in collection) System.Console.WriteLine(element); } 上のメソッド CreateInt100() を毎回作るのは面倒くさいですし、名前空間を汚すので匿名メソッドにしてみようかと考えました。 private void button2_Click(object sender, EventArgs e) { System.Func<System.Collections.Generic.IEnumerable<int>> lanbda = () => { for (int i = 0; i < 100; ++i) yield return i; }; System.Collections.Generic.IEnumerable<int> collection = lanbda(); foreach (var element in collection) System.Console.WriteLine(element); } 残念ながらエラーになってしまうのですが、何か良い方法をご存知の方がおられましたら教えてください。
Enumerable.Range
>>928 すまみせん、int のシーケンスは例であって、int のシーケンスを作りたい訳ではないです。
手際よく yield を含むコードを書き下したいのです。
できないなあ
ツリーコンテナの列挙をするときには便利な機能と割り切ってそれ以上深く考える事をしなかったんですが・・・ yield 便利だね、なんでもかんでもコレで書いてしまいたくなる衝動に駆られます。
それはするべきじゃないだろう
Haskellの無限リストより書き方が直観的で良いです
クラスの比較をするときに、比較したいメンバを片っ端から .Eulals 等で比較するメソッドを 片っ端から書きまくって、Eulals , GetHashCode …とこれまた片っ端から書きまくって 比較対照数×比較系メソッド数分の条件判断を書くという、ちょっと間違えれば書き損じ出まくりです yield を使って列挙する側は、列挙する側、比較する側は比較する側とバシッと分けて書いてみると…なかなか気持ちいいです。
936 :
デフォルトの名無しさん :2008/03/21(金) 15:11:35
余りに気持ちいいので、ちょっと紹介しておきます。 クラス C の Equals GetHashCode のオーバーライドが、メンバーの変更によって変更しなくても済みやすくなっています。 using System.Collections.Generic; using System.Linq; public class C { public int Field1; public int Field2; public string Field3; public override bool Equals(object obj) { C tmp = obj as C; if (tmp == null) return false; IEnumerable<object> x = this.CreateFieldEnumerable(); IEnumerable<object> y = tmp.CreateFieldEnumerable(); return x.SequenceEqual(y); } public override int GetHashCode() { return CreateFieldEnumerable().Sum((a0) => a0.GetHashCode()); } IEnumerable<object> CreateFieldEnumerable() { yield return Field1; yield return Field2; yield return Field3; } };
文字がアルファベットかどうか判定したいんだけど、 Char.IsLetter('あ'); の結果がtrueを返してくる。 ほかにいい方法ありますか?
>>936 GetHashCode()に和を使うのはどうかと
a<= x && x <= z || A <= x && x <= Z
>>938 そんなの問題があるならテキトーに替えてくださいよ(汗
HashCodeの作り方がよくわからんからEqualsのオーバーライドもあまりやりたくないな
>>939 >>940 >>942 どうもです。普通にa-zA-Zで比較して判定します。
それにしてもMSDNのあの説明では日本人は勘違いしますね。
MSは苦労したとは思いますが。
日本語のアルファベットはひらがな、カタカナ 英語のアルファベットはA〜Z 単にアルファベットと聞かれたらどちらか分からない。
一般的な日本人はアルファベットと言われたらA-Zの26文字のことだと思う ANK=Alphabet Numeric Kanaって単語だってあるのに。
>>945 MessageBox.Show(char.IsLetter('山').ToString());
>>944 ぼくは一般的じゃないんですかそうでつか><
ギリシャ文字はアルファベットの名前からしてもアルファベットだし、 ヘブライ人も彼らの文字をアレフベートって呼んでるし、 そう考えると、ヘブライ文字の親類のアラビア文字もアルファベットだし、
>926 domとうい単語しらなかったです ありがとう
もうとっくに結論でてますが・・・
昔と違って、アルファベットの概念が広がっているね
int 山 = 5 ;
とか、コンパイル通るし、UTF8 で便利になった反面混乱も多々あり。
http://ja.wikipedia.org/wiki/Unicode あえてライブラリを使うなら、基本ラテン文字 (ASCII互換)、かつアルファベットを調べるとなると
Char.IsLetter('あ') && 'あ' <= 0x7f
アホ臭いから、直接文字コードを調べるのが良さそうな気がしますね。そしてせっかくの新機能があるので拡張してみた。
static public class CharExt {
public static bool IsBasicLatin( this char c) { return c <= 0x7f; }
}
class MyClass {
void func() {
bool isBasicLatin = 'A'.IsBasicLatin(); // (笑
System.Console.WriteLine(isBasicLatin);
}
}
>>951 xsd.exe .net で検索してみな
なになら最近できたというらしい WPF を使ってみた。 Xamlとか一切使わずに、フルにC#でコーディングしてみたんだけど、System.Drawing.Graphics + Pain イベントと比べて断然楽だね Linqに引き続き、説明がさっぱり分らんのは相変わらずで、なんとかしてくれよマイクロソフト・・・ 簡単説明サイトをだれか作ってくれないかな・・・自分で作れってかorz
XAML使わないと添付プロパティとか物凄く面倒だぞ
むしろWPFはコーディングしたら負けだろ
固定デザイン固定アニメーションならコーディング無しでもいいが プログラマブルに動かしたければ、やはりコーディングするしかないよ いやできなくは無いが、逆に面倒になるだけという意味で。
958 :
954 :2008/03/22(土) 14:54:20
とりあえず棒グラフとか折れ線グラフとか作ってます、描画クリッピングの処理とか つまらない処理にも関わらず、工数の取られる作業がプロパティーの設定とGrid親子構造の作り方一つで 簡単対処できるのには驚愕しています、最後に印刷処理を作りたいのですが、どうするんだ・・・
959 :
954 :2008/03/22(土) 14:58:45
それと、デタラメに描画が速いね、これにはタマゲタ さすがDirectX使っているだけの事はある、描画範囲外に大量にLineを配置しても全然速度低下がない。 これが System.Drawing.Graphics ベースだと、Pain 処理はややこしくなるし 手抜きして全部描画しようものならガックンガックンになるし。
今C#のCUIを勉強してるんだが、練習問題ってどっかないかな? 探してみても、本とか講座とかしか出てこないんだがー
CUIって勉強するようなことあるのか?
>>961 プログラミング自体が初めてだからさ、一応勉強しとかないとと
ConsoleクラスちょっといじればCUI限定の問題はクリアと考えていい
>>959 Pain処理ってある意味間違ってないよなw
>>962 unixコマンドのリファレンス引っ張ってきて実装すれば
catとかtelnetとか
>>963 そんなもんですか、やっぱ基本的にGUI弄るってことかな
ありがとうございます^
>>964 ググってみます^
CUIをやらなきゃいけない理由でもあんの? 初めてなら逆に手を出す必要はないと思うんだが。
>>966 いやー、やっぱ基本的なことは知っといた方が良いのかなと
CUIとかGUIなんてどうユーザとやり取りするかって話でしかない
本当にやりたいのはその先だろ?
>>966 "言語の"勉強にはCUIのほうがいいと思う
言語仕様からきっちり解説するような本だとだいたいコンソールからだよ
てことは、コンソールが必要になったら、その都度調べる程度で平気ってことですかね どうもです、頑張ります^
GUI を根本からサポートしている言語を除けば、 GUI まで教え始めるとページ数多くなるからな。
GUIだとはじめに必要な「おまじない」が多いし 入出力がまどろっこしいから言語仕様の解説には不向き
>>972 C#だと、それほどでも無いだろ、Windowクラス生成して以上終了だし。
Win32使うと、激しいことになるけど
初代VS.NETには、CUIベースのわかりやすいサンプルが多かったんですけどね。
クイックスタートのサンプルもう一度復活させてもいいと思うんだけど・・・
>GUI を根本からサポートしている言語を除けば、 だからな。 C# は GUI に力要れてるから問題ない。
言語の勉強する場合、色んなロジックを書いて その処理結果を簡単に出力出来るという点では、 コンソールの方が簡単でいいよね。 GUIだと、そもそものイベントドリブンの仕組みから 色んなコントロールの説明とかしなくちゃならないから。 いきなり、言語の学習の次のステップからになってしまう。
下手な入門本でGUIだとすぐVSでポトペタだからなぁ。
言語の勉強なら文字の入出力ができれば別になんでもいいわけで 一番手軽なのがコンソールっていうだけ 使う話とはまた別だ
つまり言語の入門にはTcl/Tkが最も優れているということですね
WinFormsなら初心者でも簡単だけど WPFになるとXAML覚える方が大変なんじゃないか?w
>>975 C#の場合それは問題多いだろ、開発環境が無ければ何故その機能があるのか、そうなっているのか理解できないものが大量にあるし。
たとえば、カスタムアトリビュートしかり、深いネームスペースしかりで。
>>980 その反論の意味が全く分からないんだが。
では、GUIの方が入門者にとって、C♯"言語"の学習をし易いのか?
つか、今の初心者つったら、CUI? command.com? 何ソレ? だろ、そこから使用方法と説明が必要だ。
いまどきの新人にパイプの説明したら一週間考え込まれた事があるw そんなオレは、もうロートル入りだorz
.NET学習的にもPowerShellがvista標準じゃなかったのは痛いなぁ
プログラミング Microsoft Visual C# 2005 言語編 (マイクロソフト公式解説書) プログラミングC#―C#2.0/.NET2.0/Visual Studio2005対応(オライリー) 読むならどっち?
オライリーの方。 Googleブック検索でないよう少し見てみたらよかったし「初めてのC#」もよかったから。
そういえばC#使ってるけど未だに解説書の類を読んだ事がないな。 もう何でもpublicで作ってるしその内問題に遭ったりするんだろうか
まだ俺2.0止まりでXAMLとか分からないんだけど、ASP.NETとかでやってるみたく FormベースでXML使ってコントロールとか定義できる物ってことなの?
990 :
954 :2008/03/22(土) 23:33:53
>>989 使い始めて間もないのですが・・・簡単に説明すると
フラッシュみたいな物、htmlでいえば、imagタグとか適当にホームページ作成ツールで作って
それに名前を付けておいて、サイズや位置情報を、プログラム側からいじくれるという仕掛け。
各種タグで表示するオブジェクトには名前がつけられて、
その名前.アトリビュート名 = 適当な値
とすると、値が書き換えられて、表示が変化します。
Gridというタグがあって、これは各種オブジェクトを格納(子タグが作れる)、ここに自分で生成したオブジェクトを追加する事もできます。
基本的な要素には、LineとかPolyLineとか、DirectXで良く見られるプリミティブ要素のようなものがあって、ページ中に線やポリゴンなども書けます。
これに座標変換行列を効果させて、回転・拡大縮小・平行移動・平行四辺形的な変形といった事ができます。
最終的にはDirectXで描画されるらしく異様に高速。
大半はデザイナでデザインしておいて、必要な所だけをコードしてしまえます。
Paintイベントで再描画のコードは書く必要なしです。
991 :
954 :2008/03/22(土) 23:41:12
逆にDirectXが分るなら、メッシュの中にボタンやらラベルやらといったプリミティブがあるイメージかな?
thx。そろそろ俺も3.0始めねば・・・。