トップページ⇒tech
1001コメント291KB

ふらっとC#,C♯,C#(初心者用) Part21

■ このスレッドは過去ログ倉庫に格納されています
0001ななしぃ#2007/11/18(日) 15:53:41
このスレッドは
「どんなにくだらないC#プログラミングに関する発言でも誰かが優しくレスをしてくれるスレッド」です。
ほかのスレッドでは恐ろしくて書き込めないような低レベル、もしくは質問者自身なんだか意味がよく分からない質問など、
勇気をもって書き込んでください。
内容に応じて、他スレ・他板へ行くことを勧められる、あるいは誘導される場合がありますがご了承下さい。

前スレ: ふらっとC♯, C#(初心者用) Part20
http://pc11.2ch.net/test/read.cgi/tech/1191036844/
0334デフォルトの名無しさん2007/12/04(火) 11:39:04
別のフォームに作れば
0335デフォルトの名無しさん2007/12/04(火) 12:18:46
フォームにラベルを複数置いたのですが
これらを配列として扱うには下記の方法でよろしいでしょうか?
label1〜label4がフォームに置いたラベルです

Label[] lblArr = new Label[4];
lblArr[0] = label1;
lblArr[1] = label2;
lblArr[2] = label3;
lblArr[3] = label4;

考え方がよくなかったりしたら教えてください
0336デフォルトの名無しさん2007/12/04(火) 12:33:27
>>333
あらかじめ貼っておくか、追加するときに場所と大きさ計算してフォームのサイズを調整したら

>>335
いいよ
Label[] lblArr = new Label[]{ label1, label2, label3, label4 };
でもいい


03373352007/12/04(火) 13:15:21
>>336
数が少ないなら宣言時に入れたほうがすっきりするんですね
そうするようにします。

ありがとうございました。
0338デフォルトの名無しさん2007/12/04(火) 13:34:32
for(int i=0;i<4;i++){lblArr[i]=(Label)this.Controls["label"+i];}
一応こういうのもある
>>335-336の方が好ましいのでできればやめた方がいいけど
0339デフォルトの名無しさん2007/12/04(火) 15:05:32
コンソールアプリなのですが、キーボードステータスを読み取るにはどうすればよいのでしょうか。
03403392007/12/04(火) 15:10:04
(続き)
タイマーイベントのハンドラの中で、現在押下されているキーをすべて取得するといった内容で考えております。
0341デフォルトの名無しさん2007/12/04(火) 15:13:29
いつもお世話になっております。ご相談させてください。

UDPポートをbindして、クライアントから一方的にudpデータが
送られてくる状況で、パケットの取りこぼしが発生してしまいます。

クライアントから送られてくるデータの、先頭2バイトをインクリメントデータの
シーケンス番号としておりまして、これを連続して取り出したところ
最大で10パケットほどごっそり抜けるといった現象が発生しています。

以下がプログラムの流れです。

1.ソケット作成
2.Socket.BeginReceiveFrom〜で非同期受信開始
3.コールバックメソッドで、先頭2バイトを読み出してシーケンス番号を確認。
4. 3.のシーケンス番号を保存して、再びSocket.BeginReceiveFrom〜を呼び出し。
5.再度のコールバックメソッドで、4.で保存したシーケンス番号と
 新しいシーケンス番号に2以上の差があるときがある。(おおよそ2〜10程度)

UDP自体は信頼性のないネットワークなのは十分承知しているのですが、
クライアントからのデータはCore2DuoのPCでデータを受信しているので、
CPUパワーからして本当に取りこぼすのか疑問に思っております。

Wiresharkでパケットをキャプチャするとネットワークライン上には
正しくデータは流れているので、Windowsは取りこぼしていないが、
アプリケーションの段階で取りこぼしているのかなと想像はしているのですが……。

どなたか同じような症状の方おりませんでしょうか。
またわかる方がいればご教示願えませんでしょうか。

orz

0342デフォルトの名無しさん2007/12/04(火) 15:19:06
>>341
1パケットに複数まとまってるんでない?
0343デフォルトの名無しさん2007/12/04(火) 15:20:32
初歩的な質問ですみません。
C#の文法規則の意味について教えてください。

C++は理解しており、メンバーに対するアクセス指定は理解できるのですが
クラスに対するアクセス指定の意味がわかりません。

名前空間内でクラス宣言を行うときにクラス自体にpublicかinternalの
アクセス指定ができますが、これらは何を意味するのでしょうか?

理解していること
・名前空間内で指定可能なアクセス指定子はpublicかinternalのみ
・省略するとinternalとなる

0344デフォルトの名無しさん2007/12/04(火) 15:26:07
>>340
GetAsyncKeyState()等のAPI 使うとかでどうか
0345デフォルトの名無しさん2007/12/04(火) 15:29:00
>>343
http://msdn2.microsoft.com/ja-jp/library/ba0a1yw2(VS.80).aspx
03463392007/12/04(火) 16:02:59
>>344
ビンゴでした。THANKS!
http://www.cam.hi-ho.ne.jp/oishi/tips.html#keystate
を参考に、GetKeyStateで出来ました。

[DllImport("user32.dll")]
private extern static Int16 GetKeyState(VirtualKeyStates nVirtKey);

private enum VirtualKeyStates : int
{
VK_LBUTTON = 0x01,
VK_RBUTTON = 0x02,
}

public void OnTimedEvent(Object sender, ElapsedEventArgs e)
{
bool fLeftPressed = (GetKeyState(VirtualKeyStates.VK_LEFT) & 0x8000) != 0;
bool fRightPressed = (GetKeyState(VirtualKeyStates.VK_RIGHT) & 0x8000) != 0;
}

03473392007/12/04(火) 16:16:20
おっと失礼
private enum VirtualKeyStates : int
{
VK_LEFT = 0x25,
VK_RIGHT = 0x27,
}
必要な定義はこちらでした。
0348デフォルトの名無しさん2007/12/04(火) 16:51:16
>>345
ありがとうございます。

『public と宣言された型には、他のすべての型がアクセスできます。
internal と宣言された型には、同じアセンブリに所属する型だけが
アクセスできます。』

とあるのですが、ここでいうアセンブリとはソースファイルという理解
で正しいでしょうか?
03493482007/12/04(火) 16:55:18
アセンブリとはDLLやEXEのことでした。

ということは、internal指定のクラスの場合は同一DLL, EXE
からしか参照できなくて、public指定のクラスの場合は
別のDLLやEXEから参照できるということですね。
0350デフォルトの名無しさん2007/12/04(火) 16:57:51
おおかた合ってる。
0351デフォルトの名無しさん2007/12/04(火) 16:59:18
>>346
Keysつかえよ。
0352デフォルトの名無しさん2007/12/04(火) 22:38:31
P/Invokeでは[DllImport("kernel32.dll")]などと指定しますが、
kernel32.dllやuser32.dllなどといったものは64ビットWindowsにも存在するのでしょうか?
またこれらに64ビットポインタを渡しても問題ないのでしょうか?

手元に64ビット環境がないので、よろしくお願いします。
0353デフォルトの名無しさん2007/12/04(火) 22:46:18
存在する
64bitのAPIも同名DLL
WoW64で動くかどうかでどっちを使うか自動判断
明示したけりゃ/platform
0354デフォルトの名無しさん2007/12/04(火) 23:03:46
>>353
どうもありがとうございます。
特別な理由がなければ何も考えずに書けばいいんですね。

もう一つ質問があるのですが、32用と64ビット用の二つのdllがある場合、
P/Invokeで実行環境に適したdllを読み込むことはできますか?
0355デフォルトの名無しさん2007/12/04(火) 23:22:37
>>354
>>353のレスちゃんと読んでやれよ・・・
03563522007/12/04(火) 23:38:07
>>355
どういうことです?
WOW64上で動作させて32ビット用を読み込めということですか?

ちなみにこの場合のdllはシステムにあるものではなく、自作のdllという意味です。
0357デフォルトの名無しさん2007/12/04(火) 23:40:21
IntPtr.Sizeみて分岐
0358デフォルトの名無しさん2007/12/04(火) 23:46:04
自動判断って書いてあるように見えるけど?
0359デフォルトの名無しさん2007/12/04(火) 23:49:07
system32/syswow64に入らないのなら自動呼び分けはないんじゃないかな
シングルトンで実装させれば使う側は気にしなくてすむようになるけど
DLL検索パスを利用してうまいことやればdll名だけ違うDllImportとか書かなくてもなんとかなるかな
0360デフォルトの名無しさん2007/12/04(火) 23:53:10
ま、正しいのはやはり/platformでターゲットを明示すること
03613522007/12/04(火) 23:56:03
>>357
最悪そうせざるをえないですね。

>>359
実行時に検索パスを設定するorアーキテクチャによって変更するってできるんですかね?
できたらかなりすっきり書けそうですが。

>>360
そうしたら実行環境が限られてしまうんじゃないですか?
0362デフォルトの名無しさん2007/12/05(水) 00:01:51
ラッパかぶせてその中で分岐しとけばごちゃごちゃしたりはしないだろう
0363デフォルトの名無しさん2007/12/05(水) 00:02:26
IntPtr.Size
PATH

> そうしたら実行環境が限られてしまうんじゃないですか?
限られるんじゃなくて限らせるの。
x86とx64両方つくりゃいいだけ。
0364デフォルトの名無しさん2007/12/05(水) 00:08:05
>>363
それはちょっと保守の手間が増えるので避けたいです。

>>362
そうですね。とりあえずその方法でいきたいと思います。
どうもありがとうございました。
03653522007/12/05(水) 00:08:48
名前忘れました。>364=>352
0366デフォルトの名無しさん2007/12/05(水) 00:30:28
色々なクラスで使うメソッドを、ユーティリティクラスを作ってstaticメソッドで呼び出すのと
継承を使って派生させて使うのとどっちがいいのでしょうか?

今までベースクラスに汎用メソッドを書いていたのですが、
Xmlの操作とか、クラスの本質に関係のない部分はユーティリティクラスのほうがいいのかな
と最近思うようになってきました。

HttpUtility.UrlEncodeみたいに、.NETでもユーティリティクラスの存在そのもの
を禁止されているわけではないですよね・・・
0367デフォルトの名無しさん2007/12/05(水) 00:31:10
ユーティリティクラスあるだろ
Mathとか
0368デフォルトの名無しさん2007/12/05(水) 00:41:31
どっちがいいといってもことそれぞれとしか
0369デフォルトの名無しさん2007/12/05(水) 00:45:57
まあユーティリティクラス作る方が標準的じゃないか
0370デフォルトの名無しさん2007/12/05(水) 01:11:47
GoogleMapsAPIを利用してて自分もこういうWebAPIというものを
作ってみたいと思いました。
WebAPIを作るにあたり必要なスキルは何でしょうか?
またWebAPIの開発の参考書などがあればご紹介ください。
WebAPIを利用するための参考書じゃなくて自分でWebAPIを開発する参考書です。
0371デフォルトの名無しさん2007/12/05(水) 01:27:34
>>367-369
レスありがとうございます。

staticメソッドを計算の代用とか気軽な目的で自体は
問題なさそうですね・・・。
0372デフォルトの名無しさん2007/12/05(水) 01:48:25
>>370
Google Maps API 質問箱
http://pc11.2ch.net/test/read.cgi/tech/1131627583/
0373デフォルトの名無しさん2007/12/05(水) 09:13:16
継承でやる方が邪道だよ大抵は。
まあユーティリティと言ってるものの内容にもよるけど。
0374デフォルトの名無しさん2007/12/05(水) 12:14:48
Sin()やSqrt()がSystem.Doubleのインスタンスメンバだったりしたら煩わしいことこの上ないよな。
03752852007/12/05(水) 12:48:53
>>285わかる方いませんか?
0376デフォルトの名無しさん2007/12/05(水) 12:59:05
ユーティリティクラスはクラス名短くしないと読むのが困難になりがち
0377デフォルトの名無しさん2007/12/05(水) 14:53:40
C#で始めてプログラミング始めたんですけどお勧めの書籍とかサイトってありますか?
0378デフォルトの名無しさん2007/12/05(水) 16:05:40
ふらっとじゃない方のC#スレの>>4
0379デフォルトの名無しさん2007/12/05(水) 17:04:15
@ITのC#入門はガチですとも
0380デフォルトの名無しさん2007/12/05(水) 17:07:52
他の言語の経験があるなら、ホントに@ITのC#入門読むだけですむよな。
0381デフォルトの名無しさん2007/12/05(水) 17:13:42
オラはオライリーのプログラミングC#で覚えた。
ガイジン特有の変な例えのせいでデリゲートが全然理解できなかったが。
0382デフォルトの名無しさん2007/12/05(水) 17:27:25
うちは標準C#入門っていう、いかにもな本だった。
なかなか読みやすかったのを覚えてる。
0383デフォルトの名無しさん2007/12/05(水) 17:31:37
LINQのおかげでdelegateの意味は全然変わっちゃったしな
03843352007/12/05(水) 18:07:26
正直デリゲートはわかってないけど
やばいかな
03853352007/12/05(水) 18:08:05
@IT逝ってきます
0386デフォルトの名無しさん2007/12/05(水) 18:08:57
LINQ使えばわかる
0387デフォルトの名無しさん2007/12/05(水) 18:32:16
イベント使えば分かる。


いや分からんかも…
0388デフォルトの名無しさん2007/12/05(水) 18:36:23
100レススルーされてる>>285がやや気の毒だがわからない
でも動画なんて埋め込みたいとは思わないな俺は
0389デフォルトの名無しさん2007/12/05(水) 18:36:33
イベントはdelegate分かってなくてもIDEが勝手に書いてくれるからな
0390デフォルトの名無しさん2007/12/05(水) 18:44:00
>>285か。
メモリに読めば何とかなるのなら、APIでリソースから直接読むのは可能。
0391デフォルトの名無しさん2007/12/05(水) 20:23:14
>>390
メモリにあるものをどうやって再生するかって話じゃないの?
テンポラリフォルダにでも展開しちゃえばいいんじゃないかと思うが
0392デフォルトの名無しさん2007/12/05(水) 22:24:32
>>379-380
川俣氏のやつですよね
以前2chで叩かれてるところに本人降臨してたスレがありましたが、中身はガチと思っていいんですかね?
0393デフォルトの名無しさん2007/12/05(水) 22:30:06
>>392
内容は悪くないというか、簡潔でいいと思うけど、
あれで習得できるのは「ミニマムリクワイアメント」に過ぎないね。
0394デフォルトの名無しさん2007/12/05(水) 22:32:37
話題になったのはVBネタの記事とかか
あの人どうも筆が走りすぎる感があるな
C#入門とかあの辺はよく書けてるんだけど
0395デフォルトの名無しさん2007/12/05(水) 22:38:30
>>394
俺が思うに、川俣の文体に反発する人間っていうのはたぶんあまり読書経験がないというか、
文芸的な文章を読まないタイプの人でしょ。

あれはああいう文体で、あんなものベタにとって反発するってどんだけオボコいんだよ、
と俺なんか思っちゃうけど。
0396デフォルトの名無しさん2007/12/05(水) 22:47:51
ライターなら多少走り気味なくらいがちょうどいいんじゃないの?
0397デフォルトの名無しさん2007/12/05(水) 22:48:39
叩きをするようなねらーによしあしなどわかってたまるか
0398デフォルトの名無しさん2007/12/05(水) 22:52:07
まあおまえらおちつけ
ここは初心者用質問スレだ
0399デフォルトの名無しさん2007/12/05(水) 22:52:11
なんかカワマタさんが来ましたよ
0400デフォルトの名無しさん2007/12/05(水) 22:53:08
>>395
>オボコい
久しぶりに見たよw
0401デフォルトの名無しさん2007/12/06(木) 00:33:01
asmxファイルで開発してる人いる?
0402デフォルトの名無しさん2007/12/06(木) 01:01:45
Xファイルなら
0403デフォルトの名無しさん2007/12/06(木) 02:34:50
あるプロトコルでチャットに接続し、ユーザはIEの画面を通して発言したり
他者の発言を取得して画面を更新したりするプログラムを作りたいと思っています。
以下のような構造になるのかなと考えています。

【ユーザ】←HTTP→【画面側プログラム�@】←なんらかの方法→【プログラム�A】←→インターネット

�@:
ASPで、他者の発言の取得はn秒ごとにポーリングを行う。
(サーバプッシュ型にできればなお良い)

�A:
EXEにしてサービス化?ともかく常時起動しており、チャットには繋がりっぱなしにする。
�@の状態には依存しない。
ASPにして�@と同化させると、ユーザが画面を開くたびにインスタンスが新しくなってしまうのと
ユーザが画面を開かなければインスタンスを作れないので分ける必要がある(と思っている)

そこでよく分からないんですが、まず、IISの起動と終了のイベントを拾って
プログラムを動かすことができるのでしょうか。
可能なら、�@と�Aを一緒くたにして、IIS起動でチャット接続して、その状態をstaticメンバにして
全インスタンスで共有し、終了で切断するということでASP一本にできると思ってます。
これは可能でしょうか。

もう一つ、分ける場合には�@と�Aで情報のやりとりをする必要があります。
�Aでインタフェースを提供し、�@はそれを呼び出すだけという形にしたいです。
�@から見たときに利用を簡単にしたいので、できればWebサービスとしてインタフェースを
提供できないかなと思うのですが、�AがASPじゃなく普通のEXEの時に、�AでWebサービスを
実装するにはどのようにすればいいのでしょうか。
(�AがASPなら、IISが良きに計らってくれますが…)
また、Webサービスが無理ならどういう方法で通信するのがベターでしょうか。プロセス間通信とか?

妄想段階なので曖昧な点が多いのですが、アドバイスをいただければ幸いです。
よろしくお願いします。
0404デフォルトの名無しさん2007/12/06(木) 03:10:01
パスワードを保存するファイルに暗号化をかけたいな〜と思ったんですが、
その暗号化キーをどこに保存しようか悩んでいます。
Firefox のマスタパスワードみたいに毎回問い合わせるのは最終手段にしたいと思ってまして、
じゃあどこにどうやって保存しようかな……という話です。
0405デフォルトの名無しさん2007/12/06(木) 13:26:26
>>395なんじゃそりゃ?
まあ反発してたってのがどんなんかしらんから何とも言えんけど、
誤解を招きやすい文章だと思ったことは何回かある。
0406デフォルトの名無しさん2007/12/06(木) 13:36:09
保存先ならIsolatedStorageでもどう
0407デフォルトの名無しさん2007/12/06(木) 14:05:11
>>403
ASPスレで聞いたほうがよい
たぶんセッションで出来る
0408デフォルトの名無しさん2007/12/06(木) 14:48:03
VC#2005EEを使い始めたのですが、ツールバーに使うアイコンをWindows標準のもの(新規作成とか上書き保存とか)を使いたいのですが、Windowsフォルダとかから探してくるしかないんでしょうか?
また、そういうったアイコンは勝手に使ってもいいんでしょうか?
0409デフォルトの名無しさん2007/12/06(木) 15:00:29
VS2005ImageLibraryというのがあるんだけどExpressには付いてないみたいだね
http://i-keisuke.at.webry.info/200701/article_13.html
ライセンス的に大丈夫なのか知らないけどこういうのも可能みたい
0410デフォルトの名無しさん2007/12/06(木) 15:51:04
NewWindowイベントをキャンセルしたいのですが、

private void webBrowser1_NewWindow(object sender, CancelEventArgs e)
{
e.Cancel = true;
}

では上手くいきません。
どのようにしたら良いのか教えてください
0411デフォルトの名無しさん2007/12/06(木) 17:30:21
下記のソースを実行すると1のところでエラーが発生してしまいます。
どうやったら解消されるか教えてください。
目的は、csvファイルからデータを読み込んで、2番目のデータを配列に
挿入することです。

class FileRead2
{
public int[] data;

public void fileRead()
{
string[] list;
string line;
int k = 0;
StreamReader r = new StreamReader("data.csv",Encoding.Default);
while ((line = r.ReadLine()) != null)
{
list = line.Split(',');
/*1*/ data[k] = Convert.ToInt32(list[1]);
k++;
}
r.Close();
}
}
0412デフォルトの名無しさん2007/12/06(木) 18:01:29
>>411
空文字なんじゃねーの?
Console.writeline(list[1] == string.Empty);
/*1*/ data[k] = Convert.ToInt32(list[1]);
でやってみれ
0413デフォルトの名無しさん2007/12/06(木) 18:21:52
listの要素数を確認せずに[1]にアクセスするなよ
0414デフォルトの名無しさん2007/12/06(木) 18:27:31
>エラーが発生してしまいます。
なんでエラーの内容を書かないかな。
list[1]がないか、Parseに失敗してるかのどちらかだろうけど。
04154112007/12/06(木) 18:43:07
エラー内容は
オブジェクト参照がオブジェクト インスタンスに設定されていません。
というものです。

エラー発生時のlistの中身を確認してみると6番目までデータが
入っているので、どうやらparseに失敗しているようです。
0416デフォルトの名無しさん2007/12/06(木) 19:05:13
>>415
そりはもしかして public int[] data; のdataを初期化してないのでは?
0417デフォルトの名無しさん2007/12/06(木) 19:24:00
なんでこれでヌルポが出るんだ
配列の境界を越えてるとかなら分かるが
0418デフォルトの名無しさん2007/12/06(木) 19:24:35
A.Hoge(){};
B.Hoge(){};

using A;
using B;

public static void Main{
Hoge();
}

この場合どっらのHoge()が呼び出されんですか?
0419デフォルトの名無しさん2007/12/06(木) 19:27:01
コンパイルエラーになる
0420デフォルトの名無しさん2007/12/06(木) 19:27:40
わかりました。
0421デフォルトの名無しさん2007/12/06(木) 19:35:09
>>417
data == null
0422デフォルトの名無しさん2007/12/06(木) 19:37:05
>>421
それしかないな
0423デフォルトの名無しさん2007/12/06(木) 19:37:30
明らかに>>416が正解だろ。
ファイルの行数が決まってないから初期化できない、というならList<string>を使え。
0424デフォルトの名無しさん2007/12/06(木) 19:48:23
C#ってLinuxに移植されないの?
0425デフォルトの名無しさん2007/12/06(木) 19:49:28
MONO
Silverlight
04264112007/12/06(木) 20:03:15
皆さんご助言ありがとうございました。
配列を初期化していないことが原因でした。
無事解決できて良かったです。
0427デフォルトの名無しさん2007/12/06(木) 21:15:55
>>409
遅くなりましたがありがとうございました。
EEを使ってる人は標準のアイコンすらないんですね;
0428デフォルトの名無しさん2007/12/06(木) 22:18:54
>>427
ToolStripやMenuStripなら「標準項目の挿入」でいくつかアイコンがつくね。
そいつをなんとか保存しといて使い回したら? ちっこいけど。
0429デフォルトの名無しさん2007/12/06(木) 23:16:30
これマジでつまらない質問なんですが
インスタンスが理解できません
だれかわかりやすく説明してください
0430デフォルトの名無しさん2007/12/06(木) 23:33:45
(どこかで)newしたもの
0431デフォルトの名無しさん2007/12/06(木) 23:35:19
使ってりゃ分かる
0432デフォルトの名無しさん2007/12/06(木) 23:49:37
定番の
クラス…社員
インスタンス…平社員の山本
みたいなのって余計混乱させるだけだと思う
0433デフォルトの名無しさん2007/12/06(木) 23:58:59
オブジェクト指向とか継承とかの説明って大嘘だしな
使ってりゃ分かる
■ このスレッドは過去ログ倉庫に格納されています