C#, C♯, C#相談室 Part46at TECH
C#, C♯, C#相談室 Part46 - 暇つぶし2ch175:デフォルトの名無しさん
08/05/13 18:11:30
オブジェクト指向のもっとも重要なポイントは、クラスではなくインスタンス。
インスタンスが主役であって、クラスはオマケ。継承がウンタラとかいう連中もいるが間違っているから相手にするな。
今四つのインスタンスがあるとする、それぞれ A , B , C , D
粒度が細かすぎて取り扱いにくいので、二つにまとめてみようと考えてみる。
インスタンスAがBを呼び出すなら
A --関数名--> B
と書いてみる。
まとめる方法は[A,B,C] [D]がよいか[A,B] [C,D]がよいか。
呼び出しが最少になるような図を考えてみよという事。
適当に矢印書きまくって、最小になるように分離してみるといい。
あとは応用。

176:デフォルトの名無しさん
08/05/13 18:56:57
インスタンスが主役でクラスがおまけ、って俺には理解できない発想だマジで。
っていうか、それに類するような主張をこれまでに聞いたことがないよ。

177:デフォルトの名無しさん
08/05/13 19:06:45
なにいってるかよくわからんが、継承か包含かちゅー話じゃないのか

178:デフォルトの名無しさん
08/05/13 19:12:02
プロトタイプ指向のことなんじゃね

179:デフォルトの名無しさん
08/05/13 19:16:53
インスタンスが主役w

180:デフォルトの名無しさん
08/05/13 19:21:47
C#は型指向

181:デフォルトの名無しさん
08/05/13 20:35:08
>>176
オブジェクト指向を扱っているサイトにいってみたら?
そうすれば無知も治るよ

182:デフォルトの名無しさん
08/05/13 20:39:21
オブジェクト指向ではインスタンス(実体)は脇役だろう。

183:デフォルトの名無しさん
08/05/13 20:40:36
>>182
今から15年前くらいは、確かにそういう事になっていたが、そのまま固まったか?

184:デフォルトの名無しさん
08/05/13 20:43:19
Javaが登場して以降、体系的に研究されたオブジェクト指向もちょっとは勉強するといいよ。
でないと、デザインパターン意味や使い方など理解に及ぶことはできないし、上の例だって発想することすら難しいだろう。

185:デフォルトの名無しさん
08/05/13 20:46:44
Javaと関係なく研究は進んでいたと思うんだけど。

186:デフォルトの名無しさん
08/05/13 20:50:18
何言ってんの。
オブジェクト指向イコールJavaと言ってもいい程だよ。

187:デフォルトの名無しさん
08/05/13 20:52:15
その進んだ研究を勉強していないのは駄目だという事だよ
今のライブラリは当たり前にその設計思想が入っているからな、知らないと使い方分らんだろ。

188:デフォルトの名無しさん
08/05/13 20:53:17
>>186
ゴールじゃねぇよ、LINQとか見てみろ

189:デフォルトの名無しさん
08/05/13 20:54:35
別にオブジェクト指向がどうとかこうとかどうでも良いよ

190:デフォルトの名無しさん
08/05/13 20:55:05
インスタンスは実体。
お前はパソコンに文字を表示させるとき、直にVGAのメモリを書き換えるのか?違うだろう。
ドライバやらOSやらGDI+やらライブラリ郡など抽象化されたものを通してアクセスし表示させるだろう。

オブジェクト指向はインスタンス(実体)を直接操作せず、抽象化して利用しやすくする手法。
インスタンスがメインなわけがない。

191:デフォルトの名無しさん
08/05/13 20:55:55
>>188
ゴールなんて関係ないこと持ち出して自ら否定して
結局何が言いたかったのかね。


192:デフォルトの名無しさん
08/05/13 20:56:37
>>190
ヒント:言葉遊び


193:デフォルトの名無しさん
08/05/13 20:56:38
>>190
そうだな、もう永久にそう思っていろよw

194:デフォルトの名無しさん
08/05/13 20:59:04
>>190
そんな考えでも君のプログラムがちゃんと動くならそれでいいよ
それはそれで正しいわけだから


195:デフォルトの名無しさん
08/05/13 21:00:26
良いコード:動くコード
悪いコード:動かないコード

196:デフォルトの名無しさん
08/05/13 21:05:01
クラスが主役 に一致する日本語のページ 約 290,000 件中 1 - 10 件目 (0.30 秒)
インスタンスが主役 に一致する日本語のページ 約 1,790 件中 1 - 10 件目 (0.06 秒)

197:デフォルトの名無しさん
08/05/13 21:11:37
タイヤキの型とタイヤキそのもの
どっちも主役です(ゆとり教育的発想)

198:デフォルトの名無しさん
08/05/13 21:34:08
もうこの手の話がしたい奴はOOPスレ行った方がいいよ。
あそこは>>175的なトンチキな自説をぶってるアホが延々同じネタをループしてて楽しいと思うよ。
俺は正直吐き気がするけどねああいうの。

ちなみに>>190は半分はいいこと言ってると思うんだよね。
OOPというアイデアの肝は、>>190の言う抽象化(より正確には仮想化と言うべきだと思うけど)された
仮想機械をより直感的に表現するコーディング手法ということだと思う。

ただ「実体=インスタンス」ってのは全然意味不明だが。

199:デフォルトの名無しさん
08/05/13 21:36:29
インスタンスの和訳が実体だろ・・・

200:デフォルトの名無しさん
08/05/13 21:43:41
>>188
LINQはオブジェクト指向とはまた別だろ。
関数型プログラミングのほうが近い。

201:デフォルトの名無しさん
08/05/13 21:45:09
なんか、こう訳わからん事になっているから、少し書くと
たとえば、C++でいう所の仮想テーブルは、virtual などなくても class のみで作り出すことができる。
これは非常に重要なことで、仮想テーブルは書き換えられないが、自分で作った仮想テーブルは書き換えられる。
このような実装は、Strategyパターンと呼ばれる。
つまり、classを使った抽象化は実は必要なく、ただ『頻繁に出てくるので言語上にvirtualとして実装しておくと便利であるという程度の意味』しかないのだ。
オブジェクト指向を理解する上で、この点について理解しているかどうかは決定的だ。
理解せずクラスと継承を中心に置くとやれる事が一気に限定されてしまうのだ。
さらには、継承には各種問題点も指摘されてり、特に深い継承は良くないと最近はされている。
また原則、継承を考える前にインターフェイスを検討するべきとされている。

参考コーディング規約
URLリンク(www.kawabata.com)
参考サイト
URLリンク(www.objectclub.jp)


202:デフォルトの名無しさん
08/05/13 21:49:06
>>199
話の文脈を読まなきゃ。
>>190の言う「実体」とは「クラスによって抽象化される前の何者か」。

たとえばGDIならビデオカードやプリンタのハードウェアのことを「実体」といっている。
少なくとも話の前半ではね。

203:デフォルトの名無しさん
08/05/13 21:51:16
>>201
それって結局、包含と委譲のことだろ。クラス対インスタンスという話ではない。
継承だけがクラスの特徴ってわけじゃないぞ。

204:デフォルトの名無しさん
08/05/13 21:51:26
>>202
確かに変だな。

205:デフォルトの名無しさん
08/05/13 21:53:21
>>203
つってもインスタンスを大量生産するための鋳型以上の意味もないだろ?

206:デフォルトの名無しさん
08/05/13 21:55:38
>>175
ひょっとしてインターフェイスと書くところをインスタンスにしてしまって
引っ込みが付かなくなったとか。それなら文脈があうが・・・

207:デフォルトの名無しさん
08/05/13 21:57:38
>>206
インターフェイスもインスタンスの一つと見なしてよいものだよ。
インターフェイスは取得するものだ。

208:デフォルトの名無しさん
08/05/13 21:58:17
>>207
またまた荒れるような書き方をするな。

209:デフォルトの名無しさん
08/05/13 21:59:06
いったい君たちは何の話をしてるの?
誰か頭のいい人ドラゴンボールに例えてくれよ

210:デフォルトの名無しさん
08/05/13 22:00:06
ドラゴンボールの主人公はヤムチャなのか天津飯なのかと言う話

211:デフォルトの名無しさん
08/05/13 22:27:53
実装と概念は分離して語れよ

212:デフォルトの名無しさん
08/05/13 22:30:20
↑といいつつ乖離して語る馬鹿


213:デフォルトの名無しさん
08/05/13 23:10:09
主役はキーボードを打つキミだ!!

214:デフォルトの名無しさん
08/05/14 01:52:33
>>209
サイヤ人→クラス
悟空→インスタンス

215:デフォルトの名無しさん
08/05/14 01:57:38
スーパーサイヤ人→スーパークラス

216:デフォルトの名無しさん
08/05/14 04:08:51
ブルー将軍→サブクラス

217:デフォルトの名無しさん
08/05/14 06:42:59
クラスもメタクラスのインスタンスだから、
インスタンスが主役ということでおk、みたいな話か?

218:デフォルトの名無しさん
08/05/14 06:58:38
決定的な違いは、メタ視点を持てているかどうかだろうな
明らかに不自由な設計やコーディングをしているのは明白なのだが
目が見えていないので、それを理解するのが困難になっているような気がする。

219:163
08/05/14 09:30:42
皆さん、いろいろとアドバイス頂き有難う御座います。

すこしスレが荒れ気味ですが、これは私の無知を175さんが丁寧に
ご指導してくださった点から始まっているかと思います。
原因は私にあります。スレを汚して申し分けありません。

最近良く思うのですが、OOPの浸透が何故遅いかと、
1)基本概念と実装に大きな開きがありすぎる。
2)考え方に様々な歴史や諸説があり、人や本によって解釈が異なる。
(人によって解釈が異なるのは、読んだ本の年代が大きく依存しているんでしょうか・・)
の2点に集約してるかと思います。

OOPが不慣れなものにとっては
具体的な実装論はなかなか本の中には出てこず、
また、こーいう現場的な定石というのか考え方が定まらなくて、
悩んでいることが多いんです。

だから、175さんを始め皆様より貴重なアドバイスを頂いた件は、
非常に感謝しております。

インスタンスの件は、2論に分かれているかと思いますが、
これは馬鹿な私にでも分かるように説明した為の、言葉の綾かと思います。

長文になってしまい申し訳ありません。
とても勉強になりますた。
皆様を師匠と仰ぎ、また伺わせて頂きます!!

220:デフォルトの名無しさん
08/05/14 12:43:48
くだらない哲学論争は後回しにして、とりあえずクラスの利便性(哲学論争クンはこういう言い方に反発するようだけど)
を体得するのがいいと思うよ。っていうかそれが一番重要。
大して難しいことじゃないから使ってれば自然とわかるよそれは。

くれぐれもOOPを外から強制された義務的なものに過ぎない、などと考えないこと。
便利だから使われてるんだよ。

OOPが浸透してないとは俺には思えないけど、もしそうであるのなら
それはOOPが「つかえねえ」からじゃなくてこの業界に馬鹿が多いからだよw

221:デフォルトの名無しさん
08/05/14 14:16:24
質問です
UDPで受信したメッセージをテキストBOXに表示する処理の方法論です。
今は、UDP受信を別スレッドで受信して。セマフォー同期ででString変数に渡し。
フォームのプロセスで、タイマー関数からセマフォーを同期で文字列を受け取って
テキストBOXに表示しています。
しかし、今一つスマートでないような気がしてなりません。もっと良い方法がないでしょうか?

222:デフォルトの名無しさん
08/05/14 14:38:37
普通に Control.Invoke でいいんじゃねーの?

223:デフォルトの名無しさん
08/05/14 15:20:18
タイマースレッド内に、Invokeで受信部分を入れてみたのですが。
ダメみたいな感じでした。
問題点1 Invokeスレッドが終了しない。
問題点2 結局、セマフォーで受信の確認を取るので処理的に同じ。
ただし、使い方が悪いのかもしれない。

別スレッドから、フォームに非同期イベントが出せればいいのだけど、その方法を知らない。
きっと有るような気がします。すごく初歩的な機能かも知れない…

224:デフォルトの名無しさん
08/05/14 15:36:47
223が何を言ってるのか全く分からない
Invoke スレッドて何?

225:デフォルトの名無しさん
08/05/14 16:14:15
>>224
んなこと言ったら、余計意味不明な説明が始まりかねん

で、結論
Invokeの意味を理解できてない
Invokeの使い方が間違っている

226:デフォルトの名無しさん
08/05/14 16:18:18
>>225
>Invokeの意味を理解できてない
その可能性もある。
>Invokeの使い方が間違っている
この問題にInvokeが適用できない。又は、別つの方法があるが使用したくない。

ちなみに、Invokeの中は一つのスレッドであることは理解していますよね?

227:デフォルトの名無しさん
08/05/14 16:54:08
>>221
Control.Invokeが解っていないなら、
URLリンク(codezine.jp)


228:デフォルトの名無しさん
08/05/14 17:32:06
>>222-227
出来ました。 結論:Control.Invokeが解っていなかった。無知でした。
申し訳ありません。そしてありがとうございました。

229:デフォルトの名無しさん
08/05/14 21:33:17
本当の主役はテレビの前のあなたです!!m9ビシッ

230:デフォルトの名無しさん
08/05/14 23:31:56
定数の取り扱いについての質問です。

定数宣言
public enum 定数
{
MASU = 81,
}

変数の定数宣言
public const int MASU = 81;


この場合、配列列データ_創る場合。
private int[] tbl = new int[定数.MASU];

private int[] tbl = new int[MASU];
どちらも同じに見えるのですが。前者を使用したほうがベターですか?
前者の方が速いですか?


231:デフォルトの名無しさん
08/05/14 23:37:25
enumハックを思い出した

232:デフォルトの名無しさん
08/05/14 23:46:14
キモい命名法だ

233:デフォルトの名無しさん
08/05/14 23:58:18
>>230
速さは一緒
値自体に意味があるならenumじゃなくてconstの方が適切
でもpublicならconstじゃなくてstatic readonlyにした方がいい

234:デフォルトの名無しさん
08/05/15 00:14:07
>>233
知らなかった知識です、ありがとうございます。

235:デフォルトの名無しさん
08/05/15 00:35:48
constと(static )readonlyは全く別物だから、
ちゃんと調べて使い分けるようにした方がいい

236:デフォルトの名無しさん
08/05/15 02:28:29
>>235
どこがどう違うかを書いた方がいい

237:デフォルトの名無しさん
08/05/15 02:44:41
自分で書けよ

238:デフォルトの名無しさん
08/05/15 02:48:18
constに出来るものをstatic readonlyにした方がいい理由ってなんだよww

239:デフォルトの名無しさん
08/05/15 03:26:42
>>238
メモリの節約。

240:デフォルトの名無しさん
08/05/15 03:30:00
↑アホ

241:デフォルトの名無しさん
08/05/15 06:17:51
基本的にconstはクラス内でprivateに定義してその中だけで使用する。
constをアセンブリやnetmoduleまたがりで参照した場合、副作用がある。

S.DLLでpublic const A = 10
M.EXEで S.Aの表示 10
public const A = 99 に変更してS.DLLだけを再コンパイル。
M.EXEを再コンパイルしない限り結果は10のまま。

242:デフォルトの名無しさん
08/05/15 07:48:45
constを他のアセンブリから参照すると、参照元のアセンブリにも定数が埋め込まれる。後で値を変えたらさあ大変。
数学定数みたいに、絶対に値が変わることがないもの以外は、static readonlyにしたほうが無難。
あとはSizeとかDateTimeみたいに初期化の必要なものを、定数っぽく扱いたいときに。

243:デフォルトの名無しさん
08/05/15 09:05:11
それは完全に枝葉というか性質というか…全然別という意味分からないだろ
constはコンパイル時に値が確定される定数、readonlyは書き込み不可な変数。

見えてくる違いとしては、constはコンパイル時に評価されるので使える範囲がちょっと広い。
定数式しか許されない属性指定内部やswitchのcase句にも使用可能。これらに使用される場合境界越えで
あってもconstにする必要がある。

ちなみにenumの個々の値はconstなのでenumを等価に置き換えるならconstになる。

244:デフォルトの名無しさん
08/05/15 09:25:48
enumの値が変わったら大変なことになるんだな

245:デフォルトの名無しさん
08/05/15 09:27:54
外部に公開している列挙体を不用意に変更しちゃマズいのか。

246:デフォルトの名無しさん
08/05/15 10:09:30
>>242
これは知らなかった。勉強になる

247:デフォルトの名無しさん
08/05/15 14:15:35
ところでなんでcaseには定数しか書けないの?

248:デフォルトの名無しさん
08/05/15 14:33:21
定数じゃないと、複数該当することもあるからじゃない?
まあ上から順番に比較するような仕様のやつもあるが。

249:デフォルトの名無しさん
08/05/15 17:34:50
あとジャンプテーブル変換

250:デフォルトの名無しさん
08/05/15 18:23:06
実装を簡単にするための手抜き

251:デフォルトの名無しさん
08/05/15 22:20:36
かといってVBのSelectCaseは自由すぎると思わないか?

252:デフォルトの名無しさん
08/05/15 23:37:20
selectっていうのは0,1,2,3,4...
みたいに連番で並んでると
それを関数ポインタの配列みたいにしてジャンプすることが出来る
だから定数じゃないとどうしようもない

253:デフォルトの名無しさん
08/05/16 02:00:26
バカばっかw

254:デフォルトの名無しさん
08/05/16 08:37:30
↑暴走中。

255:デフォルトの名無しさん
08/05/16 10:48:23
>>251
バグを引き起こしかねない問題を含まない限り、自由度は高いに越したことはないよ
C#は新規なんだから、switch case の構文にこだわるべきじゃないとは思った
もともと、switch は C の特殊 goto label の構文な訳だし、考え方が古臭すぎる。
for 文からの脱出に break を使いたくても、switchにとられてしまうとかダサいと思うので。

256:デフォルトの名無しさん
08/05/16 11:37:15
フォールスルー不可能にもかかわらずbreak必須って時点で(ry

257:デフォルトの名無しさん
08/05/16 11:38:59
たしかに。
この辺何とかならなかったのか。
C、C++からの移行を意識してるならswitch caseと別の構文にすればいいしな

258:デフォルトの名無しさん
08/05/16 11:57:33
>>252
stringにもswitchは使える
その場合はif(str=="a") /*case a*/ else if(str=="b") /*case b*/ else if…
みたいなコードにコンパイルされる

259:デフォルトの名無しさん
08/05/16 16:01:00
>>258
たくさんあるとDictionaryを使うらしいぞ

260:デフォルトの名無しさん
08/05/16 18:35:22
#regionはIDEで出来るようにした方がいいと思う。

261:デフォルトの名無しさん
08/05/16 18:49:50
それを言語そのものに組み込むところはC#の特徴というかアピール
IDEサポートを謳ってる言語なんだから

262:デフォルトの名無しさん
08/05/16 19:29:25
C#3.0の自動プロパティ作ると、[xxx]k_BackingField(うろ覚え)とかいうような変数が内部で生成されてるらしいんだが、これにソースコード上で属性を付加する方法ってありますか?
自動生成のプロパティにつけても自動生成される変数には付加されないみたいです。

263:デフォルトの名無しさん
08/05/16 19:54:51
>>261
C++にもあるよ。
てかそれなら両方サポートすればいいじゃん。

264:デフォルトの名無しさん
08/05/16 20:02:54
>>262
> 自動実装するプロパティ (C# プログラミング ガイド)
>
> 自動実装したプロパティでは、属性は使用できません。プロパティのバッキング フィールドで属性を使用する必要がある場合は、通常のプロパティを作成します。

265:デフォルトの名無しさん
08/05/16 20:05:39
>>264 ('A`)マンドクセ

266:デフォルトの名無しさん
08/05/16 21:21:12
プログラミングC#っていう本を買おうかと思ってるんだけど
これ2年前に第4版が出たのが最後で、C#2.0対応とかVS2005対応とか書いてるよね
もう今はC#3.5とかVS2008もでてるけど、近いうちに第5版とか出たりしそうかな?
それとも第4版の内容でまったく問題ない?

267:デフォルトの名無しさん
08/05/16 21:27:06
普通に考えれば最新の機能には対応してない。それだけだ

268:デフォルトの名無しさん
08/05/16 21:32:47
C#3.5って出てるの?

269:デフォルトの名無しさん
08/05/16 21:39:45
>>267
まあ、そうだね。サンクス

>>268
ごめん、嘘ついた。NET Framework 3.5でもC#は3.0のままです

ちょっと調べてたら原書のProgramming C# 3.0ってのは去年末にでてるんだな
日本語版でないかなー

270:デフォルトの名無しさん
08/05/16 23:43:57
始めたばかりの俺はそれを待っている
今は猫と初めてを併用して学習中

271:デフォルトの名無しさん
08/05/17 01:02:27
原書買えよ

272:デフォルトの名無しさん
08/05/17 02:10:19
質問です。
DataGridViewで自動カラム生成機能ってありますけれど
あれのカラムのフィールド名はこちらから指定できないんでしょうか?
(特にReflectionを使った手法で)
プロパティに属性つけるとかしたら上手くいくんじゃないかと思ってるんですが…

ご存知の方いましたらお教えください。

273:デフォルトの名無しさん
08/05/17 03:11:04
自動生成したらフィールドも何もないと思うが、
カラムのフィールド名って具体的に何を指してる?

デザイナで列を追加したときにフォームに作られる
Column*フィールドの名前のことか?

274:デフォルトの名無しさん
08/05/17 06:16:50
>>273
すいません、あまりにも説明不足でした。
フォームのカラムのヘッダに表示される文字列のことです。
プロパティ名がそのまま文字列変換されて表示されているようなので
多分どこかで設定できるんではと思っているのですが…

275:デフォルトの名無しさん
08/05/17 07:41:53
Select()でプロパティ名を変えた匿名型にすればいい

var e1 = ...; // 元のデータソース: IEnumerable<Hoge>
var e2 = e1.Select(x => new { Bar = x.Foo, ... });

276:デフォルトの名無しさん
08/05/17 08:36:22
知らない文法だなぁと思ったら2008ですか…。

ちょっと調べてみます。ありがとうございます。

277:デフォルトの名無しさん
08/05/18 16:45:58
Seleは2005でもあるんじゃ?
ラムダはデリゲートになおせばいいよ

278:デフォルトの名無しさん
08/05/18 16:47:00
Selectな

279:デフォルトの名無しさん
08/05/18 16:50:05
ごめん嘘だ
URLリンク(msdn.microsoft.com)
3.5からだった

280:デフォルトの名無しさん
08/05/18 22:57:12
2005でも似たようなのを作ることは出来るがラムダ式がないと使い物にならない

281:デフォルトの名無しさん
08/05/19 06:12:12
2008に慣れてしまって、もうLastOrDefault()相当のコードを書くことすら面倒くさい。

282:デフォルトの名無しさん
08/05/19 14:21:56
WindowApplicationを作っています。

別スレッド(固定周期)でDBの値を引いてきて、Form(メインスレッド)のラベル.Text属性に値を設定する
という処理を行なっていますが、
表示されるのは最初だけで、その後DBの値を変えてもラベルの値が変更されません。

どうしたらいいかご教授ください。

283:デフォルトの名無しさん
08/05/19 14:29:09
>>282

>>227と同じかな?

284:デフォルトの名無しさん
08/05/19 19:18:45
同一のストリームをBinaryReaderとBinaryWriteに食わせた場合、
Closeを呼び出す順番ってどうすればいいの?

ついでに、フィールドで持っているストリームをメソッド内のローカルの
BinaryReader/BinaryWriterに食わせた場合、仮にメソッド内でClose呼んだりusingを使ったり
することを避けたとしてもBinaryReader/BinaryWriterがGCに回収されるタイミングで
ストリームも強制的に閉じられてしまうんだろうか?

285:デフォルトの名無しさん
08/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) ;
}

286:デフォルトの名無しさん
08/05/19 20:50:34
>>285
>static Func<TResult> SetArg<T1,TResult>(Func<T1,TResult> f,T1 a1)
>{
>   return () => f(a1);
>}

ライブラリに同等のものはないしもっと良い方法もない。
でもここにあげられたSetArgメソッドを使うぐらいなら
 a1 => f(a1)
と毎回インラインで書けば十分だと思うよ。

287:デフォルトの名無しさん
08/05/19 20:57:42
>>285
今までC++使っていた人?

C++がstd::bind1stやstd::bind2ndをありがたがって使っているのは
今までC++に簡潔なラムダ式が存在しなかったという特殊事情もあるので
C# 3.0で無理してまねる必要は無いと思うよ。

C#だとSetArgみたいなのを作ってもインライン展開されないしね。

288:デフォルトの名無しさん
08/05/19 20:59:06
なんかすごいレベルの高い話してる・・・

289:デフォルトの名無しさん
08/05/19 21:00:24
慣れてないだけだよ
解ればそんなに難しくない

290:デフォルトの名無しさん
08/05/19 21:10:48
>>284
Disposeは複数回呼び出されても大丈夫だから,続けて呼びさえしていれば問題ないんじゃね
BinaryReaderやBinaryWriterはファイナライザを実装してないから
それらがGCされるときにストリームが勝手に閉じられることはないよ
ストリームへの参照がどこかで繋がってる限りは大丈夫

291:デフォルトの名無しさん
08/05/19 21:44:31
>>290
ありがと。

292:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/05/19 22:29:40
いやそれは遅延のせいではないんじゃ…

294:デフォルトの名無しさん
08/05/19 22:31:29
C#のデリゲートはクロージャでない

295:デフォルトの名無しさん
08/05/19 22:34:25
遅延させたいんでしょう、つかその必要がなければ、Lambdaなど使わずにその場で計算すれば済むわけだし。

296:デフォルトの名無しさん
08/05/19 22:39:05
Cocoaバインディング便利そうなんだけど、C#でUI作るとき同じようなもの作ったりしてる人おる?


297:デフォルトの名無しさん
08/05/19 22:40:44
>>292
List<Func<int>> list ;
for(int i=0;i<100;i++)
{
var j=i;
Func<int> tmp = () => j + 5 ;
list.Add(tmp) ;
}
こうすればお望みの動作にならんかったっけ?見検証ヾ(゚д゚;) スッ、スマソ。

298:デフォルトの名無しさん
08/05/19 22:44:05
ListView.ItemSelectionChangedイベントで選択Itemが変化したのを検出し、
別の詳細表示フォームの表示を更新する、といったことをしています。

何も選択していないときは、詳細表示では何も表示したくないので全て消去しているのですが、
ItemSelectionChangedイベントは、選択が切り替わるときに「選択解除」と「選択」の2つのイベントを発生させます。
そのため「表示の解除⇒再表示」となってしまい、妙なチラツキが発生してしまっています。

1回目の解除用のItemSelectionChangedイベントでは、次に選択が入るかどうかが分からないので、
どうやってチラツキを抑えようか困っています。
この問題を改善する方法はないでしょうか?

299:デフォルトの名無しさん
08/05/20 01:04:48
>>292
こういうので良いんじゃない?

var list = Enumerable.Range(0, 100).Select(i => (Func<int>)(() => i + 5)).ToList();

300:デフォルトの名無しさん
08/05/20 01:25:06
>>298
SelectedIndexChanged使えば?

301:デフォルトの名無しさん
08/05/20 02:04:34
>>297
やり方はそれでOK
そのコード自体はNullReferenceExceptionになるけどなw

てか、C#でラムダ式に(パラメータ以外の)変数を入れる場合は、
基本的にスコープを最小限して、参照型ならコピーを使うというのは
for文の条件に不動小数点数を使わないのと同じくらい常識だと思う

あと、ラムダ式をごちゃごちゃ弄る場合は式木使った方がいいと思う
MSDNのどこかに載ってるExpressionVisitor使えばいろいろ出来る

302:デフォルトの名無しさん
08/05/20 02:15:36
intはいつから参照型になったんだ

303:デフォルトの名無しさん
08/05/20 03:25:22
>>300
それも試してはいるのですが結果は一緒でした。
マニュアルには複数選択のListViewの場合は削除と追加の時に呼ばれるとありますが、
これはMultiSelect=falseの設定でも同じ仕様で動いていました。
何か設定が足りないのでしょうか?

 (アイテム選択状態)
⇒別のアイテムを選択する
⇒ListView.SelectedIndexChangedが呼ばれる(選択要素数を確認すると要素数0)
⇒ListView.SelectedIndexChangedが呼ばれる(選択要素数を確認すると要素数1)

SelectedItemsだけでなく、SelectedIndicesの内容も同様です。

304:デフォルトの名無しさん
08/05/20 03:43:33
選択解除するタイミングはもっと限定できるんじゃないの
そのタイミングでだけ消せば

305:デフォルトの名無しさん
08/05/20 08:46:40
>>303
何も選択してないときの処理を別コントロールにフォーカスが移ったらって条件にすれば?

306:デフォルトの名無しさん
08/05/20 09:09:56
PictureBoxかPanelのようなコントロールをウィンドウ上に貼り付ける場合、
一画面でどれくらいの個数までが実用的な範囲なのでしょうか?
イベントをとりたいのでマーカーとして貼り付けたいのですが、
個数が多いとパフォーマンスが落ちそうで…



307:デフォルトの名無しさん
08/05/20 09:51:26
>>306
で、君の環境で試したらいくつでパフォーマンスが落ちたんだい?

308:デフォルトの名無しさん
08/05/20 11:06:46
Windowsアプリケーションから
非同期で、サービスプログラムの状態を知りたいんだけど、

1.別スレッドで周期的にサービスプログラムの状態を監視し、表示する。

以外に何かよい方法ありませんか?


309:デフォルトの名無しさん
08/05/20 11:23:04
そのサービスは既存のもの?

310:308
08/05/20 11:54:44
>>309
新しく作成したサービスプログラムなんですが、中身の仕様は変更できません。

311:デフォルトの名無しさん
08/05/20 13:51:11
Panelの上にいくつかのボタン等をおいて、
そのPanelの上に同じようにPanelを重ねていって場面ごとに最前面にしたいんだけど、
Panelの大きさって全く同じじゃないとだめなのね。
大きさが違うとPanelの中のPanelって事になっちゃうみたい。
それとBringToFrontで最前面にするよりVisibleですかそうですか。

312:デフォルトの名無しさん
08/05/20 13:59:09
よく分からんが、それはTabControlで済ませることができない操作なのか?

313:デフォルトの名無しさん
08/05/20 14:03:50
>>310
相手が固定ならそれないりの方法あると思うけど、
それが何かは場合によるから、普通にポーリングでいいんじゃないかな。
サービスへの通知みたいに取れることを期待している?

314:デフォルトの名無しさん
08/05/20 14:28:44
>>311
試してないけど、ツリーで位置を確認して移動すれば解決する事じゃないの?

315:314
08/05/20 14:31:16
>>311
いやわかった。
最前面に置いたPanelが小さいと、下のPanelが見えるって事なのかな
だから最前面以外のVisibleをfalseにしなきゃいけないんだなっていうことを言いたいのかな
だとすればそれは当然。

316:デフォルトの名無しさん
08/05/21 13:58:12
>>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()で最前面にしようとしてもダメでした。

317:デフォルトの名無しさん
08/05/21 15:58:37
>>316
それこそ>>314で直るはずだろ
今VS起動できないから具体的になんて名前のウインドウだったか忘れたけど
ツリー表示でPanel2がPanel1の子になってるはずだからD&Dして兄弟にしてやればいい

318:デフォルトの名無しさん
08/05/21 16:45:12
>>317
そんなツリーがあるんだ!?
従属関係を指定できれば解決する簡単な問題だったので疑問でした。
探してみます!

319:デフォルトの名無しさん
08/05/21 16:57:26
ドキュメントアウトライン ビューだ!

320:デフォルトの名無しさん
08/05/21 17:11:00
>>319
今ちょうど検索してて見つからなくて困ってたんだけどありがとう!!!
あった!

321:デフォルトの名無しさん
08/05/21 17:23:16
ただ確認できるだけで従属の変更は出来ないのね。
>>317のように親子を兄弟にすると位置自体も変わってしまう。
まあでも確認できるだけでもかなり便利になりました。

322:デフォルトの名無しさん
08/05/21 18:33:33
コントロールの親子あるいは包含関係なら変更できるけど?

そもそも、間違ってPanel2をPanel1に入れてる時点で自分に非があるのに
あたかも処理系やIDEが悪いかのような論調で書かれも困る

結論としては、デザイン時にコンテナを意識してないお前が悪い
てか、コンテナ意識しないとAnchorやDock使えんだろ

323:デフォルトの名無しさん
08/05/21 19:15:49
↑なに言ってるの?w

324:デフォルトの名無しさん
08/05/21 19:22:47
結論としては(キリッ

って事だろ。
何の役にも立たないレス。

325:デフォルトの名無しさん
08/05/21 22:12:34
>>322の言っている意味が分からないような馬鹿が偉そうに書き込まないほうがいいぞ。
どう考えても
>親子を兄弟にすると位置自体も変わってしまう。
という頭の悪い考えに対する返答だろ。

コントロールの位置座標というのはコンテナに対する相対座標なんだから、
親コンテナが変われば当然Form上における絶対座標は変わるに決まってる。
そんなことも理解できない馬鹿はおとなしくWPFアプリケーションで視覚的に
階層構造を指定できるものを使っておけということ。

フォームデザイナに頼りっぱだからそうなる。
コード上で親コンテナ.Controls.Add()で追加していけば思うような構成にするのは極めて容易い

326:デフォルトの名無しさん
08/05/22 00:40:50
コントロールの親子あるいは包含関係はどうやって変更するんですか?

327:デフォルトの名無しさん
08/05/22 01:03:26
Controls.Addすれば子になるんだろ
Controls.Removeしてから別のコントロールにAddすればいいんじゃないか

328:デフォルトの名無しさん
08/05/22 01:11:25
変更前親コンテナ.Controls.Remove(子);
変更後親コンテナ.Controls.Add(子);



329:デフォルトの名無しさん
08/05/22 01:17:28
とういうことはPanel1に重ねてPanel2を配置して、
Panel2はFormの子にしたい場合はコードからしか設定できないってことでしょうか??

330:デフォルトの名無しさん
08/05/22 01:32:28
タブコントロールで、タブ部分だけ消したほうが早そうな

331:デフォルトの名無しさん
08/05/22 01:33:19
Panel2をFormに追加してから、サイズ変更でPanel1の内側に持ってけ。

332:デフォルトの名無しさん
08/05/22 01:35:01
>>329
というよりも、最初にPanelを同一の親コンテナの中に重ねて配置したいという時点で、
デザイナで作成するのではなく、最初からコード上でNew Panel()して
それをControlsに追加していくようにすべき。
デザイナ上でそれやろうとすると、親切にもDesigner.cs上のコードは
最前面にあるコンテナ内にコントロールを配置しようとしてくれちゃうから希望通りにならない。

ためしにpanel1とpanel2をForm上に重ねるように配置して、
片方のBackColorをBlackにして、Button1のClickイベントで交互にBringToFrontするように
してみたが、問題なく入れ替わったぞ。お前のやりたいことはまさしくこれのことだと思うが。



333:デフォルトの名無しさん
08/05/22 01:35:39
Windowsアプリケーションで、常に一つのフォームしか表示させなくて、色んなフォームにページ展開する時ってどのように実装しますか?
シングルトンで実装するのが普通なんでしょうか?
それとも1度開いたらHide()で見えなくするだけ?
よろしくお願いします。

334:332
08/05/22 01:37:13
>>331
そりゃ盲点だったわ。
ためしにやってみたらそれでも大丈夫っぽいね

335:デフォルトの名無しさん
08/05/22 01:37:38
タブコントロールのAppearanceをFlatButtons、ItemSizeを0,1、SizeModeをFixedにすれば、あら不思議

336:デフォルトの名無しさん
08/05/22 01:43:58
>>330
そんなこと出来るんですかー。

>>331
ドキュメントアウトライン見ながら方向キーで調節したり、
Locateを手打ちしたりして注意しながら配置すれば出来るんですけど、
マウス操作だと親子関係が、ドキュメントアウトラインで親子関係を変えると位置が、それぞれ変わっちゃいますね。
特に後者の挙動は意味不明ですw
せっかくのGUIデザイナなのに感覚的に操作出来ないのは面倒ですね。。

337:デフォルトの名無しさん
08/05/22 01:50:42
>>336
どうしてもデザイナにこだわるならExpressionBlend使ってWPFアプリ作れっての。
あれだとお前のやりたいことが全部感覚的にできるぞ。

あと、

>特に後者の挙動は意味不明ですw
>>325を百回読め。コンテナが変われば位置が変わるってことが理解できない頭なら
プログラミングなんて向いてないからやめておけ。

338:デフォルトの名無しさん
08/05/22 01:51:51
>>332
最前面にあるコンテナの子にしてくれるのは感覚的にも動作的に問題ないけど
ドキュメントアウトラインで親子関係解消すると位置が変わっちゃうのは意味不明だけどね。
他の操作でその位置に出来るのになぜ変わるのかと。

>>335
あら不思議!
ありがとー。

339:デフォルトの名無しさん
08/05/22 01:56:38
>>337
親コンテナが変われば相対座標が変わるって言いたいんだろうけど
それは問題になってないんですぅ。
GUIで親子関係を解消したら新親の座標に変換してくれたほうが直感的です。
しかもマウス操作したら旧親の子になってしまう座標ならなおさらです。

340:デフォルトの名無しさん
08/05/22 12:38:53
>>339
何を言ってるんだか意味不明な気がする。

341:337
08/05/22 13:59:41
>>339
いや、まあもう何も言わんからおとなしくWPFで作ったら?
君の言うGUIデザイナを使って「直感的」に作成できるからさ。
ツールに文句つけるわりには、それを解消したツールがあってもそっちを使おうとしないんだねぇ。
WPFとかXAMLの勉強するのは嫌だけどWPF&XAMLの機能を求めているわけだ。
だだをこねている子供にしか見えん。

342:デフォルトの名無しさん
08/05/22 15:05:59
よく論点が違うって言われない?

343:デフォルトの名無しさん
08/05/22 15:25:58
言われない

344:デフォルトの名無しさん
08/05/22 15:27:59
聞く耳持たねえ

345:デフォルトの名無しさん
08/05/22 15:28:40
WPFが直感的だと!?

346:デフォルトの名無しさん
08/05/22 15:33:20
うん

347:デフォルトの名無しさん
08/05/22 16:05:45
WPFはスレ違いだしもう何も言わなくていいですー

348:デフォルトの名無しさん
08/05/22 18:38:28
337みたいな質問者の求めてる回答をしない香具師はただの荒しでしかないから^^

349:デフォルトの名無しさん
08/05/22 18:41:12
348みたいな質問者の求めてる回答をしない香具師はただの荒しでしかないから^^


350:デフォルトの名無しさん
08/05/22 19:41:28
どうでもいいけど関係ない話するな

351:デフォルトの名無しさん
08/05/23 02:41:06
349みたいな質問者の求めてる回答をしない香具師はただの荒しでしかないから^^

352:デフォルトの名無しさん
08/05/23 02:47:33
351みたいな質問者の求めてる回答をしない香具師はただの荒しでしかないから^^

353:デフォルトの名無しさん
08/05/23 07:08:57
WPFがスレ違いならFormの話もスレ違いだろう

354:デフォルトの名無しさん
08/05/23 07:12:31
Expression高いしVSのWPFエディタはうんこだし
WPFは爆死の臭いしかしない

355:デフォルトの名無しさん
08/05/23 08:49:13
C#でDataGridViewから派生したクラスを使いたいんですけど
Form1.cs[デザイン]を開いて
そこにDataGridViewを張り付けて
そのあとに
Form1.Designer.cs

System.Windows.Forms.DataGridView

MyNameSpace.MyDataGridView
に書き換えるとかそういうことをするんですか?
そんなはず無いと思うので正しいやりかたを教えてください。

356:デフォルトの名無しさん
08/05/23 08:52:30
派生させたクラスがツールボックスに出てるだろう。

357:デフォルトの名無しさん
08/05/23 09:01:20
>>356
出てますね...
ありがとうございます。


358:デフォルトの名無しさん
08/05/23 13:55:25
すみません、初心者的で申し訳ないのですが、質問させてください。
以下のコードを実行すると、クラス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
08/05/23 13:56:15
こんにちは。

はじめましてRayです。
私は大学4年生ですが、最近は大学は週に一回くらいしか行かないのですが、

就活の準備など、家にいることが多くなりました。

しかし、斜め向かいに住んでいる茨城という若い夫婦が嫌がらせをしてきます。

①近所をうろ②したり、家の窓から私の部屋を覗いてきて、部屋に「○○の本がある」などと近所のほかのオバサンに報告したり、

②布団たたきでものすごい音で布団をいつまでもたたきます。
(体格がいいオバサンなので、すごい音がします;;)

③私が家にいるのを知っていて近所のオバサンと大きな声で悪口を言ってきます
(「Rayが就職なんかできるわけないじゃない!」など・・)

④茨城(夫)は部屋を覗くだけでなく、夜になると咳払いなどをしていつまでも近所をうろついています。

気持ち悪いので、弁護士や市の職員に相談しましたが、なか②証拠が取れなく、裁判まで持ち込めない状況です。

⑤車のエンジンをいつまでもかけ、うるさくする。

とにかく精神的にも滅入っていて、解決したいのですが、できない状況です。

ほかの近所のオバサンも私が困っているのを見て喜んでいるみたいです。

なんとかしたいので、誰か相談にのってくださぃ。

アドバイス待ってます。


360:358のつづき
08/05/23 13:56:37
amespace NAME1 {
 class A {
// メンバ
private x; ← ここで警告が出る
// メソッド
public void func_A( temp ) { x... }; ← ここでx=0として計算してしまう
// アクセッサ
public X { get; set; }
}}

361:358のつづき
08/05/23 13:57:37
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 );
  }
}}}

362:デフォルトの名無しさん
08/05/23 13:58:59
>>360 xの型もXの型もgetアクセサの中身もsetアクセサの中身も書け

363:358
08/05/23 14:16:40
private double x;
public double X { get; set; }
です。アクセッサの表記は、.NETのver2かver3でこのように書けるので、それを利用してます。

364:デフォルトの名無しさん
08/05/23 14:27:19
ヘルプなりで「自動実装するプロパティ」調べれ
どうして X が x を知ってる?

365:358
08/05/23 14:49:06
ヘルプを読んだ結果、
>自動実装したプロパティでは、属性は使用できません。
>プロパティのバッキング フィールドで属性を使用する必要がある場合は、通常のプロパティを作成します
に関連がありそうだとは思うのですが、意味がよくわかりません・・・。

366:デフォルトの名無しさん
08/05/23 14:56:54
X プロパティは x に対応しないよ。



367:デフォルトの名無しさん
08/05/23 14:58:31
それだと、
private double _X;
みたいなのが内部で自動生成されて
public double X {
get { return _X; }
set { _X = value; }
}

368:358
08/05/23 15:03:32
つまり、
class{
 double x;
 double X{get;set;}
}
と書くのは誤りで、
class{
 double x{get;set;}
}
と書けばよいということですか?

369:デフォルトの名無しさん
08/05/23 15:37:57
ファイルの読み書き単位でエンコーディングを指定するのではなく、
プログラム全体でエンコーディングをしているする方法はないですか?

370:デフォルトの名無しさん
08/05/23 15:46:03
>>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ではないけどね。

371:デフォルトの名無しさん
08/05/23 15:59:52
>>369
CreateStreamReaderAsShiftJIS/CreateStreamWriterUTF8メソッドでも用意しとけば?

372:デフォルトの名無しさん
08/05/23 17:04:01
初心者ですが質問させてください。

Webbrowserコンポーネント(Webbrowser1)でgoogleを表示しておいて、
ソフトのTextBox(TextBox1)に検索ワードを入力して、Button(Button1)を押したら、
Webbrowser側に検索ワードが読み込まれて自動で検索するようにしたいんですが、
どのようにすればいいか検討がつきません。

開発環境はVisualstudio2005、言語はC#です。

373:デフォルトの名無しさん
08/05/23 17:07:41
コンポーネントでの表示が必要なの?
httpで通信するってんじゃだめかい?

374:デフォルトの名無しさん
08/05/23 17:10:13
>>372
事前にgoogleを表示しとく意味があるのか?
取り敢えず適当にgoogleで検索して検索結果画面のURL調べれ
あとSystem.Web.HttpUtilityのUrlEncodeとUrlDecode調べれ

375:デフォルトの名無しさん
08/05/23 17:11:44
>>373

webにいろいろと自動入力するシステムを作らないといけなくなりまして。
たとえばブログにあらかじめTextboxに入れておいたIDとパスを入れて自動ログインするとか
そういったものなんですけど、webのフォームに、Textboxから値を入れる方法が知りたくて、
Googleはそのたとえのつもりでした。
http通信?の意味がよくわからないんですが、ソフト内のブラウザ上で表示させる必要はあります。


376:デフォルトの名無しさん
08/05/23 17:13:21
>>374
Googleっていうたとえが悪かったですね。ごめんなさい。
>>375で書いたように、Webサイト上のフォームにソフトのTextBoxで記載したワードを記入するのが目的です。

377:デフォルトの名無しさん
08/05/23 17:27:16
WebRequest を使って WebResponse を取得し、
その内容を反映させては。

378:デフォルトの名無しさん
08/05/23 17:30:01
素直にHTTP POSTしろよ低脳。
こんなの厨房でも出来るぞ

379:デフォルトの名無しさん
08/05/23 17:39:43
>>377
どのメソッドを使えばいいかわからなかったので、ググってみたらできそうです、ありがとうございます。

>>378
HTTP POSTで検索したらそれらしいのがでてきました。ありがとうございます。

380:デフォルトの名無しさん
08/05/23 17:40:12
おい小学生かもしれねえだろうが

381:デフォルトの名無しさん
08/05/23 17:41:46
>>368
おそらくやりたいことは

public double X { get; private set; }

これだけでいいと思われる。

これでXのセッターはprivateになる。

382:デフォルトの名無しさん
08/05/23 17:43:52
>>380
そのとおりです小学校3年生です。
バカな質問してすいませんでした。

383:デフォルトの名無しさん
08/05/23 17:46:22
>>380
小学生に失礼だ

384:デフォルトの名無しさん
08/05/23 17:48:58
>>381
自動プロパティのセッタゲッタの片方だけのプロテクションを帰ることは出来ないよ。

385:デフォルトの名無しさん
08/05/23 17:52:20
>>384
いきなりどうしたの?
俺ができてるからそう書き込んでるんだけど。



386:デフォルトの名無しさん
08/05/23 17:54:35
俺もプロパティはほとんど

public Foo Foo{ get; private set; }

だな
普通のプロパティなんてかったるくて書いてられん

387:デフォルトの名無しさん
08/05/23 17:55:26
>>384
知ったか?
それとも何か他に深い意味があるの?

388:358
08/05/23 18:08:21
うまく書けるようになりました。
ありがとうございました。

389:デフォルトの名無しさん
08/05/23 18:15:11
>>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によるワンタイムキーの生成とかが必要になると、そのへんは
ブラウザに任せた方がはるかに簡単。

390:デフォルトの名無しさん
08/05/23 18:34:21
便乗だけどオンラインゲームの自動ログインはどうやればいいの?
URLリンク(dobon.net)
ここを参考にしたけどだめみたいなんだ。
たとえば
URLリンク(suddenattack.redbanana.jp)
ここに自動ログインするためにはどうしたらいいのかな?

391:デフォルトの名無しさん
08/05/23 19:21:51
>>389さん、ありがとうございます!
検索してもわからず、困っていたところでした。
("q")と("f")のところにhtmlからそのフォームのnameをもってきたらいいということですか?
やってみます!またできたら報告しますね。

392:デフォルトの名無しさん
08/05/23 19:28:24
Hashtableから値取り出すときにキャストしないでいい方法はない?
面倒くさいんですけどん。

393:デフォルトの名無しさん
08/05/23 19:29:59
VS2005以降ならDictionaryを使う

394:デフォルトの名無しさん
08/05/23 19:31:53
>>393
サンクスです。
こんなのがあったんですね。

395:デフォルトの名無しさん
08/05/23 19:43:16
GenericはC#2.0の最大の目玉じゃないか…

396:デフォルトの名無しさん
08/05/23 20:38:55
>>390
やろうと思えばできる。
IDとパスのINPUTタグのIDを調べ>>389のようにIDとパスを入力し、
こいつらを管轄するフォームでsubmitする。

ヒント:javascriptを実行してからsubmitを行う。

397:デフォルトの名無しさん
08/05/23 20:52:21
windowsアプリなんですが、メインのフォーム内のメソッドで
そのフォームがもってるある型の変数全部の値を一括で変更
する方法はありますか?

おねがいします。

398:デフォルトの名無しさん
08/05/23 20:56:16
リフレクションを使います

399:デフォルトの名無しさん
08/05/23 20:58:34
>>396
javascriptは全然わからないから詰まってます。
submit()を実行すると無限に更新されるみたいなのですが・・・。
htmlソースみるとLoginLeftFormCheck()を呼び出してるみたいなのですが関係ないですかね。

400:390
08/05/23 21:04:58
意味も分からずコピペなんですけど、
public Form1()
{
InitializeComponent();
webBrowser1.Url = new Uri("URLリンク(suddenattack.redbanana.jp)");
}
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");
}
こんな感じでフォームに文字が入りました。
あとはログインボタン押して、ゲームスタートボタン押すだけなんですが・・・

401:デフォルトの名無しさん
08/05/23 21:05:33
>>396
いやそいつを実行するの。

402:デフォルトの名無しさん
08/05/23 21:06:25
>>400
ログインボタン、エンターキーおしたらいけないの?

403:デフォルトの名無しさん
08/05/23 21:06:26
>>399
JavaScriptもわからないようならC#とか無理だから諦めろ。
なでしこでもやってろ

404:デフォルトの名無しさん
08/05/23 21:06:59
安価ミス
>>396>>399

405:390
08/05/23 21:11:35
>>401
実行するってことはInvokeMember("LoginLeftFormCheck")ってことですかね?

>>402
フォーム上ならエンターキーでもログインできます。

406:401
08/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でマウスを操作するプログラムを書くという
逃げ道でやった。

407:デフォルトの名無しさん
08/05/23 21:52:19
Windowsアプリケーション学習用にC#をやろうと思っています。
Microsoft Visual C# 2008 Express EditionをSDKとSQL Serverつきでインストールしました。
しかし何をどう作っていったらいいかわかりません。
プログラム経験はPHPでWebプログラム(こちらは趣味で3年以上やっていて2ch風掲示板ぐらいのものは作れます)、
あとオブジェクト指向の勉強にJavaを少しいじった程度です。
Javaでは簡単なファイル操作から、オブジェクトの継承や例外処理など基本的な勉強しかしていません。
Webプログラムはイメージ的にわかるので、ASP.NETあたりはなんとか理解できると思うのですが、
Windowsアプリケーションとなると右も左もわかりません。
まずは何をやったらいいのでしょうか?

408:デフォルトの名無しさん
08/05/23 21:54:25
何をやりたいの?

409:デフォルトの名無しさん
08/05/23 21:55:56
>>407
スレチこっちで質問しなおせ
スレリンク(tech板)
スレリンク(tech板)

410:407
08/05/23 22:04:58
>>408
とりあえずWebアプリケーションでいうチャットやカウンターのような位置づけなものを作ってみたいです。
(ようするに簡単なものです)
おそらくメモ帳のようなものになるのでしょうか?
ペイントのようなものも作ってみたいですが、メモ帳に比べると難易度はあがりそうですね。
簡単なテーブルゲームなんかも作ってみたいですが、アルゴリズムの勉強はしてないので少し厳しそうです。

>>409
了解です。そちらで質問しなおします。

411:390
08/05/23 22:15:45
>>406
どうもありがとうございます。
webBrowser1.Url = new Uri("javascript:" + Uri.EscapeDataString("LoginLeftFormCheck();"));
で無理やり実行してみたらfalseが返ってきちゃいました。
マウス操作も考えたんですけど、ブラウザやマウスが勝手に動く様が見えちゃいますよね。。

412:397
08/05/23 22:32:25
すいません。リフレクションを使っても取り出せるのは
型情報でインタンスの値は取り出せないのではないでしょうか?

もう少しキーワード教えてください。

413:デフォルトの名無しさん
08/05/23 22:43:15
型情報からフィールド一覧取れるだろ
FieldInfoから値取得できる

414:401
08/05/23 22:51:20
>>406
いや、LoginLeftFormCheckは単に実行するだけでOK。
submitすりゃ、ログインされる。
javascriptは多分InvokeScriptでできない?

マウスは勝手に動くようにみえちゃう。これは仕方ない。

415:デフォルトの名無しさん
08/05/23 23:23:57
>>411
>>409

416:デフォルトの名無しさん
08/05/23 23:34:10
ここはなにを話すスレ?

417:デフォルトの名無しさん
08/05/23 23:36:31
C#プログラマの雑談スレ


418:デフォルトの名無しさん
08/05/23 23:44:16
>>1
>(#゚ー゚)つ < C#、.NETの話題はこちらでどうぞ。

C#プログラマの雑談スレなんて限定的には書いてないけど?
しかもスレタイは「相談室」だぞ

419:397
08/05/23 23:44:32
FieldInfoのGetValue,SetValueでできました。
ありがとうございます。

420:デフォルトの名無しさん
08/05/23 23:55:28
JRq8rZjk7c

鳥解析4649

421:デフォルトの名無しさん
08/05/24 00:04:49
私怨乙

422:390
08/05/24 01:09:12
>>414
ありがとうございました。
ゲームスタートのFlashもjavascriptを呼んでいましたので直接呼んだら開始できました!

423:デフォルトの名無しさん
08/05/24 01:53:52
>>416
C#、.NET(ただし、C#を使っている前提)に関することで、
主にふらっとだとアレな話題や雑談とかのスレ
と、俺は解釈してる

ここで質問すること自体は悪いとは思わないが、
ふらっとの方がより適切だとも思ってる

424:デフォルトの名無しさん
08/05/24 04:07:26
ふらっとは初心者用だから。
回答者も初心者スレにいなかったら結局このスレに質問しに来るのでは?
たらい回しはいかんよ。

425:デフォルトの名無しさん
08/05/24 04:09:08
俺はふらっとが初心者用でこっちが中級者の集まりだと思っていた。
こっちでの質問はOOPとか言語仕様なりの高度な質問になる感じ

426:デフォルトの名無しさん
08/05/24 04:11:33
>>425
元の趣旨はそうだが実情は逆


427:デフォルトの名無しさん
08/05/24 04:44:53
そんなの主観的なんだからどっちだっていいだろ。
質問者が初心者と自覚した場合ふらっとに行けばいいと思うよ。
ただそれだけ。

428:デフォルトの名無しさん
08/05/24 04:57:34
複数あるのは害でしかない
みんなわかってるはずだ

429:デフォルトの名無しさん
08/05/24 05:05:02
>>424
心配無用。
どうせ皆も両方見てるんでしょ。


430:デフォルトの名無しさん
08/05/24 05:42:36
どっちか削るとしたら明らかに初心者用だよな。
で、もし削ったとしたら初心者隔離スレも欲しくなるよな。
ここまで言えばわかるよな。

431:デフォルトの名無しさん
08/05/24 10:55:50
ぬるぽ

432:デフォルトの名無しさん
08/05/24 12:40:47
>そんなの主観的なんだからどっちだっていいだろ。
>質問者が初心者と自覚した場合ふらっとに行けばいいと思うよ。

えてしてその主観が間違ってるから問題になるんだが。


433:デフォルトの名無しさん
08/05/24 15:28:08
オレが全部答えてやんよ
だからもう喧嘩するな

434:デフォルトの名無しさん
08/05/24 17:44:12
整数5ずつにしたいのですが……うまく言えないのですが、例えば、
96なら95、98なら100、53なら55、42なら40
と言うふうにしたいのですが、どうすればいいでしょうか?

435:デフォルトの名無しさん
08/05/24 17:46:22
C#で自作した外部アプリケーションを呼び出したいのですが、
Process process = new Process() ;
process.StartInfo.FileName = "hoge.exe" ;
process.Start() ;
こんな風に実行することが出来るようなのですが、
外部アプリケーション側に文字列を複数与えたいのです。
その場合呼び出す側と呼び出される側はどのような準備をすればいいのでしょうか?

436:デフォルトの名無しさん
08/05/24 17:49:25
>>434
問題を定義しなおしてから来い。
>>435
Process.Start(hoge.exe,"arbitrary string");

437:デフォルトの名無しさん
08/05/24 17:52:06
俺は>>434の言いたい事がわかったが次にどう書いてくるか楽しみなので伏せておく。

438:デフォルトの名無しさん
08/05/24 17:53:32
>>434
int number;

number = 適当な数値;

if (number % 10 < 4) number = number - (number % 10);
else number = number + 10 - (number % 10);

適当に今思いついたがこんなんで良いか?

439:デフォルトの名無しさん
08/05/24 17:58:08
あ、5ずつか普通に四捨五入してるわこれ

440:435
08/05/24 18:00:09
>>436
文字列を複数渡したいのですが
Process.Startの第二引数はstring[]でもいいのですか?

それと受け取る側はどうすればいいのでしょう?

441:デフォルトの名無しさん
08/05/24 18:01:03
>>438
ありがとうございます。
さっそく導入してみたのですが、これだとただの10ずつになってしまうのですが……。

っと書いていたら439の返事がきました。
ありがとうございます。
こういうのも四捨五入というのですか……。
勉強になりました。

442:デフォルトの名無しさん
08/05/24 18:02:00
>>440
無理。記号を決めてそれを受け取る側で改行と見なすくらいしかない

443:デフォルトの名無しさん
08/05/24 18:02:40
>>438の使って
if (number % 10 < 5) number = number - (number % 10)+5;
else number = number + 10 - (number % 10);
でいいんじゃね?

444:デフォルトの名無しさん
08/05/24 18:02:43
あ、ちょっといじったらできました。
もうちょっとテストして、また報告させていただきます。
本当にありがとうございました。

445:デフォルトの名無しさん
08/05/24 18:04:33
連投失礼します。
>>443
ありがとうございます。
それでいけそうです。
これまたもう少しテストしてきます。

446:デフォルトの名無しさん
08/05/24 18:06:56
こうでしょ。
int mod = x % 5;
x += mod > 2 ? 5 - mod : -mod;


447:デフォルトの名無しさん
08/05/24 18:08:21
>>442
string一つだけなのですか。

受け取る側はどうすればいいですか?
受け取る側はコンソールではなくフォームアプリケーションです。

448:デフォルトの名無しさん
08/05/24 18:17:35
>>447
スペース区切りとかで渡して、
splitで分割するなりすればいいんじゃね?

449:デフォルトの名無しさん
08/05/24 18:19:37
>>446
ありがとうございます。
>>443さんの方法だと、きりのいい数字だとちょっとおかしくなるようでした。
446さんの方法は私程度にはどういう処理をしているのかさっぱりなのですが、
問題なく使えます。

みなさん本当にありがとうございました。

450:435
08/05/24 18:30:42
Environment.CommandLineで受け取るか、
コンソールと変わらずにエントリポイントから受け取ればいいんですね。


451:デフォルトの名無しさん
08/05/24 18:40:20
>>431
AutoNullpoOudaki gattu = new AutoNullpoOudaki();
gattu.Execute();

452:デフォルトの名無しさん
08/05/24 19:11:50
文字列から動的にExpressionTreeやFuncを得ることって出きるん?
URLリンク(ufcpp.net)
ここで書いてあるような子としてみたかったんだが、CodeDom.GetExpressionFromとか見あたらず、いろいろググってもそれらしいのにたどり着けず・・・
CodeDomでFuncを返すメソッドを持つクラスをコンパイルして実行して呼び出せば出来無くないんだけれどもう少しまともな方法で・・・


453:デフォルトの名無しさん
08/05/24 19:31:07
>>452
そのページにある「ソース一式」のところからソース落して、
中身の「MyMath\CodeDom.cs」の中にその GetExpressionFrom の実体がある。

454:デフォルトの名無しさん
08/05/24 19:32:55
ちなみに、そのソースの GetExpressionFrom はまさに、その
「CodeDomでFuncを返すメソッドを持つクラスをコンパイルして実行して呼び出せば」
をやってるだけ。

もう少しまともな方法、確かに欲しいよね。

455:デフォルトの名無しさん
08/05/24 19:47:03
>>453
さんくすこ。
てっきり.NET3.5以降で追加されたのかと思ってた・・・orz

CocoaのようなKVCとかやるためにリフレクションからコード生成→lambdaにしてそれなりに高速にアクセスみたいなことしたかったんだが・・・
場合によって、無理やりコンパイルでlambda変換するようにしようかな・・・
あぁ書いてて思ったが、式ツリー手動でいじくればいいのか。よくわからんがやってみるノシ

456:デフォルトの名無しさん
08/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のままのようで、ファイルを読み込んでいないようです。
埋め込み方が間違ってるんでしょうか・・・。
よろしくお願いします(´・ω・`)

457:デフォルトの名無しさん
08/05/24 20:26:10
>>456

SoundPlayer player = new SoundPlayer("path");
player.PlaySync();



458:デフォルトの名無しさん
08/05/24 20:37:51
メッセージとしてスウェーデン語文字を表示させたいのですが、
なぜか読み込んでくれずにエラーが起きてしまいます
どうしたらよいのでしょうか

459:456
08/05/24 20:42:51
>>457
ありがとうございます。実際にwavファイル置いてパス指定して音を鳴らすことは問題なくできるんですが、
埋め込めたら良いなぁ・・・ってことなんです。
もしかして、埋め込みは無理ってことですか?

460:デフォルトの名無しさん
08/05/24 20:42:50
>>452
これがクエリ式のパーサ持ってたと思う。使い回せるかも。
URLリンク(www.codeplex.com)

使い方は"poorman's linq"でぐぐる。

461:デフォルトの名無しさん
08/05/24 20:45:46
>>458
取りあえずエラーとやらに付随してるメッセージを読み上げるといいよ

462:デフォルトの名無しさん
08/05/24 20:46:10
>>458
OSにスウェーデン語パックを導入しる

463:デフォルトの名無しさん
08/05/24 20:48:49
>>462
今からググってきます。ありがとうございました

464:デフォルトの名無しさん
08/05/24 22:09:12
レベルの低い質問で申し訳ありません。
出力の種類を「クラスライブラリ」としてあるプロジェクトを、スタートアッププロジェクトに設定した他のプロジェクトに参照させるにはどうすればよいのでしょうか。
そのままusingしようとしても「名前空間がない」と言われてしまいます。

465:デフォルトの名無しさん
08/05/24 22:12:54
>>464
ソリューションエクスプローラで参照したいプロジェクトを右クリックして
参照の追加 → プロジェクト

466:デフォルトの名無しさん
08/05/24 22:16:17
>>434
今更だけど、要は「5の倍数への丸め」、もしくは「丸め幅5での丸め」でしょ?
個人的には汎用的なこれを使いたいところ

var y = (int)Math.Round((decimal)x / n) * n;

まあ、整数型に限定してもこんなところじゃないか

var y = (x + (n / 2)) / n * n;

因みに、後者はaway from zeroだが、前者はRound()のmode指定で選択可
対象が整数値で、かつ丸め幅が奇数ならどちらでも同じ

467:デフォルトの名無しさん
08/05/24 22:37:56
>>465
ありがとうございます。

468:デフォルトの名無しさん
08/05/24 22:54:56
>>456
もしかしたら、Compact Frameworkじゃ違うかもしれないけど
多分、その方法はファイルをresxに埋め込まない古いやり方。

wavファイルをプロジェクトに追加して
ビルドアクションを「埋め込まれたリソース」にすれば、
その方法で鳴る筈。

んで、2005以降は、リソースエディタを使ってresxに埋め込んで、
"HI"がリソース名になったとしたら、

System.IO.Stream s = Properties.Resources.HI;
SoundPlayer player = new SoundPlayer(s);
player.Play();

で一応鳴る。

でも、ストリームのWAVEデーターの再生は、
GC絡みで問題があるらしい。
詳しくはこれを。

URLリンク(dobon.net)

469:デフォルトの名無しさん
08/05/24 23:05:15
ブロック崩しを作ったのですが、ボールが宙に浮いているときにスペースキーを押すと、
ボールが画面外に飛び出してしまうのです。どうにかなりませんか?
ちなみにソースはこれ

URLリンク(www.borujoa.org)

470:デフォルトの名無しさん
08/05/24 23:24:40
ソースを解析したうえでデバッグしてくれと。

471:デフォルトの名無しさん
08/05/24 23:27:03
>>469
ソース見て吹いたw

472:デフォルトの名無しさん
08/05/24 23:31:36
>>469
こういうifの書き方好きなの?


473:デフォルトの名無しさん
08/05/24 23:31:59
ってそもそもスレ違いじゃん

474:デフォルトの名無しさん
08/05/24 23:32:51
何でもう消えてるんだよ。ちょっと見てみたかった

475:デフォルトの名無しさん
08/05/24 23:56:20
キャッシュ漁ったら見つけた


476:デフォルトの名無しさん
08/05/24 23:59:51
型に格納できる値の最大値、最小値を返す関数はありますか?
例えば、unsigned intなら0か4294967295を返せる、といったような。
変数の型の範囲を超えるような値が格納されそうになった場合、エラーを出すような関数を作ろうと思っているので。

477:デフォルトの名無しさん
08/05/25 00:03:33
MaxValue/MinValueじゃ足りんのか?

478:デフォルトの名無しさん
08/05/25 00:19:23
そんなの、泣けりゃじぶんで定義して返せよ

479:デフォルトの名無しさん
08/05/25 00:24:16
LL言語のWWW::Mechanize的なのを探してます。
C#や.NET Framework向けのwebスクレイピングライブラリはないですか?
検索してたのですが、なかなか見つからないや・・・

480:デフォルトの名無しさん
08/05/25 00:24:27
スレ違い

481:デフォルトの名無しさん
08/05/25 00:24:56
>>478
いやいや、476はMaxValue/MinValueを知った上でそういう関数が欲しいんじゃなくて、
ただ単に MaxValue/MinValueの存在を知らないだけじゃないかと。


482:デフォルトの名無しさん
08/05/25 00:27:41
関数はまあ見逃すとしてもunsigned intなんて言ってる時点でスレ違いである事に気付こうな


483:デフォルトの名無しさん
08/05/25 00:28:51
>>479
MS は文法のゆるい HTML を機械処理するのはあまり好きじゃないみたい。

HTML2XHTML みたいなものを通して文法の正しい XML にした上で、
XmlReader やら LINQ to XML でアクセスするのがいいかと。
↓でそういうことやってるんだけど、
URLリンク(d.hatena.ne.jp)
HTML2XHTML が微妙臭い。

484:デフォルトの名無しさん
08/05/25 00:29:53
>>482
しっかり読んでなかったw

それはちゃんと、「C# は C/C++ とは違いますよ」誘導してやろうよ。

485:デフォルトの名無しさん
08/05/25 00:52:32
>>477
ありがとうございます。
>>481
その通りです。低レベルすぎてすみません。
>>482
C#ではUInt32って書くんですね。ありがとうございます、勉強になりました。

486:デフォルトの名無しさん
08/05/25 01:45:22
>>483
クッキーとか面倒なところを良きにはからってくれるのはないっぽいですね。

LLと組み合わせるしかないか・・・
GUI楽したいので.NET使いたかったけど、うまくいくかなあ

とりあえうずありがとう。
いろいろ試してみます

487:デフォルトの名無しさん
08/05/25 07:57:54
2005のPropertyGridについて質問
プロパティタブをいくつか追加したりしてるんだが
ボタンに使われる画像の色が PropertyTab.Bitmap で retuen した Format32bppArgb の画像と微妙に違う
見た感じは大体同じなんだが、実際のRGBを調べるとほんの少しずれてたりする
何か色数の制限があるのなら、それに合わせた画像にするんだけど分かる人いる?

488:456
08/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
08/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()を使おうと思います。


490:デフォルトの名無しさん
08/05/25 11:27:09
質問です
ネットの初心者向けサイトを見ながらC#をやっていたんですがそろそろきつくなってきました
とくにデリゲートをイベントハンドラとして実装するところと、イテレータがよくわかりません
初心者から中級者にレベルアップするために買うべき本を教えてください

491:デフォルトの名無しさん
08/05/25 14:11:02
C#用のDXライブラリと言うものがあったので早速使ってみたのですが、エラーが出ました。

空のプロジェクトに参照をDLLを追加し、Class.csファイルを作り、メインメソッドに
DxLibrary.DxLib_Init();
と書いただけなのですが、
DLL 'DxLibDll.dll' を読み込めません: 指定されたモジュールが見つかりません。 (HRESULT からの例外: 0x8007007E)
と出てしまいます。

DLLはあらゆる場所に配置して試したのですが、
やはり同じようにエラーがでます。
何か特別な書き方が必要なのでしょうか?

492:デフォルトの名無しさん
08/05/25 14:17:45
DXライブラリの公式サイトで提供されてる方のC#用DXライブラリを使え
使い方も丁寧に書かれてる

493:デフォルトの名無しさん
08/05/25 14:19:29
>>492
ありがとうございます。

いつのまにか出てたのですか!?
なぜエラーが出たのかは未だ不明ですが、早速使ってみたいと思います。

494:デフォルトの名無しさん
08/05/26 15:17:26
質問です。
2つのスレッドでそれぞれフォームを作成し表示します。
このとき、これらフォームの表示順位(重なり)を
コントロールすることは可能でしょうか?

なんか、デバッカ上とSetup後のプログラムで表示順がことなって
メッセージボックスが隠れたりする・・

495:デフォルトの名無しさん
08/05/26 17:06:52
構造体の中で1次元配列メンバを持つには
struct A{
public fixed double b[123];
};
でいけますが、
構造体の中で2次元配列メンバを持たせるために
struct A{
public fixed double b[123][234];
};
などとやってもエラーになります。
構造体の中で2次元配列メンバを持たせることは可能でしょうか?

496:デフォルトの名無しさん
08/05/26 17:10:31
494です。自己レスします。
とりあえず以下HPを参考にし、隠れていたダイアログが表示されるようになりました。(暫定対応ですが・・)
URLリンク(www.atmarkit.co.jp)
端的に言うと、複数のアプリをダブルクリックしたときと同じで、
後から立ち上げた方が優先されて表示される。のと同じみたいです。

お騒がせしました。

497:デフォルトの名無しさん
08/05/26 17:17:20
>>495
fixedである以上は無理

498:デフォルトの名無しさん
08/05/26 18:17:56
質問です。
クラスの配列をインスタンス化するのにforを使って次のようにやってるんですが、
もしもっとスタンダードな方法があったら教えてください。
for文の中でインスタンス化すると、スコープから出ると消えちゃうような感覚がして気持ち悪いんです。

classA{}

A[] a = new A[n]
for(int i = 0; i < n; i++){
a[i] = new A();
}

499:デフォルトの名無しさん
08/05/26 18:20:50
狂っているその感覚を修正する事をお勧めします。


500:デフォルトの名無しさん
08/05/26 18:21:08
それで十分スタンダード

> for文の中でインスタンス化すると、スコープから出ると消えちゃうような感覚がして気持ち悪いんです。
この感覚を何とかしたほうがいい


501:デフォルトの名無しさん
08/05/26 18:23:51
もしかして
A[] a = new A[n] ← classA型の変数を宣言
a[i] = new A(); ← 実際に代入
つまり、for文の中では代入行為しかやってないから消えない、ということですか?

502:デフォルトの名無しさん
08/05/26 18:29:29
GCのアルゴリズムを理解した方がいいよ。

GCってのは「参照できる限りは消えない」

例えばnが1なら、forを抜けても a[0]を参照できるでしょ?
で、参照できるので消えない。

503:デフォルトの名無しさん
08/05/26 18:34:42
了解しました。勉強します。

504:デフォルトの名無しさん
08/05/26 19:18:27
というかスコープを勉強したほうがいいだろ

505:デフォルトの名無しさん
08/05/26 19:20:45
スコープは割と正しく理解出来てるような発言に見えるけど?

506:デフォルトの名無しさん
08/05/26 19:30:39
GCとは全く関係ないだろ。
スコープの話をしてると思うんだが。

507:デフォルトの名無しさん
08/05/26 20:26:57
コンストラクタでフィールドにインスタンスを代入したら不自然か

508:デフォルトの名無しさん
08/05/26 23:14:09
なんでGCが出てきたんだw


509:デフォルトの名無しさん
08/05/26 23:16:05
↑遅れてきたアホ


510:デフォルトの名無しさん
08/05/26 23:36:55
確かにマオは四川省だったから ヤバスwww

511:デフォルトの名無しさん
08/05/26 23:37:37
スマソ、誤爆った

512:デフォルトの名無しさん
08/05/26 23:41:06
newしたものはアクセスできるなら消えない

513:デフォルトの名無しさん
08/05/27 00:18:08
>>505
できてないできてない。

514:デフォルトの名無しさん
08/05/27 00:46:13
.NETのGCはスコープより早く働くことがあるから要注意なんだよね。たとえば
static void Main() {
 Hoge hoge = new Hoge();
  hoge.Foo();    // hogeが参照されるのはここが最後
  // 時間のかかる処理
}
hogeがまだスコープ内にあるにもかかわらず、時間のかかる処理の最中にGCされることがある。


515:デフォルトの名無しさん
08/05/27 00:50:36
↑あほ?wwwwww

516:デフォルトの名無しさん
08/05/27 00:53:20
そんなものに注意は不要


517:デフォルトの名無しさん
08/05/27 01:00:18
URLリンク(dobon.net)
ここの真ん中くらいの「補足:ニュースグループ・・・」あたりにその例が出てる。
KeepALiveを使ってる箇所。

518:デフォルトの名無しさん
08/05/27 01:14:44
これもスコープ終了以前にGCされて落ちる例だね。

「ふらっとC#,C♯,C#(初心者用) Part22」
スレリンク(tech板:850-877番)

>876 名前: 875 [sage] 投稿日: 2008/01/08(火) 00:46:17
>>850
>あーもしかしてと思ってと思って>>875のコードから
>GC.KeepAlive(func); 抜いたら確かにAccessViolationExceptionおきるね。
>言ってるのはこれのことじゃろか。

>P/Invokeにデリゲートを渡す場合、そのデリゲートの寿命管理は.NET側の責任。
>実は元のるびま記事にも書いてある。
URLリンク(jp.rubyist.net)

519:498
08/05/27 01:56:25
もしかして>>501の理解も間違いだらけなんでしょうか?
もう少し詳しく教えていただけませんか。

520:デフォルトの名無しさん
08/05/27 02:21:58
>>498はGCと関係ないよ。
厳密には関係なくないとしてあえて言うと、
new A[n]したオブジェクトはA[] aの寿命(参照が外れるまで)生きてる。

521:デフォルトの名無しさん
08/05/27 05:51:20
初歩的なことだとうじゃうじゃ煽りレスがついたりするのに
ちょっと難しい質問だとなかったかのようにスルーするお前らワロスw

522:デフォルトの名無しさん
08/05/27 08:25:46
>>521
最近はROM主体だが、お前の発言が一番醜く見える。
そんなに無視されたのがくやしいのか? ちなみにどの質問なのか示してみ。

523:デフォルトの名無しさん
08/05/27 08:56:45
どこが難しいの?直前のネタはフラットでもスルーだろ・・・C#関係ないし

524:デフォルトの名無しさん
08/05/27 09:04:01
>>518
それはスコープが終了するとGCされるから、プログラマの責任でスコープを終了させんな、って話だ。

525:デフォルトの名無しさん
08/05/27 09:12:10
>>522
わざわざROM主体とか前置きしないとレスできないのかよw

526:デフォルトの名無しさん
08/05/27 09:14:26
ROM主体と言うのを何か言い訳に使ってるなら
>>525のレスは理解出来るが、別に言い訳に使ってないじゃん
まあ、無駄な前置きではあるけど

527:デフォルトの名無しさん
08/05/27 09:40:12
>>526
まあ、第三者を装ってるあたりはみっともないな

528:デフォルトの名無しさん
08/05/27 10:23:17
>>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);
}

529:デフォルトの名無しさん
08/05/27 13:20:13
アンマネージな世界に渡したデリゲートを安全に保持しとくには
アンマネージ側で不要になるまでGC対象にならないようにしとかなきゃならない。

てだけの話?


530:デフォルトの名無しさん
08/05/27 13:41:36
>>529
そういうこと。
他にも、インライン展開されたコンストラクタが完了する前にファイナライザが実行されることすらあるよ。
この場合もアンマネージな世界のハンドルの早すぎる解放であぼんする場合がある。

531:デフォルトの名無しさん
08/05/27 13:44:19
>>529
9割9分そういう理解でOK。>>514もアンマネージなmutexやロックのためのファイルを
開いたままにする場合などに影響が出る。
アンマネージが関係しないケースはまれなのだが、なぜかそのレアケースが、
MSDNに載ってたりする。サンプルソースは2種類あるが最初のほう。
URLリンク(msdn.microsoft.com)(VS.80).aspx

532:デフォルトの名無しさん
08/05/27 14:44:45
非同期ゲリゲートの動きを止めたいときはどうすればいいですか?

533:デフォルトの名無しさん
08/05/27 15:07:42
>>532
フラグやEventを使ってスレッド自身にそうさせるのが基本。

534:デフォルトの名無しさん
08/05/27 16:06:12
関係ない話題を知ったかでひけらかすより質問に的確に答えてあげたら?

535:デフォルトの名無しさん
08/05/27 16:10:55
いったい何の話だ?

536:デフォルトの名無しさん
08/05/27 16:12:20
すっげーすぐにレス来たww
お前が関係ない話してレスが流れたんだろ。
自分で見返せ。

537:535
08/05/27 16:19:20
>>536
えーと、俺はこのスレには初めて書いたものだが
流れがわからんからアンカーつけてくれないか?
どの質問の話かわからないから、答えようが無いわ。

538:デフォルトの名無しさん
08/05/27 16:22:12
>>531
そこのサンプル例1の解説が不正確で、プロパティの取得処理が
時間のかかる処理のためデストラクタが先に動いてしまうと読めるがそれは誤り。
もしそうであれば.NETのGCなんて安心して使えない。
それはデストラクタの使い方に重大な欠陥があるために発生する。
具体的にはExampleクラスのデストラクタで他のクラス、
この場合hashValueが参照を持つArrayクラスの後処理を書いたらいかんということ。
マネージドだけの場合は基本的にKeepAliveのことは考えなくてよい。


539:デフォルトの名無しさん
08/05/27 16:57:12
デストラクタが呼ばれるときには、既にメンバは解放された後なんだっけ?

540:デフォルトの名無しさん
08/05/27 17:11:04
微妙に違う。
ファイナライズメソッドの実行順序には何の保証もないという話。

だと思うけどリンク先見てないから確かなことは分からん。

541:デフォルトの名無しさん
08/05/27 17:11:27
>>539
メンバに参照型を持つ場合でも、オブジェクトとして独立してるので
デストラクタが動くタイミングやメモリが回収されるタイミングは不順。
順番が必要な場合はDispose(true)のパターンを使う。

542:デフォルトの名無しさん
08/05/27 17:13:17
あいや、ずっと前に読んだことあるはずでかすかな記憶によると
解放された後っていうか自分で解放してんじねーかよw
って話だったかも…


543:デフォルトの名無しさん
08/05/27 17:48:04
>>537
半年ROMれ。

544:デフォルトの名無しさん
08/05/27 18:08:24
>>543
それはない

545:デフォルトの名無しさん
08/05/27 19:47:37
一匹キティが沸いてんな・・・フラットじゃないのに

546:デフォルトの名無しさん
08/05/27 21:16:53
フラット!フラット!!

547:デフォルトの名無しさん
08/05/28 00:24:52
質問です。

フォームを2つ使うアプリを作っています。
メニューはメイン側にはありますが、サブ側は何もありません。

で、サブ側にフォーカスがある時に、メイン側のメニューのショートカットを叩いても、
フォーカスがサブ側にあるため、イベントが発動してくれません。
出来ればこのショートカットを共有したいと思っています。

サブ側でもOnKeyDownなんかで同じ関数を呼ぶようにすれば可能といえば可能ですけれど、
あまりにも美しくないなと思ってます。何か上手い方法は無いでしょうか?

548:デフォルトの名無しさん
08/05/28 00:38:50
ほかのウィンドウのイベントが別のウィンドウのショートカットをたたくというのは美しくないだろ。
ルートのフォームまでで処理されなかったイベントがアプリケーションのハンドルで処理されるというのが正しい形だと思う。

549:デフォルトの名無しさん
08/05/28 00:47:27
サブフォームでメインのOnKeyDown呼べばいいじゃん

550:デフォルトの名無しさん
08/05/28 00:50:05
返信ありがとうございます。

>>548
そもそもメインのフォームでイベントを処理している、ってのがおかしいってことですかね?
メインにしろサブにしろ、フォームはイベントを発行するだけで、
その実際の処理はアプリケーション級のオブジェクトがハンドルするわけですか。

551:デフォルトの名無しさん
08/05/28 07:35:33
MDIにしる

552:デフォルトの名無しさん
08/05/28 11:10:54
2重起動を防いで、後から起動された方に渡されたコマンドライン引数を
最初に起動された方に渡したいです。
URLリンク(dobon.net)
ここにVB.NETでのやり方が書いてあり、C#でも似たようなことは出来ると思ったんですが
Microsoft.VisualBasic.ApplicationServices
これが存在しないエラーというが発生しました。
C#だと別のプロセスにデータを渡したりって事が無理なんでしょうか?

553:デフォルトの名無しさん
08/05/28 11:20:52
参照の追加

554:デフォルトの名無しさん
08/05/28 11:21:18
それでやるなら該当のdll参照すれ

555:デフォルトの名無しさん
08/05/28 11:31:31
>>553
>>554
参照追加したらありました。
たんにusingを記述するだけじゃダメだったんですね。
これでなんとかなりそうです。
ありがとうございました。

556:デフォルトの名無しさん
08/05/28 11:37:44
URLリンク(blogs.dion.ne.jp)
ここでも聞いてるやついるな。
当たり前すぎて書かないからなー、普通。

557:デフォルトの名無しさん
08/05/28 14:13:09
なんつう偉そうなコメントだw

558:デフォルトの名無しさん
08/05/28 19:16:03
なぜSystem.Arrayクラスから派生クラスを作れないんですか?

559:デフォルトの名無しさん
08/05/28 19:17:31
CLR的に配列は特別なオブジェクトだから

560:デフォルトの名無しさん
08/05/28 21:55:06
System.Arrayクラスから派生クラスが作れると何の不都合があるんですか?

561:デフォルトの名無しさん
08/05/28 22:15:37
CLRべったりの低レベルで特殊な実装になってるから派生したところでどうせ何もできないよ
っていうかSystem.Arrayなんかそんなによく使うか?
IList使えよ

562:デフォルトの名無しさん
08/05/28 22:20:42
CLR自体、StringとかArrayとか、その内部構造自体に
依存した最適化がかかってるからだ、
ってどっかにあった希ガス。

563:デフォルトの名無しさん
08/05/29 10:14:13
C++だとコンストラクタは出来るだけ初期化のみにした方がいいけど、
C#では初期化以外にもメソッド呼び出したり処理を始めちゃってもいいの?

564:デフォルトの名無しさん
08/05/29 10:15:32
いいよ

565:デフォルトの名無しさん
08/05/29 10:30:20
いかんよ


566:デフォルトの名無しさん
08/05/29 10:51:19
C++でコンストラクタでは継承先でオーバーライドされる仮想関数は呼べないんだったっけ
C#では出来るよ

567:デフォルトの名無しさん
08/05/29 11:03:33
>>563
してもいいけど、内容によっては立ち上がりが異常に時間がかかるプログラムになる。
その場合、最小限の初期化コンストラクタとクラス初期化メソッドを作る場合もある。

568:デフォルトの名無しさん
08/05/29 11:53:48
visual studioみたいなGUIのソフト作りたいんですけど
そのためのサンプルとか無いでしょうか?
具体的には
フォームにメニューがいくつかあって
ツールボックスがあって
左側にはエクスプローラ的な表示があって
下側にはテキストのログウィンドウがあって
残りの領域にはMDIの子フォームを生成するようなGUIです。
いかがでしょうか。


569:デフォルトの名無しさん
08/05/29 14:01:25
Visual StudioというGUIのサンプルがそこにあるではないか。


570:デフォルトの名無しさん
08/05/29 14:09:14
Visual Studio のドッキングを自前でがんばったらマジで死ねるなw

571:デフォルトの名無しさん
08/05/29 14:14:20
Visual Studio以上の物ができたら教えてね
試してあげるから

572:デフォルトの名無しさん
08/05/29 17:24:15
DockPanelSuiteマジオススメ

573:デフォルトの名無しさん
08/05/29 18:41:08
MonoDevelopのソースじゃ参考にならんか…

574:デフォルトの名無しさん
08/05/29 18:43:22
>>572
すげーなこれw

575:デフォルトの名無しさん
08/05/29 19:49:33
>>572
凄いが、これを駆使したプログラムを少人数で作る気になれない。

576:デフォルトの名無しさん
08/05/29 20:04:01
URLリンク(www.codeplex.com)
made in Japan!

577:デフォルトの名無しさん
08/05/29 21:52:40
WinFormsか・・・
WPF版がほしい。

578:デフォルトの名無しさん
08/05/29 22:24:21
>>577
お前はこっち池カス

WPF(XAML,XBAP,.NET3.5)GUIプログラミング
スレリンク(tech板)

579:デフォルトの名無しさん
08/05/30 05:22:08
C#からWin32APIを使って子プロセスを起動し、
Win32APIのCreatePipe, WriteFile, ReadFileを用いてプロセス間通信をしようとしています

このとき、立ち上げた子プロセスはコマンドを標準入力から読み込みんで処理をし、
結果を標準出力へコマンドごとに出力し、入力にEOFが来たら終了、みたいなプログラムです

ここで、子プロセスがEOFを認識してくれず、子プロセスが終了してくれません
なにかいい方法があるのでしょうか?
それともWin32APIの質問ということでよその板の方がいいでしょうか?

やっていること:
ハンドルを用意
親プロセスが無名パイプを作成する
パイプの一端のハンドルAを継承可能にする
STARTUPINFO構造体のhStdInputに継承可能にしたパイプのハンドルAを指定
CreateProcess()
継承可能にしたパイプのハンドルAを閉じる
パイプの閉じていない方のハンドルBにWriteFile()
ハンドルBを閉じる ←ここで子プロセスに終了してもらいたい

よろしくお願いします



580:デフォルトの名無しさん
08/05/30 06:02:32
そもそもWin32API使う意味がいったいどこに?


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch