ふらっとC#,C♯,C#(初心者用) Part26at TECH
ふらっとC#,C♯,C#(初心者用) Part26 - 暇つぶし2ch631:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/04/06 03:22:09
IntPtr.Zero

633:デフォルトの名無しさん
08/04/06 03:30:46
if (hModule == IntPtr.Zero) {

>>632
出来ました、ありがとうございます。

VB.NETとC#は方言の関係と思っていましたが、実際はかなり違うのですね…精進します。

634:デフォルトの名無しさん
08/04/06 03:33:40
>>633
[DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
internal static extern int LoadLibrary(string lpLibFileName);

でいいよ。

635:デフォルトの名無しさん
08/04/06 03:34:15
[DllImport("kernel32.dll")]
internal static extern int LoadLibrary(string lpLibFileName);

636:デフォルトの名無しさん
08/04/06 03:34:51
その場合は CharSet = CharSet.Auto のほうがいい。

637:デフォルトの名無しさん
08/04/06 13:00:05
コレクション初期化子ってICollectionとかIDictionaryとか関係なくて
Addという名前のメソッドを呼び出すだけなのか
引数の数も自由でかなり変態的な使い方ができそう

638:デフォルトの名無しさん
08/04/06 16:22:07
フリーウェアだけど、オンラインで公開する場合、
ドボンとかのサンプルをコピペした場合何か断りみたいなのいるのかな?

ソースを見たらバレバレなので黙って使っていいのか悩んでいます。

639:デフォルトの名無しさん
08/04/06 16:37:10
どうせそれも元々MSDNとかその他から引っ張ってきたものが殆どだし
勝手に使っちゃだめだったら何のために公開してるのかわからん

640:デフォルトの名無しさん
08/04/06 16:38:57
>>638
ライセンスに関する記述無いな。どうしても心配ならメール送ってみな

641:デフォルトの名無しさん
08/04/06 17:24:02
サンプルっていうのは「考え方」のサンプルであって
コピペしてそのまま使うなんてナンセンスだろw

642:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/04/06 20:40:56
どちらも間違ってないけど,フィールドが必要なら特別な理由がない限り迷わず前者

644:デフォルトの名無しさん
08/04/06 20:52:47
>>643
フィールドとはボタンなどのコントロールのことでしょうか?
Class1はstringの値を返すHogeメソッドだけです。
複数回呼ぶことがあります。
staticをつけている方がメモリの確保など無駄なパフォーマンスがなくて
良さそうかなと思ったのですが、普通は前者なんですね。

645:デフォルトの名無しさん
08/04/06 20:55:09
よく分からないうちは,staticを付けた変数は使わないものと思っておk

646:デフォルトの名無しさん
08/04/06 20:57:28
>>640
あのコードに独創性を垣間見たんですね、わかります

647:デフォルトの名無しさん
08/04/06 22:09:24
C#にはフィールドなんてない。

648:デフォルトの名無しさん
08/04/06 22:10:56
staticとかってooの理想概念から外れてるよね。
staticメソッドばっかりになったらCで書いてるのと変わらないし。
ここら辺がoopの限界なのかな。
そろそろ次の新しい概念出てきてもいい頃だな。

649:デフォルトの名無しさん
08/04/06 22:20:15
>>647
お前は何を言ってるんだ

650:デフォルトの名無しさん
08/04/06 22:24:45
>>647
C#にフィールドはあるんだよ。

651:デフォルトの名無しさん
08/04/06 22:30:24
ごめん間違った、フィヨルドだったわ

652:デフォルトの名無しさん
08/04/06 22:32:31
>>648
制限付きのクラスオブジェクトと考えれば別に不自然とも思えないけど

653:デフォルトの名無しさん
08/04/06 22:33:22
おもろない

654:デフォルトの名無しさん
08/04/06 22:42:32
>>652
クラス名の飾りがついただけのグローバル関数/変数とも考えられる

655:デフォルトの名無しさん
08/04/06 22:42:47
この違いってなんでしょう?
下の方だとエラーになるのです

Color.FromArgb(int.Parse((string)new object[]{"-1"}));
Color.FromArgb((int)new object[]{"-1"});

656:デフォルトの名無しさん
08/04/06 22:45:09
上もエラーになるよ

657:655
08/04/06 22:53:16
理由がわかりました
すいません

658:デフォルトの名無しさん
08/04/06 23:58:36
>>652
オブジェクト指向って実世界の”モノ”とは到底かけ離れてるよね?
でもそれに近い概念でインスタンス化させてるのに、staticメソッドはそのまま使えたりしたらなんだかなぁと思う。
よくMathクラスなんかもインスタンス化した方が不自然だ、とか言われるけど
intやifですらオブジェクトと見なそうという言語や思想がある中でとっても違和感を感じずにはいられない。

659:デフォルトの名無しさん
08/04/07 00:16:58
引数だけで結果が決まるならインスタンスは無意味でしょ

660:デフォルトの名無しさん
08/04/07 00:20:32
それはstaticの意味、用途が分かっていないんだと思うが

661:デフォルトの名無しさん
08/04/07 00:52:31
double d = -1.0;などとして、
d.sin()とかd.abs()とかだったら、なんてことは俺も考えたことある。

662:デフォルトの名無しさん
08/04/07 01:23:14
拡張メソッドはリフレクション使えないから駄目とか?

663:デフォルトの名無しさん
08/04/07 09:21:22
「フィヨルドの恋人」
     主演:大泉洋

664:デフォルトの名無しさん
08/04/07 09:43:47
すみません、SourceGridというグリッドコントロールを使ってプログラムを作っているのですが、
コントロールの初期化について分からないことがあるので教えてください。

プログラムの構成は、ひと月ごとにその月のすべての日の行をグリッド上に表示していくような感じです。
現在表示すべき(グリッドが描画時に情報として用いる)年/月は、staticな変数に記録して管理しています。
ここで、そのstaticな変数を変化させてみても
(たとえば2008/4の状態から、ひと月前の状態にして2008/3とする)、
変数自体は変化するもののフォーム上のグリッドの表示に変化は見られません。
Update()なども試みてみましたが、反応なしです。

このような場合、どうすればグリッドの表示を更新することができるでしょうか?

665:デフォルトの名無しさん
08/04/07 09:53:41
こんにちは。
エクスプローラーのリストビューのタイプの変更を行いたく思い、少し調べているのですがよくわからない部分があるので質問させてください。

URLリンク(yokohama.cool.ne.jp)
を読んでタイプの変更は出来そうなのですがWindows Vistaの特大アイコンなどはどのようなメッセージを送ればいいのかわからないのです。
ヒント等ご教授戴ければ幸いです。

666:デフォルトの名無しさん
08/04/07 13:27:25
>>664
>現在表示すべき(グリッドが描画時に情報として用いる)年/月は、staticな変数に記録して管理しています。

これほんと?
これだと複数コントロール貼って使う場合とかにまずいからこういう設計にしないと思うんだけど。
何か勘違いしてない?俺が作るとしたらプロパティで実装するけどなぁ。

667:デフォルトの名無しさん
08/04/07 13:49:34
・あるクラスA,B,Cが内部クラスを持っていて、
その内部クラスのフィールド変数の品揃えは未定だけど、
フィールド変数を使っての処理は決まっている。

・クラスA,B,Cごとに内部クラスの品揃えに違いがある。

このような場合、どうしたらすっきりした実装ができますか?

668:デフォルトの名無しさん
08/04/07 14:20:41
A,B.Cは最低限の共通のフィールドを持っていて,それらに対して
共通の処理を行うならプロパティを宣言したインターフェイスを作ってA,B,Cに実装する
処理の目的だけが決まっていて,フィールドをどう使うかはA,B,Cそれぞれで全く違うんだったら
その処理を行うメソッドをインターフェイスに宣言してそれをA,B,Cが実装する形にすれば
きれいかもしれないけど実装の手間は変わらん

669:667
08/04/07 14:41:39
>>668
提案ありがとうございます。

難しいですね。。。
フィールドに抽象メンバなるものを持てて、
抽象メンバ取り出しメソッドみたいなものがあって、
取り出したメンバにたいしてforeachをかける

みたいな実装できたらよかったのですが。。。

670:667
08/04/07 15:04:25
private権限でunion配列を用意し、
値そのものはこの配列に格納することにする。
フィールドのプロパティでその配列にアクセスするようにする。
実際の処理は、配列に対して行なう。
(クラスによってその配列の長さは異なる。)

で実現できそうです。

671:665
08/04/07 16:46:06
>>666
ご返答ありがとうございます。
OOPは初めてなので、きっと勘違いしていると思います。

そのようなプロパティ実装をした非static変数は、
各メソッド内でインスタンス生成してから用いると認識していますが、その場合、
たとえばグリッドコントロールが今表示している年/月を取得したりすることはできるのでしょうか?
それとも、グリッドを配置しているFormのクラス内に、
プロパティ実装した変数をフィールドとして用意するのでしょうか?
後者は、とりあえず試みてはみたものの、やはり変数をいじってもグリッドに変化が見られません。

672:664
08/04/07 16:48:07
>>671の名前欄のレス番を間違えました orz
汚してしまいすみません。

673:デフォルトの名無しさん
08/04/07 17:55:48
this.textBox1.Text = a;//aはフィールド
a = "変更した";
もしかしてこれで変更できると勘違いしてない?

674:664
08/04/07 18:02:29
>>673
思いっきりしてます!
正しくはどうすればよいのでしょうか・・・?

675:デフォルトの名無しさん
08/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
08/04/07 18:42:07
あーそうか。もしかしてソースグリッドの表示年月の変更って
プロパティじゃなくてメソッドかなんかでやってんのかな?

sourceGrid.SetMonth(value);

こんな感じで。
プロパティでなんかありそうだけどね。
面倒だがちょっと導入して試してみるか。

677:675
08/04/07 18:47:07
と思ったが、ユーザー登録が必要だということで面倒だからやめた。

とりあえず>>664はソースグリッドコントロールの年/月を取得もしくは設定しようとしている部分の
コードを晒してくれ。
取得ができないような設計にはなってないと思うんだ。

678:デフォルトの名無しさん
08/04/07 19:27:02
XmlDocument xml = new XmlDocument();
xml.Load(url);

xml["abc"]というノードがあるのか調べるにはどうしたら良いのでしょうか?



679:664
08/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は
URLリンク(sourceforge.net)
からダウンロードできます。)

680:664
08/04/07 19:50:46
追記です。
CurrentYearAndMonth内のSyncYM()メソッドは、OSの現在時刻と合わせるためのもので、
プログラム起動時のみ1度だけ使用しています。

681:678
08/04/07 19:54:29
自決

682:デフォルトの名無しさん
08/04/07 20:00:02
以降はチラシの裏に書けよw

683:デフォルトの名無しさん
08/04/07 20:01:52
>>679
コントロールに値を渡した後は元の変数とは何の関係もなくなるから
更新するときは毎回全部設定しなおす必要がある
それと,フィールドをstaticにするのは誰がどう見ても間違い

684:デフォルトの名無しさん
08/04/07 20:04:25
>>665をお願いします...

685:デフォルトの名無しさん
08/04/07 20:32:25
どう見てもC#の質問に見えないからスルーされたんだろ。

686:664
08/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:デフォルトの名無しさん
08/04/07 21:36:31
>>685
そうでしたか。ごめんなさい。

688:デフォルトの名無しさん
08/04/07 21:44:54
>>678
ノードっつっても色々あるがどのノード?
あとxml["abc"]じゃなくてabcを調べたいんだよな?


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