1 :
デフォルトの名無しさん :
2008/04/22(火) 00:31:59
テンプレ終わり。 ではよろしく。
今からUnmanaged DirectXを勉強しようかと思ってるんだが、 C#でやってる初心者用サイトはないかな? 少しググってみたが無さげで、C++サイトを見ながらやるしかないかなーという感じだが、 もしどこかいいところ知ってたら教えてくれまいか
お前にはC#も++も無理だからプログラムなんて諦めろと
>>8 諦めろ。
最低でもC#のメモリモデルとマーシャリングは理解してないと無理。
初心者のやるこっちゃない。
素直にC++でやっとけ。
あと本当に初心者なら、CLIでやるのも絶対無理だから予め忠告しておく。
C++が分るならメモリモデルとマーシャリングを理解するのは難しくは無いはずだな それが理解できるなら、逆に問題なと見当たらない訳でw という事はどう転んでも駄目な物は駄目という事だなw
C#もDirectXも経験ないから 適当に感じのつかめる教材があればいいかなと思ったんだがw C++ソース見ながらまったりやってくわ、トンクス C++は業務で使っとるから趣味でまで使う気なす(´・ω・`)
というか趣味ならXnaでええやんか
つか業務でC++使うほどなら、C#との連携などたやすいと思うんだがな。 C#オンリーがC++へ行くなら困難は多いだろうが・・・
うわ・・・ふらっと見たらゆとりの相手したみたいだ・・・
>>8 は勉強したいって言ってるだけなのに
「使いこなす」or「やめる」しか言わないヤツってバカなの?
そりゃとっかかりと言われれば、C++をしっかり勉強して深いレベルまで知ってください そうすればC#から使う方法もすぐわかりますとしか言えないのに、初心者用を紹介してくれだからな。 逆にC++で使う方法が分かっていて、C#からどう呼び出すのといわれれば一瞬で解決だろ? tlbimp 使って必要なライブラリを.NET参照できるようにして、DirectXの型を自分の好みの型にマッピングする。 あとは、C++の使い方をどういう風に変換したかは自分がやったんだから、自分自信で全部わかりきれる状況にあるはずだ。 ここで、彼にはいったい何が必要なんだ? おれたちにできることなど何もないだろ、それともここでC++やらCOMやらATLの勉強でもする気か、スレ違いだ。
なげーよ。
>>8 はサイト知ってたら教えろって言ってるだけだろ。
何でお前らは「お前には無理」とか言って話があさっての方向に進むの?
>>18 じゃあ一言でいってやるよ、執拗で回りくどい煽りと荒らし行為がウゼーんだよ
C++スレで延々とやっていろといいたいのだよ
>>19 8が煽り荒らしの類には見えないんだけど。
過剰反応なんじゃねーの
>C++は業務で使っとるから趣味でまで使う気なす(´・ω・`) ならきっとウソツキだな
自作自演もキモイ、このスレ以外でもやりまくってるだろ、死ね
>>21
>>23 おい適当な自演認定すんなよ、俺は21だがそれ以前に俺のレスはねーよ
って言ってもID無いし信じられんわな
8がこんなに叩かれてんのが疑問だったから21のレスをしただけ
あの程度で「叩かれてる」とかwww 本人納得して帰ってるんだからほっといてやれよwww
>>26 程度の問題は知らんけど
煽り荒らしに見えなかったから俺は19のレスが気になったの。
相変わらず気持の悪い自演をする奴だな
答える気がない人は書かなくていいです^^
System.Windows.WebBrowserでもAxSHDocVw.AxWebBrowserでも、
InfoseekのWebメールサービスでリロードとかするとStackOverflowExceptionで落ちるようになったガッデム。
IE(6)だと落ちないのに。
てことでだれか試してみてくれませんかね。
[STAThread] unsafe public static void Main(string[] args) {
Form form = new Form();
WebBrowser browser = new WebBrowser();
browser.Dock = DockStyle.Fill;
form.Controls.Add(browser);
form.Load += delegate {
browser.Navigate("
http://email.www.infoseek.co.jp/login_form.php ");
};
Application.Run(form);
}
ログイン画面でリロードするだけで落ちる。
関係ないかもしれないけどスレイプニル最新バージョン2.7.0でもinfoseekのメールで落ちる。 確認してないがlivedoorニュースでも落ちるみたい。 スレイプニルのスレや公式サポートでも話題になってるみたいだけど 犯人はflashみたい。
プログラムからといわず、普通にIEから見ても落ちる、腐ってる
>>32-33 情報ありがと。
確かに ActiveX 実行禁止すれば落ちなくなるみたいだ。Flash のせいっぽい。
すごい迷惑なもん作ったなinfoseekw
意外とinfoseekメール使ってる人がいてびっくり。 便乗するがあの迷惑メールフィルタの弱さをなんとかしてほしい。
StackOverflowExceptionだと捕まえることもできんな…
>>36 ここで言うなよw
StackOverflowといえば今日こんなコードを書いてしまった int x; public int X{ get{ return X;} } インテリセンス氏ねと思った
あるあるw
あるあr・・・ねーよ
それは、x を右クリックしてリファクタリング→カプセル化でおk
つ 自動プロパティ
>>42 それはsetとgetがそろってないと出来ないのよね。
private set
フィールドにはプレフィックスとしてアンスコを付けているから、そういうのはないな。
俺もついこの間まで こんな記述ができるとは知らなくて必死に38みたいな書き方してたぜ。 internal bool IsLink { get; private set; } おまけにインテリセンスで小文字と大文字並んで表示されるからややこしい。 ついでに内部フィールドが必要な場合は <![CDATA[public $type$ $property$ { get {return _$property$; } set { if (value == _$property$) return; _$property$=value; $end$ } } private $type$ _$property$; ]]> こんなコードスニペットを作ったら、馬鹿みたいに楽になった。
自分自身の代入のチェックなんていらんだろ
↓ここ
C++のoperator=じゃないんだから
カスタムコントロールの外見に関するプロパティみたいに、変更時のコストが大きいものはチェックする。 巨大な値型も、コピーのコストが大きいからチェックした方がいいのかもしれない。 小さな値型や参照型なら、代入のコストよりチェックのコストの方が大きいような気がする。
コントロールパネルのネットワークの接続の各種接続(ローカルエリア等)の無効/有効を変更したいんですが、 直接C#から変更ってできますかね?
参照だろうと、小さい値だろうと大抵の場合object.equals相当のものが呼ばれるだけなんだから大したコストにならんだろ
相対的にはとんでもなく大きなコストだろ
事前の最適化は百害あって一利なし というか時間がかかるような処理をプロパティにするなよ とりあえず巨大な値型であっても代入のコストよりはチェックのコストの方が大きい
こういう流れだと,C#使うなとか言い出す奴が出てきそうだけど わざわざ不要なチェックを入れることはないというだけの話だからな 値が変化したときに何らかの処理やイベントを発生させるとか GUI関連でどうしても時間がかかるプロパティが必要とか そういうプロパティが多いからひな形として全部チェック入れちゃえ!とかそういうことなら話は別
>>53 大体のことはP/Invokeでなんとかなる
>>56 >事前の最適化は百害あって一利なし
賛成
>とりあえず巨大な値型であっても代入のコストよりはチェックのコストの方が大きい
今のPCはメモリーアクセスが最もパフォーマンスに深刻な問題を与えるから(分岐など比較にならない)、そんな事はないが
チェック時点でデータ読み出して比較とかすれば、意味無いので否定はしない。
比較するならまずハッシュ値で比較してから本番の比較をしないとパフォーマンス向上の意味はない。
もちろんハッシュ値の計算を高速にする必要もある。
ListBoxでCtrl+Enterを押すと先頭がJで始まるアイテムにジャンプするのは何故なんだろう? Aを押せば先頭がAのアイテムにジャンプするのは分かるが、この挙動は意味分からん
^J が 0x0A だからかな
#って++が2つ重なってるんだぞ!! ++ ++ ほら
>>63 Wikipediaを見たんですね
わかります
コピペ君って馬鹿だな、まで読んだ。 コピペ君ってただのコピペに存在意義があると思ってるのかねひょっとして。 まあ普段無能で役立たずだと人に思われてるから、こんな「せせこましい」ことでもして 人に自分の価値を認めてもらいたいんだろうなw
>>66 他人を見下すのに必死なんですね。わかります
68 :
デフォルトの名無しさん :2008/05/01(木) 16:37:27
誰か、より良い方法があったら教えてください。 // 何箇所も変更場所があるのは好ましくない class MyComponent1 { string myProperty = "初期文字列"; [DefaultValue("初期文字列")] public string MyProperty { get { return myProperty; } set { myProperty = value; } } public MyComponent1() { } } // リファクタリングで MyProperty を書き換えると GetProperty("MyProperty") に変更が入らない // 結局複数個所を書き換える方が見通しがいい class MyComponent2 { string myProperty; [DefaultValue("初期文字列")] // ここを書き換えたら myProperty の初期値にも反映したい public string MyProperty { get { return myProperty; } set { myProperty = value; } } public MyComponent2() { var defaultValue = typeof(MyComponent2).GetProperty("MyProperty").GetCustomAttributes(typeof(DefaultValueAttribute), false)[0]; myProperty = defaultValue.ToString(); } }
const string DefaultMyProperty = ゙初期化文字列゙; string myProperty = DefaultMyProperty; [DefaultValue(DefaultMyProperty)] public string MyProperty {...}
>>68 こういうユーティリティクラスを作っておくとか。
ttp://d.hatena.ne.jp/NyaRuRu/20071228/p2 public static class Reflector
{
static PropertyInfo GetPropertyInfo(this Expression expression)
{
var findprop = default(Func<Expression, PropertyInfo>);
findprop = expr =>
{
switch (expr.NodeType)
{
case ExpressionType.Lambda:
return findprop((expr as LambdaExpression).Body);
case ExpressionType.Quote:
return findprop((expr as UnaryExpression).Operand);
case ExpressionType.MemberAccess:
return (expr as MemberExpression).Member as PropertyInfo;
default:
return null;
}
};
return findprop(expression);
}
public static PropertyInfo Property<TArg, TResult>(Expression<Func<TArg, TResult>> expr)
{
return expr.GetPropertyInfo();
}
}
使い方。
var defaultValue = Reflector.Property((MyComponent2 comp) => comp.MyProperty).GetCustomAttributes(typeof(DefaultValueAttribute), false)[0];
これでリファクタリングしても一緒に名前が変わるはず。
>>69 アトリビュートには const メンバーが使えるんだ、気付かなかった。
>>70 ありがとうございます、今回は単純なので const でいこうと思いますが、大変参考になりました。
これは、ものすごく応用範囲が広いと思います、今後何かと役に立ちそうです。
ListViewのListViewItemSorterプロパティをVSから設定するには どうしたら良いですか? プロパティの項目を見てもListViewItemSorterが無いのですが。
>>72 インターフェイスだから、本体を実装しないと設定できないので、デザイナにあっても意味がないんですよ。
実際に使ってみると分かるよ。
74 :
デフォルトの名無しさん :2008/05/02(金) 22:40:32
iTextSharp使ってテンプレート読込んだけれど、その後の文字描画がテンプレートの下に隠れてしまうが、 レイヤの順序を操作する方法とかあるのでしょうか? テンプレート読込み後に文字描画しても、その逆でも同じように隠れますが。
721 名前:デフォルトの名無しさん :2008/05/02(金) 19:08:31 MSは.NETをいいかげん諦めたらいいのに。 Javaはほぼ全てのOSでサポートされてるから、仮想マシンという考え方が現実に役に立ってるが、 .NETのCLRはXP以降のWindowsでしか完全に動作しないし、 処理が重くなる以外、糞の役にも立っていない。 VistaがLonghornと呼ばれてた頃は、.NETがネイティブAPIになり、 Win32APIはなくなるとかいわれて、騙されて慌てて.NETを始めた犠牲者が、 騙されたことに気づいた今でもモッサリプログラムを作り続けてると思うとうんざりする。 結局Win32で作られた軽快なアプリ資産があるかぎりWin32APIは永遠になくすことができないし、 そのために.NETは永遠に脇役でモッサリのまま。 これが現実。 738 名前:デフォルトの名無しさん :2008/05/02(金) 20:26:23 .NETの元凶は、遅くなるだけで存在意義がないCLRにあるんだから、 MSは.NETのクラスライブラリと完全互換のネイティブC#を出せばいいんだよ。 開発プラットホームのスタンダード争いは完全にJavaに敗北したんだから、 もうJavaと張り合うためにバーチャルマシンに拘る必要はない。 速くて快適なEXEを作れる言語の方が誰にとっても実利的だろ。 そして.NET Frameworkにはひっそりと死んでもらうと。 大体、ビルゲイツが一線を退いてからのMSはVistaとか.NETとか失敗だらけで見てられない。 顧客(開発者、ユーザ)を苦しめることばかりしている。
>>75 そんな元スレで失笑買ってたレスをこぴってこなくても
VC++ の頃: DWORD ? LPSTR ? 何それ? C# に移行してから: DWORD や LPSTR がない? 一体どういうこっちゃ。 ('A`)
なにがいいたいのかわからない
79 :
デフォルトの名無しさん :2008/05/03(土) 13:00:34
つまり慣れってことですね、わかります
pHandle = OpenProcess(PROCESS_VM_READ, FALSE,PID); // ハンドルの取得 if(pHandle == NULL) // 失敗時の処理 { cout << "Cannot Open Process !" << endl; exit(-1); } buf = (LPSTR)malloc(READ_SIZE); // バッファの確保 ReadProcessMemory(pHandle,Adr,buf,READ_SIZE,NULL); CloseHandle(pHandle); fp = fopen("Result.bin","wb"); fwrite(buf,READ_SIZE,1,fp); free(buf); に相当する操作をC#でAPIを使わずに書きたいんだけど、どうすればいいんでしょうか?
APIを使わずにってのはどういう要求なんだろう WinFormsの中でだって大量に使われているのに
コピペ君って馬鹿だな、まで読んだ。
C/C++ だと何行も書かないといけないけどC# なら2,3行でさくっと出来るって聞いてC# に移行した。 要は楽をしたいだけ。API を使ってごちゃごちゃやらなきゃいけないんじゃC#に移行した意味がない。
だれがそんな嘘を吹き込んだんだよ
C#でXMLを扱う勉強をしています。 XMLに入っている大量のデータ(IDと名前)を読み込んで、 プログラムに入力されたIDとマッチさせて名前等のデータを表示させたいのですが どのようなアプローチをするのがいいのでしょうか? 検索は何度でも行えるようにしたいので、その都度ファイルにアクセスするのは効率が悪そうだし かといって膨大なデータを全て配列等に格納するのも資源の無駄遣いのような気がして悩んでいます。 XMLの構造は <Person> <ID>774</ID> <Name>Hiroyuki</Name> </Person> が延々と続いたものです。
どんだけ膨大か知らんけど普通にオブジェクトのコレクションとして取り込めばいいんじゃない? 内部でXMLとして保持する意味なんて無いっしょ。
>>89 >検索は何度でも行えるようにしたいので、その都度ファイルにアクセスするのは効率が悪そうだし
2回目以降はキャッシュに載ってると思うけど。
結局OSのディスクキャッシュと同じものを作ることになるんじゃない?
もちろんアプリケーションサイドでやればOSのディスクキャッシュより効率は良くなるだろうけど
費用対効果考えて判断すればいいんじゃなかろうか。
OSのディスクキャッシュよりもヒット率の低いデータをメインメモリにため込むのはよろしくないと思う。
キャッシュのことは完全に頭から抜けていました。 データをメモリに展開しない方向で考えてみます。
LINQの出番
ここでしていいのか微妙な質問なのですが・・・ Visual Studio 2005で作成しWebサイトの作成をしているのですが、 aspx側のJavaScriptで記述されたfunctionを、cs側のイベントの途中で記述して 呼び出したいのですが、どうしても方法を思い出せません。 順番としてはボタン等によるイベント→aspx画面表示→JavaScript呼び出しよるアラーム等 でできるはずなのですが、どなたかわかる方いらっしゃいましたらご教授をお願いしたいです。
InvokeScript
vs2008の3か月フリー版でC#をいじってます。 VC++Ver6ではDefWindowProc を追加するのは仮想関数のオーバーライド ってところでやってましたが、C#では同様なことをするにはどうすれ ば追加できますか? どちら様かご教示のほど、よろしくお願いしますm(__)m
生のメッセージ捕まえたいのならWndProcをオーバーライド
>>97 早速の回答、ありがとうございます。
開発環境の使い方がいまいちわからないのですが、
オーバーライドするときは対象の関数を自分でタイプするような
かたちなのでしょうか?それともどこかのメニューから追加でき
るのでしょうか。
申し訳ありませんが、よろしくお願いします。
クラススコープでいきなり override スペースって打ってみな。一覧がでてくるから。 選らんでエンターでメソッド雛形出来る
>>99 実装できました。
どうもありがとうございましたm(__)m。
VS2008で書いたプログラムで蛍光表示管に画像表示させて遊んでいます。 C#のSerialPortクラスにあるWriteメソッドを使って 蛍光表示管にデータ送信をしているのですが 送信途中でブルースクリーンが表示されてWindowsが落ちてしまうことがあります。 一度のデータ送信で300bytes弱、 それを延々と繰り返すようなプログラムを書いています。 そのループ中に、Windowsが落ちることがある、という状態です。 なぜブルースクリーンが出るのか、 どうすれば、ブルースクリーンが出なくなるか、が分かりません。 教えて下さい!
ブルースクリーンの内容も書かずに質問とな 大体、複数のPCで試したのか?落ちるコードは?ふざけてんの?
むしろSerialPortクラスでOSが落ちるってどんなコードかいてるのかこっちが聞きたいよ。 っていうか、だからとりあえずチミの環境でその現象が起こる最小のコードを晒そうよ。
ハード的な問題とか? その辺素人なんでよく分からんけど。異常な電圧がかかってるとか?
ブルースクリーンってハードかドライバだろ
>>105 十中八九そうだろうね
ただ、「デバイス、ドライバ、etc.が異常である」とOSが判断した結果なわけだから
ソフトウェア的な要因も無きにしも非ず。2000/XPならほぼ無いと思うけど
ブルースクリーンのエラーの内容を書くのが先じゃね
あれ一瞬で消えること多いのに、MSのサポートにはエラー番号のページを参照してくださいとか書いてあるよね。
んでエラー番号検索かけてみたら見つからないと・・・
>>108 システムプロパティの[詳細設定]の[起動と回復]の
[自動的に再起動する]にチェックが入ってるからだろ。
大抵のエンドユーザーはブルースクリーン出たら再起動するだけで、
内容見てもわけわかんないんだから
Microsoftは親切にデフォルトで[自動的に再起動する]にチェックが入ってる。
それすらも知らないって事はそれすらもしてないって事か
string[] arg = new string[3] { "a", "b", "c" }; string value = ""; arg.Where(((s ,i) => { value += s + i.ToString() ; return false; })).Count(); Console.Write(value); こういうことってやっておkですか?
きもちわるいです
string用のSum書けば?
ラムダ式は書き方によってうんこになりすぎるな。
class newobj { public object o { get; private set; } public newobj(object o) { this.o = o; } } 例えばこんなクラスがあったとして object[] arg = new object[3] {1,2,3}; newobj[] list = new newobj[arg.Count()]; arg.Where((obj, i) => { list[i] = new newobj(obj); return false; }).Count(); こんなことできたら便利だなと思いましたが確かにキモイですね。 素直にfor文使います
せめて、int i を引数に取る Aggregate 書くとかした方が。
Array.ConvertAllだろどう考えても せいぜいSelect
なんだこの Where, return false, Count 厨は
俺なら
>>112 は
var arg = new [] { "a", "b", "c" };
var value = arg.Aggregate(new StringBuilder(), (b, i) => b.Append(i));
Console.WriteLine(value.ToString());
>>116 は
var arg = new [] { 1, 2, 3 };
var list = arg.Select(i => new newobj(i)).ToArray();
と書くな。
副作用を目的としたWhereなんて嫌すぎる。
newobj[] list = Array.ConvertAll<object, newobj>(arg, (obj) => new newobj(obj)); こういったメソッドも用意されていたのですね。 SQL?の知識が無いためSelectの使い方がよく解らなかったのですがそういう風に使えるんですね。 Aggregateはヘルプ見たのですがいまいち使い方わからなっかのですが便利そうですね。様々な使い方できそうです。 皆様どうもありがとうございました。
123 :
101 :2008/05/06(火) 21:11:59
>>102-111 レスありがとうございます。
>>110 の設定は知りませんでした…ありがとうございます。
・ブルースクリーンのエラー内容を見たところ、以下の通りでした。
STOP: 0x000000D1 (0x00000000, 0x00000002, 0x00000000, 0xBABC9185)
vrcomIT2k.sys Address BABC9185 base at BABC8000, DateStamp 3ec3702e
http://www.uploda.org/uporg1408089.jpg.html (FYI:
>>106 「デバイス、ドライバ、etc.が異常である」ということで思い出したのが、
PCのUSB端子から、蛍光表示管メーカーが用意している仮想COMドライバを使って
蛍光表示管にデータ送信している、ということをやっています。
もしかしたら本件と関係があるかもしれないので、書いておきます。)
他PCでの再現性については、PCを1台しか持っておらず、
申し訳ないのですがすぐ確認できる状況にはありません。
最小のコードについては、現在調査中です。再現ができ次第、UPしたいと思います。
> 蛍光表示管メーカーが用意している仮想COMドライバ 臭いな。というかたぶんこれだろう。
>>123 エラー内容みるかぎり、蛍光管メーカーに問い合わせるのが正解かと
ここで聞いても、運よく同じメーカー同じドライバで同じトラブルに見舞われている人以外には分からないかと。
とりあえずは、ドライバがそのOSに対応しているのか、そのへんから全部チェックしてみたらどうだ?
2kとかついてるから、Windows2000専用とかそういうのないか?
STOP: 0x000000D1 は、メモリエラーの可能性も無きにしもあらずだから、 念のためmemtest86かけてみたら?まあ、そのエラーでブルースクリーンは シリアル周り(ハードウェアモデムとか)のエラーとしてすっごくありふれた ものだから、たぶんドライバの問題だろうね。
VS2008は起動してるだけでメモリアクセスしてるから たまに起動してるだけでブルスク(0x9C)になることがあるぜ。 まあ原因は安物メモリのせいかもしれないが。
それがみんな出ていたらFAQに入るわ
あきらかにハードが原因だろ
>VS2008は起動してるだけでメモリアクセスしてるから そりゃそうだろ。 メモリアクセスしないアプリがあったら見てみたい物だ。
140 :
130 :2008/05/09(金) 12:01:02
あれ?なんか変なこと言った?
141 :
デフォルトの名無しさん :2008/05/09(金) 12:17:29
ArrayList arrayをDataGridViewに表示させたいのですが、DataSource=arrayとやっても何も出ません。 何か良い方法はありませんでしょうか?
>>141 System.Collections.ArrayList array = new System.Collections.ArrayList();
array.Add(new { X = 3, Y = 4 });
array.Add(new { X = 5, Y = 6 });
this.dataGridView1.DataSource = array;
動作します、原因はArrayListに追加した要素が、プロパティーではなくフィールドになっていたとか、そんなオチでは?
arrayが空っぽ
そろそろ麻雀やろうか
readonly(private setじゃなくてコンストラクタ以外で変更できないようにする方ね)にするためだけに 自動プロパティを使うのを諦めてフィールドを手書きするのが悔しい
public struct T_INFO_DATA { public uint Id; public uint Fixed; public byte[] Array; }; switch (WParam.ToInt32()){ case 0x1200: COPYDATASTRUCT cds = (COPYDATASTRUCT)Marshal.PtrToStructure(LParam, typeof(COPYDATASTRUCT)); T_INFO_DATA a = (T_INFO_DATA)Marshal.PtrToStructure(cds.lpData, typeof(T_INFO_DATA)); ←ここでエラー 〜 WM_COPYDATA受信時に上記のような処理を行うと下記のエラーメッセージが出ます。 保護されているメモリに読み込みまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。 誰かどのように修正すれば直るのか教えてください。 構造体Arrayの中に入ってる配列数は48個です。 これ以外の構造体(配列を使っていない構造体)の受信は正常に取得できます。よろしくおねがいします。
良くわかんないけど C側のイメージとしては struct T_INFO_DATA { DWORD Id; DWORD Fixed; BYTE * Array; } となっているわけですが、問題ないのですか?
>>149 +アルルファ
byte [] Array の位置にはポインタが入っているわけでなく、メモリーブロックへのハンドルが入っています。
byte [] オブジェクトを確保して、そこに格納する必要があるのではとか?
ぱっとみ思いつく限り
やったことはないけども、 int とか IntPtr にして MarshalAs でなんとかできないかな。
メモリハンドルをIntPtrで受け取っておいて、LocalLock、Marshal.Copy、かな。 あと、Arrayというメンバは名前をhMemとかに変えろ。
>hMem むしろキモイ
そうか? すぐAPIに渡すものなら、APIの引数名に合わせた方がわかりやすいだろ?
C#を一から始める際に参考になるサイトとか教えてもらえませんか?
ケースバイケースだろうね。 Win32APIはともかく、デバイス屋が提供している制御用のAPIなんて 意味不明すぎる命名がされてること多いし。
159 :
148 :2008/05/11(日) 17:40:01
>>149 C側のイメージだと、
struct T_INFO_DATA
{
DWORD Id;
DWORD Fixed;
BYTE Array[48];
}
という認識です。
ポインタを送るほうがいいのでしょうか?
属性使っていろいろする必要がある。 [StructLayout(LayoutKind.Sequential)] public struct T_INFO_DATA { public uint Id; public uint Fixed; [MarshalAs(UnmanagedType.ByValArray, SizeConst=48)] public byte[] Array; }; なお、コンパイルは通してないからこのままでOKかどうかの保証はない。 あとは調べてくれ。
162 :
148 :2008/05/13(火) 07:16:56
>>161 ありがとうございます。
構造体をその記述にするだけでうまくいきました。
163 :
デフォルトの名無しさん :2008/05/13(火) 15:55:00
相談内容 RS232C通信のプログラムを作っているのですが、 デバックの効率化のために実際の通信内容を別Windownにてモニタリング できないか検討してます。 本当はStreamにフックするだけで使えるものが他のデバックにも使えて 望ましいのですが、そんな便利なクラスってないれすか?
.Net には、フックの類はないよ 自分がやるとしたら、Streamクラスから派生したクラスにフックコードを挿入したアダプタクラスを作って RS232C通信をアプリ側でフックする 引き続いてWCFを使ってプロセス間通信ができるように、サービスを作って 別ウインドウで作ったデバッグウインドウは、そのサービスに接続して、状況を読み取るといった形式にすると思う。 ついでに、通信情報以外の各種情報もモニターできるようにするかな。
昔、まさにそういうツールがフリーであって重宝したなあ。 NTで動いてたから、今でも使えるとは思うが何って言ったっけな。
便利とは思うが、盗聴まがいのAPIはよろしくないから無くした方がいいと思う。 キーボードフックを筆頭に。
167 :
163 :2008/05/13(火) 16:38:31
>>164 さん,165さん
レス有難う御座います。
アダプタクラスですか・・
腑抜けの私には、むりっぽそうですw。
申し訳ない、追加で質問なんですが、
フックがだめなら、
またStreamの中身を盗見することって難しいのでしょうか?
普通に考えると
ReadStreamは一度読み取ると消えちゃうし、
WriteStreamはそもそも読めないですよね。
これができれば、何とか簡易もどきが作れそうな気がするのですが
>>167 中身みるよりアダプタの法がよっぽど楽だ、Streamクラスの抽象関数オーバーロードして、呼び出しをそのままReadStreamなりWriteStreamなりに渡せば以上終了だぞ。
>>167 いい機会だからデザインパターンを勉強しような
170 :
163 :2008/05/13(火) 16:57:26
>>168 そうですか。了解です。
普段は組み込み関連の仕事が多いもので、
不慣れな環境なんで、他に良い手がないか、
無駄に時間をつぶして調べ回っていました。
アダプタ法で頑張ってみます。
勉強になります。有難う御座います!!
171 :
163 :2008/05/13(火) 17:20:28
ぐは、早くも生きづまった・・
SerialPortクラスのBaseStreamメンバはReadOnly・・・
Streamの継承クラスを渡せない・・
早くもだめぽw
そうすると専用のStreamReadrとWriterを自作するのが王道でしょうか?
それとも、SerialPortクラスを継承してメソッドを書き換えるか・・
>>169 さん
アドバイス有難う御座います
今度本を買ってきます。
デザインパターンの根本的なところを理解していないのに、
何か作ろうとするから、いつもメタメタになる・・
本買って読むのもいいが、この種の本は場数が足りんとどうせ読めんよ。 自分で頭をひねって考えるのが重要。 class MyStream : Stream { Stream rs232 = ここで、BaseStream を突っ込む override 関数各種() { rs232.同名の関数() ; } } 基本は、こうやって作る。とにかくオブジェクト図を描くこと。 オブジェクト間のメッセージ(関数の呼び出し)の接続が最少になるのはどういう時かよく考えること。 さっさとオブジェクト指向アプローチをおぼえて、古いやり方は捨てること。
173 :
163 :2008/05/13(火) 17:55:08
>>172 さん
有難う御座います。
コードまで書いて頂き、お時間を取らせてしまって、
すいません。
なるほど!!、こうすればBaseStreamそのものがReadOnlyでも制御できる。
こうすれば、デフォルトのStreamReaderが使いまわせる。
つくづく自分の頭の固さが嫌になります。
>とにかくオブジェクト図を描くこと。
>オブジェクト間のメッセージ(関数の呼び出し)の接続が最少になるのはどういう時かよく考えること。
>さっさとオブジェクト指向アプローチをおぼえて、古いやり方は捨てること。
こういった、アドバイス非常にありがたいです。!!
自分でもあがいてはいるのですが、
周りにこういった話が出来る人がいないんです。
オブジェクト図ですね。書きまくって見ます!!
174 :
163 :2008/05/13(火) 18:04:07
>>172 さん
まだいらっしゃるかな・・
>オブジェクト間のメッセージ(関数の呼び出し)の接続が最少になるのはどういう時かよく考えること。
もしよろしければ、この部分についてもう少し解説していただけないですか?
これは、どんなときに考えるのでしょうか。
クラスの責務の振り分け/分割時?
またメッセージの接続が最小になると、どんな良いことがあるのでしょうか?
質問ばかりですいません。
オブジェクト指向のもっとも重要なポイントは、クラスではなくインスタンス。 インスタンスが主役であって、クラスはオマケ。継承がウンタラとかいう連中もいるが間違っているから相手にするな。 今四つのインスタンスがあるとする、それぞれ A , B , C , D 粒度が細かすぎて取り扱いにくいので、二つにまとめてみようと考えてみる。 インスタンスAがBを呼び出すなら A --関数名--> B と書いてみる。 まとめる方法は[A,B,C] [D]がよいか[A,B] [C,D]がよいか。 呼び出しが最少になるような図を考えてみよという事。 適当に矢印書きまくって、最小になるように分離してみるといい。 あとは応用。
インスタンスが主役でクラスがおまけ、って俺には理解できない発想だマジで。 っていうか、それに類するような主張をこれまでに聞いたことがないよ。
なにいってるかよくわからんが、継承か包含かちゅー話じゃないのか
プロトタイプ指向のことなんじゃね
インスタンスが主役w
C#は型指向
>>176 オブジェクト指向を扱っているサイトにいってみたら?
そうすれば無知も治るよ
オブジェクト指向ではインスタンス(実体)は脇役だろう。
>>182 今から15年前くらいは、確かにそういう事になっていたが、そのまま固まったか?
Javaが登場して以降、体系的に研究されたオブジェクト指向もちょっとは勉強するといいよ。 でないと、デザインパターン意味や使い方など理解に及ぶことはできないし、上の例だって発想することすら難しいだろう。
Javaと関係なく研究は進んでいたと思うんだけど。
何言ってんの。 オブジェクト指向イコールJavaと言ってもいい程だよ。
その進んだ研究を勉強していないのは駄目だという事だよ 今のライブラリは当たり前にその設計思想が入っているからな、知らないと使い方分らんだろ。
>>186 ゴールじゃねぇよ、LINQとか見てみろ
別にオブジェクト指向がどうとかこうとかどうでも良いよ
インスタンスは実体。 お前はパソコンに文字を表示させるとき、直にVGAのメモリを書き換えるのか?違うだろう。 ドライバやらOSやらGDI+やらライブラリ郡など抽象化されたものを通してアクセスし表示させるだろう。 オブジェクト指向はインスタンス(実体)を直接操作せず、抽象化して利用しやすくする手法。 インスタンスがメインなわけがない。
>>188 ゴールなんて関係ないこと持ち出して自ら否定して
結局何が言いたかったのかね。
>>190 そうだな、もう永久にそう思っていろよw
>>190 そんな考えでも君のプログラムがちゃんと動くならそれでいいよ
それはそれで正しいわけだから
良いコード:動くコード 悪いコード:動かないコード
クラスが主役 に一致する日本語のページ 約 290,000 件中 1 - 10 件目 (0.30 秒) インスタンスが主役 に一致する日本語のページ 約 1,790 件中 1 - 10 件目 (0.06 秒)
タイヤキの型とタイヤキそのもの どっちも主役です(ゆとり教育的発想)
もうこの手の話がしたい奴はOOPスレ行った方がいいよ。
あそこは
>>175 的なトンチキな自説をぶってるアホが延々同じネタをループしてて楽しいと思うよ。
俺は正直吐き気がするけどねああいうの。
ちなみに
>>190 は半分はいいこと言ってると思うんだよね。
OOPというアイデアの肝は、
>>190 の言う抽象化(より正確には仮想化と言うべきだと思うけど)された
仮想機械をより直感的に表現するコーディング手法ということだと思う。
ただ「実体=インスタンス」ってのは全然意味不明だが。
インスタンスの和訳が実体だろ・・・
>>188 LINQはオブジェクト指向とはまた別だろ。
関数型プログラミングのほうが近い。
なんか、こう訳わからん事になっているから、少し書くと
たとえば、C++でいう所の仮想テーブルは、virtual などなくても class のみで作り出すことができる。
これは非常に重要なことで、仮想テーブルは書き換えられないが、自分で作った仮想テーブルは書き換えられる。
このような実装は、Strategyパターンと呼ばれる。
つまり、classを使った抽象化は実は必要なく、ただ『頻繁に出てくるので言語上にvirtualとして実装しておくと便利であるという程度の意味』しかないのだ。
オブジェクト指向を理解する上で、この点について理解しているかどうかは決定的だ。
理解せずクラスと継承を中心に置くとやれる事が一気に限定されてしまうのだ。
さらには、継承には各種問題点も指摘されてり、特に深い継承は良くないと最近はされている。
また原則、継承を考える前にインターフェイスを検討するべきとされている。
参考コーディング規約
http://www.kawabata.com/dotnet/CodingStdCS.pdf 参考サイト
http://www.objectclub.jp/
>>199 話の文脈を読まなきゃ。
>>190 の言う「実体」とは「クラスによって抽象化される前の何者か」。
たとえばGDIならビデオカードやプリンタのハードウェアのことを「実体」といっている。
少なくとも話の前半ではね。
>>201 それって結局、包含と委譲のことだろ。クラス対インスタンスという話ではない。
継承だけがクラスの特徴ってわけじゃないぞ。
>>203 つってもインスタンスを大量生産するための鋳型以上の意味もないだろ?
>>175 ひょっとしてインターフェイスと書くところをインスタンスにしてしまって
引っ込みが付かなくなったとか。それなら文脈があうが・・・
>>206 インターフェイスもインスタンスの一つと見なしてよいものだよ。
インターフェイスは取得するものだ。
いったい君たちは何の話をしてるの? 誰か頭のいい人ドラゴンボールに例えてくれよ
ドラゴンボールの主人公はヤムチャなのか天津飯なのかと言う話
実装と概念は分離して語れよ
↑といいつつ乖離して語る馬鹿
主役はキーボードを打つキミだ!!
スーパーサイヤ人→スーパークラス
ブルー将軍→サブクラス
クラスもメタクラスのインスタンスだから、 インスタンスが主役ということでおk、みたいな話か?
決定的な違いは、メタ視点を持てているかどうかだろうな 明らかに不自由な設計やコーディングをしているのは明白なのだが 目が見えていないので、それを理解するのが困難になっているような気がする。
219 :
163 :2008/05/14(水) 09:30:42
皆さん、いろいろとアドバイス頂き有難う御座います。 すこしスレが荒れ気味ですが、これは私の無知を175さんが丁寧に ご指導してくださった点から始まっているかと思います。 原因は私にあります。スレを汚して申し分けありません。 最近良く思うのですが、OOPの浸透が何故遅いかと、 1)基本概念と実装に大きな開きがありすぎる。 2)考え方に様々な歴史や諸説があり、人や本によって解釈が異なる。 (人によって解釈が異なるのは、読んだ本の年代が大きく依存しているんでしょうか・・) の2点に集約してるかと思います。 OOPが不慣れなものにとっては 具体的な実装論はなかなか本の中には出てこず、 また、こーいう現場的な定石というのか考え方が定まらなくて、 悩んでいることが多いんです。 だから、175さんを始め皆様より貴重なアドバイスを頂いた件は、 非常に感謝しております。 インスタンスの件は、2論に分かれているかと思いますが、 これは馬鹿な私にでも分かるように説明した為の、言葉の綾かと思います。 長文になってしまい申し訳ありません。 とても勉強になりますた。 皆様を師匠と仰ぎ、また伺わせて頂きます!!
くだらない哲学論争は後回しにして、とりあえずクラスの利便性(哲学論争クンはこういう言い方に反発するようだけど) を体得するのがいいと思うよ。っていうかそれが一番重要。 大して難しいことじゃないから使ってれば自然とわかるよそれは。 くれぐれもOOPを外から強制された義務的なものに過ぎない、などと考えないこと。 便利だから使われてるんだよ。 OOPが浸透してないとは俺には思えないけど、もしそうであるのなら それはOOPが「つかえねえ」からじゃなくてこの業界に馬鹿が多いからだよw
質問です UDPで受信したメッセージをテキストBOXに表示する処理の方法論です。 今は、UDP受信を別スレッドで受信して。セマフォー同期ででString変数に渡し。 フォームのプロセスで、タイマー関数からセマフォーを同期で文字列を受け取って テキストBOXに表示しています。 しかし、今一つスマートでないような気がしてなりません。もっと良い方法がないでしょうか?
普通に Control.Invoke でいいんじゃねーの?
タイマースレッド内に、Invokeで受信部分を入れてみたのですが。 ダメみたいな感じでした。 問題点1 Invokeスレッドが終了しない。 問題点2 結局、セマフォーで受信の確認を取るので処理的に同じ。 ただし、使い方が悪いのかもしれない。 別スレッドから、フォームに非同期イベントが出せればいいのだけど、その方法を知らない。 きっと有るような気がします。すごく初歩的な機能かも知れない…
223が何を言ってるのか全く分からない Invoke スレッドて何?
>>224 んなこと言ったら、余計意味不明な説明が始まりかねん
で、結論
Invokeの意味を理解できてない
Invokeの使い方が間違っている
>>225 >Invokeの意味を理解できてない
その可能性もある。
>Invokeの使い方が間違っている
この問題にInvokeが適用できない。又は、別つの方法があるが使用したくない。
ちなみに、Invokeの中は一つのスレッドであることは理解していますよね?
>>222-227 出来ました。 結論:Control.Invokeが解っていなかった。無知でした。
申し訳ありません。そしてありがとうございました。
本当の主役はテレビの前のあなたです!!m9ビシッ
定数の取り扱いについての質問です。 定数宣言 public enum 定数 { MASU = 81, } 変数の定数宣言 public const int MASU = 81; この場合、配列列データ_創る場合。 private int[] tbl = new int[定数.MASU]; と private int[] tbl = new int[MASU]; どちらも同じに見えるのですが。前者を使用したほうがベターですか? 前者の方が速いですか?
enumハックを思い出した
キモい命名法だ
>>230 速さは一緒
値自体に意味があるならenumじゃなくてconstの方が適切
でもpublicならconstじゃなくてstatic readonlyにした方がいい
>>233 知らなかった知識です、ありがとうございます。
constと(static )readonlyは全く別物だから、 ちゃんと調べて使い分けるようにした方がいい
自分で書けよ
constに出来るものをstatic readonlyにした方がいい理由ってなんだよww
↑アホ
基本的にconstはクラス内でprivateに定義してその中だけで使用する。 constをアセンブリやnetmoduleまたがりで参照した場合、副作用がある。 S.DLLでpublic const A = 10 M.EXEで S.Aの表示 10 public const A = 99 に変更してS.DLLだけを再コンパイル。 M.EXEを再コンパイルしない限り結果は10のまま。
constを他のアセンブリから参照すると、参照元のアセンブリにも定数が埋め込まれる。後で値を変えたらさあ大変。 数学定数みたいに、絶対に値が変わることがないもの以外は、static readonlyにしたほうが無難。 あとはSizeとかDateTimeみたいに初期化の必要なものを、定数っぽく扱いたいときに。
それは完全に枝葉というか性質というか…全然別という意味分からないだろ constはコンパイル時に値が確定される定数、readonlyは書き込み不可な変数。 見えてくる違いとしては、constはコンパイル時に評価されるので使える範囲がちょっと広い。 定数式しか許されない属性指定内部やswitchのcase句にも使用可能。これらに使用される場合境界越えで あってもconstにする必要がある。 ちなみにenumの個々の値はconstなのでenumを等価に置き換えるならconstになる。
enumの値が変わったら大変なことになるんだな
外部に公開している列挙体を不用意に変更しちゃマズいのか。
ところでなんでcaseには定数しか書けないの?
定数じゃないと、複数該当することもあるからじゃない? まあ上から順番に比較するような仕様のやつもあるが。
あとジャンプテーブル変換
実装を簡単にするための手抜き
かといってVBのSelectCaseは自由すぎると思わないか?
selectっていうのは0,1,2,3,4... みたいに連番で並んでると それを関数ポインタの配列みたいにしてジャンプすることが出来る だから定数じゃないとどうしようもない
バカばっかw
↑暴走中。
>>251 バグを引き起こしかねない問題を含まない限り、自由度は高いに越したことはないよ
C#は新規なんだから、switch case の構文にこだわるべきじゃないとは思った
もともと、switch は C の特殊 goto label の構文な訳だし、考え方が古臭すぎる。
for 文からの脱出に break を使いたくても、switchにとられてしまうとかダサいと思うので。
フォールスルー不可能にもかかわらずbreak必須って時点で(ry
たしかに。 この辺何とかならなかったのか。 C、C++からの移行を意識してるならswitch caseと別の構文にすればいいしな
>>252 stringにもswitchは使える
その場合はif(str=="a") /*case a*/ else if(str=="b") /*case b*/ else if…
みたいなコードにコンパイルされる
>>258 たくさんあるとDictionaryを使うらしいぞ
#regionはIDEで出来るようにした方がいいと思う。
それを言語そのものに組み込むところはC#の特徴というかアピール IDEサポートを謳ってる言語なんだから
C#3.0の自動プロパティ作ると、[xxx]k_BackingField(うろ覚え)とかいうような変数が内部で生成されてるらしいんだが、これにソースコード上で属性を付加する方法ってありますか? 自動生成のプロパティにつけても自動生成される変数には付加されないみたいです。
>>261 C++にもあるよ。
てかそれなら両方サポートすればいいじゃん。
>>262 > 自動実装するプロパティ (C# プログラミング ガイド)
>
> 自動実装したプロパティでは、属性は使用できません。プロパティのバッキング フィールドで属性を使用する必要がある場合は、通常のプロパティを作成します。
プログラミングC#っていう本を買おうかと思ってるんだけど これ2年前に第4版が出たのが最後で、C#2.0対応とかVS2005対応とか書いてるよね もう今はC#3.5とかVS2008もでてるけど、近いうちに第5版とか出たりしそうかな? それとも第4版の内容でまったく問題ない?
普通に考えれば最新の機能には対応してない。それだけだ
C#3.5って出てるの?
>>267 まあ、そうだね。サンクス
>>268 ごめん、嘘ついた。NET Framework 3.5でもC#は3.0のままです
ちょっと調べてたら原書のProgramming C# 3.0ってのは去年末にでてるんだな
日本語版でないかなー
始めたばかりの俺はそれを待っている 今は猫と初めてを併用して学習中
原書買えよ
質問です。 DataGridViewで自動カラム生成機能ってありますけれど あれのカラムのフィールド名はこちらから指定できないんでしょうか? (特にReflectionを使った手法で) プロパティに属性つけるとかしたら上手くいくんじゃないかと思ってるんですが… ご存知の方いましたらお教えください。
自動生成したらフィールドも何もないと思うが、 カラムのフィールド名って具体的に何を指してる? デザイナで列を追加したときにフォームに作られる Column*フィールドの名前のことか?
>>273 すいません、あまりにも説明不足でした。
フォームのカラムのヘッダに表示される文字列のことです。
プロパティ名がそのまま文字列変換されて表示されているようなので
多分どこかで設定できるんではと思っているのですが…
Select()でプロパティ名を変えた匿名型にすればいい var e1 = ...; // 元のデータソース: IEnumerable<Hoge> var e2 = e1.Select(x => new { Bar = x.Foo, ... });
知らない文法だなぁと思ったら2008ですか…。 ちょっと調べてみます。ありがとうございます。
Seleは2005でもあるんじゃ? ラムダはデリゲートになおせばいいよ
Selectな
2005でも似たようなのを作ることは出来るがラムダ式がないと使い物にならない
2008に慣れてしまって、もうLastOrDefault()相当のコードを書くことすら面倒くさい。
282 :
デフォルトの名無しさん :2008/05/19(月) 14:21:56
WindowApplicationを作っています。 別スレッド(固定周期)でDBの値を引いてきて、Form(メインスレッド)のラベル.Text属性に値を設定する という処理を行なっていますが、 表示されるのは最初だけで、その後DBの値を変えてもラベルの値が変更されません。 どうしたらいいかご教授ください。
同一のストリームをBinaryReaderとBinaryWriteに食わせた場合、 Closeを呼び出す順番ってどうすればいいの? ついでに、フィールドで持っているストリームをメソッド内のローカルの BinaryReader/BinaryWriterに食わせた場合、仮にメソッド内でClose呼んだりusingを使ったり することを避けたとしてもBinaryReader/BinaryWriterがGCに回収されるタイミングで ストリームも強制的に閉じられてしまうんだろうか?
285 :
デフォルトの名無しさん :2008/05/19(月) 20:14:51
今、関数の引数を設定したλ式を作る時、以下のようにしているのですが、 もっと良い方法または、ライブラリにこれと同様なことをするための物はあるのでしょうか? static Func<TResult> SetArg<T1,TResult>(Func<T1,TResult> f,T1 a1) { return () => f(a1); } ... static Func<TResult> SetArg<T1,T2,T3,T4,TResult>(Func<T1,T2,T3,T4,TResult> f,T1 a1,T2 a2,T3 a3,T4 a4) { return () => f(a1,a2,a3,a4) ; }
>>285 >static Func<TResult> SetArg<T1,TResult>(Func<T1,TResult> f,T1 a1)
>{
> return () => f(a1);
>}
ライブラリに同等のものはないしもっと良い方法もない。
でもここにあげられたSetArgメソッドを使うぐらいなら
a1 => f(a1)
と毎回インラインで書けば十分だと思うよ。
>>285 今までC++使っていた人?
C++がstd::bind1stやstd::bind2ndをありがたがって使っているのは
今までC++に簡潔なラムダ式が存在しなかったという特殊事情もあるので
C# 3.0で無理してまねる必要は無いと思うよ。
C#だとSetArgみたいなのを作ってもインライン展開されないしね。
なんかすごいレベルの高い話してる・・・
慣れてないだけだよ 解ればそんなに難しくない
>>284 Disposeは複数回呼び出されても大丈夫だから,続けて呼びさえしていれば問題ないんじゃね
BinaryReaderやBinaryWriterはファイナライザを実装してないから
それらがGCされるときにストリームが勝手に閉じられることはないよ
ストリームへの参照がどこかで繋がってる限りは大丈夫
292 :
デフォルトの名無しさん :2008/05/19(月) 21:55:05
>>286 実はそれがちょっとまずかったので、関数化したという事情があるんです、たとえば。
List<Func<int>> list ;
for(int i=0;i<100;i++)
{
Func<int> tmp = () => i + 5 ;
list.Add(tmp) ;
}
とすると、プログラムする側の気持ちとしては i には 1 , 2 , 3 , 4 , 5 となって欲しいのですが
計算が遅延しますので、i = 100 , 100 , 100 ... となってしまいます。
293 :
デフォルトの名無しさん :2008/05/19(月) 22:29:40
いやそれは遅延のせいではないんじゃ…
C#のデリゲートはクロージャでない
遅延させたいんでしょう、つかその必要がなければ、Lambdaなど使わずにその場で計算すれば済むわけだし。
Cocoaバインディング便利そうなんだけど、C#でUI作るとき同じようなもの作ったりしてる人おる?
>>292 List<Func<int>> list ;
for(int i=0;i<100;i++)
{
var j=i;
Func<int> tmp = () => j + 5 ;
list.Add(tmp) ;
}
こうすればお望みの動作にならんかったっけ?見検証ヾ(゚д゚;) スッ、スマソ。
ListView.ItemSelectionChangedイベントで選択Itemが変化したのを検出し、 別の詳細表示フォームの表示を更新する、といったことをしています。 何も選択していないときは、詳細表示では何も表示したくないので全て消去しているのですが、 ItemSelectionChangedイベントは、選択が切り替わるときに「選択解除」と「選択」の2つのイベントを発生させます。 そのため「表示の解除⇒再表示」となってしまい、妙なチラツキが発生してしまっています。 1回目の解除用のItemSelectionChangedイベントでは、次に選択が入るかどうかが分からないので、 どうやってチラツキを抑えようか困っています。 この問題を改善する方法はないでしょうか?
>>292 こういうので良いんじゃない?
var list = Enumerable.Range(0, 100).Select(i => (Func<int>)(() => i + 5)).ToList();
>>298 SelectedIndexChanged使えば?
>>297 やり方はそれでOK
そのコード自体はNullReferenceExceptionになるけどなw
てか、C#でラムダ式に(パラメータ以外の)変数を入れる場合は、
基本的にスコープを最小限して、参照型ならコピーを使うというのは
for文の条件に不動小数点数を使わないのと同じくらい常識だと思う
あと、ラムダ式をごちゃごちゃ弄る場合は式木使った方がいいと思う
MSDNのどこかに載ってるExpressionVisitor使えばいろいろ出来る
intはいつから参照型になったんだ
>>300 それも試してはいるのですが結果は一緒でした。
マニュアルには複数選択のListViewの場合は削除と追加の時に呼ばれるとありますが、
これはMultiSelect=falseの設定でも同じ仕様で動いていました。
何か設定が足りないのでしょうか?
(アイテム選択状態)
⇒別のアイテムを選択する
⇒ListView.SelectedIndexChangedが呼ばれる(選択要素数を確認すると要素数0)
⇒ListView.SelectedIndexChangedが呼ばれる(選択要素数を確認すると要素数1)
SelectedItemsだけでなく、SelectedIndicesの内容も同様です。
選択解除するタイミングはもっと限定できるんじゃないの そのタイミングでだけ消せば
>>303 何も選択してないときの処理を別コントロールにフォーカスが移ったらって条件にすれば?
PictureBoxかPanelのようなコントロールをウィンドウ上に貼り付ける場合、 一画面でどれくらいの個数までが実用的な範囲なのでしょうか? イベントをとりたいのでマーカーとして貼り付けたいのですが、 個数が多いとパフォーマンスが落ちそうで…
>>306 で、君の環境で試したらいくつでパフォーマンスが落ちたんだい?
Windowsアプリケーションから 非同期で、サービスプログラムの状態を知りたいんだけど、 1.別スレッドで周期的にサービスプログラムの状態を監視し、表示する。 以外に何かよい方法ありませんか?
そのサービスは既存のもの?
310 :
308 :2008/05/20(火) 11:54:44
>>309 新しく作成したサービスプログラムなんですが、中身の仕様は変更できません。
Panelの上にいくつかのボタン等をおいて、 そのPanelの上に同じようにPanelを重ねていって場面ごとに最前面にしたいんだけど、 Panelの大きさって全く同じじゃないとだめなのね。 大きさが違うとPanelの中のPanelって事になっちゃうみたい。 それとBringToFrontで最前面にするよりVisibleですかそうですか。
よく分からんが、それはTabControlで済ませることができない操作なのか?
>>310 相手が固定ならそれないりの方法あると思うけど、
それが何かは場合によるから、普通にポーリングでいいんじゃないかな。
サービスへの通知みたいに取れることを期待している?
>>311 試してないけど、ツリーで位置を確認して移動すれば解決する事じゃないの?
315 :
314 :2008/05/20(火) 14:31:16
>>311 いやわかった。
最前面に置いたPanelが小さいと、下のPanelが見えるって事なのかな
だから最前面以外のVisibleをfalseにしなきゃいけないんだなっていうことを言いたいのかな
だとすればそれは当然。
>>312 そだよ。でもデザイン的にタブが無い操作って事。
>>315 見えるっていうか、大きいPanelに小さなPanelが乗っかっちゃうと、小さなPanelをVisibleをtrueにしても大きなPanelがfalseなので結局表示されないって事なんだ。
たとえばPanel1とPanel2があって、Panel1に重なって小さなPanel2があったとします。
んで別のところにある二つのボタンでPanel1とPanel2を切り替えるために
private void button1_Click(object sender, EventArgs e)
{
panel1.Visible = true;
panel2.Visible = false;
}
private void button2_Click(object sender, EventArgs e)
{
panel1.Visible = false;
panel2.Visible = true;
}
こんな風に書くじゃないですか。
ところがPanel2はPanel1の中のパネルと判断されて表示されないわけです。
ちなみにPanel2が完全にPanel1に含まれていなくても大きさに関係なくPanel1上のものと判断されてしまうのです。
なので大きさも位置も完全に同じにしないと別々のパネルだと判断されないって事でした。
そして大きさも位置も完全に同じでもPanelをBringToFront()で最前面にしようとしてもダメでした。
>>316 それこそ
>>314 で直るはずだろ
今VS起動できないから具体的になんて名前のウインドウだったか忘れたけど
ツリー表示でPanel2がPanel1の子になってるはずだからD&Dして兄弟にしてやればいい
>>317 そんなツリーがあるんだ!?
従属関係を指定できれば解決する簡単な問題だったので疑問でした。
探してみます!
319 :
デフォルトの名無しさん :2008/05/21(水) 16:57:26
ドキュメントアウトライン ビューだ!
>>319 今ちょうど検索してて見つからなくて困ってたんだけどありがとう!!!
あった!
ただ確認できるだけで従属の変更は出来ないのね。
>>317 のように親子を兄弟にすると位置自体も変わってしまう。
まあでも確認できるだけでもかなり便利になりました。
コントロールの親子あるいは包含関係なら変更できるけど? そもそも、間違ってPanel2をPanel1に入れてる時点で自分に非があるのに あたかも処理系やIDEが悪いかのような論調で書かれも困る 結論としては、デザイン時にコンテナを意識してないお前が悪い てか、コンテナ意識しないとAnchorやDock使えんだろ
↑なに言ってるの?w
結論としては(キリッ って事だろ。 何の役にも立たないレス。
>>322 の言っている意味が分からないような馬鹿が偉そうに書き込まないほうがいいぞ。
どう考えても
>親子を兄弟にすると位置自体も変わってしまう。
という頭の悪い考えに対する返答だろ。
コントロールの位置座標というのはコンテナに対する相対座標なんだから、
親コンテナが変われば当然Form上における絶対座標は変わるに決まってる。
そんなことも理解できない馬鹿はおとなしくWPFアプリケーションで視覚的に
階層構造を指定できるものを使っておけということ。
フォームデザイナに頼りっぱだからそうなる。
コード上で親コンテナ.Controls.Add()で追加していけば思うような構成にするのは極めて容易い
コントロールの親子あるいは包含関係はどうやって変更するんですか?
Controls.Addすれば子になるんだろ Controls.Removeしてから別のコントロールにAddすればいいんじゃないか
変更前親コンテナ.Controls.Remove(子); 変更後親コンテナ.Controls.Add(子);
とういうことはPanel1に重ねてPanel2を配置して、 Panel2はFormの子にしたい場合はコードからしか設定できないってことでしょうか??
タブコントロールで、タブ部分だけ消したほうが早そうな
Panel2をFormに追加してから、サイズ変更でPanel1の内側に持ってけ。
>>329 というよりも、最初にPanelを同一の親コンテナの中に重ねて配置したいという時点で、
デザイナで作成するのではなく、最初からコード上でNew Panel()して
それをControlsに追加していくようにすべき。
デザイナ上でそれやろうとすると、親切にもDesigner.cs上のコードは
最前面にあるコンテナ内にコントロールを配置しようとしてくれちゃうから希望通りにならない。
ためしにpanel1とpanel2をForm上に重ねるように配置して、
片方のBackColorをBlackにして、Button1のClickイベントで交互にBringToFrontするように
してみたが、問題なく入れ替わったぞ。お前のやりたいことはまさしくこれのことだと思うが。
Windowsアプリケーションで、常に一つのフォームしか表示させなくて、色んなフォームにページ展開する時ってどのように実装しますか? シングルトンで実装するのが普通なんでしょうか? それとも1度開いたらHide()で見えなくするだけ? よろしくお願いします。
334 :
332 :2008/05/22(木) 01:37:13
>>331 そりゃ盲点だったわ。
ためしにやってみたらそれでも大丈夫っぽいね
タブコントロールのAppearanceをFlatButtons、ItemSizeを0,1、SizeModeをFixedにすれば、あら不思議
>>330 そんなこと出来るんですかー。
>>331 ドキュメントアウトライン見ながら方向キーで調節したり、
Locateを手打ちしたりして注意しながら配置すれば出来るんですけど、
マウス操作だと親子関係が、ドキュメントアウトラインで親子関係を変えると位置が、それぞれ変わっちゃいますね。
特に後者の挙動は意味不明ですw
せっかくのGUIデザイナなのに感覚的に操作出来ないのは面倒ですね。。
>>336 どうしてもデザイナにこだわるならExpressionBlend使ってWPFアプリ作れっての。
あれだとお前のやりたいことが全部感覚的にできるぞ。
あと、
>特に後者の挙動は意味不明ですw
>>325 を百回読め。コンテナが変われば位置が変わるってことが理解できない頭なら
プログラミングなんて向いてないからやめておけ。
>>332 最前面にあるコンテナの子にしてくれるのは感覚的にも動作的に問題ないけど
ドキュメントアウトラインで親子関係解消すると位置が変わっちゃうのは意味不明だけどね。
他の操作でその位置に出来るのになぜ変わるのかと。
>>335 あら不思議!
ありがとー。
>>337 親コンテナが変われば相対座標が変わるって言いたいんだろうけど
それは問題になってないんですぅ。
GUIで親子関係を解消したら新親の座標に変換してくれたほうが直感的です。
しかもマウス操作したら旧親の子になってしまう座標ならなおさらです。
>>339 何を言ってるんだか意味不明な気がする。
341 :
337 :2008/05/22(木) 13:59:41
>>339 いや、まあもう何も言わんからおとなしくWPFで作ったら?
君の言うGUIデザイナを使って「直感的」に作成できるからさ。
ツールに文句つけるわりには、それを解消したツールがあってもそっちを使おうとしないんだねぇ。
WPFとかXAMLの勉強するのは嫌だけどWPF&XAMLの機能を求めているわけだ。
だだをこねている子供にしか見えん。
よく論点が違うって言われない?
言われない
聞く耳持たねえ
WPFが直感的だと!?
うん
WPFはスレ違いだしもう何も言わなくていいですー
337みたいな質問者の求めてる回答をしない香具師はただの荒しでしかないから^^
348みたいな質問者の求めてる回答をしない香具師はただの荒しでしかないから^^
どうでもいいけど関係ない話するな
349みたいな質問者の求めてる回答をしない香具師はただの荒しでしかないから^^
351みたいな質問者の求めてる回答をしない香具師はただの荒しでしかないから^^
WPFがスレ違いならFormの話もスレ違いだろう
Expression高いしVSのWPFエディタはうんこだし WPFは爆死の臭いしかしない
C#でDataGridViewから派生したクラスを使いたいんですけど Form1.cs[デザイン]を開いて そこにDataGridViewを張り付けて そのあとに Form1.Designer.cs の System.Windows.Forms.DataGridView を MyNameSpace.MyDataGridView に書き換えるとかそういうことをするんですか? そんなはず無いと思うので正しいやりかたを教えてください。
派生させたクラスがツールボックスに出てるだろう。
>>356 出てますね...
ありがとうございます。
すみません、初心者的で申し訳ないのですが、質問させてください。 以下のコードを実行すると、クラスAのセッターを使ってAのプライベート変数に2を代入したいにも関わらず 既定値の0が用いられてしまいます。 警告内容は以下の通りです。 「フィールド 'NAME1.A.x' は割り当てられません。常に既定値 0 を使用します。」 また、付随する質問ですが、void func_A( temp ) { x... }をvoid func_A( temp ) { X... }とすればきちんと2がセットされます。 クラス内であるにも関わらずセッターXを用いる必要があるのはなぜでしょうか。 なお、コンパイル環境はVisual C# Express Editon 2008です。
359 :
KKK :2008/05/23(金) 13:56:15
こんにちは。 はじめましてRayです。 私は大学4年生ですが、最近は大学は週に一回くらいしか行かないのですが、 就活の準備など、家にいることが多くなりました。 しかし、斜め向かいに住んでいる茨城という若い夫婦が嫌がらせをしてきます。 @近所をうろAしたり、家の窓から私の部屋を覗いてきて、部屋に「○○の本がある」などと近所のほかのオバサンに報告したり、 A布団たたきでものすごい音で布団をいつまでもたたきます。 (体格がいいオバサンなので、すごい音がします;;) B私が家にいるのを知っていて近所のオバサンと大きな声で悪口を言ってきます (「Rayが就職なんかできるわけないじゃない!」など・・) C茨城(夫)は部屋を覗くだけでなく、夜になると咳払いなどをしていつまでも近所をうろついています。 気持ち悪いので、弁護士や市の職員に相談しましたが、なかA証拠が取れなく、裁判まで持ち込めない状況です。 D車のエンジンをいつまでもかけ、うるさくする。 とにかく精神的にも滅入っていて、解決したいのですが、できない状況です。 ほかの近所のオバサンも私が困っているのを見て喜んでいるみたいです。 なんとかしたいので、誰か相談にのってくださぃ。 アドバイス待ってます。
amespace NAME1 { class A { // メンバ private x; ← ここで警告が出る // メソッド public void func_A( temp ) { x... }; ← ここでx=0として計算してしまう // アクセッサ public X { get; set; } }}
using System; using System.Collections.Generic; ・ ・ ・ using NAME1 namespace ConsoleApp { class Main { static void Main(string[] args) { // クラスAを配列としてインスタンス化、xに2をセット n ; A[] arrayA_ = new A[ n ]; for ( int i = 0; i < n; i++ ) { arrayA_[ i ] = new A(); arrayA_[ i ].X = 2; } // メソッドの呼び出し temp; for ( int i = 0; i < n; i++ ) { arrayA_[ i ].func_A( temp ); } }}}
>>360 xの型もXの型もgetアクセサの中身もsetアクセサの中身も書け
363 :
358 :2008/05/23(金) 14:16:40
private double x; public double X { get; set; } です。アクセッサの表記は、.NETのver2かver3でこのように書けるので、それを利用してます。
ヘルプなりで「自動実装するプロパティ」調べれ どうして X が x を知ってる?
365 :
358 :2008/05/23(金) 14:49:06
ヘルプを読んだ結果、 >自動実装したプロパティでは、属性は使用できません。 >プロパティのバッキング フィールドで属性を使用する必要がある場合は、通常のプロパティを作成します に関連がありそうだとは思うのですが、意味がよくわかりません・・・。
X プロパティは x に対応しないよ。
それだと、 private double _X; みたいなのが内部で自動生成されて public double X { get { return _X; } set { _X = value; } }
368 :
358 :2008/05/23(金) 15:03:32
つまり、 class{ double x; double X{get;set;} } と書くのは誤りで、 class{ double x{get;set;} } と書けばよいということですか?
ファイルの読み書き単位でエンコーディングを指定するのではなく、 プログラム全体でエンコーディングをしているする方法はないですか?
>>368 private double x;
と
public double X { get; set; }
は別物だよ。
xをプロパティとしたいなら
public double X { get{return x;} set{x=value;} }
自動プロパティを使いたいならprivate double x;は消して
public double X { get; set; }だけにして、Xを変数のように使えばいいよ。
ただその場合はprivateではないけどね。
>>369 CreateStreamReaderAsShiftJIS/CreateStreamWriterUTF8メソッドでも用意しとけば?
372 :
デフォルトの名無しさん :2008/05/23(金) 17:04:01
初心者ですが質問させてください。 Webbrowserコンポーネント(Webbrowser1)でgoogleを表示しておいて、 ソフトのTextBox(TextBox1)に検索ワードを入力して、Button(Button1)を押したら、 Webbrowser側に検索ワードが読み込まれて自動で検索するようにしたいんですが、 どのようにすればいいか検討がつきません。 開発環境はVisualstudio2005、言語はC#です。
コンポーネントでの表示が必要なの? httpで通信するってんじゃだめかい?
>>372 事前にgoogleを表示しとく意味があるのか?
取り敢えず適当にgoogleで検索して検索結果画面のURL調べれ
あとSystem.Web.HttpUtilityのUrlEncodeとUrlDecode調べれ
>>373 webにいろいろと自動入力するシステムを作らないといけなくなりまして。
たとえばブログにあらかじめTextboxに入れておいたIDとパスを入れて自動ログインするとか
そういったものなんですけど、webのフォームに、Textboxから値を入れる方法が知りたくて、
Googleはそのたとえのつもりでした。
http通信?の意味がよくわからないんですが、ソフト内のブラウザ上で表示させる必要はあります。
>>374 Googleっていうたとえが悪かったですね。ごめんなさい。
>>375 で書いたように、Webサイト上のフォームにソフトのTextBoxで記載したワードを記入するのが目的です。
WebRequest を使って WebResponse を取得し、 その内容を反映させては。
素直にHTTP POSTしろよ低脳。 こんなの厨房でも出来るぞ
379 :
デフォルトの名無しさん :2008/05/23(金) 17:39:43
>>377 どのメソッドを使えばいいかわからなかったので、ググってみたらできそうです、ありがとうございます。
>>378 HTTP POSTで検索したらそれらしいのがでてきました。ありがとうございます。
おい小学生かもしれねえだろうが
>>368 おそらくやりたいことは
public double X { get; private set; }
これだけでいいと思われる。
これでXのセッターはprivateになる。
382 :
デフォルトの名無しさん :2008/05/23(金) 17:43:52
>>380 そのとおりです小学校3年生です。
バカな質問してすいませんでした。
>>381 自動プロパティのセッタゲッタの片方だけのプロテクションを帰ることは出来ないよ。
>>384 いきなりどうしたの?
俺ができてるからそう書き込んでるんだけど。
俺もプロパティはほとんど public Foo Foo{ get; private set; } だな 普通のプロパティなんてかったるくて書いてられん
>>384 知ったか?
それとも何か他に深い意味があるの?
388 :
358 :2008/05/23(金) 18:08:21
うまく書けるようになりました。 ありがとうございました。
>>372 まあ、解決したならそれでいいけど、これでいいよ。
private void button1_Click(object sender, EventArgs e)
{
HtmlElement input = webBrowser1.Document.All.GetElementsByName("q")[0];
HtmlElement form = webBrowser1.Document.All.GetElementsByName("f")[0];
input.SetAttribute("Value", textBox1.Text);
form.InvokeMember("submit");
}
>>378 ログイン処理とかだと、ログイン前のセッションクッキー引き回しとか、
JavaScriptによるワンタイムキーの生成とかが必要になると、そのへんは
ブラウザに任せた方がはるかに簡単。
391 :
デフォルトの名無しさん :2008/05/23(金) 19:21:51
>>389 さん、ありがとうございます!
検索してもわからず、困っていたところでした。
("q")と("f")のところにhtmlからそのフォームのnameをもってきたらいいということですか?
やってみます!またできたら報告しますね。
Hashtableから値取り出すときにキャストしないでいい方法はない? 面倒くさいんですけどん。
VS2005以降ならDictionaryを使う
>>393 サンクスです。
こんなのがあったんですね。
GenericはC#2.0の最大の目玉じゃないか…
>>390 やろうと思えばできる。
IDとパスのINPUTタグのIDを調べ
>>389 のようにIDとパスを入力し、
こいつらを管轄するフォームでsubmitする。
ヒント:javascriptを実行してからsubmitを行う。
windowsアプリなんですが、メインのフォーム内のメソッドで そのフォームがもってるある型の変数全部の値を一括で変更 する方法はありますか? おねがいします。
リフレクションを使います
>>396 javascriptは全然わからないから詰まってます。
submit()を実行すると無限に更新されるみたいなのですが・・・。
htmlソースみるとLoginLeftFormCheck()を呼び出してるみたいなのですが関係ないですかね。
400 :
390 :2008/05/23(金) 21:04:58
意味も分からずコピペなんですけど、
public Form1()
{
InitializeComponent();
webBrowser1.Url = new Uri("
http://suddenattack.redbanana.jp/index.asp ");
}
private void button1_Click(object sender, EventArgs e)
{
HtmlElement id = webBrowser1.Document.All.GetElementsByName("user_id")[0];
HtmlElement pass = webBrowser1.Document.All.GetElementsByName("user_pwd")[0];
id.SetAttribute("Value", "aaaaa");
pass.SetAttribute("Value", "bbbbbb");
}
こんな感じでフォームに文字が入りました。
あとはログインボタン押して、ゲームスタートボタン押すだけなんですが・・・
402 :
デフォルトの名無しさん :2008/05/23(金) 21:06:25
>>400 ログインボタン、エンターキーおしたらいけないの?
>>399 JavaScriptもわからないようならC#とか無理だから諦めろ。
なでしこでもやってろ
405 :
390 :2008/05/23(金) 21:11:35
>>401 実行するってことはInvokeMember("LoginLeftFormCheck")ってことですかね?
>>402 フォーム上ならエンターキーでもログインできます。
406 :
401 :2008/05/23(金) 21:28:18
すまん。VS2005についているWebBrowserは詳しくないんだ。 COMコンポーネントのMicrosoft Web Browserコントロールと、Microsoft.mshtmlというライブラリでしか 俺はできないんだ。(メソッドやら何やらがわかりやすい。) Microsoft.mshtmlは.NetFramework1.0にしかついてこんのだ。 で、このMicrosoft.mshtmlを使ったやり方で説明すると、 ・・・・・ Dim id As mshtml.HTMLInputElement = doc.getElementById("ID_user_pwd") id.value = "id" Dim pwd As mshtml.HTMLInputElement = doc.getElementById("ID_user_pwd") pwd.value = "password" doc.parentWindow.execScript("LoginLeftFormCheck()") ' LoginLeftFormCheck()を実行 pwd.form.submit() ' フォームをsubmit(これはInvokeMemberでできるとおもわれ) これでログインできる。 ゲームのスタートボタンはFlashであるために、プログラム上で操作する方法があるかもしれないが、 俺は残念ながらわからんかった。 まえ、ガンストの自動ログインツールを作成したときは、画面にブラウザを貼り付けて、 ゲームのスタートボタンが確実に見えるサイズに広げて、APIでマウスを操作するプログラムを書くという 逃げ道でやった。
Windowsアプリケーション学習用にC#をやろうと思っています。 Microsoft Visual C# 2008 Express EditionをSDKとSQL Serverつきでインストールしました。 しかし何をどう作っていったらいいかわかりません。 プログラム経験はPHPでWebプログラム(こちらは趣味で3年以上やっていて2ch風掲示板ぐらいのものは作れます)、 あとオブジェクト指向の勉強にJavaを少しいじった程度です。 Javaでは簡単なファイル操作から、オブジェクトの継承や例外処理など基本的な勉強しかしていません。 Webプログラムはイメージ的にわかるので、ASP.NETあたりはなんとか理解できると思うのですが、 Windowsアプリケーションとなると右も左もわかりません。 まずは何をやったらいいのでしょうか?
何をやりたいの?
410 :
407 :2008/05/23(金) 22:04:58
>>408 とりあえずWebアプリケーションでいうチャットやカウンターのような位置づけなものを作ってみたいです。
(ようするに簡単なものです)
おそらくメモ帳のようなものになるのでしょうか?
ペイントのようなものも作ってみたいですが、メモ帳に比べると難易度はあがりそうですね。
簡単なテーブルゲームなんかも作ってみたいですが、アルゴリズムの勉強はしてないので少し厳しそうです。
>>409 了解です。そちらで質問しなおします。
411 :
390 :2008/05/23(金) 22:15:45
>>406 どうもありがとうございます。
webBrowser1.Url = new Uri("javascript:" + Uri.EscapeDataString("LoginLeftFormCheck();"));
で無理やり実行してみたらfalseが返ってきちゃいました。
マウス操作も考えたんですけど、ブラウザやマウスが勝手に動く様が見えちゃいますよね。。
412 :
397 :2008/05/23(金) 22:32:25
すいません。リフレクションを使っても取り出せるのは 型情報でインタンスの値は取り出せないのではないでしょうか? もう少しキーワード教えてください。
型情報からフィールド一覧取れるだろ FieldInfoから値取得できる
414 :
401 :2008/05/23(金) 22:51:20
>>406 いや、LoginLeftFormCheckは単に実行するだけでOK。
submitすりゃ、ログインされる。
javascriptは多分InvokeScriptでできない?
マウスは勝手に動くようにみえちゃう。これは仕方ない。
ここはなにを話すスレ?
C#プログラマの雑談スレ
>>1 >(#゚ー゚)つ < C#、.NETの話題はこちらでどうぞ。
C#プログラマの雑談スレなんて限定的には書いてないけど?
しかもスレタイは「相談室」だぞ
419 :
397 :2008/05/23(金) 23:44:32
FieldInfoのGetValue,SetValueでできました。 ありがとうございます。
420 :
デフォルトの名無しさん :2008/05/23(金) 23:55:28
JRq8rZjk7c 鳥解析4649
私怨乙
422 :
390 :2008/05/24(土) 01:09:12
>>414 ありがとうございました。
ゲームスタートのFlashもjavascriptを呼んでいましたので直接呼んだら開始できました!
>>416 C#、.NET(ただし、C#を使っている前提)に関することで、
主にふらっとだとアレな話題や雑談とかのスレ
と、俺は解釈してる
ここで質問すること自体は悪いとは思わないが、
ふらっとの方がより適切だとも思ってる
ふらっとは初心者用だから。 回答者も初心者スレにいなかったら結局このスレに質問しに来るのでは? たらい回しはいかんよ。
俺はふらっとが初心者用でこっちが中級者の集まりだと思っていた。 こっちでの質問はOOPとか言語仕様なりの高度な質問になる感じ
そんなの主観的なんだからどっちだっていいだろ。 質問者が初心者と自覚した場合ふらっとに行けばいいと思うよ。 ただそれだけ。
複数あるのは害でしかない みんなわかってるはずだ
>>424 心配無用。
どうせ皆も両方見てるんでしょ。
どっちか削るとしたら明らかに初心者用だよな。 で、もし削ったとしたら初心者隔離スレも欲しくなるよな。 ここまで言えばわかるよな。
ぬるぽ
>そんなの主観的なんだからどっちだっていいだろ。 >質問者が初心者と自覚した場合ふらっとに行けばいいと思うよ。 えてしてその主観が間違ってるから問題になるんだが。
オレが全部答えてやんよ だからもう喧嘩するな
整数5ずつにしたいのですが……うまく言えないのですが、例えば、 96なら95、98なら100、53なら55、42なら40 と言うふうにしたいのですが、どうすればいいでしょうか?
C#で自作した外部アプリケーションを呼び出したいのですが、 Process process = new Process() ; process.StartInfo.FileName = "hoge.exe" ; process.Start() ; こんな風に実行することが出来るようなのですが、 外部アプリケーション側に文字列を複数与えたいのです。 その場合呼び出す側と呼び出される側はどのような準備をすればいいのでしょうか?
>>434 問題を定義しなおしてから来い。
>>435 Process.Start(hoge.exe,"arbitrary string");
俺は
>>434 の言いたい事がわかったが次にどう書いてくるか楽しみなので伏せておく。
>>434 int number;
number = 適当な数値;
if (number % 10 < 4) number = number - (number % 10);
else number = number + 10 - (number % 10);
適当に今思いついたがこんなんで良いか?
あ、5ずつか普通に四捨五入してるわこれ
440 :
435 :2008/05/24(土) 18:00:09
>>436 文字列を複数渡したいのですが
Process.Startの第二引数はstring[]でもいいのですか?
それと受け取る側はどうすればいいのでしょう?
>>438 ありがとうございます。
さっそく導入してみたのですが、これだとただの10ずつになってしまうのですが……。
っと書いていたら439の返事がきました。
ありがとうございます。
こういうのも四捨五入というのですか……。
勉強になりました。
>>440 無理。記号を決めてそれを受け取る側で改行と見なすくらいしかない
>>438 の使って
if (number % 10 < 5) number = number - (number % 10)+5;
else number = number + 10 - (number % 10);
でいいんじゃね?
あ、ちょっといじったらできました。 もうちょっとテストして、また報告させていただきます。 本当にありがとうございました。
連投失礼します。
>>443 ありがとうございます。
それでいけそうです。
これまたもう少しテストしてきます。
こうでしょ。 int mod = x % 5; x += mod > 2 ? 5 - mod : -mod;
>>442 string一つだけなのですか。
受け取る側はどうすればいいですか?
受け取る側はコンソールではなくフォームアプリケーションです。
>>447 スペース区切りとかで渡して、
splitで分割するなりすればいいんじゃね?
>>446 ありがとうございます。
>>443 さんの方法だと、きりのいい数字だとちょっとおかしくなるようでした。
446さんの方法は私程度にはどういう処理をしているのかさっぱりなのですが、
問題なく使えます。
みなさん本当にありがとうございました。
450 :
435 :2008/05/24(土) 18:30:42
Environment.CommandLineで受け取るか、 コンソールと変わらずにエントリポイントから受け取ればいいんですね。
>>431 AutoNullpoOudaki gattu = new AutoNullpoOudaki();
gattu.Execute();
>>452 そのページにある「ソース一式」のところからソース落して、
中身の「MyMath\CodeDom.cs」の中にその GetExpressionFrom の実体がある。
ちなみに、そのソースの GetExpressionFrom はまさに、その 「CodeDomでFuncを返すメソッドを持つクラスをコンパイルして実行して呼び出せば」 をやってるだけ。 もう少しまともな方法、確かに欲しいよね。
>>453 さんくすこ。
てっきり.NET3.5以降で追加されたのかと思ってた・・・orz
CocoaのようなKVCとかやるためにリフレクションからコード生成→lambdaにしてそれなりに高速にアクセスみたいなことしたかったんだが・・・
場合によって、無理やりコンパイルでlambda変換するようにしようかな・・・
あぁ書いてて思ったが、式ツリー手動でいじくればいいのか。よくわからんがやってみるノシ
456 :
デフォルトの名無しさん :2008/05/24(土) 20:04:19
Compact Frameworkでやっててもこっちで大丈夫ですか? もし適切なところが他にありましたら誘導お願いします(´・ω・`) ボタン押したらwavファイルをプログラムに埋め込んで、ボタン押されたらそれを再生させたいんですが、上手く再生されません。 hi.wavが再生させたいファイルです。 private void button1_Click(object sender, EventArgs e) { System.Reflection.Assembly a = System.Reflection.Assembly.GetExecutingAssembly(); string file = a.GetName().Name + ".hi.wav"; System.IO.Stream s = a.GetManifestResourceStream(file); SoundPlayer player = new SoundPlayer(s); player.Play(); } サンプルを見ながらこのようなソースを組んで、 プロジェクトのプロパティのリソースのところにhi.wavを追加して、 Persistenceを「.resxに埋め込まれました」に設定しました。 しかし、動かしてみると標準のビープ音しかなりません。 デバッガで見ると、sがnullのままのようで、ファイルを読み込んでいないようです。 埋め込み方が間違ってるんでしょうか・・・。 よろしくお願いします(´・ω・`)
>>456 SoundPlayer player = new SoundPlayer("path");
player.PlaySync();
メッセージとしてスウェーデン語文字を表示させたいのですが、 なぜか読み込んでくれずにエラーが起きてしまいます どうしたらよいのでしょうか
459 :
456 :2008/05/24(土) 20:42:51
>>457 ありがとうございます。実際にwavファイル置いてパス指定して音を鳴らすことは問題なくできるんですが、
埋め込めたら良いなぁ・・・ってことなんです。
もしかして、埋め込みは無理ってことですか?
>>458 取りあえずエラーとやらに付随してるメッセージを読み上げるといいよ
>>462 今からググってきます。ありがとうございました
レベルの低い質問で申し訳ありません。 出力の種類を「クラスライブラリ」としてあるプロジェクトを、スタートアッププロジェクトに設定した他のプロジェクトに参照させるにはどうすればよいのでしょうか。 そのままusingしようとしても「名前空間がない」と言われてしまいます。
>>464 ソリューションエクスプローラで参照したいプロジェクトを右クリックして
参照の追加 → プロジェクト
>>434 今更だけど、要は「5の倍数への丸め」、もしくは「丸め幅5での丸め」でしょ?
個人的には汎用的なこれを使いたいところ
var y = (int)Math.Round((decimal)x / n) * n;
まあ、整数型に限定してもこんなところじゃないか
var y = (x + (n / 2)) / n * n;
因みに、後者はaway from zeroだが、前者はRound()のmode指定で選択可
対象が整数値で、かつ丸め幅が奇数ならどちらでも同じ
>>456 もしかしたら、Compact Frameworkじゃ違うかもしれないけど
多分、その方法はファイルをresxに埋め込まない古いやり方。
wavファイルをプロジェクトに追加して
ビルドアクションを「埋め込まれたリソース」にすれば、
その方法で鳴る筈。
んで、2005以降は、リソースエディタを使ってresxに埋め込んで、
"HI"がリソース名になったとしたら、
System.IO.Stream s = Properties.Resources.HI;
SoundPlayer player = new SoundPlayer(s);
player.Play();
で一応鳴る。
でも、ストリームのWAVEデーターの再生は、
GC絡みで問題があるらしい。
詳しくはこれを。
ttp://dobon.net/vb/dotnet/programing/playembeddedwave.html
ソースを解析したうえでデバッグしてくれと。
ってそもそもスレ違いじゃん
何でもう消えてるんだよ。ちょっと見てみたかった
キャッシュ漁ったら見つけた
型に格納できる値の最大値、最小値を返す関数はありますか? 例えば、unsigned intなら0か4294967295を返せる、といったような。 変数の型の範囲を超えるような値が格納されそうになった場合、エラーを出すような関数を作ろうと思っているので。
MaxValue/MinValueじゃ足りんのか?
そんなの、泣けりゃじぶんで定義して返せよ
479 :
デフォルトの名無しさん :2008/05/25(日) 00:24:16
LL言語のWWW::Mechanize的なのを探してます。 C#や.NET Framework向けのwebスクレイピングライブラリはないですか? 検索してたのですが、なかなか見つからないや・・・
スレ違い
>>478 いやいや、476はMaxValue/MinValueを知った上でそういう関数が欲しいんじゃなくて、
ただ単に MaxValue/MinValueの存在を知らないだけじゃないかと。
関数はまあ見逃すとしてもunsigned intなんて言ってる時点でスレ違いである事に気付こうな
>>482 しっかり読んでなかったw
それはちゃんと、「C# は C/C++ とは違いますよ」誘導してやろうよ。
>>477 ありがとうございます。
>>481 その通りです。低レベルすぎてすみません。
>>482 C#ではUInt32って書くんですね。ありがとうございます、勉強になりました。
486 :
デフォルトの名無しさん :2008/05/25(日) 01:45:22
>>483 クッキーとか面倒なところを良きにはからってくれるのはないっぽいですね。
LLと組み合わせるしかないか・・・
GUI楽したいので.NET使いたかったけど、うまくいくかなあ
とりあえうずありがとう。
いろいろ試してみます
2005のPropertyGridについて質問 プロパティタブをいくつか追加したりしてるんだが ボタンに使われる画像の色が PropertyTab.Bitmap で retuen した Format32bppArgb の画像と微妙に違う 見た感じは大体同じなんだが、実際のRGBを調べるとほんの少しずれてたりする 何か色数の制限があるのなら、それに合わせた画像にするんだけど分かる人いる?
488 :
456 :2008/05/25(日) 08:59:21
>>468 ありがとうございます。
ビルドアクションを「埋め込まれたリソース」には一応変更していたんですが、鳴りませんでした。
・・・とおもったら、hi.wavが(.resxに埋め込む操作したとき)Resourceフォルダの中に入ったままビルドアクションを変更していたので、
常識的に考えて鳴りませんね。プロジェクトのディレクトリ直下に移して無事鳴りました。
あと、
System.IO.Stream s = Properties.Resources.HI;
SoundPlayer player = new SoundPlayer(s);
player.Play();
も、そのサイトを見つけたときにやってみたんですが、
CompactだとProperties.Resources.hiがstreamじゃなくてbyte[]を返してくるんで使えませんでした。
・・・って思ってたんですが、
byte[] hibyte = Properties.Resources.hi;
MemoryStream s = new MemoryStream(hibyte);
player.PlaySync();
すればすむ話ですねo. . ...rz
昨日の数時間は何だったんだ・・・
1日置くと急に分かったりするもんですね(´・ω・`)
本当にありがとうございました。
489 :
456 :2008/05/25(日) 09:03:19
byte[] hibyte = Properties.Resources.hi;
MemoryStream s = new MemoryStream(hibyte);
SoundPlayer player = new SoundPlayer(s);
player.PlaySync();
の誤りです。すいません。
あと、
>>456 ではPlay()使ってますが、
特に非同期再生が必要なわけではないので、GC絡みのを回避するためにもPlaySync()を使おうと思います。
質問です ネットの初心者向けサイトを見ながらC#をやっていたんですがそろそろきつくなってきました とくにデリゲートをイベントハンドラとして実装するところと、イテレータがよくわかりません 初心者から中級者にレベルアップするために買うべき本を教えてください
C#用のDXライブラリと言うものがあったので早速使ってみたのですが、エラーが出ました。 空のプロジェクトに参照をDLLを追加し、Class.csファイルを作り、メインメソッドに DxLibrary.DxLib_Init(); と書いただけなのですが、 DLL 'DxLibDll.dll' を読み込めません: 指定されたモジュールが見つかりません。 (HRESULT からの例外: 0x8007007E) と出てしまいます。 DLLはあらゆる場所に配置して試したのですが、 やはり同じようにエラーがでます。 何か特別な書き方が必要なのでしょうか?
DXライブラリの公式サイトで提供されてる方のC#用DXライブラリを使え 使い方も丁寧に書かれてる
>>492 ありがとうございます。
いつのまにか出てたのですか!?
なぜエラーが出たのかは未だ不明ですが、早速使ってみたいと思います。
494 :
デフォルトの名無しさん :2008/05/26(月) 15:17:26
質問です。 2つのスレッドでそれぞれフォームを作成し表示します。 このとき、これらフォームの表示順位(重なり)を コントロールすることは可能でしょうか? なんか、デバッカ上とSetup後のプログラムで表示順がことなって メッセージボックスが隠れたりする・・
構造体の中で1次元配列メンバを持つには struct A{ public fixed double b[123]; }; でいけますが、 構造体の中で2次元配列メンバを持たせるために struct A{ public fixed double b[123][234]; }; などとやってもエラーになります。 構造体の中で2次元配列メンバを持たせることは可能でしょうか?
質問です。 クラスの配列をインスタンス化するのにforを使って次のようにやってるんですが、 もしもっとスタンダードな方法があったら教えてください。 for文の中でインスタンス化すると、スコープから出ると消えちゃうような感覚がして気持ち悪いんです。 classA{} A[] a = new A[n] for(int i = 0; i < n; i++){ a[i] = new A(); }
狂っているその感覚を修正する事をお勧めします。
それで十分スタンダード > for文の中でインスタンス化すると、スコープから出ると消えちゃうような感覚がして気持ち悪いんです。 この感覚を何とかしたほうがいい
もしかして A[] a = new A[n] ← classA型の変数を宣言 a[i] = new A(); ← 実際に代入 つまり、for文の中では代入行為しかやってないから消えない、ということですか?
GCのアルゴリズムを理解した方がいいよ。 GCってのは「参照できる限りは消えない」 例えばnが1なら、forを抜けても a[0]を参照できるでしょ? で、参照できるので消えない。
了解しました。勉強します。
というかスコープを勉強したほうがいいだろ
スコープは割と正しく理解出来てるような発言に見えるけど?
GCとは全く関係ないだろ。 スコープの話をしてると思うんだが。
コンストラクタでフィールドにインスタンスを代入したら不自然か
なんでGCが出てきたんだw
↑遅れてきたアホ
確かにマオは四川省だったから ヤバスwww
スマソ、誤爆った
newしたものはアクセスできるなら消えない
.NETのGCはスコープより早く働くことがあるから要注意なんだよね。たとえば static void Main() { Hoge hoge = new Hoge(); hoge.Foo(); // hogeが参照されるのはここが最後 // 時間のかかる処理 } hogeがまだスコープ内にあるにもかかわらず、時間のかかる処理の最中にGCされることがある。
↑あほ?wwwwww
そんなものに注意は不要
519 :
498 :2008/05/27(火) 01:56:25
もしかして
>>501 の理解も間違いだらけなんでしょうか?
もう少し詳しく教えていただけませんか。
>>498 はGCと関係ないよ。
厳密には関係なくないとしてあえて言うと、
new A[n]したオブジェクトはA[] aの寿命(参照が外れるまで)生きてる。
初歩的なことだとうじゃうじゃ煽りレスがついたりするのに ちょっと難しい質問だとなかったかのようにスルーするお前らワロスw
>>521 最近はROM主体だが、お前の発言が一番醜く見える。
そんなに無視されたのがくやしいのか? ちなみにどの質問なのか示してみ。
どこが難しいの?直前のネタはフラットでもスルーだろ・・・C#関係ないし
>>518 それはスコープが終了するとGCされるから、プログラマの責任でスコープを終了させんな、って話だ。
>>522 わざわざROM主体とか前置きしないとレスできないのかよw
ROM主体と言うのを何か言い訳に使ってるなら
>>525 のレスは理解出来るが、別に言い訳に使ってないじゃん
まあ、無駄な前置きではあるけど
>>526 まあ、第三者を装ってるあたりはみっともないな
>>524 それはるびまの記事の話だろう。
あのスレの
>>875 はこんなコード。GC.KeepAliveを抜いたらクラッシュする。
static void Main(string[] args)
{
VALUE state = 0;
Ruby.ruby_init();
const string funcdef =
"def foo\n" +
"s=\"FOO\"+nil\n"+
"end";
Ruby.rb_eval_string_protect(funcdef, ref state);
VALUE hoge = Ruby.rb_intern("hoge");
Ruby.CallbackArg0 func = arg => Ruby.rb_funcall(Ruby.Qnil, hoge, 0, 0);
VALUE result = Ruby.rb_protect(func, Ruby.Qnil, ref state);
GC.KeepAlive(func);
}
アンマネージな世界に渡したデリゲートを安全に保持しとくには アンマネージ側で不要になるまでGC対象にならないようにしとかなきゃならない。 てだけの話?
>>529 そういうこと。
他にも、インライン展開されたコンストラクタが完了する前にファイナライザが実行されることすらあるよ。
この場合もアンマネージな世界のハンドルの早すぎる解放であぼんする場合がある。
非同期ゲリゲートの動きを止めたいときはどうすればいいですか?
>>532 フラグやEventを使ってスレッド自身にそうさせるのが基本。
関係ない話題を知ったかでひけらかすより質問に的確に答えてあげたら?
いったい何の話だ?
すっげーすぐにレス来たww お前が関係ない話してレスが流れたんだろ。 自分で見返せ。
537 :
535 :2008/05/27(火) 16:19:20
>>536 えーと、俺はこのスレには初めて書いたものだが
流れがわからんからアンカーつけてくれないか?
どの質問の話かわからないから、答えようが無いわ。
>>531 そこのサンプル例1の解説が不正確で、プロパティの取得処理が
時間のかかる処理のためデストラクタが先に動いてしまうと読めるがそれは誤り。
もしそうであれば.NETのGCなんて安心して使えない。
それはデストラクタの使い方に重大な欠陥があるために発生する。
具体的にはExampleクラスのデストラクタで他のクラス、
この場合hashValueが参照を持つArrayクラスの後処理を書いたらいかんということ。
マネージドだけの場合は基本的にKeepAliveのことは考えなくてよい。
デストラクタが呼ばれるときには、既にメンバは解放された後なんだっけ?
微妙に違う。 ファイナライズメソッドの実行順序には何の保証もないという話。 だと思うけどリンク先見てないから確かなことは分からん。
>>539 メンバに参照型を持つ場合でも、オブジェクトとして独立してるので
デストラクタが動くタイミングやメモリが回収されるタイミングは不順。
順番が必要な場合はDispose(true)のパターンを使う。
あいや、ずっと前に読んだことあるはずでかすかな記憶によると 解放された後っていうか自分で解放してんじねーかよw って話だったかも…
一匹キティが沸いてんな・・・フラットじゃないのに
フラット!フラット!!
質問です。 フォームを2つ使うアプリを作っています。 メニューはメイン側にはありますが、サブ側は何もありません。 で、サブ側にフォーカスがある時に、メイン側のメニューのショートカットを叩いても、 フォーカスがサブ側にあるため、イベントが発動してくれません。 出来ればこのショートカットを共有したいと思っています。 サブ側でもOnKeyDownなんかで同じ関数を呼ぶようにすれば可能といえば可能ですけれど、 あまりにも美しくないなと思ってます。何か上手い方法は無いでしょうか?
ほかのウィンドウのイベントが別のウィンドウのショートカットをたたくというのは美しくないだろ。 ルートのフォームまでで処理されなかったイベントがアプリケーションのハンドルで処理されるというのが正しい形だと思う。
サブフォームでメインのOnKeyDown呼べばいいじゃん
返信ありがとうございます。
>>548 そもそもメインのフォームでイベントを処理している、ってのがおかしいってことですかね?
メインにしろサブにしろ、フォームはイベントを発行するだけで、
その実際の処理はアプリケーション級のオブジェクトがハンドルするわけですか。
MDIにしる
552 :
デフォルトの名無しさん :2008/05/28(水) 11:10:54
参照の追加
それでやるなら該当のdll参照すれ
555 :
デフォルトの名無しさん :2008/05/28(水) 11:31:31
>>553 >>554 参照追加したらありました。
たんにusingを記述するだけじゃダメだったんですね。
これでなんとかなりそうです。
ありがとうございました。
なんつう偉そうなコメントだw
なぜSystem.Arrayクラスから派生クラスを作れないんですか?
CLR的に配列は特別なオブジェクトだから
System.Arrayクラスから派生クラスが作れると何の不都合があるんですか?
CLRべったりの低レベルで特殊な実装になってるから派生したところでどうせ何もできないよ っていうかSystem.Arrayなんかそんなによく使うか? IList使えよ
CLR自体、StringとかArrayとか、その内部構造自体に 依存した最適化がかかってるからだ、 ってどっかにあった希ガス。
C++だとコンストラクタは出来るだけ初期化のみにした方がいいけど、 C#では初期化以外にもメソッド呼び出したり処理を始めちゃってもいいの?
いいよ
いかんよ
C++でコンストラクタでは継承先でオーバーライドされる仮想関数は呼べないんだったっけ C#では出来るよ
>>563 してもいいけど、内容によっては立ち上がりが異常に時間がかかるプログラムになる。
その場合、最小限の初期化コンストラクタとクラス初期化メソッドを作る場合もある。
visual studioみたいなGUIのソフト作りたいんですけど そのためのサンプルとか無いでしょうか? 具体的には フォームにメニューがいくつかあって ツールボックスがあって 左側にはエクスプローラ的な表示があって 下側にはテキストのログウィンドウがあって 残りの領域にはMDIの子フォームを生成するようなGUIです。 いかがでしょうか。
Visual StudioというGUIのサンプルがそこにあるではないか。
Visual Studio のドッキングを自前でがんばったらマジで死ねるなw
Visual Studio以上の物ができたら教えてね 試してあげるから
DockPanelSuiteマジオススメ
MonoDevelopのソースじゃ参考にならんか…
>>572 凄いが、これを駆使したプログラムを少人数で作る気になれない。
WinFormsか・・・ WPF版がほしい。
C#からWin32APIを使って子プロセスを起動し、 Win32APIのCreatePipe, WriteFile, ReadFileを用いてプロセス間通信をしようとしています このとき、立ち上げた子プロセスはコマンドを標準入力から読み込みんで処理をし、 結果を標準出力へコマンドごとに出力し、入力にEOFが来たら終了、みたいなプログラムです ここで、子プロセスがEOFを認識してくれず、子プロセスが終了してくれません なにかいい方法があるのでしょうか? それともWin32APIの質問ということでよその板の方がいいでしょうか? やっていること: ハンドルを用意 親プロセスが無名パイプを作成する パイプの一端のハンドルAを継承可能にする STARTUPINFO構造体のhStdInputに継承可能にしたパイプのハンドルAを指定 CreateProcess() 継承可能にしたパイプのハンドルAを閉じる パイプの閉じていない方のハンドルBにWriteFile() ハンドルBを閉じる ←ここで子プロセスに終了してもらいたい よろしくお願いします
そもそもWin32API使う意味がいったいどこに?
C++でパイプを使った経験があったのでパイプをやろうとして、 C#でパイプをやるためにWin32APIを使うことにしました
ProcessStartInfo.RedirectStandardInput Process.StandardInput この辺使う
なるほど 他プロセスの標準入出力を通した通信は明示的なパイプ以外に用意されていたのですね 自分で調べてた限りでは見つかってなかった情報なのでとても助かりました 試してみます ありがとうございました
string str = File.GetLastWriteTime(Path).ToString(); このようにファイルの最終更新時間を取得すると、 そのファイルのプロセスが使用中のままになるのですが、 CloseやDisposeのようにすぐに開放させるにはどうすればいいのでしょうか?
ならんが
586 :
584 :2008/05/30(金) 11:10:07
すみません。 File.GetLastWriteTimeのせいじゃありませんでした。 File.GetLastWriteTimeタンごめんんささい。
んもー
何言ってんだお前らは?釣りか? | 問 1 |(ア) (イ) (ウ) (エ) (オ) |D D D D D |C C C C C |B B B B B |A A A A A |@ @ @ @ @
誤爆りました。スマソ
590 :
579 :2008/05/31(土) 05:59:48
アドバイスいただけた方法でうまくいったので(ありがとうございます)報告します ちょっとはまった点としては、 改行コードをWriteしてもフラッシュされない →出力がほしい時はちゃんとフラッシュ 子プロセスのStdinに対するエンコーディングはProcessStartInfoから設定できない →StandardInput.BaseStreamを取得して新しくStreamWriterを作る ぐらいでした 当初の問題だったEOF云々は、Process.StandardInputのストリームを閉じると 問題なく処理されました 求めていた処理を考えていたやりかたよりずっと簡単に得られたので大満足です
591 :
デフォルトの名無しさん :2008/05/31(土) 17:29:19
今、とあるゲームの画面の各部をキャプチャして画面を認識し、指定した部分をクリックしたり文字を送ったりするプログラムを作っています。 VisualC#のデバッグモードで動かしていると、画面上の指定部分をキャプチャする関数の中で使っている、Graphics.GetHdc()の部分で、 「ArgumentExceptionはハンドルされませんでした。 使用されたパラメータが有効ではありません」 のメッセージがでて止まってしまいます。10回に1回くらいの頻度かな。 ローカル画面で変数の値をチェックしても、キャプチャ範囲に異常な値は無く(bmpのサイズなど正常)、何でこうなるのか心当たりがありましたら指摘してもらないでしょうか。 #複数の呼び出し元から、この関数が同時に呼び出されているときにこんなことおこるのかな・・・? ちなみに、キャプチャやってる関数を下に貼り付けてみます。 ----------- public Bitmap CapturePartFromA(int[] capval) { //capval[] はキャプチャ範囲を収めた配列。ここでは[3]と[4]のみ利用 Bitmap bmp; //座標系を変換する関数の戻り値保存用 int[] xxx = new int[4] { 0, 0, 0, 0 }; IntPtr hWnd = FindWindow("A Game", null); RECT winRect2 = new RECT(); GetWindowRect(hWnd, ref winRect2); //座標を変換する関数(クライアントの原点←→デスクトップの原点) xxx = ConvertCoordinates(capval); bmp = new Bitmap(capval[3], capval[4]); Graphics g = Graphics.FromImage(bmp); IntPtr hDC = g.GetHdc(); //←ここで 例外頻発 IntPtr winDC = GetDC(hWnd); BitBlt(hDC, 0, 0, bmp.Width, bmp.Height, winDC, xxx[0], xxx[1], SRCCOPY); g.ReleaseHdc(hDC); g.Dispose(); ReleaseDC(hWnd, winDC); return bmp; }
MMORPGの自動プログラムを作ってどうする、それほど他を出し抜きたいのか? こんな所に来るな。
C# = D♭
>>591 評:もっとオブラートに包んだ質問のやりかたを覚えましょう。
エロシーンまだ?
せめて「GUIのテストを自動化したいです」位のうそをつく常識を持て
HttpWebRequest使ってゆうちょダイレクトのサイトから振り込み状況を確認するアプリ作ってるんだけど、 誰かできた人いる? UserAgentとかいじってもなぜかはじかれる。 同じアプリでほかのhttpsサイトとかはログインできるんだけどなぁ。
いません
600 :
591 :2008/06/01(日) 20:49:22
ここで知恵ある人いるかと思ったのですが・・・残念。 自助努力するしかないですね。 どうもでした。
なぜかって、なんのエラーで帰ってきてるの?
UDP通信で、C#のクライアントにVC++のCプログラムからソケットでメッセージを送って表示 しているのですが。漢字が正しく表示できません。何かのコード指定だと思うのですが、 探してみたのですが見つからず。よろしければ教えてください。 C++の手順 WSAStartup(MAKEWORD(2,0), &wsaData); sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(XXXXX); // 送信先のポート番号 addr.sin_addr.S_un.S_addr = inet_addr("XXXXXXXX"); // 送信先のIP sendto(sock, str2.c_str(), str2.size(), 0, (struct sockaddr *)&addr, sizeof(addr)); closesocket(sock); WSACleanup(); 必要であればC#受け側も出します。 ちなみにc++側のプロジェクトの文字コードを有る分変えても変わりませんでした。
C#側も書こう
文字コード意識せずにネットワークとか 大方StreamReaderをEncoding未指定でnewしてんだろ
技術ある人はゆうちょダイレクトにログインするプログラムをC#でHttpWebRequestつかって組んでみてほしい。 思いのほかはまるよ。
>>601 サーバー側のエラーで帰ってきてログイン不可能。
エラーコードが書いてあるけど、意味がわからないので対応が難航してる。
>>606 (=605)
そのエラーコードを書けってことじゃないのか?
イミが分からないとか、技術ある人は作ってみ?とか
根本的にダメダメwww
サーバー側(cgi)のエラーコードなんてC#とまったく関係ないから書かなかっただけだが。
TP1/Webのエラーコードっぽいけどな。 マニュアルある人ならわかるかもしれん。 今ゆうちょダイレクトメンテ中でエラーコード再取得できなかった。
>>603 >>604 の指摘でC#側を見て下記の点ではないかと思い
enc = System.Text.Encoding.UTF8;
// enc = System.Text.Encoding.Unicode;
// enc = System.Text.Encoding.BigEndianUnicode;
localPort = XXXXX;
udp = new System.Net.Sockets.UdpClient(localPort);
コメント部分を追加してみましたが変えましたが、半角英数もまともに表示できなかったです。
元々はUTF8でした。 何がいけないのだろう?
逆ギレw
技術もないのにあおるだけのアホは放って置いてできる人よろしく!
>>614 ここで聞く前に、先ず質問の仕方を勉強してきてね
だなw
ゆうちょダイレクトは特に妙なところはなかったように記憶しているけど、 どこでひっかかってるの? 今確認しようとしたら、ちょうどサービス停止中だな。
C# 側のコードです。 どのコードを指定しても正しく表示されなかった。orz System.Net.Sockets.UdpClient udp; private Button button1; System.Text.Encoding enc; enc = System.Text.Encoding.UTF8; // enc = System.Text.Encoding.UTF7; // enc = System.Text.Encoding.ASCII; // enc = System.Text.Encoding.Unicode; // enc = System.Text.Encoding.BigEndianUnicode; localPort = XXXXXX; udp = new System.Net.Sockets.Udp System.Net.IPEndPoint remoteEP = null; byte[] rcvBytes = udp.Receive(ref remoteEP); string rcvMsg = enc.GetString(rcvBytes); udp.Close(); バッファーを見たら、シフトJISが送られてくるようでした。 わからない…orz
一部切れていました。 udp = new System.Net.Sockets.UdpClient(localPort);
Shift_JISで送られてきてるのにUTF-8でデコードとかおかしいと思わないか?
思わないでーす
なんか、荒らされてるな。 IDない板だから、釣りや煽りに反応するのはやめましょう。 質問者の暴言は、たいてい騙り。 もちろん、ときどきとんでもない質問者もいるが、いずれにせよ放置で。
技術ある人に作れって時点でネタだろ
>>620 すみません、どの記号がどの文字コードかの知識が不足しています。orz
とりあえず、ゆうちょに不正アクセスしてる奴がいると通報しとくか。 3人くらいで通報すれば目付けられるから
何が不正?
.Text.Encoding.GetEncoding(932)
とりあえず、ゆうちょにログインも出来ないアホはほっとけよ
ゆうちょの件一晩頭冷やして考えたらできました。 お騒がせしました。
結局何がまずかったの?
態度
そもそも質問してないだろ 意外とはまるからやってみぐらいの勢いだったんだが。 それを勘違いしたこまったちゃんが質問の仕方が悪いだの、態度が悪いだのってこんな匿名掲示板で言われてもなw
>>636 明らかに誰か作って教えてくれってスタンスだったけどなw
ヨチヨチwww
それはそうと、ゆうちょ興味あったら挑戦してみ。 興味なかったらいいけど。
ゆうちょダイレクトのアカウントなんて普通持っとらんがな(´・ω・`) 嵌るとかは単純に質問者の技術力不足だと思う
そうだね。 俺はそもそも技術者じゃないから技術力不足は認めるよ。 ネットショップを経営しててそれに必要な入金チェックをちょっと作ってみようかなって思っただけだし。
つ Python 無理にC#を使う必要性はない。
PythonってWinアプリ簡単に作れるの?
うん。GUIを扱うライブラリがあるし、IronPythonを使えば.netも使える
ゆうちょ房のスレ荒らしw
なるほど。 Python調べてみよう。Excelファイルいじくれるライブラリもあるといいけど。 C#始めて1ヶ月だけどフリーで開発環境まで全部まとめてインストールできるのが楽ではじめたんだよね。 今度は今手作業で集計してるバイトの勤怠管理でも作ってみるか。
ゆうちょが出てきてからスレの雰囲気がすごく悪くなった
過去スレ読んだが同じようなもんだぞ ゆうちょに粘着している奴が悪くしてんじゃね?
なんかヨチヨチレスしかできないかわいそうなやついるな
なんで技術者、学生以外でこんな板見てんだか・・・
652 :
デフォルトの名無しさん :2008/06/03(火) 02:16:25
初心者スレで同様の質問をしたのですが、相手にされなかったのでこちらで再度お聞きします。 ListViewのdetail表示時に行間を広くするにはどうしたらいいのでしょうか?
ListViewItemのStyleあたりで設定できなかったっけ? 出来なかったらごめん。
ImageList使う
お前には無理だからさっさと諦めろ。
>>652 >初心者スレで同様の質問をしたのですが、相手にされなかったのでこちらで再度お聞きします。
馬鹿じゃないの?
まじめな話。
UserControlを継承したクラスを作って クリックされた箇所に丸印を描画するようなプログラムを作るとしたとき。 Click()イベントで、クリックされた箇所を記憶し Invalidate()でPaint()イベントを呼び出してクリックされた箇所を描画する。 という動きになるのでしょうか?
はい
フォームエディタで上にコントロールを乗せないなら、 UserControlじゃなくて、ただのControlからの継承でいい。
>>658 >>659 どうもありがとうです。
ところで、趣旨が変わるんですが
折れ線(複数)グラフを書きたいのです。
ひとつの表示窓に複数のラインを書きたいのです。
そのライン単位でオブジェクトにしたいのですが、
(1)そのラインオブジェクトはControlから派生させて自分でライノブジェクト自身で描画させるべきでしょうか。
(2)それとも単なる(Control派生ではなく)オブジェクト化して、親表示窓Controlに個別に描画ルーチンを呼ぶ形にするべきでしょうか?
一般的にどうなのかなと思いまして。
(1)だったら、表示窓側の親オブジェクトは特に何も考えずに子が思いのままに描画する。
と思っていたのですが、背景処理が手間かと思えてきました。
子に当たるラインオブジェクトを描画すると親部分を上書きするからです。
リージョンを切れば親の描画部分を塗りつぶさなくても描けそうですが、折れ線なのでPATHが複雑になりすぎるかと思います。
(2)だったら特に背景塗りつぶし過ぎに関しては何も考えなくてよいのですが、
Paintルーチンで子オブジェクトにGrapicsオブジェクトを渡すサブルーチンコール形式になると思うのですが、なんだか嫌なのです。
一般的にこういうことをやりたい場合にはどうしますか?
変なことを言っているようだったら指摘してください。
拡張性を考えれば当然後者だろ
WPFなら前者だね
Excel使え
どこかにチャートコントロールあったはず
ZedGraphとか
ZenGraphってスクロール機能つけられる?
便乗で質問なんですが ZedGraphとかNplotを仕事(商用)として使ってる人いますか?
ListViewの編集はなんで先頭のカラムしかダメなの? 面倒だね。
WPFなら自由自在
いやそういう話じゃなくて。
671 :
660 :2008/06/04(水) 10:13:48
皆さま。 ZenGraphとかNplotとかあるんですね。 これらを使うかどうかはともかく、これらの実装を参考にさせてもらいます。 どうもありがとう。
Personクラスの派生クラスとして Man,Woman,Noneを考えます。 Man,Woman,NoneはPersonクラスのstaticなメソッドを介して生成されるものとします。 Man,Woman,Noneのコンストラクタのアクセシビリティをそれぞれ public,protected,privateにしております。 publicなManは生成されます。 protectedなWoman,privateなNoneは生成できません。 こういうときはコンストラクタのアクセシビリティをinternalにすればいいようです。 こういうinternalの使い方は正しいでしょうか?
クラスライブラリを作ってるなら全然アリ 単一プロジェクトなら無意味
他のアセンブリに公開するつもりがないならinternalでいいんじゃね
Man,Woman,Noneクラスは外部に見せる必要がないならこういう手もある。 やりたいこととは違うと思うがクラス自体を見えなくすればコンストラクタの隠蔽は不要になる。 public enum PersonType { Man, Woman, None }; public class Person { public static Person GetInstance(PersonType x) { switch (x) { case PersonType.Man: return new Man(); case PersonType.Woman: return new Woman(); default: return new None(); } } private class Man : Person { public Man() {} } private class Woman : Person { public Woman() {} } private class None : Person { public None() {} } } class Startup { static void Main() { Person man = Person.GetInstance(PersonType.Man); Person woman = Person.GetInstance(PersonType.Woman); Person none = Person.GetInstance(PersonType.None); } }
C++から入ると、friendが無いのがちょっと不便に感じるね。
friendは邪悪だからなくていいよ。
partial使えば内部型でもファイルを分けて書けるよ
>>676 主にテスト用途だけどFriend Assemblyってのがある。
通常はprivateな型やメソッドをテストするのに使う。
お前だけ Comparer<T>.Defaultとか例を挙げたらキリがない
ああすまんComparer<T>.Defaultは違うね Stream.Null(実際の型はStream+NullStream)とか
683 :
デフォルトの名無しさん :2008/06/04(水) 23:40:00
>>680 君だけではないよ。
Factoryってこうやらないだろ?
XmlReader.Createとかあるでしょ 一応MS的にはこういうのも「ファクトリメソッド」と呼ぶらしい
どこが変だとか、どうあるべきかとか書いてくれないと答えようがない GetEnumerator()の実装例でyield returnを使わないケースで内部クラスを使っている なおC#の内部クラスはJavaのstaticな内部クラスと同等だから誤解のないよう
というか基底クラスであるPersonクラスが具体的な派生クラスを知っているのが不自然。 気持ち悪い。
既定クラスがBuilderを兼ねてるのがいやだったらPersonとファクトリーを分離するのは問題ない。 ただ、拡張可能なようにBuilderやStrategyパターンで作ってゆくと、 クラスやインターフェイスの数がすごいことになるから過剰な汎用化には反対したい。
突然質問してごめんなさい。 皆さんはC#とかってどうやって勉強してるんですか? こないだはじめたんだけど、資料が少なくて、学習がすすみません。 いい勉強法とかオススメの書籍があれば教えてください。 ちなみに今は実際にソフトウェア作ってみて、わからないことがあったら調べて・・・って感じです。
C#で資料が少ないとか言ってたら何も覚えられん。
MSDNに全て有る
>563-567 >690 の質問とかぶると思うのですが。 オープンなC#ソースでストラテジーパターンを実現しているらしき所を見かけたので、 newのコストについて教えてください。 【ソース概要】 ・クラスConcreteAとConcreteBは同じParentStategyクラスの派生。 ・それぞれのクラスには違う条件でこの方法で状態遷移する。 void override update(){ ・・・ if(hoge<hage) {parentStategyInstance = new ConcreteA()} else {parentStategyInstance = new ConcreteB()} ・・・ } ・update()は頻繁に発生する。 ・各コンストラクタはメンバを一つ更新する一行のみ。 ・ガベコレでメモリ使用量のコストが無いことは解ったつもり。 C++ならキャスト一択の所と思うのですが、JITのおかげでこの書き方が 実は最高にスマートって事になっちゃいないか知りたいんです。 ※JITのおかげさまで、簡単にベンチテストが作れない事が問題なんです>< ※オブラートに包んだ所にミソがありそうなら、どんどん公開します。 O!S!I! O!S!I!
Stategy自体選択ミスに1票
switch最強伝説を更新するんですか? ('A`) >692
C#自体の選択ミスに1票
C#のEnum型とswitchの相性の良さは無敵だぉ!! デザパタ厨涙目! プギャー(^0^)9
>695 私もそう言う事が聞きたかったので、ありがとうございました。 是非参考になるサイトをご紹介頂きたくお願い致します。 m(_ _)m
697 :
デフォルトの名無しさん :2008/06/05(木) 09:28:56
ペイントを操作して、絵を描こうとしているのですが、 ドローイングエリアをうまくクリックしてくれません。 どなたか、どうすればいいのか教えていただけませんでしょうか? [StructLayout(LayoutKind.Sequential)] public struct RECT { public int left; public int top; public int right; public int bottom; } const uint WM_LBUTTONDOWN = 0x201; const uint WM_LBUTTONUP = 0x202; public void RemotePaint() { IntPtr hWnd; string sClassName = "MSPaintApp"; string sWindowText = null; sClassName = "AfxFrameOrView42u"; sWindowText = null; hWnd = FindWindowEx(hWnd, IntPtr.Zero, sClassName, sWindowText); SetForegroundWindow(hWnd); RECT winRect = new RECT(); GetWindowRect(hWnd, ref winRect); System.Threading.Thread.Sleep(1000); PostMessage(hWnd, WM_LBUTTONDOWN, 100, 100); System.Threading.Thread.Sleep(500); PostMessage(hWnd, WM_LBUTTONUP, 100, 100); }
>>566 サブクラスのコンストラクタが動く前に
オーバーライドされた仮想関数が呼び出されるわけで
ちょっと気持ち悪いですね。
>>691 あまりにも頻繁にUpdateが呼ばれるならやや効率は悪いだろうな。
でも多分誤差レベル。
大抵ほかの処理でそれ以上にメモリ使ってるだろうから。
ただ、作りとしてはぱっとしないな。
>ぱっとしないな ぶっちゃけそこなんです。 上の話の終わり方だと、ConcreteAとConcreteBを継承した大きなクラスを作って 処理部分だけ、switchかdelgate型で置き換え可能にする。 ・JITはswitchが強いってことは何処までか? ・一つの処理がどの程度長いとdelgate型が有利になるか? でバッチテストが作れるなと思ってました。 っていうか、そういうテストした人の本や社員のサイトがあっても良いなと。 これも「ぱっとしないな」と思ってくれたら、むしろ愉快なんですけどね。 あと >大抵ほかの処理でそれ以上にメモリ使ってるだろうから。 は 私の >・ガベコレでメモリ使用量のコストが無いことは解ったつもり。 への返事でそんなに深い意味は無いですよね? ※最大メモリ使用量より速度優先 ※速度ねらいで、ConcreteA、ConcreteBに変数名の重複を許さないぐらい程度は妥協範囲。
delegateの"e"が抜けてる。
デリゲートなんかは下手に保持しとくより毎回newした方が速いらしいね
thx delegateは捨てましょう。 …C的には、関数ポインタよりnewが早i(ry JITのnewまわりの最適化を見られれば、それでも疑問は解決できます。
704 :
702 :2008/06/05(木) 11:36:07
>>703 意味わかってる?
デリゲートが遅いって言ってるんじゃなくて,デリゲート型のオブジェクトをnewするときの話だよ
>704 ミスリードです>< すいません。 最初に戻ると、元parentStategyInstanceを持ってるクラスを作った時に、 デリゲート型のオブジェクトをnewできます。 あとは if(hoge<hage) {exceDelege = ConcreteAexceDelege} else {exceDelege = ConcreteBexceDelege} あと、 >※速度ねらいで、ConcreteA、ConcreteBに変数名の重複を許さないぐらい程度は妥協範囲。 これ、 ConcreteA、ConcreteBでずらずら並んで、20個ぐらいあったら一気に話が不毛になるな。('A`)
だから、逆なんだ。 if(hoge<hage) {exceDelege = ConcreteAexceDelege} else {exceDelege = ConcreteBexceDelege} よりも >702は if(hoge<hage) {exceDelege = new exceDelegater(ConcreteAexce)} else {exceDelege = new exceDelegater(ConcreteAexce)}
newの最適化っつっても、確保に関しては基本的にマネージヒープの 未割り当て領域へのポインタをオブジェクトサイズ分進めるだけだぞ。 もちろん頻繁にnewすればGC起動の機会を与えることになるから、 パフォーマンスを気にするならインスタンスのキャッシュは基本ではあるが。
708 :
691 :2008/06/05(木) 12:34:44
話を長引かせる様な書き方をしてしまってすいません。 >696 >700-701 >703 >705-706 まで私ですね。 >ConcreteA、ConcreteBでずらずら並んで、20個ぐらい は失言でしたが、>707にはそこまで考慮して貰ってありがとうございます。 「インスタンスのキャッシュは基本」 これを確認出来て良かったです。 ソースの出所が良い所ぽかったので、>704みたいな事は無いか色々勘ぐったんです。 <ちら裏> switchしかりnewも、CLRやJITの最適化って非線形で決めてナシなんだな。 皆さん好きですか? 私は、規模が変わるたびにバッチテスト・ベンチマークテストする事になりそうで('A`)
大抵現実に影響があるようなパフォーマンス問題は そんな細かい話ではない。
デリゲートがキャッシュするよりnewってのは初めて聞いたな。 どこででた話? それかひょっとして非常に使用頻度の低いデリゲートの話?
>709 けどそれって、C#の開発経験があるって言えるんですか? 毎日好きな言語で遊んで、顧客が限定してきた時だけC#って奴と差がないじゃん。
visual studioでメッドを全部折りたたむ技ってないですか?
こういう事を >そんな細かい話 って言い捨てること。
>>714 プロならコストと効率を考えて、大して効果の上がらない箇所の最適化に
拘って労力を注ぐくらいなら、もっと他にすることがあるだろうと思うがな
そういうところをいじくり倒せるのはむしろ趣味で遊んでる奴のほうじゃね
>715 >プロならコストと効率 そりゃどの言語でもそうだよ。 話をループさせてることに気付いてる? 会話下手? 俺は優しいから"C#でのコストと効率"の経験って解釈してあげるよ。
>>716 煽る以外に言い返す言葉が見つからないならレスするなよ
>715のプロとしてのコストと効率の経験と、趣味で遊んでる奴との混同具合が心配です。
719 :
デフォルトの名無しさん :2008/06/05(木) 13:46:50
usingを使ってStreamReaderを読んでますが、 whileで最後まで読んで、もう一度whileで読みたいのですが、 どうすればいいんでしょうか。
>>719 こういうこと?
streamReader.BaseStream.Seek(0, SeekOrigin.Begin);
>>712 アウトラインのことなら、編集 - アウトラインで
722 :
719 :2008/06/05(木) 14:00:03
>>720 おお!!出来ました!助かりました!
ありがとうございます!
優先度の問題。 そんな細かい話を気にする必要があることだってあるが、 現実には引っかかるのはもっと別のところであることがほとんど。 もっと気をつけるべきとこは他にいっぱいある。 ってだけの話、無意味とは言わん。
だろうね。 大概解ってるだろ。 俺、>709って初見じゃないもん。 定期的に湧く厨だと思った。
条件分岐の効率なんて、文字列処理一発でも挟まれば全く無意味。 だから処理効率より設計の方を重視する方がいい、ほとんどの場合は。
>>724 誰かさんはこの程度でベンチテスト毎回やるんだと言ってるから相当優先度が高いんだろ
解ってるとは思えん
次のようにXMLファイルを読み込もうとしてるのですが、 どうやら読み込みに失敗している環境があるらしいのです。 if (File.Exists(Directory.GetCurrentDirectory() + "\\" + "data.xml") == true) { Type[] et = new Type[] { typeof(Data) }; System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(ArrayList), et); using (System.IO.FileStream fs = new System.IO.FileStream(Directory.GetCurrentDirectory() + "\\" + "data.xml", System.IO.FileMode.Open)) { DataList = (ArrayList)serializer.Deserialize(fs); } } そこでまず、本当にXMLファイルの読み込みに失敗しているのかメッセージボックスでチェックしたいのですが、 try { using (System.IO.FileStream fs = new System.IO.FileStream(Directory.GetCurrentDirectory() + "\\" + "data.xml", System.IO.FileMode.Open)) { DataList = (ArrayList)serializer.Deserialize(fs); } } catch { MessageBox("読み込み失敗"); } こんな風に書いちゃってもいいのでしょうか?
その時も文字列処理を引き合いに出してたな。 だいたい、その辺りにC#の用途の向き不向きボーダーラインがあるんかな。 More Effective C++みたいなイメージでは不毛と。
>>727 肝心の例外情報握り潰したら話にならんだろ
つか今時CurrentDirectoryかよ
>729は catch の後ろに何もない事を言っている様だ。 try .. catchのヘルプに戻ろう。
CurrentDirectoryの何が悪いのかわからん。 まさかレジストリやマイドキュメントに保存するのか?W
カレントにするやつは無知か手抜きだろ
exeのフォルダならともかく、 カレントは起動方法によって変わるから問題だろ 元々そういう仕様なら関係ないけど
カレントディレクトリがショートカットとかで変更されたらどうするんだ?
俺の負けだ。 言わせてくれ。 そこは throw; //スルー だろ。 俺は敗者だ。 だけどなんかスッキリした。 質問者おいてこぼりだが、確かに>728の模範解答は期待。
736 :
727 :2008/06/05(木) 15:54:41
聞きたいのはCurrentDirectoryのところではなく、 usingステートメントをtryで囲んでもいいのかな?と思ったのです。 読み込み失敗時の例外情報はヘルプでFileStreamを調べたのですが例外の種類がわかりませんでした。 例外の種類はどうやって調べたらいいんでしょうか?
起きえる例外がわからなければSystem.Exceptionで受ければいいだろ。 起きる例外はMSDNに載ってると思うけど。
MSDNでFileStream コンストラクタ (String, FileMode)を引いたら例外の種類が書かれていました。 try { using (System.IO.FileStream fs = new System.IO.FileStream(Directory.GetCurrentDirectory() + "\\" + "data.xml", System.IO.FileMode.Open)) { DataList = (ArrayList)serializer.Deserialize(fs); } } catch(System.Exception e) { MessageBox(e.ToString()); } としましたが、usingをtryで囲ってもいいのかが知りたいです。
どうして駄目だと思った?
740 :
727 :2008/06/05(木) 16:31:25
>>739 usingステートメントって例外が起きた時にステートメント内のdisposeを保証してくれるんですよね。
なのでtry句が複雑にネストしてしまう気がしたからです。
例外が自分の環境でも再現出来ればいいのですが、
他人の環境なので再現できないので、メッセージボックスを仕組んで原因を調べようかなと思いました。
try句が複雑にネストしてしまう、の意味が分からない。
usingをtry-finallyに展開してみる。 try { readonly System.IO.FileStream fs = new System.IO.FileStream("data.xml", System.IO.FileMode.Open); try { DataList = (ArrayList)serializer.Deserialize(fs); } finally { fs.Dispose(); } } catch(System.Exception e) { MessageBox(e.ToString()); } usingではcatchしてないからDeserializeで例外が起きた場合は外側のtry-catchブロックが補足する。 問題になるとすればcatchの段階でまだ開いている状態のfsにアクセスしたい場合。 Deserializeとfs.Dispose()の両方で例外が起きた場合。 こういったことが気になるなら、usingを使わずtry-catch-finally構造に変える。
蒸し返してすまんが、CurrentDirectoryでひとこと。 コンソールアプリならカレントディレクトリは普通に使う。 GUIの場合は意味がない。 exeのあるディレクトリがカレントディレクトリであると考えているなら明らかに間違い。 Directory.GetCurrentDirectory() + "\\" + "data.xml", この部分は余計。相対パスならカレントからの相対パスになるので "data.xml" だけでで十分。
744 :
727 :2008/06/05(木) 17:04:26
>>742 分かりやすい説明ありがとうございました。
>>743 参考になりました。ありがとうございます。
>>742 >Deserializeとfs.Dispose()の両方で例外が起きた場合。
キャッチされるのは後からの例外の方だったよね?
746 :
デフォルトの名無しさん :2008/06/05(木) 20:00:17
質問させていただきます。 フォーム上に画像を表示するプログラムを書きたいのですが、 イベントとして、フォームが表示されたと同時に描画したいのです。 このような場合、イベントはどのように記述すればよいのでしょうか。 もしくは、イベントを使わない方法があればそちらもご教授ください。
GUIのプログラムの中で GUIとは何の関係もないオブジェクトAが居ますが デバッグ用途でGUIのとあるメッセージウィンドウに文字列を出力させたいとします。 オブジェクトAのようなGUIに無関係なオブジェクトが大量に居るような場面で それらの出力文字列をGUIのとあるメッセージウィンドウに文字列を出力させたいわけですが。 どうやってそのオブジェクト達とメッセージウィンドウ間をインターフェイスさせればよいでしょうか? Qtをちょこっと触ったことがあるのですが、その場合はsignal/slot機構を使って、わりと簡単に実現できたのですが C#の場合はsignal/slotの代わりにeventを使うことになるかと思います。 eventの型となるdelegateをどこで宣言するかなぁ〜と考えるのですが、 どこにも宣言したくありません。 どうすればいいですか?
メッセージ表示するもしくは通知するTraceListenerでも作ればいいんでない?
>>743 逆に言えば、カレントディレクトリがexeのあるディレクトリであることを
プログラム側で保障すれば問題ないということでもある
まあ、その場合でも相対パス使うだろうから、
Directory.GetCurrentDirectory()は不要だけどな
>>750 Open/Saveダイアログを使うとカレントディレクトリが動いたりしなかったっけ。
以前はまった記憶がある。
ていうか、おまいらデリゲート使うときに毎回宣言してるの? 自分はDelegate<Result,Param1>とか宣言しといて全部それつかってる。 おかげでFuncとどう整合性とろうか思案中だがなぁorz
イベントハンドラはEventHandler<TEventArgs>使え
outやrefに対応できないんだよな…
class Reference<T> { public T Value { get; set; } } こんなの作っとけば
756 :
750 :2008/06/06(金) 00:07:58
>>751 確かに、FileDialog使うときは
RestoreDirectory = true
にしないとまずいな
てか、既定値がfalseとかありえん
>>755 世の中そうもいかんこともあるのよ。
リモーティングとか。
>>752 まさにこういう使い方をするために、宣言時に識別子を省略出来たらいいのに。
>>754 それは知恵が足りないだけ。
できるよ。
マルチプルアイコンを含むIconインスタンスから、各アイコンを取得したいのですが、 どうすればよいのでしょうか。
761 :
760 :2008/06/06(金) 07:46:58
自己解決しました。 Icon.Save()でバイナリデータを得て、それを分割した上でIconコンストラクタに与えればいいですね。 もっとスマートな方法がありそうな気もしますが、とりあえずそれでいきます。
コンストラクタでSize指定だけはできる
763 :
747 :2008/06/06(金) 12:09:04
>>753 >>イベントハンドラはEventHandler<TEventArgs>使え
どうもです。
こういうのがあるんですね。
ただこれだとEventArgsカスタムクラスをどこかで定義しなければならないです。
EventArgsカスタムクラスに依存するのがなんだかシャクなんで。
たとえば
talkerインターフェイスを用意するとして
interface ITalkter{
public delegate void printf(string fmt,prams object[] args);
}
こういうことができたら、
ITalkerを継承したクラスを作ってしまえばそれでOKなんですけど
ITalkerインターフェイスに依存するのは納得できるんで。
ただ、interfaceでは型宣言出来ないらしく。。。
なんで出来ないんだろう。。。。
ちなみにtalkerは大量に居ます。
listenerは1個だけっていう想定。
何かいい方法はありませんか。
764 :
747 :2008/06/06(金) 12:19:13
もしくは public event void delegate(object sender,params object[] arg) printf; のような感じで 名無しの型を宣言すると同時に変数定義みたいなことができたらそれだけでいいですね。 こういうことって可能なんでしょうか?
interface ITalkter{ string PrintString{ get; } } こうとか interface ITalkter{ void Print(Action<string> print); } こうとか interface ITalker{ void Print(IListener listener); } こうとかじゃだめなの?
DebugListener/TraceListenerで十分だと思うけど。
>>763 talkerの役割がよくわからないな。
実際に表示する部分なのか、それともメッセージを発行する元なのか?
それからdelegateをeventと1対1で作らなければいけないとか思ってないか?
>>761 P/InvokeでExtractIconExとか。
EventHandler<TEventArgs>を使いたくないのだったら、普通にAction<T>でも使うってのは? オブジェクトAの中に public event Action<string, object> printf; を実装する。 これならカスタムクラス使わんで済むでしょ。
>>747 >>764 デリゲートを使うにはデリゲート型が事前に作成されている必要がある
また、匿名メソッドやラムダ式を使った場合でも、型が自動的に作成されることはない
なので、君がやりたいと考えていること(デリゲートを使用して云々)は恐らく不可能
まあ、本来の目的からすると、出力タイミングをGUI側で制御するなら
>>765 オブジェクト側で制御するなら
interface ITalker {
void SetPrintCallback(Action<string> print);
}
もしくは
interface ITalker {
void SetListener(IListener listener);
}
>>769 void (object sender, T e) where T : EventArgs
に合致しないデリゲートをイベントにするのはやめれ
# MSのガイドラインなんて知らん、というなら止めはしないが
さらに言うと、
・デリゲート型の名前のサフィックスは EventHandler
・第2パラメータの型(上記 T)の名前のサフィックスは EventArgs
・2つのパラメータ名は上記の通り(sender, e)
正直msのガイドラインなんか知ったこっちゃ無い
なら使うな
ここはCompact Frameworkの質問はおk?
だから使わないんだって
C#にからめればOK
Compact FrameworkでWindows Mobile用2chブラウザを作ってるんだが、 スレ一覧にListViewを使ってるんだ。 ListViewItemCollectionにAddRangeが無くてforeachでスレデータ回してアイテム作ってAddさせてるんだが どうにも低速なんだ。 AddRangeの代わりになるものは回してAdd以外ないだろうか。
BeginUpdateやってる?
ListViewへの追加はPCでもかなり遅いからなあ 1000件くらいになりそうなときはVirtualModeにしてるけど、Compactじゃ使えないのか
>>779 2chの板のスレ一覧データだし、700項目くらいPCでやった場合ドパァッって表示されるんだがなあ。
VirtualはCFからは使えないな。
自分で擬似的なものを描画するのが一番速いのかな
MSのガイドライン無視したクラスライブラリって見てて恥ずかしい
Formの上でGridクラス作ったが、20万件でも一瞬で追加・表示されるようになった(´・ω・`)
ListViewってMSの中の底辺プログラマが作ったんだろうか
作ったのがだいぶ昔のことで、 ここまで大量のデータが取り扱われるとは考えられなかったからだと思う。
描いた円を上キーでジャンプさせるにはどうすればいい?
意味が分かりませんがKeyDownイベントでそういう処理書けばいいんじゃないでしょうか
いや、そのKeyDownの中身が分からなくって
KeyDownイベントの中身で円を描く場所を変えて描画処理に投げる
円をどうやって描いてるかジャンプってどういう意味なのか分からなくって
プログラミングが下手な人って質問も下手だよね
ダブルバッファにしろよ 画面ちらつくぞ
上向きの初速を与えて、一定の下向きの加速度を受けながら運動するようにしたい。 例えば、20進んで一瞬停止して、15進んで一瞬停止して、の繰り返しでいいのか
v = v0 + gt と言う式を当てはめれば良いだけじゃん
↑アホ
796 :
デフォルトの名無しさん :2008/06/07(土) 12:37:46
tをどうすれば?
タイマーでも使ってろ
変数tを入れれば位置まで出せる公式があったろ リアルにやるならtをタイマーを使って現実時間とぴったり合わせりゃいい
加速度を9.8/sずつ減らせばいいんでね?
p0 : 初期位置 v0 : 初期速度 g : 重力加速度(約-9.8) p(t) : 初期時刻からの経過時間tの時の位置 p(t) = p0 + v0*t + 0.5*g*t*t
つかいつの間に重力加速度の話になったんだ
>>800 それをwhileに入れれば出来そうだけど、ジャンプ中も左右移動したい
なんかこのスレ方向性分かんなくなってきたなw
ジャンプ中左右移動したいなら new Timer( () => { 位置更新 描画 }); void KeyDown(...) { switch(key) case ←: 左にちょっとずらす ... } こんな感じで出来るのかな 普通は while(true) { 入力ゲット 位置更新 描画 時間が来るのを待つ } こんな感じなのかな よく知らん
>>802 物理的に表現したいならこんな感じです
a:加速度 v:速度 p:位置 dt:微小時間
とすると、こういう微分方程式が成り立ちます
v(t)/dt = a
p(t)/dt = v(t)
dtはゲームなら1フレームの時間(約16.7ms)と考えるのが普通です
この式を例えば前進差分(ぐぐってね)で微分項を近似するとこうなります
( v(t+dt) - v(t) ) / dt = a
( p(t+dt) - p(t) ) / dt = v(t)
t+dt時間における速度と位置を知りたいので式を変形します
v(t+dt) = dt * a + v(t)
p(t+dt) = dt * v(t) + p(t)
この式をゲームのプログラムなんかではこう表現します
void Update( float dt )
{
velocity += dt * acceleration;
position += dt * velocity;
}
で、左右移動したいとき、というのは速度に値が加えられている状態なんで、
velocityに対して基本速度を加えておけばOKです
って書き終わって凄く後悔した スレ違いにもほどが
>805はY方向だけなので、Xは別にしないとだめだぞ。 横への移動を表す加速がY方向へは関係しないとき、XとYは独立して扱えるからよい子のみんなは気をつけよう。
気をつけるまでも無く自明だと思うのですが!
型を書いてないからアレだけど ベクトル型を使うのが普通なんで
810 :
デフォルトの名無しさん :2008/06/08(日) 10:51:16
過疎
IDEの使い方に関するおすすめの書籍は?
ListViewで特定のカラムだけ非表示にすることは出来ますか? リストには追加するのに非表示にするという、一見無意味な操作なのですがそうしたいのです。
>>812 ListViewのColumnHeaderで特定のカラムだけWidth=0にすることが出来ませんか?
リストには追加するのに非表示にするという、一見無意味な操作なのですがそうしたければそうすることもできるでしょう。
>>813 非表示にしたいカラムだけ幅調整不可って出来ますか?
Widthを0にしただけでは幅調整されて見えてしまうので・・・。
ListViewItemから派生させたクラスで持つようにして そのオブジェクトをListViewに追加すれば?
つかTagで十分だろ
>>815 なるほど。ありがとうございます。
>>816 Tagは使ったこと無いので調べてきます。
ListViewの方ではなくListViewItemの方ですよね?
ColumnResizingとかそんな感じのイベントあるから、 そこで非表示にしたいカラムが幅調整されそうになったら制限すればいい。
>>818 なるほどありがとうございます。
Tagを使ったものがまさに用途にあった使い方でした。
820 :
デフォルトの名無しさん :2008/06/09(月) 10:09:01
メソッド呼び出し中にキー入力を受け取るにはどうすればいいですか?
822 :
デフォルトの名無しさん :2008/06/09(月) 12:16:03
>>821 メソッド呼び出しを別スレッドにして、メインスレッドでキー入力を
待てばいいんじゃない? 全然はずしてたらご免。
モードレスダイヤログ? 全然外してるかも。
DoEvents()? 外してるかな…。
>>702 for (int i=0; i<1000; i++) Hoge((a) => a + 1);
のようなコードは次にように最適化されるようだ。
HogeDelegate f = null;
for (int i=0; i<1000; i++) {
if (f == null) { f = (a) => a + 1; }
Hoge(f);
}
デマというかもうちょい境界線が上なんだろうな。
質問 以下のようにListのSyncRootで排他処理を行っている最中に Listの実体を入れ替えた場合、 この排他でLock開放待ちをしていたほかのスレッドはどうなるのでしょうか? lock (((ICollection)(mylist).SyncRoot)[ if(xxx){ mylist = new List(); } }
とりあえずそんなキモいことするな mylistの置き換えより先に別スレッドがmylist.SyncRoot取得してたら古い方でロック待ちするし 置き換え後にSyncRoot取得したら新しい方でロック待ちする 古い方でロック待ちに入ったらロック取得したスレッドのlockステートメント終了でロックに入る 新しい方ならロックされてないから待たないでそのままロック取得するだろう
830 :
828 :2008/06/10(火) 12:45:29
やっぱり駄目ですよね。 コレでは排他処理の意味をなさない。 わかりました!!有難う御座います。
ListViewのTagで思い出したが、なんでシリアル化してもTagは保持されないのですか?
何が入ってるか分からないから 保持しても意味がないものが入ってるかもしれないから
あまり納得できんが、そういうことなんだと納得しておきます。
834 :
デフォルトの名無しさん :2008/06/10(火) 23:06:12
ADO.NET 2.0で、System.Data.SqlClientを使って、バッチ処理ってどうやんのが普通なの? なんかSqlCommandSetってのが昔はあったらしいけど、今は隠されてしまったみたいだし、 ていうか、 var cmd = new System.Data.SqlClient.SqlCommand(); cmd.CommandText = "begin transaction;" + "insert into t values(1,2,3);" + "insert into t values(2,3,4);" + .... "commit transaction;"; みたいにカンマで区切っただけのSQL文でも一応できたみたいなんだけど、 C#/ADO.NET2.0/SQL Serverでほかの人はどういう風にバッチ処理してるのか知りたいです。
ストアドプロシージャです。
リンクの冒険
837 :
デフォルトの名無しさん :2008/06/10(火) 23:30:44
>>835 お返事ありがとうございます。
ところで、クライアント側でユーザーが複数項目を選んで、
編集して、それで更新みたいな処理の流れだと、可変引数が
使えないストアドでは対応しきれないのでわないでしょうか?
>>836 えーと……ゼルダの伝説?
それはともかく、C#のバージョンが分からんが3.0ならLINQがおすすめ
GUIでD&Dするだけでエンティティクラスが作れて、デフォルトでトランザクション処理
LINQ to SQLがSQL Server限定なのがあれだけど
>>837 「バッチ処理のパラメータを格納しておくテーブル」を作るという手もある。
そのテーブルにINSERTしてからバッチ用のストアドプロシージャを起動して、
ストアドの中でテーブルを読み込んで、それを元に処理を行う。
結果のサマリーも格納するようにすれば、バッチ処理の履歴も兼ねることができる。
C#中でエクセルのファイルを開こうとすると、下記のエラーが発生します。 ちなみに.NET Framework 2.0を使っています。 System.Runtime.InteropServices.COMExeption(0x80040154):CLSID{00024500-0000-0000-C000-000000000046}を含むコンポーネントのCOMクラスファクトリを取得中に、次のエラーが発生しました。:80040154 3台あるPC(XP)で1台で起こりますがその原因が分かっておりません。 作成したプロジェクトのbin\release以下には3個のCOMと関係がありそうなDLLがあります。 ・Interop.Excel.dll ・Interop.Microsoft.Office.Core.dll ・Interop.VBIDE.dll これら3個を C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe を使って登録しても結果は同じです。 どういった原因が考えられるでしょうか?
842 :
840 :2008/06/11(水) 21:26:24
確認させていただきたいのですが、 Excelがインストールされていない環境では、COMを通じたエクセルファイルの操作というのはやはり出来ないものでしょうか? というのは、 動作確認をした3台のうち 1台にだけExcelをインストールしていたつもりだったのですが、実際には2台にインストールされており、 上記の System.Runtime.InteropServices.COMExeption(0x80040154):CLSID{00024500-0000-0000-C000-000000000046}を含むコンポーネントのCOMクラスファクトリを取得中に、次のエラーが発生しました。:80040154 このエラーはエクセルがインストールされていないパソコンでだけ起こっていました。 レジストリのCLSIDに無理やりエクセルを登録たところエラーが変わって System.IO.FileNotFoundException: CLSID {00024500-0000-0000-C000-000000000046} を含むコンポーネントの COM クラス ファクトリを取得中に、次のエラーが発生しました: 80070002。 場所 NFSAutoGui.Tettou.product(String path) こういうことになってしまいました。 FileNotFoundExceptionってようするにExcel.exeが見つかりませんよ、ということかと思いますが。 ということで Excel.exeがインストールされていない状態では、COMを通じたエクセルファイルの操作というのはやはり出来ないものでしょうか?
>>842 そりゃ、できんわな。それができたら、みんなExcel買ってくれなくなってMSが困っちゃう。
>>841 >>843 どうも。。。
インストールしてないつもりのPCで動いたと思ってたんで動くかと思っていました。
アホ過ぎ。
ところで
Excelのバージョン10が開発マシンに入っております。
COMの参照設定で、Microsoft Excel 10.0 Object Library のバージョン1.4を設定しているのですが、
これで配布した場合って、Excelのバージョン10.0が入っていないと動かないんですかね?
Excel 2007しか入っていないようなPCでは動かないんですか?
>>842 だって、そのExcelファイルの操作って、
Excelが持っている機能を呼び出しているだけだ。
普段目にするUIはExcelの1つの顔にすぎない。
解放忘れとかやりまくってそうだな
こんなこと言ってる奴がまともに作れてるわけないだろ でバージョン依存したくないならせめてVB.NETにしとけ
WSHのVBSとか呼び出すのが楽だよ
>>845 そういうことですね。
>>846 了解しました。
>>847 一応タスクマネージャのプロセスタブにEXCELは居ないので大丈夫かと...
ところで、
開発マシンにEXCEL10しか入っていませんが、
その他のバージョンのEXCELも扱いたい場合に必要になってくるのが
PIAとかいうものなのでしょうか?
YES
あんたは質問を有料にしたいわ
DateTime型のToString()の書式設定はどんな環境の場合に変わるんでしょうか? たとえば("d")ならカルチャによって変わりますが、 カスタム書式の("yyyy/MM/dd")も環境によって変わるようです。 どんな環境で変わるんでしょうか??
>>853 質問の意味がよくわからないけど「カルチャが異なる環境で変わる」ということが聞きたいのかな。
CurrentThreadのCurrentCultureとかCurrentUICultureとかを色々変えながら動かしてみると
わかりやすいかもしれない。
わかりにくいかもしれない。
カルチャによって変わるよ。 "/" はカルチャ依存の日付区切り文字だし、 この世には和暦とかヒジュラ暦とかあるだろ。
>>854-855 ありがとうございます。
"/"はカルチャ依存なのですね。
カスタム書式なら"/"も表示してくれると思っていたのですが、それすらも期待してはいけないのですね。
自分の環境では再現できない&相手の環境がよくわからないので質問しました。
では"yyyyMMdd"ならどの環境でも期待通り"20080612"になることを前提にしていいのでしょうか?
>>856 >>855 の最後の行を読んで下さい><
DateTimeFormatInfo.InvariantInfoわたしとけばいいよ。
>>856 CultureInfo ci = new CultureInfo("ja-JP", true);
ci.DateTimeFormat.Calendar = new JapaneseCalendar();
Thread.CurrentThread.CurrentCulture = ci;
Console.WriteLine(DateTime.Now.ToString("yyyyMMdd")); // 200612
Console.WriteLine(DateTime.Now.ToString("yyyyMMdd", DateTimeFormatInfo.InvariantInfo)); // 20080612
>>857 なるほどありがとうございました!
yyyyでも和暦だと20とかになるんですね。
DateTimeFormatInfo.InvariantInfoで解決しました。
>>858 ありがとうございました。勉強してみます。
Compact FrameworkのWebBrowserでDocumentTextにHTML設定するとプログレスバーが出てくるのが嫌なんだけど 非表示にする方法はあるだろうか? それともHtmlView.dllをラップしたほうが賢明だろうか
できるだけメモリ使用量を減らすため、 IDisposableを実装したほうが良いクラスの判断でまよっています。 クラスA DataSetをプロパティとして保持 クラスB stringをプロパティとして保持 クラスC byte配列をプロパティとして保持 クラスAはDisposeメソッドを用意してデストラクタから呼び出していますが、 クラスBとCもDisposeを用意したほうが良いでしょうか? また、stringやbyte配列はDisposeメソッドがないので、どうやってメモリを解放するのかもわからないです。
全部IDisposable無用
Disposeを実装するのは、自前でネイティブリソースを扱う時か Disposeを持つクラスをメンバとして持つ時だけで良い。 それ以外ではメモリの開放はGCにまかせた方が一般的にパフォーマンスは高い。 なんとなくメモリは少ないほうがいいよね的な考えしかないなら逆効果にしかならんよ。 性能を犠牲にしてでもどうしても局所的にワーキングセットの縮小をせまられるのなら 参照をnullにしてGC.Collectを呼び出す。
865 :
862 :2008/06/12(木) 12:58:06
>>863-864 ありがとうございます。
なるほど、ではどうしても実装するならクラスAだけで
良いのですね。
Webアプリなのですが、特定のページにアクセスが集中し
使用メモリが大きくなってしまうので、できるだけ解放できるところは
解放したかったのです。
処理終了時にGC.Collectを呼び出すことにします。
GCでオブジェクトが回収されるときの動作は 1 デストラクタ(ファイナライザ)があればそれを実行する 2 メモリの回収 Disposeは1を代行するもので、メモリの回収はあくまでもGCが行う。
質問 RichTextBoxに画像を挿入したいんですが、無理?
とりあえずクリップボード越しなら可能
>>868 サンプルコード貼ってある所知りませんか?
検索エンジン様が知ってることを知ってる
871 :
862 :2008/06/12(木) 17:31:00
>>866 ありがとうございます!
だいぶ勘違いしていました。
デストラクタでDispose呼んでも意味ないのですね。
え、デストラクタとGCは関係ないんだと思ってた…。 じゃあデストラクタが実行されるタイミングってスコープを抜けた瞬間とは限らないの?
C#でデストラクタ?
>>872 全然関係ない。スコープと一致させたいときにはusingを使わないといけない。
逆に言えばそれがIDisposeとusingの存在意義。
>>873 まあC# 1.0のころはデストラクタって言っていたはずだし、いいじゃないか。
DisposeとGCも全く関係ないよ 種も仕掛けもない本当にただの普通のメソッド
あ、そっか。C#はデストラクタなんてほとんど書かないや。
本当にどうしてもどうしても必要な場合でなければむしろ書いてはいけない
IDisposeを実装するときの基本パターン class DispBase : IDisposable { ~DispBase() { Dispose(false); } public void Dispose() { Dispose(true); System.GC.SuppressFinalize(this); } public virtual void Dispose(bool disposing) { if (disposing) { } } } GCとの関係といえばこの命令だけ。 System.GC.SuppressFinalize(this); 後片付けが終わったからファイナライザは呼び出さなくていいとGCに指示している。 これでファイナライザは呼び出されなくなる。
パフォーマンスとかメモリとかやたら気にする奴が こういうでたらめやって事態を悪化させやがるんだよな… GC呼ぶなんてやめとけよ、特にWebではな…
余計な一言はいいから、ね
いつでも回収できるメモリは空いていると同じということを理解できるまでには修行が必要じゃて セッションにでっかいオブジェクトの参照抱え込んだままで、GC.Collect呼びまくるとかやってそう
これくらい言っとけばたまたま見かけて疑問を持つ奴が増えて好都合
そういやあれ不思議なんだよな。 メモリとか異様に気にするのにセッションとかは湯水のように平気で使うのな。
結局、明確にスコープ抜けたときにリソースを即座に解放して欲しいという場合で複数から参照されてる場合には参照カウント的なものが必要になるんだ世根(´・ω・`)
COM InteropのRCWがそういう具合になってますね。 もう少しスマートにできなかったものか。
ファイル書き込みじのフォーマットのことですが。 下記プログラムを実行すると。 ===================== static void Main(string[] args) { StreamWriter sw = new StreamWriter("test.txt",false,Encoding.GetEncoding(932)); sw.WriteLine("{0,10} => {1}","ABCD",1234); sw.WriteLine("{0,10} => {1}","あいうえ",1234); sw.Close(); } ===================== 結果として ===================== ABCD => 1234 あいうえ => 1234 ===================== こういった出力になります。 説明を添えると、 ABCDの前に半角スペース文字6文字 あいうえの前に半角スペース文字6文字。 という出力結果になります。 理想としては、 ABCDとあいうえの右端をそろえたいので あいうえの前に半角スペース文字2文字が入って欲しいのです。(あいうえは8文字とみなす。) そのようなことは可能でしょうか? どのようにすれば可能でしょうか?
>>886 つまり、いわゆる全角文字を半角文字2文字分として処理したいってことか?
Encoding.GetByteCount()で、各文字コードにおけるバイト数が得られるから、
Shift-JISにおけるバイト数を使ってスペースの文字数を計算すればいいだろう。
こんな感じで。
Encoding sjisEnc = Encoding.GetEncoding(932);
string text = "あいうえ";
string space = new String(' ', 10 - sjisEnc.GetByteCount(text));
Console.WriteLine("{0}{1} => {2}", space, text, 1234);
インストーラーの起動条件でJ#2.0再配布パッケージを 必須にする方法教えて下さい。
スレ違い
いや 殆どC#で一部だけJ#使ってるんすよ…
いや、その理屈はおかしいだろ…
その発想はなかったわ ってかVSスレで聞いたら?
ほい 逝ってきます。 すまぬかった
delegateを使用して(使用しなくても同様のことができればいいのですが・・・) using System; using System.Collections.Generic; delegate int getItem(); class DelegateTest { public static void Main() { List<int> liList = new List<int>(); getItem a = new getItem(A); a += new getItem(B); a += new getItem(C); liList.Add(a()); } static void A(){return 1;} static void B(){return 2;} static void C(){return 3;} } この様なプログラムを走らせてliListに[1,2,3]が入って欲しいのです。 (当然ながらというか、)実際には[3]しかはいりません。 マルチキャストデリゲートにしたのは実行したいメソッドの数が実行時にしか分からず できればif文分岐を少なくしたいと思ったからなのですが、 やはりメソッドを一つ一つ実行しなければ無理でしょうか? もしくはメソッドの戻り値をリストにして、そのリストを次のメソッドの引数をリストにして、最後にaddrangeでしょうか? 何か上手いテクニックがあれば、どなたかご教授下さい。
普通にgetItemコレクション作ってforeachでList<int>にAddしてけばよくね?
デリゲートの引数にコレクション渡してAddしてもらえば?
>>895 複数の、戻り値を持つデリゲートを一括で管理したい場合は、
マルチキャスト- ではなく、デリゲートのコレクション/リスト などを使う
例えば、こんなふうに
var funcs = new List<Func<int>> { A, B, C };
var values = funcs.Select(f => f()).ToList();
あと、A,B,Cはvoidじゃなくてintな
>>897 それだと、仕様外の操作(複数追加、Insert、Clear、etc.)まで出来てしまうのであまり良くない
自分しか触らないから何でもいいっていうなら構わないけど
add/remove付きのイベントにしてしまえばマルティキャストっぽく見せられるかも List<getItem> evlist = new List<getItem>(); public event getItem ItemsEvent { add { evlist.Add(value); } remove { evlist.Remove(value); } } this.ItemsEvent += () => 1; this.ItemsEvent += () => 2; this.ItemsEvent += () => 3; evlist.Select(f => f()).ToList();
>>897 の考え方が一番正当でしょ
コレクションをそのまま渡すんじゃなくて,値を登録するためだけのクラスを作って引数に渡す
901 :
900 :2008/06/16(月) 19:05:54
考え方は,ってだけだよ マルチキャストは使うのはあんまり良くないかも
902 :
895 :2008/06/16(月) 20:14:14
皆さんレスありがとうございます。 とりあえずはコレクションを引数に渡すやり方で実装できました。 ラムダ式を使った方法を教えてくださった898,899さんのやり方は ちょっと理解ができませんでした・・・申し訳ありません。 デリゲートのコレクションは使ったことがないので勉強してみたいと思います。
ITfMessagePump(TSFのInterface)をC# Formアプリで使ってる人いる? メッセージループが競合してどうすりゃいいか、分からんのだが・・・。
いません
そうか。だよなー。
>>903 ご想像通りメッセージループを自前のものに置き換えるしかない。
その方法を知りたいな
>>907 メッセージディスパッチャに関してはP/Invokeで動くというか、
普通にITfMessagePump::GetMessage[A,W]でメッセージ取ってきて
P/InvokeでDispatchMessageすればおk。
必要ならWinFormのApplicationクラスのソースでも眺めて見れ。
折角公開されたんだし。WPFももう公開されたんだっけ?
WPFアプリケーションでWinFormsを併用するときのドキュメントも参考になるかも。
というかメッセージディスパッチャにWPFのApplicationクラスを使いつつ
WinFormsを表示するのが楽かもしれんな。XP以降専用になっちまうが。
あとはExecutionContextの実装もちゃんとやっておくとベター。
909 :
907 :2008/06/17(火) 03:29:53
ぐあ 909==908ね。
911 :
908 :2008/06/17(火) 04:00:28
実際試してみた。WPFのApplicationクラスでWinForms。 一応動くことは動くみたい。 この方法ならWPFのSynchronizationContextが使われるので SynchronizationContextはそのままでOK、なはず。 --------------- // PresentationFramework.dll // System.Windows.Forms.dll // WindowsBase.dll using System; static class Program { [STAThread]static void Main(){ new CustomApplication().Run(); } } public class CustomApplication : System.Windows.Application { protected override void OnStartup(System.Windows.StartupEventArgs e) { base.OnStartup(e); var form = new System.Windows.Forms.Form() { Width = 640, Height = 480, Text = "Test Window", }; form.Disposed += (_o, _e) => this.Shutdown(); form.Show(); } }
>>908 ありがと。
Application.csは見ていて、FPushMessageLoopでGetMessageWしてるのは確認したんだが、
ThreadContextの処理と整合性を取りつつも、
ITfMessagePump::GetMessageする確実な手段が分からなくてね。
ThreadContext周りの処理はinternal/privateがひしめいていて、
うかつに手を出せないし、お手上げ状態。
WPFは要件的に採用は厳しいかな。
いずれにせよ、overrideなり、Filter的なものでGetMessegeを自前の処理を行う仕組みはなさそうだね。
>普通にITfMessagePump::GetMessage[A,W]でメッセージ取ってきて
>P/InvokeでDispatchMessageすればおk。
おkな理由を教えてもらえると嬉しいな。
>>912 >おkな理由を教えてもらえると嬉しいな。
PresentationFramework.dllが中でやっていることがまさにそれだから、で説明になる?
System.Windows.Threading.Dispatcher.PushFrameImplおよび
System.Windows.Threading.Dispatcher.GetMessageと全く同じことをすれば動く。
で、納得してもらえるんだろうか……
たとえばNetworkStreamのBeginReadでAsyncCallbackを指定したとする。 このコールバック中にEndReadで例外が発生したらアプリが強制終了してしまう。 この例外をメインスレッド、少なくとも呼び出したスレッドで処理するにはどうすればよろしいでしょうか?
例外を補足できない?
>>914 Windowsアプリなら、Control.BeginInvokeでEndRead呼べば
発生する例外もメインスレッドの管轄になるはず
ただ、例外チェインの最後のエラーしか取れないかも
コンソールアプリならしらね
917 :
デフォルトの名無しさん :2008/06/18(水) 10:06:15
xmlファイルからデータを取得する方法について教えてください。 下記のxmlファイルtest1.xmlを作成しました。 test1.xml <?xml version="1.0" encoding="utf-8" ?> <Items> <Item ID="001"> <Name>aaaa</Name><Age>10</Age> </Item> <Item ID="002"> <Name>bbb</Name><Age>20</Age> </Item> </Items> test1.xmlのデータを下記のプログラムで読み込みました。 001 XmlDocument xmlDoc = new XmlDocument(); 002 xmlDoc.Load("c:\\test1.xml"); 003 004 string wID = "002"; 005 XmlNode xmlNode = xmlDoc.SelectSingleNode("//Items/Item[@ID='" + wID + "']"); 006 string wName = xmlNode.SelectSingleNode("//Name").InnerXml; 007 string wAge = xmlNode.SelectSingleNode("//Item/Age").InnerXml; 私の予想ではwNameには"bbb"、wAgeには"20"が入ると思っていたのですが 実際にはwNameには"aaa"、wAgeには"10"が入ります。 プログラムの005行目の処理でxmlNodeには確かに<Name>bbb</Name><Age>20</Age>が抽出されています。 006-007行目で、そこから更に//Nameを抽出したのにwNameに"bbb"が入らず"aaa"が入ってしまうのは何故ですか? また,このような絞込みっぽい処理を行うには、どのようにすれば良いでしょうか。
そこで // 使っちゃ駄目だろ
919 :
917 :2008/06/18(水) 10:17:43
>>918 Σ(゚д゚lll)
//はずしたら上手くいきました。
なぜこういう事になるのか勉強して出直してきます。
ありがとうございました。
javaばっかりでいつも不思議に思っているんですが、 キーワードでas base isとかがかぶったらどういう回避方法があるんでしょうか。
何を言いたいのか良く分からん
@as @base @is
ソース上で既に使っていて、キーワードとかぶっているときはどうなるんでしょうか。 またソースに手を入れて変更しないとダメなんでしょうか。
1.0から3.0までで変数名に使えないキーワードは増えてなかったと思うが
c, javaのソースからc#に移植というか少し手を入れるときキーワードの問題が発生しませんか? 特にc#は独自のキーワード名が多いみたいですけど。
勝手な拡張もいいんですけど、もとのソースの関数名がas, in, baseとかだとどうするんでしょうか? 関数名のAPIの方を変更できないし泣きませんか? そうするとC#で作る気力も無くなるんですけど。
C#はjavaじゃないから嫌いだとか 子供に生まれてこなくて良かったとか言い出す奴らは 来てもらわなくてもいいよ
いや、そういうことじゃないんですけど。 まともにプログラミングの話を出来ないなら、別にいいですよ。 噂どおり、C#の人はC++厨房と変わらないようですねw
asとかを使いたければ@asとしてくれ 他言語からの移植なんてそう簡単にはいかんよ
typedefとか#defineが欲しいといいたいのかな?泥沼だと思うがね。 同じ言語の世代間の違いならコンパイルオプションや pragmaのようなコンパイル指令で逃げるのだろうけど、 他言語からの場合は良識に任せるしかないな。 移植を前提にしたコードでbaseとかinとかselfとか変数に 使ってたらそういう名前を使った奴がアホだろ。
931 :
デフォルトの名無しさん :2008/06/18(水) 20:56:23
簡単なことだし、ここでちゃんと教えればすむことなのに、「C#の奴はやっぱり変人しかいないよ」とか噂を流される方がいいのかな?
まあ、
>>927 みたいなしきり屋がいるようなところじゃ、こっちの方がよくわかんないけど。
ここでは
>>927 みたいなしきり屋に従わなければいけないのですか?
伊武雅刀の「子供達を責めないで」のオマージュだろね。 フルすぎるネタで若い子にはわからないぞ;;
>>931 はいはい、とっとと噂を流す仕事に戻ってね。
>>930 Cならともかく、C#みたいなしんまい言語を前提にコードかけるかよw
in selfとかをキーワードに設計する方が多言語からの移植を考えないようなアホじゃないのか。
おまえはいつも、次の言語のキーワードとぶつからないように考えながら書いてるのか?アホはおまえだなw
936 :
デフォルトの名無しさん :2008/06/18(水) 21:18:57
>>933 Javaの世界ではC#の奴はめちゃ嫌われてるよ。
演算子オーバーロード―がどうとかうるさいしww
VBほどじゃないけど(笑)
それをC#のスレで言って何がしたいのか分からん 嫌われてるからJavaやれってか? そんな気を使わなくてもC#一筋なやつの方が少ないだろ
C#一筋で食っていけるほど仕事がないな。
Javaの新機能はほぼ全てC#のパクリなのにな
だから移植前提で独自キーワード入れないでほしいんだけど。またMSの悪い癖(独自拡張?)がでちゃったんですか?
昔COBOLという言語があってな。 ていうか独自キーワードってなんだよ。 Javaのキーワードが他の言語からの移植を考えて決められてるなんて初耳だ。
>>940 Javaを使い続ければすむことじゃないのか?
Javaって $_ みたいな名前定義できなかったっけ? CLIだとどうなってるんだろ?
Java屋? C#出たときあちこち馬鹿にしまくったくせに掌反してパクり始めた奴らだろ? そりゃあんだけ醜態晒せば嫌って、なかったことにでもせんとなwwww まあそれはいいとして @ つければキーワードとして扱われなくなるよ。VBなら[]で囲むんだっけかな 相互運用のためにその手の機能を持つことが推奨されてる。ちなみにCILは「どんな識別子でも」持てるから 限界はあるんだけどな
移植するのに変数名まで同じにしたい痛い人がいるスレはここですか
実際そんなに独特な予約語多くないだろ 2.0以降に追加されたキーワードは全て文脈次第だし
あそうそう、コンテキストキーワードも多いっての書き忘れてた
半年も使わないと忘れちゃうしキーワード多すぎだろ。 いちいち覚えるのとか別に苦痛じゃないんだけど、なんかMSに束縛されてるみたいで嫌じゃないか? まあ、変なところがあったらコンパイラが叱ってくれるからいいんだけど…
…半年はさすがに記憶力悪すぎかろくに触ってなかったレベルだろう。
950 :
デフォルトの名無しさん :2008/06/18(水) 22:19:51
scriptfpとかpackageはそのままでjavaに移植できるの? java使ったことないんでしらんけど。 そもそも多言語移植の時に変数名そのままで移植できなきゃやだやだやだ なんてバカかよ。ほとんど意味ないと思うんだが。 そこまでしたいならまずjavaの段階で適宜リファクタリングして移植すりゃ いいことなんじゃねーの?
ざっくり読むと アホがjavaからC#へ移植を試みて文句言ってる のに食いついたって感じ? 暇だなぁ、お前等
J#でもつかってろよ
おお、まさにJ#でこの話終わりだなww
コンテキストキーワードよりもはるかに気持ち悪いのは, インターフェイスとか抜きで特定の名前(引数)のメソッドの呼び出しに変換される機能 foreach→GetEnumerator()とかコレクション初期化子→Add(引数任意)とかクエリ式とか
C#コンテキストキーワードって get set partial where yield value と後はC#3.0で導入されたクエリキーワードぐらいだよな。 >忘れちゃうキーワード explicit implicit stackalloc unchecked volatile あたりは時々忘れそうになる。
add/removeとかも<コンテキストキーワード
そろそろ次スレ立てたほうがいい?970くらいでいい?
>>954 java5にも同じのあるじゃないか
Iterable/Iteratorでfor ( : ) をお忘れではないか
>>958 C#のはダックタイピング的なのでちょっと違う。
多分
>>954 はその事を知ってて書いてる。
Whereという名前のメソッドがあればクエリ式のwhere使えるんだよね
961 :
デフォルトの名無しさん :2008/06/18(水) 22:53:33
>>955 ええ!それは忘れないだろ。
それ、使わないならC#言語じゃなくてもいいでない?
ん・・・このスレのレベルは、理解に苦しむ・・
>>959 了解、インターフェイスがなくてもメソッドの名前が一致してればOKという話か。
usingはなぜかIDisposable.Dispose()でないと受け付けない。
これもメソッドの名前だけで使わせて欲しいよ。
>>956 リファレンスのキーワードの項に、
>>955 のとクエリキーワードは載ってるけど、add/removeが載ってない
中の人にも忘れられてる?
add/removeはデリゲートだけでデリゲートでも普通使わないからやっぱり忘れられていると思う。
C#というのは、Javaと比べるとポインタ演算unsafeとstackallocが売りだと思うんだけど…
いやなウリだな
>>964 WinFormでもWPFでもコントロールのイベントはカスタムしてるのがほとんどだぜ
便利なものはどんどん積極的に組み込んでアピールしていこうっていうのがコンセプトでしょ
ヘジたんはむしろ抑え役っぽい
抑え役だし押さえ気味だよなぁ。 というかあいつら基本的に自分たちでだいぶ使ってから出すから まぁそんなもんかという気はする。
VBと違ってクエリ演算子のサポートが消極的すぎ 中途半端に付けるくらいならクエリ式なんて無くてよかった メソッド形式だけだとどうしてもインパクトに欠けるからなあ
javaがいったいいくつ独自キーワードを取り入れたか
今のC#のウリは関数型とラムダ式だろ JavaやC++とくらべて進んでるところは
次はついに動的型くるかも
動的型というか、動的っぽい記述が一時的につかるようになる dynamic ブロックになりそうかな。
GetEnumeratorは仕方ない。 ジェネリックがなかったころだから。
Mix-in 入れてくれんかな
978 :
デフォルトの名無しさん :2008/06/18(水) 23:49:20
相変わらずC#はキモイな どこがどうキモイかを気がついてないようだけどw
>相変わらずC#はキモイな 何言ってる? 現在進行形でキモクなってんだよっ
まあJavaBeansのプロパティルールよかまし
自分でもどこがキモイか指摘できないから、 釣り糸をたらして誰かがボロを出すのを待ってるんですね。 わかります。
動的型はいいよ VBでやってくれ
C#の魅力は静的型付けの言語でここまでやるかってところ
Expression Treeなんかすでに動的言語の領域だけどね
Linq for SQLは明らかに別物ですから。 Linq for SQLはORMであることを前面に出してアピールしたほうが健全だと思える。 これをごちゃ混ぜにしてLinqと呼んでるからユーザーが混乱する。
混乱して分からなくなるようなやつは使わなければいい
Linq to SQL はフェードアウトするかもしれんけどな。その話とは関係ない話ではあるが。
SQLクエリとin-memoryオブジェクトクエリが同じ記法で書けるってのが1つの売りだからなぁ。 デリゲートとExpessionTreeが同じ文法で書けるのが実に素敵。
ADO.NET2.0でデータの更新時に同時実行違反になったときどうしてる? エラーダイアログ出して、ユーザーが編集していた更新内容を まるっと破棄してしまうと、なんか文句言われそうなんですが・・・
Expression Treeじゃなくてメソッド全部ツリーにしてくれればいいのに あと匿名型を普通に引数とか戻り値に使えるようにしてくれ
ExpressionTree面白いんだが、自分であれいじくろうと思うとちょっとうんざりしそう。 もうちょっとシンタックスシュガーが( ゚д゚)ホスィ…
俺はMSDNにあるExpressionVisitor使っていろいろ作ってる 合成関数とか、任意の引数のバインディングとか expr1.ComposeWith(expr2) expr1.BindSecond(3) てな感じで使ってる
正直、何につかったらいいかわかんねExpressionTree
識別子の名前が取ってこれるのが重要なんじゃない?>ExpressionTree それ以外は生の処理でもできそうだけど
まあ、Expression Treeを使うのは主にライブラリ作成側の人だろ。 たいていのプログラマは間接的な恩恵しかない。
動的メソッド+ILの替わりに、デリゲート+Expression Treeが使えるのは大きい
ソースとプロジェクトファイルを人に渡したいのですが 最低限必要なのはどのファイル(※)でしょうか? ※ Windowsフォームアプリケーションで新規作成した場合に 作成されたファイルを下記のリストにしてみました(第二階層まで) test.sln test.suo 2008/06/21 17:07 <DIR> bin 2008/06/21 17:07 <DIR> obj 2008/06/21 17:07 <DIR> Properties 2008/06/21 17:04 374 Form1.cs 2008/06/21 17:04 1,338 Form1.Designer.cs 2008/06/21 17:04 546 Program.cs 2008/06/21 17:07 3,622 test.csproj 2008/06/21 17:07 74 test.csproj.user
>>997 2008/06/21 17:07 <DIR> bin
2008/06/21 17:07 <DIR> obj
は全部消していい。
あとはtest.csproj.userくらいか
>>998 削除&プロジェクトファイルを開く、で削除可否を確認しました。
下記リストの状態でプロジェクトが開くのを確認。
教えて頂いたファイルからさらにtest.suoを削除しています。
ありがとうございます。
消さなかったファイル・フォルダ
test.sln
2008/06/21 17:07 <DIR> Properties
2008/06/21 17:04 374 Form1.cs
2008/06/21 17:04 1,338 Form1.Designer.cs
2008/06/21 17:04 546 Program.cs
2008/06/21 17:07 3,622 test.csproj
消したファイル・フォルダ
test.suo
2008/06/21 17:07 74 test.csproj.user
2008/06/21 17:07 <DIR> bin
2008/06/21 17:07 <DIR> obj
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。