1 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 11:07:29 ] このスレッドは 「どんなにくだらないC#プログラミングに関する発言でも誰かが優しくレスをしてくれるスレッド」です。 ほかのスレッドでは恐ろしくて書き込めないような低レベル、もしくは質問者自身なんだか意味がよく分からない質問など、 勇気をもって書き込んでください。 内容に応じて、他スレ・他板へ行くことを勧められる、あるいは誘導される場合がありますがご了承下さい。 前スレ ふらっとC#,C♯,C#(初心者用) Part25 pc11.2ch.net/test/read.cgi/tech/1204104280/
630 名前:デフォルトの名無しさん mailto:sage [2008/04/06(日) 02:22:28 ] ポインタ・ハンドルはIntPtr DllImportのCharSet
631 名前:デフォルトの名無しさん mailto:sage [2008/04/06(日) 03:18:25 ] class Program { [DllImport("kernel32.dll", CharSet = CharSet.Unicode)] internal static extern int LoadLibraryW(string lpLibFileName); [DllImport("kernel32.dll")] internal static extern int FreeLibrary(int hModule); [DllImport("kernel32.dll")] internal static extern int GetLastError(); static void Main(string[] args) { int hModule = LoadLibraryW(@"C:\WINDOWS\Resources\Themes\Luna\luna.msstyles"); if (hModule == 0) { int Err = GetLastError(); Console.WriteLine("ロード失敗: {0}",Err); (以下略) >>629-630 遅レスすみません、ありがとうございます。 エラー&H7Eから、ファイルのロードそのものに失敗していたようです。 明示的にUnicodeを指定してintのまま実行すればロード/解放、共に成功しました。 しかしIntPtrにすると「hModule == 0」で『演算子 '==' を 'System.IntPtr' と 'int' 型のオペランドに適用することはできません。』となり実行出来ませんでした。
632 名前:デフォルトの名無しさん mailto:sage [2008/04/06(日) 03:22:09 ] IntPtr.Zero
633 名前:デフォルトの名無しさん mailto:sage [2008/04/06(日) 03:30:46 ] if (hModule == IntPtr.Zero) { >>632 出来ました、ありがとうございます。 VB.NETとC#は方言の関係と思っていましたが、実際はかなり違うのですね…精進します。
634 名前:デフォルトの名無しさん mailto:sage [2008/04/06(日) 03:33:40 ] >>633 [DllImport("kernel32.dll", CharSet = CharSet.Unicode)] internal static extern int LoadLibrary(string lpLibFileName); でいいよ。
635 名前:デフォルトの名無しさん mailto:sage [2008/04/06(日) 03:34:15 ] [DllImport("kernel32.dll")] internal static extern int LoadLibrary(string lpLibFileName);
636 名前:デフォルトの名無しさん mailto:sage [2008/04/06(日) 03:34:51 ] その場合は CharSet = CharSet.Auto のほうがいい。
637 名前:デフォルトの名無しさん mailto:sage [2008/04/06(日) 13:00:05 ] コレクション初期化子ってICollectionとかIDictionaryとか関係なくて Addという名前のメソッドを呼び出すだけなのか 引数の数も自由でかなり変態的な使い方ができそう
638 名前:デフォルトの名無しさん mailto:sage [2008/04/06(日) 16:22:07 ] フリーウェアだけど、オンラインで公開する場合、 ドボンとかのサンプルをコピペした場合何か断りみたいなのいるのかな? ソースを見たらバレバレなので黙って使っていいのか悩んでいます。
639 名前:デフォルトの名無しさん mailto:sage [2008/04/06(日) 16:37:10 ] どうせそれも元々MSDNとかその他から引っ張ってきたものが殆どだし 勝手に使っちゃだめだったら何のために公開してるのかわからん
640 名前:デフォルトの名無しさん mailto:sage [2008/04/06(日) 16:38:57 ] >>638 ライセンスに関する記述無いな。どうしても心配ならメール送ってみな
641 名前:デフォルトの名無しさん mailto:sage [2008/04/06(日) 17:24:02 ] サンプルっていうのは「考え方」のサンプルであって コピペしてそのまま使うなんてナンセンスだろw
642 名前:デフォルトの名無しさん mailto:sage [2008/04/06(日) 20:39:21 ] staticの使い方で質問があります。 Class1にある値を返すメソッドがあります。 例1: public string Hoge(){...} メインフォームで Class1 class1 = new Class1(); string s = class1.Hoge(); 例2: public static string Hoge(){...} メインフォームで string s = Class1.Hoge(); どちらが正しい使い方なのでしょうか?
643 名前:デフォルトの名無しさん mailto:sage [2008/04/06(日) 20:40:56 ] どちらも間違ってないけど,フィールドが必要なら特別な理由がない限り迷わず前者
644 名前:デフォルトの名無しさん mailto:sage [2008/04/06(日) 20:52:47 ] >>643 フィールドとはボタンなどのコントロールのことでしょうか? Class1はstringの値を返すHogeメソッドだけです。 複数回呼ぶことがあります。 staticをつけている方がメモリの確保など無駄なパフォーマンスがなくて 良さそうかなと思ったのですが、普通は前者なんですね。
645 名前:デフォルトの名無しさん mailto:sage [2008/04/06(日) 20:55:09 ] よく分からないうちは,staticを付けた変数は使わないものと思っておk
646 名前:デフォルトの名無しさん mailto:sage [2008/04/06(日) 20:57:28 ] >>640 あのコードに独創性を垣間見たんですね、わかります
647 名前:デフォルトの名無しさん mailto:sage [2008/04/06(日) 22:09:24 ] C#にはフィールドなんてない。
648 名前:デフォルトの名無しさん mailto:sage [2008/04/06(日) 22:10:56 ] staticとかってooの理想概念から外れてるよね。 staticメソッドばっかりになったらCで書いてるのと変わらないし。 ここら辺がoopの限界なのかな。 そろそろ次の新しい概念出てきてもいい頃だな。
649 名前:デフォルトの名無しさん mailto:sage [2008/04/06(日) 22:20:15 ] >>647 お前は何を言ってるんだ
650 名前:デフォルトの名無しさん mailto:sage [2008/04/06(日) 22:24:45 ] >>647 C#にフィールドはあるんだよ。
651 名前:デフォルトの名無しさん mailto:sage [2008/04/06(日) 22:30:24 ] ごめん間違った、フィヨルドだったわ
652 名前:デフォルトの名無しさん mailto:sage [2008/04/06(日) 22:32:31 ] >>648 制限付きのクラスオブジェクトと考えれば別に不自然とも思えないけど
653 名前:デフォルトの名無しさん mailto:sage [2008/04/06(日) 22:33:22 ] おもろない
654 名前:デフォルトの名無しさん mailto:sage [2008/04/06(日) 22:42:32 ] >>652 クラス名の飾りがついただけのグローバル関数/変数とも考えられる
655 名前:デフォルトの名無しさん mailto:sage [2008/04/06(日) 22:42:47 ] この違いってなんでしょう? 下の方だとエラーになるのです Color.FromArgb(int.Parse((string)new object[]{"-1"})); Color.FromArgb((int)new object[]{"-1"});
656 名前:デフォルトの名無しさん mailto:sage [2008/04/06(日) 22:45:09 ] 上もエラーになるよ
657 名前:655 mailto:sage [2008/04/06(日) 22:53:16 ] 理由がわかりました すいません
658 名前:デフォルトの名無しさん mailto:sage [2008/04/06(日) 23:58:36 ] >>652 オブジェクト指向って実世界の”モノ”とは到底かけ離れてるよね? でもそれに近い概念でインスタンス化させてるのに、staticメソッドはそのまま使えたりしたらなんだかなぁと思う。 よくMathクラスなんかもインスタンス化した方が不自然だ、とか言われるけど intやifですらオブジェクトと見なそうという言語や思想がある中でとっても違和感を感じずにはいられない。
659 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 00:16:58 ] 引数だけで結果が決まるならインスタンスは無意味でしょ
660 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 00:20:32 ] それはstaticの意味、用途が分かっていないんだと思うが
661 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 00:52:31 ] double d = -1.0;などとして、 d.sin()とかd.abs()とかだったら、なんてことは俺も考えたことある。
662 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 01:23:14 ] 拡張メソッドはリフレクション使えないから駄目とか?
663 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 09:21:22 ] 「フィヨルドの恋人」 主演:大泉洋
664 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 09:43:47 ] すみません、SourceGridというグリッドコントロールを使ってプログラムを作っているのですが、 コントロールの初期化について分からないことがあるので教えてください。 プログラムの構成は、ひと月ごとにその月のすべての日の行をグリッド上に表示していくような感じです。 現在表示すべき(グリッドが描画時に情報として用いる)年/月は、staticな変数に記録して管理しています。 ここで、そのstaticな変数を変化させてみても (たとえば2008/4の状態から、ひと月前の状態にして2008/3とする)、 変数自体は変化するもののフォーム上のグリッドの表示に変化は見られません。 Update()なども試みてみましたが、反応なしです。 このような場合、どうすればグリッドの表示を更新することができるでしょうか?
665 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 09:53:41 ] こんにちは。 エクスプローラーのリストビューのタイプの変更を行いたく思い、少し調べているのですがよくわからない部分があるので質問させてください。 yokohama.cool.ne.jp/chokuto/urawaza/lv_icon.html を読んでタイプの変更は出来そうなのですがWindows Vistaの特大アイコンなどはどのようなメッセージを送ればいいのかわからないのです。 ヒント等ご教授戴ければ幸いです。
666 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 13:27:25 ] >>664 >現在表示すべき(グリッドが描画時に情報として用いる)年/月は、staticな変数に記録して管理しています。 これほんと? これだと複数コントロール貼って使う場合とかにまずいからこういう設計にしないと思うんだけど。 何か勘違いしてない?俺が作るとしたらプロパティで実装するけどなぁ。
667 名前:デフォルトの名無しさん [2008/04/07(月) 13:49:34 ] ・あるクラスA,B,Cが内部クラスを持っていて、 その内部クラスのフィールド変数の品揃えは未定だけど、 フィールド変数を使っての処理は決まっている。 ・クラスA,B,Cごとに内部クラスの品揃えに違いがある。 このような場合、どうしたらすっきりした実装ができますか?
668 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 14:20:41 ] A,B.Cは最低限の共通のフィールドを持っていて,それらに対して 共通の処理を行うならプロパティを宣言したインターフェイスを作ってA,B,Cに実装する 処理の目的だけが決まっていて,フィールドをどう使うかはA,B,Cそれぞれで全く違うんだったら その処理を行うメソッドをインターフェイスに宣言してそれをA,B,Cが実装する形にすれば きれいかもしれないけど実装の手間は変わらん
669 名前:667 [2008/04/07(月) 14:41:39 ] >>668 提案ありがとうございます。 難しいですね。。。 フィールドに抽象メンバなるものを持てて、 抽象メンバ取り出しメソッドみたいなものがあって、 取り出したメンバにたいしてforeachをかける みたいな実装できたらよかったのですが。。。
670 名前:667 [2008/04/07(月) 15:04:25 ] private権限でunion配列を用意し、 値そのものはこの配列に格納することにする。 フィールドのプロパティでその配列にアクセスするようにする。 実際の処理は、配列に対して行なう。 (クラスによってその配列の長さは異なる。) で実現できそうです。
671 名前:665 mailto:sage [2008/04/07(月) 16:46:06 ] >>666 ご返答ありがとうございます。 OOPは初めてなので、きっと勘違いしていると思います。 そのようなプロパティ実装をした非static変数は、 各メソッド内でインスタンス生成してから用いると認識していますが、その場合、 たとえばグリッドコントロールが今表示している年/月を取得したりすることはできるのでしょうか? それとも、グリッドを配置しているFormのクラス内に、 プロパティ実装した変数をフィールドとして用意するのでしょうか? 後者は、とりあえず試みてはみたものの、やはり変数をいじってもグリッドに変化が見られません。
672 名前:664 mailto:sage [2008/04/07(月) 16:48:07 ] >>671 の名前欄のレス番を間違えました orz 汚してしまいすみません。
673 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 17:55:48 ] this.textBox1.Text = a;//aはフィールド a = "変更した"; もしかしてこれで変更できると勘違いしてない?
674 名前:664 mailto:sage [2008/04/07(月) 18:02:29 ] >>673 思いっきりしてます! 正しくはどうすればよいのでしょうか・・・?
675 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 18:34:12 ] >>674 string _str; public string Str { get { return _str; } set { sourceGrid.DateTime = value; _str = value; } } こんな感じのことがしたいの? 取得ってのは普通に var value = souceGrid1.DateTime; とかでいいと思うんだけども。 ソースグリッドとかいうものを使ったことないから分からんけど。
676 名前:675 mailto:sage [2008/04/07(月) 18:42:07 ] あーそうか。もしかしてソースグリッドの表示年月の変更って プロパティじゃなくてメソッドかなんかでやってんのかな? sourceGrid.SetMonth(value); こんな感じで。 プロパティでなんかありそうだけどね。 面倒だがちょっと導入して試してみるか。
677 名前:675 mailto:sage [2008/04/07(月) 18:47:07 ] と思ったが、ユーザー登録が必要だということで面倒だからやめた。 とりあえず>>664 はソースグリッドコントロールの年/月を取得もしくは設定しようとしている部分の コードを晒してくれ。 取得ができないような設計にはなってないと思うんだ。
678 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 19:27:02 ] XmlDocument xml = new XmlDocument(); xml.Load(url); xml["abc"]というノードがあるのか調べるにはどうしたら良いのでしょうか?
679 名前:664 mailto:sage [2008/04/07(月) 19:48:19 ] >>675 さんのお話を聞くと、自分のコーディングの方向性が 根本的に間違っているような気がしてきました・・・。 ここに書き込む前は、以下のような方法で実現しようとしていました。 namespace下に以下のようなクラスを作成し、 public class CurrentYearAndMonth { public static int cYear; public static int cMonth; public static int cMonthDaysCount; public static void SyncYM() { DateTime dtNow = DateTime.Now; cYear = dtNow.Year; cMonth = dtNow.Month; cMonthDaysCount = DateTime.DaysInMonth(cYear, cMonth); } } これに対して、グリッドを配置しているFormのForm_Loadメソッド内で、 簡潔に書くと以下のように上記の変数を使っています。 for (int r = 1; r <= CurrentYearAndMonth.cMonthDaysCount; r++) { grid1.Rows.Insert(r); grid1[r, 0] = new SourceGrid.Cells.Cell(CurrentYearAndMonth.cMonth.ToString() + "月" + r.ToString() + "日"); } この状態で、Load完了後にcMonthなどの変数値をいじってFormやgrid1をUpdate()などしてみると、 UI上の表示も変化するかなと目論んでいたんですが、やはり間違っているのでしょうか? (ちなみに、SourceGridは ttp://sourceforge.net/project/downloading.php?group_id=178155&use_mirror=nchc&filename=SourceGrid4_11.zip&38810142 からダウンロードできます。)
680 名前:664 mailto:sage [2008/04/07(月) 19:50:46 ] 追記です。 CurrentYearAndMonth内のSyncYM()メソッドは、OSの現在時刻と合わせるためのもので、 プログラム起動時のみ1度だけ使用しています。
681 名前:678 mailto:sage [2008/04/07(月) 19:54:29 ] 自決
682 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 20:00:02 ] 以降はチラシの裏に書けよw
683 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 20:01:52 ] >>679 コントロールに値を渡した後は元の変数とは何の関係もなくなるから 更新するときは毎回全部設定しなおす必要がある それと,フィールドをstaticにするのは誰がどう見ても間違い
684 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 20:04:25 ] >>665 をお願いします...
685 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 20:32:25 ] どう見てもC#の質問に見えないからスルーされたんだろ。
686 名前:664 mailto:sage [2008/04/07(月) 21:00:58 ] >>683 なるほど。そうでしたか。 試行錯誤の結果、 <変数値変更> this.Controls.Remove(grid1); grid1 = new SourceGrid.Grid(); grid1.Refresh(); this.Controls.Add(grid1); <grid1の表示調整> <Form1_Load メソッドでgrid1に対して行われるのと同等の処理> というような流れで、無事初期化・表示更新を行うことができました。 staticについても見直してみます。 貴重なお時間を割いてアドバイスいただき、本当にありがとうございました。
687 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 21:36:31 ] >>685 そうでしたか。ごめんなさい。
688 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 21:44:54 ] >>678 ノードっつっても色々あるがどのノード? あとxml["abc"]じゃなくてabcを調べたいんだよな?