[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 08/16 23:53 / Filesize : 244 KB / Number-of Response : 980
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C#, C♯, C#相談室 Part46



1 名前:デフォルトの名無しさん [2008/04/22(火) 00:31:59 ]
(#゚ー゚)つ < C#、.NETの話題はこちらでどうぞ。
c++厨の嵐はスルー汁。

前スレ
C#, C♯, C#相談室 Part45
pc11.2ch.net/test/read.cgi/tech/1200911737/

その他テンプレ>>2-5くらい

577 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 21:52:40 ]
WinFormsか・・・
WPF版がほしい。

578 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 22:24:21 ]
>>577
お前はこっち池カス

WPF(XAML,XBAP,.NET3.5)GUIプログラミング
pc11.2ch.net/test/read.cgi/tech/1211453941/

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

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

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

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

よろしくお願いします



580 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 06:02:32 ]
そもそもWin32API使う意味がいったいどこに?

581 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 06:08:55 ]
C++でパイプを使った経験があったのでパイプをやろうとして、
C#でパイプをやるためにWin32APIを使うことにしました

582 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 06:18:59 ]
ProcessStartInfo.RedirectStandardInput
Process.StandardInput
この辺使う

583 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 06:59:47 ]
なるほど
他プロセスの標準入出力を通した通信は明示的なパイプ以外に用意されていたのですね
自分で調べてた限りでは見つかってなかった情報なのでとても助かりました
試してみます
ありがとうございました

584 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 10:37:20 ]
string str = File.GetLastWriteTime(Path).ToString();
このようにファイルの最終更新時間を取得すると、
そのファイルのプロセスが使用中のままになるのですが、
CloseやDisposeのようにすぐに開放させるにはどうすればいいのでしょうか?

585 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 11:06:44 ]
ならんが



586 名前:584 mailto:sage [2008/05/30(金) 11:10:07 ]
すみません。
File.GetLastWriteTimeのせいじゃありませんでした。
File.GetLastWriteTimeタンごめんんささい。

587 名前:File.GetLast mailto:sage [2008/05/30(金) 22:49:58 ]
んもー


588 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 00:36:30 ]
何言ってんだお前らは?釣りか?
|  問  1
|(ア) (イ) (ウ) (エ) (オ)
|D D D D D
|C C C C C
|B B B B B
|A A A A A
|@ @ @ @ @


589 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 00:37:34 ]
誤爆りました。スマソ

590 名前:579 mailto:sage [2008/05/31(土) 05:59:48 ]
アドバイスいただけた方法でうまくいったので(ありがとうございます)報告します
ちょっとはまった点としては、
改行コードをWriteしてもフラッシュされない
 →出力がほしい時はちゃんとフラッシュ
子プロセスのStdinに対するエンコーディングはProcessStartInfoから設定できない
 →StandardInput.BaseStreamを取得して新しくStreamWriterを作る
ぐらいでした
当初の問題だったEOF云々は、Process.StandardInputのストリームを閉じると
問題なく処理されました

求めていた処理を考えていたやりかたよりずっと簡単に得られたので大満足です

591 名前:デフォルトの名無しさん [2008/05/31(土) 17:29:19 ]
今、とあるゲームの画面の各部をキャプチャして画面を認識し、指定した部分をクリックしたり文字を送ったりするプログラムを作っています。

VisualC#のデバッグモードで動かしていると、画面上の指定部分をキャプチャする関数の中で使っている、Graphics.GetHdc()の部分で、
「ArgumentExceptionはハンドルされませんでした。  使用されたパラメータが有効ではありません」
のメッセージがでて止まってしまいます。10回に1回くらいの頻度かな。
ローカル画面で変数の値をチェックしても、キャプチャ範囲に異常な値は無く(bmpのサイズなど正常)、何でこうなるのか心当たりがありましたら指摘してもらないでしょうか。
#複数の呼び出し元から、この関数が同時に呼び出されているときにこんなことおこるのかな・・・?

ちなみに、キャプチャやってる関数を下に貼り付けてみます。
-----------
public Bitmap CapturePartFromA(int[] capval)
{
//capval[] はキャプチャ範囲を収めた配列。ここでは[3]と[4]のみ利用
Bitmap bmp;
//座標系を変換する関数の戻り値保存用
int[] xxx = new int[4] { 0, 0, 0, 0 };
IntPtr hWnd = FindWindow("A Game", null);
RECT winRect2 = new RECT();
GetWindowRect(hWnd, ref winRect2);
//座標を変換する関数(クライアントの原点←→デスクトップの原点)
xxx = ConvertCoordinates(capval);
bmp = new Bitmap(capval[3], capval[4]);
Graphics g = Graphics.FromImage(bmp);
IntPtr hDC = g.GetHdc(); //←ここで 例外頻発
IntPtr winDC = GetDC(hWnd);
BitBlt(hDC, 0, 0, bmp.Width, bmp.Height, winDC, xxx[0], xxx[1], SRCCOPY);
g.ReleaseHdc(hDC);
g.Dispose();
ReleaseDC(hWnd, winDC);
return bmp;
}


592 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 17:44:08 ]
>>591
チートスレ池

593 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 19:41:13 ]
MMORPGの自動プログラムを作ってどうする、それほど他を出し抜きたいのか?
こんな所に来るな。

594 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 22:52:58 ]
C# = D♭

595 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 15:20:56 ]
>>591
評:もっとオブラートに包んだ質問のやりかたを覚えましょう。



596 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 19:22:52 ]
エロシーンまだ?

597 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 19:27:52 ]
せめて「GUIのテストを自動化したいです」位のうそをつく常識を持て

598 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 19:48:59 ]
HttpWebRequest使ってゆうちょダイレクトのサイトから振り込み状況を確認するアプリ作ってるんだけど、
誰かできた人いる?
UserAgentとかいじってもなぜかはじかれる。
同じアプリでほかのhttpsサイトとかはログインできるんだけどなぁ。

599 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 20:02:32 ]
いません

600 名前:591 [2008/06/01(日) 20:49:22 ]
ここで知恵ある人いるかと思ったのですが・・・残念。
自助努力するしかないですね。
どうもでした。


601 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 20:49:25 ]
なぜかって、なんのエラーで帰ってきてるの?

602 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 22:21:28 ]
UDP通信で、C#のクライアントにVC++のCプログラムからソケットでメッセージを送って表示
しているのですが。漢字が正しく表示できません。何かのコード指定だと思うのですが、
探してみたのですが見つからず。よろしければ教えてください。
C++の手順
WSAStartup(MAKEWORD(2,0), &wsaData);
sock = socket(AF_INET, SOCK_DGRAM, 0);
addr.sin_family = AF_INET;
addr.sin_port = htons(XXXXX); // 送信先のポート番号
addr.sin_addr.S_un.S_addr = inet_addr("XXXXXXXX"); // 送信先のIP
sendto(sock, str2.c_str(), str2.size(), 0, (struct sockaddr *)&addr, sizeof(addr));
closesocket(sock);
WSACleanup();
必要であればC#受け側も出します。
ちなみにc++側のプロジェクトの文字コードを有る分変えても変わりませんでした。

603 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 22:25:33 ]
C#側も書こう

604 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 22:26:42 ]
文字コード意識せずにネットワークとか

大方StreamReaderをEncoding未指定でnewしてんだろ

605 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 22:32:39 ]
技術ある人はゆうちょダイレクトにログインするプログラムをC#でHttpWebRequestつかって組んでみてほしい。
思いのほかはまるよ。



606 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 22:33:57 ]
>>601
サーバー側のエラーで帰ってきてログイン不可能。
エラーコードが書いてあるけど、意味がわからないので対応が難航してる。



607 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 22:36:26 ]
>>606(=605)
そのエラーコードを書けってことじゃないのか?
イミが分からないとか、技術ある人は作ってみ?とか
根本的にダメダメwww

608 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 22:38:18 ]
サーバー側(cgi)のエラーコードなんてC#とまったく関係ないから書かなかっただけだが。

609 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 22:40:27 ]
>>608
オマエには無理って事で終了

610 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 22:42:59 ]
TP1/Webのエラーコードっぽいけどな。
マニュアルある人ならわかるかもしれん。
今ゆうちょダイレクトメンテ中でエラーコード再取得できなかった。

611 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 22:43:26 ]
>>609
お前には聞いてないってw

612 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 22:45:14 ]
>>603  >>604の指摘でC#側を見て下記の点ではないかと思い
enc = System.Text.Encoding.UTF8;
// enc = System.Text.Encoding.Unicode;
// enc = System.Text.Encoding.BigEndianUnicode;
localPort = XXXXX;
udp = new System.Net.Sockets.UdpClient(localPort);

コメント部分を追加してみましたが変えましたが、半角英数もまともに表示できなかったです。
元々はUTF8でした。 何がいけないのだろう?

613 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 22:45:51 ]
逆ギレw

614 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 22:47:03 ]
技術もないのにあおるだけのアホは放って置いてできる人よろしく!

615 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 22:50:06 ]
>>614
ここで聞く前に、先ず質問の仕方を勉強してきてね



616 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 22:51:20 ]
だなw

617 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 22:52:55 ]
>>615,616
キメェw

618 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 22:55:16 ]
ゆうちょダイレクトは特に妙なところはなかったように記憶しているけど、
どこでひっかかってるの?
今確認しようとしたら、ちょうどサービス停止中だな。

619 名前:デフォルトの名無しさん mailto:age [2008/06/01(日) 23:03:10 ]
C# 側のコードです。 どのコードを指定しても正しく表示されなかった。orz
System.Net.Sockets.UdpClient udp;
private Button button1;
System.Text.Encoding enc;

enc = System.Text.Encoding.UTF8;
// enc = System.Text.Encoding.UTF7;
// enc = System.Text.Encoding.ASCII;
// enc = System.Text.Encoding.Unicode;
// enc = System.Text.Encoding.BigEndianUnicode;
localPort = XXXXXX;
udp = new System.Net.Sockets.Udp

System.Net.IPEndPoint remoteEP = null;
byte[] rcvBytes = udp.Receive(ref remoteEP);
string rcvMsg = enc.GetString(rcvBytes);

udp.Close();

バッファーを見たら、シフトJISが送られてくるようでした。
わからない…orz


620 名前:デフォルトの名無しさん mailto:age [2008/06/01(日) 23:05:29 ]
一部切れていました。
udp = new System.Net.Sockets.UdpClient(localPort);


621 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 23:08:29 ]
Shift_JISで送られてきてるのにUTF-8でデコードとかおかしいと思わないか?

622 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 23:11:50 ]
思わないでーす

623 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 23:17:29 ]
なんか、荒らされてるな。
IDない板だから、釣りや煽りに反応するのはやめましょう。
質問者の暴言は、たいてい騙り。
もちろん、ときどきとんでもない質問者もいるが、いずれにせよ放置で。

624 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 23:19:15 ]
技術ある人に作れって時点でネタだろ

625 名前:デフォルトの名無しさん mailto:age [2008/06/01(日) 23:23:40 ]
>>620
すみません、どの記号がどの文字コードかの知識が不足しています。orz



626 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 23:55:12 ]
とりあえず、ゆうちょに不正アクセスしてる奴がいると通報しとくか。
3人くらいで通報すれば目付けられるから

627 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 01:27:36 ]
何が不正?

628 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 06:31:07 ]
.Text.Encoding.GetEncoding(932)

629 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 06:59:26 ]
>>628
出来ましたありがとうございます。

630 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 08:16:51 ]
とりあえず、ゆうちょにログインも出来ないアホはほっとけよ

631 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 12:59:43 ]
ゆうちょの件一晩頭冷やして考えたらできました。
お騒がせしました。

632 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 13:09:14 ]
>>631
>>615

633 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 13:35:31 ]
結局何がまずかったの?

634 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 13:39:21 ]
態度

635 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 15:04:41 ]
>>634
いや、頭だろ・・・



636 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 17:46:07 ]
そもそも質問してないだろ
意外とはまるからやってみぐらいの勢いだったんだが。
それを勘違いしたこまったちゃんが質問の仕方が悪いだの、態度が悪いだのってこんな匿名掲示板で言われてもなw

637 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 17:48:37 ]
>>636
ヨチヨチwww

638 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 17:51:25 ]
>>636
明らかに誰か作って教えてくれってスタンスだったけどなw

ヨチヨチwww

639 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 17:55:30 ]
それはそうと、ゆうちょ興味あったら挑戦してみ。
興味なかったらいいけど。

640 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 19:57:56 ]
ゆうちょダイレクトのアカウントなんて普通持っとらんがな(´・ω・`)
嵌るとかは単純に質問者の技術力不足だと思う

641 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 20:16:54 ]
そうだね。
俺はそもそも技術者じゃないから技術力不足は認めるよ。
ネットショップを経営しててそれに必要な入金チェックをちょっと作ってみようかなって思っただけだし。

642 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 20:24:42 ]
つ Python
無理にC#を使う必要性はない。

643 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 20:32:46 ]
PythonってWinアプリ簡単に作れるの?

644 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 20:35:08 ]
うん。GUIを扱うライブラリがあるし、IronPythonを使えば.netも使える

645 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 20:36:30 ]
ゆうちょ房のスレ荒らしw



646 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 20:47:33 ]
なるほど。
Python調べてみよう。Excelファイルいじくれるライブラリもあるといいけど。
C#始めて1ヶ月だけどフリーで開発環境まで全部まとめてインストールできるのが楽ではじめたんだよね。
今度は今手作業で集計してるバイトの勤怠管理でも作ってみるか。

647 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 21:08:48 ]
ゆうちょが出てきてからスレの雰囲気がすごく悪くなった

648 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 21:21:13 ]
過去スレ読んだが同じようなもんだぞ
ゆうちょに粘着している奴が悪くしてんじゃね?

649 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 00:14:43 ]
>>648
ヨチヨチwww

650 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 00:21:49 ]
なんかヨチヨチレスしかできないかわいそうなやついるな

651 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 00:52:27 ]
なんで技術者、学生以外でこんな板見てんだか・・・

652 名前:デフォルトの名無しさん [2008/06/03(火) 02:16:25 ]
初心者スレで同様の質問をしたのですが、相手にされなかったのでこちらで再度お聞きします。
ListViewのdetail表示時に行間を広くするにはどうしたらいいのでしょうか?

653 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 02:42:12 ]
ListViewItemのStyleあたりで設定できなかったっけ?
出来なかったらごめん。

654 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 09:19:23 ]
ImageList使う

655 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 12:20:34 ]
お前には無理だからさっさと諦めろ。



656 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 13:35:14 ]
>>652
>初心者スレで同様の質問をしたのですが、相手にされなかったのでこちらで再度お聞きします。
馬鹿じゃないの?
まじめな話。


657 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 14:07:08 ]
UserControlを継承したクラスを作って
クリックされた箇所に丸印を描画するようなプログラムを作るとしたとき。
Click()イベントで、クリックされた箇所を記憶し
Invalidate()でPaint()イベントを呼び出してクリックされた箇所を描画する。
という動きになるのでしょうか?


658 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 15:01:12 ]
はい

659 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 15:19:56 ]
フォームエディタで上にコントロールを乗せないなら、
UserControlじゃなくて、ただのControlからの継承でいい。

660 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 17:57:36 ]
>>658
>>659
どうもありがとうです。

ところで、趣旨が変わるんですが
折れ線(複数)グラフを書きたいのです。
ひとつの表示窓に複数のラインを書きたいのです。
そのライン単位でオブジェクトにしたいのですが、
(1)そのラインオブジェクトはControlから派生させて自分でライノブジェクト自身で描画させるべきでしょうか。
(2)それとも単なる(Control派生ではなく)オブジェクト化して、親表示窓Controlに個別に描画ルーチンを呼ぶ形にするべきでしょうか?
一般的にどうなのかなと思いまして。

(1)だったら、表示窓側の親オブジェクトは特に何も考えずに子が思いのままに描画する。
と思っていたのですが、背景処理が手間かと思えてきました。
子に当たるラインオブジェクトを描画すると親部分を上書きするからです。
リージョンを切れば親の描画部分を塗りつぶさなくても描けそうですが、折れ線なのでPATHが複雑になりすぎるかと思います。

(2)だったら特に背景塗りつぶし過ぎに関しては何も考えなくてよいのですが、
Paintルーチンで子オブジェクトにGrapicsオブジェクトを渡すサブルーチンコール形式になると思うのですが、なんだか嫌なのです。
一般的にこういうことをやりたい場合にはどうしますか?
変なことを言っているようだったら指摘してください。

661 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 18:02:28 ]
拡張性を考えれば当然後者だろ

662 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 19:57:03 ]
WPFなら前者だね

663 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 20:56:09 ]
Excel使え

664 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 21:37:46 ]
どこかにチャートコントロールあったはず

665 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 21:39:16 ]
ZedGraphとか



666 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 22:37:23 ]
ZenGraphってスクロール機能つけられる?

667 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 22:45:33 ]
便乗で質問なんですが
ZedGraphとかNplotを仕事(商用)として使ってる人いますか?


668 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 23:25:12 ]
ListViewの編集はなんで先頭のカラムしかダメなの?
面倒だね。

669 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 00:59:59 ]
WPFなら自由自在

670 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 01:18:50 ]
いやそういう話じゃなくて。

671 名前:660 mailto:sage [2008/06/04(水) 10:13:48 ]
皆さま。
ZenGraphとかNplotとかあるんですね。
これらを使うかどうかはともかく、これらの実装を参考にさせてもらいます。
どうもありがとう。


672 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 20:17:36 ]
Personクラスの派生クラスとして
Man,Woman,Noneを考えます。
Man,Woman,NoneはPersonクラスのstaticなメソッドを介して生成されるものとします。
Man,Woman,Noneのコンストラクタのアクセシビリティをそれぞれ
public,protected,privateにしております。
publicなManは生成されます。
protectedなWoman,privateなNoneは生成できません。
こういうときはコンストラクタのアクセシビリティをinternalにすればいいようです。
こういうinternalの使い方は正しいでしょうか?


673 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 20:20:56 ]
クラスライブラリを作ってるなら全然アリ
単一プロジェクトなら無意味

674 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 20:29:34 ]
他のアセンブリに公開するつもりがないならinternalでいいんじゃね

675 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 20:49:20 ]
Man,Woman,Noneクラスは外部に見せる必要がないならこういう手もある。
やりたいこととは違うと思うがクラス自体を見えなくすればコンストラクタの隠蔽は不要になる。
public enum PersonType { Man, Woman, None };

public class Person {
 public static Person GetInstance(PersonType x) {
  switch (x) {
   case PersonType.Man: return new Man();
   case PersonType.Woman: return new Woman();
   default: return new None();
  }
 }
 private class Man : Person { public Man() {} }
 private class Woman : Person { public Woman() {} }
 private class None : Person { public None() {} }
}

class Startup {
 static void Main() {
   Person man = Person.GetInstance(PersonType.Man);
   Person woman = Person.GetInstance(PersonType.Woman);
   Person none = Person.GetInstance(PersonType.None);
 }
}




676 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 20:53:36 ]
C++から入ると、friendが無いのがちょっと不便に感じるね。

677 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 20:56:41 ]
friendは邪悪だからなくていいよ。

678 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 21:22:41 ]
partial使えば内部型でもファイルを分けて書けるよ

679 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 21:31:51 ]
>>676
主にテスト用途だけどFriend Assemblyってのがある。
通常はprivateな型やメソッドをテストするのに使う。

680 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 21:57:45 ]
>>675

コレって変だと思うのはオレだけ?



681 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 22:03:44 ]
お前だけ
Comparer<T>.Defaultとか例を挙げたらキリがない

682 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 22:10:23 ]
ああすまんComparer<T>.Defaultは違うね
Stream.Null(実際の型はStream+NullStream)とか

683 名前:デフォルトの名無しさん [2008/06/04(水) 23:40:00 ]
>>680
君だけではないよ。
Factoryってこうやらないだろ?



684 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 23:59:22 ]
XmlReader.Createとかあるでしょ
一応MS的にはこういうのも「ファクトリメソッド」と呼ぶらしい

685 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 00:09:09 ]
どこが変だとか、どうあるべきかとか書いてくれないと答えようがない

GetEnumerator()の実装例でyield returnを使わないケースで内部クラスを使っている
なおC#の内部クラスはJavaのstaticな内部クラスと同等だから誤解のないよう



686 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 01:55:39 ]
というか基底クラスであるPersonクラスが具体的な派生クラスを知っているのが不自然。
気持ち悪い。

687 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 03:35:19 ]
既定クラスがBuilderを兼ねてるのがいやだったらPersonとファクトリーを分離するのは問題ない。
ただ、拡張可能なようにBuilderやStrategyパターンで作ってゆくと、
クラスやインターフェイスの数がすごいことになるから過剰な汎用化には反対したい。

688 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 04:39:40 ]
突然質問してごめんなさい。

皆さんはC#とかってどうやって勉強してるんですか?
こないだはじめたんだけど、資料が少なくて、学習がすすみません。
いい勉強法とかオススメの書籍があれば教えてください。

ちなみに今は実際にソフトウェア作ってみて、わからないことがあったら調べて・・・って感じです。

689 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 07:52:47 ]
C#で資料が少ないとか言ってたら何も覚えられん。

690 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 08:05:32 ]
MSDNに全て有る

691 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 08:47:31 ]
>563-567 >690
の質問とかぶると思うのですが。
 オープンなC#ソースでストラテジーパターンを実現しているらしき所を見かけたので、
newのコストについて教えてください。

【ソース概要】
・クラスConcreteAとConcreteBは同じParentStategyクラスの派生。
・それぞれのクラスには違う条件でこの方法で状態遷移する。
void override update(){
  ・・・
  if(hoge<hage)
    {parentStategyInstance = new ConcreteA()}
  else
    {parentStategyInstance = new ConcreteB()}
  ・・・
}
・update()は頻繁に発生する。
・各コンストラクタはメンバを一つ更新する一行のみ。
・ガベコレでメモリ使用量のコストが無いことは解ったつもり。

 C++ならキャスト一択の所と思うのですが、JITのおかげでこの書き方が
実は最高にスマートって事になっちゃいないか知りたいんです。

※JITのおかげさまで、簡単にベンチテストが作れない事が問題なんです><
※オブラートに包んだ所にミソがありそうなら、どんどん公開します。 O!S!I! O!S!I!

692 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 09:07:15 ]
Stategy自体選択ミスに1票

693 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 09:08:56 ]
switch最強伝説を更新するんですか? ('A`) >692

694 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 09:14:22 ]
C#自体の選択ミスに1票

695 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 09:19:38 ]
C#のEnum型とswitchの相性の良さは無敵だぉ!! デザパタ厨涙目! プギャー(^0^)9



696 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 09:27:05 ]
>695
私もそう言う事が聞きたかったので、ありがとうございました。

是非参考になるサイトをご紹介頂きたくお願い致します。 m(_ _)m

697 名前:デフォルトの名無しさん [2008/06/05(木) 09:28:56 ]
 ペイントを操作して、絵を描こうとしているのですが、
ドローイングエリアをうまくクリックしてくれません。
どなたか、どうすればいいのか教えていただけませんでしょうか?

[StructLayout(LayoutKind.Sequential)]
public struct RECT {
public int left;
public int top;
public int right;
public int bottom;
}
const uint WM_LBUTTONDOWN = 0x201;
const uint WM_LBUTTONUP = 0x202;

public void RemotePaint() {
IntPtr hWnd;
string sClassName = "MSPaintApp";
string sWindowText = null;
sClassName = "AfxFrameOrView42u";
sWindowText = null;
hWnd = FindWindowEx(hWnd, IntPtr.Zero, sClassName, sWindowText);
SetForegroundWindow(hWnd);
RECT winRect = new RECT();
GetWindowRect(hWnd, ref winRect);
System.Threading.Thread.Sleep(1000);
PostMessage(hWnd, WM_LBUTTONDOWN, 100, 100);
System.Threading.Thread.Sleep(500);
PostMessage(hWnd, WM_LBUTTONUP, 100, 100);
}


698 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 10:39:13 ]
>>566
サブクラスのコンストラクタが動く前に
オーバーライドされた仮想関数が呼び出されるわけで
ちょっと気持ち悪いですね。

699 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 10:41:09 ]
>>691
あまりにも頻繁にUpdateが呼ばれるならやや効率は悪いだろうな。
でも多分誤差レベル。
大抵ほかの処理でそれ以上にメモリ使ってるだろうから。

ただ、作りとしてはぱっとしないな。


700 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 11:18:52 ]
>ぱっとしないな
ぶっちゃけそこなんです。

 上の話の終わり方だと、ConcreteAとConcreteBを継承した大きなクラスを作って
処理部分だけ、switchかdelgate型で置き換え可能にする。
・JITはswitchが強いってことは何処までか?
・一つの処理がどの程度長いとdelgate型が有利になるか?
でバッチテストが作れるなと思ってました。
  っていうか、そういうテストした人の本や社員のサイトがあっても良いなと。

これも「ぱっとしないな」と思ってくれたら、むしろ愉快なんですけどね。

あと
>大抵ほかの処理でそれ以上にメモリ使ってるだろうから。

私の
>・ガベコレでメモリ使用量のコストが無いことは解ったつもり。
への返事でそんなに深い意味は無いですよね?

※最大メモリ使用量より速度優先
※速度ねらいで、ConcreteA、ConcreteBに変数名の重複を許さないぐらい程度は妥協範囲。

701 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 11:22:09 ]
delegateの"e"が抜けてる。

702 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 11:25:28 ]
デリゲートなんかは下手に保持しとくより毎回newした方が速いらしいね

703 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 11:32:07 ]
thx
delegateは捨てましょう。

…C的には、関数ポインタよりnewが早i(ry

JITのnewまわりの最適化を見られれば、それでも疑問は解決できます。

704 名前:702 mailto:sage [2008/06/05(木) 11:36:07 ]
>>703
意味わかってる?
デリゲートが遅いって言ってるんじゃなくて,デリゲート型のオブジェクトをnewするときの話だよ

705 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 11:45:56 ]
>704
ミスリードです>< すいません。

 最初に戻ると、元parentStategyInstanceを持ってるクラスを作った時に、
デリゲート型のオブジェクトをnewできます。

あとは
  if(hoge<hage)
    {exceDelege = ConcreteAexceDelege}
  else
    {exceDelege = ConcreteBexceDelege}

あと、
>※速度ねらいで、ConcreteA、ConcreteBに変数名の重複を許さないぐらい程度は妥協範囲。
これ、 ConcreteA、ConcreteBでずらずら並んで、20個ぐらいあったら一気に話が不毛になるな。('A`)





706 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 11:51:10 ]
だから、逆なんだ。
  if(hoge<hage)
    {exceDelege = ConcreteAexceDelege}
  else
    {exceDelege = ConcreteBexceDelege}

よりも >702は
  if(hoge<hage)
    {exceDelege = new exceDelegater(ConcreteAexce)}
  else
    {exceDelege = new exceDelegater(ConcreteAexce)}

707 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 12:05:13 ]
newの最適化っつっても、確保に関しては基本的にマネージヒープの
未割り当て領域へのポインタをオブジェクトサイズ分進めるだけだぞ。
もちろん頻繁にnewすればGC起動の機会を与えることになるから、
パフォーマンスを気にするならインスタンスのキャッシュは基本ではあるが。

708 名前:691 mailto:sage [2008/06/05(木) 12:34:44 ]
 話を長引かせる様な書き方をしてしまってすいません。
>696 >700-701 >703 >705-706
まで私ですね。

>ConcreteA、ConcreteBでずらずら並んで、20個ぐらい
は失言でしたが、>707にはそこまで考慮して貰ってありがとうございます。
「インスタンスのキャッシュは基本」
これを確認出来て良かったです。

ソースの出所が良い所ぽかったので、>704みたいな事は無いか色々勘ぐったんです。

<ちら裏>
switchしかりnewも、CLRやJITの最適化って非線形で決めてナシなんだな。
皆さん好きですか?
私は、規模が変わるたびにバッチテスト・ベンチマークテストする事になりそうで('A`)

709 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 12:51:30 ]
大抵現実に影響があるようなパフォーマンス問題は
そんな細かい話ではない。


710 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 12:53:58 ]
デリゲートがキャッシュするよりnewってのは初めて聞いたな。
どこででた話?
それかひょっとして非常に使用頻度の低いデリゲートの話?


711 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 12:56:14 ]
>709 けどそれって、C#の開発経験があるって言えるんですか?
毎日好きな言語で遊んで、顧客が限定してきた時だけC#って奴と差がないじゃん。

712 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 13:03:29 ]
visual studioでメッドを全部折りたたむ技ってないですか?

713 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 13:05:09 ]
>>711??
何のことを言ってるんだ?


714 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 13:06:11 ]
こういう事を
>そんな細かい話
って言い捨てること。

715 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 13:18:25 ]
>>714
プロならコストと効率を考えて、大して効果の上がらない箇所の最適化に
拘って労力を注ぐくらいなら、もっと他にすることがあるだろうと思うがな
そういうところをいじくり倒せるのはむしろ趣味で遊んでる奴のほうじゃね



716 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 13:25:04 ]
>715
>プロならコストと効率
そりゃどの言語でもそうだよ。
話をループさせてることに気付いてる? 会話下手?

俺は優しいから"C#でのコストと効率"の経験って解釈してあげるよ。

717 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 13:28:38 ]
>>716
煽る以外に言い返す言葉が見つからないならレスするなよ

718 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 13:33:19 ]
>715のプロとしてのコストと効率の経験と、趣味で遊んでる奴との混同具合が心配です。

719 名前:デフォルトの名無しさん [2008/06/05(木) 13:46:50 ]
usingを使ってStreamReaderを読んでますが、
whileで最後まで読んで、もう一度whileで読みたいのですが、
どうすればいいんでしょうか。

720 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 13:52:18 ]
>>719
こういうこと?
streamReader.BaseStream.Seek(0, SeekOrigin.Begin);


721 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 13:54:51 ]
>>712
アウトラインのことなら、編集 - アウトラインで

722 名前:719 mailto:sage [2008/06/05(木) 14:00:03 ]
>>720
おお!!出来ました!助かりました!
ありがとうございます!


723 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 14:16:28 ]
優先度の問題。
そんな細かい話を気にする必要があることだってあるが、
現実には引っかかるのはもっと別のところであることがほとんど。
もっと気をつけるべきとこは他にいっぱいある。
ってだけの話、無意味とは言わん。


724 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 14:19:08 ]
だろうね。 大概解ってるだろ。
俺、>709って初見じゃないもん。 定期的に湧く厨だと思った。

725 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 14:19:37 ]
条件分岐の効率なんて、文字列処理一発でも挟まれば全く無意味。
だから処理効率より設計の方を重視する方がいい、ほとんどの場合は。




726 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 14:24:24 ]
>>724
誰かさんはこの程度でベンチテスト毎回やるんだと言ってるから相当優先度が高いんだろ
解ってるとは思えん

727 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 14:29:50 ]
次のようにXMLファイルを読み込もうとしてるのですが、
どうやら読み込みに失敗している環境があるらしいのです。
if (File.Exists(Directory.GetCurrentDirectory() + "\\" + "data.xml") == true)
{
 Type[] et = new Type[] { typeof(Data) };
 System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(ArrayList), et);
 using (System.IO.FileStream fs = new System.IO.FileStream(Directory.GetCurrentDirectory() + "\\" + "data.xml", System.IO.FileMode.Open))
 {
  DataList = (ArrayList)serializer.Deserialize(fs);
 }
}
そこでまず、本当にXMLファイルの読み込みに失敗しているのかメッセージボックスでチェックしたいのですが、
try
{
 using (System.IO.FileStream fs = new System.IO.FileStream(Directory.GetCurrentDirectory() + "\\" + "data.xml", System.IO.FileMode.Open))
 {
  DataList = (ArrayList)serializer.Deserialize(fs);
 }
}
catch
{
MessageBox("読み込み失敗");
}
こんな風に書いちゃってもいいのでしょうか?

728 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 14:32:37 ]
その時も文字列処理を引き合いに出してたな。
だいたい、その辺りにC#の用途の向き不向きボーダーラインがあるんかな。
More Effective C++みたいなイメージでは不毛と。

729 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 15:00:24 ]
>>727
肝心の例外情報握り潰したら話にならんだろ
つか今時CurrentDirectoryかよ

730 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 15:02:22 ]
>729は catch の後ろに何もない事を言っている様だ。
try .. catchのヘルプに戻ろう。

731 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 15:35:17 ]
CurrentDirectoryの何が悪いのかわからん。
まさかレジストリやマイドキュメントに保存するのか?W

732 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 15:39:09 ]
カレントにするやつは無知か手抜きだろ

733 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 15:46:27 ]
exeのフォルダならともかく、
カレントは起動方法によって変わるから問題だろ
元々そういう仕様なら関係ないけど

734 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 15:46:32 ]
カレントディレクトリがショートカットとかで変更されたらどうするんだ?

735 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 15:49:56 ]
俺の負けだ。 言わせてくれ。
そこは

   throw; //スルー

だろ。
俺は敗者だ。 だけどなんかスッキリした。

質問者おいてこぼりだが、確かに>728の模範解答は期待。



736 名前:727 mailto:sage [2008/06/05(木) 15:54:41 ]
聞きたいのはCurrentDirectoryのところではなく、
usingステートメントをtryで囲んでもいいのかな?と思ったのです。

読み込み失敗時の例外情報はヘルプでFileStreamを調べたのですが例外の種類がわかりませんでした。
例外の種類はどうやって調べたらいいんでしょうか?

737 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 16:00:52 ]
起きえる例外がわからなければSystem.Exceptionで受ければいいだろ。
起きる例外はMSDNに載ってると思うけど。

738 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 16:13:54 ]
MSDNでFileStream コンストラクタ (String, FileMode)を引いたら例外の種類が書かれていました。
try
{
 using (System.IO.FileStream fs = new System.IO.FileStream(Directory.GetCurrentDirectory() + "\\" + "data.xml", System.IO.FileMode.Open))
 {
  DataList = (ArrayList)serializer.Deserialize(fs);
 }
}
catch(System.Exception e)
{
 MessageBox(e.ToString());
}
としましたが、usingをtryで囲ってもいいのかが知りたいです。


739 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 16:15:36 ]
どうして駄目だと思った?

740 名前:727 mailto:sage [2008/06/05(木) 16:31:25 ]
>>739
usingステートメントって例外が起きた時にステートメント内のdisposeを保証してくれるんですよね。
なのでtry句が複雑にネストしてしまう気がしたからです。
例外が自分の環境でも再現出来ればいいのですが、
他人の環境なので再現できないので、メッセージボックスを仕組んで原因を調べようかなと思いました。

741 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 16:43:55 ]
try句が複雑にネストしてしまう、の意味が分からない。

742 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 16:45:18 ]
usingをtry-finallyに展開してみる。
try { 
 readonly System.IO.FileStream fs = new System.IO.FileStream("data.xml", System.IO.FileMode.Open);
 try { DataList = (ArrayList)serializer.Deserialize(fs); }
 finally { fs.Dispose(); }
} catch(System.Exception e) { 
 MessageBox(e.ToString()); 

usingではcatchしてないからDeserializeで例外が起きた場合は外側のtry-catchブロックが補足する。
問題になるとすればcatchの段階でまだ開いている状態のfsにアクセスしたい場合。
Deserializeとfs.Dispose()の両方で例外が起きた場合。
こういったことが気になるなら、usingを使わずtry-catch-finally構造に変える。

743 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 16:50:38 ]
蒸し返してすまんが、CurrentDirectoryでひとこと。
コンソールアプリならカレントディレクトリは普通に使う。
GUIの場合は意味がない。
exeのあるディレクトリがカレントディレクトリであると考えているなら明らかに間違い。

Directory.GetCurrentDirectory() + "\\" + "data.xml", 
この部分は余計。相対パスならカレントからの相対パスになるので
"data.xml"
だけでで十分。

744 名前:727 mailto:sage [2008/06/05(木) 17:04:26 ]
>>742
分かりやすい説明ありがとうございました。

>>743
参考になりました。ありがとうございます。

745 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 17:21:07 ]
>>742
>Deserializeとfs.Dispose()の両方で例外が起きた場合。
キャッチされるのは後からの例外の方だったよね?



746 名前:デフォルトの名無しさん [2008/06/05(木) 20:00:17 ]
質問させていただきます。
フォーム上に画像を表示するプログラムを書きたいのですが、
イベントとして、フォームが表示されたと同時に描画したいのです。
このような場合、イベントはどのように記述すればよいのでしょうか。
もしくは、イベントを使わない方法があればそちらもご教授ください。

747 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 21:01:16 ]
GUIのプログラムの中で
GUIとは何の関係もないオブジェクトAが居ますが
デバッグ用途でGUIのとあるメッセージウィンドウに文字列を出力させたいとします。
オブジェクトAのようなGUIに無関係なオブジェクトが大量に居るような場面で
それらの出力文字列をGUIのとあるメッセージウィンドウに文字列を出力させたいわけですが。
どうやってそのオブジェクト達とメッセージウィンドウ間をインターフェイスさせればよいでしょうか?
Qtをちょこっと触ったことがあるのですが、その場合はsignal/slot機構を使って、わりと簡単に実現できたのですが
C#の場合はsignal/slotの代わりにeventを使うことになるかと思います。
eventの型となるdelegateをどこで宣言するかなぁ〜と考えるのですが、
どこにも宣言したくありません。
どうすればいいですか?


748 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 21:50:02 ]
メッセージ表示するもしくは通知するTraceListenerでも作ればいいんでない?


749 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 22:16:43 ]
>>735ってどういう意味?

750 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 23:15:02 ]
>>743
逆に言えば、カレントディレクトリがexeのあるディレクトリであることを
プログラム側で保障すれば問題ないということでもある

まあ、その場合でも相対パス使うだろうから、
Directory.GetCurrentDirectory()は不要だけどな

751 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 23:18:57 ]
>>750
Open/Saveダイアログを使うとカレントディレクトリが動いたりしなかったっけ。
以前はまった記憶がある。

752 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 23:37:16 ]
ていうか、おまいらデリゲート使うときに毎回宣言してるの?
自分はDelegate<Result,Param1>とか宣言しといて全部それつかってる。
おかげでFuncとどう整合性とろうか思案中だがなぁorz

753 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 23:42:08 ]
イベントハンドラはEventHandler<TEventArgs>使え

754 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 23:59:49 ]
outやrefに対応できないんだよな…


755 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 00:05:31 ]
class Reference<T> { public T Value { get; set; } }
こんなの作っとけば



756 名前:750 mailto:sage [2008/06/06(金) 00:07:58 ]
>>751
確かに、FileDialog使うときは

RestoreDirectory = true

にしないとまずいな
てか、既定値がfalseとかありえん

757 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 00:48:22 ]
>>755
世の中そうもいかんこともあるのよ。
リモーティングとか。


758 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 01:29:58 ]
>>752
まさにこういう使い方をするために、宣言時に識別子を省略出来たらいいのに。

759 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 04:03:17 ]
>>754
それは知恵が足りないだけ。
できるよ。

760 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 07:08:25 ]
マルチプルアイコンを含むIconインスタンスから、各アイコンを取得したいのですが、
どうすればよいのでしょうか。

761 名前:760 mailto:sage [2008/06/06(金) 07:46:58 ]
自己解決しました。
Icon.Save()でバイナリデータを得て、それを分割した上でIconコンストラクタに与えればいいですね。
もっとスマートな方法がありそうな気もしますが、とりあえずそれでいきます。

762 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 09:30:47 ]
コンストラクタでSize指定だけはできる

763 名前:747 mailto:sage [2008/06/06(金) 12:09:04 ]
>>753
>>イベントハンドラはEventHandler<TEventArgs>使え

どうもです。
こういうのがあるんですね。
ただこれだとEventArgsカスタムクラスをどこかで定義しなければならないです。
EventArgsカスタムクラスに依存するのがなんだかシャクなんで。

たとえば
talkerインターフェイスを用意するとして

interface ITalkter{
        public delegate void printf(string fmt,prams object[] args);
}

こういうことができたら、
ITalkerを継承したクラスを作ってしまえばそれでOKなんですけど
ITalkerインターフェイスに依存するのは納得できるんで。
ただ、interfaceでは型宣言出来ないらしく。。。
なんで出来ないんだろう。。。。
ちなみにtalkerは大量に居ます。
listenerは1個だけっていう想定。

何かいい方法はありませんか。


764 名前:747 mailto:sage [2008/06/06(金) 12:19:13 ]
もしくは
public event void delegate(object sender,params object[] arg) printf;
のような感じで
名無しの型を宣言すると同時に変数定義みたいなことができたらそれだけでいいですね。
こういうことって可能なんでしょうか?


765 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 12:25:10 ]
interface ITalkter{
 string PrintString{ get; }
}

こうとか

interface ITalkter{
 void Print(Action<string> print);
}

こうとか

interface ITalker{
void Print(IListener listener);
}

こうとかじゃだめなの?



766 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 12:46:17 ]
DebugListener/TraceListenerで十分だと思うけど。

767 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 13:27:34 ]
>>763
talkerの役割がよくわからないな。
実際に表示する部分なのか、それともメッセージを発行する元なのか?
それからdelegateをeventと1対1で作らなければいけないとか思ってないか?

768 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 14:49:41 ]
>>761
P/InvokeでExtractIconExとか。

769 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 17:41:02 ]
EventHandler<TEventArgs>を使いたくないのだったら、普通にAction<T>でも使うってのは?
オブジェクトAの中に
public event Action<string, object> printf;
を実装する。

これならカスタムクラス使わんで済むでしょ。

770 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 23:54:33 ]
>>747>>764
デリゲートを使うにはデリゲート型が事前に作成されている必要がある
また、匿名メソッドやラムダ式を使った場合でも、型が自動的に作成されることはない

なので、君がやりたいと考えていること(デリゲートを使用して云々)は恐らく不可能

まあ、本来の目的からすると、出力タイミングをGUI側で制御するなら>>765
オブジェクト側で制御するなら

interface ITalker {
  void SetPrintCallback(Action<string> print);
}

もしくは

interface ITalker {
  void SetListener(IListener listener);
}


>>769
void (object sender, T e) where T : EventArgs

に合致しないデリゲートをイベントにするのはやめれ
# MSのガイドラインなんて知らん、というなら止めはしないが

さらに言うと、
・デリゲート型の名前のサフィックスは EventHandler
・第2パラメータの型(上記 T)の名前のサフィックスは EventArgs
・2つのパラメータ名は上記の通り(sender, e)

771 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 00:33:51 ]
正直msのガイドラインなんか知ったこっちゃ無い


772 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 00:55:01 ]
なら使うな

773 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 06:58:46 ]
ここはCompact Frameworkの質問はおk?

774 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 07:01:03 ]
だから使わないんだって

775 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 07:01:24 ]
C#にからめればOK



776 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 07:03:46 ]
Compact FrameworkでWindows Mobile用2chブラウザを作ってるんだが、
スレ一覧にListViewを使ってるんだ。
ListViewItemCollectionにAddRangeが無くてforeachでスレデータ回してアイテム作ってAddさせてるんだが
どうにも低速なんだ。
AddRangeの代わりになるものは回してAdd以外ないだろうか。

777 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 07:19:17 ]
BeginUpdateやってる?

778 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 07:20:04 ]
>>777
やってる。

779 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 07:53:10 ]
ListViewへの追加はPCでもかなり遅いからなあ
1000件くらいになりそうなときはVirtualModeにしてるけど、Compactじゃ使えないのか

780 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 07:55:15 ]
>>779
2chの板のスレ一覧データだし、700項目くらいPCでやった場合ドパァッって表示されるんだがなあ。
VirtualはCFからは使えないな。

781 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 08:36:09 ]
自分で擬似的なものを描画するのが一番速いのかな

782 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 08:56:03 ]
MSのガイドライン無視したクラスライブラリって見てて恥ずかしい

783 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 09:15:58 ]
Formの上でGridクラス作ったが、20万件でも一瞬で追加・表示されるようになった(´・ω・`)

784 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 09:17:25 ]
ListViewってMSの中の底辺プログラマが作ったんだろうか

785 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 11:12:31 ]
作ったのがだいぶ昔のことで、
ここまで大量のデータが取り扱われるとは考えられなかったからだと思う。



786 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 11:29:20 ]
描いた円を上キーでジャンプさせるにはどうすればいい?

787 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 11:41:02 ]
意味が分かりませんがKeyDownイベントでそういう処理書けばいいんじゃないでしょうか

788 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 11:54:23 ]
いや、そのKeyDownの中身が分からなくって

789 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 11:56:34 ]
KeyDownイベントの中身で円を描く場所を変えて描画処理に投げる

790 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 11:56:35 ]
円をどうやって描いてるかジャンプってどういう意味なのか分からなくって

791 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 11:58:45 ]
プログラミングが下手な人って質問も下手だよね

792 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 12:00:20 ]
ダブルバッファにしろよ
画面ちらつくぞ

793 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 12:20:11 ]
上向きの初速を与えて、一定の下向きの加速度を受けながら運動するようにしたい。
例えば、20進んで一瞬停止して、15進んで一瞬停止して、の繰り返しでいいのか

794 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 12:26:27 ]
v = v0 + gt と言う式を当てはめれば良いだけじゃん

795 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 12:32:28 ]
↑アホ



796 名前:デフォルトの名無しさん [2008/06/07(土) 12:37:46 ]
tをどうすれば?

797 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 12:40:12 ]
タイマーでも使ってろ

798 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 12:48:39 ]
変数tを入れれば位置まで出せる公式があったろ
リアルにやるならtをタイマーを使って現実時間とぴったり合わせりゃいい

799 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 14:58:07 ]
加速度を9.8/sずつ減らせばいいんでね?

800 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 15:15:33 ]
p0 : 初期位置
v0 : 初期速度
g : 重力加速度(約-9.8)
p(t) : 初期時刻からの経過時間tの時の位置

p(t) = p0 + v0*t + 0.5*g*t*t

801 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 15:23:50 ]
つかいつの間に重力加速度の話になったんだ

802 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 15:44:46 ]
>>800
それをwhileに入れれば出来そうだけど、ジャンプ中も左右移動したい

803 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 15:46:52 ]
なんかこのスレ方向性分かんなくなってきたなw


804 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 15:55:23 ]
ジャンプ中左右移動したいなら

new Timer( () =>
{
 位置更新
 描画
});

void KeyDown(...)
{
switch(key)
case ←:
   左にちょっとずらす
...
}
こんな感じで出来るのかな
普通は
while(true)
{
入力ゲット
 位置更新
 描画
 時間が来るのを待つ
}
こんな感じなのかな
よく知らん

805 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 16:46:12 ]
>>802
物理的に表現したいならこんな感じです

a:加速度 v:速度 p:位置 dt:微小時間
とすると、こういう微分方程式が成り立ちます

v(t)/dt = a
p(t)/dt = v(t)

dtはゲームなら1フレームの時間(約16.7ms)と考えるのが普通です
この式を例えば前進差分(ぐぐってね)で微分項を近似するとこうなります

( v(t+dt) - v(t) ) / dt = a
( p(t+dt) - p(t) ) / dt = v(t)

t+dt時間における速度と位置を知りたいので式を変形します

v(t+dt) = dt * a + v(t)
p(t+dt) = dt * v(t) + p(t)

この式をゲームのプログラムなんかではこう表現します

void Update( float dt )
{
 velocity += dt * acceleration;
 position += dt * velocity;
}

で、左右移動したいとき、というのは速度に値が加えられている状態なんで、
velocityに対して基本速度を加えておけばOKです




806 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 16:51:23 ]
って書き終わって凄く後悔した
スレ違いにもほどが

807 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 19:23:48 ]
>805はY方向だけなので、Xは別にしないとだめだぞ。
横への移動を表す加速がY方向へは関係しないとき、XとYは独立して扱えるからよい子のみんなは気をつけよう。

808 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 19:40:07 ]
気をつけるまでも無く自明だと思うのですが!

809 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 21:07:23 ]
型を書いてないからアレだけど
ベクトル型を使うのが普通なんで

810 名前:デフォルトの名無しさん [2008/06/08(日) 10:51:16 ]
過疎

811 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 11:54:09 ]
IDEの使い方に関するおすすめの書籍は?

812 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 17:17:44 ]
ListViewで特定のカラムだけ非表示にすることは出来ますか?
リストには追加するのに非表示にするという、一見無意味な操作なのですがそうしたいのです。

813 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 18:36:00 ]
>>812
ListViewのColumnHeaderで特定のカラムだけWidth=0にすることが出来ませんか?
リストには追加するのに非表示にするという、一見無意味な操作なのですがそうしたければそうすることもできるでしょう。

814 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 19:05:09 ]
>>813
非表示にしたいカラムだけ幅調整不可って出来ますか?
Widthを0にしただけでは幅調整されて見えてしまうので・・・。

815 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 20:00:43 ]
ListViewItemから派生させたクラスで持つようにして
そのオブジェクトをListViewに追加すれば?



816 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 20:12:26 ]
つかTagで十分だろ

817 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 21:27:03 ]
>>815
なるほど。ありがとうございます。
>>816
Tagは使ったこと無いので調べてきます。
ListViewの方ではなくListViewItemの方ですよね?

818 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 22:33:03 ]
ColumnResizingとかそんな感じのイベントあるから、
そこで非表示にしたいカラムが幅調整されそうになったら制限すればいい。

819 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 22:34:14 ]
>>818
なるほどありがとうございます。
Tagを使ったものがまさに用途にあった使い方でした。

820 名前:デフォルトの名無しさん [2008/06/09(月) 10:09:01 ]
pc11.2ch.net/test/read.cgi/tech/1212972014/

821 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 12:07:21 ]
メソッド呼び出し中にキー入力を受け取るにはどうすればいいですか?

822 名前:デフォルトの名無しさん [2008/06/09(月) 12:16:03 ]
>>821

メソッド呼び出しを別スレッドにして、メインスレッドでキー入力を
待てばいいんじゃない? 全然はずしてたらご免。

823 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 12:17:01 ]
モードレスダイヤログ?

全然外してるかも。

824 名前:あにす ◆sGTL1yK0.6 mailto:sage [2008/06/09(月) 18:46:26 ]
DoEvents()?
外してるかな…。

825 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 05:54:09 ]
>>702
for (int i=0; i<1000; i++) Hoge((a) => a + 1);
のようなコードは次にように最適化されるようだ。
HogeDelegate f = null;
for (int i=0; i<1000; i++) {
 if (f == null) { f = (a) => a + 1; }
 Hoge(f);
}



826 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 06:30:01 ]
>>825
ということは>>702はデマってことか

827 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 07:01:43 ]
デマというかもうちょい境界線が上なんだろうな。

828 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 11:32:48 ]
質問
以下のようにListのSyncRootで排他処理を行っている最中に
Listの実体を入れ替えた場合、
この排他でLock開放待ちをしていたほかのスレッドはどうなるのでしょうか?
lock (((ICollection)(mylist).SyncRoot)[

if(xxx){
mylist = new List();
}
}


829 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 12:23:17 ]
とりあえずそんなキモいことするな

mylistの置き換えより先に別スレッドがmylist.SyncRoot取得してたら古い方でロック待ちするし
置き換え後にSyncRoot取得したら新しい方でロック待ちする
古い方でロック待ちに入ったらロック取得したスレッドのlockステートメント終了でロックに入る
新しい方ならロックされてないから待たないでそのままロック取得するだろう

830 名前:828 mailto:sage [2008/06/10(火) 12:45:29 ]
やっぱり駄目ですよね。
コレでは排他処理の意味をなさない。

わかりました!!有難う御座います。


831 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 21:33:47 ]
ListViewのTagで思い出したが、なんでシリアル化してもTagは保持されないのですか?

832 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 21:51:45 ]
何が入ってるか分からないから
保持しても意味がないものが入ってるかもしれないから

833 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 22:53:07 ]
あまり納得できんが、そういうことなんだと納得しておきます。

834 名前:デフォルトの名無しさん [2008/06/10(火) 23:06:12 ]
ADO.NET 2.0で、System.Data.SqlClientを使って、バッチ処理ってどうやんのが普通なの?
なんかSqlCommandSetってのが昔はあったらしいけど、今は隠されてしまったみたいだし、
ていうか、
var cmd = new System.Data.SqlClient.SqlCommand();
cmd.CommandText = "begin transaction;" +
"insert into t values(1,2,3);" +
"insert into t values(2,3,4);" +
....
"commit transaction;";
みたいにカンマで区切っただけのSQL文でも一応できたみたいなんだけど、
C#/ADO.NET2.0/SQL Serverでほかの人はどういう風にバッチ処理してるのか知りたいです。

835 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 23:19:11 ]
ストアドプロシージャです。



836 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 23:21:23 ]
リンクの冒険

837 名前:デフォルトの名無しさん [2008/06/10(火) 23:30:44 ]
>>835
お返事ありがとうございます。
ところで、クライアント側でユーザーが複数項目を選んで、
編集して、それで更新みたいな処理の流れだと、可変引数が
使えないストアドでは対応しきれないのでわないでしょうか?

838 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 23:40:52 ]
>>836
えーと……ゼルダの伝説?

それはともかく、C#のバージョンが分からんが3.0ならLINQがおすすめ
GUIでD&Dするだけでエンティティクラスが作れて、デフォルトでトランザクション処理

LINQ to SQLがSQL Server限定なのがあれだけど

839 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 14:58:07 ]
>>837
「バッチ処理のパラメータを格納しておくテーブル」を作るという手もある。
そのテーブルにINSERTしてからバッチ用のストアドプロシージャを起動して、
ストアドの中でテーブルを読み込んで、それを元に処理を行う。
結果のサマリーも格納するようにすれば、バッチ処理の履歴も兼ねることができる。

840 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 20:40:20 ]
C#中でエクセルのファイルを開こうとすると、下記のエラーが発生します。
ちなみに.NET Framework 2.0を使っています。

System.Runtime.InteropServices.COMExeption(0x80040154):CLSID{00024500-0000-0000-C000-000000000046}を含むコンポーネントのCOMクラスファクトリを取得中に、次のエラーが発生しました。:80040154
3台あるPC(XP)で1台で起こりますがその原因が分かっておりません。
作成したプロジェクトのbin\release以下には3個のCOMと関係がありそうなDLLがあります。
・Interop.Excel.dll
・Interop.Microsoft.Office.Core.dll
・Interop.VBIDE.dll
これら3個を
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe
を使って登録しても結果は同じです。
どういった原因が考えられるでしょうか?



841 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 21:21:57 ]
そこにはExcelがインストールされていないなんてオチじゃないよな。

「00024500-0000-0000-C000-000000000046 80040154」でググって
最初に出てきたところに書いてあった事例がまさにそうだっただけだけど。
forums.msdn.microsoft.com/en-us/netfxbcl/thread/5a338c18-b2e5-44b5-b15a-530d99a34656/

842 名前:840 mailto:sage [2008/06/11(水) 21:26:24 ]
確認させていただきたいのですが、
Excelがインストールされていない環境では、COMを通じたエクセルファイルの操作というのはやはり出来ないものでしょうか?
というのは、
動作確認をした3台のうち
1台にだけExcelをインストールしていたつもりだったのですが、実際には2台にインストールされており、
上記の
System.Runtime.InteropServices.COMExeption(0x80040154):CLSID{00024500-0000-0000-C000-000000000046}を含むコンポーネントのCOMクラスファクトリを取得中に、次のエラーが発生しました。:80040154
このエラーはエクセルがインストールされていないパソコンでだけ起こっていました。
レジストリのCLSIDに無理やりエクセルを登録たところエラーが変わって
System.IO.FileNotFoundException: CLSID {00024500-0000-0000-C000-000000000046} を含むコンポーネントの COM クラス ファクトリを取得中に、次のエラーが発生しました: 80070002。
   場所 NFSAutoGui.Tettou.product(String path)
こういうことになってしまいました。
FileNotFoundExceptionってようするにExcel.exeが見つかりませんよ、ということかと思いますが。

ということで
Excel.exeがインストールされていない状態では、COMを通じたエクセルファイルの操作というのはやはり出来ないものでしょうか?


843 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 21:31:00 ]
>>842
そりゃ、できんわな。それができたら、みんなExcel買ってくれなくなってMSが困っちゃう。

844 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 21:36:37 ]
>>841
>>843
どうも。。。
インストールしてないつもりのPCで動いたと思ってたんで動くかと思っていました。
アホ過ぎ。

ところで
Excelのバージョン10が開発マシンに入っております。
COMの参照設定で、Microsoft Excel 10.0 Object Library のバージョン1.4を設定しているのですが、
これで配布した場合って、Excelのバージョン10.0が入っていないと動かないんですかね?
Excel 2007しか入っていないようなPCでは動かないんですか?


845 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 21:43:55 ]
>>842
だって、そのExcelファイルの操作って、
Excelが持っている機能を呼び出しているだけだ。
普段目にするUIはExcelの1つの顔にすぎない。



846 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 21:59:28 ]
>>844
YES

847 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 22:01:05 ]
解放忘れとかやりまくってそうだな

848 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 22:10:55 ]
こんなこと言ってる奴がまともに作れてるわけないだろ

でバージョン依存したくないならせめてVB.NETにしとけ

849 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 22:15:41 ]
WSHのVBSとか呼び出すのが楽だよ

850 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 22:19:02 ]
>>845
そういうことですね。
>>846
了解しました。
>>847
一応タスクマネージャのプロセスタブにEXCELは居ないので大丈夫かと...

ところで、
開発マシンにEXCEL10しか入っていませんが、
その他のバージョンのEXCELも扱いたい場合に必要になってくるのが
PIAとかいうものなのでしょうか?


851 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 22:40:52 ]
YES

852 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 22:42:04 ]
あんたは質問を有料にしたいわ

853 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 23:58:05 ]
DateTime型のToString()の書式設定はどんな環境の場合に変わるんでしょうか?
たとえば("d")ならカルチャによって変わりますが、
カスタム書式の("yyyy/MM/dd")も環境によって変わるようです。
どんな環境で変わるんでしょうか??

854 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 00:37:13 ]
>>853
質問の意味がよくわからないけど「カルチャが異なる環境で変わる」ということが聞きたいのかな。
CurrentThreadのCurrentCultureとかCurrentUICultureとかを色々変えながら動かしてみると
わかりやすいかもしれない。
わかりにくいかもしれない。

855 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 00:37:53 ]
カルチャによって変わるよ。

"/" はカルチャ依存の日付区切り文字だし、
この世には和暦とかヒジュラ暦とかあるだろ。



856 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 00:47:15 ]
>>854-855
ありがとうございます。
"/"はカルチャ依存なのですね。
カスタム書式なら"/"も表示してくれると思っていたのですが、それすらも期待してはいけないのですね。
自分の環境では再現できない&相手の環境がよくわからないので質問しました。
では"yyyyMMdd"ならどの環境でも期待通り"20080612"になることを前提にしていいのでしょうか?

857 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 01:11:03 ]
>>856
>>855の最後の行を読んで下さい><

DateTimeFormatInfo.InvariantInfoわたしとけばいいよ。

858 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 01:17:15 ]
>>856
CultureInfo ci = new CultureInfo("ja-JP", true);
ci.DateTimeFormat.Calendar = new JapaneseCalendar();
Thread.CurrentThread.CurrentCulture = ci;

Console.WriteLine(DateTime.Now.ToString("yyyyMMdd")); // 200612
Console.WriteLine(DateTime.Now.ToString("yyyyMMdd", DateTimeFormatInfo.InvariantInfo)); // 20080612

859 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 01:17:26 ]
>>857
なるほどありがとうございました!
yyyyでも和暦だと20とかになるんですね。
DateTimeFormatInfo.InvariantInfoで解決しました。

860 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 01:18:12 ]
>>858
ありがとうございました。勉強してみます。

861 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 04:18:07 ]
Compact FrameworkのWebBrowserでDocumentTextにHTML設定するとプログレスバーが出てくるのが嫌なんだけど
非表示にする方法はあるだろうか?
それともHtmlView.dllをラップしたほうが賢明だろうか

862 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 11:14:25 ]
できるだけメモリ使用量を減らすため、
IDisposableを実装したほうが良いクラスの判断でまよっています。

クラスA DataSetをプロパティとして保持
クラスB stringをプロパティとして保持
クラスC byte配列をプロパティとして保持

クラスAはDisposeメソッドを用意してデストラクタから呼び出していますが、
クラスBとCもDisposeを用意したほうが良いでしょうか?

また、stringやbyte配列はDisposeメソッドがないので、どうやってメモリを解放するのかもわからないです。

863 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 11:38:41 ]
全部IDisposable無用

864 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 11:48:12 ]
Disposeを実装するのは、自前でネイティブリソースを扱う時か
Disposeを持つクラスをメンバとして持つ時だけで良い。

それ以外ではメモリの開放はGCにまかせた方が一般的にパフォーマンスは高い。
なんとなくメモリは少ないほうがいいよね的な考えしかないなら逆効果にしかならんよ。

性能を犠牲にしてでもどうしても局所的にワーキングセットの縮小をせまられるのなら
参照をnullにしてGC.Collectを呼び出す。


865 名前:862 mailto:sage [2008/06/12(木) 12:58:06 ]
>>863-864
ありがとうございます。

なるほど、ではどうしても実装するならクラスAだけで
良いのですね。

Webアプリなのですが、特定のページにアクセスが集中し
使用メモリが大きくなってしまうので、できるだけ解放できるところは
解放したかったのです。

処理終了時にGC.Collectを呼び出すことにします。



866 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 13:22:05 ]
GCでオブジェクトが回収されるときの動作は
1 デストラクタ(ファイナライザ)があればそれを実行する
2 メモリの回収
Disposeは1を代行するもので、メモリの回収はあくまでもGCが行う。

867 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 14:22:22 ]
質問
RichTextBoxに画像を挿入したいんですが、無理?

868 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 14:27:55 ]
とりあえずクリップボード越しなら可能

869 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 14:35:42 ]
>>868
サンプルコード貼ってある所知りませんか?

870 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 14:41:09 ]
検索エンジン様が知ってることを知ってる

871 名前:862 mailto:sage [2008/06/12(木) 17:31:00 ]
>>866
ありがとうございます!
だいぶ勘違いしていました。
デストラクタでDispose呼んでも意味ないのですね。

872 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 23:05:15 ]
え、デストラクタとGCは関係ないんだと思ってた…。
じゃあデストラクタが実行されるタイミングってスコープを抜けた瞬間とは限らないの?

873 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 23:10:28 ]
C#でデストラクタ?

874 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 23:13:38 ]
>>872
全然関係ない。スコープと一致させたいときにはusingを使わないといけない。
逆に言えばそれがIDisposeとusingの存在意義。

>>873
まあC# 1.0のころはデストラクタって言っていたはずだし、いいじゃないか。

875 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 23:16:20 ]
DisposeとGCも全く関係ないよ
種も仕掛けもない本当にただの普通のメソッド



876 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 23:18:11 ]
あ、そっか。C#はデストラクタなんてほとんど書かないや。

877 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 23:20:35 ]
本当にどうしてもどうしても必要な場合でなければむしろ書いてはいけない

878 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 23:56:46 ]
IDisposeを実装するときの基本パターン

class DispBase : IDisposable {
 ~DispBase() { Dispose(false); }
 public void Dispose() { Dispose(true); System.GC.SuppressFinalize(this); }
 public virtual void Dispose(bool disposing) {
  if (disposing) { }
 }
}

GCとの関係といえばこの命令だけ。
System.GC.SuppressFinalize(this);
後片付けが終わったからファイナライザは呼び出さなくていいとGCに指示している。
これでファイナライザは呼び出されなくなる。

879 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 00:03:21 ]
パフォーマンスとかメモリとかやたら気にする奴が
こういうでたらめやって事態を悪化させやがるんだよな…

GC呼ぶなんてやめとけよ、特にWebではな…


880 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 00:05:54 ]
余計な一言はいいから、ね

881 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 00:07:23 ]
いつでも回収できるメモリは空いていると同じということを理解できるまでには修行が必要じゃて
セッションにでっかいオブジェクトの参照抱え込んだままで、GC.Collect呼びまくるとかやってそう

882 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 00:08:02 ]
これくらい言っとけばたまたま見かけて疑問を持つ奴が増えて好都合

883 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 00:12:21 ]
そういやあれ不思議なんだよな。
メモリとか異様に気にするのにセッションとかは湯水のように平気で使うのな。


884 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 00:21:12 ]
結局、明確にスコープ抜けたときにリソースを即座に解放して欲しいという場合で複数から参照されてる場合には参照カウント的なものが必要になるんだ世根(´・ω・`)

885 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 00:27:41 ]
COM InteropのRCWがそういう具合になってますね。
もう少しスマートにできなかったものか。



886 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 18:37:51 ]
ファイル書き込みじのフォーマットのことですが。
下記プログラムを実行すると。
=====================
static void Main(string[] args)
{
    StreamWriter sw = new StreamWriter("test.txt",false,Encoding.GetEncoding(932));
    sw.WriteLine("{0,10} => {1}","ABCD",1234);
    sw.WriteLine("{0,10} => {1}","あいうえ",1234);
    sw.Close();
}
=====================
結果として
=====================
      ABCD => 1234
      あいうえ => 1234
=====================
こういった出力になります。
説明を添えると、
ABCDの前に半角スペース文字6文字
あいうえの前に半角スペース文字6文字。
という出力結果になります。

理想としては、
ABCDとあいうえの右端をそろえたいので
あいうえの前に半角スペース文字2文字が入って欲しいのです。(あいうえは8文字とみなす。)

そのようなことは可能でしょうか?
どのようにすれば可能でしょうか?



887 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 21:34:01 ]
ttp://unicode.org/Public/UNIDATA/EastAsianWidth.txt

ここに、UnicodeにおけるCJKの表示幅の規定があるから、
適当に文字列の表示幅を計算して残りを埋めれば良い

888 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 06:42:57 ]
>>886
つまり、いわゆる全角文字を半角文字2文字分として処理したいってことか?
Encoding.GetByteCount()で、各文字コードにおけるバイト数が得られるから、
Shift-JISにおけるバイト数を使ってスペースの文字数を計算すればいいだろう。
こんな感じで。

Encoding sjisEnc = Encoding.GetEncoding(932);
string text = "あいうえ";
string space = new String(' ', 10 - sjisEnc.GetByteCount(text));
Console.WriteLine("{0}{1} => {2}", space, text, 1234);

889 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 14:35:46 ]
インストーラーの起動条件でJ#2.0再配布パッケージを
必須にする方法教えて下さい。

890 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 15:12:29 ]
スレ違い

891 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 17:16:12 ]
いや 殆どC#で一部だけJ#使ってるんすよ…

892 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 17:17:38 ]
いや、その理屈はおかしいだろ…

893 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 20:01:44 ]
その発想はなかったわ
ってかVSスレで聞いたら?

894 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 20:03:22 ]
ほい 逝ってきます。
すまぬかった

895 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 12:56:58 ]
delegateを使用して(使用しなくても同様のことができればいいのですが・・・)

using System;
using System.Collections.Generic;

delegate int getItem();

class DelegateTest
{
public static void Main()
{
List<int> liList = new List<int>();
getItem a = new getItem(A);
a += new getItem(B);
a += new getItem(C);

liList.Add(a());
}

static void A(){return 1;}
static void B(){return 2;}
static void C(){return 3;}
}

この様なプログラムを走らせてliListに[1,2,3]が入って欲しいのです。
(当然ながらというか、)実際には[3]しかはいりません。
マルチキャストデリゲートにしたのは実行したいメソッドの数が実行時にしか分からず
できればif文分岐を少なくしたいと思ったからなのですが、
やはりメソッドを一つ一つ実行しなければ無理でしょうか?
もしくはメソッドの戻り値をリストにして、そのリストを次のメソッドの引数をリストにして、最後にaddrangeでしょうか?
何か上手いテクニックがあれば、どなたかご教授下さい。




896 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 13:04:03 ]
普通にgetItemコレクション作ってforeachでList<int>にAddしてけばよくね?

897 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 13:09:34 ]
デリゲートの引数にコレクション渡してAddしてもらえば?

898 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 14:14:43 ]
>>895
複数の、戻り値を持つデリゲートを一括で管理したい場合は、
マルチキャスト- ではなく、デリゲートのコレクション/リスト などを使う

例えば、こんなふうに

var funcs = new List<Func<int>> { A, B, C };
var values = funcs.Select(f => f()).ToList();

あと、A,B,Cはvoidじゃなくてintな

>>897
それだと、仕様外の操作(複数追加、Insert、Clear、etc.)まで出来てしまうのであまり良くない
自分しか触らないから何でもいいっていうなら構わないけど

899 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 15:34:56 ]
add/remove付きのイベントにしてしまえばマルティキャストっぽく見せられるかも
List<getItem> evlist = new List<getItem>();
public event getItem ItemsEvent {
  add { evlist.Add(value); }
  remove { evlist.Remove(value); }
}

this.ItemsEvent += () => 1;
this.ItemsEvent += () => 2;
this.ItemsEvent += () => 3;
evlist.Select(f => f()).ToList();

900 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 19:01:37 ]
>>897の考え方が一番正当でしょ
コレクションをそのまま渡すんじゃなくて,値を登録するためだけのクラスを作って引数に渡す

901 名前:900 mailto:sage [2008/06/16(月) 19:05:54 ]
考え方は,ってだけだよ
マルチキャストは使うのはあんまり良くないかも

902 名前:895 mailto:sage [2008/06/16(月) 20:14:14 ]
皆さんレスありがとうございます。
とりあえずはコレクションを引数に渡すやり方で実装できました。
ラムダ式を使った方法を教えてくださった898,899さんのやり方は
ちょっと理解ができませんでした・・・申し訳ありません。
デリゲートのコレクションは使ったことがないので勉強してみたいと思います。


903 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 01:28:26 ]
ITfMessagePump(TSFのInterface)をC# Formアプリで使ってる人いる?
メッセージループが競合してどうすりゃいいか、分からんのだが・・・。

904 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 01:32:33 ]
いません

905 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 02:39:48 ]
そうか。だよなー。



906 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 02:53:11 ]
>>903
ご想像通りメッセージループを自前のものに置き換えるしかない。

907 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 03:09:54 ]
その方法を知りたいな

908 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 03:26:33 ]
>>907
メッセージディスパッチャに関してはP/Invokeで動くというか、
普通にITfMessagePump::GetMessage[A,W]でメッセージ取ってきて
P/InvokeでDispatchMessageすればおk。
必要ならWinFormのApplicationクラスのソースでも眺めて見れ。
折角公開されたんだし。WPFももう公開されたんだっけ?
WPFアプリケーションでWinFormsを併用するときのドキュメントも参考になるかも。

というかメッセージディスパッチャにWPFのApplicationクラスを使いつつ
WinFormsを表示するのが楽かもしれんな。XP以降専用になっちまうが。

あとはExecutionContextの実装もちゃんとやっておくとベター。

909 名前:907 mailto:sage [2008/06/17(火) 03:29:53 ]
>あとはExecutionContextの実装もちゃんとやっておくとベター。

SynchronizationContextの間違い。すまそ。
msdn.microsoft.com/ja-jp/library/system.threading.synchronizationcontext.aspx

910 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 03:31:08 ]
ぐあ
909==908ね。

911 名前:908 mailto:sage [2008/06/17(火) 04:00:28 ]
実際試してみた。WPFのApplicationクラスでWinForms。
一応動くことは動くみたい。
この方法ならWPFのSynchronizationContextが使われるので
SynchronizationContextはそのままでOK、なはず。
---------------
// PresentationFramework.dll
// System.Windows.Forms.dll
// WindowsBase.dll
using System;
static class Program
{
  [STAThread]static void Main(){ new CustomApplication().Run(); }
}
public class CustomApplication : System.Windows.Application
{
  protected override void OnStartup(System.Windows.StartupEventArgs e)
  {
    base.OnStartup(e);

    var form = new System.Windows.Forms.Form()
    {
      Width = 640,
      Height = 480,
      Text = "Test Window",
    };
    form.Disposed += (_o, _e) => this.Shutdown();
    form.Show();
  }
}

912 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 04:03:10 ]
>>908
ありがと。
Application.csは見ていて、FPushMessageLoopでGetMessageWしてるのは確認したんだが、
ThreadContextの処理と整合性を取りつつも、
ITfMessagePump::GetMessageする確実な手段が分からなくてね。

ThreadContext周りの処理はinternal/privateがひしめいていて、
うかつに手を出せないし、お手上げ状態。

WPFは要件的に採用は厳しいかな。

いずれにせよ、overrideなり、Filter的なものでGetMessegeを自前の処理を行う仕組みはなさそうだね。

>普通にITfMessagePump::GetMessage[A,W]でメッセージ取ってきて
>P/InvokeでDispatchMessageすればおk。
おkな理由を教えてもらえると嬉しいな。

913 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 04:24:01 ]
>>912
>おkな理由を教えてもらえると嬉しいな。

PresentationFramework.dllが中でやっていることがまさにそれだから、で説明になる?
System.Windows.Threading.Dispatcher.PushFrameImplおよび
System.Windows.Threading.Dispatcher.GetMessageと全く同じことをすれば動く。
で、納得してもらえるんだろうか……

914 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 10:36:47 ]
たとえばNetworkStreamのBeginReadでAsyncCallbackを指定したとする。

このコールバック中にEndReadで例外が発生したらアプリが強制終了してしまう。

この例外をメインスレッド、少なくとも呼び出したスレッドで処理するにはどうすればよろしいでしょうか?

915 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 10:42:52 ]
例外を補足できない?



916 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 14:27:34 ]
>>914
Windowsアプリなら、Control.BeginInvokeでEndRead呼べば
発生する例外もメインスレッドの管轄になるはず
ただ、例外チェインの最後のエラーしか取れないかも

コンソールアプリならしらね

917 名前:デフォルトの名無しさん [2008/06/18(水) 10:06:15 ]
xmlファイルからデータを取得する方法について教えてください。

下記のxmlファイルtest1.xmlを作成しました。
test1.xml
 <?xml version="1.0" encoding="utf-8" ?>
  <Items>
   <Item ID="001">
    <Name>aaaa</Name><Age>10</Age>
   </Item>
   <Item ID="002">
    <Name>bbb</Name><Age>20</Age>
  </Item>
 </Items>

test1.xmlのデータを下記のプログラムで読み込みました。
001  XmlDocument xmlDoc = new XmlDocument();
002  xmlDoc.Load("c:\\test1.xml");
003
004  string wID = "002";
005  XmlNode xmlNode = xmlDoc.SelectSingleNode("//Items/Item[@ID='" + wID + "']");
006  string wName = xmlNode.SelectSingleNode("//Name").InnerXml;
007  string wAge = xmlNode.SelectSingleNode("//Item/Age").InnerXml;

私の予想ではwNameには"bbb"、wAgeには"20"が入ると思っていたのですが
実際にはwNameには"aaa"、wAgeには"10"が入ります。

プログラムの005行目の処理でxmlNodeには確かに<Name>bbb</Name><Age>20</Age>が抽出されています。
006-007行目で、そこから更に//Nameを抽出したのにwNameに"bbb"が入らず"aaa"が入ってしまうのは何故ですか?

また,このような絞込みっぽい処理を行うには、どのようにすれば良いでしょうか。

918 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 10:10:56 ]
そこで // 使っちゃ駄目だろ

919 名前:917 mailto:sage [2008/06/18(水) 10:17:43 ]
>>918
Σ(゚д゚lll)
//はずしたら上手くいきました。

なぜこういう事になるのか勉強して出直してきます。
ありがとうございました。

920 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 19:16:35 ]
javaばっかりでいつも不思議に思っているんですが、
キーワードでas base isとかがかぶったらどういう回避方法があるんでしょうか。


921 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 19:21:07 ]
何を言いたいのか良く分からん

922 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 19:28:48 ]
@as @base @is

923 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 19:36:16 ]
ソース上で既に使っていて、キーワードとかぶっているときはどうなるんでしょうか。
またソースに手を入れて変更しないとダメなんでしょうか。

924 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 19:51:53 ]
1.0から3.0までで変数名に使えないキーワードは増えてなかったと思うが

925 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 20:38:42 ]
c, javaのソースからc#に移植というか少し手を入れるときキーワードの問題が発生しませんか?
特にc#は独自のキーワード名が多いみたいですけど。




926 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 20:41:35 ]
勝手な拡張もいいんですけど、もとのソースの関数名がas, in, baseとかだとどうするんでしょうか?
関数名のAPIの方を変更できないし泣きませんか?
そうするとC#で作る気力も無くなるんですけど。

927 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 20:43:58 ]
C#はjavaじゃないから嫌いだとか
子供に生まれてこなくて良かったとか言い出す奴らは
来てもらわなくてもいいよ


928 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 20:48:49 ]
いや、そういうことじゃないんですけど。
まともにプログラミングの話を出来ないなら、別にいいですよ。
噂どおり、C#の人はC++厨房と変わらないようですねw

929 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 20:53:56 ]
asとかを使いたければ@asとしてくれ
他言語からの移植なんてそう簡単にはいかんよ

930 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 20:54:39 ]
typedefとか#defineが欲しいといいたいのかな?泥沼だと思うがね。
同じ言語の世代間の違いならコンパイルオプションや
pragmaのようなコンパイル指令で逃げるのだろうけど、
他言語からの場合は良識に任せるしかないな。
移植を前提にしたコードでbaseとかinとかselfとか変数に
使ってたらそういう名前を使った奴がアホだろ。


931 名前:デフォルトの名無しさん [2008/06/18(水) 20:56:23 ]
簡単なことだし、ここでちゃんと教えればすむことなのに、「C#の奴はやっぱり変人しかいないよ」とか噂を流される方がいいのかな?
まあ、>>927みたいなしきり屋がいるようなところじゃ、こっちの方がよくわかんないけど。

ここでは>>927みたいなしきり屋に従わなければいけないのですか?

932 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 20:58:36 ]
伊武雅刀の「子供達を責めないで」のオマージュだろね。
フルすぎるネタで若い子にはわからないぞ;;

933 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 21:05:04 ]
>>931
はいはい、とっとと噂を流す仕事に戻ってね。

934 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 21:05:46 ]
これ聞いて落ち着け
ttp://jp.youtube.com/watch?v=YaCkfvm3Oyw


935 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 21:16:13 ]
>>930
Cならともかく、C#みたいなしんまい言語を前提にコードかけるかよw
in selfとかをキーワードに設計する方が多言語からの移植を考えないようなアホじゃないのか。
おまえはいつも、次の言語のキーワードとぶつからないように考えながら書いてるのか?アホはおまえだなw



936 名前:デフォルトの名無しさん [2008/06/18(水) 21:18:57 ]
>>933
Javaの世界ではC#の奴はめちゃ嫌われてるよ。
演算子オーバーロード―がどうとかうるさいしww
VBほどじゃないけど(笑)

937 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 21:21:33 ]
それをC#のスレで言って何がしたいのか分からん
嫌われてるからJavaやれってか?
そんな気を使わなくてもC#一筋なやつの方が少ないだろ

938 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 21:26:14 ]
C#一筋で食っていけるほど仕事がないな。

939 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 21:26:54 ]
Javaの新機能はほぼ全てC#のパクリなのにな

940 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 21:28:49 ]
だから移植前提で独自キーワード入れないでほしいんだけど。またMSの悪い癖(独自拡張?)がでちゃったんですか?

941 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 21:31:26 ]
昔COBOLという言語があってな。
ていうか独自キーワードってなんだよ。
Javaのキーワードが他の言語からの移植を考えて決められてるなんて初耳だ。

942 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 21:33:07 ]
>>940
Javaを使い続ければすむことじゃないのか?

943 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 21:51:19 ]
Javaって $_ みたいな名前定義できなかったっけ?

CLIだとどうなってるんだろ?

944 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 21:59:50 ]
Java屋?
C#出たときあちこち馬鹿にしまくったくせに掌反してパクり始めた奴らだろ?
そりゃあんだけ醜態晒せば嫌って、なかったことにでもせんとなwwww

まあそれはいいとして @ つければキーワードとして扱われなくなるよ。VBなら[]で囲むんだっけかな

相互運用のためにその手の機能を持つことが推奨されてる。ちなみにCILは「どんな識別子でも」持てるから
限界はあるんだけどな

945 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 22:06:13 ]
移植するのに変数名まで同じにしたい痛い人がいるスレはここですか



946 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 22:07:26 ]
実際そんなに独特な予約語多くないだろ
2.0以降に追加されたキーワードは全て文脈次第だし

947 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 22:09:25 ]
あそうそう、コンテキストキーワードも多いっての書き忘れてた

948 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 22:14:03 ]
半年も使わないと忘れちゃうしキーワード多すぎだろ。
いちいち覚えるのとか別に苦痛じゃないんだけど、なんかMSに束縛されてるみたいで嫌じゃないか?
まあ、変なところがあったらコンパイラが叱ってくれるからいいんだけど…

949 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 22:17:23 ]
…半年はさすがに記憶力悪すぎかろくに触ってなかったレベルだろう。

950 名前:デフォルトの名無しさん [2008/06/18(水) 22:19:51 ]
scriptfpとかpackageはそのままでjavaに移植できるの?
java使ったことないんでしらんけど。

そもそも多言語移植の時に変数名そのままで移植できなきゃやだやだやだ
なんてバカかよ。ほとんど意味ないと思うんだが。
そこまでしたいならまずjavaの段階で適宜リファクタリングして移植すりゃ
いいことなんじゃねーの?

951 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 22:21:05 ]
ざっくり読むと
アホがjavaからC#へ移植を試みて文句言ってる
のに食いついたって感じ?
暇だなぁ、お前等

952 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 22:23:01 ]
J#でもつかってろよ

953 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 22:26:15 ]
おお、まさにJ#でこの話終わりだなww

954 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 22:26:25 ]
コンテキストキーワードよりもはるかに気持ち悪いのは,
インターフェイスとか抜きで特定の名前(引数)のメソッドの呼び出しに変換される機能
foreach→GetEnumerator()とかコレクション初期化子→Add(引数任意)とかクエリ式とか

955 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 22:28:08 ]
C#コンテキストキーワードって
get set partial where yield value と後はC#3.0で導入されたクエリキーワードぐらいだよな。

>忘れちゃうキーワード
explicit implicit stackalloc unchecked volatile あたりは時々忘れそうになる。



956 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 22:30:41 ]
add/removeとかも<コンテキストキーワード

957 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 22:30:57 ]
そろそろ次スレ立てたほうがいい?970くらいでいい?

958 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 22:32:24 ]
>>954
java5にも同じのあるじゃないか
Iterable/Iteratorでfor ( : ) をお忘れではないか

959 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 22:35:22 ]
>>958
C#のはダックタイピング的なのでちょっと違う。
多分>>954はその事を知ってて書いてる。

960 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 22:52:38 ]
Whereという名前のメソッドがあればクエリ式のwhere使えるんだよね

961 名前:デフォルトの名無しさん [2008/06/18(水) 22:53:33 ]
>>955
ええ!それは忘れないだろ。
それ、使わないならC#言語じゃなくてもいいでない?
ん・・・このスレのレベルは、理解に苦しむ・・

962 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 22:57:03 ]
>>959
了解、インターフェイスがなくてもメソッドの名前が一致してればOKという話か。
usingはなぜかIDisposable.Dispose()でないと受け付けない。
これもメソッドの名前だけで使わせて欲しいよ。

963 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 22:57:17 ]
>>956
リファレンスのキーワードの項に、
>>955のとクエリキーワードは載ってるけど、add/removeが載ってない
中の人にも忘れられてる?

964 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 23:03:23 ]
add/removeはデリゲートだけでデリゲートでも普通使わないからやっぱり忘れられていると思う。

965 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 23:03:48 ]
C#というのは、Javaと比べるとポインタ演算unsafeとstackallocが売りだと思うんだけど…



966 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 23:07:13 ]
いやなウリだな

967 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 23:08:34 ]
>>964
WinFormでもWPFでもコントロールのイベントはカスタムしてるのがほとんどだぜ

968 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 23:11:15 ]
便利なものはどんどん積極的に組み込んでアピールしていこうっていうのがコンセプトでしょ

969 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 23:13:49 ]
ヘジたんはむしろ抑え役っぽい

970 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 23:17:46 ]
抑え役だし押さえ気味だよなぁ。
というかあいつら基本的に自分たちでだいぶ使ってから出すから
まぁそんなもんかという気はする。

971 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 23:32:38 ]
VBと違ってクエリ演算子のサポートが消極的すぎ
中途半端に付けるくらいならクエリ式なんて無くてよかった
メソッド形式だけだとどうしてもインパクトに欠けるからなあ

972 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 23:32:42 ]
javaがいったいいくつ独自キーワードを取り入れたか

973 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 23:35:19 ]
今のC#のウリは関数型とラムダ式だろ
JavaやC++とくらべて進んでるところは

974 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 23:38:10 ]
次はついに動的型くるかも

975 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 23:42:53 ]
動的型というか、動的っぽい記述が一時的につかるようになる dynamic ブロックになりそうかな。



976 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 23:45:46 ]
GetEnumeratorは仕方ない。
ジェネリックがなかったころだから。


977 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 23:48:39 ]
Mix-in 入れてくれんかな

978 名前:デフォルトの名無しさん [2008/06/18(水) 23:49:20 ]
相変わらずC#はキモイな
どこがどうキモイかを気がついてないようだけどw

979 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 23:54:12 ]
>相変わらずC#はキモイな
何言ってる?
現在進行形でキモクなってんだよっ






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<244KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef