ふらっとC#,C♯,C#(初心者用) Part60
>>993 ありがとうございます。
が。
いまたぶん問題なのはContextmenuのイベントハンドラなのではないかと。
4 :
デフォルトの名無しさん:2010/05/25(火) 19:08:39
>>2 えw
だからそれを書きなれないxaml上でしないでC#上でやったら?
って提案でしょw
6 :
デフォルトの名無しさん:2010/05/25(火) 19:11:43
え・・・
もしかして
>>993の方法教えたけど他のイベントハンドラもかかないとできないってこと?
7 :
デフォルトの名無しさん:2010/05/25(火) 19:24:08
private void Window_Loaded(object sender, RoutedEventArgs e)
{
ContextMenu cm = new ContextMenu();
MenuItem mi = new MenuItem();
mi.Header = "copy";
mi.MouseDown += new MouseButtonEventHandler(mi_MouseDown);
cm.Items.Add(mi);
img.ContextMenu = cm;
}
void mi_MouseDown(object sender, MouseButtonEventArgs e)
{
throw new NotImplementedException();
}
こんな感じで書ける
ほんとにWPFらしさを求めるならイベントハンドラすら使わない
コマンドバインディングを使う
>>7 みなさんありがとうございます。
まずcontextmenuからということで、
<Grid Name="img" MouseRightButtonDown="img_MouseRightButtonDown" MouseRightButtonUp="img_MouseRightButtonUp">
<Grid.ContextMenu>
<ContextMenu Name="contextMenu">
<MenuItem Header="コピー" Name="copy" Click="copy_Click" />
</ContextMenu>
</Grid.ContextMenu>
</Grid>
とあったものを、次のようにしました。
<Grid Name="img" MouseRightButtonDown="img_MouseRightButtonDown" MouseRightButtonUp="img_MouseRightButtonUp">
</Grid>
ContextMenu contextMenu = new ContextMenu();
MenuItem copymi = new MenuItem();
copymi.Header="copy";
copymi.Click += (s,e) => copy_Click(s,e);
contextMenu.Items.Add(copymi);
ところが、contextMenuが表示されません。
<Grid Name="img" MouseRightButtonDown="img_MouseRightButtonDown" MouseRightButtonUp="img_MouseRightButtonUp">
<Grid.ContextMenu>
<ContextMenu Name="contextMenu">
</ContextMenu>
</Grid.ContextMenu>
</Grid>
MenuItem copymi = new MenuItem();
copymi.Header="copy";
copymi.Click += (s,e) => copy_Click(s,e);
contextMenu.Items.Add(copymi);
ならメニューが出ます。
Gridのimgに登録するのかと思ったのですが、
img.Add(contextMenu);
としたら、
'System.Windows.Controls.Grid' に 'Add' の定義が含まれておらず、型 'System.Windows.Controls.Grid' の最初の引数を受け付ける拡張メソッドが見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。
とエラーです。
MouseRightButtonDownとかMouseRightButtonとかいらないから
WPF ContextMenuでググればいくらでも出てくるじゃん
12 :
デフォルトの名無しさん:2010/05/25(火) 21:05:49
>>11 >>10が要求してるのは右クリックをドラッグアンドドロップ動作とContextMenuの表示
の切替をしようとしてるからややこしくなってるだよw
13 :
デフォルトの名無しさん:2010/05/25(火) 21:08:49
>>10 xamlの階層を見ると
Grid.ContextMenu->ContextMenu->MenuItem
って感じじゃないの?
前スレの
>>9だとうまくいかないってことはxamlの階層をそのまま解釈したのではだめ
ってことだろうけど
>>10 動的に表示したいんだから、特定の要素のContextMenuプロパティに入れちゃダメ
フィールドにContextMenuを持っておく
で、MouseUp系のイベントでIsOpenを設定する
こうゆうことを教えてくれる上司がいる会社で働きたい・・・
気合でベタ書き縦横無尽に右往左往でニッチもサッチも。
ちゃんと最後まで言い切りなさい
どうにもブルドッグ、わぉ!
おいらもひとりでちまちまやってるよ。趣味グラマだけど。
規制よく食らうからここで質問出来ないのはキツイ
>>14 フィールドにもつのはどうしたらよいでしょう?
ContextMenu contextMenu = new ContextMenu();
をメソッドの外におけばオーケー?
あと登録がまだできてないです。
FormならControl.Add(this.contextMenu)かと思ったら、これも違うみたいで…。
>>15 ふらっとC#はけっこういいですよね。
今は和やかだがたまに時化る
DataGridViewでクリックしても選択状態が変わらないようにすることはできるでしょうか?
.Enabled = false; で一応なるのですがスクロールもできなくなってしまうので
スクロールはできつつ変わらない状態にしたいのですが
選択した時の背景色と通常の背景色を一緒にして急場をしのぐ
とかw
【目標】
マウスの右クリック(コンテキストメニュー)と右ドラッグ(ダウン-移動-アップ)に異なる処理を割り当てたい。
【現在】
やっと.csだけでcontextMenuを表示できるようになりました。
<Grid Name="img" MouseRightButtonDown="img_MouseRightButtonDown" MouseRightButtonUp="img_MouseRightButtonUp">
</Grid>
ContextMenu contextMenu = new ContextMenu();
MenuItem copymi = new MenuItem();
copymi.Header="copy";
copymi.Click += (s,e) => copy_Click(s,e);
contextMenu.Items.Add(copymi);
img.ContextMenu = contextMenu;
bool mousemove = false;
int startX;
int startY;
private void img_MouseRightButtonDown(object sender, MouseButtonEventArgs e){
mousemove = true;
//マウス位置取得
startX = e.X;
startY = e.Y;
MessageBox.Show("mousedown" + mousemove);
}
private void img_MouseRightButtonUp(object sender, MouseButtonEventArgs e){
//マウス位置取得。マウス位置計算
//if (移動量 > たとえば20ピクセル)
if ((e.X - startX) * (e.Y - startY) > 20 || (e.X - startX) * (e.Y - startY) < -20 MessageBox.Show("mouseup");
else ContextMenu.Show();
}
現在は、右クリックでは単にコンテキストメニューが開きます。
次になにをしたらよいんでしょう?
あと、
throw new NotImplementedException();
ってなにの意味なんでしょう?
ドラッグかどうかの判別だろ
NotImplementedExceptionはその名の通り未実装ってことだ
これの代わりに自分で処理を書くんだよ
>>26 ドラッグかどうかの判別というのは、具体的にはなにをするんでしょうか?
private void img_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
private void img_MouseRightButtonUp(object sender, MouseButtonEventArgs e)
のところで書いたつもりになっているのです。
NotImplementedExceptionは、未実装。なるほど!
>>25 考えてないとかググってないとかいうのは誤解です。
考えすぎてGoogleで出てきたサイトを見すぎて、何がなんだかわからないというのが正確です。
なにしろまるいちにちずーっとやってるのです。
途方にくれて質問してます。
ウィンドウサイズについて質問があります。
最小のウィンドウサイズに制限はありますか?
アイコンサイズ(56×66ピクセル)に設定しようとしましたが実行すると、幅が100ピクセルくらいあります。
FormのSizeプロパティに
Width 56
Hight 66
と設定しています。
FormBoderStyleはNoneです。
アドバイスお願いします。
>>考えてないとかググってないとかいうのは誤解です。
>>考えすぎてGoogleで出てきたサイトを見すぎて、何がなんだかわからないというのが正確です。
>>なにしろまるいちにちずーっとやってるのです。
納期に追われて数日徹夜した新人ですか?
とりあえず落ち着いて休憩でもすればいいんじゃないかな
>>28 悲しいかな、そこでわからないのが素人なところで、
これを見ても、なんか新しいクラスなのか…、と思っていた次第です。
>>29 最小値がないかい?
MinimumSizeとか
そのへんじゃないのかな?
>>29 横幅はある程度あったはず
Region使ったら?
>>30 ま、素人の趣味なので、別に納期はないですが、まあそんなことはどうでもよく、
ドラッグかどうかの判別についてよろしくお願いします。
>>27 WPFよー知らんのだけど
Vectorあるみたいだし、それで移動量調べたら?
>>33 ありがとう。
Region
でできました。
>>32 MinimumSizeではないみたい。
>>34 知らんまま適当にテストコード書いてみた
こういう感じ?
ドラッグ中の処理入れるなら使えないけどね。
bool mouse = false;
Vector mouseOrg = new Vector(0, 0);
private void Window_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
mouse = CaptureMouse();
Point p = e.GetPosition(this);
mouseOrg = new Vector(p.X, p.Y);
}
private void Window_MouseRightButtonUp(object sender, MouseButtonEventArgs e)
{
if (mouse)
{
ReleaseMouseCapture();
mouse = false;
Point p = e.GetPosition(this);
Vector mouseCur = new Vector(p.X, p.Y);
if ((mouseOrg - mouseCur).Length > 20.0)
{
MessageBox.Show("Drag!");
}
else
{
MessageBox.Show("Click!");
}
}
}
>>34 ファイルアイコンのドラッグ&ドロップというのは多分にシステム依存な動作なので、
各コントロールが小ウィンドウ化されておらず、抽象化の著しいWPFでは難易度の高い処理のはず。
少なくともWindows.Forms時代の記事は役に立たないので頑張って資料読みこなして実装してください。
>>38 それが回答ですか。
まあありがとうございました。
なんでWPFなの?
41 :
デフォルトの名無しさん:2010/05/26(水) 13:45:50
WPFで右ボタンのやつ書いてた人か・・・
なんか煮詰まってるのはわかるが書き込みの内容がスレの人間が悪い
みたいな方向に行ってるから気をつけたほうがいいぞ
荒れる原因になるから
それに勘違いしない方がいいよ
スレの住人はボランティアで協力してるだけで業務上君の面倒を
見るようにボスから命令貰ったわけじゃない人たちばかりだからね
WPFスレ送りにならないだけ不思議に思ってるくらいなんだし
WPF特有の問題じゃないから送りにくいんだよねw
43 :
デフォルトの名無しさん:2010/05/26(水) 13:57:32
>>42 WPF特有じゃん
C#コーダーは居てもWPFはまだ勉強中とかも多いはず
>>43 いやーそれ以前のプログラムの書き方の問題では
根気強く自分で調べる力をつける為に皆我慢しているのです。
isってコスト高いですか?
それほどでもない
値型やsealedな型との比較ならobj.GetType == typeof(Hoge)の方がわずかに速かったりするけど気にするほどでもない
型チェックした後キャストするならasの方が速い
自分で定義しているクラスのインスタンスについて、
フィールドの値を文字列ベースで取得することは可能でしょうか?
たぶんリフレクションを使うことになるんでしょうが……。
不可能じゃないけど、なんでそんなことやろうってことになったのさ
自分のクラスだったら最初からDictionary<string, object>にすれば?
逆にプロパティの方を内部で文字列使って実装する
なぜかisが極端にコスト高いと思い込んでいるような記述をよく見るな。
場合にもよるが、単なるインターフェイスへの暗黙のアップキャストの方がコスト高いことだってあるのに。
>>50 軽量なO/Rマッパーを実装しているところ。
SQLのフィールド名と実際のclass内のフィールドと対応させるために、
どうしても文字列でフィールドの実体に照合する必要がある。
>>51のように内部でテーブルで保持するのが嫌なら
LCGで動的にハードコードしてしまうというとっても大袈裟な最強の方法がある
リフレクションじゃどう頑張ったって軽量にはならん
プロパティにしてデリゲートアクセスにする手もあるぜ。
軽量というならプロパティ+デリゲートがいいだろうな。コード生成はそれ自体に結構時間がかかる。
デリゲートを使う場合、値の取得設定時のリフレクションを避けようとすると、
プロパティの型の不一致をごまかすのが難しいのでジェネリックを使ったトリッキーなテクニックが必要。
それやったわw
さらに、プロパティの型の継承関係にも対応するために結構ややこしいことになった。
インターフェイス被せたジェネリッククラスをMakeGenericTypeするのは
.NETの変態メタプログラミングには必須
60 :
57:2010/05/26(水) 23:18:18
おまえら高度なことやってんな。さっぱりわかんねえよ
.NET4ならそれdynamicで普通にデリゲート呼び出せばいいと思うよ
型チェックしてダウンキャストしてデリゲートを実行するコードをLCGで生成してくれるから
結局やってることは変わらないはず
63 :
57:2010/05/26(水) 23:36:15
うん、まあ2.0対象に作ったものだからね。
65 :
デフォルトの名無しさん:2010/05/27(木) 00:00:09
>>49が始まりか
>フィールドの値
これが意味わからん
.ToString()
の話じゃないの?
>>66 わーさっぱりわかんないー
まだまだ初心者から入門者への階段は登れません
class SomeClass
{
public string name;
}
sc = SomeClass();
type = sc.GetType();
prop = type.GetProperty("name");
prop.SetValue(sc, "lmn", null);
これでいけるらしい。
>>67 C# 4.0 の dynamic 使ったコード書いて、
それを逆コンパイルすればそんな感じのコードが生成されてるんで、
コピって書き換えれば OK。
>>69 まあ、使いどころ次第ではあるけども。
確かにリフレクションって普通のプロパティアクセスと比べたら2桁・3桁遅いけど、
そこがめったに呼ばれなければ特に問題にもならず。
ORマッピングなら使われまくりだろ
それどころか外部の入出力を除けば最大のボトルネックかも
ボトルネックかもな
74 :
デフォルトの名無しさん:2010/05/27(木) 07:43:44
>>66 ってリフレクションじゃないの?
そんなに速度違うのかなぁ
64bit版windows7には.net framework 2.0はx64版を
インスコすればいいんでしょうか?
Windows 7にはインストールする必要がない
!!
そういえばそうでしたorz
アップデートは必要だけどね・・・・
本読んでデリゲートとイベントの部分を勉強中。
クラスのところまでスムーズに理解できたのに、イベント難しいよぉ><
そうかぁ?addかremoveしかできないデリゲートなだけだろ
>>79 まず、デリゲートとイベントを普通に自作したらどうなるかを思い浮かべる。
次にそれを言語の機能としてサポートする方法を考えてみる。
>>79 イベントは単独で勉強せずに、Forms込みで理解した方が分かりやすいよ。
>>80-81 よし、わかった!
…うそです。。もうちょっと考えてみます。
>>82 本の後ろのほうにフォームアプリケーション作成っていうのが載ってるから
そこを読めばもっとわかるかな。週末に読んでみますぅ。
84 :
デフォルトの名無しさん:2010/05/27(木) 11:46:29
>>83 〜〜すぅ。
すまん、男だと判ってはいたが正直文字だけ見たら・・・・萌えた
どんだけ飢えてるんだよ。この童貞が。
ソースと同じで脳内変換大得意なんですぅ♪
で?
イベントとデリゲートが同じっていうのは
プロパティとオブジェクトが同じだと言ってるのと同じだよ
デリゲートは型ですぅ
真似しないでちょーだぃ。
構造体と一緒で、デリゲート型のオブジェクトのことを単に
デリゲートと呼ぶこともあるでしょ
けんかはだめですぅ〜(ズサァ
そのとおりでちゅわ
普通にビルドできたけど?@VS2008
msbuildでビルドしたらビルドはできたが実行時例外が出たw
リソースの設定がおかしいみたい
VS2005のWPF開発環境って冗談みたいなもんだからなあ
>>74 >>60 >>66 >>68 のそれぞれのやり方で、プロパティアクセスの処理部分だけを繰り返す形にして、
つまり余分な処理はなるべく除いた状態でプロパティアクセス部分の速度を計測してみた結果。
かかる時間がおおよそ
9:11:400
となった。
つまりリフレクションだと40倍くらい遅かった。
プロパティへの1回アクセスにかかる時間でいうと、
おおよそだが、
24ns
27ns
1100ns
みたいな感じ。
ちなみにx64にするとやや速度比が変わって、
18ns
35ns
800ns
みたいな具合、まあ速度の順位は同じだが。
そもそもそんなの作る必要があるのか?
興味本位って無駄と浪費の基本だぞ資本主義的には素晴らしい事だぞ
データ用の変な基底クラス使ったりしないで普通のオブジェクト使いましょうっていうのは最近の流行りだからな
そうするとどうしてもそんなのが必要
実際.NETは内部でリフレクション使いまくりだよ
XmlSeriarizerなんかパフォーマンスが重要だから、C#のコードを動的に生成してコンパイルしたりするという
常軌を逸した最適化をする
105 :
49:2010/05/27(木) 23:13:06
>>101 ひぇ〜、そんなに違うのか。
あとしばらくは.NET 2.0の範囲で作りたいので、単純な>68の方法で
実装し終わったところなんだけど、
>60でも動くならそっちで試してみようかなぁ……。
ぱっと見じゃあ使い方がよくわからないけど。
>>104 TableBaseを共通既定にして属性を付けたフィールドを
書いてあげることで自動的にテーブルと読み書きする
ActiveRecord的な実装です。
最近の流行りじゃなくてすんません。
共通の基底クラスがあるなら無理にフィールドにしなくていいでしょ
フィールドの代わりにテーブル持って、プロパティでラップするだけで済むこと
速い簡単確実分かりやすい
>>106 それって型付きDataSetそのもの…
>>106 テーブルってったってそれがDictionaryを意味するなら、
ADODB.RecordSetと変りなくない?
実装がどうだろうと利用者には関係ないだろ
共通の基底クラスを必要としないのはそれはそれでメリットがある
リフレクションで外からメンバ触るような方法って共通の基底クラスとかお約束コードとかで
フレームワークに縛ってしまうのを避けるために採るものなんで
共通の基底クラス持っちゃったら意味ないよ
ちなみに、Mainの
PropertyAccessor alpha = PropertyAccessor.Create(typeof(Hoge), "Alpha");
PropertyAccessor beta = PropertyAccessor.Create(typeof(Hoge), "Beta");
を
PropertyAccessor<Hoge, int> alpha = PropertyAccessor<Hoge, int>.Create(typeof(Hoge), "Alpha");
PropertyAccessor<Hoge, string> beta = PropertyAccessor<Hoge, string>.Create(typeof(Hoge), "Beta");
こんな風にしてやると、完全に型指定状態になって、
1アクセス5nsくらいとか爆速になる。
とはいっても、ORマッパーみたいな用途じゃ結局はobjectで扱うしかないけどな。
>>111 すげえ! これで採用できる目処が整った。
今日の範囲だと.NET系の別言語で実装したんだけど
正直C#と比べて利点があまりないので、ORM周りはC#で実装しなおすかもしれない。
こんな感じで使用する。
class Book : TableBase
{
[Field(FieldType.Text)]
public string Name;
[Field(FieldType.Integer)]
public int price;
}
var book = new Book(){Name = "tech", price = 113};
cursor.Save(book); // INSERT TABLE
フィールドじゃなくてプロパティでないと使えないよ
>>111のやり方をフィールドに適用するのは原理上無理
>>114 問題ない。ちょっといじったらプロパティ、フィールド両対応になったよ。
俺には高度過ぎて付いて行けない。結局どこが楽になったの?
なんとなくコード生成マクロみたいなのを作れば済みそうな気がするんですが・・・
117 :
デフォルトの名無しさん:2010/05/28(金) 01:32:34
なにやら面白そうだけど自分がやって来た範囲ではどう使っていいか
わからないのでROMしてたんだが、リフレクションってもしかして
ビューワーなんかのプラグイン認識なんかで使う感じなのかな?
あれってどうやってるんだろうと前から思ってたんだが
>>117 動的にアセンブリを読み込んで、
プラグイン用のインターフェース実装してるやつを探して、
インスタンスを作成する。
これ全部リフレクション
.NET4でプラグイン機能実装するならMEFの方が便利だけどね。
119 :
デフォルトの名無しさん:2010/05/28(金) 01:59:27
>>118 なるほど〜
ありがとう
長年の疑問が解けたわw
フォーム上から追加って具体的にどういう操作?
122 :
デフォルトの名無しさん:2010/05/28(金) 03:33:14
>>121 たぶんあれだろ
デザイナーが項目差し込んでるように自分のプログラムでも
項目増やしたいんだろうと思うんだけどさw
実装面倒そうだよね
>>121 フォーム上でツリービューにノードを追加してそれを次回起動時にも記憶出来るようにしたいんです
124 :
デフォルトの名無しさん:2010/05/28(金) 08:04:46
>>119 もっと単純に指定したプロパティの値の読み書きをできたりする
フィールド・メソッド・プロパティ・インターフェースとか基本的な部分に動的にアクセスできる
>>123 基本的にはそういう機能を実現したフォームを自前で実装するしかないだろうな。
あるいは、流用出来そうなオープンソースのプロダクトを探すか。
>>123 適当にXMLででも保存すりゃいいじゃない
質問です。
Webブラウザを使って、
<input name="title" id="title" tabindex="1" value="" maxlength="255" mt:watch-change="1" onkeyup="rebasename(this)" />
に「テスト」とかと入れたいです。
private void Form1_Load(object sender, EventArgs e)
{
webBrowser1.Navigate(URL);
}
private void webBrowser1_Navigated(object sender, WebBrowserNavigatedEventArgs e)
{
HtmlElement HE = webBrowser.Document.GetElementById("title");
HE.InnerText = "テスト";
}
実行すると、
HtmlElement HE = webBrowser1.Document.GetElementById("title");
の行で、HEがnullのままになります。
HtmlElement HE = webBrowser.Document.GetElementById("title");
HE.InnerText = "テスト";
の2行がなければ、ふつうにページを表示できます。
アドバイスお願いします。
webBrowser.Document.All.GetElementByID だとどうです?
Navigated時点じゃまだDocumentを作り終えてない
DocumentCompletedで
ブラウザコンポーネントの質問多すぎ
>>128 HtmlElement HE = webBrowser1.Document.All.GetElementByID("title");
としてみたところ、
'System.Windows.Forms.HtmlElementCollection' に
'GetElementByID' の定義が含まれておらず、
型 'System.Windows.Forms.HtmlElementCollection' の最初の引数を受け付ける拡張メソッドが見つかりませんでした。
using ディレクティブまたはアセンブリ参照が不足しています。
とエラーでした。
>>129 なるほど!
しかし、
DocumentCompletedでも症状が変わりませんでした。
132 :
デフォルトの名無しさん:2010/05/28(金) 13:31:00
その前にtitleってやめないか。htmlタグで存在するし
もうちょっと一意性を確保した方がいいぞ
133 :
デフォルトの名無しさん:2010/05/28(金) 13:37:32
>>130 まあ時代的なものでしょ
大体は自動送信とかそんなんだろうけど
できたで
private void button1_Click(object sender, EventArgs e)
{
webBrowser1.Navigate("
https://login.yahoo.co.jp/config/login");
}
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
HtmlElement hoge;
hoge = webBrowser1.Document.GetElementById("username");
hoge.SetAttribute("value", "hoge");
}
正直、HTTPの自動制御はPerl/Python/Rubyあたりでやった方が遥かに簡単だけどな。
この分野でのC#の利点は、ランタイムが事実上標準で入ってることとGUIが作りやすいことだけ。
136 :
デフォルトの名無しさん:2010/05/28(金) 13:43:19
>>134 DocumentCompletedだと数回呼ばれない?
そんなの自分でなんとかしろ
138 :
デフォルトの名無しさん:2010/05/28(金) 13:44:47
139 :
136:2010/05/28(金) 13:46:07
>>137 別人だって
DocumentCompletedで処理するのがいいか
Navigatedで処理するのがいいか
同じやつが会社で作ってるソフトの部分を質問してそうな気がする
そんな馬鹿な…
サブミットはこうやで
webBrowser1.Document.Forms[0].InvokeMember("submit");
WebBrowserの制御は面倒くさいから
FirefoxでFirebug使ってやりとりしてる内容をトレースして
そのままエミュレートしてやった
Amebaだけど
>>115 どうやったの?
デリゲートにバインドするにはメソッドが無いといけないから
フィールドだけでは絶対に無理なわけだが
>>111の方法は値の出し入れ時にリフレクションを使わないのがメリットなんで
フィールドでも同じことがしたいならLINQのExpression TreeかILGeneratorで
アクセサメソッドを動的に生成してやらないとできないはずだけど
そこまでくると「ちょっといじった」とは言わないでしょう
>>145 どうって、getter/setterの代わりにラムダ式を指定してあげただけなんだけど。
ちゃんと動作も確認したぞ。
ちなみに、こんな感じ。
public PropertyAccessor(FieldInfo field)
{
Getter = (TTarget x) => { return (TProperty)field.GetValue(x); };
Setter = (TTarget x, TProperty y) => { field.SetValue(x, y); };
}
それ結局常にリフレクション使ってるから意味無いよ
>>111みたいなややこしいことしなくても最初から全部リフレクションでやるのと一緒
>
>>111の方法は値の出し入れ時にリフレクションを使わないのがメリット
>>149 高速な方法があるならそれを使えばいいし、
内容なら普通にやればいいのさ。
高速な方法はあるよ
.NET2.0ターゲットみたいだからDynamicMethod一択
いわゆるLCG
IL書き下してGetterとSetterを動的に生成する
理想はメンバ単位じゃなくて型単位でコード生成
問答無用で最速
>>153 (ライブラリから見て)外部のオブジェクトに
動的にアクセスするには、リフレクションを使うのが普通。
普通っていうかリフレクション使わないと不可能
上の議論はすべてその後のキャッシュ手法の話
>>111 今更だけどこのソースのAdaptedAccessorクラスってなんのためにあるの?
Adapterパターンと関係あるの?
>>156 サンプル実行してデバッガで追っかけてご覧。
>>156 単にobject型として扱うだけならいらない。
普通に型指定されたターゲットやプロパティへのアクセスでもいらない。
必要なのはちょっと特殊なケースなんだよ。
たとえばTableAdapterの基底クラスから利用する場合<わかる人にはわかるかも。
TableAdapterの基底クラスから利用する場合の例を挙げると、
SqlTransactionとかOracleTransactionとか、実際の型は実行時まで想定できないけど
とにかくDbTransaction派生の型で定義されてるプロパティに、DbTransaction型としてアクセスしたい場合とか。
まあ限られたケースだよ。
※もっとも
>>111の例はpublicなプロパティしか想定してないので、どっちにしてもこのままじゃダメなんだが。
あるいは、
>>113の例でいうと、
PropertyAccessorクラスとして扱う場合は不要だが、
例えば PropertyAccessor<TableBase, object> クラスとして扱いたい場合なんかに使われる。
>>111の
PropertyAccessor alpha = PropertyAccessor.Create(typeof(Hoge), "Alpha");
↓
PropertyAccessor<Hoge, object> alpha = PropertyAccessor<Hoge, object>.Create(typeof(Hoge), "Alpha");
みたいにして試せばどう使われるのか分かる。
ListにURLとタイトルを入れて、URLだけを取り出すには、どうしたらいいですか?
List<string> lists = new List<string>();
lists.Add("
http://www.***.com" + "\t" + text);
のようにすると、個別にURLとtextを取り出せないでいます。
Dictionaryとか使えよ。
163 :
136:2010/05/29(土) 19:11:43
Dictionaryどう使うんすか?
165 :
136:2010/05/29(土) 19:14:37
>>161 むしろURLとtitleをフィールドに持たせたstructなりclassを用意して、
List<HomePage> lists;
などとする。
167 :
デフォルトの名無しさん:2010/05/29(土) 19:26:22
便乗質問
自作クラスをリストで管理してる場合に自作クラス内の特定項目で
検索かける場合は泥臭く頭からクラスを取り出しては項目をチェックするしかないのかな?
>>167 そのためのLINQ。
.NET 2.0時代のコードで頑張りたいなら、
Dictionaryでその特定のフィールドの値で辞書を引けるようにするといい。
そういうときのためのLINQ
170 :
デフォルトの名無しさん:2010/05/29(土) 19:38:50
>>167 泥臭いかそれ?こんな感じでいいんだが。
var.found = list.Find((x) => x.Prop == "...");
あるいは
var found = list.FirstOrDefault((x) => x.Prop == "...");
LogO^2 が気になるんなら、List<Item> とは別に
private Dictionary<string, Item> propToItem;
とか用意して
var item = propToItem["..."};
172 :
171:2010/05/29(土) 19:45:00
LogO^2 -> O(n) でしたすいません
やべーdynamicってこうやって使うのか。感動した
dynamic doc = webBrowser.Document.DomDocument;
string selectedText = doc.selection.createRange().text;
dynamicのおかげでCOMのサーバを使うときに巨大なDLLが生成されることはなくなったけど、
インテリセンスは効かなくなったね。
COMの場合は普通にRCW作っておいて開発して、
最後にdynamicに置き換えてDLLサイズ縮めるとかやってもいいかもねぇ。
IronRubyで定義したクラスや関数をC#から呼び出すことはできる?
>>176 一般的に動的言語で作成したプログラムを静的型付き言語から呼び出すことは非常に難しい。
ただC#にはイベントと言う便利な概念があるので、
C#からIronPython/Rubyへの通知はこれを使うといい。
>>177は嘘
dynamic使ってあたかも普通のオブジェクトのように扱える
>>178 おお! その手があったか!
ずっと.NET 2.0+DLRで動かしてたから思いつかなかったわ。
どうもありがとう。.NET 4.0すげえ!
dynamic使えない.NETのバージョンであっても全然難しくない
scriptEngine.Operations.InvokeMember(hoge, "hogeMethod", a, b)
みたいな感じだったかな
どうでもいいけど.NETのバージョンは4.0じゃなくて4と表記するのが正しい
C#やCLRのバージョンは4.0
>>180 COMコンポーネントを呼び出して使っているならともかく、
C#側を従、動的言語を主として実装したシステムで
C#側から動的言語側を呼び出そうとしたら
目的のオブジェクトまで階層が深くなっちゃうので大変だし、
決してその呼出は速くない。
(もちろん動的言語側で何がしか必要なオブジェクトを直接返す機構を実装する方法もあるが)
数多く呼び出したいならイベントハンドラ越しに呼び出すのが最も効率がいい。
>>181 いくつか例外はあるが、マイクロソフトとしては.NET Framework 4という呼称に統一してるみたいだね。
外部の記事ではほとんど全く気にされてないみたいだけど、固有名詞だからなぁ。注意します。
例外の例(この記事の一番後ろの章)
http://msdn.microsoft.com/ja-jp/magazine/ee405899.aspx
それだと動的言語側がC#側に依存しちゃうよ
余計な相互の取り決めを必要としないのは大きなメリットだと思うよ
>>183 単純にパフォーマンス上の問題。
1秒間に60回C#側からDLRをぶん回したら結構来ちゃうのよ。
調べたら境界面をチューンするのが効果的だと分かったのでこんなやり方に。
>>184 dynamic使ってもダメ?
C# 4.0のdynamic、っていうか、CallSiteによる動的コード生成結果の
キャッシュ機構って結構賢かったはずだけど。
あと、Python側で.NETのインターフェースを継承とかやれば早くならないかな?
>>185 スマン。.NET 4はまだ未検証なんでわからん。
(ランタイムを配ることになるのでめどい)
C#側でインターフェイス書いて動的言語側でそれを継承/実装してあげるのが一番素直かもしれない。
速度的にはイベントハンドラ越しとさほど変わらないと思うが、その方が素直だよな。
今はDLRを捨てて組み直してるところなんだが、
初めからそうしておけば(C#のフレームワーク側にinterfaceを用意)
よかったと思ってるところ。
トンクス。
イベントかdynamic経由で呼び出せるのか
モバイルの2chブラウザでAA表示とかあるけどどうやって判定してるんだろ
各行の頭の文字コードがどこの範疇かみてるんじゃない?
うん。そうだよ。
文字列への文字の追加は例えば「string a = "a" + "b"」のように演算子+を使うことで出来たんですが、
文字列の最後の文字を削除したい場合などはどうすればいいんですか?
192 :
デフォルトの名無しさん:2010/05/30(日) 08:32:51
こんな感じ?
string a = "b" + "c";
a = a.Remove(a.Length - 1);
>>192 なるほど、こんな方法があったのですね
助かりました。ありがとうございます
.NET frameworkのバージョンはどれで作ればいいですか?
4はまだ普及してませんかね?
普及云々って、公開するつもりなのけ?
そのつもりです
>>195 ランタイム入れるの結構簡単だし、
標準インストールにこだわるんでなければ別に4でいいだろ。
4のClient Profileのランタイムサイズ結構小さいよ。
標準インストールにこだわりたいんなら、XPターゲットは2、Vista以降なら3.5。
Vistaは3.0だったはずだ
7が3.5SP1
>>198 そしてXPはsp3に至っても、標準では.NET入ってない :(
3.5のランタイムは死ぬほどでかいけどな。
でも4ってクライアントプロファイルあんま意味ねーだろってくらい差がない。
そういや、.NET 4って.NET 2〜3.5は入ってるのこれ?
入ってない
というか3.0と3.5は2.0にdll追加しただけのものだから特別だ
なんでおわっとるねん
似非関西弁でお送りしました
めでたしめでたし
互換性があるので問題ない。
実際、手元の.NET2.0〜3.5のやつを全部.NET4で動かしてるけどちゃんと動いてる。
.NET4だけを入れても2.0や3.5時代のアセンブリを動かせるってこと?
実際に確認してないけど
ヘルプの.NET Framework 4 の新機能ってページ
>旧バージョンの .NET Framework でビルドされたアプリケーションを実行するために、
>.NET Framework 4 の共通言語ランタイム バージョンが自動的に使用されることはありません。
>.NET Framework 4 で旧バージョンのアプリケーションを実行するには、
>Visual Studio のプロジェクトのプロパティに指定されたターゲット バージョンの .NET Framework を使用して、
>アプリケーションをコンパイルする必要があります。
>または、アプリケーション構成ファイルの <supportedRuntime> 要素を使用して、サポートするランタイムを指定できます。
さらに<supportedRuntime>のページ
>.NET Framework Version 1.1 または .NET Framework Version 2.0 で作成されたアプリケーションまたはコンポーネントを
>.NET Framework Version 4 で実行するには、サポートされるランタイムのリストで .NET Framework 4 を指定するだけでは不十分です。
>さらに、構成ファイル内の <startup> 要素で、 useLegacyV2RuntimeActivationPolicy 属性を true に設定する必要があります。
>設定しない場合、サポートされるランタイムのリストで、.NET Framework 4 よりも低いバージョンの
>.NET Framework のうち最上位バージョンが検索されます。
>.NET Framework 4 がリストにある唯一のランタイムである場合、読み込みは失敗します。
最低でも*.configを設定してやらないといけないんじゃないの?
>>202-204 誤解を招く言い方まずい。
.NET 4、.NET 2.0 からランタイム含め作り直してるって言っても、
表立っての仕様は互換性ある。
パフォーマンス上の観点から内部的に実装しなおしただけ。
4 より前のコードもほとんど動くはず。
まあ「ほとんど」が曲者なんだけどな
>>210,211
.NET 2〜3.5のアプリを.NET4で動かそうとしたら、
要するに.NET4向けに再ビルドしたあとで、
アプリケーション構成ファイルに設定追加が必要ということなんだな?
.NET4向けにビルドしたら.NET4で動くに決まってるだろ
再ビルドせずに.NET4で動かしたい場合の話
>>213 違う
再ビルドとsupportedRuntimeはどちらか片方よ
つか
> .NET4向けに再ビルドしたあとで、
これで.NET 4で動かなかったら問題だろw
// 動作が変わってて意図したとおりに動かない可能性はあるけども
ソースの上位互換はまだ大丈夫かな
一応動くはずだけど保証はできないからテストしろってことだろ
すでに2.0ターゲットでリリースされたアプリケーションをユーザが勝手に4で動かして
不具合が出て開発元に文句付けられたりしたら困るからな
>>214-215 なるほど。再ビルドするなら完璧なわけね。
しかし、自分で書いてるコードはともかく、利用してる外部ライブラリ関係も全部.NET 4で再ビルドが必要ってこと?
基本的にオープンソースで固めてるから不可能ではないけど、
かなり面倒だな……。
ビルドする時にバージョン記憶してて
そのバージョンの.net使うようになってるはずだから
問題になるとしたら最ビルドした時だけじゃないかな
CLR4のアプリケーションからCLR2のdllを参照するとdllはCLR4で動くよ
リビルドはいらない
4と2のCLRを同一プロセスにロードできるようになったというのはライブラリには関係ない
221 :
208:2010/05/30(日) 23:13:56
>>210 動作検証用に最新のCLRを使わせる機能が用意されてる。(.NET2.0の頃からあって1.0/1.1からの過渡期に使ってた)
全部に適用されちゃうので
>>210の書いてるようにApp.configで設定する方が望ましいが、数が多くて個別設定が面倒なので…
http://msdn.microsoft.com/ja-jp/library/ms994387.aspx [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework]
"OnlyUseLatestCLR"=dword:00000001
※64bit使ってる人はWow6432Nodeも忘れないように
>>209 2.0〜3.5だけじゃなくて、1.0/1.1でも2.0で動いてたやつなら4でも動く
>>217 問題はテストのコストだよな。
まあ、お客さんに.NET2.0をアンインストールしないようにしてもらえばいい、
というか、意味もなくそんなことするお客さんもいないけど。
ASP.NET 2.0のサーバサイドで
あるURLにPOSTした結果を取得したいのですが
どのようにすればいいか、そもそも可能かどうかすら見当がつきません。
流れとしては
1.データを入力しポストバック
2.クリックイベントであるURL名にクエリ文字をつけてPOST
3.結果を取得
4.結果をDBに保存
という流れになると思われます。
具体的にいえば
GoogleMapのジオコーディングを行い住所データを軽度・緯度に変換して保存したいのです。
JavaScriptでやればいいのでしょうが出来るだけサーバサイドでやりたいと考えお伺いしてみました。
よーわからんけど、HttpWebRequest でPOSTすればいいんじゃね?
>>224 HttpWebRequestを使えば、POSTしてその結果を受信できる。
DOBONさんのところを見ろ。
APIを直接たたくと早いのでこういう感じにしてみた
http://ideone.com/rGhe5 (コントロール側でダブルバッファリングを有効にし、BeginDraw()を呼び出す段階でOnPaintから渡されたグラフィックスオブジェクトを渡している)
だが、これでも重く感じるときがある
これより早くする方法はない?
#追記
呼び出し側は各行ごとにTextSpilitterでトークンごとに分け、GetTokenType()で色付けするべきトークンかどうか調べた後、Graphics.DrawString()に渡しています
http://ideone.com/7rEYY
これ以上はスレ違いだけどちょっとテストしてみたのでせっかくだから
予想できたことだけど略字だとだめだった
一致したところまでの情報が返るわけでもなく、ZERO_RESULTSとしか返ってこない
番地は半角でも全角でも漢数字でもok
区切りがよければ間に空白が入ってもok
「県」とか「市」っていう文字はそこに空白があればなくてもok
「町」はないとだめみたい
確実に日本語で返して欲しいならlanguage=jaは必要
思ったより柔軟
>>225 ,226,229,230
レスが遅くなりました。
ありがとうございます。
皆様のおっしゃるようにやってみたところデータが取得できました。
レスポンスデータを見れば変換ができたかどうかも判別可能っぽいので
やりたいことは出来そうです。
皆様ありがとうございました。
>>227 Direct3D
それ以外のどんな努力も無意味になる圧倒的な速度
>>232 であるからこそ、WPFはDirect3D(9)を全面的に採用しているわけで。
(´・ω・`)…
今このスレをふと覗いた初心者だけど、
c#ってmono(?)とかいうやつでwindows以外のプラットフォームでも
同じコードで動く仕組みなんだよね?
direct3dも他のプラットフォームで動くようにできてるの?
寝言は寝て言え
.NET=Monoではないので利用できない機能はある
Direct3Dもその一つ
.NETとDirect3Dも別物だべ
俺一人に対してみんなとは・・・
和んだ
このスレはジサクジエンでできているというのは本当だったんだな
俺のスクリプトはうまく動いてるようだな
247 :
↑:2010/06/01(火) 00:50:20
これも俺の作ったBotが書き込んだ
すげー
Webブラウザコントロールでテキストを選択したら、その範囲を取得するには、どのイベントフラグを使えばよいですか?
テキストボックスの場合には、selectedtextがありますが。
イベントフラグ?
253 :
デフォルトの名無しさん:2010/06/01(火) 10:50:27
>>252 dynamicって.netのバージョンいくつからだっけ?
4.0からじゃねーのか?
よく知らんが
255 :
デフォルトの名無しさん:2010/06/01(火) 10:56:07
dynamicで選択範囲が取れるなら拡大縮小もできそうだな
どーでもいい
ListViewをクリックした際、クリックされたのが余白かどうかというのはどのように判断させられるんですか?
取り敢えずHitTestしてみれ
dynamicを使わなくてもいけるんじゃ
>>259 .NET4じゃないなら、COMを参照登録していろんなキャスト入れれば出来るよ
261 :
257:2010/06/01(火) 13:10:33
>>258 レスありがとです
HitTest使ってみたら無事出来ました
262 :
デフォルトの名無しさん:2010/06/01(火) 16:33:39
>>260 COM参照をわざわざ書くのがいやだったので
書かなくて済んだのがいいだよw
いいだね
んだ
一番手軽なのはSilverlightだよ
数十秒でインストール完了する超軽量.NET
Silverlightって.NetFrameworkも内包してるの?
>>267 その質問は内容が非常に問題がある。
Silverligthもれっきとした.NET Frameworkファミリーの一つで、
「プリウスはトヨタ車を内包してるの?」というのと同じ。
SilverlightもCLIの一実装だからBase Class Libraryが含まれていることは間違いない。
しかしそれ以外に何が入ってるかは調べる必要がある。
例えばWindows.Formsとかは入ってない。
ソースコードが見れない状態で、SDKの標準ツールのみでMSILを直接編集するにはどうしたらいいでしょうか?
>>269 ildasm.exeじゃ駄目ですか?直接とは言いがたいけど。
編集って既存のものを改造するってこと?
単に作成するだけならEmit使えばいいけど。
違います...
>>269 意味がわからない。SharpDevelop使えば
フリーソフトの範囲で直接MSILのプロジェクト作れるのに。
まあ、意味わからんね。
とりあえず、IL 逆アセンブラー通してアセンブリソースに戻して、編集して IL アセンブラーでできるけども。
こういうクラスの配列があった時
class Huga
{
public int ID;
public string Name;
}
クラスの配列からNameを抽出してstringの配列を生成するスマートな方法ないかしら
とりあえず今はHuga[]をforeachで回してList<string>にAddし、ToArrayして取得してます
hoge.Select(x => x.Name).ToArray()
Array.ConvertAll(hoge, x => x.Name)
Linq便利だなぁ
現状2.0しか使えないけど覚えときますね。ありがとん
スレッドプールでキューされている処理をリストボックスなどにリストアップしたいのですが、どんな方法がありますか?
279 :
278:2010/06/02(水) 13:23:16
すみません処理の最初にリストボックスに追加すればいいだけですよね
スレ汚し失礼しました
スレッド実行される処理の最初にリストボックスに追加してもキューされてる処理をリストアップしたことにはならないと思うんだが別にいいのか
それはタイムカードをチェックしても社員が出勤しているとは限らないのと似ている。
>>281 ((((;゚Д゚))))ガクガクブルブル
似てるけど問題の本質は全然違うだろw
>>277 やろうと思えば、.NETだけ2.0で、C# は3.0使えるよ。
LINQ相当の関数自分で用意すれば、だけど。
すぐにToArrayするようなのなら、Arrayの静的メソッド+匿名メソッドで同様なのが幾つかある。
276の下のなんかはラムダ式じゃなくて
delegate(Huga x){return huga.Name} というような感じでなら2.0でいけるわけで。
いけるわけですね
初めWindowsアプリケーションでツリービューとリストボックスを使って
エクスプローラもどきの簡易ファイラーを作ってたんですが、
リストビューのアイコン表示出来るのが魅力的でリストビューに乗り換えてみたら
SelectedItemがなくて色々不便で、今WPFアプリケーションというのを見てたら
リストビューにSelectedItemがあって便利そうだったので乗り換えようかな・・
なんて考えてるんですがこの考えは浅はかですか?
>>289 レスありがとです
とりあえずトライしてみます
別にプロパティなくても自分で継承して実装しちゃえばいいのに・・・
>>288 全く違う話だけど自分もファイラー作ってて、レスポンスが悪いのに悩んでた
いろいろ調べたらSHGetFileInfoでアイコンを取るのに時間がかかってたことが判明
そこだけ別スレッドで取るようにして後で再描画するようにしたら、もの凄く快適になった
参考までに。常識だったらごめん
C#2.0以降のWindowsForm Appで
iTextSharpを使用して帳票を作りたいのですが、フォントをセットするときにフルパスで指定しなければいけないようです。
フォントのパスをC:\…と切ってもいいのですができればもっとスマートな方法を探しています。
APIのSHGetSpecialFolderPathを使用するしか方法はありませんか?
こんなのとか
System.Environment.ExpandEnvironmentVariables("%windir%\Fonts")
>>294 おぉ!
ドトネト標準系で行けるならこっちのがイイ感じです。
わざわざAPI宣言しなくていいし
ありがとうございました。
System.Environment.GetFolderPath( System.Environment.SpecialFolder.Fonts );
ってのも。
297 :
294:2010/06/03(木) 13:14:33
そんなのあったんだ。そっちの方がいいな
>>298 .NET4でSystem.Environment.SpecialFolderの定義が増えたから
それより前だとないかも。
地味に便利になっていくな
それだけのために捨てるのはどうかとw
それが301を見た最後の光景だった。
当然タイムカードには記録されていない。
>>301 次にお前はVS2010重ぇと言うっ!!
>>301の
上司でございます。
皆様に部下の
>>301が大変なご迷惑をおかけしたようで
本人に代わってお詫び申し上げます。
それでは失礼いたします。
新兵の訓練は徹底的にやっておけよ軍曹
プログラム業界はどっかの軍隊なみに体育会系が多いのか
10年働けるソルジャーを欲してるくらいだ
MIAが多発するしな
肉体労働だし
体力勝負だし
馬鹿で無能な自分の受けてる待遇が世の中の一般だと思うなよまったく
もう34になるがプログラマー30歳定年説ってどこいったんだよ……
技術に触れない管理職なんていやだ!と10年前はほざいていたがかったるいな
35歳定年説しか知らん
シリコンバレーでは日本的なエンジニア定年は無い
という記事を日経BPのPC Onlineで読んだ気がする
34歳の俺が一番下っ端(年齢的にも立場的にも)なうちの会社もどうかと思う。
うほっ
Click2とClick1が同じスレッドで呼ばれるからとまるに決まってる
>>318 この短いコードで何か色々と間違っていて
どこから突っ込んでいいのか分からないんだが、
とりあえずInvokeしたらUIスレッドで動くんだからその間UIが止まるのは当たり前だろ?
まず、重い処理があるならBackgroundWorkerを使おうよ。
321 :
318:2010/06/03(木) 23:20:31
>>319-320 レスありがとうございます
BackgroundWorkerを使ったら無事別スレッドで実行することが出来ました
323 :
デフォルトの名無しさん:2010/06/04(金) 20:09:07
m_li.BeginAcceptTcpClient(new AsyncCallback(callback), m_li);
1回目の接続の時は問題なくcallbackが呼ばれるのですが2回目以降は呼ばれません。
どうしたら2回目も呼ばれるようになるでしょうか?。
接続→callback→callback終了で切断→再接続→callback(ここが呼ばれません)
(*´ω`*)
325 :
323:2010/06/04(金) 21:18:03
あ、理由がわかった。
ループしているのに理想どおりに動かないと思ったら使い方を間違えてたw。
(´・ω・`) …
327 :
デフォルトの名無しさん:2010/06/05(土) 22:38:06
デバッグで実行しているのにTCP周りでこける(たぶん)とデバッグにならずにそのまま全て終了してしまう。
Application.Run(new Form_Base())のフォームから更にshowで呼び出しているフォームなのに全て終了して
しまうのが謎です。
エスパー求む!!。
>>327 TCP周りの動作チェックでフォームなんか使うな。コンソールを使え。
パフォーマンスカウンタでProcessのInstanceName指定するのって、
プロセス名が被ってるの(svchostとか)だとどうなんの?
コード書いてみたけどよくわからん。
何の為のPIDだ
PIDから指定ってできたっけ?
とりあえず"svchost""svchost#1""svchost#2"てな感じで区別されてるのはわかった。
>>327 デバッガで止める例外を指定してなくて、何か例外が起きてるんじゃねえの
333 :
327:2010/06/06(日) 00:08:19
デバック入れまくっても駄目だったけどソースに賄賂を贈ったら素直になった
ありがとん
コンソールアプリで自分がコマンドラインから起動されたかどうかを知る方法はありますか?
ない。
多様化で引数渡せば?
現在C#でミュージックプレイヤーを製作しています
スキンに対応させたいのですが、そういう方法を分かりやすく説明しているサイトもしくは本はありませんか?
やりたいこと(優先度)
1.背景の変更
2.フォントの変更
3.ウィンドウの外見の変更
まずは完成させろ
WinFormsでやるのは恐ろしく面倒だからわかりやすいサイトがないとできないようなら諦めた方がいい
やるならWPFだな
フレームワークのコンセプトとしてそういうのを重視してるからとっても簡単
>>334 環境変数読めば、分かるOSやshellもあるが、
C#関係なさすぎる(.NETすら関係ない)ので、
他所でおねがいします。
>>334 MSDNのフォーラムにその話題があるよ。
実はその問題の解決はかなり難しい。
>>337 すっごいショボいけどPictureBoxの上にコントロール置きまくる仕様で
Formのサイズが固定なら簡単じゃね?背景だけだが
1やるなら3もやらないとダメ
背景付けてしまうと上に乗ってる全てのコントロールの外観を変えないと非常に見栄えが悪い
ミュージックプレイヤーぐらいなら
フォームのマウスアップダウンムーヴのイベントで全部拾って
座標で振り分けるという力業でやってもいい気がする
346 :
デフォルトの名無しさん:2010/06/06(日) 22:51:43
>>345 labelにもクリックイベントは付くのでそこへ画像当てはめればいいんじゃね?
問題はだ・・・
透過情報を持った画像をボタンぽくする場合winformだと面倒じゃなかったっけ?
面倒ですね
nico動でもかなり苦戦してた輩がいたなwwwそれ。
349 :
デフォルトの名無しさん:2010/06/07(月) 11:49:37
クラスの使い道がいまいちわかんないんだが
そのうち分かるよ
大丈夫。タイムカードの使い道は分からなくても君は管理されている。
俺がお前を管理してやる
ニコニコ動画のプレイヤーくらい作ってやんよ
名前 ふりがな メールアドレス 電話番号
の4項目をもつListをつくって、そこにそれぞれ項目を追加するには、
List<string> mailaddress = new List<string>();
のあと、どのようにすればよいですか?
SubItems.Add;
を使うのではないかと思うのですが。
たとえば、
hitomi ひとみ
[email protected] 03-3333-3333
とかだったら?
待て
なんか間違ってるぞ
>>354 そういうフィールドを追加したstructを定義する。
それをList<AddressInfo>で管理する。
なんだSubItemsって
ListViewとごっちゃ?
structはないわ
どう考えてもクラスにするべき
>>359 4項目を一時的に保持するだけならimmutableなstructでもいいように見えるけど。
おそらく359のツッコミに対してその返答はズレてる
でも359も気にする必要のない所を気にして言ってるようなので
同じくズレてる
お前のズラもズレている
ズラの確認してきました
オヅラさん…
>>356 354です。
どう定義するんでしょう?
List使うの初めてで、よくわからないでいます。
>>365 4項目を持つListじゃなくて4項目を持つclassなりstructを作って
それのListを作るんだよ。
もうこんなんでもいいじゃん
public class Sample ←構造体でもどっちでもいいよもう・・・
{
public string 名前;
public string ふりがな;
public string メールアドレス;
public string 電話番号;
}
private void hoge()
{
List<Sample> list = new List<Sample>();
Sample item = new Sample();
item .名前 = "ヴィータ";
item .ふりがな = "おれのよめ";
item .メールアドレス = "
[email protected]";
item .電話番号 = "090-xxxx-xxxx";
list.Add(item);
}
var list = new[] {
new {
名前 = "ヴィータ",
ふりがな = "おれのよめ",
メールアドレス = "
[email protected]",
電話番号 = "090-xxxx-xxxx",
}
}.ToList();
日本語のメソッド名って割と頻繁に使う?
俺、結構使ってるんだが…。
使わない
使ってるってことに驚いた
煽りじゃない
371 :
デフォルトの名無しさん:2010/06/07(月) 19:25:59
ヴィータを俺の嫁と言いたいのはわかった
相手はいやだと思うが・・
>>369 大手でも国内の新規案件で使うケースは絶対あるから使う
下手な英語使うよりは日本語のほうがいいな
日本語のメソッドってとこがみそだなw
ちゃんと開発やってるなら使うだろw
375 :
デフォルトの名無しさん:2010/06/07(月) 19:30:12
え・・
日本語使うの?w
privateメンバでどうも思いつかない時にとりあえず付けることはある
国内だったら使うな
コメントも何もかも英語というなら使わないだろう
.csのソースコードの文字コードって、どこで指定するんだっけ?
VisualC#2010です。sijisで書いてて、読み込んだら盛大に文字化けしてる…。
あー日本語メソッドって単体テストの時か
今頃気づいたわorz
あれって別名指定出来ないものなんかね?
タイマオブジェクトって何個も同時に動かしてもいいもんですかね?
タイマー系のアプリ作ってるけどDispatcherTimerが10個を超えそうな勢い。
余裕
DispatcherTimerはWPFの上で管理されてるから問題ない
いくつ作ってもWindowsネイティブのタイマは一つ
パフォーマンスがどうとかいう前にDispatcherTimerでタイマー作るのはいかん。
GUIをアニメーションさせたり適当な時間間隔で処理を実行したい場合に使うもの。精度を当てにしてはいけない。
川俣に期待してるお前が馬鹿
確かに意味不明だな
そんなにラムダ式が好きならExpression Tree使って動的コンパイルするくらいしろよ
>>385 1秒くらいのズレなら大丈夫なのと、イベントハンドラがUIスレッドで実行できて
便利なのでこれを使ってるんだけど、他にいい方法あったらぜひ教えてください。
>>388 DispatcherTimerを使うなら、可能な限り短い間隔でハンドラが呼び出されるようにして
現在時刻を取得して前に処理を実行した時刻との差を求めて目的の時間以上経過していたら処理を行う。
呼び出し間隔は全く当てにしない。
まあスレッドタイマ使ってDispatcher.Invokeの方が楽かも
僕はもう少しのんびりとした生き方がしたい
UIスレッドのタイマって状況によっては止まったり詰まったりするぞ
とはいえ、優先順位はあるとはいっても、結局何使ったところでUIスレッドで動かす限りは大差はない。
スレッドタイマの方が精度があるということですかね。
遅延のことだけど、別スレッドからDispatcher.Invokeするのも、
結局UIスレッドの状態に左右されてしまうのではないでしょうか。
優先的に動かすこともできるくらいの効果はあるが結局大差はない。
>>394の話だな。
大差はないね。
先生方!
.Net4になってから文字コード指定のUrlのエンコードが出来ません!
(HttpUtilityが消えてる!Uriのものは文字コード指定出来ない!)
みんなはどうやって解決してるんですかっ!?
399 :
デフォルトの名無しさん:2010/06/08(火) 08:07:33
>>398 winformの話?
WPFかSLあたりはHttpUtilityの所属が違ってた記憶がある
ClientProfileだと切られてるみたいだな
こんなとこ切ってどうすんだイミフ
401 :
デフォルトの名無しさん:2010/06/08(火) 08:19:39
SLだとSystem.Windows.Browserの所属になってるな
HttpUtility
.net4は本格的に使ってないので憶測だがもしかすると
WPFやSLにあわせてる可能性もあるかもね
UriクラスかSystem.NetのWebUtilityクラス使えば?文字コードはしらん
>>399 Yes!
>>400 そうなんですよぉ><
>>401 ClientProfileにないんですよ、それが…
>>402 その二つじゃ文字コード指定ができないんです><
八方塞がりですじゃー
自分専用のRSSリーダーを作ろうとしています。
実際の記事はFirefoxで表示して、見終わってタブを閉じたら自動的にリーダーに戻りたいのですが
どんな方法があるでしょうか?
思いついたのは
○Firefoxに閉じられるのを監視するアドオンを追加し、そこから通知を受け取る
リーダーから開く前にそのURLをファイルに書き出しておく
Firefoxアドオンで、タブが閉じられたときファイルのURLと一致したら「閉じたフラグ」ファイルを作成
リーダーでは「閉じたフラグ」ファイルが作成されるのを監視し自分自身にSetForegroundWindow
この程度の規模のFirefoxアドオンなら作れる
○ローカルサーバとして稼働しリーダー画面自体もFirefoxでAJAXっぽく表示
C#EEでのローカルサーバの作り方自体は確認済み
但しこのあたりのサーバプログラムの経験は皆無なので難易度の見当がつかない
インストールもしたこと無いけどこれだとWeb Developerで作った方が楽?
作ったことないし、調べるうちに作ってみたくなってきた
あたりなのですが、他に何か良い方法はありますか?
・基本的にはFirefoxのBrief的な感じにしたい
ツリー部分と一覧部分があり、ツリーで選択しているノード以下の全てを一覧で表示する感じ
・どちらもほぼ画面を占有するくらいのサイズが必要なので小さくして並べるという選択肢はなし
・環境はXP Pro SP3 + .NET4 + VS2010EE
Briefの機能自体は大体気に入っているのですが、
開くときに重すぎる(登録RSSフィードは200近く)のとフィルタをかけたりしたいので。
×どちらもほぼ画面を占有するくらいのサイズ
○Firefoxもリーダーもほぼ画面を占有するくらいのサイズ
方法は調べればわかりますお
そのリーダーにGeckoエンジンを追加するほうが早くないか
408 :
デフォルトの名無しさん:2010/06/08(火) 10:08:48
>>407 IEコンポーネントを使えるんだし自分で簡易ブラウザも作った方が早そうだけどな
Silverlight使って全部ブラウザ上で作るとか
410 :
デフォルトの名無しさん:2010/06/08(火) 10:13:00
>>409 それもいいな
後はローカルで動くproxyサーバータイプにしてしまうとか
>>368 これって最初の宣言時に登録する以外に、あとで追加する場合はどうやるの?
またvar list =から?
413 :
デフォルトの名無しさん:2010/06/08(火) 11:42:08
list.Add(hoge);
C言語とC#比較したら
C#のコードのほうが何をやってるか見やすいね。
FILE *fp
とかイミフ
416 :
デフォルトの名無しさん:2010/06/08(火) 11:55:31
list.Add(
new {
名前 = "なのは",
ふりがな = "まおう",
メールアドレス = "
[email protected]",
電話番号 = "090-xxxx-xxxx",
});
プロパティ同じ匿名クラスなら通ったっけ?
>>412 var newItem = new {
名前 = "ヴィータ",
ふりがな = "おれのよめ",
メールアドレス = "
[email protected]",
電話番号 = "090-xxxx-xxxx",
};
list.Add(newItem);
419 :
デフォルトの名無しさん:2010/06/08(火) 12:00:25
>>418 もうそこまでするならクラスなり構造体なりちゃんと作れって話だなw
匿名クラスはLINQのselectで使うもの
>>411 すでにかいてるー
レスないって事は標準ではなくなったってことなのね…
あんまり言いたくないけど糞だわ.Net4は
互換性ないとか糞にも程があるだろ
Obsoleteなんかの将来消えますよ属性もないのに勝手に消すな
Client Profileだからだろうが
そうだな
424 :
デフォルトの名無しさん:2010/06/08(火) 12:43:56
.net4ってuserのpcにはclientprofileしかはいらなくね?
サイズの差はHDDの容量からしたら誤差みたいなもんだし
Client Profileとか必要なのか?
>>425 入れる事は出来る
でもWindowsUpdateではClientProfileが標準で提供されるからその認識でもOKかもね
どんどん肥大化してるから妥当な選択だろ
なんでクライアントにASP.NET入れなきゃいけないのかと
こりゃ色々消えてそうだなw
実際問題パラレル使ってやりたいことがあるから4.0からは逃げれないけど・・・
なんかいろいろ変ってそうで怖いのぉ
SilverlightにWebのクラス入ってないとかどういう設計か問い詰めたいけどな
肥大しましたから分けました
お別れしちゃったライブラリは無いも同然だから自作してね☆(ゝω・)vキャピってことか
パネェな
>>414 というか、DBとかとそう変わらないだろ
クラスはカラムの定義
リストへの追加はレコードの追加
結構違和感でもあるのか?
Varとか使うと2.0とかでは使えないんだしひとまずベタな方法で実装してみてはどうだろうか?
PS.ヴィータとかなのはってなんだよ と思ってググったらなるほど・・・
434 :
デフォルトの名無しさん:2010/06/08(火) 12:59:14
SLもHttpUtilityはSystem.Webなんだが…。
436 :
デフォルトの名無しさん:2010/06/08(火) 13:07:29
あ、ほんとだ
しかも3からかよw
俺、3の時からSystem.Webからひっぱってきてた件…
つかなんでコロコロ場所が違ってるんだよ…
まあ初めにSystem.Webにおいてしまったのが諸悪の根源
最初からサーバ用とクライアント用で分けとけばよかったのにね
Silverlightはやりすぎだけど
はいはーい
はいは1回まで。
はーーーーーーーーーーーーーい
よろしい
お前の妹をファックしていいぞ
はい?
語尾を上げない
御意
でも4のクライアントプロファイルって対してサイズ変わらんよね。
3.5では極端に違ったから意味はあったが(しかし実質使えなかったが)、
4はむしろ誰得になってる…
そこでSilverlightですよ
ここまでばっさり削られるとむしろ清々しい
それでも意外と使える
2010の入門書早くでないかなー
MS公認の「ひと目でわかる」シリーズまだかなー
WPFも一緒に解説してくれるのかなー
なんかサンプルや例題に加齢臭を感じるんだよな〜ひとめシリーズ。
萌え要素だと思っているのだろうがイラストも70年代。
萌え萌えキュンキュンとしすぎるのもアレだが、もうチョッとナンとかならんかな〜
質問です。
mdb(データベース)ファイルをC#で扱いたいのですが、
mdbのファイルがまったく存在しない状態で
テンプレートになるような部分からファイルを作成することはできますか?
テンプレートというのは、たとえばこんなデータベースだとしたら
「氏名、年齢、住所」の部分だけを作るということです。
氏名 年齢 住所
山田 20才 東京
鈴木 30才 千葉
自分がmdbでやったことがあるのは、すでにmdbファイルが存在していて、その中身をいじるといったことくらいです。
Access自体はいじったことがありません。
よろしくお願いします。
>>453 SQL Server Compactじゃダメなん?
DAOでつなげばできるはず。
457 :
453:2010/06/08(火) 23:41:53
素早いレスありがとうございます。
なんだかできそうですね。
両方試してみて、使いやすいほうでチャレンジしてみたいと思います。
どうもありがとうございました!
.sdfと.mdbをC#で使う場合はどちらが好ましいの?
Accessとかツール使わずC#アプリケーションからの利用だけだと
面倒臭くなってきたのでsqliteにしました
sqliteはお手軽だよな
必要十分だし
C#言語仕様のドキュメントってExpress版にはついてないのな
ダウンロード出来るのは3.0の英語版だし。こんなとこでケチんなよMS
有償版には翻訳されたやつが付属するの?
全く気にしてなかったけどExpressに入ってないと言われると読みたくなるw
2010はまだ入れてないから知らんけど2008Proのは英語のみだぜ
>>465 Microsoft Visual Studio 9.0\VC#\Specifications\1041\CSharp Language Specification.doc
ないの?
EqualやGetHashなんかを自動で作成してくれるプラグインってどこかにあったと思うけどみつからぬ…
誰かおすえて…
ReSharperでしょ
でも参照型にGetHashCode実装するなら
イミュータブルにしないといけないから安易に実装しちゃダメだよ
>>469 サンクス!これだ!!ったかな?w
見てみたら確かにこれで出来るね
でも有償かぁ
ModelにEqualsとかを簡単に実装したいのになぁ
でも最低2万もするのかぁ…
Modelってそれ本当にイミュータブルか?
Dictionaryが壊れたりするからEqualsとGetHashCode(一方のみは不可)
を実装していいのは厳密には構造体かインスタンスの値が変わらないクラスだけ
そもそも何でイミュータブルじゃないと駄目なの?
手持ちのクック本含めたあらゆる本にもそんな事かいてないけど?
>>473 だから何がどういう理屈で壊れるのさ?
GetHashCodeを使うものはクラス全体がイミュータブルであることが必須とか聞いた事が無い
MSDNのGetHashCodeの項を読んでみなよ
>オブジェクトがどのように変更されていても、ハッシュ関数は同じ値を返す必要があります。
>>475 それって別にクラス全体がイミュータブルである必要性なくね?
Modelの不変なプロパティ(一意なID等)を元に計算すればいいだけじゃん
webBrowserコントロールを使って、Webをブラウザするとき、
Internet Explorerスクリプトエラー オブジェクトがありませんというパネルが出るのですが、
これを出さないようにするにはどうしたらよいでしょう?
オブジェクトがあればいいんじゃね?
どこにオブジェクトがあって、どこになくて、どうすればあるんでしょうか?
IEでアクセスしたときにはでないのに、なんでないっていうんでしょう?
javascriptのエラーじゃないのか?
エラー通知の抑制だけならWebBrowserにプロパティがあるよ
WebBrowserにプロパティがあるんじゃね?
>>476 それでいいならいいけど
それだったら自動生成しようと思うかな
C#の良い入門書を教えてください。
javascriptとperlを使っていてオブジェクト指向は理解しているつもりです。
javascriptとPerlでオブジェクト指向とは・・・
随分頑張ったんだなw
>>485 まあ、本より先に、C#でググったページ見ればいい気も。
最近、大規模なJavascriptのソースで、オブジェクト指向
してないのは、見たことがないが。
どの言語もそうだけど、どのレベルで使っていたかにはよる罠
だけどJavaScriptで1からオブジェクト指向勉強するのは相当大変だと思うぞ
体系的な情報がほとんど無い、あっても他言語で既に解ってる人向け
>>476 そんなこと普通やるべきじゃないのは誰が見ても明らか。
普通はa.Equals(b)を見たらaとbのすべてのメンバが同じであることを期待するわな
>>475 だからそれはイミュータブルである事が必須って意味にはならないでしょー
同一プロパティ時に同一の値を返すって意味
もし不変なオブジェクトしかGetHashCodeが実装出来ないとなると全ての項目がreadonlyのものしかGetHashCodeを実装出来ないになるじゃない
イミュータブルなものしか駄目っていったいどこで聞いたの?
それは違う。字の通り、同じインスタンスに対するハッシュ値が変わってはいけないという意味。
代表例はディクショナリのキーに使うとき。ディクショナリに追加した後にキーのハッシュ値が変わると壊れる。
流れ見てると471の言い方が悪い気がする
必須かどうかは別として、
現在はほぼイミュータブルなものでしか実装するなってのが
一般見解ではあるけどね。
>同一プロパティ時に同一の値を返すって意味
勘違いしてる気がするなー
それじゃダメだよ一般には。
標準クラスでもなんでもいいから、イミュータブルじゃないもので実装してる例を挙げてみたら?
EqualsとGetHashCodeの実装に使われるメンバは不変でなければならないってことだろ
EqualsとGetHashCodeは一貫してる必要があるからハッシュの計算ではIDだけ使って
Equalsでは全てのプロパティを比較したりするのは無理だがそれでもいいなら(普通はよくないだろうけど)問題はない
似た話だけどa.Equals(b) == b.Equals(a)は嵌まったことがあるな
違反してるとものすごくわかりづらいエラーが出るんだよね
CookieとかStringInfoとか、わずかながら残念な実装があるな。
Equalsの方がGetHashCodeよりも細かいのは問題ないだろ
逆は駄目だが
>>475 わざわざ(現在では正しくない)古い情報を持ち出さなくてもいいのに。現在の指針は、
> オブジェクトの Equals メソッドの戻り値を決定するオブジェクトの状態に変更がない限り、
> オブジェクトに対応する GetHashCode メソッドは常に同じハッシュ コードを返します。
> これは、アプリケーションの現在の実行にのみ該当します。アプリケーションを再実行した場合、
> 別のハッシュ コードが返される可能性があります。
つまり、Equalsの結果に関係のある状態変化があれば、GetHashCodeの戻り値が変化してもよい
>>498>>500 PointやSizeがなぜかmutableなのは有名
>>502 ですよねー
でもそうするとDictionaryが壊れるらしい…
なぜそうなのか後学の為に聞きたいのにおすえてくれないの…
値型はGetHashCodeの結果が変わっても困らんからな
メンバを変更可能なのは別の意味で困ったもんだが
>>502-503 値型はimmutableにしとかないと、
var p = rect.Top;
p.X = 10;
で rect.Top.X を書き換えたつもりになってはまる開発者が意外といるからということらしい。
ディクショナリのキーに格納したオブジェクトを変更したらどうなるか
考えるまでもあるまいに。
そういう危険があるからイミュータブルが推奨されるってことでしょ。
例えばもしStringが変更可能だとして、
ディクショナリのキーとして格納済みの”A”という文字列を後で"B"に書き換えたら、
ディクショナリが壊れる。
それは危険だからできるだけイミュータブルにするようにしようという当たり前の話。
その為のEqualsなんじゃないの?
Javaはそのへん考えてあるのにC#は考えてないの?
>>509 その辺てどの辺?
基本javaも同じなんだが。
>>508 その為ってどの為?
何が言いたいのかわからん。
平たく言うとDictionary使いたいならイミュータブルかどうかちゃんと調べて突っ込めってこと?
てかどれがイミュータブルかどうかMSDNに乗ってないから判別不可能じゃね?
つかそもそもKeyに参照型つっこまなければいいだけなんじゃね?
少なくとも、格納後にキーオブジェクトを変更することは絶対に避けなければならない。
そもそもモデルをキーにぶち込むと思ってるところがおかしいと思う
誰に言ってんの?
よくわからんけどPointなんかの標準クラスは糞って事が言いたいの?
DictionaryのKeyに入れるには不適切だから糞って事でしょ。
普通はミュータブルをKeyに入れるユーザを責めるべきなのにさ。
極端なこと言いたがるバカばっかりかね?
ちなみに今はイミュータブルにするべきだったって言ってるよ。
そもそも構造体のキーは変更できないから問題ないし。
Dictionaryは使う側の問題でありGetHashCode云々とはまた別だと思うんだけど
C#の匿名型は常にイミュータブルでGetHashCodeやEqualsは自動的に実装されるけど
VBの匿名型はデフォルトでミュータブルだから明示的にKeyキーワードで
メンバを不変にしてやらないといけないらしいね
>>521 ですよねー( ´゚д゚)(゚д゚` )ネー
ちいせえ事にこだわんなよアホ
なんでそんなにdllを嫌がるんだろうね
ソースはオープンなんだから自分のプロジェクトの中にソースコード放り込め
なんでディクショナリが壊れるの?ねえなんで?って言ってたのに
いきなり使うやつの問題論調ばっかになってるのはどういうわけだ。
ミュータブルなのがいけないんじゃなくてキーに変更を加えるのがいけないんだから
使う側の問題といえば使う側の問題
GetHashCodeを実装したクラスをクラスライブラリでパブリックに公開するなら論外だが
内部で使うだけなら注意してればミュータブルでも問題はない
なにを「壊れる」というのかはともかく動作が胡乱にはなるな
foreach (var key in dic.Keys)
var x = dic[key]; // これでキーが見つからない例外が発生したり
>>523 今時staticリンクとかないから。
dll合わせて1つのアセンブリだから。
てか、exe 1個単体配布とかせず、ちゃんとセットアップexe作って。
VS使うなら「発行」ってやるだけで作れるから。
>dll合わせて1つのアセンブリだから
用語の意味として完全に間違ってます
exeの単体配布ってなんであかんの?
expressじゃ発行できないもん。
Direct2DのHwndRenderTargetを使ってDrawText()を呼び出したんだが、速度がExtTextOut()とほとんど変わらなかった
なんで?
MSのアドバイザは凍結(イミュータブル)でなくてもいいといってる
GetHashCodeの実装は効率のよいばらけ方を適切に実装出来るかを問題視してる
MSDNに書いてあるのは同一の値を使用した時に同一のハッシュコードが生成されることを指している
GetHashCodeが何故ovarride可能か普通に考えればわかる事なのにDictionaryが壊れるなどというのはあまりにもずれた事
>GetHashCodeが何故ovarride可能か普通に考えればわかる事なのにDictionaryが壊れるなどというのはあまりにもずれた事
意味が分かりません
「Aの場合はBしなければならない」
と書かれてる。
↓
つまりAすることに問題はない
Aするべきではないなんてあまりにもずれている。
なんでだよw
そこでそのことには触れてないだけだろうよ。
>>531 どこに置くか迷った挙句、手動コピーでProgram Filesやらドライブ直下にコピる人もいるし。
デスクトップとかにexeが散乱したりする人もいるし。
VS使えば数クリックでセットアップの発行できるんだから、インストーラー作って欲しい。
むしろインストーラ作られるとレジストリいじくられてそうでいや
exe単体がええ
>>541 実際にたいしたことしてなくてもこういうイメージだよな
手軽なもの(Twitterクライアントとか)ならexe単体をzip配布が色々と安心
>今時staticリンクとかないから。
え?マジすか?
インストールがいらないメリット
→OSの初期化に巻き込まれない
波形を取るマイク入力をしようとMCIを呼び出してるのだけど
WaveAudio.waveInAddBuffer
グローバル領域に確保したバッファとWAVEHDR構造体を渡す所で上手くいってないみたいなんですが
現状はバッファの確保はMarshal.AllocHGlobalで確保してIntPtrを渡す
WAVEDHDRはクラスコンストラクタでnewしてrefで渡すってやってます
たぶんWAVEHDR自体もAllocHGlobalしないといけないのかと思うのだけど
AllocHGlobalで確保した領域に構造体としてアクセスする方法が分かりません
あるいは、AllocHGlobal以外にヒープ領域に確保して安全に受け渡しする方法が
他にあるんでしょうか?
GCHandle.AddrOfPinnedObject
>>535 Direct2Dはよく知らないけどキャッシュされてなくて毎回フォントをレンダリングしてるとしたら
CPUがボトルネックになるだろうから変わらなくて当たり前じゃね
というかC#だったらWPF使えよ
勝手にキャッシュしてくれるぞ
キャストとasの違いを教えてください
普通のはキャストできない時InvalidCastExceptionが出る
asはキャストできない時nullが代入される
参照型なら概ねASのが早いんだっけか?
うん
いやキャストの方が速い
ただしキャスト可能かどうか型判定したあとでキャストする場合はasが速い
>>545 GCHandleType.PinnedなGCハンドルを割り当てて固定すれば
マネージヒープ渡しても問題ないよ
MarshalクラスのStructureToPtrとPtrToStructureを使うかポインタを使えば
一応メモリ領域に構造体としてアクセスすることはできる
Marshal使ったからってポインタより安全というわけでは全くないので
ややこしいことするんだったらポインタ使っていいと思う
C#ってクック本の次は何を読めばいいの?
こんな感じのサンプルが付いてるC#の本がよみたい(´・ω・`)
マンガでも読んでろ
>>547 なるほど、WPFはいろいろな事情で使えないので、自前でキャッシュしてみるわ
>>558 コードを見もせずに断言するが、コンストラクタではまだウィンドウが生成されてないから
ウィンドウハンドルが使えないんだろう。
OnHandleCreatedをオーバーライドして、そっちで初期化しる。
>>559 トンクス
そこでやったら、うまくいった
お前ら冷たい奴ばっかだな
カワイイ女の子の可能性だってあるんだ
もっと夢を持とうぜ夢をよぉ!!
(´・ω・`) …
>>554 ありがとう、その方法でとりあえずデータが来るところまではやれたんだけど
MM_DATAでLPARAMにWAVEHDRのポインタが入ってくるんだけど
このLPARAMをMarshal.PtrToStructureでWAVEHDRに戻すと全部0なんだけど
直接戻したらまずいのかな?
565 :
564:2010/06/11(金) 20:45:56
具体的な流れ
GCHandle.Allocでpin止めして
AddrOfPinnedをwinmm.dllに渡す
データ取得をを開始
WndProcにMM_DATAが来る
LPARAMをWAVEHDRにPtrToStructureで戻す
構造体の中身が全部0
アプリケーション終了時にGCHandle.Freeをする
566 :
564:2010/06/11(金) 21:38:45
自己解決
値の設定はAddrOfPinnedObjectにStructureToPtrで
直接書かないといけなかったみたい
だから最初から空だっただけでした
>>548 >>549 キャストとasの違いだけど、asはユーザー定義の型変換は無視する(nullが返る)って違いもある
基底クラスや派生クラスへの型変換はオーバーロードできないからその言い方はちょっと語弊がある
キャストはユーザー定義の型変換を呼び出すのにも使われるけどasが使える状況においては違いはない
http://ideone.com/iUk57 DrawTextで描くために文字列の幅を求めたんだが、10000万回ぐらいDrawTextとこの関数の実行を繰り返したら、ものすごく重かった
原因はなんだろうと思い、プロファイラーで調べたら、この関数が実行時間の半分を占めていた
これよりももっと早く測定する方法はない?
どうせキャッシュするんだろ? どうでもいいじゃん
自分で計算したらそりゃ速いだろうけど何のためにDirect2D使ってるのかわからなくなるだろ
なんでこんな珍妙な求め方を
ふつうにMeasureStringとかそのへんじゃだめなんだろうか・・・・
Direct2D使ってるんだからDirect2D使って求めないとおかしいだろ
WPFだって低レベルな文字レイアウトのAPI似たような感じだよ
キャッシュするんだから少々遅かろうがどうでもいい
とギャーこら言う割には普通に自分でDisposeしちょる
高度なレイアウトなどより速さだけを重視するならそもそも無理にDirect2D使う必要なくね?
System.DrawingなりWin32APIなりで測って描画してDirect2Dのサーフェスにコピーすれば?
>Direct2D使ってるんだからDirect2D使って求めないとおかしいだろ
この一言に尽きる気がする
GDIでサイズ測ってDirect2Dでレイアウトしたら明らかにおかしいけど
レイアウトもレンダリングもGDIでやってDirect2Dにコピーするなら当然GDIでサイズ測るだろ
きっと・・・きっと・・・賢い
>>569には明確な理由があってそうしているのです
間違っても
>Direct2D使ってるんだからDirect2D使って求めないとおかしいだろ
なんて固定観念だけでやっているわけではないはずなんです!!
>Direct2D使ってるんだからDirect2D使って求めないとおかしいだろ
いやこれは正しい
他の方法で測定したらDirect2Dによる描画結果と一致しないかもしれない
どうでもいいよ
string[] files = Directory.GetFiles(Directory.GetCurrentDirectory());
foreach (string a in files)
{
if (new FileInfo(a).Length.Equals(0))
{ File.Delete(a); }
}
現在のフォルダからサイズが0バイトのファイルを全部削除したいんですが、
上記のようにやるとファイルがアクセス中で削除出来ないと言われます。
どうすればいいんでしょうか?
いや・・・普通に消えると思うんだけど?
それはどっかが使ってるからじゃないのか?
583 :
581:2010/06/12(土) 00:33:25
>>582 レスありがとうです
原因は同一アプリからFile.Createで生成したファイルだからだったみたいです
情報不足ですみません
File.CreateのあとにClose()を追加することで解決しました
using 使えよ
え?
>>571 APICodePack付属のドキュメントを見たんだが、これ以外に求められる方法がなかった
>>573 すまん
キャッシュする方法を探してみたんだが、よくわからん
ヒントだけでも教えてくれないか
>>578 いや、単純にそれだけだ
>>433 遅レスだが、varによるローカル変数の定義が使えないのは
C# 2.0であって.NET 2.0ではない。
C# 3.0以降(Visual Studio 2008)以降なら.NET 2.0対象のプロジェクトでも使えない。
>C# 3.0以降(Visual Studio 2008)以降なら.NET 2.0対象のプロジェクトでも使えない。
C# 3.0以降(Visual Studio 2008)以降なら.NET 2.0対象のプロジェクトでも使える。
でした。
いっぺん氏んでくる……orz
>>586 バッファにあらかじめ描いとくだけ
その前に、APICodePackで使えるのかは知らんがDrawTextよりも
DrawTextLayoutの方が効率的だとMSDNに書いてあるから試してみたら
それよりスレ違いだからC++覚えてDirectXの専用スレで聞くべき
どのみちC++わかんないとサンプルもロクに無くて厳しいでしょ
>>589 あーなるほど
その方法か
スレを汚してすまんかった
許さん!
(´・ω・`)み〜んみんみんみん
593 :
デフォルトの名無しさん:2010/06/13(日) 00:15:59
つくつくほーしつくつくほしー
最近VBからC#に乗り換えてみたのですが、ググる時に「c#」が使えないのが痛いですね・・・
「cs」だと関係無いのばっかり出てきますし
もっぱら「.net」や「vb」で調べてますが、みなさんどうしてます?
普通に「C#」でヒットするけど。
むしろ今時C#を検索できないとこが存在するのか?
サジェストだと、Yahooは「C#」ってそのままの候補が並ぶけど、
Googleだと「#」が抜けて「C」の候補が並ぶね。
そのまま検索すれば、「C#」の検索内容がリストされるけど。
598 :
デフォルトの名無しさん:2010/06/13(日) 07:26:39
C#って入れてるけど検索できるよ
コピペで作ってるわけじゃないし、参考になるのがあればいいだけだし
C#で検索できない男の人って。。。
Googleって一般に記号は検索できないし、C#やC++が特別扱いって気がするんだが
だろうけど試してみりゃあ分かるじゃん
昔は#通らなかった気がする。
#が早い時期に通るようになったのはC#の影響もあると思う
よかったな長生き(ry
>>600 多分そう。
まあ、でも、せっかく特別扱いしてもらってるわけだし、検索しようぜ。
597はC#って入れてもサジェストの候補に#がつかないから
候補から選ぶと#をもう一度入れ直さないといけないって話だろ
確かにちょっとしたことだけど面倒くさい
サジェストの話してるのは
>>597だけだと思うんだが
「.NETのクラスライブラリ設計」て本読んでみな。
値型はimmutableであるべき
参照型でGetHashCodeとEqualsをオーバーライドする場合はimmutableであるべき
みんな書いてあるから。
もちろん必須ではないけど、間違いなくそうするべきといわれてる。
ふと思ったんだけどイミュータブルなクラスってビルダーパターン使うの?
コンストラクタに引数がゾロゾロあるのは汚いよね?
>>609 いや、immutable なクラス作るときは普通にコンストラクターにゾロゾロ書くね。
ただし、同じく「.NET のクラスライブラリ設計」曰く、
やっぱ引数多いコンストラクターはユーザビリティ下げるけど。
>>608 その本は.NETを組み上げた時のルールが主
使う側の事は考えられていない
例えばWPFやSilverlight等のモデルはINotifyPropertyChanged等の実装を行う
つまり実装すればImmutableなクラスにならない
ではImmutableでは無いのでEquals等を実装してはいけないのかというとそれは否
必ずModelとなるクラスには不変だろうがそうで無かろうがEqualsとGetHashCodeは実装する
WPFやSilverlightの世に出てるサンプルを見れば一目瞭然
ImmutableなクラスでもEqualsとGetHashCodeは実装されている
この事にいちゃもんを付けるのであればそれはWPFやSilverlight等の技術全般に文句を言ってるも同義
>>609 エッセンシャル系の本を見るとコンストラクタの引数が沢山あったり順序が不変なものは使えとある
Immutableなクラスを作る時は実際そうすべきだと思うよ
コンストラクタにbool型の引数が出てきたら、「これはそろそろヤバいな」って思う。
はあ?
C#でパスワードを入力して貰ってそれをStringでメモリ上に保持してたら
メモリ直接読み込みでばれる?
メモリを盗聴されるのを防ぐ方法ってあるかな?
自己解決SecureStringってのもが用意してあった
SecureString があってもそこから String を取りだしたら
いつ解放されるか分からないしあんまり意味ない
System.Stringには変換できないから大丈夫。まあ、
SecureString ss ....
IntPtr p = Marshal.SecureStringToGlobalAllocUnicode(ss);
string s = Marshal.Marshal.PtrToStringUni(p);
とかやれば変換はできちゃうんだけど、基本的にはアンマネージ関数で処理するためのもの。
WinFormの場合ユーザの入力をSecureStringで扱えないからどうしようもないような
WPFならPasswordBox使えば直接SecureStringで受け取れるけど
そもそも、アルゴリズムも公開されてないものを信用していいのかっていう問題が。
メモリ盗聴ってそんなの初めて聞いたよw
正直被害妄想にしか思えんけど、仮に純粋に可能性の話をしているとしても、
というか、だったらなおさら、「メモリ盗聴」なんてものをされてるような状況下なら
どんな対策したところで安心材料にならんのじゃないのか
>>621 俺も「メモリ盗聴」なんて表現は初めて見た。
実際にプロセスメモリを自由に見られる状況なら、暗号化や復号化のロジックまで丸見え
なんだから、小手先の暗号化なんかしてもしょうがない。
問題は、残しちゃまずいデータがページファイルに残っちゃったりすることなんだよね。
ReadProcessMemoryとかだな。ネトゲのチートで多用されていて、
やり方を聞くとチート野郎と罵られる。
まあ実行ユーザーが同じなんだから権限としては見えてもしょうがないわな
ReadProcessMemoryついて詳しく教えてください
チート野郎
Zero page thread の優先順位を上げる方法ってないの?
\Device\PhysicalMemory をユーザーモードで読めた時代もあったね。
>>622 >>実際にプロセスメモリを自由に見られる状況なら
これを出来なくするのがSecureStringじゃないの?w
>>617 A=null;みたいに明示的に解放すればいいんじゃないの?
GCが動くまではインスタンスは残り続ける
GCが動いたってメモリの内容まで破壊される訳じゃない
まず前提として、Windowsでは(Unixでもだけど)同じユーザのプロセスメモリは
OSの機能で正当に自由に読み書きできる。
なので、パスワードなどを扱うときは、なるべくメモリ上に存在する時間を短くし、
読み取りにくくするべきだと言われている。(それだって文字列がメモリ上に存在する
瞬間に読み取られたら意味がないんだけど)
CやC++なら、文字列を上書きすることもできるし、確保したメモリを任意のタイミングで
明示的に解放することもできる(解放しても内容は消えないから、上書きしてから解放する)
んだけど、.NETのStringではその方法がない。
なぜなら、一度生成したStringのインスタンスは書き換え不可能だし、
>>630のように
参照できなくしてもガベージコレクタが動くまでインスタンス自体は残り続けるし、
インスタンスが削除されても、そのインスタンスが使っていたメモリが再利用可能になるだけで、
その内容までは消えないから。
windowsフォームで
form1.cs、form2.csに分かれたときにform2でform1で作ったメソッドを使いたいときにどう使えばいいのかわかりません。
publicにしてForm2のコンストラクタにForm1のインスタンス渡しとけばいいだろ
いやな感じだな。
じゃあデリゲートでも勝手に使ってろ
別にクラスを作ってそっちにメソッドを移せ。
form1のオブジェクトを操作したいんです
634に戻る
ワラタ
さむい
設計から見直せよ
もう一度小学校に通った方がいい
644 :
デフォルトの名無しさん:2010/06/14(月) 13:42:28
質問させてください。
USBカメラからの静止画だけをキャプチャしたいのですが、どのようにしたらよいのでしょうか。
動画をキャプチャすることを前提に静止画をキャプチャするサンプルはいくつかあったのですが、
これだと動画をキャプチャしている間はなぜかKeyDownイベントがフォームで受け取れず、KeyDown
で一度ブレークポイントをはって止めると、そのあとはKeyDownが効くようになってしまいました。
どのみち動画は不要なので、静止画だけをキャプチャする方法が知りたいです。
よろしくお願いします。
ほんっと 毎度毎度だな
まーいどまいどのまいどあり!
647 :
644:2010/06/14(月) 15:17:32
すいません、なにか問題あったでしょうか?
主題はUSBカメラから静止画をキャプチャしたい!ってことで
C#は直接関係ないな
うん
650 :
644:2010/06/14(月) 16:50:28
>>648 たしかにそうですね…
VB.NETのスレッドはみつけれるのですが、.NET全般のスレってあるでしょうか?
そもそもキーが効かない原因を調べたりしないのか
USBカメラを使った事ないんだけど民生機のそういうデバイスってSDK提供されてるん?
.NETの話題ですらない
やり方によるが大体DirectShowじゃないのか?
C#からだとDirectShow.NETとかOpenCVのラッパーでいける
655 :
644:2010/06/14(月) 17:20:09
>>651 業務なので今不必要な問題は後回しにします。
>>653 なるほど、そうですね。
そっちのスレに投稿してみます。
ありがとうございました。
業務なので・・・
ちょっと待てw
業務なら有料のとこで聞けば?
業務なら俺を雇えばいいよ
業務かよ!
こんなのに業務させるなら
ニートの俺にやらせろよ
職安いっても誰もやとってくんねーよコンチクショ
この空白期間は何をされてたんですか?
プログラミングの勉強ばかりしてた
不必要な問題なのに質問に書くのはどうなんだw
>>655 みたいなやつがPGやってるような会社おわってんなwwww
いや、結構多いと思うが・・・
キッチリしらべて作らないと後々ひどいことになることも多いと思うんだが
このレベルの人がPGじゃなくてSE扱いだったりする
そもそもその関係ないと思っている場所が大問題だったりすることもしょっちゅうあるんだが
今回の場合どう考えても大ありだろ
効かなくなるのが仕様なのかどうなのかを検討しないとFWのバージョン変わったりパッチ当てたら動作変わるとか普通にありえる
それは見方によるのでは?
「あぁ、バージョンアップで使えなくなったようです。修正には追加料金がかかりますがどうしますか?」と商売するわけさ
ロクに原因調べもせずに取りあえず動けばいいや で逃げに走ってるんだねぇ
納期近いかもしれないけど俺は下請けでも使いたくねぇな
派遣だけど色んな会社に出入りしてきた
会社の規模に関係なく動けばいい、納期第一ってところは少なくない
>>671の下請けもたぶん… 気付いてないだけじゃない?
>>672 いや、それは判ってるつもりなんだ
明らかに納期が近くて問題発生した場合は仕方ないんだと思ってる。
自身もそうなってしまうし
ただ、あの文章的に こまけぇこたぁいんだよ 的なのが気に食わなかっただけ
自分ならそこは後で調べることにして、動作することを目的として ってかんじで聞くかな?
あの質問内容だとなぜ発生しなくなるかを調べて解決すれば終わりじゃん となりそうでさ
自分の週間の問題だとは思うんだけど
スレ違い甚だしいのでこれにて消えます。
うむ。消えてよいぞ。
ソースが丸見えなc#ですが
容易に特定できない秘密鍵(共有鍵)の埋め込み方法ってあるもんですかね?
いい方法思いついたニヤニヤ
容易ってどの程度?
容易とか困難とかいう以前に、秘密鍵をコードに埋め込んじゃダメだろ。
パスワードとかだったらハッシュコードを埋め込むという手もあるぞ
鍵は無理だが・・・
意味ねえニヤニヤ
>>678 「データ」「タバコ」「イクラ」などカタカナ言葉の日本語を原語のアクセントで読むのは間違い。
これらを間違えて読んでいると日本人である事を疑われるので気を付けるように。
データは両方のアクセントがあるだろ。
ニヤニヤ
>>681 みたいなレスをすると日本人である事を疑われるので気を付けるように。
685 :
デフォルトの名無しさん:2010/06/16(水) 13:40:45
.NETFrameworkでサポートされている、
ファイル、フォルダ用のメソッドSystem.IO.File.Copy メソッドなど
は、再入可能なんでしたっけ?今まで考えずに使ってましたが、同時並行して
いくつか使った場合でも動作OK??またはスレッドを別にして実行する必要あり?
うん
デバッグ時に指定した例外をハンドリングしないようにするにはどうすればいいのん?
プロフェッショナルの皆さん、おすえて!
メニュー→デバッグ→例外→追加→ハンドリングしたくない例外名入力
システムに元からある例外なら追加はいらなかった
690 :
デフォルトの名無しさん:2010/06/16(水) 19:17:31
SQLサーバーのDBにimage型で保存したjpgデータを、c:\test.jpg のようにファイル形式に落とす方法はありますか?
はい
2G超えの巨大ファイルを使うにはどうすれば?
使うって何?
読み書き
読み書きは普通にできるだろ。
698 :
デフォルトの名無しさん:2010/06/16(水) 22:29:41
メモリが足りないとか
足りないの?
まあつまり
何が死体の?
ってことなんだけどさ
64bit化してメモリマップトファイルを使う。
ふう〜すっきり
>>675の多分やりたいことには全く使えんけどな。
なぜASP.NETなの?
クライアントに渡すんじゃさすがに防御しようがないから、お茶を濁している
へえ
暗号化して防げるなら今みたいに市販のソフトの大半がクラックされてないよな。
結局ローカルで動くソフトは諦めるしかない。
+= new でイベントを割り付けた場合は、破棄する前とか new でインスタンスを作り直す場合は
-= newでイベント解除をする必要があるのでしょうか?
たとえば、 TextBoxを格納するオブジェクト変数 testTextに += newでClickイベントを割り付けた場合には
testTextをdisposeする前には -= newをする必要があるのでしょうか。
(同様にdisposeではなくて、そのオブジェクト変数testTextに改めて new でインスタンスを作成する場合の場合はどうでしょう?)
デザイナが自動的に作成したコードには -= newがないので問題ないように思えるのですが、MSDNの
イベントサブスクリプションとサブスクリプションの解除には
「サブスクライバー オブジェクトを破棄する前にイベント サブスクリプションを解除する必要があります。」
という記述があるので、そのところがよくわからなくなっています。
ttp://msdn.microsoft.com/ja-jp/library/ms366768.aspx
>そのオブジェクト変数testTextに改めて new でインスタンスを作成する場合の場合はどうでしょう?
あんまオブジェクトとかインスタンスが理解できてないように思えるんだが…
>>709 イベントを提供するオブジェクトがGCされればイベントは自動的に解除される。
提供側のオブジェクトが提供を受ける側のオブジェクトよりライフサイクルが短いか、
同じならばGC任せで放置してよい。
Windows Formの場合はこのケースに当たる。
逆に提供側のオブジェクトのライフサイクルが長いかイベントが静的な場合は、
-= で解除しなくてはならない。
>>711 スゲー! そんな細かいところまでGCが面倒見てくれるのか。
イベントハンドラの登録解除は明示的に切り替えたい場合(反応する、しないを動的に切り替える)を除いて
あまり真面目に考えてなかったけど、
登録解除も自動でやってくれてたのか。
ますますC#と.NETが好きになるな。
イベント登録って言っても.NETの場合、結局は参照握ってるだけだからね。
普通のオブジェクトの参照関係と一緒。
通常の参照握ってて開放されるもんなのか?
弱参照じゃあないのか?
WPFは弱参照イベントみたいのあった気がする
>提供側のオブジェクトのライフサイクルが長い
場合が弱参照イベントパターン。
716 :
709:2010/06/18(金) 12:14:21
>>710 すいません、わかりづらい説明で。
(あとイベントとオブジェクトも理解してないかもしれませんが)
TextBox tb = new TextBox(); <---- (1)
tb.Click += new EventHandler(tb_Click);
<何かの処理>
tb = new TextBox(); <--- (2)
この場合、 (1)で作られたオブジェクトインスタンスと(2)で作られた
オブジェクトインスタンスはメモリ上では別物なんですけど。
(2)のインスタンスが作成された段階で(1)のインスタンスは参照されなくなるので
その場合に-= newをしないと(1)のインスタンスはメモリ上から排除されないのかと
思ったものですから・・・。
>>714 PythonとかC++やりすぎじゃない?
CopyingとかMark & SweepなGCだと循環参照あってもちゃんと解放されるよ。
.NET Micro Frameworkみたいな組み込みでメモリ不足しがちな物ならともかく、
デスクトップの.NETでは弱参照まず使わない。
.NETで弱参照使うのは、かなり巨大なでまれにしか使わない一時オブジェクトを、
可能なら確保しっぱなし、ダメなら確保しなおしって方針で持っときたいときくらい。
>>716 tb_Click を (1)以外が握っていない場合、
(1)がGC対象になった時点でtb_ClickもGC対象。
(1)の寿命とtb_Clickの寿命が一緒でいいなら、別に -= 要らない。
(1)生かしたままtb_Clickだけ抜くときに -= 使う。
Action Script とかで必ずイベントの remove が必要なのは、
シングルスレッドでしか動いてないせいで、
非同期処理するときに、オブジェクトをシステム側で static に握っとかないといけないから。
C#/.NET でいうと、static なイベントに対する add してるようなもの。
static で、オブジェクトの寿命みたいなのがないんで、
必ず remove してやらないとメモリリークになる。
あと、Pythonなんかは昔は参照カウント方式しか持ってなかったみたいなんで、
イベントの remove しないと循環参照になってメモリリーク。
最近のPythonは基本的に参照カウントで、
一定間隔でMark & Sweepか何か走らせるみたいなんで、
そこまで気にする必要ないはず。
721 :
709:2010/06/18(金) 12:37:17
>>711 説明ありがとうございます。
提供側が生きていて、提供を受ける側のみDisposeした場合に
ガベージにいてもイベントが発生してしまうということが起こるわけですね。
そういう場合は、明示的にイベントの解除が必要でると。
>>718 なるほど、どこからも参照されなくなったならば、GCがオブジェクトを
削除してくれるんですね。
みなさんありがとうございました。
前々から疑問に思っていたことがようやく解決できました。
サブジェクトとリスナ(オブザーバ)って言ってくれよ
どっちがどっちだか分からんようになる
パブリッシャとサブスクライバで
>>723 パブリッシャ(発行者)がイベントを発生させる側で、サブスクライバ(購読者)が
イベントを受ける側?
725 :
デフォルトの名無しさん:2010/06/18(金) 17:16:52
>>709 例えばフォームのボタンをクリックしたなどのイベントは、フォームが閉じた後、すなわちDisposeされるとき
GCによって破棄されるので -= で解除する必要は無い。
但しstaticメンバーやフォームとは別の箇所など破棄されないオブジェクトに対してイベントを割り当てた場合、
-=で明示的に解除する必要がある。
そうしないと イベントハンドラが破棄されたオブジェクトに対してイベントを実行しようとして例外を発生することがある。
>>725 イベントハンドラが破棄されたオブジェクトに対してイベントを実行しようとして例外を発生することがあるね
>>725 ありがとうございます。
よく分かりました。実際、破棄されたと思ったオブジェクトでイベントが発生して
NullPointReferenceを出したことがあります。
ぬるぽ
ガッ
ビオレママになろう、弱参照ビオレ
たまにファイナライザで-=してるアホなコードを見かける
VisualC#2008では参照出来るDirectSoundが2010では参照できなくて困っています
どうすれば参照できるのでしょうか?
WM向け開発。
画面を回転させる処理のためには
using Microsoft.WindowsCE.Form;
としてSystemSetting.ScreenOrientation 云々と行わなければならないというのですが、
Microsoft.WindowsCE.Formというのが存在しないようなのですが、どうすれば良いですか。
microsoft.windowsce.forms.dll を参照設定すればいいんじゃね?
有難うございます。
>>734 レスありがとうございます
ググったら同じ症状の人が見つかったのでその人と同じapp.configを作成したのですがダメだったので諦めます
>>733-734 MDXのdllはネイティブコードが混在してるためCLR4.0との互換性が無いから
ターゲットをCLR2.0系に変更したらapp.configは弄っちゃダメ。
他のラッパーを使うことを強くお勧めする
フリーソフト作っているのだが、報告によるとNorton 2010のSONARとかいう機能で誤検知されるらしい。
調べてみると認知されていないとか、比較的新しいexeは、とりあえず信頼できないみたいな感じで検出するらしい。
どうすることもできないんだろうか・・・。
>>739 ありがとうございます
.Net4.0利用のフォーム上で音声を再生したいのでSlimDXを使うことにします
>>741 .NETでSONARにひっかかるってよっぽどな気がするけど
誤検知通報する手段があったはず
using System;
using System.Linq;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace SmartDeviceProject1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Exit_Click(object sender, EventArgs e)
{
Close();
}
[DllImport("user32.dll")]
public extern static int MessageBoxA(int h, string msg, string title, int i);
private void Form1_Load(object sender, EventArgs e)
{
MessageBoxA(0, "hoge", "title", 0); ←この行でエラー PInvoke DLL 'user32.dll' が見つかりませんでした。と。スマートデバイス以外では成功するのに。
}
}
}
746 :
デフォルトの名無しさん:2010/06/20(日) 10:54:05
>スマートデバイス
スマホ向けの開発?
user32.dllってwindows用のdllじゃないの?
そゆこと。coredll.dlだろ。
どうもすいません。
ありがとうございます。
MSDNトップページの目次からどうやって辿っていったらたどり着くのか解らない。
どこにたどり着きたいのかわからない
752 :
デフォルトの名無しさん:2010/06/20(日) 16:11:54
Visual C#の入門でいいサイトかお勧めの入門書ってありますか?
できるだけ初歩的なことから詳しく書かれているような物でお願いします
どれも一長一短。
結局、どれが合うかは自分次第。
DataReseivedは受信したときにおこるイベントとあったのに
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
string str = port.ReadLine();
label1.Text = str;
}
とやっても上手くいきません。
また、受信したときっていうのは、いつのことを言うんですか?
日本語のサイトなら
未確認飛行C C#によるプログラミング入門
@IT
くらいしかないよ
他は情報がフルすぎたり、C言語やJavaから移住してきたのを対象としてるとしか
思えないようなのばかり。
用語説明もなしにいきなり未知の単語が出てきたりね。
756 :
デフォルトの名無しさん:2010/06/20(日) 17:12:57
>>754 ReadLine()してるってことはNewLine(デフォルトだとLF)は送られてくるんだよな
あと、label1がSystem.Windows.Forms.Labelなら、それは駄目だからその行は消せ
>>757 ボタンを押したときに、
同じことをするようにしたら、上手くいきましたんでたぶんそうです
じゃあ受信は正常にできてるんだろう
760 :
デフォルトの名無しさん:2010/06/20(日) 21:14:14
イベントが登録されてないとか
>>760 Designer.csにはちゃんと
ポートナンバーも指定されて
this.serialPort1.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(this.serialPort1_DataReceived);
とあります。
とりあえず、デバッグ出力か何か使って
・イベントが発生すること
・データを受信できていること
を確認しろ
質問です。
3回まわるwhileの中に
label1.Text = "hoge\r\n";
があって、これを実行するとlabel1に
hoge
hoge
hoge
と表示されることを期待してるのですが、1回のhogeしか表示されません。
(プログラムをいじったところ、3回目のhogeだけが表示されるようです。)
これはどうしてでしょうか?
(Console.WriteLineなら3回表示されます)
かわりにこの手を使えば3回表示されるのですが、これ以外に方法はないでしょうか?
string hoge = "";
hoge = hoge + "hoge\r\n";
Win XPでVC#2010EEを使ってます。よろしくお願いします。
代入してんじゃん
頭が痛くなってくるな
LabelのTextプロパティはそんな動作を想定してるのではないのだから当たり前だ
「かわりの手」を使いなさい
それしかない
こうだろ?
label1.Text += "hoge\r\n";
代入でうまくいきました。なんか恥ずかしいw
どうもありがとうございます。
じえん乙
なんでプログラム用語って英語ばっかりなのに
nullだけドイツ語なんだ?
単にローマ字読みだろ
RSAで暗号化しようと
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider()
rsa.FromXmlString(PublicKey)
rsa.Decrypt(Data, false);
こんな感じで
Dataがデカイとエラーが出るんだけど
一定上デカイとセキュリティに問題があるから小さいデータしかやれないようになってるの?
つまりデカイデータには使わない方がいいってこと?
それとも一定区切りで暗号化を繰り返しやらないといけないってこと?
その場合出力されるデータサイズって一定とか管理する目安みたいなものはあるの?
772 :
771:2010/06/21(月) 10:27:46
自己解決
データは共通鍵暗号で暗号化して
その鍵をRSAで一緒に記録するってことね
指定した時間スレッドを止めて、その止めてる間に処理をおこないたい時はどういうやり方がベストなのでしょうか?
//スレッドをループで止める
while (true) {
//ここにループ中の処理を挟む
//指定した時間がきたらループ脱出
}
スレッド分けろよ
だからぁ、Suspendでもして「止めてる間に処理」を別のスレッド起動すりゃ良いだろ
指定した時間だけとめて、その間に他のスレッドで処理が終わらなかったらとめちゃっていいのか?
何がやりたいのか分からないが、呼び出し側はサブスレッド開始→Sleep→サブスレッド停止とかかな
主スレッドと作業スレッドってことでいいのかな。
手早いのは
>>776が言うように作業スレッドを2つに分けて主スレッドから停止と再開をコントロールすればいい。
>>776 無駄にスレッドを起動したくありません(コスト2倍になるから)
>>777 .Net4からあるキャンセルフレームワークを実装したいのです。
指定時間待機するだけならAutoResetEvent等で実装出来るのですが…。
ThreadPoolで時間指定で別スレッド立ち上げ↓
AutoResetEventでブロッキング
コールバック又はタイムアウト時の処理で〜としても良いのですが例外対処のコストが馬鹿になりません
なのでよい方法があればと思ったのです
初心者がコストとか気にして貧民的プログラムしなくていいよ
初心者向けの話題じゃないな。
そうやって御託並べて無駄な一日を過ごせばいいw
生産性が落ちるわけだな。
内容が高度すぎるからフォーラムで聞いたら?
いや、とりあえず相談室でいいんじゃね。
相談室もマルチスレッド系は苦手みたいだったぞ
そういえばThread.Sleep入れないとCPU100%になるけど
スレッドで特定のフラグとかループで監視してるのにSleepさせると若干開始が遅くなるよね
どうするのがいいのかな?
3分強で7レスとか
お前らどこから沸いて出た
>>790 MSDN及びその辺の初歩的な物は理解してます。
やりたい事は既に非同期で実装済みのクラスをキャンセルフレームワークに適合したクラスへと変更するアダプタクラスを作成したいのです。
これを実現するには低コストのブロッキングと低コストのタイマー、安全な例外処理を実装しないといけない訳なんですが低コストのブロックとタイマーの所に詰まってます。
同一スレッドないであれば例外処理の対応は簡単なので出来れば別スレッドに分けたくないのです(非同期クラスアダプタという特性上コストが数倍になるという理由もあります)。
よし、わかった!
volatileだな、これは!
どうみてもフォーラムのMVP共の出番
とりあえず、わんくまにでも聞けよ。
ていうかここから出て行け
この手の非同期つーか並列計算つーかその辺のしっかりした本ほしいな
初心者本ばーっかりでそう言うのが皆無
折角だから調べてみようかな
調べてみたが何のことは無いな
途中で書き込んじゃった。まだ終わっていない!
上級質問はわんくまなんかのMVPに聞け
あいつ等の仕事でもあるしな
これは答えちゃいけない流れなのか…
あー、これね
これはマルチスレッドでやるべきだよ
マルチスレッドスレは低レベルな話が多いからな(悪い意味ではない)
実装はしてないけどここを見ると大体理解はできるんだがなぁ
http://msdn.microsoft.com/ja-jp/library/dd997364.aspx 既存の非同期実装済みのクラスの非同期実装方法はBegin〜、End〜とIAsyncResult使った奴?それともオリジナル?
それから例外処理は重いからやりたくないって言ってるが、MSの推奨してるキャンセル動作は例外動作
使う側からはそう見えないっぽいけど
なんだかスレチな雰囲気が漂ってるから俺はこれで降りるよ
スレチだと思うならなんで書き込みするの?
もうこないでね(´・ω・`)
( ^ω^)来たお
失せろ
自分用のツールで数万件になりそうなデータを扱いたくなり
SQL Server Compact + LINQ to SQLに初めて手を出しています
複数のスレッドからカウンタを弄る場合の競合への対策を下のようにしてみたのですが
無限ループにするかどうか以外、他に何か問題はありますか?
var db = new Database("Database.sdf");
var row = db.Data.First(item => item.RowNo == 1);
row.Count++;
while (true) {
try {
db.SubmitChanges();
break;
} catch (ChangeConflictException) {
foreach (var cc in db.ChangeConflicts) {
cc.Resolve(RefreshMode.KeepChanges, true);
if (cc.Object == row)
foreach (var mcc in cc.MemberConflicts)
if (mcc.Member.Name == "Count")
row.Index = (int)mcc.DatabaseValue + (int)mcc.CurrentValue - (int)mcc.OriginalValue;
}
}
}
間違えました 一番下の行のrow.Indexはrow.Countです
なぜか急にC#でプログラミングすることになり戸惑ってる者です。
ttp://d.hatena.ne.jp/mirakui/20090808/hedotnet ↑の記述通りにMicrosoft Visual C# 2008でWebアプリを作りました。
デバッグ(ローカル環境)ではうまく動作しましたが、
IIS(でいいんでしょうか?)で実行させようとしたら、
アプリケーションでサーバーエラーが発生しました。
ファイルまたはアセンブリ'HyperEstraier'、
またはその依存関係の1つが読み込めませんでした。
間違ったフォーマットのプログラムを読み込もうとしました。
例外の詳細:System.BadImageFormatException
と出てしまい、ブラウザから起動すらしませんでした。
自分なりに調べ、Unmagaged DLLのため、と判断しましたが、
どうすればいいのでしょうか?
一応、Cで作られたDLLのパスを通すため、いろんなところに
コピーしましたが、エラーは全く変わりませんでした。
また、ブラウザから開こうとした時のエラー画面の下に
バージョン情報:Microsoft .NET Framework バージョン2.0.50727.4200;
ASP.NET バージョン:2.0.50727.4205
と出ていたのがちょっと気になります。
C#のプロジェクト自体は.NET Framework 3.5だと思います。
自分でよくわかっておらず、要領を得ない質問で
申し訳ありませんがよろしくお願いします。
それが出るときは、32/64問題の可能性が高い。
811 :
デフォルトの名無しさん:2010/06/21(月) 20:11:03
>>810 AnyCPU関係かね?
となると
>>809は開発OSとサーバー側のOSのエディションを晒すべきだな
開発用Webサーバーは32ビット。
IISが64ビットで件の例外が出てるんじゃないかと想像する。
質問です。
列挙に時間がかかるIEnumerable<T>が有るのですが、これをList<T>にしたい
ただToList()するだけでは時間がかかりすぎるので、取りあえずコレクションに10ぐらいAddして
残りは非同期で追加する。
こんな動作をしたいのですが、
BackgroundWorkerを使い、ProgressChangedでObservableCollectionに追加していく
これ以外に方法は無いでしょうか?回答お願いします。
>>813 List<T>にしたいのにObservableCollection?
ただ非同期にするだけならActionで囲んでBeginInvokeでいいと思うけど。
つうかそのListをどういう使い方するの?
ObservableCollectionのCollectionChangedでList<T>に追加して
メインスレッドで処理してるつもりになってるとか?
別のスレッドから追加したらイベントハンドラもその別のスレッドで実行されるし
ObservableCollectionはスレッドセーフじゃないよ
おおっと、書き方が悪すぎたようですみません。
WPFでのデータービューアー的なものを想定しています。
できるならList<T>で構わないのですが、逐次追加の場合反映されないのでObservableCollectionです。
流れとしては、
開始→IEnumerable<T>の取得→ObservableCollectionの作成→規定数だけ追加
→BackgroundWorkerのイベント設定し、開始→DoWork内で列挙→ProgressChangedで取得したアイテムをObservableCollectionに追加
C#で分数の計算をしたいのですが、サンプルみたいなのはありませんか?
または循環小数などを分数にするというものでもやり方があったら教えてください。
無いですよそんなもん
その手のはかなり難しいよ
サンプルが無いとできないようなレベルじゃ無理
オブジェクトのデシリアライズで質問です。
あるint型プロパティCountにデシリアライズしたのですが、
xml側が<Count></Count>みたいに何も入っていない場合、nullはInt32に変換できませんと例外が投げられてしまします。
これをnullの場合は0にしてデシリアライズする方法がありましたら教えてください。
int?にする
IXmlSerializable実装してそこだけ自分で書く
HTTPサーバーを作りたいのだけど
PerlとかPHPに環境変数渡して実行するにはどうすれば?
>>824 C#の出番がなければスレチなんですが
どう組み合わせるつもりで?
いや見たまんまだろ
サーバーをC#で書きたいんだろう
PerlとかPHPのサーバーから情報を集約してくるサーバーをC#で書きたいのかな?
いずれにしても、環境変数とか言ってる時点でC#以前な気がするけど。
>>824 CreateProcessで環境変数渡せばいいんじゃない?
ProcessStartInfo.EnvironmentVariablesでいいだろJK
>>830 おお、とりあえるありがとう
しかしなんだこの流れはw
CGIを知らないやつが無理に回答しようとするからこうなる。
まあ今回のはcgiとかPerlとか関係無しに
プロセス起動時に任意の環境変数を渡す方法を聞いてるだけだけどな。
836 :
デフォルトの名無しさん:2010/06/22(火) 12:36:01
さっき、女子中学生とSEXしてきた
UseShellExecute を falseにする必要があるとか何とか
840 :
デフォルトの名無しさん:2010/06/22(火) 19:39:41
DataGridViewの値(セルに表示されているの)をデバッグでステップインで
みたいんだけど、どれみりゃいいかわかんねーー
だれか、知ってる人いたら、教えて。
>>840 さすがに頭悪すぎる質問じゃないのか....
階層が深くてわかりにくいのは同意
とにかくツリーを開いてみて、見つけたらどこ開いたか紙にメモだな
そのうち慣れれば一発で開けるようになる
843 :
デフォルトの名無しさん:2010/06/23(水) 01:15:03
class A {
public delegate void AEventHandler();
public event AEvent;
}
class B : A
{
public B(){
base.AEvent += new EventHandler(AEvent_Func);
}
public void AEvent_Func(){
....
}
}
class program {
B b;
b.AEvent += new b.EventHandler(BEvent_Func)
public void BEvent_Func()
{
...
}
}
みたいな階層構造クラスがあります
Aで発生したイベントはprogramでもキャッチされてしまう?
BEvent_Func発生のタイミングはAでイベントが発生のち
Bでいろいろ処理をしてprogramにスローしたいのだけど
AにOnAEvent_Funcみたいな関数を作ってそれをオーバーライドするしかない?
キャッチされてしまう。On〜をオーバーロードするのが一般的
>>847 よくねえよ。
外部からメソッドを呼び出すとき、クラスの階層で同じ名前のメソッドがあっても
virtual/overrideを付けておかないと呼び出しの切り替えは行われない。
基本的には同じ名前を使いまわすのは避けた方がいい。
もちろんprivateの範囲で分かっていて定義するなら構わないけど、
protected/publicにするなら最悪。
(まあコンパイラに怒られるけど)
で、同じイベントに違うクラス階層から2つ以上のハンドラを
追加するような書き方はちょっと考えられないので、
頭整理して設計を見直した方がいいんじゃないかな。
クラスAはある情報を持ったクラスαをhashtableで管理してる
リストが変化するとイベントを発生させる
よく考えたらクラスBはイベント発生ルールが違うのでオーバライドは使えない
クラスBはαを継承したβを同じhashtableで管理してる
βはαにクラスB管理用のデータを付加したもの
AとBは基本的に機能が少し違うだけでどちらを使ってもいいようになってる
今はBの中でAをnewしてAからのイベントはBだけで完結するようにしてる
BはBのタイミングでB独自のイベントを発生させる
問題はBの中でnewしてるせいで同じ関数も再定義しないといけないから長い
あとhashtableを検索する作業が1命令で2重だから2回必要になる
非常に効率が悪い
こういうのはどう設計しればいいのかね?
>>849 なんか色々変な感じがしているが、とりあえずもうちょっと具体的なクラス名を付けてくれ。これじゃあ分かりにくい。
・クラスAとBを区別する必要があまりないなら1つのクラスにすることを考える
・コレクション的な使い方をしてるならSystem.Collections.Generic.Collection<T>を継承して作ることを考える。
・イベントはpublicにしておいて外部から登録させるような使い方じゃないと意味ねぇぜダンナ。
クラス内で完結するなら普通にメソッドを呼び出せばいいじゃないか。
>>850 1つにまとめるのは複雑になるので却下
Aはただのコレクションじゃなくてかなり複雑な処理をしてその結果をあるリストで管理してる
BはAのイベントをラップして別の形でAの結果にアクセスさせるためのラッパークラス
AのイベントがAで完結してるわけじゃない
BはAと似たインターフェースを持ってるが微妙に違う
共通する部分も多いのでB->Aという関数呼び出しが行われることもある
この時にBのリストのどれをターゲットにしてるか検索してまたAのリストのどれかまで
2重で調べないといけないから効率が悪いので悩んでたのです
基本的な作りが良くないんだろうな。
>>851 サンプルソースを公開してもらわんと案は出んだろうな。
お前のその判断が正しいということをソースなしにどうやって判断するんだ。
>>853 お前にお前呼ばわりされる筋合いないから
ところで
>>844のAのデリゲートってどこで使われてるの?
失礼します、若干スレ違い含むかもしれませんが
Windowsフォームアプリケーションを制作する際のVBとVC#の違いは何なのでしょうか?
一応どちらも使えるので優れた方に絞りたいな・・・と思うのですがお願いいたします。
VBってのはVB.netのことかい?
VB6だとすれば化石言語なので.netを使ったほうがいい
.netを使うんであればC#が使えるならC#を使ったほうがいい
VB.netはVBを使ってきた人が離れていかない用にあるだけ
両方使えるならどちらが優れてるかは明らかだろ
VB.NETは原則的にC#を超えてはいけない
どっちもどっちだけどな。
860 :
856:2010/06/23(水) 22:33:34
ありがとうございます。
どちらも基本的なことはできますが使い込んで少し入ったところまでしているのはVBなのですがこの度やりたいことがC#用でもう乗り換えちまうかー?と考えましたw
マイコンとかよく使うのでビット演算とか超便利ですね、これからC#のほうを主にしたいと思います。相談に乗ってくれてありがとうございました!
1:object obj = 10m;
2:decimal? a = obj as decimal?;
3:decimal b = a;
4:decimal c = a ?? 0m;
5:decimal d = (decimal)(a ?? 0m);
3行目だと暗黙的変換が行えない
でも4行目だと5行目みたいに書かなくても暗黙的decimalに変換されちゃう
何で?
環境:XP,VS2005
4と5はaがnullまたは0mの時に0mを返すから。
そもそもNullable外しのために導入されたのが??演算子
865 :
861:2010/06/23(水) 22:49:55
>>863 もしかしてnull以外の時は元の型で値を返してくるって事ですか?
a ?? bは
a == null ? (Aの型)a : b
と同じ意味
訂正
a == null ? b : (aの型)a
868 :
861:2010/06/23(水) 23:07:01
>>867 4行目は
decimal c = a == null ? 0m : (decimal?)a;
と同じ意味じゃなくて
decimal c = a == null ? 0m : (decimal)a;
と同じ意味って事か
ありがとう〜
話変わっちゃうが、関数の配列化なんて出来ないよね?
なんとかならんかな
public int i;
private void Form_Lord(){
//labelの配列化
for( i = 0;i < 100;i++){
method[i]();
}
}
*******************
private void method[1](){
Thread.Sleep(100)
label[1].text="a";
}
private void method[2](){
Thread.Sleep(100)
label[2].text="a";
}
・
・
・
できれば
private void method[i](){
Thread.Sleep(100)
label[i].text="a";
}
こんな様なことがしたいんだが
省略とかいろいろ気にしないで。
そんなことするメリットがまるで思いつかない
気になったじゃダメなの?
メリットがないと教えてくれないの?
今調べてみたけど Parallel Extensions のこと?
ちがってたらごめん。
並列処理も目的ではあるけど
変数をつかって関数を指定する見たいな事も同時にしたいんだ。
for文で書いちゃったからあれかもしれないが関数を呼び出す時に変数を使いたい。
やっぱ無理かな・・
よくわからんけどデリゲートじゃだめかな
何回も有難うございます。
調べてみましたが マルチキャストデリゲート では並列処理ではなく逐次処理になる模様です。
ですが、非同期呼び出し (Asynchronous Call) を使いBeginInvokeメソッドで実装できそうです。
以上を踏まえ少し考えてみたいと思います。
本当に有難うございました!
スレッドじゃだめなの?
スレッドクラス作って
必要な数と自分のインデックスを渡して起動すればいいだけでしょ
class threadclass(){
public int index;
public void run(){
}
}
for(i=0;i<10;i++){
threadclass t = new threadclass();
t.index = i;
Thread th = new Thread(new ThreadStart(t.run));
th.Start();
そして単に普段はthreadclassの配列を作っといて
run()を呼び出せばいいだけだろうに
しかしc#は動的クラスの関数がそのままスレッド化出来るんだから
この機能はまさに神的だな
スレッド処理が馬鹿みたいに簡単になった
883 :
デフォルトの名無しさん:2010/06/24(木) 07:14:21
つまり馬鹿が量産されるんだな
Threadのデバッグってどーやんの?
知りたいのはスレッドがちゃんと破棄されたかどうかを見たい
>>884 Debugトレーサーつかって前後にDebug.Writeして
それをテキストボックスとかに出すと楽ですお
稼働中のスレッドを列件してくれるガーベージコレクタみたいなのがあったらいいけど
VS2010で.NET3.5を使いながらMSChartを入れるのってどうやってやるのでしょうか?
2008と同じ方法でインストールしても、ツールボックスに表示されません。
.NET4.0にすれば標準で表示されるんだけど・・・うーん。
なんでプログラムの並列化と変数によるメソッド呼び出しを
同列に語っているのかが理解出来ない。
それぞれ別の話だろ。
>>885 前後ってどこー?
Threadってコールバック受け取っても死ぬとは限らないから確認のしかたがわけわかめ
スレッドというウィンドウがあるけどいまいち使い方がわかんない・・・
関数ポインタがしたいってことだよね
>>888 ユーザースレッド側でIDisposableな何がしかのオブジェクトを用意しておいて
コールバック全体をusing指定しておく。
Dispose()が呼び出された段階でトレースに書き込めばよい。
Threadのデバッグウィンドウは、デバッガでプログラムを変えている場合に他のスレッドに移動できる。
変なところで同期待ちしてたり無限ループしてたりしてる場合の問題解決には役に立つ。
>デバッガでプログラムを変えている場合に
デバッガでプログラムを止めている場合に
デバッガとか使ったことない。
マイコンでもLEDしかつかったことない
>>887 そういう意味なのか?
処理の違う関数を同じ名前で管理しなきゃならんような設計の方が理解出来ないがw
>>893 ポリモーフィズムがまさにそれなんだが?
>>871 答えでもなんでもない茶化しでも申し訳ないが。
某 H 社で改修をやらされた悪夢のコードがよみがえってしまった。。。
ex) [機能単位の命名規則(だっけ?)]0001, *0002, *0003, ...
>>897 いや、そうだぞ。名前と実装を分離するのが抽象化であり、
それの利用例であるポリモーフィズムなんだから。
Wikipediaでも読んでみれ。
>>893を言っていたらインターフェイスって何のためにあるんだろうな
メソッド単位ではあまりやらないが、
クラス(スーパークラスサブクラス混在)を配列で持ってForEachは結構やるわ。
リフレクション対応用に、他のアセンブリに定義されているクラスの属性を
外から追加したりってできないの?
902 :
デフォルトの名無しさん:2010/06/24(木) 11:42:32
すみません、配列から範囲指定で配列を取り出す方法を教えてください。
gという配列がありまして、
ruby で書くと
a = g[0...20]
b = g[20...20+20]
こんな感じの作業を書こうと思っています。
ぐぐるときのキーワードが悪いのか、
こんな単純なことがわからず1時間も経過してしまいました。
直接はできないのでIEnumerable<T>.Skip().Take()か何かで代用せよ
904 :
デフォルトの名無しさん:2010/06/24(木) 11:52:37
>>903 配列にはないが、Listにはあるぞ。List.GetRange()
>>902 動的言語におけるいわゆる配列というのは静的言語におけるリストに近いことが多い。
>>901 TypeDescriptor越しの操作に対してならTypeDescriptor.AddAttributesとかできる
メンバの属性を弄るのは確かすんごく面倒だったが気がするが
そうそう
涙
ひょひょ?
>>906 なるほど、ありがとう……。
実はprotobuf-netでシリアライズ使用としてるところなんだけど、
自作のクラスのシリアライズの一部がうまく動かなくて困ってた。
質問の答を用いた解決法とは違うやり方だけど、一応当初やりたい事はできるようになった。
しかし、protobufは型がぎちぎちだなぁ。
XmlSerializerやBinaryFormatterみたいな
ぬるいシリアライザ使ってた身ではつらいものが。
WCF使えばいいじゃん
protobuf-netはWCFの真似してるみたいだけどWCFはMSらしい汚い抜け道たくさん
>>912 WCFは.NET 3.0だからなぁ……。
protobuf-netはどうやらシリアライズ情報に型情報が一切入らないので、
object型を含んだ曖昧なコンテナなどを扱えないようだ。
BinaryFormatterの方は理解できないクラスはスキップされる。
例えばSystem.Drawing.Colorなんかがそうで、
適宜シリアライズ用のプロパティを定義して代わりに読み書きしてもらうようにする。
従来これで動かしてきたんだけど、
データにいちいち型情報が入るし、読み書きがいまいち遅いみたいなんだよね……。
2chブラウザを作る上でC#のExpressとProで差となる部分はどこですか?
無い
有ります
>>913 どうやってobject型にデシリアライズするんだよ
シリアライズ関連の頻出単語"contract"の意味わかってる?
>>917 実際にobject型のデータを持っているわけではないが、object型として扱っている部分がある。
例えばジェネリックでない通常のListだとかHash。
C#だともはやそういうコードは書かないんだけど別の言語(Boo)で実装している部分なので
そういう構成のデータが多々出来てしまう。
そういったデータをprotobuf-netだとシリアライズできなくて困ってるんだ。
で、別の言語を使い分けたり妙なライブラリ使ったりリフレクションを駆使したりすることによって
総合的に見て実際に生産性は上がった?
どうせわざわざ苦労するのが好きな変態さんなんだろ? もうシリアライザも自作しちゃえよ
まあ気持ちはよくわかるw
言語がひとつに統一されるのはいつだろう
>>919 うーん。総合的に見ると、正直疑問かもw
ただ利用者側がカスタマイズや機能の拡張をできるシステムを目指しているので、
C#だけで全部組んでしまうとまずい。
まあC/C++だけで組んでた時代と比べたら、
少なくとも倍位の開発スピードは維持できてるんじゃないかな。
シリアライザはメジャーどころだけで4〜5種類あるみたいだから、もうちょっと調べてみるよ。
言語が統一されたらまた神が怒ってバラバラにされる
チェーンソーが必要だな
チェーンソーか
神って自己中だし大嫌い
おめでとう
スパゲッティ・モンスター神を侮辱するとかありえないし
なにおー
おほほほほっ・・・
氏ね豚
>>921だけど調べてみたけどわからんかたわ。
あきらめるわ。
System.Collections.ArrayList[] w = new System.Collections.ArrayList[10];
w[0].Add = "うんち";
これでNull例外になるのはなんで?
w[0] = new System.Collections.ArrayList();
この行挟めば通るんだが、なんか納得できない
ArrayListは参照型だから
参照型についてはどのWebサイトや書籍見ても詳しい説明があるから自分で調べろ
935 :
デフォルトの名無しさん:2010/06/25(金) 22:09:34
いや参照型じゃなくて値型なら
配列作った直後に要素のインスタンスメソッド呼び出してもエラーにはならない
>この行挟めば通るんだが、なんか納得できない
なぜ納得できないのかが分からない。
ArrayList w = null;
w.Add("うんち");
でエラーになるのも納得できないわけ?
>>933 ポインタの配列を作ったところで、その配列の要素のポインタの値は不定かNULLでしょ。
…… なんて説明で分かればそもそも質問しねえかw
>>933 リストだから混乱するのかね。
例えば
HogeClass[] hoges = new HogeClass[10];
だったらhoges[0] も hoges[1] も全てnullだというのには納得?
ところで、ArrayListは産廃なのでList<T>使いましょう。
本当にそれが必要でループ回して初期化が面倒くさいなら
var lists = Enumerable.Range(0, 10).Select(_ => new List<string>()).ToArray();
と書けなくもない。
>>933 値型か参照型か以前に、ArrayListの配列に対する操作を
ArrayList自体と混同しているところがそもそもの問題の原因。
>System.Collections.ArrayList[] w = new System.Collections.ArrayList[10];
これは配列を作っただけで、中の10個のArrayListインスタンスはまだ初期化されておらず、nullのままだ。
だから
>w[0].Add = "うんち";
のコードの
>w[0]
のアクセスの段階でnullアクセスになる。
>>934-938 すまんね、オブジェクト指向の開発経験がまったくないもんで
w[0] = new System.Collections.ArrayList();
ここで初めてインスタンスができるってことなのかね
最初の配列宣言したときにできてくれてもいいじゃんとおもったわけなんだよ
>>940 何言ってるの?
w[0]は単なる配列アクセスでnullを返すだけ
>>941 インスタンスの生成方法は必ずしもデフォルトコンストラクタを使用するとは限らないからな
ところで.NET 2以降ならArrayListとかやめとけ。
944 :
デフォルトの名無しさん:2010/06/25(金) 22:41:28
>>941 配列というインスタンスはできてるじゃん
配列の各要素にぶら下げるインスタンスとは別だよ
javaとかc#から入った人はポインタの概念の理解なしで
参照型を理解してたりするのかね。
946 :
デフォルトの名無しさん:2010/06/25(金) 22:45:12
この辺が理解できないのは辛いな
947 :
デフォルトの名無しさん:2010/06/25(金) 22:52:08
948 :
デフォルトの名無しさん:2010/06/25(金) 23:03:31
2つの整数値からGetHashCode()をオーバーライドして、
一意になるようにしたいのですが、何かいい方法はないでしょうか。
整数値は1つが1〜99まで、2つめが1〜999までです(ただし連番ではない)。
単純に適当な数かけたり、XOR取ったりではキー重複になってしまいました。
んん?参照型って配列でいくら作っても別々の値を保持できるわけじゃないのかw
やり方間違えたわ・・・
何を言ってるのか良くわからん
構造体なのにオーバーライド??
GetHashCodeは別に一意にならなくても適度にバラついてればいいので
あまり神経質にならんでもいいんだけどね。
shortに収まるならa<<16 + bでいいじゃん
キーの重複って事はディクショナリか
Dictonary<TKey, TValue>ならコンストラクタにIEqualityComparer<TKey>を実装させたオブジェクト渡す
>>948 その課題に対するソリューションを考えるのに何か重要な情報がまだ抜けてるような気がするが、
とりあえず直接の解としては952でいいんじゃね?
他には0埋めで文字列化した上で2つ繋げて固定長の文字列にするとか。
そうやって作った集合をどう使うのか。どう保存するのかによっても話が変わってくるだろうよ。
>>945 ポインタの概念云々言うほどのこっちゃないだろw
参照なんてただの参照じゃんw
refとか絡んでくると苦しくなる
変数そのものを渡すとかいう意味不明な説明になる
>>955 「参照」の方が抽象度が高いから理解しにくいでしょ。
ポインタの方が低レベルだからより簡単。
だから全くの初心者がいきなり参照を理解するのは、
同じく初心者がポインタを理解するより難しい。
何か勘違いしてないか。
人によりけりじゃねーの?
ポインターのむずかしさって、概念よりもむしろ、安全な使い方するにはどうすればいいのかな部分だと思うんだけど。
ガベコレ教育の弊害
しかしイベントは発行するタイミングと処理するタイミングが前後するからうまくいかなかったり
manualresethandleとかで制御してたらそのせいでデッドロックしたり
イベントをマルチスレッドで使うのは危険だと分かった
>>933 激しく勘違いしてるだけだろ
System.Collections.ArrayList w = new System.Collections.ArrayList();
w.Add = "うんち";
たぶんこうしたいだけ
うんちとは何事だよ
>>962 だから Win Forms も WPF もディスパッチャーの機構持ってるのよ。
>>963 List<string> にしようよ。
966 :
デフォルトの名無しさん:2010/06/26(土) 13:07:44
タスクトレイ常駐型アプリを作っているんですが、そのアプリがタスクトレイにある間に
Windowsをシャットダウンしようとしてもできません。そのアプリを終了するとできます。
ネットで調べたら、タスクトレイ常駐アプリはシャットダウン時の処理をちゃんと書かないと
そうなるということがわかりました。
そこで
http://dobon.net/vb/dotnet/system/sessionending.html←を参考にして、
コンストラクタに↓とかきまして
SystemEvents.SessionEnding += new SessionEndingEventHandler(SystemEvents_SessionEnding);
private void SystemEvents_SessionEnding(object sender, SessionEndingEventArgs e)
{
if (e.Reason == SessionEndReasons.Logoff)
{
Application.Exit();
}
else if (e.Reason == SessionEndReasons.SystemShutdown)
{
Application.Exit();
}
}
というメソッドを書きました。
しかし、うまくいきません。そのアプリが終了してくれずタスクトレイに常駐したままです。
どうすればいいんでしょうか?
967 :
966:2010/06/26(土) 13:09:38
ちなみに、WndProcでやったらどうなるかと思いまして
protected override void WndProc(ref Message m)
{
const int WM_QUERYENDSESSION = 0x11;
const int WM_ENDSESSION = 0x16;
switch (m.Msg)
{
case WM_QUERYENDSESSION:
Application.Exit();
break;
case WM_ENDSESSION:
Application.Exit();
break;
}
base.WndProc(ref m);
}
↑と書いて見ると、今度はアプリの終了までは行くんですがPCのシャットダウンは
なりません。。
どうすればいいのかわからないので、知っている方がいましたら、教えてください。
968 :
966:2010/06/26(土) 13:11:46
単に通知領域にアイコンを表示するだけのアプリでもダメ?
なんか変なことやってると思うよ。
ていうかそのページ、対象が.NET 1.x時代のだ
.NET 2.0以降ならFormClosingイベントでCloseReasonがUserClosingのときだけCancelするようにすれば
SessionEndingとか使わずとも問題ないはずだが
>>969-970 私は、以前Javaプログラマで荒療治でネットからコピペして
何とか作っていたんですが、無理があったみたいです。Form_Closing メソッドを
private void frmTouroku_FormClosing(object sender, FormClosingEventArgs e)
{
if (e.CloseReason != CloseReason.ApplicationExitCall)
{
e.Cancel = true; // フォームが閉じるのをキャンセル
this.Visible = false; // フォームの非表示
}
}
だったのを
if (e.CloseReason == CloseReason.WindowsShutDown)
{
e.Cancel = false;
}
を付加したら、治りました。Windows終了時のApplicationExitを逃していたみたいです。
うまくできるようになりました。ありがとうございました。
>>970さんの言うように、今度は
if(e.CloseReason == CloseReason.UserClosing)
e.Cancel = true;
とやってためしてみます。ありがとうございました。
しかし、みなさん、詳しいですね。C#は書籍も少ないので情報源が少なく
苦戦しています(;^^ ヘルプも重いですし。
解決できてよかったです。ありがとうございました。
たいていは自分の書いたコードに問題があるんだから、
そこを重点的に見ていけばいいだけなんだが。
Javaプログラマとか書籍が少ないとか、なんも言い訳にならん。
974 :
948:2010/06/26(土) 15:15:12
色々説明不足ですみません。
>>953の通り、自前クラスをDictionary<key, value>に入れるにあたり、
keyにGetHashCode()を使用して、一意性を確保したいということでした。
元々は従業員テーブルのモデルクラスなのですが、社員IDのようなものがなく、
常に支店CDと社員CDの二つを見なければならないため、これを解消したいと思ったのがきっかけです。
現在はList<T>を継承したクラスで管理しており、
Employees.FindByPK(支店CD, 社員CD)のような形で社員情報を取得しているのですが、
100人分取得しようとすると、それだけ毎回foreachで回すという無駄が出ています。
単純に連番やAddする際のDateTime情報からKeyの導出というのも考えたのですが、
別のモデルクラスの支店CD, 社員CDから、このクラスを関連づけようとした場合に
別クラスからはKey情報が判別できないため「なんとか支店CDと社員CDから一意な値を導けないか」と考えて質問しました。
>>948、
>>954の方法で試してみたいと思います。ありがとうございます。
そういえばHashtableのキーって何で比較してるの?
intとかなら値だろうけどオブジェクトだと同じオブジェクトか比較するの?
具体的にはIPEndPointを使いたいんだけど
>>975 まず GetHashCode の戻り値で大まかに判別。
その後、ちゃんと Equals で確認。
GetHashCodeの値で大まかに振り分けて、対象の要素が含まれているグループ(同じハッシュ値をもつとは限らない)を
絞り込んだら片っ端からEqualsで比較してキーが一致したら検索成功
細かいことはハッシュ表でググれ
だから948は一意にこだわる必要はないんだよね……
979はワシが育てた
次スレは?
RSACryptoProviderでXMLキーじゃなくてバイナリデータでやり取りしたいんだけど
方法はあるの?メンバメソッド見る限りそれらしいものが無いんだけど
>>983 やりとりと言われてもよく解らんが、
そのライブラリの本来の目的である暗号化、復号化としては十分使えるぞ。
アルゴリズムごとに決まったファイルサイズが増える格好になる。
>>983 メンバ見りゃ見たままメソッドがあるように思えるんだが、何を言っているのかね?
>>985 あったwExportCspBlobこれかwBlobってwwwなんでwww
スレ作成方法しらない。
>>982がかわりに作成する。