C♯相談室 Part29

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
(#゚ー゚)つ < C#、.NETの話題はこちらでどうぞ。


過去スレは>>2-5あたり。


関連リンク
http://onigiri.s3.xrea.com:8080/csharp/index.php?%5B%5B%A5%EA%A5%F3%A5%AF%5D%5D
2デフォルトの名無しさん:2006/02/03(金) 09:09:05
3デフォルトの名無しさん:2006/02/03(金) 09:09:49
4デフォルトの名無しさん:2006/02/03(金) 09:14:48
母「おい、おまいら!!夕食ができますた。リビングに集合しる!」
父「詳細キボーヌ」
母「今日はカレーですが、何か?」
兄「カレーキターーーーーーーーー」
妹「キターーーーーーーーーー」
姉「カレーごときで騒ぐ奴は逝ってヨシ」
母「オマエモナー」
父 --------終了-------
兄 --------再開-------
妹「再開すなDQNが!それより肉うpキボンヌ」
母「ジャガイモうp」
姉「↑誤爆?」
兄「タマネギage」
父「ほらよ肉>家族」
妹「神降臨!!」
兄「タマネギage」
母「糞タマネギageんな!sageろ」
兄「タマネギage」
姉「タマネギage厨uzeeeeeeeeeeee!!」
母「ageって言ってればあがると思ってるヤシはDQN」
セールスマン「イタイ家族がいるのはこの家ですか?」
母「氏ね」
父「むしろゐ`」
兄「タマネギage」
妹「兄 、 必 死 だ な ( 藁 」
5デフォルトの名無しさん:2006/02/03(金) 10:37:01
>>必 死 だ な ( 藁
だけ読んだ。
6デフォルトの名無しさん:2006/02/03(金) 13:57:17
>>1
なんかWikiがえらいことになってないか
7デフォルトの名無しさん:2006/02/03(金) 14:34:47
使っている人を見たことがない。
8デフォルトの名無しさん:2006/02/03(金) 14:43:57
使っている奴がいないから
9デフォルトの名無しさん:2006/02/03(金) 15:29:08
VS2005でC#を使って開発してます
WindowsアプリケーションでDataGirdViewを使っています
DataSourceにDataTableを割り当ててデータを表示することはできました

表示されたセルのデータ毎に異なった編集用コントロールを割り当てたいです
一つの列で違う編集コントロールを使いたいのでColumnのColumnTypeの設定では実現できません

セル単位で編集用コントロールを設定することはできないのでしょうか?
10デフォルトの名無しさん:2006/02/03(金) 16:26:44
ボタン1が押されたらスレッド開始して処理を始め、
ボタン2が押されたらそのスレッドを停止するコードはどう書けばいいのでしょうか?

private void button1_Click(object sender, System.EventArgs e)
{
  System.Threading.Thread.CurrentThread.Name = "メインスレッド";
  Thread t = new Thread(new ThreadStart(my_sub));
  t.Start();
}

private void button2_Click(object sender, System.EventArgs e)
{
  ????
}

????をどう書けばいいかということです。
t.Abort(); では駄目ですよね
11デフォルトの名無しさん:2006/02/03(金) 16:55:02
>>10
tをメンバ変数(関数の外で定義)に汁。
12デフォルトの名無しさん:2006/02/03(金) 16:59:26
するのはtじゃなくてスレッド用の状態持ったオブジェクトだよな。
止めたいときはそのオブジェクトにとめやがれと通知。
スレッド実行メソッドは定期的にやめろといわれて無いか確認。言われてたら自身で終了。
Abortなんて下策。
13デフォルトの名無しさん:2006/02/03(金) 17:17:03
WebBrowserで表示されている画像を取得するのってどうすればいい?
14デフォルトの名無しさん:2006/02/03(金) 17:25:56
>>9
コードでできるけど?
DataGridViewCellCollection.Itemは読み書き両用プロパティだ。

>>13
URL取得するのが精一杯なような。
GetUrlCacheEntryInfo関数でキャッシュファイルを取得できるかもしれないけど。
1513:2006/02/03(金) 19:03:09
>>14 dクス!!
>URL取得するのが精一杯
う〜む二度手間みたいになってしまうのが残念
GetUrlCacheEntryInfo関数ってのは初めて見たので調べてみます、ありがとうございました
16デフォルトの名無しさん:2006/02/03(金) 20:59:21
ここの最下部に書かれている、
ttp://www.atmarkit.co.jp/fdotnet/csharp_abc2/csabc2_007/cs2_007_03.html#cs0707
>参照型は、objectなどのスーパークラスにキャストしても、もとの型に再キャストすれば、完全にもとどおりの機能を取り戻す。

というのは何故ですか?

17デフォルトの名無しさん:2006/02/03(金) 21:02:26
インスタンスは同じだから。包み紙が変わるだけ。

がそのサイトの説明は間違ってるな。
参照型でも型変換演算をオーバーロードすれば不可逆変換は起こりうる。
18デフォルトの名無しさん:2006/02/03(金) 21:08:58
>>17
ありがとうございました。
感覚的にいうと、派生クラスで定義したメンバ変数などは、
キャストで切り捨てられるイメージだったんですが、
インスタンスが同じならなんでキャストするの?って考えまして、
「より汎用的にオブジェクトを使えるように」って思いついたんですが、
問題ないですか?
19デフォルトの名無しさん:2006/02/03(金) 21:16:05
まあそうだな。
例えば「何でも入れられる」コレクションのためにArrayListがある。
Addの引数はobject型だが、もしobjectにキャストできないのならobject型で無い全てのオブジェクトが入れられなくなってしまう。
20デフォルトの名無しさん:2006/02/03(金) 21:26:18
>>19
ちょうどArrayListクラスのコンストラクタを例に考えていたので、
納得できました。

ありがとうございました。
21デフォルトの名無しさん:2006/02/03(金) 23:49:02
直接の質問で申し訳ないのですが、経験豊富な皆様のご意見をお聞かせ下さい。

会社で開発系オンラインコミュニティの利用を啓蒙し勤務時間中のアクセス許可を勝ち取ろうと思っています
※我が社はネット完全監視+アクセスできるサイトはデフォルト無しで部署単位に許可を得て追加してもらう形式

いくつかの開発系コミュニティがありますが、当初は1つだけと指定されているためどれを選ぶべきか悩んでいます。
目的はC♯を使用した.NET開発全般です

ここも魅力的なのですが、残念ながら2ch.netドメインの許可は下りないので他を探しています。
いくつか調べたところ、@IT(他の技術や記事も期待できる)、GDNJ(歴史が長く検索ヒット率が高い)、VSUG(新興だけどMVP運営なので安心)、MSDNフォーラム(VS2005と連携)あたりが良いと思いました。
この中で最もクオリティの高い情報が集まりそうな場所はどこでしょうか?
どれも魅力的で悩んでいますが、MVPの集まるVSUGか、シームレスなMSDNフォーラムに傾いています。

皆さんのご意見をお聞かせ下さい。
22デフォルトの名無しさん:2006/02/04(土) 00:01:11
レベルにもよるけれど、GDNJのほうがレスポンスは早い気がします。見てる人が多いかんじ。
VSUGはそれと逆。
MSDNはてもとにあるとして
GDNJ>VSUG>@IT>MSDNの順。
でも開発系でネット制限てあほな会社ですね。お察しします。
23デフォルトの名無しさん:2006/02/04(土) 01:06:21
すげぇ会社だ。
24デフォルトの名無しさん:2006/02/04(土) 01:18:35
開発系の会社とは言ってないじゃん
2521:2006/02/04(土) 02:37:01
>>22
参考になります。

会社は金融系で、私は社内システム開発部隊に所属しています。
情報系のサイト(MSDN Onlineなど)であれば比較的簡単に許可が下りるのですが、コミュニケーション系は非常に厳しいです。
過去に掲示板やblogで社内からマズい情報を発信した輩がいて情報管理部署がピリピリきています。

こういう状況下なのですが、やはり生の情報を得られるコミュニティサイトは我々開発の人間にはどうしても必要です。
そこで、いつも部署内で技術サポートやアーキテクトを担当する私と数人が中心となって啓蒙活動を行い、まずは部署内のコンセンサスを取ろうと思っています。
そのために「これは!」と思わせるようなコミュニティが必要なわけです。

これが単なる開発会社であればホントにアホな施策だと思います。
しかし我々の扱う情報が非常に面倒な(大事な)個人情報や資産情報であるため、そうは言えない部分もあります。
ちなみに一般のメッセンジャーは使用不可(社内用のメッセンジャーがある)で、社内メールも全て自動的に上司へコピーが渡るので私用メールはできません。
携帯電話やUSBメモリの持ち込みも厳しく、開発室の入口には専門の警備員(我々開発部隊の不正を監視するための…)がいたりします・・・
26デフォルトの名無しさん:2006/02/04(土) 02:41:19
しかし個人的印象としてはどこにしても結局答えるメンバは大差ないからあんまかわんないんじゃね?
27デフォルトの名無しさん:2006/02/04(土) 03:12:52
ところでさ、なんでスレタイが「C#」じゃなくて「C♯」なのさ。
Cも#も両方2バイト文字ならまだ分かるけど何故に#だけ2バイト文字なのか。
C#で検索してもスレが出てこないからスレ立たないほど人気ないのかと思ったよw
これは直した方がいいよ。
28デフォルトの名無しさん:2006/02/04(土) 03:15:13
C#でスレ立てようとした残骸がまだ残ってるぞ。Part29でスレ検索ってみ。
29デフォルトの名無しさん:2006/02/04(土) 03:33:06
ん?ひょっとして1バイトでスレタイに「#」入れたらスレ立てられないの?
いま調べてみたらどうやら2バイトでも「#」「♯」の二種類あって
前者の「#」の方だとC#としてでも検索出来るようだね。
まんどくせ〜仕様だなぁ…
30デフォルトの名無しさん:2006/02/04(土) 03:45:50
>>27
>>29
半年ROMってろ
31デフォルトの名無しさん:2006/02/04(土) 03:51:35
ROMってろ言いたいだけちゃうんかと。
32デフォルトの名無しさん:2006/02/04(土) 05:23:48
ContextMenuからContextMenuStripに移行するメリットって
DataBindingができることと見栄えがよい程度でしょうか?
RenderModeをSystemにしても微妙に挙動が鈍い、IDEで編集していると画面が
よくバグるわで、ContextMenuのほうが個人的にはよかった。
33デフォルトの名無しさん:2006/02/04(土) 09:29:46
>>26
んだな
漏れもGDNJやらVSUGやらで回答してる
ここの名無しさんにもMSMVPやらINETJやらの構成員が大量にいんだろ
はい、手を挙げて
34yy:2006/02/04(土) 10:24:13
配列を返すWin32のDllを、C#から呼び出す方法が分かりません。

次のような、配列を返すWin32のDllがあり、
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
extern"C"__declspec(dllexport)void 配列を返すWin32のDll(double** 配列のアドレス)
{
(*配列のアドレス)=new double[2];
(*配列のアドレス)[0]=0.1;
(*配列のアドレス)[1]=0.2;
}
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

このdllをC#から呼び出すために次のようなコードを書きました。
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
class 呼び出し側
{
[System.Runtime.InteropServices.DllImport("C:\\配列を返すWin32のDll.dll")]
static extern void 配列を返すWin32のDll(out double[] 配列のアドレス);
static void Main()
{
double[] 配列を受け取る変数;
配列を返すWin32のDll(out 配列を受け取る変数);
}
}
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

この方法では正しくデータを受け取る事が出来ませんでした。
どうか御教授をお願いいたします。
35デフォルトの名無しさん:2006/02/04(土) 11:40:29
>>34
はっきりいえばそんなエクスポート関数作るな。
というか、そんなエクスポート関数をもつdllがあったら文句をいったほうがいい
36デフォルトの名無しさん:2006/02/04(土) 12:24:05
>>34
出会い系の書き込みかとオモタ
3735:2006/02/04(土) 12:29:00
冷静に考えてみるとこれだけじゃ分からんな

・そもそもそのエクスポート関数はメモリリークしてる。
・必要な領域を確保するのは「呼び出す側」がするようにエクスポート関数は
実装すべき(というか一部例外を除きほとんどしなければならないレベル)。
説明すると長くなるんで説明しないが、メモリアローケーションはコンパイル
単位で異なるので不整合が発生するから。

だから修正としてはエクスポート関数を
extern "C" __declspec(dllexport) void Foo(double* pBuf);
C#を
static extern void Foo(double[] buf);
のようにする。
3835:2006/02/04(土) 12:35:49
追記。
C#の名誉のために言っとくが、元のエクスポート関数でも呼び出せない
わけではないぞ。

public extern void Foo(ref IntPtr p);
でポインタをとってきてMarshal.PtrToStructureあたりで戻せばいい。
まぁメモリリークしてるが。それはC#のせいじゃない。
39yy:2006/02/04(土) 12:56:40
35さん、ご助言ありがとうございます。
残念ながら配列を受け取る変数を書き換えなければならないような状況です。
4035:2006/02/04(土) 13:12:19
>>39
んじゃ、開放用のメソッドも同時にエクスポートしているか(COMの方式だな)、静的領域で
開放の必要のないもの(まぁこの場合マルチスレッドで問題がよく発生するんだが)、
領域を特定の方法により確保していて開放することが可能な場合を除き、明確な
「バグ」なので、報告しとけ。コール回数が多い場合メモリがどんどん消費されて
落ちるから。

それと、元のエクスポート関数でもとりあえず追記でやり方は示したんだがな。
配列サイズが固定なら、

struct Foo { double a; double b; }
extern static void Bar(out IntPtr p);



IntPtr p; Bar(out p);
Foo value = MarshalPtrToStructure(p, typeof(Foo));

なんて取得してもいいし、可変なら、Marshal.Copyでマネージ配列にコピーしてから
MemoryStreamあたりにしてBinaryReaderでよめ。
めんどくさいんならunsafeコードでも使え。その場合そのまま書けるだろ。
41デフォルトの名無しさん:2006/02/04(土) 13:27:33
新スレおつかり
42yy:2006/02/04(土) 13:31:36
マーシャリングの事は殆ど何も分かってないんですが
IntPtrのアドレスから値を読んでいってArrayにコピーする作業を
[DllImport("win32.dll")]static extern void Foo(
 [Out,MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.R8, SizeConst = 2,SizeParamIndex = 0)]
 out double[] y
);
のような感じで書けないのでしょうか?
43デフォルトの名無しさん:2006/02/04(土) 14:10:21
>>42
まぁごにょごにょいったけど、それはつまり「そんな定義を持ったDLL関数はまずない」というわけで、
そもそもあなたが望んでいる機能(2段階以上のポインタマーシャリング)は必要性があまりないのね。
そのMarshalAs指定してダメなら難しい気がするけど。
あるいは struct Foo { double[] array; } みたいなのを通してref渡しだとどう?
44yy:2006/02/04(土) 15:15:59
>>43
structのref渡しは駄目でした。
[DllImport("win32.dll")]static extern void 配列を返すWin32のDll(ref double[] 配列のアドレス);
void Main()
{
 double[] y=new double[1024];
 配列を返すWin32のDll(ref y);
}
この様にしたらy[0]だけ正常な値が読み取れました。
45デフォルトの名無しさん:2006/02/04(土) 18:02:19
C#でcsvファイルを読みたいのですが、
自分で字句解析をするしかないのでしょうか?
csvファイルはカンマで要素が区切られていますが、要素を""で囲まれている場合
カンマを含むことができます。
例)
foo,bar,hoge
hoge,"h,gae",hbar
46デフォルトの名無しさん:2006/02/04(土) 18:09:48
そんくらい自分で作れよ

といいたいところだが C# csv でググレばいくらでも見つかる
47デフォルトの名無しさん:2006/02/04(土) 18:25:45
質問です。
匿名デリゲートの内部からはそこから上のスコープの変数がすべて見えますよね。
これは、それらの変数をプログラム終了まで保存しているということなのでしょうか。
ということは、匿名デリゲートを使用する関数内ではローカル変数を使用しすぎない方が
いいのでしょうか。
48デフォルトの名無しさん:2006/02/04(土) 18:38:49
コントロールの生成に時間がかかるので
生成を別スレッドで行い、生成し終わったら
本スレッドに作成したコントロールを追加したいんですが
(本スレッドはUIため、重くしたくない)

別スレッドで作成したコントロールを追加って不可能?
invokeで追加すれば問題なし?

この辺ことがさっぱりわかりません。

動的にformにコントロールを追加したいけど
コントロール作成処理に時間かかるので裏で作ってから
追加したいんだが
49デフォルトの名無しさん:2006/02/04(土) 18:42:12
csvなどの数値データを配列に読み込むプログラムの
サンプルはありますか?

自分で作ったものでは配列の中に文字コードが入力されてしまい
正しく元データが認識されませんでした。
50デフォルトの名無しさん:2006/02/04(土) 18:52:49
>>48 んーたぶんハンドルをTLSに突っ込んでるので、親子関係にしたときにどっかでおかしくなるんじゃないかな。
Let'sTry!
51デフォルトの名無しさん:2006/02/04(土) 19:17:09
>>47
いんや、staticではない。
だからその匿名メソッドがGCの対象になったときに内部の変数も匿名メソッドからの参照がなくなる。

>>48
インスタンス作るだけなら基本的に問題ないよ。問題あるようにも作れるけど。
ハンドルを作るのがUIスレッドじゃないと駄目。
52デフォルトの名無しさん:2006/02/04(土) 20:53:12
すいません。質問じゃないのですが、ちょっとお願いです<(_ _)>

C#教えてくれる人いないでしょうか。
時給1000円払います。

電話とMSメッセンジャーでやりとりします。(ですのでどこに住んでいてもかまいません。
電話代もこちら払いです。)
こっちが色々聞くので、それに答えてほしいです。

ゲームを作りたいので、描画関係の基本を分かってる方希望ですが、
私はC#始めて2週間くらいですので、そんなに高度な知識は必要ないです。

あと、多分時間中そんなに質問しないので、原則暇です。
テレビとか見ながらできる仕事なので楽かも知れません。

いい方なら、長く教えて欲しいです。
お金は始めたばかりの時は即日払いしますが、
長くおつきあい頂く場合は、まとめて週払いとかになっちゃうかもしれません。

何人か募集したいです。

とりあえず興味のある方はメール下さい<(_ _)> →ameri39@mail.じーおーおー.ne.jp
53デフォルトの名無しさん:2006/02/04(土) 21:03:22
>>52
なんだこりゃ
新手の出会い系詐欺か?
5452:2006/02/04(土) 21:10:22
>>53
煤i; ̄□ ̄
なぜ出会い系・・・

いぁ、そんなんじゃないですよ。
5547:2006/02/04(土) 21:24:03
>>51
なるほど。
しかしいずれにせよ、匿名デリゲートが有効の間はすべて保存されるということは変わりがないので
あまりローカル変数は多用しない方がいいんですね。
#使用する変数だけ保存するという仕様だったらよかったんですが。
56デフォルトの名無しさん:2006/02/04(土) 21:28:53
>>55
断固違う。
すべてじゃない、使うものだけ参照を取ってあるんだ。ILDASMで見てみろよ。
そしてそれなら匿名じゃないデリゲートメソッドでも全く変わらん。
5747:2006/02/04(土) 21:43:00
あ、なるほど・・・
じゃあ安心して使っていいということですか。
どうもありがとうございました。
58デフォルトの名無しさん:2006/02/04(土) 22:41:57
>>52
     
   
                 ∧∧
   ∧_∧       ( ゚д゚ ) .∧,,∧
  ( ゚д゚ ) ∧_∧O旦と) ミ ゚д゚ 彡
  (  つ旦 ( ゚д゚ )    O旦と ミ
   と_/   (     つ旦 / (,,,(,,,,,,,う
     || ̄ ̄と__と_)  ̄||
59デフォルトの名無しさん:2006/02/04(土) 23:08:42
Imageオブジェクトが有効かどうか(Disposeされてないかどうか)高速に調べる方法ってありますか?
60デフォルトの名無しさん:2006/02/04(土) 23:11:13
>>59
「高速に」
CPU換装
6159:2006/02/04(土) 23:15:48
例えば「例外を発生させてキャッチ」のように無駄にコストのかかる処理をせずにすむ方法という意味です。
62デフォルトの名無しさん:2006/02/04(土) 23:18:21
┌─────────────────────────┐
│△ >>52 Exceptionはハンドルされませんでした。      ×│
├─────────────────────────┤
│書き込みが厨じみています。                   │
├─────────────────────────┤
│トラブルシューティングのヒント:                  │
│┌───────────────────────┐│
││普通はもう少し考えてから投稿します。          ││
││変な書き込みでないか確認してください。         ││
││この例外に対する一般的なヘルプを参照します。    ││
│└───────────────────────┘│
│ オンライン ヘルプで検索...                    │
├─────────────────────────┤
│アクション:                              │
│詳細の表示...                            │
│例外の詳細をクリップボードに追加               │
└─────────────────────────┘
63デフォルトの名無しさん:2006/02/04(土) 23:40:52
>>62
もまえも暇だなw
64デフォルトの名無しさん:2006/02/05(日) 00:19:29
>>59
そんなことをしなければならないプログラムの構造を見直す
いやマジで
65デフォルトの名無しさん:2006/02/05(日) 00:26:28
>>52
時給1000円じゃ安すぎる
何でも教えれるレベルの人間は時間単価5000円でも安い
途中暇だろうが何だろうが時間拘束を求める以上は対価を支払う必要があるからね

ということで月140時間300万円契約で時給20000円強の私で良ければ、特別価格時給20000円ジャストでお受けしますが
勿論Managed DirectXまで懇切丁寧に指導しますよ
66デフォルトの名無しさん:2006/02/05(日) 00:29:09
ううう・・・。

そんなにすごい人でなくてもいいので、1000円くらいでやってくれる人いないでしょうか…。
67デフォルトの名無しさん:2006/02/05(日) 00:33:58
ギャラの入金の確認がとれないと到底ダメだ罠
68デフォルトの名無しさん:2006/02/05(日) 00:48:05
>>66
おれおれ。おれやるよ。とりあえず前金500時間分振り込んでくれ
69デフォルトの名無しさん:2006/02/05(日) 00:49:06
>>66
たったの1000円で1時間拘束されるなんてまっぴらだ
しかも質問に対して貴様が理解できるまで回答する義務があるんだろ?
そんな糞面倒な義務に対して1000円って人を馬鹿にしてんのか?
70デフォルトの名無しさん:2006/02/05(日) 01:08:04
>>66
自分で本読んで勉強するのを放棄したレベルの奴に教えるには、
大手進学塾の専任講師なみのティーチングスキルが要求されるだろう。

時給1000円ってナメてるのか?
ちなみに、一般的なプログラマの時給は2000円前後。
71デフォルトの名無しさん:2006/02/05(日) 01:30:38
すみません、お金は一円も払えませんが、質問です。

Bitmap コンストラクタ のオーバーロードで
[C#]
public Bitmap(
string filename
);
のfilenameは、
ビットマップ ファイルの名前。
とあるので、

@private string strFileName;
AstrFileName = "skin.bmp";

BBitmap uhoho = new Bitmap(strFileName );
としたんですが、
見つかりませんと怒られてます。

実際には@・AのプロジェクトからBがコーディングされているDLLを呼び出してる感じです。

Bのファイルってどこに置けばいいですか?
@・Aのプロジェクトの出力フォルダとか、全てにファイルを置いてみたんですが。。
あと@・Aのプロジェクトに既存項目の追加から"skin.bmp"を追加しています。
できればBのソースはいじりたくないです。

72デフォルトの名無しさん:2006/02/05(日) 01:32:21
>>71
プロジェクト名\bin\Debugとか
プロジェクト名\bin\Releaseじゃなくて?
73デフォルトの名無しさん:2006/02/05(日) 01:37:52
>>72
大体思い当たる場所に置いてみたんですが、
全部怒られるので、
プロジェクト名\
以下のディレクトリ全部に配置してみたんですがだめでした。
試しに、参照先であるBのDLLのディレクトリにも置いてみましたが。。
ってそもそもBのDLLの参照設定でローカルコピーがtrueなんで、
プロジェクト名\bin\Debug\BDLL
って感じになってます。

はぁ。。。。
夜遅くにすみません。
74デフォルトの名無しさん:2006/02/05(日) 01:49:28
Environment.CurrentDirectoryしてみ。
75デフォルトの名無しさん:2006/02/05(日) 02:05:01
>>74
Environment.CurrentDirectoryの結果は、
プロジェクト名\bin\Debug\
でした。
そこにはもちろん該当ファイルをセットしてます。

今プロジェクトから既存項目の追加で、
プロジェクト名\bin\Debug\
にあるskin.bmpを追加してみたんですが、
追加をした直後に、プロジェクトファイルと同レベルのディレクトリに自動でコピーが作成されているんです。
これ、何か関係あるのかな。。

今は、新規プロジェクトの作成から始めて、

TestApp001(フォルダです)
TestApp001.sln
TestApp001.suo

とあって、
TestApp001(フォルダです)
の中身が、

TestApp001.csproj
TestApp001.csproj.user
bin(フォルダです)
obj(フォルダです)

のようになってます。
skin.bmpまでのパスは↓です。
\My Documents\Visual Studio Projects\TestApp001\TestApp001\bin\Debug\skin.bmp
です。
76デフォルトの名無しさん:2006/02/05(日) 02:07:05
ってもう丸投げみたくなっちゃうので、
もう大丈夫です。
もっと根本的に一個ずつ潰していきます。
ゆっくり寝ちゃってください。

夜遅くにすみませんでした。

ありがとうございましたっ。
77デフォルトの名無しさん:2006/02/05(日) 02:12:02
>>76
単純に考えたら3がおかしいんだろう。
コンストラクタ前でブレークして変数の中身見た方がいいよ
3はいじれないみたいだけど。
78デフォルトの名無しさん:2006/02/05(日) 02:20:22
>>77
あのぅ。
大変申し上げにくいのですが、
プロジェクトに追加したビットマップのプロパティで
ビルドアクションを埋め込まれたリソースにしたら、
いけちゃいました。

「埋め込まれたリソース」にするのが当たり前なんですかね。
無知なあまり、お手を煩わせてしまい、更にこんな結果に。
ほんとごめんなさい。
ゆっくりおやすみなさいませ。
ありがとうございましたっ。
79デフォルトの名無しさん:2006/02/05(日) 02:21:45
Uriを格納するコレクションを探しています。
コレクションにとあるUriが存在するかどうかを高速に判断でき、
なおかつ挿入した順番にアクセスできるというコレクションなんですが

これって自分で作るしかないでしょうか?
80デフォルトの名無しさん:2006/02/05(日) 02:35:57
>>79
System.Collections.Generic.List<System.Uri>
8159:2006/02/05(日) 02:39:22
>>64
うーんそうですね・・・
もう少し考え直してみます
82デフォルトの名無しさん:2006/02/05(日) 02:41:36
>>80
>List.Contains メソッド
>このメソッドは順次検索を実行します。したがって、このメソッドは、O(n) 操作です。

順次検索ってようするにfoeachするのと同じってことですかね・・・
83デフォルトの名無しさん:2006/02/05(日) 02:46:19
>>82
そもそも、「順次アクセス可能」と「高速検索可能」は両立しないから。
一般的に言って、よほど大規模なデータにならん限り、
順次アクセスしたいデータは素直に配列(C#ならList)に格納するのが無難。
84デフォルトの名無しさん:2006/02/05(日) 02:47:20
>>79
IComparerを実装して、Compareメソッドは常に同じ値を返す
これをSortedListかSortedDictionaryのコンストラクタに放り込む

いや適当に言ってみただけだからどうなるか分からんけど
85デフォルトの名無しさん:2006/02/05(日) 02:48:06
>>79 アクセス用と判定用の二つのコレクション使うという手もあり。
86デフォルトの名無しさん:2006/02/05(日) 02:59:28
>>82
private class UriList : List<Uri> {
private Dictionary<Uri, object> dictionary;
}

こんなん作ってAddとかContainsとかオーバーライド。
・・・まぁ継承なんかせんで普通に外に二つもてば?
幸いにしてUriはImmutableなオブジェクトだし。
87デフォルトの名無しさん:2006/02/05(日) 03:00:30
結局のところ、「順次アクセス」と「値の検索」のどっちが
より頻繁に要求されるのかで、最適解は変わる。

両方とも重要なら、>>85の言うように2つのコレクションを
注意深く使うしかない。
88デフォルトの名無しさん:2006/02/05(日) 14:10:59
Cで言うこう言うのはどう実現すれば良いでしょうか。
staticキーワードはメソッド内の変数には使えないみたいなので。

void hoge(){
static int a;

a = (a + 1) % 5;

if(a == 0){
printf("OK\n");
}
}
89デフォルトの名無しさん:2006/02/05(日) 14:12:18
>>88
フィールド変数にしたらいいんじゃね。
90デフォルトの名無しさん:2006/02/05(日) 14:43:14
>>89
しょうもない内部変数のスコープがクラスにまで広がってしまうのがやだなぁと。
91デフォルトの名無しさん:2006/02/05(日) 14:47:41
んじゃ内部クラスを使え
92デフォルトの名無しさん:2006/02/05(日) 14:57:28
>>91
オーバヘッドがいや。

とか言ってたらきりがないのでそうします。ありがとうございました。
93デフォルトの名無しさん:2006/02/05(日) 15:29:18
ある変数の値が変更されたときにイベントを発生させ、
メソッドを実行するようなことはできますか?
ここでいう変数には、ArrayListなどのオブジェクトも含みます。
94デフォルトの名無しさん:2006/02/05(日) 15:33:29
>>93
デバッガでも作ろうとしてますか?
95デフォルトの名無しさん:2006/02/05(日) 15:34:30
オブジェクトの内容でなくて変数の値?
96デフォルトの名無しさん:2006/02/05(日) 16:18:52
変数ねえ・・・
変数の参照が変更されたときなら、フィールドの代わりにプロパティを使えばできるけどねえ
97デフォルトの名無しさん:2006/02/05(日) 16:19:34
>>93
プロパティって知ってる?

手を入れられない既存コードの精査のために必要ならデバッガで十分だと思うけど。
98デフォルトの名無しさん:2006/02/05(日) 16:29:30
>>33
漏れはMSMVPでもINTEAJ構成員でもない
GDNJやVSUGは肩書き無いと書き辛いし大御所が多いから気後れする
ここなら名無しで気軽に書けるから良い
99デフォルトの名無しさん:2006/02/05(日) 16:58:32
>>92
すまんが内部クラスでいったいどう解決出来るのか教えてくれんかの?
100デフォルトの名無しさん:2006/02/05(日) 17:00:10
OrderedDictionaryでも使えよ。
101デフォルトの名無しさん:2006/02/05(日) 17:05:04
>>99
92じゃないが変数とメソッドをその内部クラスのメンバにして
外からその内部クラスのメソッドを呼び出せばいいんじゃねの。
102デフォルトの名無しさん:2006/02/05(日) 17:14:36
ぐは、メソッドごとか…?
それじゃプライベートフィールドのがましな気がする。
103デフォルトの名無しさん:2006/02/05(日) 17:17:01
KeyValueCollectionBase派生を作ってもいい。
104デフォルトの名無しさん:2006/02/05(日) 17:20:13
すまん、>>102だが、元のプログラムよく見てなかった。
内部クラスでいいわ。
105デフォルトの名無しさん:2006/02/05(日) 17:20:42
俺は、

private static class FooLocal { public static int a; }
private void Foo() {
}


とでもするのかと思った
106デフォルトの名無しさん:2006/02/05(日) 17:23:53
賛否両論だろうけど、俺はそういった変数が必要なときは
そのメソッドの直上で宣言してるよ。
そうすればそのメソッドとの結びつきが強調されるし。
ただし当然ちゃんとした名前はつける。
107デフォルトの名無しさん:2006/02/05(日) 17:27:23
>>106
そこでパーシャルですよ。

で、パーシャルクラスの使い心地はどうよお前ら。
108デフォルトの名無しさん:2006/02/05(日) 17:36:18
VSの吐くソースと完全に分離されるのはいいんだが、
実際のとこ、追加だけしか出来ないのでいまいちでもある。
デフォルトでGenerationGapパターンにしてくれんかな、とか。
109デフォルトの名無しさん:2006/02/05(日) 17:37:54
あ、上のはVSでの活用の話ね。
自分のコード単体では使わん。
110デフォルトの名無しさん:2006/02/05(日) 17:42:15
ぱーてぃあるのことか。とさっき気づいた。
111デフォルトの名無しさん:2006/02/05(日) 17:59:05
そういえば、キーだけのコレクションというかディクショナリあったな。
オブジェクト自身の一部とかをキーと見なすやつ。
なんていうクラスだっけか…
112デフォルトの名無しさん:2006/02/05(日) 18:01:00
>>111
Map?
113デフォルトの名無しさん:2006/02/05(日) 18:12:02
リソースのアクセサ自動生成便利だなこりゃ。
114デフォルトの名無しさん:2006/02/05(日) 18:41:53
>>113
うむ。
それに気付くのにだいぶかかったが。
自前でリソースマネージャ宣言してた
115デフォルトの名無しさん:2006/02/05(日) 20:27:18
生のXmlファイルをデータとする簡単なデータベースアプリを作ってみた。

で、ODBCの設定もいらないしこりゃ楽でいいや、
生ならデータ再利用も簡単だし、と思ったんだけど、
実際のところどSystem.Xmlから生ファイルを読み書きする方法で
どのくらいの規模までなら実用可能なんだろうか。

せいぜいmdbの大体程度?
116デフォルトの名無しさん:2006/02/05(日) 20:46:45
>>115
ソース見せてくれ。
117デフォルトの名無しさん:2006/02/05(日) 21:24:25
正直なかなかきついと思うぞ。
何使ってるのか分からんが、使い勝手からいったらDOMだろ?
となるとファイルの入出力がかなり厳しいような気ガス。
メモリ上だけならいいんだが…
※もっと高度にやってるに決まってるだろ!!だったらすまん。
118デフォルトの名無しさん:2006/02/05(日) 21:25:38
ってか、DOMだったらDataSet使うほうがましか…
119デフォルトの名無しさん:2006/02/05(日) 21:25:42
>>117
XPathじゃないっすか?
120デフォルトの名無しさん:2006/02/05(日) 22:29:41
VS2005の場合次の方法で動的にプロパティを設定できますが
http://msdn2.microsoft.com/ja-jp/25zf0ze8(ja-jp,VS.80).aspx

プログラムの中からこのXMLファイルに設定を書き込むにはどうしたらいいんでしょうか
設定を保存しておきたいのです
121115:2006/02/05(日) 22:29:48
いや、まぁ、そんな高度なことはやってないんだけどもさ。
DB内にあるXmlデータをちょこっとインデックス化してXPathで検索できるってだけだし。

例えばXmlDocument を XPathで操作する方法もメモリ上でならかなり高速で動くよね。
でも当然のことながらファイルのIOがボトルネックになると。

メモリ上にインデックスを生成してデータファイルをうまく分散すれば
もっとましになるのかもしれないけど、
俺のトリ頭じゃその"うまく分散"の部分がエレガントに設計できんのさ。

DBのインターフェースからしか扱えないような分散方法では
再利用しやすい生ファイルのメリットがなくなっちまうし、
1ファイル内のデータ構造に"意味"を維持しようとすると
どうしても1ファイルがでかくなって無駄な検索が増えるジレンマ。

あぁ、なんか何言ってのか分らなくなってきたぁ。
122デフォルトの名無しさん:2006/02/05(日) 22:46:26
というか普通に組み込み型DB使えば?
ああ、SQL Server2005 Expressだとローカルファイルならなんか動的にアタッチできるように
なったんだっけか。あれMVPか誰かの提案だったと思うけど、いいね。
123デフォルトの名無しさん:2006/02/05(日) 23:07:22
>>122
まぁそう言われれば、「その通り」でお終いなんだけどさ。
ちょっとXml DBに興味あっただけ。

結局生Xmlは設定ファイル〜小規模DBにしか使えんのかなぁ。
124デフォルトの名無しさん:2006/02/05(日) 23:44:16
>>123
組み込みXML DBならBerkeley DB XMLとかあるよ。
とりあえずホットな話題ではある。RDB方面からのアプローチとか
ネイティブXMLDBとかごにょごにょしてもう分からん状態。
125デフォルトの名無しさん:2006/02/06(月) 01:37:28
C#で作成したプラグインホストにVB.netで作成したプラグインを読み込ませることは可能ですか?
126デフォルトの名無しさん:2006/02/06(月) 01:48:30
可能
つかまず試してみろよそんなもん
127デフォルトの名無しさん:2006/02/06(月) 01:53:09
>>115
実用の範囲は使い方次第で変わってきちゃうから、もまいさんの使い方で実測したらいいんじゃない?
128デフォルトの名無しさん:2006/02/06(月) 02:05:04
たしかFormはShowModalして閉じたら、ちゃんとDisposeして再作成しろ、
いったん閉じたFormをまたShowModalするな、と聞いたような気がするが
PrintPreviewDialogって、Formを継承している割にはそう言う使い方
しますよね。いいんですか?
129デフォルトの名無しさん:2006/02/06(月) 02:07:15
>>126
試したいのですが、VB.netの使い方で難儀している段階でして・・・
インターフェイスを継承したら
「クラスは、ほかのクラスからのみ継承できます。」
なんて変なエラーメッセージが出てきますし・・・
なので試す前に質問をした次第です
130デフォルトの名無しさん:2006/02/06(月) 03:28:47
ToolStripButtonでボタンが押下されてるときとされてない時で
画像を自動的に切り替える事って可能?
131デフォルトの名無しさん:2006/02/06(月) 06:50:53
>>129 なんかこの商売につきものだと思うんだが・・・
何かのやり方とか、本質的でない部分を調べるのに時間がかかるのがだんだんやになってきた。なんかすごい無駄な知識覚えるのに時間無駄にしてるのかなぁと。
132デフォルトの名無しさん:2006/02/06(月) 07:28:59
Image.FromFile で作成したイメージと Image.FromStream で作成したイメージは
何か違いがあるんでしょうか。
前者は ImageAnimator でアニメーションできるんですが、後者は失敗します。
前者はファイルをロックしてしまうので後者を使いたいのですが。
133128:2006/02/06(月) 09:47:26
ShowModalじゃなくてShowDialogでごじゃった。ほほほほ。
134128:2006/02/06(月) 10:15:42
言い忘れてた。1.1です。

ttp://support.microsoft.com/default.aspx?scid=kb;ja;841074

この文書によるとやはり、同じインスタンスは複数回ShowDialogするなという
ことで確定ですが、じゃあPrintPreviewDialogはどうしてるんだろ・・・
Disposeすると直前の入力値が全部パーになるので面倒くさいです。
ちなみに自分は、入力値とFormクラスを管理するコンポーネントクラスを
作って、そっちにShowDialogメソッドを書いて、ペアでクラスを使ってます。
おまいらはどうしてますか?

135デフォルトの名無しさん:2006/02/06(月) 10:20:49
csv形式を少し変更したscv形式にマッチする正規表現について質問です
(scv形式は、csv形式のカンマが(一個以上の)空白文字に変わったもので、次のようなものです
1 "234 5" 6 7

正規表現として次のものを考えてみましたが、
Regex r1 = new Regex("^(?:(?<1>\"[^\"]*\")\\s+?|(?<1>[^\\s]+)\\s+?|\\s+)*");
Match m = r1.Match(line);
これだと m.Groups[1].Captures.Countが3になり最後の7がマッチしません。
正しい正規表現を教えてください
136デフォルトの名無しさん:2006/02/06(月) 11:47:14
>>130
自動的っつーのが意味分からんが
MouseDownとMouseUpでやれば可能
137デフォルトの名無しさん:2006/02/06(月) 11:54:58
>>135
string unko= @"1 ""234 5"" 6 7 ";

Regex re = new Regex( @"""[^""]*""|[^\s]+" );
Match mt = re.Match( unko );

while( mt.Success )
{
  MessageBox.Show( mt.Value );
  mt = mt.NextMatch();
}
138デフォルトの名無しさん:2006/02/06(月) 15:46:07
Closingイベントをとらえられません。
ウィザードを使って作成したデフォルトのwinowsアプリケーションに
private void Form1_Closing(object sender, CancelEventArgs e)
{
MessageBox.Show("さようなら");
}
を追加したのですが、終了時にメッセージボックスがでません。
139138:2006/02/06(月) 15:50:14
自己解決しました
InitializeComponent()メソッド内に
  this.Closing += new CancelEventHandler(Form1_Closing);
を記述して解決でした。
140デフォルトの名無しさん:2006/02/06(月) 16:00:44
VBユーザか?
141デフォルトの名無しさん:2006/02/06(月) 16:20:37
なにやってるんだか・・・
142デフォルトの名無しさん:2006/02/06(月) 16:21:52
>>138は追加したんじゃなく追記しただけじゃないの?
143デフォルトの名無しさん:2006/02/06(月) 17:01:18
PanelにRichTextBoxが乗っかったコントロール、CustomControlを作りたい
Panelを継承したクラスCustomControlがRichTextBoxを保持する形や、
Controlから派生したCustomControlがPanelとRichTextBoxを持つ形が思い浮かんだが

しかし、コントロールの主体はRichTextBoxにしたい、
要はRichTextBox固有のプロパティ等を、CustomControlのそれとして定義し直すのは面倒
かといって、customControl.richTextBox.(ry とするのは何か違うような気がするという事

RichTextBox派生がPanelを持つ形が良いが、
panel.Controls.Add(this); ではうまくいきません

なにか良い方法は無いでしょうか?
144138:2006/02/06(月) 18:31:12
どこが悪かったでしょうか?
145デフォルトの名無しさん:2006/02/06(月) 18:36:58
流れ無視過ぎてすみません。

ArrayListをそっくりそのままDataSetとして扱う事はできますか?
146デフォルトの名無しさん:2006/02/06(月) 18:38:31
意味が分からん
147デフォルトの名無しさん:2006/02/06(月) 18:46:28
うほっ
148デフォルトの名無しさん:2006/02/06(月) 18:55:12
>>145
DataTable生成してコピー汁。
149デフォルトの名無しさん:2006/02/06(月) 18:55:56
ArrayListの中身が、以下のようになってます。

ArrayList al = new ArrayList();
string[] str;

//-------------------

for ~~~~
{
al.add(str);
}
みたいな感じでちょうどテーブルのカラムとレコードみたいになってます。
これをフォームの各項目にバインドするのに、
一度datasetにしてみたいなぁと思い、

alをDataSetに代入(?)みたいな方法はないかなぁと。

とりあえず死んできます。
150デフォルトの名無しさん:2006/02/06(月) 18:56:42
>>148
あ、入れ違いですんません。
ありがとうございました。
逝ってきます。
151デフォルトの名無しさん:2006/02/06(月) 20:03:23
同じクラスで複数のインターフェイスを実装したいとします。
もしそれらの中に同じ名前のメソッド(例えば Start() とか)が存在していた場合、
競合してしまってうまくインターフェイスを実装できませんよね?
このような時、どのようにすれば良いのでしょうか?
(一方のメソッド名を実装段階で変更できれば手っ取り早いのですが・・・)
152最凶VB厨房:2006/02/06(月) 20:13:58
インターフェースの明示的実装
153デフォルトの名無しさん:2006/02/06(月) 20:34:39
>>152
ありがとうございます。
さっそく調べてみます。
154デフォルトの名無しさん:2006/02/06(月) 21:25:45
VBの

Public Sub Quit() Implements Hoge.Exit

みたいなことはC#ではできないの?
155デフォルトの名無しさん:2006/02/06(月) 21:30:41
別名定義よりも明示的実装の方が優れてる、とヘジたんは考えたんだろ
15649:2006/02/06(月) 21:35:02
皆さん華麗にスルーされますね。あきらめませんよ。

csvなどの数値データを配列に読み込むプログラムの
サンプルはありますか?

自分で作ったものでは配列の中に文字コードが入力されてしまい
正しく元データが認識されませんでした。
157デフォルトの名無しさん:2006/02/06(月) 21:41:11
>文字コードが入力されてしまい

お前はcsvじゃなくて普通のテキストファイルも読めないんだろ
158最凶VB厨房:2006/02/06(月) 21:41:29
そんなんでわかるかよw
認識されないっていうソースさらせや。
そもそも配列って何の型の配列やねん。
数値データの形式もどないやねん。
エンコーディングはどないやねん。
159デフォルトの名無しさん:2006/02/06(月) 21:41:45
>>156
サンプル待ってる間に作ったほうが早いんじゃね?
160デフォルトの名無しさん:2006/02/06(月) 21:44:05
>>156はEUCのテキストファイルをメモ帳で開いて「文字化けしてる」と騒ぐPC初心者
161デフォルトの名無しさん:2006/02/06(月) 21:50:43
System.IO.StreamReader reader=new System.IO.StreamReader(path,System.Text.Encoding.ASCII);
int ch=reader.Read();
tx[0]=System.Convert.ToInt32(ch);

配列はfloatで宣言しています。

以前ファイル読み取りのサンプルソースが本にあったので
それを利用して作ろうとしたのですが、型に関する知識が
十分でないためうまくいきませんでした。
162デフォルトの名無しさん:2006/02/06(月) 21:52:29
なにやってるんだかさっぱりわからん。
163デフォルトの名無しさん:2006/02/06(月) 21:53:08
>>137
うまくいきました!
164デフォルトの名無しさん:2006/02/06(月) 21:55:10
とりあえず回答しておこう。

>>161
それは、テキストファイルから文字コードを読み取って配列に代入するコード。
つまりプログラムしたとおりの動作は行われてるよ。安心汁。
165デフォルトの名無しさん:2006/02/06(月) 21:55:39
「CVSファイルを読み取る」ってを考えてみて思ったんだけど、
多次元のListみたいなのってないよね
166デフォルトの名無しさん:2006/02/06(月) 21:57:16
>>165
そりゃCVSだしなぁ
167デフォルトの名無しさん:2006/02/06(月) 21:57:22
>>165
List<List<List<int>>> ……で上手くいかなかったっけ?
168デフォルトの名無しさん:2006/02/06(月) 21:58:00
ん? なんか俺間違えた予感 orz
169最凶VB厨房:2006/02/06(月) 21:58:26
StreamReader作って。
入力した文字をintで。ほぅ。
そのintをintに変換ってなんじゃ。
それをfloatで受け取るんかい。
何したいのやw
170デフォルトの名無しさん:2006/02/06(月) 21:59:45
Dictionary<TKey, TValue>のキーのみのバージョン(STLでいうhash_map)が欲しいなあ

dictionary.add(key, null);
って感じでいつもnull入れてるけどなんかなあ。
171デフォルトの名無しさん:2006/02/06(月) 22:01:20
>>161
マジレスするとStreamReaderにはCSVを扱う機能はない。
17249:2006/02/06(月) 22:01:55
どう見ても勉強不足です。
もう少し勉強し直してから出直したいと思います。

本当にありがとうございました。
173デフォルトの名無しさん:2006/02/06(月) 22:03:34
とりあえず型を意識すれ。
174最凶VB厨房:2006/02/06(月) 22:10:25
using System;
using System.IO;
using System.Text;

public class Entry
{
static void Main()
{
float[] tx=new float[10000];
string path="a.txt";
StreamReader reader=new StreamReader(path,Encoding.ASCII);
while(reader.Peek()!=-1)
{
int i=0;
string s=reader.ReadLine();//1行読む
string[] ss=s.Split(',');// コンマで分割
tx[i]=float.Parse(ss[0]);//とりあえず先頭だけ
Console.WriteLine(tx[i++]);
}
}
}
適当に作っといた。
17549:2006/02/06(月) 22:21:42
>>174さん
わざわざありがとうございます。
ご助言を無駄にせぬよう努力させていただきます
176デフォルトの名無しさん:2006/02/06(月) 22:43:18
C#はWin32APIを直接いじれるらしいですが、それは.NETを使うよりパフォーマンスがよいでしょうか?
ようはC#で作るクライアントアプリの可能性が知りたいのです。
想定しているのは.NET非対応のVBです。
C++ではありません。
C#で作るクライアントアプリが.NET非対応VBで作ったクライアントアプリ並のパフォーマンスがあるのかどうか知りたいのです。
177デフォルトの名無しさん:2006/02/06(月) 22:50:14
何のパフォーマンスだよ
178デフォルトの名無しさん:2006/02/06(月) 23:36:08
>>170
ObjectModelだったかにそれっぽいのがあるが、
自分で継承して作る必要があったような…
179デフォルトの名無しさん:2006/02/06(月) 23:38:44
STL.NETってもう公開されてたっけ?
180170:2006/02/06(月) 23:49:06
mapじゃなくてsetだった

>>178
KeyedCollection ですかね
この名前空間は見たこと無かったです。盲点でした。
これみる限りこれだけでよさそう・・・

class HashSet<T>:KeyedCollection<T,T>{
public HashSet():base(){}
public HashSet(IEqualityComparer<T> comparer):base(comparer){}
public HashSet(IEqualityComparer<T> comparer,int dictionaryCreationThreshold):base(comparer,dictionaryCreationThreshold){}
protected override T GetKeyForItem (T item){ return item;}
}

これはもしかしたらすげえ便利???
181デフォルトの名無しさん:2006/02/06(月) 23:55:48
>>176
パフォーマンスって一言で言っても、開発パフォーマンス、応答速度的なパフォーマンス、メモリを効率的に使うパフォーマンス、各種ハードリソースを上手く使うパフォーマンス・・・などなど。
可能性がどうのってのも意味不明。何が作れるかって話?
.NET非対応VBとかも意味不明。ランタイムとかFrameworkと言語は別もん。
まずは貴様の脳内を整理して、一般的な言葉に直せ。
182デフォルトの名無しさん:2006/02/07(火) 00:04:15
Javaでクライアントアプリを作るとメモリをたくさん使うしスピードが遅いです。
C#の場合はどうですかという話ですよ。
そしてVB6と比べてどうですかということですよ。
183デフォルトの名無しさん:2006/02/07(火) 00:05:16
クライアントアプリの話ですよ。
JavaはVB6のかわりになりません。
C#はどうですか?
184デフォルトの名無しさん:2006/02/07(火) 00:10:08
百聞は一見に如かず
185デフォルトの名無しさん:2006/02/07(火) 00:12:19
C# 2005 Express で作ったDLLをVBAから呼びたくて
COM相互運用機能の登録をON にしてビルドしたら、
「COM相互運用機能に登録できる型を含んでいません」って警告がでます。

以下のソースなんですが、何がまずいでしょうか?

--------------------------------------------
using System;

namespace UtilityMethods
{

interface IAdd
{
long Add(long i, long j);
}

public class AddClass : IAdd
{
public long Add(long i, long j)
{
return (i + j);
}
}
}
--------------------------------------------

ちなみに、同じソースでVS2003で作ったDLLでは、ちゃんと動作しました。
186デフォルトの名無しさん:2006/02/07(火) 00:20:01
>>181 それぐらいの差異を脳内変換できないようじゃ誰とも話できんよ?
187デフォルトの名無しさん:2006/02/07(火) 00:31:27
string baseURL = "http://example.jp/example.xml";
DataSet myDataSet = new DataSet();
myDataSet.ReadXml(baseURL);

のようにやれば http で xml をデータセットに展開する事ができますが、
この HTTP の通信を proxy 経由で行なう方法がわかりません。

明示的に proxy を通過させるにはどのようなメソッドを使えばよい
でしょうか?

アドバイスよろしくお願いします。
188デフォルトの名無しさん:2006/02/07(火) 00:35:27
>>185
COMに公開するクラスにComVisible属性をtrueで指定する。
AssemblyInfo.csでアセンブリ全体としてはComVisible(false)にしてるから。
189デフォルトの名無しさん:2006/02/07(火) 00:43:07
Visual Studio 2005 Express Editionでへローワールドやってみた
デバッグでコンソールが勝手に閉じるんだけど
開きっぱなしにするにはどうすれば良いのですか?w
191デフォルトの名無しさん:2006/02/07(火) 00:51:15
>>188さん
うまくいきました!
マジ ありがとうございます。
192デフォルトの名無しさん:2006/02/07(火) 00:54:41
>>187
HttpWebRequest使ってアクセスして、レスポンスのストリーム使えば良いんじゃね
193キタコレ:2006/02/07(火) 01:02:39
194120:2006/02/07(火) 01:35:57
あのう、おねがいします>>120
195デフォルトの名無しさん:2006/02/07(火) 02:12:19
誰か助けてくれ。
俺はC#の真ん中に入り込んで身動きが取れないのだ。
196デフォルトの名無しさん:2006/02/07(火) 03:20:07
すまんが俺にはそこに辿り着けそうも無い。
ビーコンは無いのか?
197デフォルトの名無しさん:2006/02/07(火) 04:43:53
>>195
private void 終了XToolStripMenuItem_Click(object sender, EventArgs e)
{
Close();
}
198デフォルトの名無しさん:2006/02/07(火) 11:08:27
>>194
調べてる人がいる。
ttp://d.hatena.ne.jp/siokoshou/
199デフォルトの名無しさん:2006/02/07(火) 11:23:02
PanelにBitmapをDrawImageによって描画しています
ある状況でPanelを破棄することを考えていてPanelをDispose();するのですが、メモリがうまく解放されません
Bitmapの方もDispose();してみましたが、やはり解放されません

今はこういう感じの流れです
PanelのBitmapをDispose()
PanelをFormからRemove()
PanelをDispose()
PanelをArrayListで複数保持しているのでArrayListのClear()

またBitmapはpublic Bitmap(int, int, int, PixelFormat, IntPtr);タイプのコンストラクタを用いて作っています

どこかおかしい点や改善点などありましたら教えてください
よろしくお願いします
200デフォルトの名無しさん:2006/02/07(火) 11:29:20
PanelのImageって何だ?
ま、その辺はほっとけばGCがそのうち片づけてくれる領域だ。そんな気にすんな。
// Panelへの参照が残ってれば駄目だけど。
201デフォルトの名無しさん:2006/02/07(火) 11:41:50
>>200
>PanelのImageって何だ?
これはどういうことですか?質問の意味が把握できません。すいません

後Panelへの参照ですか
ArrayListをクリアした時点で消えてると思っているのですが…
コードはこんな感じです
for(int i=0;i<List.Count;i++)
{
Panel p = (Panel)List[i];
p.deleteBitmap(); //BitmapのDispose
Controls.Remove(p);
p.Dispose();
}
List.Clear();
202デフォルトの名無しさん:2006/02/07(火) 12:02:49
流れ無視ですんません。

Windows フォームのモーダル表示で、SDKのドキュメントをほぼぱくり、
親画面となるForm1に以下のように書きました。

private void mnuAbout_Click(object sender, System.EventArgs e)
{
Form2 f = new Form2();
f.ShowDialog(this);//A
}

で、「f」のフォーム、つまりForm2で、以下のように書きました。
public void SetParentText()
{
((Form1)this.ParentForm).Text = "uho"; //@ここで落ちる
}

@のthis.ParentFormが未割当で、NULL参照だって怒られています。
どちらのフォームもSystem.Windows.Foms.Formを継承していて
Aで渡しているthisをForm2で受けてると思うんですが、
@で落ちるので、明示的に受け取ったthisを処理する必要があるのかなぁ?
と思っているのですが、ShowDialogをoverrideするのかな?と思ったのですが、
[C#]
public DialogResult ShowDialog(
IWin32Window owner
);
だそうで、無理でした。
厨ですんません。暇な人教えてください。


203デフォルトの名無しさん:2006/02/07(火) 12:09:33
ownerつってんじゃん
204デフォルトの名無しさん:2006/02/07(火) 12:20:14
>>203
ありがとうございます。
いや、すんませんでした。
205デフォルトの名無しさん:2006/02/07(火) 13:09:01
>>195
つまりお前さんは今C丼になってるってわけだな?
206初心者B:2006/02/07(火) 15:21:03
すんません。
MicrosoftからVC#Express Edition落としてきて、ツールを作ったんだけど、
セットアップ/配置プロジェクトでインストーラ作ってインストール先をユーザに指定させたい。
って思ってます。
MSDN見ながらセットアップ/配置プロジェクトを追加したくても、新しいプロジェクトのダイアログには
それが見つからんのです。
(Windowsアプリケーション、クラスライブラリ、空のプロジェクト、スクリーンセーバースタートキット、ムービーコレクションスタートキットのみ)
http://msdn2.microsoft.com/ja-jp/library/996a3fxs.aspx

ググってみたり、MicrosoftのHPで調べたりしましたが、それらしい情報が無くて困ってます。
プレビュ版の制限なんでしょうか。
よろしくお願いします。
207デフォルトの名無しさん:2006/02/07(火) 16:03:22
208デフォルトの名無しさん:2006/02/07(火) 16:33:45
>>199-201の流れに、どなたか回答していただけないでしょうか…
お願いします
209デフォルトの名無しさん:2006/02/07(火) 16:38:23
>>207
ありゃりゃ、すんません。
製品版買います。なんかスッキリした。
210デフォルトの名無しさん:2006/02/07(火) 16:53:02
hogeというプロジェクトからhoge.exe.config以外の構成ファイルを
読み込みたいのですが、これは可能ですか?
構成ファイルで、<appSettings file="huga.config">を指定、というのも
使わずに読み込む方法があったら教えて下さい。
211デフォルトの名無しさん:2006/02/07(火) 17:11:00
>>208
要は気にすんなってことだ。

>>210
それはもう構成ファイルである必要が無いような気がするのだが。
XmlSerializerでシリアライズじゃ駄目なの?
212210:2006/02/07(火) 17:33:33
>>211
ご返答ありがとうございます。おっしゃるとおりですorz

ConfigurationManagerとかであっさり出来るだろうと思い込み、
調べてみてビックリな感じですた。
213デフォルトの名無しさん:2006/02/07(火) 17:33:46
>>211
そうですか…わかりました
結構メモリくってしまうんで、どうにかしたかったんですけどね

基本的にはメモリ使用量は上昇していくのですが、ごくたまに使用量が減っているのを確認しました
たまになんで、ほとんど意味がありません><
214デフォルトの名無しさん:2006/02/07(火) 17:40:03
form1が親でインスタンス変数に子フォーム form2を持っています。
form2はform1のインストラクタ内で
form2 = new Form2();
で割り当てています。

form1のボタン1が押されたらform2を表示したいのです。
そこで
private void button1_Click(object sender, System.EventArgs e)
{
 form2.Show();
}
と書きました。
ところが、ボタンを一度押してからフォームを閉じ、再び押すと
"Form2" という名前の、破棄されたオブジェクトにアクセスできません。
という例外が発生します。

これは、フォームが閉じられる際form2に割り当てられていたForm2()のインスタンスが
が破棄されたということでいいのでしょうか?

そうならば、解決法がしりたいのですが、ご教授願います。
215デフォルトの名無しさん:2006/02/07(火) 17:43:50
>>214
Form2のClosingイベントを拾って
ウィンドウを閉じるのをキャンセルして
代わりにHide()してウィンドウを隠す。

あるいはボタンが押されるたびにnewする。
216デフォルトの名無しさん:2006/02/07(火) 17:50:16
>>215 何つーかその症状見てDisposeとかにブレークしかけてコールスタック見るぐらいするのが基本だろ。
217デフォルトの名無しさん:2006/02/07(火) 18:26:30
>>214
if (form2.IsDisposed)
{
  form2 = new Form2();
}
form2.Show();
218デフォルトの名無しさん:2006/02/07(火) 18:40:03
すいません。

public void test( DataTable dt)
{
ArrayList al = new ArrayList();
for (int i=0; i<dt.Rows.Count; i++)
{
al.Add(dt.Rows[i]);

}
。。。
。。


みたいな感じで、ArrayListのalにレコードとカラムを取得しました。
クイックウォッチで見ると、
al
├[0]
├[1]
├[2]
├[3]
  ├。。。
  ├ItemArray
     ├[0] "0010019"
     ├[1] "テスト太郎"//←@ここ

のような感じで、alの4行目([3])の、ItemArrayの2要素目([1])のテスト太郎を
取得する為には、ArrayListに対してどのようにアクセスすればよいですか?
よろしくおねがいします。
219デフォルトの名無しさん:2006/02/07(火) 18:43:34
キャストすれ
220デフォルトの名無しさん:2006/02/07(火) 18:56:28
Debug.WriteLine(((DataRow)al[3]).ItemArray[1]);
221デフォルトの名無しさん:2006/02/07(火) 19:02:33
>>219
>>220
どしよどしよ。。
うれしすぎてリアクションとれない。
ありがとうございました。
222120:2006/02/07(火) 19:47:27
>>198
できましたああああ!
ありがとう御座います.そのページの方もありがとうございます!!!
223デフォルトの名無しさん:2006/02/07(火) 20:27:44
>>217
メンバに持っとく必要がどこにあるんかと。
224デフォルトの名無しさん:2006/02/07(火) 20:49:18
Form2にTextに文字を入力して、ボタンを押すとFrom1のLabelに入力した文字が表示されるようにしたいのですが、下記だと『label1.Text = value』にはちゃんと入力した文字がきているのですが、Labelに文字が表示されません。。。
どうしてでしょうか?
=======================================================
Form1
=======================================================
private void button1_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2();
f2.Show();
}
public string Label1
{
set
{
label1.Text = value;
}
}
=======================================================
Form2
=======================================================
private void button1_Click(object sender, EventArgs e)
{
Form1 f1 = new Form1();
f1.Label1 = textBox1.Text;
}
}
225デフォルトの名無しさん:2006/02/07(火) 20:55:25
>>224
Form2のf1.Label1 = textBox1.Text;の下にf1.Show();って入れてみれば分かるよ
226デフォルトの名無しさん:2006/02/07(火) 21:15:39
解決しちゃったぁ
解決しちゃった
227224:2006/02/07(火) 21:19:30
>>225
解決しました。
ありがとうございます。

もう1つ質問が・・・
できれば、最初に開いているForm1に
文字がでるとうれしいのですが、その
ようなことは可能でしょうか?
228デフォルトの名無しさん:2006/02/07(火) 21:26:50
>>227
余裕で可能
元の Form1 の参照を渡しとけ
229デフォルトの名無しさん:2006/02/07(火) 22:02:05
newして設定して出来ないってやたら見るんだが
これはオブジェクトとかの概念が理解できてないからなのか?
230デフォルトの名無しさん:2006/02/07(火) 22:03:57
インスタンスの概念、と言うべきだな
そういう人たちのためのふらっとC♯スレなんだがあんまり利用されんのう
231デフォルトの名無しさん:2006/02/07(火) 23:11:28
オブジェクト指向というよりも、
.NET Frameworkの扱いに慣れてないだけだと思うが
 
233デフォルトの名無しさん:2006/02/07(火) 23:33:40
C# って処理速度はともかくとして起動速度が異常に遅いですよね?
アレを少しでも速くする方法ってありませんかね?
234デフォルトの名無しさん:2006/02/07(火) 23:38:16
Java Web Sta^C
235224:2006/02/07(火) 23:43:45
>>228
元のForm1を参照の渡し方ですが・・・

Form1 f1 = new Form1();
f1.Label1 = textBox1.Text;

で渡してるつもりだったりします。。。
参照の渡し方を教えていただけない
でしょうか。。。
236デフォルトの名無しさん:2006/02/07(火) 23:54:28
>>235
Form1 f1 = this;
237デフォルトの名無しさん:2006/02/08(水) 00:58:08
> Form1 f1 = new Form1();
> f1.Label1 = textBox1.Text;
> で渡してるつもりだったりします。。。
渡してるのは、textBox1のTextプロパティの内容である文字列の参照だ。
Textプロパティを一種の「箱」とみなすと、箱の中身を触らせただけだ。
箱そのものには触れないから、箱に別のものを入れることもできない。

238デフォルトの名無しさん:2006/02/08(水) 01:07:53
つーかForm2でForm1をnewしていいのか?
Form1が2つできるぞ。

参照渡すなら
Form2のコンストラクタで受け取れ

例:
private Form f1;
public Form2(Form form){
f1 = form;
}

Form1でForm2をnewするときに
Form2 f2 = new Form2(this);
239デフォルトの名無しさん:2006/02/08(水) 01:15:30
32bitのBitmapを作り
Save("*.jpg")でjpgとして保存すると透過が含まれた画像が作成されちゃうんですけど
どうにか24bitで保存する方法はないものでしょうか?
240デフォルトの名無しさん:2006/02/08(水) 01:17:28
>>237だがずまん、読み違いだ。
ていうかその前の>>229書いたのも俺だってのに
何を錯乱してんだ、俺はorz
241デフォルトの名無しさん:2006/02/08(水) 01:25:21
>>C# って処理速度はともかくとして起動速度が異常に遅いですよね?
アレを少しでも速くする方法ってありませんかね?

Win32APIを使ってチューニングすれば速くなります。しかしそれならば最初からC++を使えばよいということになってしまうのです。
242デフォルトの名無しさん:2006/02/08(水) 01:28:35
つngen
243デフォルトの名無しさん:2006/02/08(水) 01:29:06
何度も実行してるとネイティブのexeをどこかに格納するらしいから早くなる。
244デフォルトの名無しさん:2006/02/08(水) 01:30:29
245デフォルトの名無しさん:2006/02/08(水) 01:35:31
一旦.NET製の別ソフトを起動(終了してもいい)だな。
246デフォルトの名無しさん:2006/02/08(水) 01:35:40
>>239
え? Jpegは透過をサポートしてないから自動的に24bppになるはずだけど?
実際試した限り24bppRgbだし。
247132:2006/02/08(水) 03:25:30
>>132ですが、どなたかわからないでしょうか。
アニメーションGIFの表示ができずに困っています。

別件ですが、Image.FromStream(stream, true, false) としてイメージを取得し、
DrawImageで表示しようとするとエラーになります。
(Image)Image.FromStream(stream, true, false).Clone() とするとちゃんと表示できますが、
Image.FromStream(stream, true, true) としたときと速度がほぼ同じになり、
本末転倒の結果になってしまいます。
このことについてもわかる方がいたらお願いします。
248デフォルトの名無しさん:2006/02/08(水) 04:20:51
> Image の有効期間の間は、このストリームを開いておく必要があります。
これだろ。
FromStream使ったからってStream閉じていいわけじゃないぞ。
249132:2006/02/08(水) 05:35:59
>>248
そういう制約があったんですか。
しかし Image.FromStream(stream, true, false) 以外の方法 ( Image.FromStream(stream), Image.FromStream(stream, true, true) )
では、Stream を閉じても普通に表示できています。
これは「たまたま」うまくいっているだけで、仕様上は正しくない使用方法なんですかね。
というと、P/Invokeなどを使わずにImageクラスだけを利用する限り、
ファイルをロックせずにイメージを取得するというのは不可能ということなんでしょうか。

あと、
> Image の有効期間の間は、このストリームを開いておく必要があります。
この記述についてMSDNで調べてみたんですが、Image.FromStream(Stream, bool, bool) のオーバーロードには
この記述がないようです。
reflectorで調べたところ他のオーバーロードは単にこのオーバーロードを呼び出しているだけのようなので、
これは単にミスということなんでしょうか。
250デフォルトの名無しさん:2006/02/08(水) 05:57:24
bmpやtiffなどの画像ファイルをpdfファイルに変換したいのですが
.NETを利用したシステムでは、一般的にはどんな方法で行いますか?
やりたいことは単純に画像ファイルを
pdfファイルにコンバータできればよいのですがご意見いただきたく。

com.lowagie.text.pdf名前空間のクラスを使えば
pdf帳票が出力できそうなのはわかったのですが、
ttp://www.atmarkit.co.jp/fdotnet/dotnettips/309aspgenpdf1/aspgenpdf1.html
反面、.NET開発用にツールも各種出回っているようです。

用途としては、画像がpdf化できればよいだけです。
アプリは複数台のWinXP端末に入れる予定です。
小規模な社内システムを自社で構築しており、
VB.NETやC#で財務管理を行う小規模アプリだったので、
何とか今まで社内の素人何人かで(元SEは1名)
勉強しながら開発して来ました。
画像ファイルをpdf変換するツールはライセンスの額も
けっこうなお値段で、うちのような会社では
ちょっと躊躇してしまい、
251251:2006/02/08(水) 07:08:27
(承前)
一般的にはどうしているのか気になりまして。
ご教授いただければと思います。
252デフォルトの名無しさん:2006/02/08(水) 07:17:40


             「 ̄ `ヽ、   ______
             L -‐ '´  ̄ `ヽ- 、   〉
          /           ヽ\ /
        //  /  /      ヽヽ ヽ〈
        ヽ、レ! {  ム-t ハ li 、 i i  }ト、
         ハN | lヽ八l ヽjハVヽ、i j/ l !
         /ハ. l ヽk== , r= 、ノルl lL」
        ヽN、ハ l   ┌‐┐   ゙l ノl l
           ヽトjヽ、 ヽ_ノ   ノ//レ′
    r777777777tノ` ー r ´フ/′
   j´ニゝ        l|ヽ  _/`\
   〈 ‐         lト、 /   〃ゝ、
   〈、ネ..         .lF V=="/ イl.
   ト |お前の態度が とニヽ二/  l
   ヽ.|l         〈ー-   ! `ヽ.   l
      |l気に入らない lトニ、_ノ     ヾ、!
      |l__________l|   \    ソ

253デフォルトの名無しさん:2006/02/08(水) 07:53:41
>>252
へこーw
254デフォルトの名無しさん:2006/02/08(水) 09:17:24
>>252
ずこーですたいwwそんなコメントじゃ
255デフォルトの名無しさん:2006/02/08(水) 11:38:59
>>249
一度ファイルからバイト配列に読み込んでMemoryStreamにする。
または
Bitmapを新規に作成。
Image.FromFileで作ったImageをつかってBitmapにDrawImage。
Imageを破棄。
256デフォルトの名無しさん:2006/02/08(水) 12:05:52
>>246さん回答ありがとうございます>>239です
自己解決したのですが
//bはBitmap;
b.Save("test1.jpg",ImageFormat.Jpeg); //こっちは透過なし
b.Save("test2.jpg"); //こっちは透過あり
この引数の違いで作成されるjpgが違ったようです
257デフォルトの名無しさん:2006/02/08(水) 12:09:38
>>250
標準機能で無い以上は一般的なやり方なんてない。
標準機能で無い以上は「単純に」なんて言えるやり方はない
標準機能で無い以上は金か時間を費やして実現するしかない。
258デフォルトの名無しさん:2006/02/08(水) 12:18:37
>>256
それ拡張子がjpgなだけで実際はpngだから。
259デフォルトの名無しさん:2006/02/08(水) 13:43:36
ヘルプより

イメージのファイル形式に対応するエンコーダが存在しない場合は、PNG (Portable Network Graphics) エンコーダが使用されます。
260デフォルトの名無しさん:2006/02/08(水) 14:43:45
>>258>>259
ありがとうございます
261デフォルトの名無しさん:2006/02/08(水) 15:58:55
Win32APIのSendMessageをDllImportして使おうと思っています。
WPARAMやLPARAMはSystem.IntPtr型なのですが、この型の使い方がイマイチ分かりません。
例えばWPARAMに 1 を、LPARAMにshort型の変数 st を入れようとしたときこう書いてみました

SendMessage(this.Handle, msg, new System.IntPtr(1), new System.IntPtr((int)st));

しかしうまく動作しません。
どうすれば良いか教えてください。。。
262デフォルトの名無しさん:2006/02/08(水) 16:00:59
>>261
IntPtrではなくshort型のSendMessageも宣言する。
263デフォルトの名無しさん:2006/02/08(水) 16:02:27
それで合ってるはずだが。他のところで間違えてないか?
あとうまく動作しないってのは意味不明なのでどううまく動かないのかを書け。
ちなみに忘れがちだがSendMessageは返値もIntPtrだ。影響はないだろうが。
264261:2006/02/08(水) 16:29:30
>>262
その方法でできました!ありがとうございます!
VB6の時代と一緒なんですね。でもオーバーライドがある分で同じ関数名でできるのは楽ですね。

>>263
説明不足ですみません。
メッセージの動作はC++版で確認していたので、それと同じ結果を得られないことを「上手く動作しません」と曖昧に表現してしまいました。
戻り値も関係したので影響ありまくりでした orz
265デフォルトの名無しさん:2006/02/08(水) 17:08:24
VS2005のRichTextBoxを使っているのですが、コントロールのFontプロパティでフォントをMSゴシックにしても、半角英数が入力されるとClearTypeの効く他のフォントで表示されてしまいます。
プロポーショナルフォントで表示されたWebページのテキストをコピペしてもMSゴシックで半角英数が表示されるのですが、直接入力だとダメです。
これってRichTextBoxのバグなのでしょうか・・・
ぐぐっても同じような問題が見つからないので、私の環境かな・・・
266デフォルトの名無しさん:2006/02/08(水) 17:12:56
267デフォルトの名無しさん:2006/02/08(水) 17:31:29
http://lab.msdn.microsoft.com/productfeedback/viewfeedback.aspx?feedbackid=093c6438-4198-4fbc-bb11-55327ec079c8
>Resolved as Fixed by Microsoft on 2005-09-29 at 16:38:07
>I've updated the documentation to clearly document that this behavior is not currently supported.

これどこに書いてある?
FileInfoのAttributesやFileのSetAttributesやFileAttributes列挙体には見つからない
268デフォルトの名無しさん:2006/02/08(水) 18:01:46
>>266
有名な仕様(あるいはバグ)。ですか。。。

教えていただいたページを元に出ないようにすることができました。
でもデザイナでWordWrapやScrollBarsを設定すると元に戻ってしまいました。
いくつかのプロパティは設定を戻してしまうようです。
とりあえず今回は限定目的なのでコンストラクタに突っ込むことで対応しました。

public partial class CustomControl1 : RichTextBox
{
private const uint IMF_DUALFONT = 0x80;
private const uint WM_USER = 0x400;
private const uint EM_SETLANGOPTIONS = (WM_USER + 120);
private const uint EM_GETLANGOPTIONS = (WM_USER + 121);

[DllImport("USER32.dll", EntryPoint = "SendMessageA")]
private static extern uint SendMessage(System.IntPtr hWnd, uint msg, uint wParam, uint lParam);

public CustomControl1()
{
InitializeComponent();
this.WordWrap = false;
this.ScrollBars = RichTextBoxScrollBars.ForcedBoth;
uint dwLangOptions = 0;
dwLangOptions = SendMessage(this.Handle, EM_GETLANGOPTIONS, 0, 0);
dwLangOptions &= ~IMF_DUALFONT;
SendMessage(this.Handle, EM_SETLANGOPTIONS, 0, dwLangOptions);
}
}

コンテナのInitializeComponent呼び出しが終わった後に自動的に呼び出す方法ってあるのでしょうか?
それがあれば上手くできそうですが。。。
269デフォルトの名無しさん:2006/02/08(水) 18:12:39
>>268
これはスタイルに関する問題だから、ハンドルが再作成されるとリセットされる。
なのでHandleCreated辺りでやれば多分うまくいくはず。
270デフォルトの名無しさん:2006/02/08(水) 18:31:34
>>269
できました!
これで汎用版も行けそうです。

public partial class CustomControl1 : RichTextBox
{
private const uint IMF_DUALFONT = 0x80;
private const uint WM_USER = 0x400;
private const uint EM_SETLANGOPTIONS = (WM_USER + 120);
private const uint EM_GETLANGOPTIONS = (WM_USER + 121);

[DllImport("USER32.dll", EntryPoint = "SendMessageA")]
private static extern uint SendMessage(System.IntPtr hWnd, uint msg, uint wParam, uint lParam);

public CustomControl1()
{
InitializeComponent();
}

protected override void OnHandleCreated(EventArgs e)
{
base.OnHandleCreated(e);
uint dwLangOptions = 0;
dwLangOptions = SendMessage(this.Handle, EM_GETLANGOPTIONS, 0, 0);
dwLangOptions &= ~IMF_DUALFONT;
SendMessage(this.Handle, EM_SETLANGOPTIONS, 0, dwLangOptions);
}
}
271デフォルトの名無しさん:2006/02/08(水) 19:37:24
俺もどうしようか迷ってた所だった、>>265-270超ありがとう
272デフォルトの名無しさん:2006/02/08(水) 21:58:59
俺も >>265-270超ありがとう
273デフォルトの名無しさん:2006/02/08(水) 23:09:36
オブジェクトのコピーを作りたいんだが、どうしたらいいんでしょうか?
274デフォルトの名無しさん:2006/02/08(水) 23:12:55
なんのオブジェクトさ。
コピーってどういうコピーさ。
275デフォルトの名無しさん:2006/02/08(水) 23:18:27
自分で作ったクラスのインスタンスのコピーです。
new してクラス変数の値を書き換えた後、
実体のコピーを取って、片方だけまた書き換える。

説明不足ですみません。

276デフォルトの名無しさん:2006/02/08(水) 23:20:28
ちなみにいうとクラス変数ってのはstaticが付いてるフィールドのことなんだが
277デフォルトの名無しさん:2006/02/08(水) 23:21:49
すみません。メンバー変数です。

278デフォルトの名無しさん:2006/02/08(水) 23:23:56
>>277
Object.MemberwiseClone()あたりとか。

説明をよく読んで参照型のフィールドをコピーするときは気をつけろよ。
279デフォルトの名無しさん:2006/02/08(水) 23:24:07
自分でCloneメソッドをそのクラスに定義すりゃいいじゃない
280デフォルトの名無しさん:2006/02/08(水) 23:26:33
>>277,279
ありがとうございます。
Cloneメソッドについて調べてみます。
281デフォルトの名無しさん:2006/02/08(水) 23:27:08
>>278でした。自分に感謝してどうすんだか。
282デフォルトの名無しさん:2006/02/09(木) 00:20:38
ちなみにメンバー変数というのはstaticもそうじゃないのも含むんだが。
283デフォルトの名無しさん:2006/02/09(木) 00:29:08
インスタンスフィールドだったっけ?
284132:2006/02/09(木) 00:37:04
>>255
レスどうもです。
ざっと試してみたんですが、MemoryStreamに読み込む方法だと
普通に Image.FromStream(stream, true, false) で読み込んだ場合とほとんど変わらないパフォーマンスで
実現できました。
この方法でいきたいと思います。
どうもありがとうございました。

あと、ImageAnimator についてもこの方法にしたらうまく動くようになりました。

#何故かぎくしゃくしてはいますが・・・
285デフォルトの名無しさん:2006/02/09(木) 10:25:41
お前らは何でそんなに親切なのですか?
286デフォルトの名無しさん:2006/02/09(木) 13:52:39
やることがないから
287デフォルトの名無しさん:2006/02/09(木) 15:32:15
バイトASCIIからバイトUTFに変換するプログラムを作ってるのですが
今は、Encodingクラスを使って
バイトASCIIから一旦、文字列UTFにしてバイトUTFに変換してます
直接バイトASCIIからバイトUTFに変換ってできますか?
288デフォルトの名無しさん:2006/02/09(木) 15:39:22
Encoding.Convert
結局やることは変わらんが
289デフォルトの名無しさん:2006/02/09(木) 16:21:12
>>288 レスありがとうございます。Convertでやってみます。
290デフォルトの名無しさん:2006/02/09(木) 17:04:18
初めてチームで.NET開発をするんですが、C#とVBのどちらを選ぶかでチームが紛糾しています
別にどちらが良いかを聞いてるわけじゃありません
だってここはC#スレ

私自身はC#派なので推したいのですが、多くのメンバーがVB6のみの経験者で強行にVB8を推してきます
VB8ってもVB6とは訳が違うと言っても思い込みから理解してくれません
「VB6時代の大量の資産(社内クラスライブラリとか)があるから生産性も高い」とか言いますが、ADO用とか、.NET Frameworkにより高機能で実装されているとか、VB6標準以外(MSXMLとかScriptRuntimeとかのCOM)の機能をラップして意味がないとかばかりなのです
コーディングルールもあるのですが、VB8どころかVB7.1にすら使えません(私と数人でやった別件の小規模開発で使えないことが露呈してます)

社内事情はさておき、C#2.0がVB8より優れている点を教えてください
IDEはVS2005を使うので、VS2005+C#2.0ならではの優位点もあればお願いします
291デフォルトの名無しさん:2006/02/09(木) 17:06:24
プロジェクト単位で別言語にすれば?
292デフォルトの名無しさん:2006/02/09(木) 17:27:55
>>291
全員がスペシャリストならそれでも構いませんが、そこまで信用できる人々ではないです
今後の拡張で人員追加の可能性もあるので、技術は絞っておきたいという理由もあります
私を含めた技術リード3人はC#2.0とVB8の両方で開発経験がありますが、プログラム技術ばかりを担当するわけではないので脳内整理のためにも単一にしておきたいわけです
293デフォルトの名無しさん:2006/02/09(木) 17:32:31
C#2.0の優れたところ……VBユーザーを苦しませることができる
VB8の優れたところ……VBユーザーをもっと苦しませることができる
294デフォルトの名無しさん:2006/02/09(木) 17:36:01
いい加減な数字だけどC#やVB.NETを勉強するのにかかる労力は
IDEの使い方3割、クラスライブラリの理解5割、文法2割くらいで
VB6の経験が生かせるのは文法の半分以下。
それをアドバンテージと考えるかどうかだね。
いっそUI周りは古参の人たちにVB6風に作ってもらって、
中間層をC#でもVB.NETでもいいけど.NETらしいつくりにするのがお勧めかな。
295デフォルトの名無しさん:2006/02/09(木) 17:43:36
VB6と8って中途半端に似てるから余計戸惑いそう
296デフォルトの名無しさん:2006/02/09(木) 17:45:25
オブジェクト指向が分かればどちらも書ける。
オブジェクト指向が分からなければどちらも書けない。

VB6しかやってない奴は・・
297デフォルトの名無しさん:2006/02/09(木) 17:57:19
VB8とC#はどちらも使えるけど、先に覚えたほうが母国語みたいになる。
C#を先に覚えたので、VB8で書くときは脳内でC#->VBの翻訳をしながらコーディングしていたりする。
知り合いに話したらそいつはその逆だそうだ。
298デフォルトの名無しさん:2006/02/09(木) 18:04:53
オブジェクト指向って言葉が出てきたので、聞きたいんだけど
Visual C#でポトペタでプログラミングしてると
オブジェクト指向的なプログラミングって無理じゃないですか?
デザイナーが生成したコードはいじれないので、無理が生じるというか。
特に描画関係でFormのソースがやたらと長くなってしまうし
皆さんどんな感じでオブジェクト指向のプログラミングしてます?
299デフォルトの名無しさん:2006/02/09(木) 18:10:09
>>297
Java、C#、C++、VBを使って開発してるけど、それぞれ脳内翻訳なんてしない
それぞれ使うときに合わせて切り替わる感じ
だからC#やってるときにJavaの事聞かれると直ぐに答えられない

例えば英語話すときも日本語から翻訳しないでしょ?
英語話すときは英語で考えない?
300デフォルトの名無しさん:2006/02/09(木) 18:16:37
VB(7以降)はC#からの翻訳だな。文法以外同じだもん。
C#とC++は切り替わるなぁ。
301デフォルトの名無しさん:2006/02/09(木) 18:17:39
>>299
英語のときはyahooかエキサイトの翻訳を使ってるよw
302デフォルトの名無しさん:2006/02/09(木) 18:23:09
>>300
j#でjava.*を使うときはネイティブjavaで思考しますが、
System.*を使い出すととたんにC#からの翻訳モードにかわってしまいます。
303デフォルトの名無しさん:2006/02/09(木) 19:45:32
>>302
あるあ・・・J#ねーよwww
304デフォルトの名無しさん:2006/02/09(木) 20:08:32
>>297 自分も脳内変換などしないが、最近はめんどくさいのでVBでは最低限の文法しかおぼえんし使わん。
305デフォルトの名無しさん:2006/02/09(木) 20:32:41
MSシンパで.NET万世な俺も、J#、それはいいよ〜状態だ。
306デフォルトの名無しさん:2006/02/09(木) 20:38:02
C#のコードの断片をMSILに変換するツールってある?
307デフォルトの名無しさん:2006/02/09(木) 21:29:33
つcsc.exe
308デフォルトの名無しさん:2006/02/09(木) 22:10:47
>>298
コアになるDLLを作って
データベースアクセスDLLを作って
それらの制御用DLLを作って
最後にGUIを作る。
309デフォルトの名無しさん:2006/02/09(木) 22:15:15
>>298
.NETではそのボトペタを可能にしてるのがオブジェクトとコンポーネント
310デフォルトの名無しさん:2006/02/09(木) 22:19:46
>>309
ナイスジョーク
311デフォルトの名無しさん:2006/02/09(木) 23:21:04
バッチファイルかなにかでngenのパスを検出するにはどうしたらよいですか?
312デフォルトの名無しさん:2006/02/09(木) 23:45:06
環境変数のPATHにngenのディレクトリを設定するとかって話じゃなくて?
313デフォルトの名無しさん:2006/02/10(金) 00:28:26
他人の環境や.NET Frameworkのバージョンが違う環境で、汎用的にngenを実行する方法が知りたいのです。
PATHが通っていれば話は早かったんですが、そうでないみたいなので。
314デフォルトの名無しさん:2006/02/10(金) 01:08:22
↓でいけるかねえ。バージョンは何パターンか試すわけにはいかないの?
%windir%\Microsoft.NET\Framework\(バージョン)\
315デフォルトの名無しさん:2006/02/10(金) 01:18:14
自分の.NETアプリかインストーラ実行してmscorlib.dllか何かののフォルダパス取得するとか。
316デフォルトの名無しさん:2006/02/10(金) 01:36:50
>>314-315レスありがとうございます。
RuntimeEnvironment.GetRuntimeDirectory()でパスが取得できるようですので、これを使おうと思います。

317デフォルトの名無しさん:2006/02/10(金) 09:01:24
staticメソッドってどんな時に定義します?
今いち使いどころがわからないです。
newしなくていいから楽って事ですか?
318デフォルトの名無しさん:2006/02/10(金) 09:03:35
>>317
その型のインスタンスを引数に受け取ってなんかするメソッドとか。
319デフォルトの名無しさん:2006/02/10(金) 09:09:56
DataGridViewColumn.DefaultCellStyle.Formatに設定する書式で悩んでいます

System.Int32型の列があり、それをプレフィックスとして "0x" を付与した16進数8桁で表示したいのです
例えば 10000であれば "0x00002710" です

Formatに "X08" と設定すれば数値部分は表示できますが、当然 "0x" は付与されません
stringのFormatのように "0x{0:X08}" としてもダメでした

もしできる方法があれば教えてください
320デフォルトの名無しさん:2006/02/10(金) 09:11:11
>>317
ステートレスな処理のとき
321デフォルトの名無しさん:2006/02/10(金) 09:46:07
インスタンス以外のコンテキストに結び付いた情報にアクセスする場合とか。
その場合もインスタンスにする事もあるが。
322デフォルトの名無しさん:2006/02/10(金) 09:52:28
>>317
そういうときは.NET Frameworkの実装を参考にすると良い
どういうメソッドがstaticなのかを見れば思想が見えてくる
323デフォルトの名無しさん:2006/02/10(金) 10:01:17
>>321なんてのは、Currentなんてプロパティになってることが多いが
324317:2006/02/10(金) 10:10:53
みんなありがとうございます。

結局クラスライブラリを参考にするって事は、
自分の脳内だけでの解釈になりそうです。

暇でしたら具体的にお願いします。
325デフォルトの名無しさん:2006/02/10(金) 10:15:01
>>324
他人の脳内解釈を聞きたいって事?
staticの絶対的な指針が無い以上は十人十色
経験で自分なりの使い方を会得(脳内解釈)するか、一緒に開発する人々とルールを作るかのどっちかしかない

それを理解した上で他人の脳内解釈を聞きたいって事?
326デフォルトの名無しさん:2006/02/10(金) 10:34:55
>>317
MSDNの関連ドキュメントは熟読したのかよ
staticと関連するそれ以外のドキュメントも一通り
それらを読まないで聞いても基礎が無いから理解できない

少なくとも「newしなくても良いから楽?」とかって聞いてるようじゃ話にならん
327デフォルトの名無しさん:2006/02/10(金) 10:42:21
>>319
Format プロパティでは無理だと思う
DataGridView.CellFormatting イベントハンドラで e.Value を string.Format でフォーマットすればOK
328デフォルトの名無しさん:2006/02/10(金) 10:51:24
>>327
ありがとうございます!できました!
新しく追加されたイベントがあったのですね、見逃していました orz
よく見たらMSDNライブラリに詳細な説明文が載っていました orz

一応できたコードを置いておきます

private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
if (e.ColumnIndex == 4)
{
e.Value = string.Format("0x{0:X08}", e.Value);
}
}
329デフォルトの名無しさん:2006/02/10(金) 14:50:12
流れも何も無くすみません。

SQLサーバからSqlDataAdapterで取得したデータセットに
テーブルが一個入っています。
そのテーブルには10カラムあるとして、
その内5カラムがNULLです。(ヘッダがNULLではなくて何も値が入っていないフィールドって事です。)

//dsはDataSetです。
このデータセットをds.WriteXml(stream);
で書き出すと、値が入っていないフィールドを書き込んでくれないのですが、
コレをちゃんと書かせるにはどうしたらよいでしょうか?

330デフォルトの名無しさん:2006/02/10(金) 15:03:53
>>329
WriteXmlのときスキーマも書き込んどけ
331デフォルトの名無しさん:2006/02/10(金) 15:15:13
>>330
ありがとうございます!
332デフォルトの名無しさん:2006/02/10(金) 18:46:26
C#で無線LANの電波状態(強度やID)って取得できますか?
333デフォルトの名無しさん:2006/02/10(金) 18:49:24
>>332につけたしです
OSは基本的にXPで動かすことを考えています
334デフォルトの名無しさん:2006/02/10(金) 19:13:53
>>332
.NET 2.0のSystem.Net.NetworkInformation.NetworkInterfaceが近いのかな。
あとはWMIかWin32APIレベルでできるなら可能だが、どうするかは知らん。
335デフォルトの名無しさん:2006/02/10(金) 19:14:59
その聞き方から察するに、取得方法の見当も付いてないんだろうな。
不可能ではないけど、C#でやるようなもんじゃない。
336デフォルトの名無しさん:2006/02/10(金) 19:35:56
はいまったく検討がついていませんでした
.NET2.0ですか…LANの件抜きにして1.1からバージョンアップしたほうがいいですかね?
337デフォルトの名無しさん:2006/02/10(金) 21:14:00
2.0は俺もどうすべきか迷ってるのだが
ところでVS2003で.NET2.0って使える?
その辺りの設定やったことないからわからんorz
338デフォルトの名無しさん:2006/02/10(金) 21:14:57
無理だよ。
それぞれのVSで使える.NETバージョンは固定。
339デフォルトの名無しさん:2006/02/10(金) 21:18:25
>>338 改めてくず名戦略だな
340デフォルトの名無しさん:2006/02/10(金) 21:19:14
.Net2.0が出たのに、わざわざ.Net1.1を使いつづける理由が無いだろ。
341デフォルトの名無しさん:2006/02/10(金) 21:23:52
いろいろあるのさ
・・客先に1.1で動作するソフト配ってしまっているとかな。
342デフォルトの名無しさん:2006/02/10(金) 23:08:12
>>336
やっぱそんな感じか。
NDISとか言うので、ある程度NICの情報を得る事は出来るみたいだ。
ただ、資料も少ないし、結構面倒だと思う。
.NETについては何か問題を抱えてるわけでもない限り、2.0に移行したほうがいい。
どうせすぐ3.0が出るんだ…。
343デフォルトの名無しさん:2006/02/10(金) 23:32:38
>>342
ありがとうございます
C#でやるのはとりあえずやめておきます
344デフォルトの名無しさん:2006/02/10(金) 23:48:45
>>342 3.0いつ?
345デフォルトの名無しさん:2006/02/11(土) 00:14:57
>>338
それぞれのVSで使える.NETのバージョンは固定なんですか…
初めて知りました
じゃあ2.0使うにはVS2005買うしかないってことですねorz
346デフォルトの名無しさん:2006/02/11(土) 00:18:28
ListView のアイテムを選択したときに
ListViewItemCollection に履歴として保存したいのですが
新しく作った ListViewItemCollection に追加するとき
ListView.SelectedItems[0].Clone() で新しく ListViewItem を
作って追加しているのですが、
なぜかもとの ListView にもコピーが追加されていました。
これを防ぐ方法はないでしょうか?
347デフォルトの名無しさん:2006/02/11(土) 00:28:02
>>346
ListViewItemCollectionがそういうクラスだから。(同じListViewに対してリストを共有する)
ArrayListかList<ListViewItem>にでもつっこんどけ。
348デフォルトの名無しさん:2006/02/11(土) 00:39:22
>>345
Framework SDK + Eclipseかメモ量
349デフォルトの名無しさん:2006/02/11(土) 00:41:55
いやVS2005Expressでいいじゃねーか
350デフォルトの名無しさん:2006/02/11(土) 00:52:12
>>342
MDC06では、C#3.0はCLR2.0上で動くMSIL吐くようにするって言ってたよ。
なのでしばらくは2.0で行くんじゃないかな。
351デフォルトの名無しさん:2006/02/11(土) 00:54:19
なんであんなにMSNDは見づらいんですか・・・
使用例は何十行にもなってるし・・・
1〜3行で簡素な使用例にしてくれ・・・
ヘルプにはGoogle搭載して欲しい・・・
MSDNの無駄に広大な情報に溺れそうです・・・
352デフォルトの名無しさん:2006/02/11(土) 01:16:46
まあ馬鹿には無理だから
353デフォルトの名無しさん:2006/02/11(土) 01:16:57
3行で済むようなものなら使用例なんていらんだろw
354デフォルトの名無しさん:2006/02/11(土) 01:22:58
>>350
おお、勘違いしてた。ありがとう。
C# 3.0の仕様ももう決まってるし、Vistaが出る頃にヒョイっと出されるのかと思ってた…。
355デフォルトの名無しさん:2006/02/11(土) 01:31:57
1.0に対する1.1になるような気もするがね
Orcasもあるんだし
// WinFX対応版はOrcasの次になるのか?
356デフォルトの名無しさん:2006/02/11(土) 01:51:01
>>347
そうなんですか。List<ListViewItem>に入れることにします。
ありがとうございました。
357デフォルトの名無しさん:2006/02/11(土) 08:01:39
すまぬ事をお聞きしますが、NET2.0ってNET1.1よりも(いろんな意味で)
速いですか?もしそうなら、乗り換える予定なんですが。
358デフォルトの名無しさん:2006/02/11(土) 08:05:10
まず日本語を勉強しろ。
あと色んな意味で速いかどうかと言われても答えようがない。
359デフォルトの名無しさん:2006/02/11(土) 08:53:39
大して違いないんじゃない?
360デフォルトの名無しさん:2006/02/11(土) 08:58:59
>>358
申し訳ない。
>>359
サンクス。一応VS2005は購入予定です。
361デフォルトの名無しさん:2006/02/11(土) 09:41:35
>>351
そういう人向けにこういうシリーズがあるわけだが

C# ユーザーのための「300 秒でズバリ !!」&「10 行でズバリ !!」シリーズ
http://www.microsoft.com/japan/msdn/thisweek/wednesday/csharp.aspx
362デフォルトの名無しさん:2006/02/11(土) 10:26:39
長文読めない病が発病したら終りだぞ
MSのセキュリティアップデート情報なんかも明らかに愚民対策
363デフォルトの名無しさん:2006/02/11(土) 11:41:41
そのうちローカライズされているだけでもマシだと思えるようになる。
364デフォルトの名無しさん:2006/02/11(土) 12:59:36
.NET FrameworkのリファレンスがほとんどローカライズされているってのにMSの恐ろしさを感じた
365デフォルトの名無しさん:2006/02/11(土) 13:05:20
機械翻訳じゃね
366デフォルトの名無しさん:2006/02/11(土) 15:59:40
>>365
KB見てこい。
機械翻訳と断り書きがあるドキュメントが見られるから。
367デフォルトの名無しさん:2006/02/11(土) 16:03:41
>KB
そんな雑誌あるの?
368デフォルトの名無しさん:2006/02/11(土) 16:06:15
Microsoftの最大のアドバンテージだよな、ドキュメント作成力。ほかじゃ真似できん。

あと>>367は開発には向いてないと思う。
369デフォルトの名無しさん:2006/02/11(土) 16:27:34
>>365
あんな精度で機械翻訳できるソフトがあったらバカ売れだろうな
370デフォルトの名無しさん:2006/02/11(土) 18:45:46
「機械翻訳されたものです」って書いてあるページもあるよ。
人の手で直してあるのに比べるともちろん読みにくいけど、
それなりに読めないこともない。
371デフォルトの名無しさん:2006/02/11(土) 19:02:45
ローカライズ版はたまに情報が古いがな。
372デフォルトの名無しさん:2006/02/11(土) 19:10:45
>>371
なにを当たり前なことを。
373デフォルトの名無しさん:2006/02/11(土) 19:17:08
情報が古いならまだ良いがときどき誤訳があるのが何とも。.NETのでは今のところ見たことないが。
Win32APIの関数でnotの適用範囲を間違ってて正反対の結論になってたことが。
374デフォルトの名無しさん:2006/02/11(土) 19:58:26
誤訳もしくは不適切な訳はそれなりに有るぞ。
とはいえ、まあこれだけ網羅されてるのは有りがたい。
375デフォルトの名無しさん:2006/02/11(土) 20:27:26
すみません。質問させてください。
先ほどC#2.0Expressをインスコして、
適当に動きを試してみました。

一緒にインスコされたSQLExpressも触ってみようと
接続先を指定したら、
データファイルをプロジェクトにコピーする場合は、、、
などというメッセージが出たので、
この詳細について小一時間ドキュメントを読んできました。

しかし、熟読っぷりが足りないのか理解できなかった事があります。
それは以下の通りです。

@メリットは?(「早いから」・「本物のデータが壊れないから」は、なんとなくわかります)

これが、特にドキュメントに発見できなかった点なのですが、
Aプロジェクト内のデータを本物のサーバに更新するには?

B「ローカル データの一般的な問題」という項にあった、以下の問題って。。。「コピーしない」に設定するしかないって事?
「アプリケーションをテストしてデータを変更し、次回アプリケーションを実行すると必ず変更内容が失われる」

現在上記の疑問があり、表示されたメッセージボックスで「はい・いいえ」どちらを選ぶかで止まってます。
なので、実際にやってみたら普通に解決するような質問だったらすみません。

ローカル内の↓にIEでアクセスすれば参照できると思います。
ms-help://MS.VSExpressCC.v80/MS.NETFramework.v20.ja/dv_raddata/html/d6afa5ac-2bb8-49f2-a50e-f71f611ed506.htm

376デフォルトの名無しさん:2006/02/11(土) 20:30:14
>>375
インスコってなに?
プログラム言語以前に日本語勉強し直せ
377デフォルトの名無しさん:2006/02/11(土) 20:33:55
>>375
MSDNに立派な資料がいっぱいあるからそれ見てから出直せ。
378デフォルトの名無しさん:2006/02/11(土) 20:34:23
>>376
きみ、通知表に「周囲から孤立している」とか書かれてたでしょ
379375:2006/02/11(土) 20:40:05
>>376
インスコとはインストールの事として書き込みました。
>>377
本当にありがとうございました。
>>378
そんな事ないと思います。
380デフォルトの名無しさん:2006/02/11(土) 23:32:40
C#2.0でbyte配列のコピーをしたくて下記のコードを組んでいます

//変数sourceのバイトデータを変数copyにコピーする
copy = new byte[source.Length];
source.CopyTo(copy, 0);

一発で領域の確保とコピーができる方法とかご存知ですか?
今は自作の関数で対応していますが、ありそうな気がするものの見つけられていません
381デフォルトの名無しさん:2006/02/11(土) 23:37:52
Clone
382デフォルトの名無しさん:2006/02/11(土) 23:46:08
>>380
>>381はつまり、
copy = (byte[])source.Clone();
383デフォルトの名無しさん:2006/02/11(土) 23:51:37
>>381-382
目から鱗です!
ありがとうございます m(_ _)m
384デフォルトの名無しさん:2006/02/11(土) 23:57:26
byte配列でもう一つだけ教えてください
byte配列の一部を切り出して別のbyte配列にしたいのですが、System.Array.Copy以外に方法は無いでしょうか

今はこうしています

//変数sourceに切り出し元のバイトデータが入っている
byte[] NewBytes = new byte[10];
System.Array.Copy(source, 5, NewBytes, 0, 10);

これもまた自作関数で対応していますが、Cloneのように簡単な方法があれば知りたいです。。。
385デフォルトの名無しさん:2006/02/12(日) 00:01:34
List<byte>でもつかっとけ
386デフォルトの名無しさん:2006/02/12(日) 00:08:13
手間は変わらないがBuffer.BlockCopy()
387デフォルトの名無しさん:2006/02/12(日) 00:22:23
>>385
それだとオーバーヘッドが心配でちょっと
#場合によっては1MB超のバイトデータも扱うのです

>>386
同じような感じになっちゃうんですね
でもSystem.Bufferは知りませんでした orz
これはこれで別の目的に使えるので知る事ができて嬉しいです!
388デフォルトの名無しさん:2006/02/12(日) 01:10:36
下手糞が Array を使うくらいなら List<T> の方がマシなこともあるぞ
389デフォルトの名無しさん:2006/02/12(日) 01:14:43
キャスト間違いなんて一通り試験すれば見つかるっしょ。
390デフォルトの名無しさん:2006/02/12(日) 01:14:56
ListViewでContextMenuStripを使いたいんですが、ListViewのContextMenuStripプロパティを設定するやり方だと
当然、ListViewのどこで右クリックしてもContextMenuStripが表示されます。
なにかを選択した状態じゃないとContextMenuを表示したくないんですがこの場合は
ListViewのマウスのクリック関係のイベントを使ってContextMenuStripのShowメソッドを呼んだりするしかないですか?
391デフォルトの名無しさん:2006/02/12(日) 01:17:54
Openingイベントでキャンセルすれば?
392デフォルトの名無しさん:2006/02/12(日) 01:20:32
>>391
俺が答えようと思ったのに。
この無駄になったプロジェクトどうしてくれる!
393デフォルトの名無しさん:2006/02/12(日) 01:22:17
破棄
394デフォルトの名無しさん:2006/02/12(日) 01:27:03
再利用
395デフォルトの名無しさん:2006/02/12(日) 01:36:06
>>392
とりあえず http://pc8.2ch.net/test/read.cgi/tech/1139417216/154
としておいて後から使え
396デフォルトの名無しさん:2006/02/12(日) 11:37:53
C#からAccess(mdb)のテーブル名を変更することはできませんか?

cmd = new System.Data.OleDb.OleDbCommand("alter table 既存テーブル rename to 新テーブル",コネクション);
cmd.ExecuteNonQuery();

このクエリーを実行すると「alter table 文のエラーです」って出るんですけどAccessだからなんでしょうか。
397デフォルトの名無しさん:2006/02/12(日) 14:01:23
>>396
mdbはSQLではテーブル名変更はできない。
DAOまたはADODB & ADOXをCOM参照して使えばできる。
398デフォルトの名無しさん:2006/02/12(日) 14:25:05
>>397
そうだったんですか・・・
「出来ないっぽい」とは思ってましたが、「出来ない」ってはっきりと言われると
あきらめがつきます。
ADODBあたりを調べてみます。
ありがとうございました。
399デフォルトの名無しさん:2006/02/12(日) 14:38:37
>>398
ADODB & ADOXで行くんならADOXを調べたほうがいいよ。
ADODBはConnection開くのに必要なだけだから。
400デフォルトの名無しさん:2006/02/12(日) 14:42:14
ADO.NETしょっぱいな
401デフォルトの名無しさん:2006/02/12(日) 14:44:00
※たべられません
402デフォルトの名無しさん:2006/02/12(日) 15:01:54
ものすごい基本的なことかもしれんが、
これはなんでこうなる?

class xx{
  private ArrayList list = new ArrayList();

  byte[] b = new byte[]{1,2,3};
  static xxx{
    list.Add(b);
  }

listはフィールドを意味しますが、クラスでなければなりません。
403デフォルトの名無しさん:2006/02/12(日) 15:03:08
>>402
クラスの終わりにセミコロンがない。
404デフォルトの名無しさん:2006/02/12(日) 15:03:51
>>402
static xxxに戻り値と引数がない。
405デフォルトの名無しさん:2006/02/12(日) 15:04:27
>   private ArrayList list = new ArrayList();
に static がついてないからなんじゃね?
406402:2006/02/12(日) 15:05:03
セミコロン?どこですか?

ちなみに訂正
誤:static xxx
正:static xxx()

ですた。
407402:2006/02/12(日) 15:06:49
>405
それでした。

ありがとうございます。。
408デフォルトの名無しさん:2006/02/12(日) 15:07:19
list メンバや b メンバに static が付いていないのはなぜなんだ
409デフォルトの名無しさん:2006/02/12(日) 15:08:40
デリゲートに登録されたメソッドはそのメソッドを持つクラスのインスタンスが生成されたスレッドで実行されると考えて良いのでしょうか。
410デフォルトの名無しさん:2006/02/12(日) 15:12:20
>>409
MSDN見てこい
411デフォルトの名無しさん:2006/02/12(日) 15:13:21
>>410
自分が分からなかったらすぐコレだ。
412デフォルトの名無しさん:2006/02/12(日) 15:14:25
>411
MSDNの見方をしらないとすぐコレだ
413デフォルトの名無しさん:2006/02/12(日) 15:18:34
>>410
411は偽物?です。
どのあたりに載っているか、または検索キーワードをご教示ください。
414デフォルトの名無しさん:2006/02/12(日) 15:21:32
>>413
delegateで検索しろよ。
415デフォルトの名無しさん:2006/02/12(日) 15:24:12
>>414
delegate、デリゲートで検索を行っていますが数が多く、それらしきトピックには的を射た回答がありません。
具体的に項目を教えて頂けると助かります。
416デフォルトの名無しさん:2006/02/12(日) 15:24:53
>>414
あとちょっと不安になったのですがMSDNに載っているのは確実なのですよね?
417デフォルトの名無しさん:2006/02/12(日) 15:26:35
>>415
お前は何様だ?
MSDNが検索しづらく、役に立つ情報がないと言うのか?
418デフォルトの名無しさん:2006/02/12(日) 15:30:07
>>417
何も知らずにMSDNを読めと言ってしまった。だって俺は部活ではC#博士と呼ばれているから。
でも、載っていないと質問者に追求されて逆ギレしてしまった。バカのくせに俺に盾突くからだ。
419デフォルトの名無しさん:2006/02/12(日) 15:54:16
>>409
全くの勘だけど、呼び出し側のスレッドで実行されるんじゃね?
C#のdelegateはコンパイルされた段階でクラス化される。
だから、クラス内でdelegate型を宣言するとインナークラスになる。
この形はJavaと同じだから、多分動作もJavaと同じだと思うんだ
けど・・・・・・
420デフォルトの名無しさん:2006/02/12(日) 15:58:24
>>416
オフィシャルドキュメントなんだから絶対的な真と言いたいところだが、人間が書いたのだからミスはある
最終的にはVSの挙動が真
VSの挙動自体がバグっていても、それが最終的な結論なので、真
421デフォルトの名無しさん:2006/02/12(日) 15:59:38
>>419
実験してみましたがその通りのようです。
DirectoryWatcherの様な非同期で動作するコンポーネントを作成したかったのですが
イベントハンドラからコントロールの操作ができずに困っている状態です。
実現手段が分からなくなってきました。
422デフォルトの名無しさん:2006/02/12(日) 16:27:25
>>421 Control.BeginInvoke、Invoke
423デフォルトの名無しさん:2006/02/12(日) 16:43:18
424デフォルトの名無しさん:2006/02/12(日) 16:43:41
>>422
ありがとうございます。

クライアントがコンポーネントのスレッド使用有無を意識しなければいけないというのは
あまり美しくないのでやり方を探している最中です。
425デフォルトの名無しさん:2006/02/12(日) 16:44:38
426デフォルトの名無しさん:2006/02/12(日) 16:49:17
メイン   コンポーネント   スレッド
  メソッド
   →→
              生成
              →→

                  
     コントロールの操作
X  ←←←←←←←←←←イベントハンドラ実行
427デフォルトの名無しさん:2006/02/12(日) 16:49:17
デリゲートのEndInvokeとか、とにかくEnd○○って呼び出さないとメモリーリークするって本当?
毎回毎回コールバックでEndiInvokeを呼び出すのを書くのが面倒くさい・・・
428デフォルトの名無しさん:2006/02/12(日) 18:38:05
>>424
ISynchronizeInvoke
429デフォルトの名無しさん:2006/02/12(日) 18:46:45
>>428
を実装してもComponent1.Invokeメソッドをスレッドから呼んだらそれはスレッドで実行されてしまいませんか?
430デフォルトの名無しさん:2006/02/12(日) 22:46:12
お前はさっきから何言ってるのかさっぱり分からん。
デリゲートがコンポーネントの作成されたスレッドで動くなんて何で思った?
コンポーネントのInvokeってなんだ?

普通はISynchronizeInvoke実装しといて、
贅沢言うならデザイナで自動設定されるようにしとけば十分だと思うが。
431デフォルトの名無しさん:2006/02/12(日) 22:53:49
>>430
もっと勉強して下さい。

はい、次の有益情報どうぞ。
432デフォルトの名無しさん:2006/02/12(日) 22:58:16
氏ね
433デフォルトの名無しさん:2006/02/12(日) 23:04:34
>>430
俺の書き込みのどこら辺が勉強不足なのかをきっちり指摘してくれ。
434デフォルトの名無しさん:2006/02/12(日) 23:04:36
質問です。
C#のプロジェクトの一部をVB.NETで書くにはどうすればいいですか?
435デフォルトの名無しさん:2006/02/12(日) 23:05:42
そんなこと出来たっけかな?
436デフォルトの名無しさん:2006/02/12(日) 23:06:58
>>435
無理ですか?
437デフォルトの名無しさん:2006/02/12(日) 23:07:17
>>434 VBで暮らすライブラリ核。それをC#で使う。
438デフォルトの名無しさん:2006/02/12(日) 23:08:21
VB.NETでクラス・ライブラリを作って、C#から参照汁。
439デフォルトの名無しさん:2006/02/12(日) 23:11:30
>>437
その方法ではDLLファイルができてしまうのでいやです。
440デフォルトの名無しさん:2006/02/12(日) 23:11:43
それでいいんならそれだね。
同じプロジェクトでないといけないのなら厳しいかも。
441デフォルトの名無しさん:2006/02/12(日) 23:15:11
2005なら余裕ですょ。
442デフォルトの名無しさん:2006/02/12(日) 23:16:46
>>441
2005ならできますか?
443デフォルトの名無しさん:2006/02/12(日) 23:17:10
>>441 同じプロジェクトでできんの?
444デフォルトの名無しさん:2006/02/12(日) 23:19:23
無理
445デフォルトの名無しさん:2006/02/12(日) 23:20:27
>>444
できませんか?
446デフォルトの名無しさん:2006/02/12(日) 23:25:08
>>433
もはや私の問いに答えられてないので問題外です。

>>434

480 - 160= ?
447デフォルトの名無しさん:2006/02/12(日) 23:25:34
実用品かどうか不明だが ILMerge で dll や exe をまとめられるらしい
448デフォルトの名無しさん:2006/02/12(日) 23:29:39
>>446
できませんか?
449デフォルトの名無しさん:2006/02/12(日) 23:36:38
>>446
お前誰やねん。
お前の問いってなんやねん?
あれか?component1.Invokeって得体のしれんやつを呼んだときに
スレッドで実行されない(意味不明)ようにする方法ってやつか?
450デフォルトの名無しさん:2006/02/12(日) 23:40:12
>>448
さっきから何遍もひつこいんだよ。
MSDN読んでこい。
451デフォルトの名無しさん:2006/02/12(日) 23:43:16
>>449
もうほっとけ。
俺流理解でその間違いに気づきもしないやつは放置
452デフォルトの名無しさん:2006/02/12(日) 23:45:35
>>450
いや、ひつこいとかじゃなくて、できませんか?と訊ねてる。
453デフォルトの名無しさん:2006/02/12(日) 23:54:04
>>451
自己紹介乙
454デフォルトの名無しさん:2006/02/12(日) 23:56:53
>>449
ああ、そらそこだけしか読んでないなら意味不明ですね。
2chには初心者板があるのでそこで勉強されては銅でしょうか。
455デフォルトの名無しさん:2006/02/13(月) 00:02:49
勘弁してくれ。
全部呼んでも意味わからんわ。
だから>>430ではどう駄目なのかかけ。
デザイナの自動設定で足りないってんなら
どんなのを期待してんだ?
勝手に何に同期すればいいか判断しろってか?
だったらForm.ActiveFormあたりか、
それでは怪しいなら、いっそコンストラクタでスタックフレーム
取得して、呼び出し側のコントロールを探して、
SynchronizingObjectに自動設定でもしてやれよ。
456デフォルトの名無しさん:2006/02/13(月) 00:04:09
>>455
知識の無い>>454に遊ばれてるだけ。はよ気づけや。
457デフォルトの名無しさん:2006/02/13(月) 00:05:14
どこまでいくか見てる。
458デフォルトの名無しさん:2006/02/13(月) 00:19:25
まず >>409
delegateと実行スレッドは何の関連性もない。以下のコードのように
どっちでも出来る。

MethodInvoker invoker = delegate { Console.WriteLine(".."); };
invoker(); //これでこのスレッドで実行される
invoker(delegate (IAsyncResult r) { invoker.EndInvoke(r); }, null);
//これでスレッドプールを使う(別スレッド)

んで >>430
当然のごとく型システムの上にあるコンポーネントもスレッドに依存など
標準ではしないしだから同期する仕組みが必要になる。
そして、WinFormsはMessageLoopのスレッドに依存する。だから別スレッドから
操作することが出来ない。これを解消するために用意されている方法が
ISynchronizeInvokeとSyncObject。FileSystemWatcherあたりがこれを使用する。

>>409の「完全に間違った」前提で話すから「わけ分からん」といわれるのよ。
分かったらもうくるな屑が
459458:2006/02/13(月) 00:21:24
訂正

invoker.BeginInvoke(delegate (IAsyncResult r) { invoker.EndInvoke(r); }, null);
//これでスレッドプールを使う(別スレッド)
460デフォルトの名無しさん:2006/02/13(月) 00:29:19
> invoker(delegate (IAsyncResult r) { invoker.EndInvoke(r); }, null);
BeginInvokeって書かんでもいけたっけ?俺なんか勘違いしてる?
しかし匿名デリゲート使えばこんな風にできるか、そうか…
Fire&Forgetがやりやすくなるな…
461デフォルトの名無しさん:2006/02/13(月) 00:29:58
あら、訂正されてた…失敬。
462デフォルトの名無しさん:2006/02/13(月) 00:34:16
>>458
で、それを標準的なイベント呼び出しと同等に使えるわけ?
463デフォルトの名無しさん:2006/02/13(月) 00:39:30


イベントの呼び出しを必要に応じてInvokeで実行するんだよ。
ってか非同期イベントもった標準のコンポーネントはみんなそうなってるだろ。
464デフォルトの名無しさん:2006/02/13(月) 00:40:42
ああ、また勘違いされそうだな。
「イベントを発行する」コンポーネント側でInvokeするんだよ。
だから使う側からは普通とおんなじだ。
465デフォルトの名無しさん:2006/02/13(月) 00:44:51
まあせっかく教えても何も分かってないってこったな。

以下ループ
466デフォルトの名無しさん:2006/02/13(月) 00:45:32
>>464
なるほど、ようやく有識者が現れてくれました。ありがとうございました。助かりました。
467デフォルトの名無しさん:2006/02/13(月) 00:46:03
おれは>>430だばか。
468デフォルトの名無しさん:2006/02/13(月) 00:47:26
>>467
騙りは見苦しいです。
469デフォルトの名無しさん:2006/02/13(月) 00:47:54
おいおい(ry
470デフォルトの名無しさん:2006/02/13(月) 00:49:02
お前らのレベルには正直がっかりだぜ。
471デフォルトの名無しさん:2006/02/13(月) 00:51:48
>>462
少しは自分で考えろ屑。eventも大体delegateを使って実装するんだし、んなもの実装者が勝手に
決める。

TcpListenerあたりを使ってなんかのサーバーをやるコンポーネントを実装する例でも挙げてやる
Listenするスレッドでイベント処理もやってもいいがその場合処理が時間かかると普通はよろしくない
こういう場合にThreadPoolを使用する実装にしたいとしてこんなコードを書いてもいい。

public event EventHandler Request;
protected virtual void OnRequest(EventArgs e) {
 lock(this) {
  if(SyncObject!=null) {
   if(Request!=null)
    SyncObject.Invoke(Request, new object[] { this, e });
  } else {
   if(Request!=null)
    Request.BeginInvoke(delegate(IAsyncResult r) { lock(this) { Request.EndInvoke(r); } }, null);
  }
 }
}

結局のところ実装者による。
472デフォルトの名無しさん:2006/02/13(月) 00:53:14
>>458
冷静に読んだ。

当然のごとく型システムの上にあるコンポーネントもスレッドに依存など
標準ではしないしだから同期する仕組みが必要になる。
そして、WinFormsはMessageLoopのスレッドに依存する。だから別スレッドから
操作することが出来ない。これを解消するために用意されている方法が
ISynchronizeInvokeとSyncObject。FileSystemWatcherあたりがこれを使用する。
473デフォルトの名無しさん:2006/02/13(月) 00:53:57
>>471
>こういう場合にThreadPoolを使用する実装にしたいとしてこんなコードを書いてもいい。

俺はそう言う実装にしたくないので前提が崩れてしまいます。
474デフォルトの名無しさん:2006/02/13(月) 00:56:00
うーーんどういう意図で書き込んでんだろ?
475デフォルトの名無しさん:2006/02/13(月) 00:57:05
>>471
>Request(e);
作ったスレッドでメソッドが動こうとする。

>SyncObject.Invoke(Request, new object[] { this, e });
WinFormのスレッドでメソッドが動く。

こういう事?
476デフォルトの名無しさん:2006/02/13(月) 00:57:32
ちょっと聞いてみたいが、BeginInvokeのとこだけ
やめたらいいってことすら分からないのか、それとも
ただただ書き込んでるだけなのか?
477デフォルトの名無しさん:2006/02/13(月) 00:59:10
>>475
>>Request(e);
>作ったスレッドでメソッドが動こうとする。
「作った」スレッドじゃなくて「今まさに動いてる」スレッド。
「今ここを実行してる」スレッド。
478デフォルトの名無しさん:2006/02/13(月) 01:06:33
説明不足だったな。
この実装はほとんど屑の言っている要件を満たす目的でかいてる。
SyncObjectがセットされている場合はそれに同期したスレッドで実行し、
そうでない場合はThreadPoolを使う。まぁ標準的な実装だ。

ちなみに、実行スレッドと何の関係性もないことを示した先の書き込みの
意味を含めて、実際に実装者が勝手に指定できることを示すために
ThreadPoolを使っている。

>SyncObject.Invoke(Request, new object[] { this, e });
WinFormのスレッドでメソッドが動く。

これが同期する場合のすべてだ。この場合SyncObjectはプロパティな。
ちなみに、これのセット用のコードを直接コードジェネレータに吐き出させる
ことも出来るだろうがその話は長くなるので省略。
479デフォルトの名無しさん:2006/02/13(月) 01:30:05
>>478
問題はComponentからではWinFormに属するオブジェクトを取得できないことですな。
480デフォルトの名無しさん:2006/02/13(月) 08:43:09
>>479
みょんなことはない。
Designerを作ってInitializeあたりでGetServiceでIDesignerHost取って
RootComponentを取ってISynchronizedInvokeにasキャスト。
んでそれを渡されたコンポーネントのSyncObjectプロパティにセット。
もちろんそのコンポーネントのクラスにDesignerAttributeを指定すること。

プロパティ側はきちんとした値がセットされた場合にSerializeしてちょと
指定。でいけるはず。みょん。
481デフォルトの名無しさん:2006/02/13(月) 11:07:42
>>473
永久に悩んでろクズ野郎
482デフォルトの名無しさん:2006/02/13(月) 14:54:38
すみません、DataGridViewの内容を簡単にcsv出力する方法ありませんか?
なんか、命令一発で出来そうな気もするんですが、ググっても見当たらないんで、
自分で実装するしかないかないかなとあきらめ気味なんですが。
483デフォルトの名無しさん:2006/02/13(月) 15:19:00
内容をどうやってるかにもよるがまあ自力実装だな。
484デフォルトの名無しさん:2006/02/13(月) 16:47:09
コピー → Excelに貼り付け → 保存
485デフォルトの名無しさん:2006/02/13(月) 18:42:10
質問させてください。
Process.start()で、標準出力に1秒おきに1行適当な文字列を出力するプログラムを実行しています。
Process.StandardError.ReadToEnd()、ReadLine()では、そのプログラムが終了するまでストップしてしまい、リアルタイムに1行ずつ読み取ることができませんでした。
void Run() {
while(!this.process.HasExited) {
Thread.Sleep(50);
this.process.StandardOutput.ReadToEnd(); // ←ここでストップ
}
}
リアルタイムにReadしたい場合はどうすればよいのでしょうか?
486デフォルトの名無しさん:2006/02/13(月) 18:49:08
ReadLineなら問題ないはずだが。どこかでロックかけてないか。
とりあえずReadで一文字ずつ読んでけば?
あとRead系は読みとれるまでブロックしてくれるので、Thread.Sleep呼ぶ必要はないはず。
487デフォルトの名無しさん:2006/02/13(月) 19:55:34
>>483
レスありがとうございます。自力で実装します・・・。

>>484
レスありがとうございます。笑わせて頂きました・・・・。
488デフォルトの名無しさん:2006/02/13(月) 19:56:26
こんばんは、
EPSファイルを、GIFファイルに、変更するフリーのDLLないでしょうか。

できれば、EPSを読み込んだあと、GetPixel()とかできるのがよいです・・。


(VC++とWIN32APIとのスレとの重複投稿です、どこに投稿すればよいのかわからなかったんで、
大変恐縮ですが、3つのスレに投稿させていただきました。)
489デフォルトの名無しさん:2006/02/13(月) 20:12:50
>>486
レスありがとうございます。
どうしても、ReadLine、Readでとまってしまいます。変なことはしていないはずなのですが…

private void button1_Click(object sender, System.EventArgs e) {
MyThread mt = new MyThread(this.textBox1);
Thread t = new Thread(new ThreadStart(mt.Run));
this.textBox1.Clear();
t.Start();
}
public class MyThread {
ProcessStartInfo psi;
TextBox tb;
public MyThread(TextBox tb) {
ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = @"C:\MyCode\C\out.exe"; // C言語で1秒おきに4回puts()するプログラム
psi.RedirectStandardOutput = true;
psi.RedirectStandardError = true;
psi.CreateNoWindow = true;
psi.UseShellExecute = false;
this.psi = psi;
this.tb = tb;
}
public void Run() {
Process p = Process.Start(this.psi);
StreamReader errs = p.StandardError;
StreamReader outs = p.StandardOutput;
while (!p.HasExited) {
//while (outs.Peek() > 0) {
this.tb.Text += outs.ReadLine() + "\r\n";
//}
}
490デフォルトの名無しさん:2006/02/13(月) 20:29:01
ども、初心者です。
KeyDownまたはKeyPressイベントをコードで
生成したいのですが、どのように書いたらよろしいでしょうか?
Clickはbtn.PerformClickでできると思うのですが、
同じように「txtBoxに対してF8キーが押された」というような
「txtBox.SendKeys(Keys.F8)」みたいなことがしたいのですが...。
どなたかアドバイスご教授よろしくお願い致します。
491485=489:2006/02/13(月) 20:35:05
ごちゃごちゃにしてしまって大変申し訳ありません。
要は、Start()したProcessをProcess.StandardOutput/Error.ReadLineする時、489の方法ではProcessが終了するまで固まってしまうので、それを回避する方法を探しています。
何かよい方法はありませんか?
492デフォルトの名無しさん:2006/02/13(月) 20:37:02
>>489
ほぼコピペしただけだけど再現しないね。
// 問題ありまくりなコードだな。

>>490
冷静に考えてみれば実行したいメソッドを呼べば済む話だったりしない?
SendKeysクラスもあるけど。
493デフォルトの名無しさん:2006/02/13(月) 22:00:49
>>488
C#とどう関係あるか説明してから質問しろ
494デフォルトの名無しさん:2006/02/13(月) 22:04:46
昨日荒れてたテーマなので恐縮です。
Fire-and-Forgetで非同期デリゲートを使うときにコールバックを使うのは理解できているのですが、
Control.BeginInvokeではコールバックを指定することができないようです。
Control.BeginInvokeでFire-and-Forgetをしたいときはどういう手段があるのでしょうか。
495デフォルトの名無しさん:2006/02/13(月) 22:08:03
monodoc読んで来い。
496デフォルトの名無しさん:2006/02/13(月) 22:52:23
>>494
ISynchronizeInvokeは「同期」するための機構であって「非同期」するための
機構じゃないんだな。
というかメソッドの名前が同じなのが勘違いのすべての原因な気がするが。
Fire-and-Forgetは非同期なわけで使えないと。したいんならそれ自体を
delegate.BeginInvokeに組み込みなされ

MethodInvoker invoker = delegate {
 this.Invoke(new MethodInvoker(delegate {
  //同期コード
 }));
};
invoker.BeginInvoke(delegate(IAsyncResult r){ invoker.EndInvoke(r); }, null;);

まぁまず使うことないんだけどな。ワーカースレッドは普通ステップ的だし
UIスレッドと対話するなら大抵レスポンスは必要だ(いらんでもUIの更新が
終了して普通Completeだろうよ)。
497デフォルトの名無しさん:2006/02/13(月) 23:55:50
>>480
そこまでせんといかんですか。

Delphiならコンストラクタで親のTComponentが渡ってきてたのですが、
ここまで来るともはやクラスライブラリの設計ミスですね。
498デフォルトの名無しさん:2006/02/14(火) 00:19:17
>>497
そこまで?クラスコードを入れてせいぜい20行ぐらいでできるけど…。
実装だけなら数行。
というか5分で作って確かめて投稿したんだけど。

Delよりもデザインやらコンポーネントのフレームワーク自体大掛かりだから
クラスは確かに多くて複雑だけど、設計ミスってのは感じないな
499485=489=491:2006/02/14(火) 03:45:13
>>492
http://www.t-server.net/clip3/file/14.zip
これは動作しますか?私の環境ではうまくいきません…
500デフォルトの名無しさん:2006/02/14(火) 06:33:08
質問です。
現在のスレッドのProcessThreadのインスタンスを取得したいのですが、MSDNを読んでもいまいち方法がわかりません。
ProcessクラスやThreadクラスにも取得するメソッドがないようです(コレクションは取得できるようなのですが)。
どなたかわかる方いますか?
501デフォルトの名無しさん:2006/02/14(火) 07:18:44
Process.CurrentProcess.Threadsを回して、IdプロパティをGetCurrentThreadIdで取得したIDと比較していく。
GetCurrentThreadIdはAppDomainにあったんだが、.NET 2.0でObsoleteになったのでWin32APIの方で。
502500:2006/02/14(火) 07:58:42
>>501
どうもです。
うーんやっぱりそれしかないんでしょうか・・・
スマートとは言い難い方法なので、できればもっと直接的に取得する方法を知りたいのですが。
まあないのなら仕方ないですが

503デフォルトの名無しさん:2006/02/14(火) 08:29:49
>>499
うまく動かないねぇ。
原因までは追及できないけど、Cの実行ファイルの問題のようだ。
.NETでない標準出力リダイレクタでも最後にまとめて出力される。
504デフォルトの名無しさん:2006/02/14(火) 09:52:02
>GetCurrentThreadIdはAppDomainにあったんだが、.NET 2.0でObsoleteになったのでWin32APIの方で。
API使ってまでobsoleteは避けるべきなの?
このobsoleteの理由からも意味ないと思うんだが。
505デフォルトの名無しさん:2006/02/14(火) 10:01:35
3.0で消えてるかもしれないじゃん? それならAPI使った方がいいやってだけ。
warningが鬱陶しいってのもある。
506デフォルトの名無しさん:2006/02/14(火) 10:42:18
Thread.ManagedThreadId
507デフォルトの名無しさん:2006/02/14(火) 12:06:54
そういうこと言ってんじゃない。
508デフォルトの名無しさん:2006/02/14(火) 14:47:47
2.0から新規でプロジェクト作成するとIDEが
partialキーワードでFormクラスを二つに別けてますよね。

画面上のコントロールに対する独自の初期化処理って
みんなどっちに書いてます?
どっちかが推奨されているとか無ければ、
InitializeComponent呼び出しの後に追加したいんですが、
どうでしょう?
509デフォルトの名無しさん:2006/02/14(火) 14:49:45
Designer.cs を弄ってほしくないから別ファイルに分けてあるってのに
510デフォルトの名無しさん:2006/02/14(火) 14:51:44
>>509
よく分かりました。
ありがとうございました。
511デフォルトの名無しさん:2006/02/14(火) 16:17:04
STLのmapとかvectorみたいに
入れるものの型を指定できるリストは無いですか?
512デフォルトの名無しさん:2006/02/14(火) 16:17:42
List<T>
513デフォルトの名無しさん:2006/02/14(火) 16:19:15
>>512
詳しく
514デフォルトの名無しさん:2006/02/14(火) 16:20:59
>>512
詳しくもくそも.NET 2.0の目玉機能だ。2005Expressを落とせ。
515デフォルトの名無しさん:2006/02/14(火) 16:21:35
System.Collections.Generic.List<T>
516デフォルトの名無しさん:2006/02/14(火) 16:23:51
>>514
>>515

System.Collections.Genericが出ない・・・
古いからかorz
517デフォルトの名無しさん:2006/02/14(火) 17:10:35
>>516
だから 2005 入れろって。
Express ならただだから。
518デフォルトの名無しさん:2006/02/14(火) 18:08:50
ProcessクラスのメンバにはCPU使用率を取得できるのは無いですよね?
そこで、PerformanceCounterクラスの説明を読んだのですが、
windowsのタスクマネージャのような
プロセス毎のCPU使用率を取得したい場合、
何秒か毎に全プロセスのCPU使用率を取得したら、
メモリかなり食うと思うのですが、
他に方法は無いのでしょうか?
(タスクマネージャは家の環境では概ね平均4Mbyte程度のメモリしか使わないので)

厳しく導いてください。
519デフォルトの名無しさん:2006/02/14(火) 18:28:56
なんでメモリかなり食うと思ったですか?
520デフォルトの名無しさん:2006/02/14(火) 18:33:43
>>519
今実際にProcessクラスを利用して5秒おきに

プログラムへのフルパス
プログラム名
会社名
このファイルを含む製品の名前
プロセスID
プログラムの説明
メモリ使用量

を取得してます。(実際には毎度取得するのはメモリ使用量だけにしてます)
フォームに上記の機能だけ持たせて実行すると15メガ位メモリを使っています。

これに更にCPU使用率のロジックを追加したら。。っと思いました。
タスクマネージャは軽いのになぁと言う思いから質問させていただきました。

521デフォルトの名無しさん:2006/02/14(火) 18:36:57
フォームに何の機能も持たせずに実行させてそれとの比較はしたのか?
522デフォルトの名無しさん:2006/02/14(火) 18:51:02
同じGUIプログラムを.NET1.1と.NET2で配布したい場合
コアルーチンとGUI.csを分けるしかないですよね。

コアルーチンを1つ作って
1.1用のGUIと2.0のGUIをVS2003とVS2005で作るのがベター?
523デフォルトの名無しさん:2006/02/14(火) 18:54:15
全く同じGUIなのなら、app.configでsupportRuntime属性設定すれば良くね?
524デフォルトの名無しさん:2006/02/14(火) 18:56:07
微妙に間違えた。supportedRuntime
つか1.1のアセンブリを2.0しか入ってない環境で動かしたら自動的に2.0で動くんだからそれで良いんじゃね?
525デフォルトの名無しさん:2006/02/14(火) 19:13:03
互換性のない動作も結構あるけどな・・
526デフォルトの名無しさん:2006/02/14(火) 19:28:20
>>517
仕事だからさ、開発環境決められてるんだよ・・・・
まぁObject型で入れてキャストして使えばいいんだけどさorz
527デフォルトの名無しさん:2006/02/14(火) 19:30:51
>>526
そりゃ駄目だ。

つーか、2.0のこと全く調べてなかったのかよ
528デフォルトの名無しさん:2006/02/14(火) 19:32:06
>>527
新規じゃないから・・・・
1.1からの変更だからorz
529デフォルトの名無しさん:2006/02/14(火) 19:35:08
>>528
ならあきらめて object からダウンキャスト。
ジェネリクス使いたかったら .NET Framework 2.0 必須。
530デフォルトの名無しさん:2006/02/14(火) 19:38:01
>>529
そうします
531デフォルトの名無しさん:2006/02/14(火) 19:39:00
専門でJavaやっています。
C#は初めて触るのですが
マウスのドラッグで範囲選択したものをコピーするアプリを作ろうと思ったのですが
慣れのせいもあるんでしょうが、C#のクラスライブラリの見方がいまいち分かりません・・・
ドラッグしたものをクリップボードに格納するのに必要なMethod等を調べたいのですが
どなたかヒントをいただけないでしょうか?

ちなみに作ろうと思っているものは、たとえば
例:A
a:link { text-decoration:none;color:gray; }
a:visited { text-decoration:none;color:gray; }
a:active { text-decoration:none;font-size:11pt;color:gray;}
a:hover { text-decoration:color:gray;}

というのがあったとして以下を範囲指定してコピー、カット、ペーストが出来る物を作りたいんです。

例:B
{ text-decoration:none;color:gray; }
{ text-decoration:none;color:gray; }
{ text-decoration:none;font-size:11pt;color:gray;}
{ text-decoration:color:gray;}

エディタにまで仕上げるのは流石にしんどいので外部エディタ上から
例Aを本アプリ上にコピペ、本アプリ上でドラッグで範囲選択してコピー
と、いうような手法をとろうと思ってるのですが・・・
532デフォルトの名無しさん:2006/02/14(火) 20:09:55
矩形選択はWindows標準ではできないぜ?
533デフォルトの名無しさん:2006/02/14(火) 20:13:08
>>532
お返事ありがとうございます。
出来ないのですか・・・
SQLplusで使える機能で痒いとこに手が届く感じで
便利だと思ったのですが(´・ω・`)
534デフォルトの名無しさん:2006/02/14(火) 20:17:26
矩形選択できるエディタなんてそこらじゅうに転がってるだろ。
535デフォルトの名無しさん:2006/02/14(火) 20:20:21
矩形がポイントじゃなくて
自分で '{' 〜 '}' とか欲しいところを
決められるのがキモなのではないかと
第三者が推測してみる。

俺はGUIプログラミングしないから
実現方法はシラネけど。
536デフォルトの名無しさん:2006/02/14(火) 20:28:59
>>535
それなら
> 例Aを本アプリ上にコピペ、本アプリ上でドラッグで範囲選択してコピー
というのが意味不明になっちゃうしねー。
テキストボックスに文字列貼り付けてその中の条件に合う文字列をピックアップ、なら簡単に可能だけどさ。
537デフォルトの名無しさん:2006/02/14(火) 20:31:09
>>534
エディタはSakura使ってます。
ただ勉強がてらっていうのと
自分で何かひとつWebアプリとかではない作品を作ってみたかったんですよね。

>>535
ポイントはやっぱし矩形ですねぇ・・・
'{' 〜 '}' ←これだと正規表現で出来ますしね。
538デフォルトの名無しさん:2006/02/14(火) 20:39:27
それは失礼。
539デフォルトの名無しさん:2006/02/14(火) 20:52:27
矩形選択は標準じゃないだけで自力実装すれば可能。
ただし、オーナードロー必須だしマンドクセ要素はたくさん。
.NETよりもWin32APIの使い方の方を知る必要があるから.NETの勉強にはならない。
Win32API用の記述となればC#らしい書き方もそんなにできないからC#の勉強にもならない。

勉強でやるとするなら方向を間違ってるからやめとき。
540デフォルトの名無しさん:2006/02/14(火) 21:29:12
>>539
なるほど・・・
.NET、C#を勉強したいのも確かなんですが
ひとつのアプリを作ってみたいっていうのが第一ですね。
普段作ってるのがWebアプリとかなんで
一つの形になるものが作ってみたいんですよねぇ(´・ω・`)
頑張ってみます。
541デフォルトの名無しさん:2006/02/14(火) 21:58:50
>>508,509
Initializeは.Designer.csに書かなくてもコンストラクタの続きに書けばほとんど問題ないんですけど。

partialで分かれたComponentクラスのDispose処理ってどう書いてます?

自分はDesigner.csのDispose(bool disposing)の中に処理追加してるんですけど。
(Designerじゃないほうのコンストラクタの下にコメントをつけてDesignerを変更したことは分かるようにしてある)
542デフォルトの名無しさん:2006/02/14(火) 22:08:45
可能な限りフォームで独自のDisposeが必要になるようなことはしない。
543デフォルトの名無しさん:2006/02/14(火) 22:09:47
もしくはイベントでやる。
544デフォルトの名無しさん:2006/02/14(火) 22:50:12
ToolStripに入りきらないくらいボタンたくさん作ると、
はしっこに入りきらなかった分を表示するプルダウンが現れるが、
ボタンが入り切らなくなったら2段にするとかできんのかな。
Windowsのタスクバーはそうなるんだけど。
545デフォルトの名無しさん:2006/02/14(火) 23:16:31
自分で作れ
546デフォルトの名無しさん:2006/02/14(火) 23:27:28
レスサンクスです
そうしたいのはやまやまなんですけど
他のDLLと連携するようなカスタムコンポーネントを作っててとDisposeで処理が必要な事が結構出てきてしまって
継承した場合、自分のイベントを使うんじゃなくて、overrideするようにしているからなぁ。
該当箇所だけ、Disposedイベント使おうと思います。

ところでみなさんはForm継承やUserControl継承のときは自分のイベントを使う派? override OnXXX派?
自分は制御が明示的にわかるのでoverride派。デザイナ使うの面倒だし
547デフォルトの名無しさん:2006/02/14(火) 23:42:29
すみません、上の方でプロセスについてお伺いしたものです。
例えば以下のようなコードで、現在動いている全てのプロセスを取得したいとします。

ArrayList al = new ArrayList();
// Get all processes running on the local computer.
Process[] localAll = Process.GetProcesses();
for (int i = 0; i < localAll.Length; i++)
{
al.Add(localAll[i].Id.ToString());//プロセスID
al.Add(localAll[i].WorkingSet.ToString());//メモリ使用量
al.Add(localAll[i].MainModule.FileName);//FileVersionInfo のこのインスタンスが記述するファイル名を取得します。
al.Add(localAll[i].MainModule.ModuleName);//プロセス モジュールの名前を取得します。
al.Add(localAll[i].MainModule.FileVersionInfo.CompanyName);//開発会社名
al.Add(localAll[i].MainModule.FileVersionInfo.ProductName);//プロダクト名
}

この時、今のところ以下の四つのプロセスには存在しないプロパティがあります。(MainModuleなど)
winlogon.exe
csrss.exe
System Idle Process
System

この為、ループ中に上記のプロセスのプロパティを取得しようとすると例外が発生します。
上記4つだけという確証が無いのですが、
例えば通常のデスクトップアプリケーションには必ず、
Id
WorkingSet
MainModule
MainModule.FileVersionInfo
は、存在するものとしてよいのでしょうか。
548デフォルトの名無しさん:2006/02/14(火) 23:51:07
>>546
僕もoverride派。
こだわりというか最初の仕事のコーディング規約になってたから、慣れちゃったです。

>>547
どうなんだろう。。(じゃ、レスすんなって)
549544:2006/02/14(火) 23:52:20
>>545
orz
実は自分で作ったのあるけど、ちと重いんだよね・・・
あと、ControlPaintってXP風のコントロール描画には対応してないみたいだし。
550デフォルトの名無しさん:2006/02/15(水) 00:04:21
>>547
try-catchすれ。そうすれば存在するかどうか悩まなくて済む。
551デフォルトの名無しさん:2006/02/15(水) 00:26:53
>>550
ありがとうございます。
今のところ発生している例外が2種類ありまして、
System.ArgmentExceptionと
Win32Exceptionなのですが、
他の例外があったとして、発生するかもしれない例外を
全てキャッチするという作業は、例外の切り分けが発生し、(プロセスによって存在するプロパティがまちまち)
結局、汎用性ゼロになってしまわないかと思い、
悩んでしまっていました。
そこで、プロセスIDはどのプロセスにも存在するので、
winlogon.exe
csrss.exe
System Idle Process
System
だけ(もしくは他数種類)なのであれば、条件分岐してしまおうかと思ってしまった次第です。

夜遅くにすみませんでした。
もう少し考えて見ます。
ありがとうございました。
552デフォルトの名無しさん:2006/02/15(水) 01:34:45
リストビューのサブアイテム部分に
コンボボックスかラジオボタンを表示して
ユーザーに操作させたいんですけれど

オーナードローでどうにかするもなんでしょうか?(できるのかはわからないけど)
それともリストビューを使うことが間違ってる?

だれかご教示お願いします
553デフォルトの名無しさん:2006/02/15(水) 01:47:21
>>552
でーたぐりっどびゅー
554デフォルトの名無しさん:2006/02/15(水) 01:47:40
DataGridViewの方が楽だと思う
555デフォルトの名無しさん:2006/02/15(水) 01:50:15
ListViewはオーナードロー自体.NET 2.0にならないと絶望的だが。
そしてそう言う用途なら.NET 2.0ではDataGridViewの方が楽。
556デフォルトの名無しさん:2006/02/15(水) 03:58:00
でーたぐりっどびゅーですか
了解しました、ありがとうございますた
557デフォルトの名無しさん:2006/02/15(水) 04:07:19
C#2005で処理結果をhogehoge.txtというファイルに出力したいのですが
なんていう命令使えばいいですか
558デフォルトの名無しさん:2006/02/15(水) 04:08:42
解決したっぽいです
559デフォルトの名無しさん:2006/02/15(水) 10:40:27
>>552
DataGridView以外だとサブアイテムの位置を取得して、編集のときだけ事前に準備したコンボボックスやらラジオボタンを表示すればいいかと。
オーナードローなんて最終手段であって、別の方法を探せばなんぼでもある。
もしやるとしても、ListViewのオーナードローは.NET的な方法じゃなくWin32API的な方法でやったほうが良い。
560デフォルトの名無しさん:2006/02/15(水) 12:55:36
DataGridViewってアホが使うと激しく遅くなるな。
アホっておれのことだけど。

「Windows フォーム DataGridView コントロールを拡張するための推奨される手順」
読んでようやく使える速度になってきた
561デフォルトの名無しさん:2006/02/15(水) 17:19:17
BackgroundWorkerって使い物になる?

というのは、画面にボタンとプログレスバー、リストビューを置いて、
ボタンクリック時にRunWorkerAsyncを呼び出して、
DoWorkイベントでループで0〜10000まで回して、
ループの中で別の自分で作った関数を呼び出して(引数にはBackgroundWorkerとDoWorkEventArgs)
そこで、GUIの更新(リストビューにアイテムを追加)して、ReportProgressを呼び出す。
そして、ProgressChangedイベントでプログレスバーの値をカウントアップ。

思いっきり、メインのGUIの操作(画面の更新)が出来なくて固まったようになるんだが・・・

確かにプログレスバーはちゃんと更新されるが、他の操作が出来ない。
キャンセルボタン置いても、イベントが発生しないから止まりゃしない。

562デフォルトの名無しさん:2006/02/15(水) 17:21:24
そんだけGUIスレッドに付加書け照れば当たり前。
作り方が間違ってる。
563562:2006/02/15(水) 17:25:12
ということは、GUIスレッド(画面をメインとする)とは別のGUIスレッドで
リストビューなどを更新しろって事かな?

つまり、BeginInvokeつかって非同期でやれって事?

いまいち、BackgroundWorkerの使い方が分からん。
BackgroundWorkerを使った場合、どうすりゃいいんだ?
564561:2006/02/15(水) 17:25:59
やべ、名前間違えた
>>562すまん。
565本物の562:2006/02/15(水) 17:32:25
暇だからいうと画面の更新を500ミリ秒ごととかにする。
バックグラウンドスレッドで処理
フラグ立てる。
GUIタイマーでフラグチェック。必要なら描画。

566561:2006/02/15(水) 17:39:19
>>565
>暇だからいうと画面の更新を500ミリ秒ごととかにする。
これ、意味が良く分からない。
とりあえず、ループの中でSleep(1)とかしたら、いい感じで更新されたが、
いまいち納得できない。

>バックグラウンドスレッドで処理
BackgroundWorkerってバックグラウンドスレッドじゃないの?

>フラグ立てる。
>GUIタイマーでフラグチェック。必要なら描画。
これも、俺には理解できない。(無知ですまん)


ちなみに、リストビュー操作部分をコメントアウトしてみたが、結果は同じだった。
GUIスレッド云々というか、そもそも for でループしてるのが悪いみたいだ。

そういや、BackgroundWorkerのサンプルプログラムって再帰(フィボナッチ)とかSleepしてるのぐらいしか
見たことないなぁ・・・
567562:2006/02/15(水) 17:48:39
さっき書いたのは、概念なので実装は適当に汁。
BackGroundWOrkerやよく知らんけどたぶんそう。
・バックグラウンドはフルに仕事していい。
・仕事する中、GUI画表示するのに必要なデータを場合に応じて更新。データ変わったよ変数trueに。
・GUIスレッドでタイマー動かしておく。タイマーイベントでデータ変わったよ変数チェック。
・trueなら必要なデータ見て画面更新。

基本はバックグラウンドはフルに処理。
GUIはフルに表示することに意味がない(人間の反応速度はそれほど速くない)ので適当な間隔500ミリぐらいで更新すれば十分。
いまバックグラウンドで画面更新処理を直接呼んでいるため必要以上にGUIを更新してる->反応しないようになってる。
568デフォルトの名無しさん:2006/02/15(水) 17:50:40
CPUが複数あるならともかく、一つしかないのなら結局処理できるスレッドは一つ。
そのスレッドが他のスレッドを全く気にせずループ回しゃあ、そりゃ他のスレッドは動けない。
569デフォルトの名無しさん:2006/02/15(水) 17:57:00
windows3.1かよ
570561:2006/02/15(水) 18:01:25
>>567
>いまバックグラウンドで画面更新処理を直接呼んでいるため必要以上にGUIを更新してる->反応しないようになってる。

なんか、納得したかも。
確かに、プログレスバーの更新部分も呼ばないようにしたら、動作は問題なくなった。

でも、別の疑問が。
処理が長い場合、プログレスバーとかで状況が確認できるようにしたり、
GUIを操作する場合、例えばあるディレクトリをルートとしてサブディレクトリやファイルを
再帰的に取得したものをツリービューに表示させたりする場合とかだと、
スレッド使って画面が固まったように見せることが出来ないってことなのか?
571デフォルトの名無しさん:2006/02/15(水) 18:10:40
>>570
ちょっとは自分で調べろ
それ以前に言葉の使い方を勉強し直せ
572デフォルトの名無しさん:2006/02/15(水) 18:14:44
まさかとは思うがControl.Invoke/BeginIvokeを使わないでワーカースレッドから直接GUIを操作してないだろうな?
573561:2006/02/15(水) 18:26:39
>>572
使ってないよ。

というか、プログレスバーを使った更新サンプルがMSにある。(フィボナッチ使うやつ)
ProgressChangedでプログレスバーを更新してるのはサンプル通り。

ワーカースレッドからGUIは操作自体出来ないんじゃないのか?(エラーになるだろ)
574デフォルトの名無しさん:2006/02/15(水) 18:50:40
BackgroundWorkerはその辺の事を自動でやってくれる。
というかそのために作られた。
大体1万回も画面に通知するのが間違い。
例えば100ループで1回にするとか、調整がいる。
575デフォルトの名無しさん:2006/02/15(水) 18:55:14
画面側がタイマーでやってもいいけど、
BackgroundWorkerはそういう設計にはなってない。
基本は、ワーカー側から通知という考え方になってる。
576561:2006/02/15(水) 18:57:57
>>574
>大体1万回も画面に通知するのが間違い。
>例えば100ループで1回にするとか、調整がいる。

いや、プログレスバーの更新とかはそれで良いかもしれないが、
さっきも書いたようにディレクトリを再帰的に・・・といった場合、
ツリービューにアイテム追加するとかは、そうもいかないんじゃ?
577562:2006/02/15(水) 19:05:37
>>570,576
すまない。もう少しわかりやすく行ってくれ。
ツリーとかにひとつずつ追加するしかなく、画面更新が頻繁になるということ?
ツリーの仕様がそうならそう。
画面更新せず追加できるモードがあるならそれ使え。
578デフォルトの名無しさん:2006/02/15(水) 19:08:30
君はもし1万個アイテムがあったとしたら、
1万回「画面」を更新するのかね?
BackgroundWorkerの通知は、あくまで進捗状況のユーザへの通知が目的。
579561:2006/02/15(水) 19:13:21
>>577>>578
いや、ツリービューとかはただの例え話だよ。

>BackgroundWorkerの通知は、あくまで進捗状況のユーザへの通知が目的。

これも言ってる事は分からなくはないが、
進行状況をプログレスバーに表示するだけなのに、画面が使い物にならなくなるんじゃ、
身も蓋も無いって事ね。

進行状況のプログレスバーは1万回画面を更新する必要はあると思うけどね。
確かに100回に1度、更新するって話も分かるが、
実際問題として、更新状況ってのはちゃんと更新されてるアプリのほうが多いよね。
580562:2006/02/15(水) 19:16:43
・・・なんかもう好きにしてくれ・・・
581デフォルトの名無しさん:2006/02/15(水) 19:17:35
>>579
CPUバウンドな処理をバックグラウンドでやりたいならスレッドのプライオリティを下げればいいが、
BackgroundWorkerはThreadPoolを使ってるようだから勝手にいじっちゃいけないのかな。
582デフォルトの名無しさん:2006/02/15(水) 19:28:55
>>579
プログレスバーを一万回更新しても、実際にGUIが変わったように見えるのはその1%あるかって程度だと思うんだけど。
独自プログレスバーでピクセル単位で更新できたとしても精々4、500ピクセルだろ?
583デフォルトの名無しさん:2006/02/15(水) 19:32:31
使い方間違ってて使い物になんねーって愚痴いってる痴愚がいるスレはここですか?
584デフォルトの名無しさん:2006/02/15(水) 19:57:23
どのていど通知が必要になるかなんて処理によりけりだろうが
そりゃ1時間かけて1万個処理するなら1万回更新してもおかしくないが、
更新処理だけで固まってしまうような頻度の処理毎に
画面を更新なんてありえんだろ。
仮に画面というかウィンドウの更新が間に合ったとしても、
実際に表示されてない速さじゃ無意味。
585デフォルトの名無しさん:2006/02/15(水) 20:45:01
それ以前に言葉の使い方を勉強し直せ
586562:2006/02/15(水) 20:54:51
何つーか教える期がうせるやり取りだった
587デフォルトの名無しさん:2006/02/15(水) 21:08:38
もしかしてProgressChangedでリストビューにコントロール追加してるの?
普通コレクションとかにつっこんどいてあとでまとめて追加するんじゃないの?
588561:2006/02/15(水) 21:35:49
>>587
まず、話の流れからちゃんと整理してくれ。

ProgressChangedで書いてるのはプログレスバーの値を更新してるだけ。
589デフォルトの名無しさん:2006/02/15(水) 21:43:37
今のコードがそうなだけで、話の流れからいって、
例えばもし画面のリストに追加していく処理なら
きっとその処理も同じとこでやってるだろう。
590デフォルトの名無しさん:2006/02/15(水) 21:51:53
>>588 お前は人に教えを請う姿勢じゃない
591デフォルトの名無しさん:2006/02/15(水) 21:54:09
BackGroundWorkerのサンプルみてないから解らんけど、プログレスバー更新の頻度が多すぎるから、
メインのGUIにユーザーがフォーカスを当ててもプログレスバーがフォーカスを奪ってしまっているとかは?
プログレスバーの更新処理を行っているメソッドで適当に時間管理して、何秒経ったらプログレスバーを更新汁、みたいなフラグ入れればいいんじゃない?

ちょっと試してくる。
592561:2006/02/15(水) 22:00:25
>>589
あのさ、もう少し流れ読もうよ。

確かに最初はProgressChangedで全部書いてた。
でもって、これじゃ動作がおかしいから、ProgressChangedにプログレスバーの更新処理だけにした。
だけど、それでも動作がおかしい。(つまり、ここにリストビューの処理を書いていた事が原因じゃない)
試しにプログレスバーの更新処理もコメントアウトしてみた。(ここで予期した通りの動きになった)

そこで沸いたのが別の疑問。
進行状況を知るためのイベントで進行状況を視覚的に分かるように
プログレスバーを使用したら動かない。
これってどういうこと?
って事。

理解できたか?

>>591
プログレスバーにフォーカスって・・・
既に書いたけど、for ループの中にThread.Sleep(1)とでも入れると問題無かった。

593デフォルトの名無しさん:2006/02/15(水) 22:04:08
>>592 おまえほんとーーーーーーーーーーーにプログラムの素質無いからやめろ。
これだけ説明されて何が原因かわかってないのか?
594591:2006/02/15(水) 22:18:44
プログレスバーがフォーカス奪う、って俺バカだwwww
595デフォルトの名無しさん:2006/02/15(水) 22:28:49
>>561
この馬鹿。
お前がちょっとおかしい人だから
ここの他の知識ある奴がいきり立って
俺が質問しにくくなるだろうが。

という理由から、
俺はお前に対して「迷惑なやつだな」と感じている。
お前が「俺はできる方なんだぜ」って暗にアピールしてるのを
俺はちゃんと感じ取ったから、
もうその辺で態度改めてください。
596デフォルトの名無しさん:2006/02/15(水) 22:33:17
もう訳分からないので、
誰かここまでのやりとりをまとめてください
597デフォルトの名無しさん:2006/02/15(水) 22:39:05
>>596
脳ROM者現る
598デフォルトの名無しさん:2006/02/15(水) 22:50:58
>>596
もう大丈夫なので安心汁。
599デフォルトの名無しさん:2006/02/15(水) 23:38:25
ToolStripをデフォルトカラーのOffice風じゃなく、
Visual Studioみたいにグレー調にしたんだけど、
やっぱToolStripRendererをちゃんと作らないと駄目かな・・・
600デフォルトの名無しさん:2006/02/16(木) 01:13:07
任意の文字列のN番目から別の文字列で上書きしたいんですが、
N番目からRemoveしてからInsertするという書き方以外に良い方法
がありましたら、教えてくださいませんか。
601デフォルトの名無しさん:2006/02/16(木) 01:15:15

String.Format("{0");
602デフォルトの名無しさん:2006/02/16(木) 01:16:19
nantoka.Substring(0,n-1)+kantoka
603デフォルトの名無しさん:2006/02/16(木) 01:17:34
>>599
つ クラシックモード
604デフォルトの名無しさん:2006/02/16(木) 01:18:02
書いてる途中で送っちまった。
つまり、String.Format("{0}{1}",a.Substring(0,N),"上書きしたい文字列")とかどうよ。
605デフォルトの名無しさん:2006/02/16(木) 01:19:48
>>604
なにはともあれ、おまい優しいな。
愛してはないけど好きだ。
おやすみ。

>>600の為に言っとくけど別人だからw
606デフォルトの名無しさん:2006/02/16(木) 08:28:17
>>602,604
レスありがとうございます。
言葉が足りなくてすみません。
あいうえおかきくけこ←任意の文字列

AAA←別の文字列で3番目から上書き
あいAAAかきくけこ
とこういうふうな処理をしたいわけなんですが
Replaceは、検索文字列がいるし
Remove→Insertではスマートじゃないかなあ
と思ってるわけなんですが…、いい方法はありますでしょうか?
607599:2006/02/16(木) 10:17:38
>>603
さすがに今更それは見栄えがしない・・・
てかなんでOfficeXP風がデフォなんだよ。
せめてstaticで用意してよ、ゲイツタン。
608デフォルトの名無しさん:2006/02/16(木) 10:33:10
>>606
string s = "あいうえおかきくけこ";
Microsoft.VisualBasic.CompilerServices.StringType.MidStmtStr(ref s, 2, 3, "AAA");

えーとMidステートメントをC#で使うにはこれでいいんだっけ・・・
609デフォルトの名無しさん:2006/02/16(木) 11:32:12
>>607
ToolStripRenderMode.Systemじゃダメなん?
610デフォルトの名無しさん:2006/02/16(木) 11:51:15
strip系のメニューでチェックつけるとチェックの背景が
ハイライトの色になるってのもなんとかしてほしい
611599:2006/02/16(木) 12:48:59
>>609
これだとのっぺりしすぎなんだよね。境界線がないし。
612デフォルトの名無しさん:2006/02/16(木) 14:06:00
>>610-611
標準に文句があるなら自分で作るべし
開発者だろ?
613599:2006/02/16(木) 14:26:19
んなことはわかってるよ。豚。
言いたいのはなんでダサいOfficeXPスタイルがデフォなんだということだ。
614デフォルトの名無しさん:2006/02/16(木) 14:29:21
ここで文句行ってもただの愚痴だろう。禿。
なんか意味あるとおもってるのか?このちんかす。
615デフォルトの名無しさん:2006/02/16(木) 14:55:04
>>613
Visual DeveloperのMVPになって直接MPDの開発者に言えよカス
そこまで行けない豚脳がブヒブヒ言ってんじゃねーよ
616デフォルトの名無しさん:2006/02/16(木) 15:14:32
>>613
何がデフォルトかは、お前がダサいと思うかどうかと関係ねえんだよ。
ピザでも食ってろデブ。
617デフォルトの名無しさん:2006/02/16(木) 16:15:50
>>613
オレはダサいとは思わない
ビジネスデスクトップ向けアプリを作る上ではOfficeと同じルック&フィールになった方が利益ある。
見栄えってのは個人のセンスではなく、広く普及しているものと同じかが重要。
618デフォルトの名無しさん:2006/02/16(木) 16:18:15
まあそのルック&フィールとやらも次のOfficeでまたがらりと変わるんだけどな
619デフォルトの名無しさん:2006/02/16(木) 20:35:01
だから、追随してゆくだろ。
620デフォルトの名無しさん:2006/02/16(木) 20:47:10
VS2007だか2008だかをまた買わされると
621デフォルトの名無しさん:2006/02/16(木) 21:37:32
listviewコントロールで、各項目の高さの変更は
どうすればいいのでしょうか?
Heightプロパティがなくて困っています
622606:2006/02/16(木) 21:42:54
>>608
遅レスですがありがとうございました。
あれから少し調べてみたのですが、
ttp://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/dnguinet/htm/drguinet5_update.asp
ここのホームページを見るに
608さんのやられたように、VBのmidステートメントを
使うか、substringかremoveやinsertを使用して
処理をするしかないようですね。
623デフォルトの名無しさん:2006/02/16(木) 21:54:44
>>618
Word12とかのリボンとツールバーは別物
Outlook12とかInfoPath12は相変わらずツールバー
今見てみたから間違いない
624デフォルトの名無しさん:2006/02/16(木) 21:57:37
MaxConnections

ってどんな感じでつかうのでしょうか?
Webを探してもサンプルがみつかりま
せんでした。。。。
C#初心者なもので、ご教授お願いし
ます。
625デフォルトの名無しさん:2006/02/16(木) 22:13:41
名前だけ出されても困る。
.NET 2.0のヘルプではSocketOptionName列挙体のメンバで、
> サポートされていません。使用すると SocketException がスローされます。
というのしか見つからないが。
626デフォルトの名無しさん:2006/02/16(木) 22:15:50
>>624
これ見て出直して来い

真・技術系メーリングリスト FAQ
http://www.geocities.co.jp/SiliconValley/5656/
627デフォルトの名無しさん:2006/02/16(木) 22:19:43
また懐かしいページだなw
628624:2006/02/16(木) 22:28:14
すみません。。。状況なにも書いてなかったです。。。

ソケット通信で、サーバ側でクライアントの接続数を
制限したいのですがどのようにすればよいでしょうか?

MaxConnectionsは.NETのヘルプで"Listen"を調べた
時に知って、検索してみると
"http://www.microsoft.com/windows2000/ja/advanced/iis/default.asp?url=/windows2000/ja/advanced/iis/htm/asp/apro66pf.htm"
がでてきたんですが、使い方がよくわからず、質問さ
せていただきました。
C#では使えないようですね。。。
629デフォルトの名無しさん:2006/02/16(木) 22:29:09
C,C++,FORTRAN(諸事情で勉強せざるを得なかった..),Javaと勉強してきて
次はC#をやってみようと思うのですが,C MAGAZINEから出ている『詳説C++第2版』のような感じの本ってありますか?
「あーコレ,C#使ってる人なら大体持ってるよ…」って感じの本
630デフォルトの名無しさん:2006/02/16(木) 22:35:05
>>628
IISのページじゃねーか……。

どうやって通信を実装させてるのかも分からずに答えられるか。
631デフォルトの名無しさん:2006/02/16(木) 23:18:36
>>629
勉強は良いから物作れや。
632デフォルトの名無しさん:2006/02/16(木) 23:35:34
すんまそん
hogehogeボタンをクリックしたときだけ
hogehogeテキストを表示させるようにしたいのですがどうすれば良いですか
633デフォルトの名無しさん:2006/02/16(木) 23:38:47
>>629
MS系の開発で最初に読むべきは「MSDNライブラリ」
IDEの支援機能も強力だから、Javaとかの経験があるならヘルプ無しでもある程度いける
あとはMSDNオンラインも見とけ

正直、MSの開発ドキュメントに対する力の入れ方は史上最高だと思う
書籍はMSDNライブラリの補足とかケースバイケースな事例を知るために後で買えば十分
634デフォルトの名無しさん:2006/02/16(木) 23:39:07
どこに表示するんだ
635デフォルトの名無しさん:2006/02/16(木) 23:40:06
>>632
WindowsアプリですかWindowsコンソールですかASP.NETですか
貴様は何をどこまでやってその疑問が生まれましたか
636デフォルトの名無しさん:2006/02/16(木) 23:41:02
>>632
hogehogeボタンのイベントハンドラ
637デフォルトの名無しさん:2006/02/16(木) 23:41:04
>>632
意味が全然わからんぞ。どこに表示したいんだ。
hogehogeボタンの表面から北極星の瞬く夜空までいろいろあるだろが。
638デフォルトの名無しさん:2006/02/16(木) 23:42:45
>>628
根本的に基礎知識が不足してる
System.Net関連をざっと見てから出直せ
639デフォルトの名無しさん:2006/02/16(木) 23:43:47
「我ながら上手いフレーズを思い付いたもんだ」とニヤニヤする>>637が目に浮かぶ
640637:2006/02/16(木) 23:44:16
俺がくだらない書き込み打ち込んでる間に>>632が集中砲火されてるw
641デフォルトの名無しさん:2006/02/16(木) 23:44:55
>>634
>>637
重要なのは表示先じゃなくイベントのハンドリングだと思うが。
642637:2006/02/16(木) 23:46:11
>>639
あんたのその書き込みを見てニヤニヤが止まらなくなった。
643デフォルトの名無しさん:2006/02/16(木) 23:50:11
>>633
MSDNはそんなに大きいんですか..分かりました.それでいってみようと思います


あの,全くの初心者のする質問になっちゃうんですが
VS2005 は .NET の開発環境なんですよね?
あと, .NET はあと何年くらいもつのでしょうか?
644デフォルトの名無しさん:2006/02/16(木) 23:50:35
>>643
2
年ちょい。
645637:2006/02/16(木) 23:50:56
正直俺もニヤニヤがとまらないのはどうしてw
646デフォルトの名無しさん:2006/02/16(木) 23:51:36
>>629
C#によるプログラミングWindows(上/下)
Perlにおける駱駝本、JavaにおけるコアJAVAに相当する。
C++とJavaが使えるならC#はこの2冊で万全。

あとは必要性と習熟に応じてプログラミングMicrosoft ADO.NETや
.NETエンタープライズWebアプリケーション開発技術大全辺りを…
647632:2006/02/16(木) 23:56:45
俺もニヤニヤ止まらない
どんなイベントでどこになに表示させるか言ってないのが悪かったね
ただどうやったら表示を隠したりできるのかが知りたかったけど何かそれっぽいソース探りあてたのでもうおk
648デフォルトの名無しさん:2006/02/16(木) 23:58:11
>>647
一生笑ってろ。
649デフォルトの名無しさん:2006/02/16(木) 23:58:47
ニヤニヤ
650デフォルトの名無しさん:2006/02/17(金) 00:16:42
VS.NET 2003でCrystal Reportを呼び出すライブラリhoge.dllを作成しました。
そしてCrystal Reportのライブラリとhoge.dllをパッケージ化したセットアップファイルを
作成して別マシンにインストールしました。

今度はその別マシン上で、hoge.dllを参照してそれ経由でCrystal Reportの帳票を
出力する業務アプリfoo.exeを作り、コンパイルしました。

ところがそのfoo.exeをその別マシン上で実行しようとすると以下のエラーが出ます。

System.IO.FileNotFoundException: ファイルまたはアセンブリ名 System.Data、
またはその依存関係の 1 つが見つかりませんでした。

Fusion log follows:
=== Pre-bind state information ===
LOG: DisplayName = System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 (Fully-specified)
LOG: Appbase = C:\Test\
LOG: Initial PrivatePath = NULL
Calling assembly : foo, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null.
===

LOG: Publisher policy file is not found.
LOG: Host configuration file not found.
LOG: Using machine configuration file from C:\WINNT\Microsoft.NET\Framework\v1.0.3705\config\machine.config.
LOG: Post-policy reference: System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
LOG: Attempting download of new URL file:///C:/Test/System.Data.DLL.
LOG: Attempting download of new URL file:///C:/Test/System.Data/System.Data.DLL.
LOG: Attempting download of new URL file:///C:/Test/System.Data.EXE.
LOG: Attempting download of new URL file:///C:/Test/System.Data/System.Data.EXE.
651デフォルトの名無しさん:2006/02/17(金) 00:17:26
続き

このfoo.exeをVS.NETの同プロジェクトの中に含めてパッケージ化→配布すると
上手く実行されます。たぶん署名関係が原因だと思うのですが、foo.exeは
VS.NETで作った同じプロジェクトに含めて配布する必要があるものなのでしょうか?

それだとfoo.exeを直す度にいちいち修正していない他のライブラリも一緒に
リリースすることになってしまい、あまり好ましくないのです。

foo.exeは修正頻度がおそらく高いので、修正したfoo.exeだけを単純コピーで
リリースできる運用にしたいのですが、そうするにはどのような作成方法で
作ればよいのでしょうか?
652デフォルトの名無しさん:2006/02/17(金) 07:02:14
>>651
ClickOnce
653デフォルトの名無しさん:2006/02/17(金) 07:33:56
>\Framework\v1.0.3705\config\machine.config. 
よくわからないが .NETの1.0を探しにいってるな。
654デフォルトの名無しさん:2006/02/17(金) 09:10:35
ありがとうございます。
>>652
ClickOnceって2005からの機能なんですよね・・・残念ながら無理です。
>>653
実行させるマシンには1.0が載っているので1.0で動作させる必要があるのです。
なのでパッケージも1.0のランタイムを指定して作成しています。
655デフォルトの名無しさん:2006/02/17(金) 09:23:11
>>654
いや、VS2003だよね?
じゃ1.1しか作れないはずなんだけど…。
656デフォルトの名無しさん:2006/02/17(金) 09:57:28
>>654
その腐った環境に合わせてバージョンリダイレクトを適切に設定しろ
もしくはVS2002を使え

.NETにDLL HELLは無いと言っても無設定でなんでもできるわけじゃない
楽しようと思ったら全てにおいてバージョンを合わせるべし
657デフォルトの名無しさん:2006/02/17(金) 10:44:08
>>655
いえプロジェクトの設定で1.0を指定できました。セットアップも1.0指定で作っています。
実際に別マシンには1.0しか乗っていないにも関わらずVS2003で作成したアセンブリが
動作することはできました。
これはバージョンの問題なのでしょうか?認証とかの問題ではないってことですか?

658デフォルトの名無しさん:2006/02/17(金) 10:52:09
>>646
ちょっと脱線話
だけど
開発元(のようなもの)が書いた本って
何故あんなに分かりにくいのだろうか。
読む気しねえ。

って言うと、
でも一番詳しいとか批判受けそうだけど。
>>629じゃないよ
659デフォルトの名無しさん:2006/02/17(金) 11:31:09
>>658
MSが書いてるのはMSDNだけ
他は外部ライター
MSDNの中身も外部ライターが多いけどな
660デフォルトの名無しさん:2006/02/17(金) 12:22:04
>>657
そんな設定があった気がしないが…。そもそもクリレポも2003付属のやつなら
1.1のやつのはずだ。まぁそっちの環境なんて分からんので何かしたのだろうが。

原因はSystem.Data.dllの1.0.5000.0やつは1.1付属のやつだ。1.0の環境では当然ない。
どれかが参照しているはずだからその辺直せ。

ttp://www.atmarkit.co.jp/fdotnet/technology/idnfw11_05/idnfw11_05_02.html
661デフォルトの名無しさん:2006/02/17(金) 23:01:19
別に正解がある訳じゃないけど皆さんはどういうコーディングをしていますか?
1.何らかの処理(範囲チェック、文字列⇔数値変換など)がない場合は、プロパティを使用せず
 フィールドをpublicで公開するか
2.自分自身のクラスのフィールドにアクセスするときでも必ずプロパティ経由でアクセスするか
3.自分自身のクラスの(1)フィールド(フォームデザイナが作成したコントロールのメンバも含む)
 (2)プロパティ(3)メソッドを呼び出すときに this.を頭につけるかつけないか
ぜひ教えてください。
662デフォルトの名無しさん:2006/02/17(金) 23:08:16
1)全部プロパティ。P/Invokeの構造体だけはフィールド直接公開することが多い。
2)フィールドに直アクセス。
  privateならフィールドをプロパティに書き換えても影響ないから後で変更できるし。
3)thisは必ず。
663デフォルトの名無しさん:2006/02/17(金) 23:11:48
>>662
参考にしたいので、(1)の理由を教えてください。
664デフォルトの名無しさん:2006/02/17(金) 23:17:48
後で仕様変更(範囲の限定とか)したくなるかもしれないから。
プロパティの場合PropertyDescriptorであれこれしたりするとかの利用者の便宜が得られるので初めからそうしとく。
リフレクションをたまに使うので混乱しないように。
665デフォルトの名無しさん:2006/02/17(金) 23:27:30
オレはthisつけない、後で仕様変更したくなるかもしれないから。
666デフォルトの名無しさん:2006/02/17(金) 23:35:37
>>662
(3)ですが、VS2005だと「フィールドのカプセル化」で自動生成させると
thisがつきませんが、手動でつけてるんでしょうか?またメソッドや
フォームのコントロールもthisをつけてるということですよね。
結構大変なので、自分の場合つけたりつけなかったりで逆に読みづらいorz
667デフォルトの名無しさん:2006/02/17(金) 23:44:16
エディタの個人的マクロでカプセル化するようにしてるから、VSの自動生成など知らぬ。
668デフォルトの名無しさん:2006/02/17(金) 23:57:12
EncapsulateField.snippet などを書き換えるべし。
669デフォルトの名無しさん:2006/02/18(土) 00:18:32
(1)
publicフィールドは特殊な構造体や非同期結果保持クラス、Xmlシリアライズデータクラスなどのデータを保持するだけのクラスにしか用いない。
フィールド云々というより、むしろ、クラスはプロパティ(特性)を頭に浮かべて設計するので(I/Fにpublicフィールドなどない感じ
(2)
変更可能性が高いと肌で感じたものやLazyInitializeなど特殊な処理をするもの)は
自分専用のプロパティをprivateプロパティで定義する
(3)
-プロパティにはthisをつける。
理由:プロパティの命名規則は先頭大文字だからクラス名と区別をつきやすくするため。
-フィールドにはthisをつけない。
理由:フィールドは_始まりでやってるため、thisをつけると冗長。Intelisenceが一文字で効くため
670デフォルトの名無しさん:2006/02/18(土) 08:01:41
1クラスを、フリーソフトみたいな感じで一般公開するなら絶対プロパティだけど
そんなことはまだやったこと無いから、結構publicプロパティも使ってる。
ただ、VS2005になってプロパティ作るのそんなに面倒じゃなくなったから最近はきちんとプロパティにしてたりする。
privateなクラスやinternalなクラスは相変わらずだけどね。

2ほとんどプロパティ使ったこと無いな。必要なのはどっちかって言うとメソッドになってたり。
3全部thisはつけない
671デフォルトの名無しさん:2006/02/18(土) 10:01:57
1.publicは100%プロパティ。
ただしPrivate P/Invokeを除く。Internal P/Invokeはプロパティにする。
こうしとかないとそのクラスListBoxに突っ込んだりもできないじゃん。

2.フィールド直アクセス。
個人的にプロパティ経由アクセスと揺れてたんだけど、経験からこっちの
ほうがきれいに書ける場合が多いと判断したのでこっちで。

3.大体つける。でも見通しが悪いと思ったらはずす。
672670:2006/02/18(土) 10:02:43
結構publicプロパティも使ってる。

結構publicフィールドも使ってる
673デフォルトの名無しさん:2006/02/18(土) 11:08:12
>>661->>672
いやぁ助かる。
674デフォルトの名無しさん:2006/02/18(土) 12:11:40
モーダルかモードレスかを引数で選べる、ダイアログを表示する関数を持つアンマネージドDLLがあって、
それをP/Invokeを使ってモードレスで表示すると、いろいろおかしくなるんですが
モーダルで表示すると問題は発生しないです。

いろいろおかしい点:
ダイアログを閉じれない。
推しても反応しないボタンがある。
ダイアログの中のタブを切り替えるとAccessViolationExceptionが発生する


マネージド側で、モードレスダイアログを表示する関数をP/Invokeで呼び出す場合の一般的な注意点ってなにかありますか?
675デフォルトの名無しさん:2006/02/18(土) 12:16:42
別にそんなものはない
676デフォルトの名無しさん:2006/02/19(日) 02:25:37
モードレスの時にメッセージループ相当がないとか?

モーダルなら自前ループがあるからね。
677デフォルトの名無しさん:2006/02/19(日) 10:17:59
ちょっと質問です。
半透明のイメージを描画したいのですが、
DoubleBuffered = false; の状態で
ImageAttributes.SetColorMatrix() を使って描画するとイメージの描画過程が目で追えるほどに遅くなります。
メモリ上のビットマップに描画してから画面に描画しても結果は同じでした。
DoubleBuffered = true; の状態では遅くなりませんでした。

この件について解決方法や代替手段などあったらよろしくお願いします。
678デフォルトの名無しさん:2006/02/19(日) 13:11:22
>>677
DirectX
679デフォルトの名無しさん:2006/02/19(日) 13:23:31
httpのsessionIDがURLに埋め込まれてるのを管理するにはどうすればいいの?
680デフォルトの名無しさん:2006/02/19(日) 13:33:22
httpのsessionIDって何?
681デフォルトの名無しさん:2006/02/19(日) 13:51:44
>>677
むしろDoubleBufferedで軽い理由が知りたい。
半透明処理ってのはPerPixelで計算せんといかんからCPUでやると
SIMD使ってるんならまだしもろくな結果にならんはずだが…。

いや、処理自体はDoubleBufferedだろうが変わらんのだからそこじゃないな。
んー…ああ、わかった。たぶんあれだ。DoubleBufferedだと、システムメモリ上で
計算した上でbitblt(単純転送)できるからだ。
ビデオメモリ上でCPUからそれをやりゃ重くもなる罠。
682677:2006/02/19(日) 16:23:15
>>681
よく考えたらその通りですね。
半透明イメージを描画するときは何らかの形で画面上のイメージと演算処理をしなければならないわけで、
そのためのバッファがなければ遅くなるのは当然でした。

メモリ上のビットマップに描画してもだめだったと書いたんですが、
ビットマップを適当な色でクリアしてから描画したら高速に描画できました。
空のビットマップに半透明イメージを描画してもアルファのデータが残るようです。
というわけこの方法でうまくいきました。
どうもありがとうございました。

683677:2006/02/19(日) 16:32:24
と、「この方法で」じゃなかった。
上の方法は単なるテストで、実際は別の内容を含んだバッファの上に描画してます。
684デフォルトの名無しさん:2006/02/19(日) 16:50:24
Eclipseに比べるとusingされてないクラスを入力したときの補完がめんどい。
Shift + Alt + F10はきつい。
しかもクラス名大文字小文字間違わず全部打ってからでないと出ないし。
EclipseみたくCtrl+Shiftで入力補完候補が出る時に、
usingしてないnamespaceのクラスも候補として出て、
それを選んだら、usingを自動的に出力するような風にはならんかなぁ。
685デフォルトの名無しさん:2006/02/19(日) 19:07:59
Shift+Alt+F10がきついのなら適当なキーに当てればいいじゃない
686デフォルトの名無しさん:2006/02/19(日) 20:44:41
>>684
お前みたいな香具師のために各種カスタマイズ機能があるわけですが
Eclipseとほぼ同じインタフェースにすることもできますが
687684:2006/02/19(日) 21:35:39
環境->キーボードからできるかもしれないと思ったんだけど、
どうもやりかたがわかりません。。。
先輩方、へたれなおいらにやり方教えてください。
688デフォルトの名無しさん:2006/02/19(日) 21:52:36
>>687
オプション→環境→キーボード
「ショートカットキー」にフォーカスを当ててShift+Alt+F10を押す
「現在使用されているショートカット」に割り当てられているコマンドが出るから、その文字の一部を「以下の文字列を含むコマンドを表示」
に入力
#今回なら「スマートタグの表示」で十分
表示されたコマンドへのショートカットをお好きなように割り当てる
689684:2006/02/19(日) 22:20:50
おおう、そうか、今割り当てられてるキー押せばいいのか。
盲点だった。リストから検索したけど出てこなくて・・・アリガトン!
690デフォルトの名無しさん:2006/02/20(月) 01:14:05
Java厨の初めてのC#体験中なんだけど、結構違うorz
delegate+thread+invoke辺りが目新しくて面食らった。
あとプロパティはフィールドも宣言しないとダメなんだな。
public String Test { set { Test = value; } }
とかして無限ループ。原因に気付くまで30分も掛ったよorz
て言うか、プロパティ書くのが面倒くせー!ウィザードはどこ行った?
意外と行数食うし使うのには便利だけど記述性はあんまりよくないような?

でも一番ビクーリしたのはbyte[]。なんじゃこれ?スゲー
プリミティブ型みたいな顔してれっきとしたオブジェクト型。
変なの〜、キモ便利〜wwwww
691デフォルトの名無しさん:2006/02/20(月) 01:32:37
>>690
プロパティはEclipseの「setter/getterを生成する」みたいな機能があると便利だよね。
692デフォルトの名無しさん:2006/02/20(月) 01:33:01
Rubyを使うと更にキモ便利さが味わえるぞ
693デフォルトの名無しさん:2006/02/20(月) 01:41:25
2005ならリファクタリングでフィールドをプロパティにカプセル化できるし
アドインでプロパティを勝手に作ってくれるのもあるし
694デフォルトの名無しさん:2006/02/20(月) 01:48:28
>>693
2005の一番の恩恵はフィールドのカプセル化だとおもた。
正直初めてコレ使ったとき、感動した。
695デフォルトの名無しさん:2006/02/20(月) 01:53:58
>>693
お〜〜〜!プレビュー見て一瞬ハァ?とか思っちゃったけど
実行してみたらちゃんとプロパティが自動生成される。
いつもの習慣に従ってSNTP鯖&倉書きつつ学習中なんだ
けど、BeginReceiveに渡すユーザー定義オブジェクトを書く
のが面倒で面倒で泣きそうだったんだ、超サンクス激感謝。

できればプライベートフィールドを纏めてプロパティ化して
くれると嬉しいんだけど・・・・・・
そのアドインというのは、もしかしてそういう事をしてくれたり
なんかはするのかな?
696デフォルトの名無しさん:2006/02/20(月) 01:54:53
Expressにはないんだね。(´・ω・`)
697デフォルトの名無しさん:2006/02/20(月) 01:56:43
prop と打って Tab とか。
698デフォルトの名無しさん:2006/02/20(月) 02:56:17
>>690
配列はJavaでもObjectだったことない?
699デフォルトの名無しさん:2006/02/20(月) 03:05:35
C#にはプリミティブ型なんてないし
700デフォルトの名無しさん:2006/02/20(月) 14:25:10
http://www.microsoft.com/japan/msdn/library/ja/csspec/html/vclrfcsharpspec_1_2_4.asp?frame=true
本質的な違いはないけど名前は残ってるみたい
701デフォルトの名無しさん:2006/02/20(月) 22:49:33
C:\Documents and Settings\%UserName%\Local Settings\History
の中にあるindex.datをパースする便利クラスはないかな・・・
702デフォルトの名無しさん:2006/02/20(月) 23:04:24
頑張れ
703デフォルトの名無しさん:2006/02/22(水) 10:35:49
ボタンがマウスで押されてる間ある処理をしたいのですが、マウスダウンのイベントは
一度しかこないため「押されつづけている間」というのが判定できません。
マウスが押されたらスレッド起こして、離されたらスレッド終了みたいなことを
しないとだめでしょうか。
704デフォルトの名無しさん:2006/02/22(水) 10:39:40
スレッドにするかどうかはともかく、そう。
705デフォルトの名無しさん:2006/02/22(水) 10:51:28
スレッド以外のやり方もあるってことですか?
エンターキーが押されてる間 ってことならイベントが何度もくるので
特に何も考えなくてもいいんですが、マウスの場合は特別なことをしないといけない
というのが本当に悩ましい。
706デフォルトの名無しさん:2006/02/22(水) 11:17:36
GetAsyncKeyState() API では、いつでもマウスが押されてるかどうか分かるけど
そういうこと?
707デフォルトの名無しさん:2006/02/22(水) 11:19:27
イベントとしては無理でしょうね。マウスアップがくることが保証されていれば簡単ですけど
708デフォルトの名無しさん:2006/02/22(水) 12:02:21
>>703
「押され続けている間」と一言で書いてますが、どう定義するつもりですか?

・アプリがアクティブな状態でマウス押下から押上まで
 →MouseDown/Upで判別

・アプリ上でマウス押下状態なら全て(アプリ外でマウス押下されてポインタが移動しても対象とする)
 →MouseDown/Upとドラッグ系のイベントを併用

・アプリ上に限定せずマウス押下から押上まで
 →ポインタをキャプチャ

質問が漠然としすぎ。
709デフォルトの名無しさん:2006/02/22(水) 12:10:59
>>708
ボタンが押されてる間って書いてあるじゃん
710703:2006/02/22(水) 12:34:32
>>706
ボタンがクリックされた時のイベントハンドラの中でループで回してマウスの状態を
調べるってことでしょうか?
それだとその間は再描画されないのでちょっと不都合です。
とりあえずスレッドで処理するようにしますが、何かいい案がありましたら
お知恵をお借りしたい。
711デフォルトの名無しさん:2006/02/22(水) 12:41:41
例:タイマ

大体「処理」ってなんだ「処理」って
そんな曖昧なので案も出せるか
712デフォルトの名無しさん:2006/02/22(水) 12:58:08
>>711
なんの処理かは関係ないだろ?直行性も理解できないアホか?
713デフォルトの名無しさん:2006/02/22(水) 13:00:58
>>709
アプリ内でのボタン押下→押上



アプリ外でのボタン押下→アプリ上に移動



別の処理だってゲイツ君が言ってたぉ
714デフォルトの名無しさん:2006/02/22(水) 13:04:04
>>710
自分でPaintを呼ぶとか
715デフォルトの名無しさん:2006/02/22(水) 13:05:47
>>710
どういう処理したいの?
ゲームでありがちな処理したいってこと?

もしそうならフレームの概念とアルゴリズムを勉強したほうが良いよ
716デフォルトの名無しさん:2006/02/22(水) 13:12:21
>>715
得意げに答えて満足感を得るのは止めてください。

例えば、
>もしそうならフレームの概念とアルゴリズムを勉強したほうが良いよ
ですが、そのような抽象的な指摘で、
>>710が今からフレームの概念の本とアルゴリズム入門の本を買いに行くと思いますか?

よって、>>715のレスはこのスレ始まって以来の駄レスと考えます。

私は、それを指摘したのでセーフだと考えます。

717703:2006/02/22(水) 13:16:19
>>714
なるほど。それでいいですね。
GetAsyncKeyState()でマウスの状態を調べて、押されてる間ループで回して
そのなかで描画もするようにすればいいだけですね。
ありがとうございました。

なんか荒れてる気がしますがスルーしときます。
718デフォルトの名無しさん:2006/02/22(水) 13:18:34
>>716
否定は何も生まない
尊大な態度は真実を遠ざけると知ろう

で、どういう処理したいの?
それに回答しなきゃみんな漠然とした回答しかできないんだけど
ありがちな処理なら定石がある
漠然とした質問には漠然とした回答しかできないから>>715の回答も一つの解だと思われ
719デフォルトの名無しさん:2006/02/22(水) 13:19:58
>>717
Paintを呼ぶよりは
Application.DoEvents()を読んだ方がいいんじゃ?
720715:2006/02/22(水) 13:21:20
>>716
は?自己満足で回答しちゃいかんのか?
平日日中に無料で知識を曝すのに自己満足も得ちゃいけないとは厳しいね
ここではもう二度と回答側にはなりません
721デフォルトの名無しさん:2006/02/22(水) 13:23:34
>>717
ゲームみたいなを作ってるならDirectXの仕組みを真似るって手もあるよ
WindowsフォームでDirectXを使う場合はメッセージループを自力で作るから、同じようにマウス確認用のループをフォームとは別に持つって考え方もある。
722デフォルトの名無しさん:2006/02/22(水) 13:24:55
なんでこの程度の質問で、質問が曖昧だとかフレームや
アルゴリズムがどうこういう話になるんだか。

>>720
その約束絶対守れよ。みんなよろこぶぞw
723デフォルトの名無しさん:2006/02/22(水) 13:26:27
答えてやってんだからピントはずれでも感謝しろってか
724デフォルトの名無しさん:2006/02/22(水) 13:27:39
>>720
まぁまぁ、IDが付かないスレでいきり立ってもしょうがないでしょ。
気にするな。

ただ、>>715のレス内に知識と呼べるものは無かったが。
ストレスイクナイ。
725デフォルトの名無しさん:2006/02/22(水) 13:28:30
void MouseDown(oject sender, MouseEventArgs e)
726デフォルトの名無しさん:2006/02/22(水) 13:31:59
途中でかきこんじゃった・・・
こんな感じかな。
勘違いしてたらスルーしてください。

bool flag = false;
void button_MouseDown(oject sender, MouseEventArgs e)
{
  flag = true;
  while (true)
  {
    Application.DoEvents();
    if( !flag ) return;
    処理;
  }
}

void button_MouseUp(object sender, MouseEventArgs e)
{
  flag = false;
}
727703:2006/02/22(水) 13:42:08
>>726
そういうことですね。みんな どうもありがとう!!
728デフォルトの名無しさん:2006/02/22(水) 20:22:11
質問なんだけど

内部にIDisposableを実装するクラスのインスタンスを使用して、
なおかつそのインスタンスには外部から直接アクセスできないクラスについてなんだけど

例えばこんな感じ

class Class1{
  MemoryStream ms = new MemoryStream();
}

MemoryStreamがきちんとデストラクタが実装されているという前提の場合は
Class1はIDisposableは実装する必要ありだけどデストラクタは必要ないですよね?
729デフォルトの名無しさん:2006/02/22(水) 20:28:31
そう言う実装もあるな。
StreamWriter / StreamReader なんかがそうだ。
730デフォルトの名無しさん:2006/02/22(水) 22:55:08
普通はデストラクタでDisposeを呼ぶんじゃないの?
もちろんDisposeの中ではSuppressFinalizeだかなんかして
731デフォルトの名無しさん:2006/02/22(水) 23:05:37
>>730
普通はそうなんだが、包含してるクラスの Dispose が必ず呼ばれるとまずい、と言う場合がある。
>>729が挙げたのなんかまさにそうだが。
例えばFileStreamを開いて、Streamを要求するメソッドに渡す。
メソッドは内部でStreamReaderを使って文字列を返す。
このとき、StreamReaderのファイナライザでDisposeを呼んじゃうと、呼び出し元で突然FileStreamを使えなくなってしまう。
だからStreamReaderはファイナライザを定義しない。
明示的にユーザがDisposeを呼んだときだけストリームを閉じる。
732デフォルトの名無しさん:2006/02/22(水) 23:08:17
>>730
デストラクタで呼ぶのはDispose(false)
Dispose()はDispose(true)呼んでSuppressFinalizeだねぇ。
733728:2006/02/22(水) 23:09:10
いや、728の例だとMemoryStreamは外部から与えられるものじゃないし、外部からはアクセスできないです。
んで、デストラクタを定義して、Disposeを呼び忘れたときでもMemoryStreamが解放されるようにしろって
解説している人がいたんで疑問に思って質問しました。

なんでデストラクタを定義する必要がないと思ったかと言うと、Class1のインスタンスがGCになったときに
その内部のmsもGCが回収するからです。
734デフォルトの名無しさん:2006/02/22(水) 23:20:58
>>733
デストラクタでのアンマネージドリソースの開放はセーフティネットだから、
アンマネージドリソースを管理しているクラスを包含しているならDisposeは実装しとかないといかんと思う。

もっともMemoryStreamはメモリしか使っていないから放置していてもいいのかもしれないが。
ちょっと例が悪いかも。
735デフォルトの名無しさん:2006/02/22(水) 23:25:51
>>733
その理解で間違ってないよ。
基本的にマネージクラスはマネージとして扱いなさい。
ファイナライザまで、つまりDispose(false)で処理しなくてはならないレベルは

private IntPtr ptr;

みたいに直接そのクラスがアンマネージ情報を持っている場合。
ところがこの場合も2.0になってSafeHandleみたいなのが出来ちゃったしなぁ、
あまりすることもなくなったかも。

ちなみにそれはJ○tta?
736デフォルトの名無しさん:2006/02/22(水) 23:53:30
基本的にDisposeを実装しなければならないことはほとんどない。
実装した方がいい場合はたまにある
737デフォルトの名無しさん:2006/02/23(木) 00:05:03
アンマネージドリソースを持つ場合はDispose(false)とデストラクタを実装する。
IDisposable実装クラスのインスタンスを持つ場合は、必要に応じてDisposable(true)を実装する。

「アンマネージドリソースを持つ」っていう解説は良く見かけるけど、Streamは*アンマネージドリソース*ではないので注意
738デフォルトの名無しさん:2006/02/23(木) 00:11:33
お約束:ファイナライザでは他の参照型マネージドオブジェクトに触っちゃ駄目!
739730:2006/02/23(木) 00:19:55
http://www.microsoft.com/japan/msdn/net/mag00/GCI.asp
ですね。参考になりました。
740728:2006/02/23(木) 00:24:29
回答ありがとうございました

レス見ていろいろ調べたら、>>738さんの言うとおり、むしろ実装してはいけないんだね。
don't need to じゃなくて must not だとは思わなかった(;^▽^)

>>735
>ちなみにそれはJ○tta?
ええw
ブログ読んで疑問に思って、指摘しようと思ったんだけど自信がなくて
んでいま調べてたら「例を間違った」とコメントしてました。
741デフォルトの名無しさん:2006/02/23(木) 00:41:03
void Class1::Dispose(bool disposing) {
  if (disposing) ms.Dispose();
}
つまりこういうこっちゃね。
742デフォルトの名無しさん:2006/02/23(木) 00:42:48
やばー、Dispose実装しているクラスでは デストラクタでIDisposable.Dispose()呼び出してる。というパターンのコード結構あった
Dispose(false)な制御フローでは参照マネージオブジェクト触っちゃダメだったってことか
743デフォルトの名無しさん:2006/02/23(木) 01:45:39
Disposeはアンマネージリソースを開放する目的で存在するって思想が
そもそも気に入らない。
だったらComponentのDisposeってなんやねんとか。
必要である事情は分かるが、いきなり前提崩してるし。
744デフォルトの名無しさん:2006/02/23(木) 02:30:21
>>743
MVP菊池氏のような発言だなw
745デフォルトの名無しさん:2006/02/23(木) 02:32:24
DisposeネタはGDNJでもVSUGでも盛り上がったね
MSDN Forumでもまた同じ事が繰り返されそうな悪寒
746デフォルトの名無しさん:2006/02/23(木) 17:13:14
たとえばSystem.Data.DataTableはIDisposableを実装してますが
public void Dispose()をvirtualにしていません。
これはDataTableを継承したらDispose()はいじらなくていいですよ、
ていうかむしろいじるな、やらせはせんっていうことですか?
どうせDispose()はDispose(true)しているだけだから、
いじるならprotected virtual void Dispose(bool)をいじれ、
ということでしょうか?
747デフォルトの名無しさん:2006/02/23(木) 17:16:23
つかpublic Dispose()をvirtualにしてるのって.NETの標準ライブラリにあったっけ?
virtualなのは全部protected Dispose(bool)のはずだけど。
748デフォルトの名無しさん:2006/02/23(木) 17:33:27
本当にないのかどうかは知らんが、基本的にそういう思想になってるとおも
749デフォルトの名無しさん:2006/02/23(木) 20:38:43
VB6.0のプログラムの使用しているDLLだけをC#.NETに作り変えたいのですが、
多次元配列を引数に使うことはできないのでしょうか?
文字列の2次元配列を渡して並べ替えたり、値を変更したりしたいのですが、
C#.NETから空の配列に値を入れて返す事は出来ても、VB6.0から配列を受け取ることが出来ません。
「値をNullにすることはできません」というエラーが出てしまいます。
何か回避方法は無いでしょうか?

VB6.0側
obj = New CDll.CClass
ReDim s(10, 10) As String 'ReDim s(0, 0) As String の場合だけ成功します
i = obj.func(s) 'ここでエラー発生

C#.NET側
public int func(ref string[,] s)
{
// s[*,*]をいじる処理
}
750デフォルトの名無しさん:2006/02/23(木) 20:44:43
ref は参照を渡すことになるから、参照型と合わせてポインタのポインタと言うことになるが。
751デフォルトの名無しさん:2006/02/23(木) 22:43:08
>>749
string [][] sではどうですか?
VBの配列はSAFEARRAYだからC++でCOM作るときも結構面倒だった記憶があります。
752デフォルトの名無しさん:2006/02/24(金) 00:37:54
ちょっと質問があります。
IntPtr から IntPtr へデータを直接コピーをしたいのですがどうすればよいのでしょう。
System.Runtime.InteropServices.Marshal.Copy には相当するオーバーロードがないようです。
753デフォルトの名無しさん:2006/02/24(金) 00:47:04
・一旦バッファにコピー
・CopyMemory を DllImport
754デフォルトの名無しさん:2006/02/24(金) 01:10:37
>>753
なるほど。速度重視でいきたいのでCopyMemoryのほうにしたいと思います。
どうもありがとうございました。
755749:2006/02/24(金) 01:33:59
>>750
refをはずしても同じエラーが出ました。
ちなみにs(0, 0)を渡してC#内でReDimして値を入れて返すというのは成功したのですが、
この時はrefを付けていました。

>>751
試してみたのですが、C#側の変更だけでは引数の型が違うといわれます。
VB6.0では配列の配列はどのように記述すれば良いのでしょう?
SafeArrayを調べてみたのですが、System.Arrayなら何とかなる・・・のかな?
756デフォルトの名無しさん:2006/02/24(金) 01:36:36
object[,] ならどだ?
757デフォルトの名無しさん:2006/02/24(金) 01:38:19
あ、object[][]かもしれんが。
758デフォルトの名無しさん:2006/02/24(金) 09:56:47
>>747-748
なるほど納得安心しました。今日から快眠です。
759デフォルトの名無しさん:2006/02/24(金) 22:11:12
オライリーの4版って、本屋に置いてますか?
なんか見つかんない...onz
760デフォルトの名無しさん:2006/02/25(土) 01:44:55
昨日は何もないよい一日でした。
明日も何もないよい一日でありますように。
761デフォルトの名無しさん:2006/02/25(土) 01:53:19
>>759
置いてましたよ。
762デフォルトの名無しさん:2006/02/25(土) 02:15:12
週末はみんな仕事したくないので何もなかったのです

その代わり休日は厄介な日曜プログラム厨が沸きます
763デフォルトの名無しさん:2006/02/25(土) 02:16:06
>>759
今日見かけたよ
でももうアマゾンで注文済み
764デフォルトの名無しさん:2006/02/25(土) 16:22:41
VS2005のwebbrowserでINPUT要素をクリックする方法が分かりません。
vs2003のaxWebBrowserならやり方わかるんですけど、どうもいろいろかわってしまったようで。
頑張ってぐぐったりMSDN Libaryと睨めっこしてみたんですが、お手上げです。

だれかわかる人いたら教えてください。
またはwebrowserの扱い方で参考になるページなどありましたら幸いです。
765デフォルトの名無しさん:2006/02/25(土) 16:27:20
普通に click で InvokeMethod するだけだが。
766デフォルトの名無しさん:2006/02/25(土) 16:28:05
あ、InvokeMethod じゃなくて InvokeMember だった。
767デフォルトの名無しさん:2006/02/25(土) 16:59:10
>765
ありがとうございます!

browser.Document.GetElementById("submit").InvokeMember("Click");
で、クリックすることができました。

分かりにくいですね、これ(汗
768デフォルトの名無しさん:2006/02/25(土) 22:50:29
先生、delegate があるのに、
なぜ event がキーワードとして
使われているのかが分かりません。

delegate と event の違いは何ですか?
event では += と -= としか使えなくなるとか?
ほかにどんな違いがありますか?
769デフォルトの名無しさん:2006/02/25(土) 23:09:30
delegate は型。class とか struct とかと同じ。
event は プロパティの一形態。主にデリゲートインスタンスをカプセル化したもの。

event が用意された理由はまあ色々あるが、簡単なところとしては
・孫クラスが勝手に子クラスや曾孫クラスの登録したイベントハンドラを消したら困る
・であるにも関わらず、デリゲートインスタンスを公開するプロパティではこれに対応できない
770デフォルトの名無しさん:2006/02/26(日) 00:37:10
2進数を書式指定して表示する方法について質問します。

ある整数、例えば41を2進数で表示すると"101001"ってなりますよねぇ。
これは、Convert.ToString(41, 2) で簡単に実現できるんですけど、
頭を0埋めして全体で8桁にする、つまり"00101001"って表示するための
書式指定ってないでしょうか?

10進数や16進数なら
String.Format("{0:D8}", 41) とか String.Format("{0:X8}", 41) とか
指定できるんですけど。。。

どなたか頭冴えてる方、よろしくお願いします。。。
771デフォルトの名無しさん:2006/02/26(日) 00:50:46
PadLeftすればいいじゃない
772デフォルトの名無しさん:2006/02/26(日) 01:44:25
イベントってのは内部実装に依存しないってのは重要だと思うぞ。
コンポーネントのインターフェイスとしての側面というか。
現実としては、例えばコントロールなど大量のイベントをどう実装するのか、など。
この辺の柔軟性は、言ってみればメンバフィールドとプロパティの関係にも似てる。
773デフォルトの名無しさん:2006/02/26(日) 08:47:48
>>768

【.NET】 C++/CLI について語ろうぜ 【最適】
http://pc8.2ch.net/test/read.cgi/tech/1126450441/

447 :デフォルトの名無しさん :2006/01/03(火) 00:38:44
>>444
あー、イベントというものが根本的に分かってないんだろう。
メンバで表現されるものを他の言語と比較すりゃわかると思う。
CLRでのクラスメンバにもてるものはフィールド、メソッド、「プロパティ」、「イベント」なのよ。
後者二つがあることがいわゆるC#が「コンポーネント指向言語」っていわれる理由でも
あり、ただのdelegateフィールドとは「まったく」別のもの。
こうやって特殊化したことによってTypeDescriptorやらで動的にコンポーネント情報を取得できる。

ちなみに 446 も言ってるが、イベントはフィールドとアクセサ(とメタデータ)でなるんだな。

public event EventHandler TextChanged;
と書いたときに生成されるのは
・privateなdelegateフィールド
・publicなadd, removeアクセサメソッド。
・イベントメタデータ
を生成している。
774デフォルトの名無しさん:2006/02/26(日) 12:22:29
ToolStripについて質問です。
ToolStripを動かすときに
MenuStripの上にToolStripを配置させない方法はどのようにすればよいでしょうか?
(MenuStripはアプリのタイトルの下に常にいてほしい)
775デフォルトの名無しさん:2006/02/26(日) 12:42:03
>>771
PadLeftなんて関数があったんだ!
長いことStringクラス使ってって初めて気が付きましたw
ありがとうございました(・∀・)
776デフォルトの名無しさん:2006/02/26(日) 12:58:00
>>774
- FormにMenuStripを単品で追加(MenuStripControlの上に追加しない)
- MenuStripのDockをTopにする
- FormにMenuStripContainerを追加しDockをFillにする
あとは移動しても良いToolStripはMenuStripContainerに追加すればよし。
777デフォルトの名無しさん:2006/02/26(日) 13:04:02
おお、目からうろこです。何で気づかなかったんだろう。ありがとうございました。
778デフォルトの名無しさん:2006/02/26(日) 14:04:19
領域に合わせてテキストを改行するラベルのような物を作ろうとしています。

Graphics::MeasureStringで文字列が占める領域が分かりますが、
ある領域に収まる文字列長を取得するメソッドは無いのでしょうか。

2分探索の要領でMeasureStringを何回も呼ぶと言うのは面倒かつ速度が出ないようなので
これ以外の方法をお願いします。



779デフォルトの名無しさん:2006/02/26(日) 14:16:07
>>778
長さはフォントと文字列によるんだからぶっちゃけ無理だろ。それ以上の
ことがしたいんなら直接Fontを使って調べろ。
というか、Graphics.DrawStringにRectangle指定するやつがあるだろ、それ
使えば折り返しもやってくれるぞ。
モードはStringFormatで指定。
780デフォルトの名無しさん:2006/02/26(日) 14:26:24
>>779
自動に頼ってしまうと今度は何文字表示できたかが分からんくなるんですよ。
781デフォルトの名無しさん:2006/02/26(日) 14:32:44
>>780
んなのMeasureCharacterRangesでも使えばええやないか
782デフォルトの名無しさん:2006/02/26(日) 14:44:18
>>781
Graphics.MeasureString メソッド (String, Font, SizeF, StringFormat, Int32, Int32)

で何とかなりそうです。超ありがとうございました。
783デフォルトの名無しさん:2006/02/26(日) 16:39:03
>>779
s パラメータによって表されるテキストは、 layoutRectangle パラメータによって表される四角形の内部に描画されます。四角形の内部に収まらないテキストは切り捨てられます。

騙さないでください。。。。
784最凶VB厨房:2006/02/26(日) 17:01:14
785デフォルトの名無しさん:2006/02/26(日) 17:07:38
>>784
嘘か間違いのドッチ家でしょ。
786デフォルトの名無しさん:2006/02/26(日) 17:09:16
RectangleFの引数にRectangle渡してるし。
787デフォルトの名無しさん:2006/02/26(日) 17:14:50
labelの機能で-入れると自動で-がある場所で改行されるんだが、
それを対処にGraphics#MesureStringの引数が最も多いメソッド使って何とかした覚えがある。
たとえば、[label-text]を表示させるときに幅が足りないと左のようになってた
[label-  --> [label-tex
text]       t]
788デフォルトの名無しさん:2006/02/26(日) 21:10:46
C#2.0+.NET2.0で、uintの上位ワードと下位ワードをushortとして切り出す関数って知ってます?
Win32のLOWORDとHIWORDマクロみたいな
0xFFFFで論理積取ったり0x10000の商を取ったりで算出はできるんですが、一発関数があるかなと思いまして
System.Convertあたりにあるかなと思いましたが見つけられませんでした
789デフォルトの名無しさん:2006/02/26(日) 21:39:35
>>788
やり方分かってるならそれでやればいいじゃん。そんなに細かい
処理に対してライブラリがいちいち関数を提供してたら、肥大化して
どうしようもなくなる。
790デフォルトの名無しさん:2006/02/26(日) 22:31:15
>>779=789?
791789:2006/02/26(日) 22:33:44
>>790
否。なぜ?
792デフォルトの名無しさん:2006/02/26(日) 22:33:58
>>788
何をしたいかによるんだけど。
793デフォルトの名無しさん:2006/02/26(日) 22:34:39
ListViewの行幅って変えられますか?ある特定の行だけ30Pixelにするとか
794デフォルトの名無しさん:2006/02/26(日) 22:37:18
>>791
改行
795デフォルトの名無しさん:2006/02/26(日) 22:45:30
行の幅?
列の幅ならColumnHeader.Widthだが。
行の高さは無理。
796788:2006/02/26(日) 23:03:53
>>789
Win32SDKには標準でマクロがあったので、.NET Frameworkにも無いか疑問に思った次第です

>>792
上記理由意外に、できるだけリテラル値をコードに埋め込みたくないという思いがあります
また、定型的な処理なのに毎回計算式を埋め込むのも気持ち悪いという思いも
#現在は上記2点をできるだけクリアするため自作の関数で対処しています
このような発想からFrameworkで関数が準備されていないかなと思いました

こういう発想は一般的じゃないんですね orz
797デフォルトの名無しさん:2006/02/26(日) 23:31:24
汎用マクロクラスでも自作すれば?
できたらクレクレ
798デフォルトの名無しさん:2006/02/27(月) 02:21:37
>>796
C#の関数は基本的に動的バインディングだから、作ってないだけじゃない?
クリティカルな部分で使うと遅いし。
799デフォルトの名無しさん:2006/02/27(月) 03:05:35
>C#の関数は基本的に動的バインディングだから
くわしく
800デフォルトの名無しさん:2006/02/27(月) 09:47:30
関数とマクロは重さが絶対的に違うわな
#defineで定義されてるだけのLOWORDとかは展開されてからコンパイルされるわけだし
呼び出しのオーバーヘッドを無視してもコードの見通しを良くしたいなら関数化してもいいだろうけど、そういうのが看過できない処理ならリテラルと計算式を埋め込むのも仕方なしかと
801デフォルトの名無しさん:2006/02/27(月) 09:59:43
ま、いまさらそんなことが全体のパフォーマンスに影響することはないけどね。
そのレベルのチューニングしなきゃならん開発ならMFCでやれってことだ。
802デフォルトの名無しさん:2006/02/27(月) 10:12:05
JITで関数がかってにインライン展開されることもあるからC#じゃほとんど誤差範囲。
803デフォルトの名無しさん:2006/02/27(月) 10:22:58
Win32SDKだと次の定義になってる。この程度なら直接書こうが関数にしようが問題なし。
#define LOWORD(l) ((WORD)((DWORD_PTR)(l) & 0xffff))
#define HIWORD(l) ((WORD)((DWORD_PTR)(l) >> 16))
こういうのがC#で必要になるのはP/Invokeを使ってるか、
固定レコードタイプのネットワークパケットを扱ってるかくらいしか思い浮かばない。
804デフォルトの名無しさん:2006/02/27(月) 13:21:58
大したもんじゃないならなんで実装されていないんだろ?
滅多に使われないような関数を作るくらいなら、Win32SDKにあったマクロを実装してもいいだろうに
805デフォルトの名無しさん:2006/02/27(月) 13:36:48
そんな古くさい手法は捨てろと言うお達し。
つか「大したもんじゃないから実装しよう」をやると果てしなく膨れあがるだろ
806デフォルトの名無しさん:2006/02/27(月) 13:38:35
int32とかint64をバイト配列に変換するのがあったはずだけど忘れた
807デフォルトの名無しさん:2006/02/27(月) 13:40:19
System.BitConverter クラスだ
808デフォルトの名無しさん:2006/02/27(月) 15:12:48
>>805
へ?何が古臭いの???
バイト操作・ビット操作って古臭いとかそういう次元で語ることなの?
809デフォルトの名無しさん:2006/02/27(月) 15:25:31
ビット演算はともかく、uintをushort2つに分解というのは古臭いな
>>803の言う感じに
810デフォルトの名無しさん:2006/02/27(月) 15:27:11
>>808
ちゅーより一つの値に二つぶち込むって発想はまぁ、なんだ、
その、あれだ。ビット演算程度ならいいんだけどさ。CLRなら
Enumもあるし。

あと、P/Invokeとかの互換部分って普通internalにして隠すんだわ。
811デフォルトの名無しさん:2006/02/27(月) 15:27:50
古臭いAPIを一新するための.netライブラリだというのに
812デフォルトの名無しさん:2006/02/27(月) 15:55:47
メモリサイズ節約なら普通にushort使えばいいし・・・
なんなら構造体定義すりゃいいし・・・
813デフォルトの名無しさん:2006/02/27(月) 16:30:12
ファイル操作とかデータ操作系のアプリ書いてると普通にビット/バイト操作って出てくるけど
ドライバとかDLLと通信するとDWORDで来てWORDやBYTEを切り出すとか普通の処理
業務アプリやテキスト操作だけがプログラムじゃないよ
814デフォルトの名無しさん:2006/02/27(月) 16:43:58
24bitのPCMデータを扱うのが非常にめんどくさいことに今気付いた
815デフォルトの名無しさん:2006/02/27(月) 16:50:33
>>813
どっちも C#/.NET とはほぼ関係ない話だな

>>814
24bit と言えばビットマップデータも
816813:2006/02/27(月) 17:13:08
>>815
おいおい関係ないわけないだろw
うちはC#+.NET1.1でそういうアプリ組んでるんだし
ライブラリが充実してるからC/C++でゴリゴリ書くより楽でいいよ
その上で普通にビット/バイト操作があるって言ってるわけで

逆を言えばC/C++でも業務アプリ書いてりゃ滅多にビット/バイト操作は無い
型のありのままでのデータ操作がほとんど

色々なアプリケーションの形があるんだから、操作の種類によって古臭いとか新しいとか無関係とかないわけですよ
所詮メモリ上のデータを操作するのがプログラムなんだから
817デフォルトの名無しさん:2006/02/27(月) 18:11:24
ふらっとC#スレと重複質問になっちゃって申し訳ないんだけど、こっちの方が人多そうなので。

Visual C# のインストール中に

インストールコンポーネントを読み込んでいます。この処理には1〜2分かかる可能性があります。

って表示されたまま永久放置なんだけど、なんで?

常駐ソフトもサービスも全部切っても先に進まないんだけど・・
818デフォルトの名無しさん:2006/02/27(月) 18:18:11
・マルチと分かってるなら向こうの質問取り下げるのが礼儀
・環境も書いてない
・β等のインストール履歴も分からない

結論:氏ね
819デフォルトの名無しさん:2006/02/27(月) 18:35:21
マルチってのは無闇やたらと色んな場所で質問すること。
反応がありそうないくつかの場所で質問するのは当たり前。
解決したら当然全部にお礼して回るよ。
なんでもマルチって書けばいいと思ってる人は言葉の意味を考え直した方がいい。

環境は XP Pro SP2、
Visual C#をインストールするのはこれが初めてです。
820デフォルトの名無しさん:2006/02/27(月) 18:36:39
擁護意見を書くときは自演しといたほうが無難
821デフォルトの名無しさん:2006/02/27(月) 18:37:17
せめて元スレッドで一言断っとこうぜ?
822デフォルトの名無しさん:2006/02/27(月) 18:38:29
>>817
>常駐ソフトもサービスも全部切っても先に進まないんだけど・・
常駐ソフトやサービスを切ることが好影響としか考えられないの?

それとそんなのこのスレで聞いても分からないからM$に聞いてくれ
823817:2006/02/27(月) 18:41:18
>>820
了解

>>821
んじゃいってくる
1000行きそうだったから変に書き込まない方がいいかなと

>>822
ぐぐったらPart10くらいでアンチウィルス切ったら通ったとか書いてあったので。
とりあえず無関係そうなのから切っていって最終的にMSのサービス以外は全部切ったけどダメだった。

まー色々試してみます。thxでした。
824デフォルトの名無しさん:2006/02/27(月) 20:40:44
>>817
異常な状態と言うのは普通の人には起きないから異常
であればできるだけ詳細な情報を提供すべし

例えばこの辺り
・ハードウェア構成
・OSのインストールバージョンとサービスパック
・Microsoft Updateをどれだけ当てたか
・システムに影響しそうなソフト(OfficeやIEなど)のバージョン
・インストール時に実行していたソフト
・インストールしたVC#のバージョンと入手先(MSDNでは稀にアップされた版が間違っている場合がある)

あとそのメッセージは一体どこまで進行したかを明記
「インストール中に」だけではエスパー以外は分からない
また、インストールオプションも明記しないと何が怪しそうか見当もつかない

最も大事なのはその異常に対してどこまで原因調査の絞込みを行ったか明記すること
例えば「インストールオプションを○○まで絞りました」とか「ウィルス対策ソフトは○○で、メニューから無効にしています」とか

とにかく「今自分に起きている状態は他人には滅多に起きない異常事態」と認識し、情報を提供せよ

超能力者に聞くような質問をするから煽られる
これを自業自得と言う
825デフォルトの名無しさん:2006/02/27(月) 21:32:32
このスレ見てるとPGは対人能力に問題ある人が多いってのが良く分かる
826デフォルトの名無しさん:2006/02/27(月) 22:03:33
テキストボックス内の文字列のサイズを知りたいのですが、方法が分かりません。
例えば以下のような文字列がTextプロパティに設定されているとすると

---------------------
12345678
2345
345678
---------------------

横幅は半角8文字分、縦幅は3文字分の四角の中と分かりますが、これの具体的なピクセル数を知りたいです
MS ゴシックなどの固定幅であれば掛け算で算出できますが、プロポーショナルフォントを使っている場合が分かりません
全ての文字の幅を調べて足し算するしかないのでしょうか?
827デフォルトの名無しさん:2006/02/27(月) 22:04:58
>>826
はい。
828デフォルトの名無しさん:2006/02/27(月) 22:30:02
質問です。
C♯で独自のウインドウメッセージを送りたい、また受信したいのですが
Cで言う所のWM_APPみたいなのって、C♯にはないのでしょうか?
あと、WM_APP+1みたいに使っていくのも嫌なので、何か空いてるメッセージIDを生成してくれるような関数はないのでしょうか?
829デフォルトの名無しさん:2006/02/27(月) 22:31:32
>>828
ないです。RegisterWindowMessage() を使いましょう。
830デフォルトの名無しさん:2006/02/27(月) 22:48:49
質問させていただきます。

任意の時点で動的にアセンブリを読み込み、解放する必要のあるソフトウェアの設計を行っています。
上の機能を実現するために、読み込むアセンブリごとに AppDomain を生成し、それにアセンブリの保有する
型を持たせる、という手段を検討しています。

そのために、System.Collections.Generic.Dictionary<System.String, System.AppDomain> 型のメンバを
用意することを考えました。しかし、AppDomain 生成 -> アセンブリをロード -> ディクショナリに追加、という
複雑な流れ (さらに解放の際も) を踏む必要がありながら Dictionary の Add や Remove が触れるというのは
あまりよい状況とは思えません。

ここで、
 1) Add / Remove をオーバーライドした Dictionary のサブクラスを使用する
 2) Dictionary を private にし、操作をラップするメソッドを実装する
の、どちらの解決方法をとった方が .NET のライブラリ設計として妥当なのでしょうか?
831デフォルトの名無しさん:2006/02/27(月) 22:50:47
>>830
俺なら後者。
832デフォルトの名無しさん:2006/02/27(月) 23:01:43
俺なら敗者。
833デフォルトの名無しさん:2006/02/27(月) 23:10:27
後者かなあ。
Dictionaryは、データの本質がDictionaryな場合にのみ外に見えるべきであって
アセンブリのロードだの解放だのって機能は、Dictionaryデータ構造を持つのが
本質ではない気がするから。
834デフォルトの名無しさん:2006/02/27(月) 23:11:55
C++で
BOOL WINAPI foobar(HWND hWnd, UINT Msg);
こんな関数を作って
C♯側から、
[DllImport("foobar.dlll", CharSet = CharSet.Auto)]
public static extern bool foobar(IntPtr hWnd, uint Msg);
こんな感じでインポートしようとしたんですが
間違ったフォーマットのプログラムを読み込もうとしました
って出て、形式が違うと怒られます。
どういう形式に書き換えれば良いのでしょうか?
HWNDをIntPtrにしたのが行けなかったのでしょうか?
835デフォルトの名無しさん:2006/02/27(月) 23:20:29
extern "C" とか その辺りは?
836デフォルトの名無しさん:2006/02/27(月) 23:44:10
絶対に後者
迷う余地はない
837デフォルトの名無しさん:2006/02/27(月) 23:44:21
class PluginDictionary: IDictionary<string, AppDomain>
Dictionaryのインタフェースを使ってイロイロできるので使いやすい。かもしれない。
といいつつ、俺も後者。
用途的に使用するインタフェースが少なそうだから。&ほぼ>>833と理由同じ
2)みたいに継承はしない 仕様みるとis-a関係っぽくないし。
838デフォルトの名無しさん:2006/02/27(月) 23:48:00
あとdllexportは?.defファイル?
839830:2006/02/27(月) 23:54:55
>>831 >>833 >>836 >>837
ありがとうございます。後者にします。

# Dictionary に限らず、便利なクラスを眺めていると、どうしても
# 本来の意味付けから外れたような使い方ばかり浮かんでしまいます。
# これからは気をつけるように心がけようと思います。
840817:2006/02/27(月) 23:57:42
えーと、CDイメージからインストールする方法で正常にインストールできました。

参考までに>>824に答えておくと、失敗したセットアップファイルの入手元は
http://www.microsoft.com/japan/msdn/vstudio/express/vcsharp/
このページの「Webからインストール」

ハードウェア構成は
CPU: Athlon 64 3200+(939pin)
M/B: MSI K8N Deluxe BIOS v1.4 Driver 忘れたけど2006年1月頃に最新
VGA: Radeon X800 Pro
Sound: Creative Sound Blaster Audizy 2 ZS

OSはXP Pro SP2 アップデートは更新通知が来る物は全部適用済み
Officeは未導入、IEは6.0.2900.2180

インストール時にはほとんど何も起動してませんでした
というかOS自体最近入れましたしSP2は今日インストールしました

具体的に止まる箇所は
exeファイルを実行→一時ファイルをコピー→セットアップが起動

セットアップのウィンドウに
「インストールコンポーネントを読み込んでいます。この処理には1〜2分かかる可能性があります。」
が表示されて、その下にゲージが表示される所で、ゲージが約8割進んだところで止まる

CPUの使用率が95〜99%で張り付いたままでPC全体の動作がかなり重くなる


んで、同じページからisoってファイルをダウンロードして、それからインストールしたら出来ました。
正直すまんかった。
ひょっとしてVC#使いの間では有名な現象で、聞いたらすぐわかるかもって思ったんだよね
841デフォルトの名無しさん:2006/02/27(月) 23:57:47
C#de共用体みたいのはありますか?
842デフォルトの名無しさん:2006/02/28(火) 00:02:20
>>840
最初から入手先とインストール形態を明記していたら違った回答が来たに違いない
無料のExpress版は色々と報告されていたはずだし
#最初はWebインストールをすると公開しときながらiso公開でこれも問題になったそうだ
843デフォルトの名無しさん:2006/02/28(火) 00:04:31
844834:2006/02/28(火) 00:06:02
すみません。勘違いしてました。

え〜と、
C++で
main.cppで
#define DllExport extern "C" __declspec (dllexport)

DllExport BOOL foobar(HWND hWnd, UINT Msg);
がありまして。

C♯側から、>>834と同様に書いて呼び出しても同じ結果になります。
845デフォルトの名無しさん:2006/02/28(火) 00:13:16
ASP.NETでC#のユーザコントロールとか呼び出す時って
COMの相互運用チェックしてたC#のライブラリコンパイルして
ASP側でぺたっと貼り付ければいいんだっけ?
846デフォルトの名無しさん:2006/02/28(火) 00:15:48
>>843
ありがとうございます
847デフォルトの名無しさん:2006/02/28(火) 00:34:29
>>844
うーん?なんかC++のほうが間違ってそうなメッセージなんだよね。
Dependency Walkerできちんとexportしてるか確認してみて。
まさかCLRバイナリでコンパイルしたわけではないよね?
848デフォルトの名無しさん:2006/02/28(火) 00:45:46
>>847
Dependency Walkerでもちゃんとexportされてますし
CLRオプションはつけてません。
849デフォルトの名無しさん:2006/02/28(火) 00:47:20
>>834
[DllImport("foobar.dlll", CharSet = CharSet.Auto)]

dlllってのはただのタイプミス?
850844:2006/02/28(火) 00:48:19
>>849
あ、すみません。
ミスタイプです。
851デフォルトの名無しさん:2006/02/28(火) 00:59:58
>>844
dumpbin /exports foobar.dll
で期待してる名前でExportされているか確認
852844:2006/02/28(火) 01:07:29
>>851

ordinal hint RVA name

1 0 00001200 foobar = _foobar

Summary

2000 .data
2000 .rdata
1000 .reloc
6000 .text

こんな感じです。
853デフォルトの名無しさん:2006/02/28(火) 02:53:10
AxWebBrowserから.NET 2.0で標準搭載された
WebBrowserコントロールへ移行しています。
従来のAxWebBrowser.GetOcx()で得ることができたOLE?オブジェクトを
WebBrowserから得たいのですがどうすればよいでしょう?

本来の目的はjavascriptでウィンドウが閉じられたときに
WindowClosingイベントを受け取りたいだけなんですが。
854デフォルトの名無しさん:2006/02/28(火) 03:00:59
>>852
もしかしてC++ってボーランドC++だったり?
昔ボーランド系で勝手に関数名の前にアンダースコア付けられて
難儀した覚えが
855デフォルトの名無しさん:2006/02/28(火) 03:08:52
>>853
HtmlWindow.AttachEventHandler で対応できないか?
ActiveXインスタンスはWebBrowser.ActiveXInstanceやらHtmlDocument.DomDocumentやらHtmlWindow.DomWindowで取れるが。
856デフォルトの名無しさん:2006/02/28(火) 03:12:06
>>852
*.def 使うのが確実
857デフォルトの名無しさん:2006/02/28(火) 03:27:56
>>834の奴はなかなか解決してませんね。
exportはきちんと出来ていそうですが…
.defはもう使うなって扱いだと思ったんですがどうでしょう。
エラーメッセージからするとERROR_BAD_FORMATのようだけど
なんかC++側で出てるような気がするんですが。

DLLが自作なら、DLL側のプロジェクトを立ち上げて
プロセスにアタッチして、トレースかけられませんか?
(CLRで可能かどうか知りませんが)

切り分けの為に、DLLを呼び出すだけの簡単なプログラムを作って
「C++から」DLLの呼び出しが可能かどうかチェックするのも良いかもです。
858834:2006/02/28(火) 03:52:11
解決しました・・・。
どういうわけか、C♯側でCPUタイプをANYに設定していたのを
x86に変えたら直りました・・・。
実は私の環境、x64のWinXPなんです。
恐らくANYにした事で、X64環境では64bitモードとして、X86環境では32bitモードで動くバイナリが出来てしまったのではないかと・・・。
で、参照しているDLLは32bitなので、フォーマットが違う と言う風になったのだと思います。

お騒がせして申し訳ありませんでした。
859デフォルトの名無しさん:2006/02/28(火) 03:57:03
質問です。
C#のプログラムに、文字列としてstring型ではなく、char型の配列として
ポインタをウインドウメッセージとして送るプログラムがあるのですが
この場合、C#側のプログラム内でアンマネージドモードに変えて、そのcharのポインタをstring型に変えて処理する必要があるのでしょうか?

具体的には
protected override void WndProc(ref Message m){

string = m.WParam.ToString()

base.WndProc(ref m);
}

こういう感じの変換では、出来ないのでしょうか?
単純にアドレスがstring型になってしまうだけですかね?
860デフォルトの名無しさん:2006/02/28(火) 04:05:07
>>859
そういうとき何でまずMarshalクラスをみんかね…
つ Marshal.PtrToStringAuto
861853:2006/02/28(火) 10:25:05
>>855
たぶん、これで良さげ。
- DocumentCompleteイベントでDocument.Window.Unloadイベントを登録
- Unloadイベントで、Documentがnullになっていたら、ウィンドウが閉じられたと判断

AttachEventHandler("onunload", OnUnload);でもできるけどね。
てか、こっちはDOMレベルのメソッドだから、.NET1.1でもこの方法でいけたな。
このめんどいやり方してたけど・・・
http://groups.google.com/group/microsoft.public.dotnet.framework.windowsforms/browse_thread/thread/14f153d28278a0cc?hl=en&lr=&ie=UTF-8&oe=UTF-8&frame=right&seekm=074001c2a082%24d2924870%24cef82ecf%40TK2MSFTNGXA08
862853:2006/02/28(火) 14:41:32
自己レス。やっぱだめ。Unloadが呼ばれないときもある。
てか、そもそもなんでWindowClosingイベントが呼ばれないんだ・・・
863デフォルトの名無しさん:2006/02/28(火) 15:06:27
あらかじめ言っておくけど、
.NETではグローバル・フックはできないからね(・∀・)
864デフォルトの名無しさん:2006/02/28(火) 16:31:44
>>863
誤爆?どれにかかるの?
865デフォルトの名無しさん:2006/02/28(火) 21:31:35
>>862
WindowClosing呼ばれないの?それは、DWebBrowserEvents2の
WindowClosingだよね?
違うんならそっちを使ってみれば?拡張の仕方はんーと、

ttp://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=7228&SiteID=1

この辺参考にしてみて。
866853:2006/02/28(火) 23:39:15
DWebBrowserEvents2です。
(SHDocVw.WebBrowser)webBrowser.ActiveXInstance;
ってキャストしてWindowClosingハンドリングしても、
IEEventsでWindowClosingハンドリングしてもイベントがきません。
結局、タイマーで監視してDocumentがnullになったら
ウィンドウが閉じられたと判断しようかとおもいます。
867デフォルトの名無しさん:2006/02/28(火) 23:58:40
>>866
キャストしてイベント登録でいけるんかな?してるとして、どこでしてる?
一応ドキュメントにはCreateSinkでConnectionPointCookieつくるように
かいてあるんやけど。イベント登録にそのコードが入っている?
868デフォルトの名無しさん:2006/03/01(水) 00:03:02
なんでManagedWebBrowser使ってんのに
SHDocVw参照してるんだよ。意味ないじゃん。
869デフォルトの名無しさん:2006/03/01(水) 00:06:21
>>868
めんどいんだよ。手動で全部定義する必要があるから(動くことを確認したら
これにしたほうがいいけど)。拡張したことないんなら黙ってろ。
870デフォルトの名無しさん:2006/03/01(水) 00:06:34
だけじゃあんまりなので。

ttp://lab.msdn.microsoft.com/productfeedback/viewfeedback.aspx?feedbackid=c5aa05c2-73ce-40af-b6b1-7b5900cf4e9f

俺が参考にしてる情報はこれだ。内容は同じだと思う。
871デフォルトの名無しさん:2006/03/01(水) 00:07:36
>>869
ちょwww
872デフォルトの名無しさん:2006/03/01(水) 00:15:41
873853:2006/03/01(水) 00:30:32
>>867>>870
そこに書いてあることもやったけど、WindowClosingはこなかったよ(´・ω・`)
,NET2.0のWebBrowser.ActiveXInstanceで渡しているところを
AxSHDocVw.AxWebBrowserならGetOcx()を渡すのだが、
それだとWindowClosingが取れる。以前はそうやってた。
てか.NET2.0のWebBrowserを使いたかったのも、
AxSHDocVw.AxWebBrowserで、
HTMLドキュメント内のコントロールをXPスタイルにする方法が
わからなかったからなんだけどね。
それができたらAxSHDocVw.AxWebBrowserに戻しても良いかな。
874デフォルトの名無しさん:2006/03/01(水) 01:02:48
>>873
うーん?

he default behavior of Microsoft Internet Explorer is to close windows that
were created by script without asking the user. If an attempt is made to
close the main InternetExplorer or WebBrowser control window through
script, the user is prompted.

これは満たしてる?よなぁたぶん
875874:2006/03/01(水) 01:06:29
あごめん、勘違いしてた。「発生しない」わけではないのか。
876853:2006/03/01(水) 01:16:29
.NET2.0のWebBrowserではWindowsClosingが発生しない。
どっかの記事でVBなら取れるとか見た・・・
ちなみにその記事はBeforeNavigate2でURLを取ることが目的ですよね?
それは単純にこれで実現できる。
SHDoc.WebBrowser wb = (SHDoc.WebBrowser)ActiveXInstance;
wb.BeforeNavigate2 += new SHDocVw.DWebBrowserEvents2_BeforeNavigate2EventHandler(axWebBrowser_BeforeNavigate2);
877デフォルトの名無しさん:2006/03/01(水) 01:33:57
C# 2.0 でのデリゲートインスタンスに new HogeEventHandler( ) が不要になったありがたみが分かるコードだな
878デフォルトの名無しさん:2006/03/01(水) 01:58:40
879デフォルトの名無しさん:2006/03/01(水) 14:11:41
RichTextBoxでテキストの選択をさせない方法をどなたかご存じないでしょうか。
ReadOnlyだけでは選択が可能ですし、SetStyleでControlStyles.UserMouseを有効にしたりキー操作を無効にしてもカーソルは表示されてしまいます。

コードからの選択やスクロールは行わせたいので、Labelなどでは実現できません。
選択は無理でも最悪スクロールだけでも行わせたいです。

Win32APIを使う方法でも良いですので、実現方法をご存知の方は教えてください。
880デフォルトの名無しさん:2006/03/01(水) 14:52:02
>>879
Enabled = false;
881デフォルトの名無しさん:2006/03/01(水) 17:31:06
>>880
それじゃスクロールできないじゃん
882デフォルトの名無しさん:2006/03/01(水) 17:45:03
>>881
コードからのスクロールは出来るだろ
883デフォルトの名無しさん:2006/03/01(水) 17:50:55
かなりとんちがきいてるが正しいな。
884デフォルトの名無しさん:2006/03/01(水) 18:53:39
>>879
確かに、
Enabled=falseにしてスクロールバーを別途配置。
スクロールのイベント取ってコードからRichTextをスクロールでいけないかな?
885デフォルトの名無しさん:2006/03/01(水) 19:20:09
パネルの中にRichTextほおりこんで、
パネルよりでっかいサイズにしたら駄目?
886879:2006/03/01(水) 19:24:48
>>880
それも考えたのですが、スクロールバーまでdisableになってしまいます
また、色もグレーアウトしてしまいますので。。。
先に書いておくべきでした、すみません

>>882
すみません、「コードから」が掛かるのは「選択」だけです
スクロールはマウスからも行いたいのです

>>884
スクロールバーとの組み合わせですか
色を解決できれば使えそうですね
色の変更方法と合わせて調査してみます
887デフォルトの名無しさん:2006/03/01(水) 19:28:00
>>884
ん?ユーザーからは選択もスクロールもさせたくないんじゃないのか?
コードからのみしたいって話で。
888デフォルトの名無しさん:2006/03/01(水) 19:30:13
>>886
何、つまりスクロールはさせたいが選択はさせたくない?
選択って何?ハイライトさせたいだけ?
ならんなものPanel継承して自分で作れ。それのほうが早い。
889デフォルトの名無しさん:2006/03/01(水) 20:41:17
>>885
それも考えたのですが、そうすると、選択してもスクロールしない、テキストに合わせたサイズにできない、など動作の違いが出るので止めました。
内部のテキストのサイズを計測して同じサイズにすれば良いかとも思いましたが上手く解決できませんでした(>>826は私です)

>>887
不明確な言葉ですみません
スクロールはユーザにさせたいのです

>>888
RichTextBoxと同等の描画機能(RTFによるフォーマット)を実装する必要があるので工数的に厳しいです
というかRTFのパーサを組むと考えるだけでも頭がクラクラします・・・
890デフォルトの名無しさん:2006/03/01(水) 20:58:06
>>889
RichTextBox を継承したコントロールを作って、WndProc をオーバーライドして
WM_LBUTTONDOWN 等を捨ててしまえばいいのでは・・・
891デフォルトの名無しさん:2006/03/02(木) 13:17:30
>>889
private void richTextBox1_SelectionChanged( object sender, EventArgs e )
{
  richTextBox1.SelectionLength = 0;
}

カーソルは表示されるけど
892デフォルトの名無しさん:2006/03/02(木) 17:10:07
同じような要件があってこういう風に実装してる

1.ReadOnlyプロパティをtrueに設定
2.TabStopプロパティをfalseに設定
3.Enterイベントで適当なコントロールのFocus()を呼んでフォーカスを飛ばす(次のタブインデックスのコントロールなど)
4.SelectionChangedイベントで現在の選択範囲を維持するようにする(Enterの時点で選択が解除されるため/コードで選択した範囲はクラス内で保持しておく)

・タブオーダーに影響しない
・ユーザ操作では選択されない
・ユーザ操作でスクロールできる
・コードから選択範囲を変更可能
・RTFテキストが使用できる
893デフォルトの名無しさん:2006/03/02(木) 17:41:43
7÷2=3...1ですがこのあまりの1を使うにはどうすればよいですか
答えの3は/で使えました
894デフォルトの名無しさん:2006/03/02(木) 17:46:45
>>893
「演算子」で検索すればでてくるよ。
とりあえずShiftキーを押さえながら5を押すんだ。

895デフォルトの名無しさん:2006/03/02(木) 17:51:03
>>893
7%3
896デフォルトの名無しさん:2006/03/02(木) 18:30:35
>894さん
「演算子 [C#]」に%演算子というものがありました
7%3にすると1が使えました
ありがとうございました

>895さん
7%3でも1が使えました
ありがとうございました
897デフォルトの名無しさん:2006/03/02(木) 18:31:28
>896
まちがえました
まえのは7%2でつぎのが7%3でした
どちらも1がとれました
ありがとうございました
898デフォルトの名無しさん:2006/03/02(木) 18:33:52
>895さん
あなたのはまちがっていました
7%2があたりでした
7%3はかきまちがいですか?
ざんねんです
899デフォルトの名無しさん:2006/03/02(木) 19:05:54
SQLServer2005Express上のテーブルにレコードを追加しようとしているのですが、
レコードが追加できません。(コンパイルエラー・実行時例外共になし)
煮詰まって、お手上げです、どの様に修正すればよいのでしょうか。
環境はVisualStudio2005Pro+SQLServer2005Express+WinXpProです。
(adapter.SelectCommandでSELECTはできました。)

command = new SqlCommand(
"INSERT INTO test (SEQ, Message) " +
"VALUES (@seq, @message)", connection);
command.Parameters.Add("@seq", SqlDbType.Int, 4, "SEQ");
command.Parameters.Add("@message", SqlDbType.NVarChar, 20,"Message");
command.Parameters["@seq"].Value = 3;
command.Parameters["@message"].Value = "Hello?";
adapter.InsertCommand = command;
900デフォルトの名無しさん:2006/03/02(木) 19:42:46
>>899
SqlCommandBuilder
901デフォルトの名無しさん:2006/03/02(木) 19:43:50
>>899
それだけじゃわかんね。
DataTableに追加するところと、Updateするところはどないになっとる?
902デフォルトの名無しさん:2006/03/02(木) 20:01:59
ビルドでコピーしてるんだろう。
903デフォルトの名無しさん:2006/03/02(木) 20:08:22
失礼します。
C#の初心者専用スレが見つからなかったので、ここでよろしいかわからないのですが、質問があります。

PanelのAutoScrollをtrueにし、その上にピクチャーボックスを貼り付けています。
うまいぐあいに「大きい画像には自動的にスクロールバーがつき、スクロールさせて見られる」という仕組みができました。

ただ、Panelに十分な横幅を持たせているのにも関わらず、横幅がPanel幅未満の画像をロードしても
横スクロールバーが無効になってくれません。
無効になってくれないだけではなく、ちょびっとだけ画像のが隠れてしまい、スクロールしないと全横幅が見られなくなってしまいます。

どうも縦スクロールバーの幅の分だけ隠れてしまうようなのですが、これに対処するプロパティなどはありますでしょうか?
904最凶VB厨房:2006/03/02(木) 20:14:16
SqlCommand.ExecuteNonQueryじゃだめなんだろうか。
SqlDataAdapterを使う意図が感じられんのだが。
905988:2006/03/02(木) 20:25:09
お世話になります。
>>900
>SqlCommandBuilder
>>901
>DataTableに追加するところと、Updateするところはどないになっとる?
すみません、C#で書く、初めてのプログラムなので、このあたりのことが
判っていません。(このコードもMSDNの使用例をコピーして作っています。)

ソースとしては、次のように書いています。
static void Main(string[] args)
{
DataSet dataset = new DataSet();
SqlCommand command;
// データベースへの接続を作成
SqlConnection connection = new SqlConnection(
"Data Source=.\\SQLEXPRESS;Initial Catalog=TestDB;User ID=hoge;Password=hoge;");
// SQL Server データベースの更新に使用する、データベース接続アダプタを作成
SqlDataAdapter adapter = new SqlDataAdapter();
// INSERTを実行してみる
command = new SqlCommand(
"INSERT INTO test (SEQ, Message) " +
"VALUES (@seq, @message)", connection);
command.Parameters.Add("@seq", SqlDbType.Int, 4, "SEQ");
command.Parameters.Add("@message", SqlDbType.NVarChar, 20,"Message");
command.Parameters["@seq"].Value = 3;
command.Parameters["@message"].Value = "Say Hello";
adapter.InsertCommand = command;
}
テーブルは、SEQ(int)とMessage(nvarchar(20))のみです。
906デフォルトの名無しさん:2006/03/02(木) 20:31:26
listView_Local_AfterLabelEditを使って、右クリックで指定したフォルダの名前を変えたいのですが、変更後のファイルで順番が変わる場合、同じ名前のファイルが2つできるのですが、どうすれば回避できるでしょう・・?
下記のようなフォルダがあった場合、「555」を「222」に変更すると例のように表示されます。再度"LocalFilelistを読み込むと正常に表示されるのですが、名前を変更した時に一緒に正常に表示できるようにしたいです。ご教授お願いします。
---------------------------
111 111
333 →222
555 222
---------------------------
private void LocalFileList(string path){
listView_Local.Items.Clear();
tbox_LocalPath.Text = path;
ListViewItem listViewItem;
//フォルダ一覧
DirectoryInfo DI;
DI = new DirectoryInfo(path);
foreach(DirectoryInfo dir in DI.GetDirectories()){
listViewItem = new ListViewItem(dir.Name,1);
listView_Local.Items.Add(listViewItem);}}
//アイテムを改名する
private void menuItem2_Click(object sender, System.EventArgs e){
Temp = lvi.Text;
lvi.BeginEdit();}
private void listView_Local_AfterLabelEdit(object sender, System.Windows.Forms.LabelEditEventArgs e){
string filename = e.Label;
Directory.Move(Temp,filename);
LocalPath = Directory.GetCurrentDirectory();
LocalFileList(LocalPath);}
907デフォルトの名無しさん:2006/03/02(木) 20:35:44
>>903
再現しないんだが。
PictureBox のサイズはどうやってるんだ?
908デフォルトの名無しさん:2006/03/02(木) 20:53:01
>>906
回避も何も、どっかで変なことやってるんだろう。
ブレークポイント設置してどこでListViewItemのラベルが変更されてるかチェックしていってみろよ。

//恐ろしく読みづらく且つ意味のない例示コードだな。
909デフォルトの名無しさん:2006/03/02(木) 20:56:27
リドロウがうまく言ってないだけじゃないの?
listView_Local_AfterLabelEditの最後で listView->Invalidate();
でもしてみたら?
910デフォルトの名無しさん:2006/03/02(木) 21:18:20
>>905
いや、そのコード根本的な部分で間違いまくってるから。
ADO.NET周りのドキュメントやらチュートリアルやら@ITあたりの入門記事やらを
読んで最低限の知識ぐらいはつけて。
911デフォルトの名無しさん:2006/03/02(木) 21:25:58
>>907
お返事ありがとうございます。
AutoSizeを指定しています。

ずばり
ttp://dobon.net/vb/dotnet/graphics/scrollimage.html
のサンプルコード(URLはvbですが、c#のコードもあります)を試しています。
このとおりにやり、横幅は小さめ。縦幅が大きめの画像を読み込めば際限するかと思います。

こちらの環境は
Microsoft Visual C# 2005 Express Edition です
912デフォルトの名無しさん:2006/03/02(木) 21:41:59
んん〜?
(200,200) の Panel に乗った PictureBox に (190, 210) のイメージを読み込ませたらスクロールバーが両方出ちゃうってこと?
そりゃ当たり前の動作だが。
縦スクロールバーが表示されて、その縦スクロールバーのために横表示領域が 200 より小さくなるからな。
(200 - SystemInformation.VerticalScrollBarWidth, 210) のイメージなら当然縦スクロールバーのみだし。
913デフォルトの名無しさん:2006/03/02(木) 21:50:22
>>912
はい。
ただ、Panelが十分横に大きいのだから「横スクロールバーは消える」「縦スクロールバーだけになる」というのが最も望ましい結果です。
もしそれは(縦スクロールバーのせいで)難しいのであれば、「バーが消える」のではなく「バーが無効になる」動作でも構わないと思っています。

横に十分な大きさがあるのに、スクロールしないと横の全景が見えないのは不満かと思います。
(そういえばIEでフレームが使われているページにいくと、十分横にIEを広げても同じ現象になりますね)
914898:2006/03/02(木) 21:56:27
お騒がせ致しました、解決しました。
static void Main(string[] args)
{
DataSet dataset = new DataSet();
SqlCommand command;
// データベースへの接続を作成
SqlConnection connection = new SqlConnection(GetConnectionString());
connection.Open();

command = new SqlCommand(
"INSERT INTO test (SEQ, Message) " +
"VALUES (3, 'SayHello')", connection);

// INSERTを実行しる
Int32 recordsAffected = command.ExecuteNonQuery();
}
915デフォルトの名無しさん:2006/03/02(木) 22:04:24
>>913
それはつまり(画像を表示できる幅を減らさないように)
幅ゼロで縦スクロールバーを表示して欲しいということですか?
プログラムは簡単になるでしょうけれども、実現不可能なような気がします。
916デフォルトの名無しさん:2006/03/02(木) 22:19:16
913 の言うことは、横は十分表示してるから最後の数ピクセルは切れてても良いよね、ってことなのかなぁ。
917デフォルトの名無しさん:2006/03/02(木) 22:28:24
>>915
いえ。縦スクロールバーを考慮に入れた上で、十分な横幅を確保して欲しいということです。

■が画像
□がスクロールバーだとします。

横4■, 縦10■ の画像をセットすると↓こうなってしまいます。

■■■□
■■■□
■■■□
■■■□
■■■□
□□□ 
私としては
■■■■□
■■■■□
■■■■□
■■■■□
■■■■□

こうなって欲しいわけです。それができるくらい十分に横幅がある(それくらいスペース空けてる)のですから。
もしくはせめて

■■■■□
■■■■□
■■■■□
■■■■□
■■■■□
□□□□ 
こうなって欲しいのです。横スクロールバーは、いわゆる触れない「無効なスクロールバー」ですが。
918デフォルトの名無しさん:2006/03/02(木) 22:30:59
それどうみても Panel のサイズが変わってるんだが。
そう言う解決で良いのなら画像変えるときに Panel のサイズ変更すれば良いだけだろ。
919デフォルトの名無しさん:2006/03/02(木) 22:39:45
要は縦横のoverflowで別々にスクロールバーを出したり出したくなかったりしたいってことだろ?
AutoScrollでは無理
ユーザコントロールで自力でスクロールバーの表示制御をするコントロールを作るべし
920デフォルトの名無しさん:2006/03/02(木) 22:46:32
>>918
AutoScrollをTRUEにしていると、Panelのサイズがかわったごとき動作になるようです
実際はPanelは十分に横幅をもっており、AutoSizeはFALSEです

>>919
Autoでは無理ですか。がんばって自作してみることにします
車輪の再発明って感じですが、C#を理解するステップとしては丁度いいかもしれません。

>ALL
ありがとうございました。
921デフォルトの名無しさん:2006/03/02(木) 23:01:04
標準のスクロールバーの出方でいいと思うんだけどなあ。
何が不満なのかさっぱりわからん。
922デフォルトの名無しさん:2006/03/02(木) 23:12:51
いや、俺もあれはむかつくぞ。横にスクロールさせる意味ねーだろ!!って思う
923デフォルトの名無しさん:2006/03/02(木) 23:21:36
そうか? 実際に表示し切れてないんだからスクロールできるようにせにゃならんだろ
924デフォルトの名無しさん:2006/03/02(木) 23:57:51
縦スクロールバーも考慮に入れた上で、きちんと横一杯表示してほすぃ
925デフォルトの名無しさん:2006/03/03(金) 00:11:42
相談です

C#でマップエディタでも作ろうと思い

・まず町の全景をImageに作りました。5120*5120ドットくらいで、かなり大きいです
・次にPictureBoxを作成。256x256程度です
・マウスドラッグでスクロールできるようにし、1/60秒で画面を再描画するようにしました

ところがこれが物凄く重いのです。

{
Graphics g = pictureBox1.Image;
g.DrawImage(imgMap, 0, 0, new Rectangle(nScrollX, nScrollY, 256, 256), , GraphicsUnit.Pixel);
pictureBox1.Invalidate();
}
これが1/60秒で呼ばれるようになっています。

ためしに町の全景を512*512にしてみたところ、とてもスピーディーになりました。もたつきはありません。
ということは、画像の転送元の大きさに影響を受けてしまうということなのでしょうか。

C#を使い始めたのはつい最近なのですが、C++時代には考えられない遅さです。やり方を根本的に勘違いしているのでしょうか?
アドバイスお願いいたします。

C#はGDI+を使っているのでハードウェアアクセラレーターが効かないのは重々承知なのですが、転送元の画像がでかいと遅くなるというのは…
926デフォルトの名無しさん:2006/03/03(金) 00:17:18
GDI+ だしなぁ。
ていうか街の全景って一枚絵にするもんなの?
927デフォルトの名無しさん:2006/03/03(金) 00:21:52
>>926
はい。いわゆる水彩画のようなタッチで描いたでかい1枚の町絵を背景としたRPGとなります。
どうもある一定の大きさを境に、ガクっと速度が落ちるようです。

Imageを読み込んだあと、分割して持つしかないですかね…。
928デフォルトの名無しさん:2006/03/03(金) 00:23:28
うーん交差点に黒い丸が見える・・・
929デフォルトの名無しさん:2006/03/03(金) 01:13:08
927です
画面を256*256ずつに分割したらちょっぱやになりました。
手抜きで、256*256を全部DrawImageしてるんですけどね…。参照元の大きさが一定以上いくと激遅になる。と記憶しました

ただ、分割する時にすら信じられないほど遅くて、5120*5120を256*256に分解すると30秒くらいかかりましたわ…
930デフォルトの名無しさん:2006/03/03(金) 01:17:12
知らんと Managed DirectX と言ってみる
931デフォルトの名無しさん:2006/03/03(金) 08:06:10
>>929
Google Map見てきたほうが良いよ
あれはピクセル数で言えば億単位以上の画像をスクロール可能にしてる
どうすれば巨大画像を効率良く扱えるか見えてくる
別に物理的に画像を分割しなくてもビットマップをヘッダとデータで分割してランダムシークとか方法は色々ある

ファミコン時代のドラクエなんかも仕組みは同じ
表示する箇所だけ描画
スクロールするときはスクロール量(ドラクエだったら一歩/一マス)の分だけ先に書いておいてスクロール
スクロールアウトした箇所は描画から落ちる
時代が変わってもやることは一緒

で、単に表示ではなく60fpsものフレームレートが必要な理由って何?
そんだけのフレームレートを出すならDirectXを使うべき
意固地にGDI+に執着するは勝手だが苦労するだけなので、適材適所の製品選択を
単に表示して再描画だけならGDI+で十分だと思うけど60fpsも出すとなるとハードリソースに頼りすぎだと思う
932デフォルトの名無しさん:2006/03/03(金) 08:08:47
>>925
C++で同じプログラム書いて速度計測してみた?
933デフォルトの名無しさん:2006/03/03(金) 08:13:09
>>927
5120*5120*32だとすると約800MBだよね
それだけをメモリ上に確保してってやってりゃスワップも発生しないか?
あとDrawImageがどういう実装か分からんけど、効率的にメモリ上のビットマップにアクセスできてるのかね。
C++時代は考えられないとか書いてるけど、C++の時は自力でそのあたりも実装したんでしょ?
だとすればC#でも同じコード書いてみ。
934デフォルトの名無しさん:2006/03/03(金) 08:44:14
>>933
100MBだろ
935933:2006/03/03(金) 09:47:00
32掛けてたよママン orz
色に32バイトもかけてる贅沢な画像はまだ無いよね orz
936デフォルトの名無しさん:2006/03/03(金) 09:52:34
>>929
MouseMoveイベントで描画で十分じゃないの
マップエディタであってゲームじゃないよね
937デフォルトの名無しさん:2006/03/03(金) 10:21:09
>>925
> 転送元の画像がでかいと遅くなるというのは
普通だろ
転送元がどう格納されているかなんてC#じゃ制御できないし
60fpsものパフォーマンスを求めるならC++とDirectXでフルスクラッチ
938デフォルトの名無しさん:2006/03/03(金) 12:00:29
お世話様です925, 927です

私も本来なら描画範囲だけ動的に作ればいいと思っていたのですが
描画範囲をチップで構築するのがこれまた遅いのです。

マウスクリック&ドラッグによるスクロールを実装しているのに
FPSがガタオチでスクロールがスムーズに行なえません。

FPS60にこだわっていたのは、このクリック&ドラッグスクロールがあるためです。
939デフォルトの名無しさん:2006/03/03(金) 12:05:58
>>925
単に変数に盛っておいて、pictureBox の Image に入れなけりゃ早くなるんじゃないの?
pictureBox1.Image にでかい画像いれて、pictureBox1.Invalidate(); なんて
したら大変なことになるのは当然のような・・・
940デフォルトの名無しさん:2006/03/03(金) 13:03:28
>>939
いえ。925の実装ではpictureBoxのImageには描画範囲分しか持たせておりません。
(今よくみたら、Graphics gへの代入が変ですね)

最初はpictureBox.Imageに町の全景を持たせていたのですが、ちょっとした大きさでもすぐ重くなってしまって使えませんでした。
ネットで調べたところ、.Imageへの代入はあくまで簡易に表示するためとありましたので、今回の実装に変更しました。

pictureBoxの大きさ(256*256)のImageをもたせる。
そのImageに、256*256分だけ町全景ImageからDrawImageで転送する。
941デフォルトの名無しさん:2006/03/03(金) 13:13:55
>>938
MouseMoveイベントでクリップ描画すれば事足りるだろ
ドラッグ操作と描画を分けて考えるからそんな面倒が実装になる
1200dpiのA0画像を編集するツールを作って客に出してるけど、DirectX使わずとも現行機レベルなら実用レベルで動いてるよ
942デフォルトの名無しさん:2006/03/03(金) 13:48:05
>>941
MouseMoveイベントで行いましても、描画自体の重さが解消されるわけではありません。
また、移動させたあとに余韻をもったスクロール(マップを滑らせながら離した場合、しばらくスクロールが続く)をさせるためにもTimerは必要となります。

ところでMouseMove中に描画処理をするようにしましたところ
画像の転送が遅すぎてInvalidateのWM_PAINT(がとんでると思っています)よりさきにWM_MOUSEMOVEが大量に溜まり、ほとんど再描画されないようになりました。
描画はタイマーに逃がしてしまわないとまずいのではないでしょうか?
943デフォルトの名無しさん:2006/03/03(金) 14:18:46
>>942
あのさ、最初にこう書いてるじゃん

> C#を使い始めたのはつい最近なのですが、C++時代には考えられない遅さです。

C++時代はどう組んでたの?
それと同じ組み方すればいいんじゃないの
ImageとかGraphicは巨大なデータの最適化より利便性優先だから遅くても仕方ないと思うし
944デフォルトの名無しさん:2006/03/03(金) 14:20:33
>>942
DirectXみたいに別の描画面があるわけじゃないから、描画はOnPaintでいいんでは
945デフォルトの名無しさん:2006/03/03(金) 14:35:27
課題で式を微分する関数を作らなければいけません
しかし方法が全く分かりません
検索でも上手く見つかりません
何かヒント教えてください
946デフォルトの名無しさん:2006/03/03(金) 15:03:28
>>943
C++時代は画像元が大きいと転送速度ガタオチという現象はありませんでした。
仮に32*32のようなチップを並べて画面を構築するタイプだとしても、描画必要範囲分をその時その時で構築してあまりあるスピードでした。

>>944
私としてはTimerだろうとOnPaintだろうとどちらでも良いと思っています。
ただ、描画速度の遅さというボトルネックが解決できないことには変わりません。


ついで
>>945
C#相談室ではなく、アルゴリズムスレとかで質問したほうがいいぞ
947デフォルトの名無しさん:2006/03/03(金) 15:21:39
みんな、プロファイラはどうしてるんだ・・・
プロファイラさえあれば、C# 2.0 に移行できるのに
948デフォルトの名無しさん:2006/03/03(金) 15:52:47
>>946

> C++時代は画像元が大きいと転送速度ガタオチという現象はありませんでした
それはC++/CLIで同じロジックを組んだものですか?
ビットマップへのアクセスをフルスクラッチした、全く違うアルゴリズムのものではありませんか?
描画はGDI直ですか?GDI+ですか?DirectXですか?

> 仮に32*32のようなチップを並べて画面を構築するタイプ
それは違う話ではないでしょうか
小さな画像を並べるのと巨大画像からクリップして貼り付けるのではアルゴリズムもメモリ上の扱いも違うと思います

> TimerだろうとOnPaintだろうとどちらでも良い
Timerではメッセージキューに描画命令が次々と入れられます
OnPaintであれば描画できるタイミングでの描画になります
もしかして描画が遅いのではなく、Timerから刻々とくる描画命令の負荷に耐えられないのでは無いのでしょうか
それが見かけ上描画遅延に見えるとか

まず、C++時代の十分に有り余る処理能力のコードを検証してみてはいかがでしょうか?
それとC#のコードがどう違うか、それを検証してはいかがでしょう
949デフォルトの名無しさん:2006/03/03(金) 16:29:06
アドバイスありがとうございます。
>もしかして描画が遅いのではなく、Timerから刻々とくる描画命令の負荷に耐えられないのでは無いのでしょうか
この可能性を考え、検証コードを組んでみたいと思います。

ちなみにC++の時はGDI直でした。GDI+も使えますが半透明などを使うつもりはないもので。
950デフォルトの名無しさん:2006/03/03(金) 16:29:39
>>946
逆に問題スピードのC++実装を見てみたい
それをC#に移植する助言できる人は沢山いると思うよ
951デフォルトの名無しさん:2006/03/03(金) 16:34:25
>>947
CLR Profiler for the .NET Framework 2.0 じゃあかんの?
952デフォルトの名無しさん:2006/03/03(金) 16:51:53
949です。
描画まわりをペイントがわに移し、MOUSE_MOVEでInvalidateを呼ぶスタイルにしてみました。
速度は変わらないようです。


>>950
単純にGDIリソースにチップ(ある程度小さい画像に分けてある)として読み込み
描画領域に移っているチップだけその場でBitBltしていただけです。
ハードウェアアクセラレーターがきくので滅茶苦茶速かったです。
953デフォルトの名無しさん:2006/03/03(金) 17:01:48
>>952
同じように組めばいいんでは
OSネイティブではない.NET Frameworkでは不得手なこともあるわけで
それと、GDI直でやるよりDirectXでやるべき仕様のような気がする
Managed DirectX使えばコードも簡単だしGDIより速いし文句の付けようが無いと思うよ
954デフォルトの名無しさん:2006/03/03(金) 17:16:12
>>953
なるほど。私もC++時代に使った経験がありますし、DirectXを検討してみようと思います。
Managed DirectXというものを調べて実装試してみます。
アドバイスありがとうございました。
955デフォルトの名無しさん:2006/03/03(金) 19:02:37
>>952
確かGraphics.DrawImageってソフトウェアレンダじゃなかったっけ?
DirectXでもいいけど、単純にpinvokeしてBitBlt使えば速くなると思うよ。
956デフォルトの名無しさん:2006/03/03(金) 20:33:21
なんかどっかにグラフィックの高速化について色々書いてあるTIPSだか
コラムだかを見たような気がして探してみたが見つからなかった。
結局は直接ごりごりやらんとムリって結論だったような気がしたが。
957デフォルトの名無しさん:2006/03/03(金) 20:37:17
Microsoft のサイトにあった奴か? それなら結論は「クリッピングを巧く使え」だったと思う。
このスレの流れ的には多分意味がない結論だな。
958デフォルトの名無しさん:2006/03/03(金) 21:36:03
60fpsを安定して出したいならDirectX
BitBltも悪くは無いけど餅は餅屋に任せるべき
959デフォルトの名無しさん:2006/03/03(金) 21:45:49
※DirectXはマシンの環境によっては使用できない事があるので注意
960デフォルトの名無しさん:2006/03/03(金) 21:50:38
>>959
今時どんな環境だよw
それ言い出したら.NET Framework入れてなきゃC#使えないわけで
あらゆるWin32環境で動くのを作ろうと思ったらC#は選べないよ
961デフォルトの名無しさん:2006/03/03(金) 21:51:32
DirectX かー。
今話しに上がってるような大きな画像はテクスチャにできないのでダメだと思うけどな。
システムメモリのサーフェスから転送するんだったらCPUで処理するのと大差ないし。
962デフォルトの名無しさん:2006/03/03(金) 22:07:39
ボトルネックが描画なのか転送なのか切り分けできてるの?
963デフォルトの名無しさん:2006/03/03(金) 22:32:47
ネイティブ吐き出すC#も検討されてるようだね
964デフォルトの名無しさん:2006/03/03(金) 22:49:09
ソースは?
965デフォルトの名無しさん:2006/03/03(金) 22:56:25
>>957
うーん・・ITmediaか@ITだったか。
結論は4バイトまとめてドン。とかそんな感じ。
966デフォルトの名無しさん:2006/03/03(金) 23:01:24
@IT っつーと C# 入門のアンセーフのところにあったセピア化のあれが思いつくな。
967デフォルトの名無しさん:2006/03/03(金) 23:09:51
>>960
そんなに単純な話でもない。
細かいフューチャーはサポートしているかどうかチップによっても違う。
だから「使うなら確認せよ」っていうんがDirectXの方針。

今回の場合でかいサイズのテクスチャだからDXTCあたり使うとよさげ。

でもDirectX云々抜きにしてメッセージループで60fpsは無謀です。みょん。
ゲームでよくPeekMessageぶん回すけどそのせい。
それにここまで上げるとティアリングの問題も出てくるし(無視すりゃいいが)、
「60fps絶対いる!」とかいうのでもない限り求めるな。そういうのはWindowsは
死ぬほど向いてない。Vistaでマシになるけども。
968デフォルトの名無しさん:2006/03/03(金) 23:22:40
>>967
細かい違いって言うけど、救いようのない違いってそんなにあるか?
大概代替手段が提供されていて、パフォーマンス低下するけどなんとかなる的に組まれてると思うが
そりゃサウンド無いのに音出せって言っても無理だが、それが一般的かと言われりゃそうじゃない
100%は無理でも代替でほぼ100%いけるのがDirectXの良さ
でなきゃDirectXでゲームは作れない
969デフォルトの名無しさん:2006/03/03(金) 23:27:26
まぁ、よほど細かい事しない限り、DirectXで大丈夫でしょ。
まさかC♯で最新技術を使ったFPSやらを作るわけじゃあるまいし
970デフォルトの名無しさん:2006/03/03(金) 23:38:02
なんだと
971デフォルトの名無しさん:2006/03/03(金) 23:40:34
なんだと
972デフォルトの名無しさん:2006/03/03(金) 23:54:16
> まさかC♯で最新技術を使ったFPSやらを作るわけじゃあるまいし

なんだと
973945:2006/03/04(土) 00:13:00
>>946
アルゴリズムなのですか?
C#で組みたいのですが・・・
974デフォルトの名無しさん:2006/03/04(土) 00:14:33
>>968
サポートしていない機能を使おうとするとエラーです。
っていうかつまり「代替機能」は「アプリケーションプログラマがやる」のが
基本スタンスなんす。

まぁ挙げている程度のことなら大丈夫だと思うけどね。注意するところは
サポートフォーマットとサイズぐらい?D3DXで吸収されるかな。
975デフォルトの名無しさん:2006/03/04(土) 00:22:41
>>973
だから「C#特有の部分が分からない」んじゃなくて「微分する関数」そのものが
分からんのでしょ?

「微分する関数」そのものがわかっていればあまり悩むこともないやろうし。
そのレベルならアルゴリズムスレ。んで、「〜するためにこうこうした(こういう
コードを書いた)んですが、よく分かりません」ってレベルになったらここ。
976デフォルトの名無しさん:2006/03/04(土) 00:26:33
安西先生ゲームが作りたいです・・・
977デフォルトの名無しさん:2006/03/04(土) 00:30:16
>>974

> っていうかつまり「代替機能」は「アプリケーションプログラマがやる」のが
> 基本スタンスなんす。

DirectXの環境依存対策の基本は代替手段の“選択”
普通ハード環境に合わせて最適なDirectXドライバを使うようにプログラム組む
もしくはユーザにドライバを選択するためのインタフェースを提供する
これらはDirectXが提供しているものを選択するだけで、機能を実装する必要は無い

特定のハードでしかサポートしていない機能“だけ”を使って組むことはDirectX開発の基本から外れてる
その場合は“特異”であるものとして別途明記すべきレベルの話になると思うが
極論を持ち出せばどうとでもいえるが、今は一般論で十分じゃないか?

ちなみに“代替機能の提供”となると、DirectXでできないならGDIで実装とかDirectPlayできないならSocketで実装とかそういうレベルでしょ
貴方的にはそこまで実装すべきで、自分は今までそうしているから書いたというのであれば、貴方の言葉足らず

・・・もうC#の話題じゃないなw
978945:2006/03/04(土) 00:32:56
>>975

> だから「C#特有の部分が分からない」んじゃなくて「微分する関数」そのものが
> 分からんのでしょ?

そうです、微分する関数をどう作るか分からないのです

> そのレベルならアルゴリズムスレ

すみません、他の言語は分からないので、最初からC#で組みたくてこちらに投げました
微分などの処理はアルゴリズムで書くのが一般的なのですか?
もしそうだとしたら移植しようにもアルゴリズムが分からないので難しいです orz
979デフォルトの名無しさん:2006/03/04(土) 00:47:11
980945:2006/03/04(土) 01:01:34
>>979
すみません、茶化さないで下さい
本当に困っています... orz

アルゴリズムというキーワードと微分というキーワードで検索してみました
非常に難しい話が多く、まったくチンプンカンプンです
もしかして大学レベルでやることなのでしょうか?
授業でやる微積とは全然違うのですね orz
981デフォルトの名無しさん:2006/03/04(土) 01:09:33
>>980
一体何がわからんのかがわからん。
式を微分する方法を聞きたいなら、スレ違い。まずそいつをどっか適切なスレで
解決しれ。
式が判っててプログラム化がわからないなら、こういう入力でこういう出力を
したいって書いてくれ。
正直、ここの連中は人の宿題を代ってやってやる義理などないんで。
982デフォルトの名無しさん:2006/03/04(土) 01:34:40
「アルゴリズムで書く」って。なんか勘違いしてる予感
983デフォルトの名無しさん:2006/03/04(土) 02:00:18
>>925
PictureBoxつかうより、Panelに直に描いたほうがだいぶ速いはず。
(再描画処理は自前でやることにはなる。)
PictureBoxは高速に書き換える用途には向かない。
984デフォルトの名無しさん:2006/03/04(土) 02:02:41
dfgdf
985デフォルトの名無しさん:2006/03/04(土) 02:13:21
>>982
多分最終的にプログラムそのものを書いてやんないとわかんないレベルだろ。
そんなん課題にならんがな。
986983:2006/03/04(土) 02:18:11
>>925
それから街の全景の読み込みにImage.FromFileを使ってないか?
こいつは必要に応じて画像をメモリから廃棄したりファイルから読み直したりするから、
頻繁にファイルの読み直しが発生してるかも知れないな。
987デフォルトの名無しさん:2006/03/04(土) 09:03:29
C#からMathmatica呼べばいいじゃん 微分・積分楽勝じゃん
988デフォルトの名無しさん:2006/03/04(土) 09:15:05
例えばDirectSoundが使えない環境(マシン)を挙げれば
東芝/Dynabook Satellite 4360
などはダメ
989デフォルトの名無しさん:2006/03/04(土) 10:43:07
配列の要素を削除するにはどうするのですか?
VB6にあるReDimのようなものはないのでしょうか?
990デフォルトの名無しさん:2006/03/04(土) 10:53:04
>>989
無いのでArrayList使った方が良い。
991デフォルトの名無しさん:2006/03/04(土) 11:05:35
>>989
VB6 の ReDim はよく知らないが、C#2.0 なら Array.Resize かな。
992デフォルトの名無しさん:2006/03/04(土) 11:21:49
ArrayList.Removeですね
>>990 ありがとうございます
993デフォルトの名無しさん:2006/03/04(土) 11:37:55
>>945
本屋さんに行って、おまいさんの理解できる本を探すか、
一番良いのは課題出した先生か同級生に相談することじゃないかな。
数学忘れたから微分判らんが、
どういうレベルの話をしてるのか、おまいさんの脳味噌がどんなぐあいか、
その人達が一番よく知ってるだろう。

994デフォルトの名無しさん:2006/03/04(土) 12:21:11
>>945
係数と累乗を文字列で入力させてごにょごにょすればいいよw
995デフォルトの名無しさん:2006/03/04(土) 12:31:06
ClickOnceで、プログラムを作成したマシンでは
発行、インストールはできるのだが
LAN上の他のPCにインストールしようてして
publich.htmのインストールボタンをクリックすると

***.applicationのライセンス認証に失敗しました。次の失敗メッセージが検出されました。
+h**p://******.aplicationのダウンロードに失敗しました。
+リモートサーバに接続できません。
+接続済みの呼び出し先が一定の時間を過ぎても正しく応答しなかったため、・・・

とエラーがでます。
XPにも2Kのマシンにも同じ表示がでます。

エロイ人、助けて!
996デフォルトの名無しさん:2006/03/04(土) 13:46:58
1000!
997デフォルトの名無しさん:2006/03/04(土) 13:47:50
1000!
998デフォルトの名無しさん:2006/03/04(土) 13:48:33
1ooo!
999デフォルトの名無しさん:2006/03/04(土) 13:55:59
1000なら明日君に
1000デフォルトの名無しさん:2006/03/04(土) 13:56:47
    ∩__∩
    (`・ω・´)  
   .ノ^ yヽ、  
   ヽ,,ノ==〆ノ   
    /  l |
"""~""""""~"""~"""~"
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。