母「おい、おまいら!!夕食ができますた。リビングに集合しる!」 父「詳細キボーヌ」 母「今日はカレーですが、何か?」 兄「カレーキターーーーーーーーー」 妹「キターーーーーーーーーー」 姉「カレーごときで騒ぐ奴は逝ってヨシ」 母「オマエモナー」 父 --------終了------- 兄 --------再開------- 妹「再開すなDQNが!それより肉うpキボンヌ」 母「ジャガイモうp」 姉「↑誤爆?」 兄「タマネギage」 父「ほらよ肉>家族」 妹「神降臨!!」 兄「タマネギage」 母「糞タマネギageんな!sageろ」 兄「タマネギage」 姉「タマネギage厨uzeeeeeeeeeeee!!」 母「ageって言ってればあがると思ってるヤシはDQN」 セールスマン「イタイ家族がいるのはこの家ですか?」 母「氏ね」 父「むしろゐ`」 兄「タマネギage」 妹「兄 、 必 死 だ な ( 藁 」
>>必 死 だ な ( 藁 だけ読んだ。
>>1 乙
なんかWikiがえらいことになってないか
使っている人を見たことがない。
使っている奴がいないから
VS2005でC#を使って開発してます WindowsアプリケーションでDataGirdViewを使っています DataSourceにDataTableを割り当ててデータを表示することはできました 表示されたセルのデータ毎に異なった編集用コントロールを割り当てたいです 一つの列で違う編集コントロールを使いたいのでColumnのColumnTypeの設定では実現できません セル単位で編集用コントロールを設定することはできないのでしょうか?
ボタン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
するのはtじゃなくてスレッド用の状態持ったオブジェクトだよな。 止めたいときはそのオブジェクトにとめやがれと通知。 スレッド実行メソッドは定期的にやめろといわれて無いか確認。言われてたら自身で終了。 Abortなんて下策。
WebBrowserで表示されている画像を取得するのってどうすればいい?
>>9 コードでできるけど?
DataGridViewCellCollection.Itemは読み書き両用プロパティだ。
>>13 URL取得するのが精一杯なような。
GetUrlCacheEntryInfo関数でキャッシュファイルを取得できるかもしれないけど。
15 :
13 :2006/02/03(金) 19:03:09
>>14 dクス!!
>URL取得するのが精一杯
う〜む二度手間みたいになってしまうのが残念
GetUrlCacheEntryInfo関数ってのは初めて見たので調べてみます、ありがとうございました
16 :
デフォルトの名無しさん :2006/02/03(金) 20:59:21
インスタンスは同じだから。包み紙が変わるだけ。 がそのサイトの説明は間違ってるな。 参照型でも型変換演算をオーバーロードすれば不可逆変換は起こりうる。
>>17 ありがとうございました。
感覚的にいうと、派生クラスで定義したメンバ変数などは、
キャストで切り捨てられるイメージだったんですが、
インスタンスが同じならなんでキャストするの?って考えまして、
「より汎用的にオブジェクトを使えるように」って思いついたんですが、
問題ないですか?
まあそうだな。 例えば「何でも入れられる」コレクションのためにArrayListがある。 Addの引数はobject型だが、もしobjectにキャストできないのならobject型で無い全てのオブジェクトが入れられなくなってしまう。
>>19 ちょうどArrayListクラスのコンストラクタを例に考えていたので、
納得できました。
ありがとうございました。
直接の質問で申し訳ないのですが、経験豊富な皆様のご意見をお聞かせ下さい。 会社で開発系オンラインコミュニティの利用を啓蒙し勤務時間中のアクセス許可を勝ち取ろうと思っています ※我が社はネット完全監視+アクセスできるサイトはデフォルト無しで部署単位に許可を得て追加してもらう形式 いくつかの開発系コミュニティがありますが、当初は1つだけと指定されているためどれを選ぶべきか悩んでいます。 目的はC♯を使用した.NET開発全般です ここも魅力的なのですが、残念ながら2ch.netドメインの許可は下りないので他を探しています。 いくつか調べたところ、@IT(他の技術や記事も期待できる)、GDNJ(歴史が長く検索ヒット率が高い)、VSUG(新興だけどMVP運営なので安心)、MSDNフォーラム(VS2005と連携)あたりが良いと思いました。 この中で最もクオリティの高い情報が集まりそうな場所はどこでしょうか? どれも魅力的で悩んでいますが、MVPの集まるVSUGか、シームレスなMSDNフォーラムに傾いています。 皆さんのご意見をお聞かせ下さい。
レベルにもよるけれど、GDNJのほうがレスポンスは早い気がします。見てる人が多いかんじ。 VSUGはそれと逆。 MSDNはてもとにあるとして GDNJ>VSUG>@IT>MSDNの順。 でも開発系でネット制限てあほな会社ですね。お察しします。
すげぇ会社だ。
開発系の会社とは言ってないじゃん
25 :
21 :2006/02/04(土) 02:37:01
>>22 参考になります。
会社は金融系で、私は社内システム開発部隊に所属しています。
情報系のサイト(MSDN Onlineなど)であれば比較的簡単に許可が下りるのですが、コミュニケーション系は非常に厳しいです。
過去に掲示板やblogで社内からマズい情報を発信した輩がいて情報管理部署がピリピリきています。
こういう状況下なのですが、やはり生の情報を得られるコミュニティサイトは我々開発の人間にはどうしても必要です。
そこで、いつも部署内で技術サポートやアーキテクトを担当する私と数人が中心となって啓蒙活動を行い、まずは部署内のコンセンサスを取ろうと思っています。
そのために「これは!」と思わせるようなコミュニティが必要なわけです。
これが単なる開発会社であればホントにアホな施策だと思います。
しかし我々の扱う情報が非常に面倒な(大事な)個人情報や資産情報であるため、そうは言えない部分もあります。
ちなみに一般のメッセンジャーは使用不可(社内用のメッセンジャーがある)で、社内メールも全て自動的に上司へコピーが渡るので私用メールはできません。
携帯電話やUSBメモリの持ち込みも厳しく、開発室の入口には専門の警備員(我々開発部隊の不正を監視するための…)がいたりします・・・
しかし個人的印象としてはどこにしても結局答えるメンバは大差ないからあんまかわんないんじゃね?
ところでさ、なんでスレタイが「C#」じゃなくて「C♯」なのさ。 Cも#も両方2バイト文字ならまだ分かるけど何故に#だけ2バイト文字なのか。 C#で検索してもスレが出てこないからスレ立たないほど人気ないのかと思ったよw これは直した方がいいよ。
C#でスレ立てようとした残骸がまだ残ってるぞ。Part29でスレ検索ってみ。
ん?ひょっとして1バイトでスレタイに「#」入れたらスレ立てられないの? いま調べてみたらどうやら2バイトでも「#」「♯」の二種類あって 前者の「#」の方だとC#としてでも検索出来るようだね。 まんどくせ〜仕様だなぁ…
ROMってろ言いたいだけちゃうんかと。
ContextMenuからContextMenuStripに移行するメリットって DataBindingができることと見栄えがよい程度でしょうか? RenderModeをSystemにしても微妙に挙動が鈍い、IDEで編集していると画面が よくバグるわで、ContextMenuのほうが個人的にはよかった。
>>26 んだな
漏れもGDNJやらVSUGやらで回答してる
ここの名無しさんにもMSMVPやらINETJやらの構成員が大量にいんだろ
はい、手を挙げて
34 :
yy :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 配列を受け取る変数); } } ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ この方法では正しくデータを受け取る事が出来ませんでした。 どうか御教授をお願いいたします。
>>34 はっきりいえばそんなエクスポート関数作るな。
というか、そんなエクスポート関数をもつdllがあったら文句をいったほうがいい
37 :
35 :2006/02/04(土) 12:29:00
冷静に考えてみるとこれだけじゃ分からんな ・そもそもそのエクスポート関数はメモリリークしてる。 ・必要な領域を確保するのは「呼び出す側」がするようにエクスポート関数は 実装すべき(というか一部例外を除きほとんどしなければならないレベル)。 説明すると長くなるんで説明しないが、メモリアローケーションはコンパイル 単位で異なるので不整合が発生するから。 だから修正としてはエクスポート関数を extern "C" __declspec(dllexport) void Foo(double* pBuf); C#を static extern void Foo(double[] buf); のようにする。
38 :
35 :2006/02/04(土) 12:35:49
追記。 C#の名誉のために言っとくが、元のエクスポート関数でも呼び出せない わけではないぞ。 public extern void Foo(ref IntPtr p); でポインタをとってきてMarshal.PtrToStructureあたりで戻せばいい。 まぁメモリリークしてるが。それはC#のせいじゃない。
39 :
yy :2006/02/04(土) 12:56:40
35さん、ご助言ありがとうございます。 残念ながら配列を受け取る変数を書き換えなければならないような状況です。
40 :
35 :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コードでも使え。その場合そのまま書けるだろ。
新スレおつかり
42 :
yy :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 ); のような感じで書けないのでしょうか?
>>42 まぁごにょごにょいったけど、それはつまり「そんな定義を持ったDLL関数はまずない」というわけで、
そもそもあなたが望んでいる機能(2段階以上のポインタマーシャリング)は必要性があまりないのね。
そのMarshalAs指定してダメなら難しい気がするけど。
あるいは struct Foo { double[] array; } みたいなのを通してref渡しだとどう?
44 :
yy :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]だけ正常な値が読み取れました。
C#でcsvファイルを読みたいのですが、 自分で字句解析をするしかないのでしょうか? csvファイルはカンマで要素が区切られていますが、要素を""で囲まれている場合 カンマを含むことができます。 例) foo,bar,hoge hoge,"h,gae",hbar
そんくらい自分で作れよ といいたいところだが C# csv でググレばいくらでも見つかる
質問です。 匿名デリゲートの内部からはそこから上のスコープの変数がすべて見えますよね。 これは、それらの変数をプログラム終了まで保存しているということなのでしょうか。 ということは、匿名デリゲートを使用する関数内ではローカル変数を使用しすぎない方が いいのでしょうか。
48 :
デフォルトの名無しさん :2006/02/04(土) 18:38:49
コントロールの生成に時間がかかるので 生成を別スレッドで行い、生成し終わったら 本スレッドに作成したコントロールを追加したいんですが (本スレッドはUIため、重くしたくない) 別スレッドで作成したコントロールを追加って不可能? invokeで追加すれば問題なし? この辺ことがさっぱりわかりません。 動的にformにコントロールを追加したいけど コントロール作成処理に時間かかるので裏で作ってから 追加したいんだが
49 :
デフォルトの名無しさん :2006/02/04(土) 18:42:12
csvなどの数値データを配列に読み込むプログラムの サンプルはありますか? 自分で作ったものでは配列の中に文字コードが入力されてしまい 正しく元データが認識されませんでした。
>>48 んーたぶんハンドルをTLSに突っ込んでるので、親子関係にしたときにどっかでおかしくなるんじゃないかな。
Let'sTry!
>>47 いんや、staticではない。
だからその匿名メソッドがGCの対象になったときに内部の変数も匿名メソッドからの参照がなくなる。
>>48 インスタンス作るだけなら基本的に問題ないよ。問題あるようにも作れるけど。
ハンドルを作るのがUIスレッドじゃないと駄目。
すいません。質問じゃないのですが、ちょっとお願いです<(_ _)> C#教えてくれる人いないでしょうか。 時給1000円払います。 電話とMSメッセンジャーでやりとりします。(ですのでどこに住んでいてもかまいません。 電話代もこちら払いです。) こっちが色々聞くので、それに答えてほしいです。 ゲームを作りたいので、描画関係の基本を分かってる方希望ですが、 私はC#始めて2週間くらいですので、そんなに高度な知識は必要ないです。 あと、多分時間中そんなに質問しないので、原則暇です。 テレビとか見ながらできる仕事なので楽かも知れません。 いい方なら、長く教えて欲しいです。 お金は始めたばかりの時は即日払いしますが、 長くおつきあい頂く場合は、まとめて週払いとかになっちゃうかもしれません。 何人か募集したいです。 とりあえず興味のある方はメール下さい<(_ _)> →ameri39@mail.じーおーおー.ne.jp
54 :
52 :2006/02/04(土) 21:10:22
>>53 煤i; ̄□ ̄
なぜ出会い系・・・
いぁ、そんなんじゃないですよ。
55 :
47 :2006/02/04(土) 21:24:03
>>51 なるほど。
しかしいずれにせよ、匿名デリゲートが有効の間はすべて保存されるということは変わりがないので
あまりローカル変数は多用しない方がいいんですね。
#使用する変数だけ保存するという仕様だったらよかったんですが。
>>55 断固違う。
すべてじゃない、使うものだけ参照を取ってあるんだ。ILDASMで見てみろよ。
そしてそれなら匿名じゃないデリゲートメソッドでも全く変わらん。
57 :
47 :2006/02/04(土) 21:43:00
あ、なるほど・・・ じゃあ安心して使っていいということですか。 どうもありがとうございました。
>>52 ∧∧
∧_∧ ( ゚д゚ ) .∧,,∧
( ゚д゚ ) ∧_∧O旦と) ミ ゚д゚ 彡
( つ旦 ( ゚д゚ ) O旦と ミ
と_/ ( つ旦 / (,,,(,,,,,,,う
|| ̄ ̄と__と_)  ̄||
Imageオブジェクトが有効かどうか(Disposeされてないかどうか)高速に調べる方法ってありますか?
61 :
59 :2006/02/04(土) 23:15:48
例えば「例外を発生させてキャッチ」のように無駄にコストのかかる処理をせずにすむ方法という意味です。
┌─────────────────────────┐
│△
>>52 Exceptionはハンドルされませんでした。 ×│
├─────────────────────────┤
│書き込みが厨じみています。 │
├─────────────────────────┤
│トラブルシューティングのヒント: │
│┌───────────────────────┐│
││普通はもう少し考えてから投稿します。 ││
││変な書き込みでないか確認してください。 ││
││この例外に対する一般的なヘルプを参照します。 ││
│└───────────────────────┘│
│ オンライン ヘルプで検索... │
├─────────────────────────┤
│アクション: │
│詳細の表示... │
│例外の詳細をクリップボードに追加 │
└─────────────────────────┘
>>59 そんなことをしなければならないプログラムの構造を見直す
いやマジで
>>52 時給1000円じゃ安すぎる
何でも教えれるレベルの人間は時間単価5000円でも安い
途中暇だろうが何だろうが時間拘束を求める以上は対価を支払う必要があるからね
ということで月140時間300万円契約で時給20000円強の私で良ければ、特別価格時給20000円ジャストでお受けしますが
勿論Managed DirectXまで懇切丁寧に指導しますよ
ううう・・・。 そんなにすごい人でなくてもいいので、1000円くらいでやってくれる人いないでしょうか…。
ギャラの入金の確認がとれないと到底ダメだ罠
>>66 おれおれ。おれやるよ。とりあえず前金500時間分振り込んでくれ
>>66 たったの1000円で1時間拘束されるなんてまっぴらだ
しかも質問に対して貴様が理解できるまで回答する義務があるんだろ?
そんな糞面倒な義務に対して1000円って人を馬鹿にしてんのか?
>>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のソースはいじりたくないです。
>>71 プロジェクト名\bin\Debugとか
プロジェクト名\bin\Releaseじゃなくて?
>>72 大体思い当たる場所に置いてみたんですが、
全部怒られるので、
プロジェクト名\
以下のディレクトリ全部に配置してみたんですがだめでした。
試しに、参照先であるBのDLLのディレクトリにも置いてみましたが。。
ってそもそもBのDLLの参照設定でローカルコピーがtrueなんで、
プロジェクト名\bin\Debug\BDLL
って感じになってます。
はぁ。。。。
夜遅くにすみません。
Environment.CurrentDirectoryしてみ。
>>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 単純に考えたら3がおかしいんだろう。
コンストラクタ前でブレークして変数の中身見た方がいいよ
3はいじれないみたいだけど。
>>77 あのぅ。
大変申し上げにくいのですが、
プロジェクトに追加したビットマップのプロパティで
ビルドアクションを埋め込まれたリソースにしたら、
いけちゃいました。
「埋め込まれたリソース」にするのが当たり前なんですかね。
無知なあまり、お手を煩わせてしまい、更にこんな結果に。
ほんとごめんなさい。
ゆっくりおやすみなさいませ。
ありがとうございましたっ。
Uriを格納するコレクションを探しています。 コレクションにとあるUriが存在するかどうかを高速に判断でき、 なおかつ挿入した順番にアクセスできるというコレクションなんですが これって自分で作るしかないでしょうか?
>>79 System.Collections.Generic.List<System.Uri>
81 :
59 :2006/02/05(日) 02:39:22
>>64 うーんそうですね・・・
もう少し考え直してみます
>>80 >List.Contains メソッド
>このメソッドは順次検索を実行します。したがって、このメソッドは、O(n) 操作です。
順次検索ってようするにfoeachするのと同じってことですかね・・・
>>82 そもそも、「順次アクセス可能」と「高速検索可能」は両立しないから。
一般的に言って、よほど大規模なデータにならん限り、
順次アクセスしたいデータは素直に配列(C#ならList)に格納するのが無難。
>>79 IComparerを実装して、Compareメソッドは常に同じ値を返す
これをSortedListかSortedDictionaryのコンストラクタに放り込む
いや適当に言ってみただけだからどうなるか分からんけど
>>79 アクセス用と判定用の二つのコレクション使うという手もあり。
>>82 private class UriList : List<Uri> {
private Dictionary<Uri, object> dictionary;
}
こんなん作ってAddとかContainsとかオーバーライド。
・・・まぁ継承なんかせんで普通に外に二つもてば?
幸いにしてUriはImmutableなオブジェクトだし。
結局のところ、「順次アクセス」と「値の検索」のどっちが
より頻繁に要求されるのかで、最適解は変わる。
両方とも重要なら、
>>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 しょうもない内部変数のスコープがクラスにまで広がってしまうのがやだなぁと。
んじゃ内部クラスを使え
>>91 オーバヘッドがいや。
とか言ってたらきりがないのでそうします。ありがとうございました。
93 :
デフォルトの名無しさん :2006/02/05(日) 15:29:18
ある変数の値が変更されたときにイベントを発生させ、 メソッドを実行するようなことはできますか? ここでいう変数には、ArrayListなどのオブジェクトも含みます。
オブジェクトの内容でなくて変数の値?
変数ねえ・・・ 変数の参照が変更されたときなら、フィールドの代わりにプロパティを使えばできるけどねえ
>>93 プロパティって知ってる?
手を入れられない既存コードの精査のために必要ならデバッガで十分だと思うけど。
>>33 漏れはMSMVPでもINTEAJ構成員でもない
GDNJやVSUGは肩書き無いと書き辛いし大御所が多いから気後れする
ここなら名無しで気軽に書けるから良い
>>92 すまんが内部クラスでいったいどう解決出来るのか教えてくれんかの?
OrderedDictionaryでも使えよ。
>>99 92じゃないが変数とメソッドをその内部クラスのメンバにして
外からその内部クラスのメソッドを呼び出せばいいんじゃねの。
ぐは、メソッドごとか…? それじゃプライベートフィールドのがましな気がする。
KeyValueCollectionBase派生を作ってもいい。
すまん、
>>102 だが、元のプログラムよく見てなかった。
内部クラスでいいわ。
俺は、 private static class FooLocal { public static int a; } private void Foo() { } とでもするのかと思った
賛否両論だろうけど、俺はそういった変数が必要なときは そのメソッドの直上で宣言してるよ。 そうすればそのメソッドとの結びつきが強調されるし。 ただし当然ちゃんとした名前はつける。
>>106 そこでパーシャルですよ。
で、パーシャルクラスの使い心地はどうよお前ら。
VSの吐くソースと完全に分離されるのはいいんだが、 実際のとこ、追加だけしか出来ないのでいまいちでもある。 デフォルトでGenerationGapパターンにしてくれんかな、とか。
あ、上のはVSでの活用の話ね。 自分のコード単体では使わん。
ぱーてぃあるのことか。とさっき気づいた。
そういえば、キーだけのコレクションというかディクショナリあったな。 オブジェクト自身の一部とかをキーと見なすやつ。 なんていうクラスだっけか…
リソースのアクセサ自動生成便利だなこりゃ。
>>113 うむ。
それに気付くのにだいぶかかったが。
自前でリソースマネージャ宣言してた
生のXmlファイルをデータとする簡単なデータベースアプリを作ってみた。 で、ODBCの設定もいらないしこりゃ楽でいいや、 生ならデータ再利用も簡単だし、と思ったんだけど、 実際のところどSystem.Xmlから生ファイルを読み書きする方法で どのくらいの規模までなら実用可能なんだろうか。 せいぜいmdbの大体程度?
正直なかなかきついと思うぞ。 何使ってるのか分からんが、使い勝手からいったらDOMだろ? となるとファイルの入出力がかなり厳しいような気ガス。 メモリ上だけならいいんだが… ※もっと高度にやってるに決まってるだろ!!だったらすまん。
ってか、DOMだったらDataSet使うほうがましか…
120 :
デフォルトの名無しさん :2006/02/05(日) 22:29:41
121 :
115 :2006/02/05(日) 22:29:48
いや、まぁ、そんな高度なことはやってないんだけどもさ。 DB内にあるXmlデータをちょこっとインデックス化してXPathで検索できるってだけだし。 例えばXmlDocument を XPathで操作する方法もメモリ上でならかなり高速で動くよね。 でも当然のことながらファイルのIOがボトルネックになると。 メモリ上にインデックスを生成してデータファイルをうまく分散すれば もっとましになるのかもしれないけど、 俺のトリ頭じゃその"うまく分散"の部分がエレガントに設計できんのさ。 DBのインターフェースからしか扱えないような分散方法では 再利用しやすい生ファイルのメリットがなくなっちまうし、 1ファイル内のデータ構造に"意味"を維持しようとすると どうしても1ファイルがでかくなって無駄な検索が増えるジレンマ。 あぁ、なんか何言ってのか分らなくなってきたぁ。
というか普通に組み込み型DB使えば? ああ、SQL Server2005 Expressだとローカルファイルならなんか動的にアタッチできるように なったんだっけか。あれMVPか誰かの提案だったと思うけど、いいね。
>>122 まぁそう言われれば、「その通り」でお終いなんだけどさ。
ちょっとXml DBに興味あっただけ。
結局生Xmlは設定ファイル〜小規模DBにしか使えんのかなぁ。
>>123 組み込みXML DBならBerkeley DB XMLとかあるよ。
とりあえずホットな話題ではある。RDB方面からのアプローチとか
ネイティブXMLDBとかごにょごにょしてもう分からん状態。
125 :
デフォルトの名無しさん :2006/02/06(月) 01:37:28
C#で作成したプラグインホストにVB.netで作成したプラグインを読み込ませることは可能ですか?
可能 つかまず試してみろよそんなもん
>>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の使い方で難儀している段階でして・・・
インターフェイスを継承したら
「クラスは、ほかのクラスからのみ継承できます。」
なんて変なエラーメッセージが出てきますし・・・
なので試す前に質問をした次第です
ToolStripButtonでボタンが押下されてるときとされてない時で 画像を自動的に切り替える事って可能?
>>129 なんかこの商売につきものだと思うんだが・・・
何かのやり方とか、本質的でない部分を調べるのに時間がかかるのがだんだんやになってきた。なんかすごい無駄な知識覚えるのに時間無駄にしてるのかなぁと。
Image.FromFile で作成したイメージと Image.FromStream で作成したイメージは 何か違いがあるんでしょうか。 前者は ImageAnimator でアニメーションできるんですが、後者は失敗します。 前者はファイルをロックしてしまうので後者を使いたいのですが。
133 :
128 :2006/02/06(月) 09:47:26
ShowModalじゃなくてShowDialogでごじゃった。ほほほほ。
134 :
128 :2006/02/06(月) 10:15:42
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がマッチしません。 正しい正規表現を教えてください
>>130 自動的っつーのが意味分からんが
MouseDownとMouseUpでやれば可能
>>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();
}
Closingイベントをとらえられません。 ウィザードを使って作成したデフォルトのwinowsアプリケーションに private void Form1_Closing(object sender, CancelEventArgs e) { MessageBox.Show("さようなら"); } を追加したのですが、終了時にメッセージボックスがでません。
139 :
138 :2006/02/06(月) 15:50:14
自己解決しました InitializeComponent()メソッド内に this.Closing += new CancelEventHandler(Form1_Closing); を記述して解決でした。
VBユーザか?
なにやってるんだか・・・
>>138 は追加したんじゃなく追記しただけじゃないの?
PanelにRichTextBoxが乗っかったコントロール、CustomControlを作りたい Panelを継承したクラスCustomControlがRichTextBoxを保持する形や、 Controlから派生したCustomControlがPanelとRichTextBoxを持つ形が思い浮かんだが しかし、コントロールの主体はRichTextBoxにしたい、 要はRichTextBox固有のプロパティ等を、CustomControlのそれとして定義し直すのは面倒 かといって、customControl.richTextBox.(ry とするのは何か違うような気がするという事 RichTextBox派生がPanelを持つ形が良いが、 panel.Controls.Add(this); ではうまくいきません なにか良い方法は無いでしょうか?
144 :
138 :2006/02/06(月) 18:31:12
どこが悪かったでしょうか?
145 :
デフォルトの名無しさん :2006/02/06(月) 18:36:58
流れ無視過ぎてすみません。 ArrayListをそっくりそのままDataSetとして扱う事はできますか?
意味が分からん
うほっ
ArrayListの中身が、以下のようになってます。 ArrayList al = new ArrayList(); string[] str; //------------------- for ~~~~ { al.add(str); } みたいな感じでちょうどテーブルのカラムとレコードみたいになってます。 これをフォームの各項目にバインドするのに、 一度datasetにしてみたいなぁと思い、 alをDataSetに代入(?)みたいな方法はないかなぁと。 とりあえず死んできます。
>>148 あ、入れ違いですんません。
ありがとうございました。
逝ってきます。
151 :
デフォルトの名無しさん :2006/02/06(月) 20:03:23
同じクラスで複数のインターフェイスを実装したいとします。 もしそれらの中に同じ名前のメソッド(例えば Start() とか)が存在していた場合、 競合してしまってうまくインターフェイスを実装できませんよね? このような時、どのようにすれば良いのでしょうか? (一方のメソッド名を実装段階で変更できれば手っ取り早いのですが・・・)
インターフェースの明示的実装
153 :
デフォルトの名無しさん :2006/02/06(月) 20:34:39
>>152 ありがとうございます。
さっそく調べてみます。
154 :
デフォルトの名無しさん :2006/02/06(月) 21:25:45
VBの Public Sub Quit() Implements Hoge.Exit みたいなことはC#ではできないの?
別名定義よりも明示的実装の方が優れてる、とヘジたんは考えたんだろ
156 :
49 :2006/02/06(月) 21:35:02
皆さん華麗にスルーされますね。あきらめませんよ。 csvなどの数値データを配列に読み込むプログラムの サンプルはありますか? 自分で作ったものでは配列の中に文字コードが入力されてしまい 正しく元データが認識されませんでした。
>文字コードが入力されてしまい お前はcsvじゃなくて普通のテキストファイルも読めないんだろ
そんなんでわかるかよw 認識されないっていうソースさらせや。 そもそも配列って何の型の配列やねん。 数値データの形式もどないやねん。 エンコーディングはどないやねん。
>>156 サンプル待ってる間に作ったほうが早いんじゃね?
>>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で宣言しています。 以前ファイル読み取りのサンプルソースが本にあったので それを利用して作ろうとしたのですが、型に関する知識が 十分でないためうまくいきませんでした。
なにやってるんだかさっぱりわからん。
とりあえず回答しておこう。
>>161 それは、テキストファイルから文字コードを読み取って配列に代入するコード。
つまりプログラムしたとおりの動作は行われてるよ。安心汁。
「CVSファイルを読み取る」ってを考えてみて思ったんだけど、 多次元のListみたいなのってないよね
>>165 List<List<List<int>>> ……で上手くいかなかったっけ?
ん? なんか俺間違えた予感 orz
StreamReader作って。 入力した文字をintで。ほぅ。 そのintをintに変換ってなんじゃ。 それをfloatで受け取るんかい。 何したいのやw
Dictionary<TKey, TValue>のキーのみのバージョン(STLでいうhash_map)が欲しいなあ dictionary.add(key, null); って感じでいつもnull入れてるけどなんかなあ。
>>161 マジレスするとStreamReaderにはCSVを扱う機能はない。
172 :
49 :2006/02/06(月) 22:01:55
どう見ても勉強不足です。 もう少し勉強し直してから出直したいと思います。 本当にありがとうございました。
とりあえず型を意識すれ。
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++]); } } } 適当に作っといた。
175 :
49 :2006/02/06(月) 22:21:42
>>174 さん
わざわざありがとうございます。
ご助言を無駄にせぬよう努力させていただきます
176 :
デフォルトの名無しさん :2006/02/06(月) 22:43:18
C#はWin32APIを直接いじれるらしいですが、それは.NETを使うよりパフォーマンスがよいでしょうか? ようはC#で作るクライアントアプリの可能性が知りたいのです。 想定しているのは.NET非対応のVBです。 C++ではありません。 C#で作るクライアントアプリが.NET非対応VBで作ったクライアントアプリ並のパフォーマンスがあるのかどうか知りたいのです。
何のパフォーマンスだよ
>>170 ObjectModelだったかにそれっぽいのがあるが、
自分で継承して作る必要があったような…
STL.NETってもう公開されてたっけ?
180 :
170 :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;}
}
これはもしかしたらすげえ便利???
>>176 パフォーマンスって一言で言っても、開発パフォーマンス、応答速度的なパフォーマンス、メモリを効率的に使うパフォーマンス、各種ハードリソースを上手く使うパフォーマンス・・・などなど。
可能性がどうのってのも意味不明。何が作れるかって話?
.NET非対応VBとかも意味不明。ランタイムとかFrameworkと言語は別もん。
まずは貴様の脳内を整理して、一般的な言葉に直せ。
182 :
デフォルトの名無しさん :2006/02/07(火) 00:04:15
Javaでクライアントアプリを作るとメモリをたくさん使うしスピードが遅いです。 C#の場合はどうですかという話ですよ。 そしてVB6と比べてどうですかということですよ。
183 :
デフォルトの名無しさん :2006/02/07(火) 00:05:16
クライアントアプリの話ですよ。 JavaはVB6のかわりになりません。 C#はどうですか?
百聞は一見に如かず
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では、ちゃんと動作しました。
>>181 それぐらいの差異を脳内変換できないようじゃ誰とも話できんよ?
string baseURL = "
http://example.jp/example.xml ";
DataSet myDataSet = new DataSet();
myDataSet.ReadXml(baseURL);
のようにやれば http で xml をデータセットに展開する事ができますが、
この HTTP の通信を proxy 経由で行なう方法がわかりません。
明示的に proxy を通過させるにはどのようなメソッドを使えばよい
でしょうか?
アドバイスよろしくお願いします。
>>185 COMに公開するクラスにComVisible属性をtrueで指定する。
AssemblyInfo.csでアセンブリ全体としてはComVisible(false)にしてるから。
Visual Studio 2005 Express Editionでへローワールドやってみた デバッグでコンソールが勝手に閉じるんだけど 開きっぱなしにするにはどうすれば良いのですか?w
191 :
デフォルトの名無しさん :2006/02/07(火) 00:51:15
>>188 さん
うまくいきました!
マジ ありがとうございます。
>>187 HttpWebRequest使ってアクセスして、レスポンスのストリーム使えば良いんじゃね
194 :
120 :2006/02/07(火) 01:35:57
195 :
デフォルトの名無しさん :2006/02/07(火) 02:12:19
誰か助けてくれ。 俺はC#の真ん中に入り込んで身動きが取れないのだ。
すまんが俺にはそこに辿り着けそうも無い。 ビーコンは無いのか?
>>195 private void 終了XToolStripMenuItem_Click(object sender, EventArgs e)
{
Close();
}
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);タイプのコンストラクタを用いて作っています どこかおかしい点や改善点などありましたら教えてください よろしくお願いします
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 ); だそうで、無理でした。 厨ですんません。暇な人教えてください。
ownerつってんじゃん
>>203 ありがとうございます。
いや、すんませんでした。
>>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で調べたりしましたが、それらしい情報が無くて困ってます。
プレビュ版の制限なんでしょうか。
よろしくお願いします。
209 :
デフォルトの名無しさん :2006/02/07(火) 16:38:23
>>207 ありゃりゃ、すんません。
製品版買います。なんかスッキリした。
210 :
デフォルトの名無しさん :2006/02/07(火) 16:53:02
hogeというプロジェクトからhoge.exe.config以外の構成ファイルを 読み込みたいのですが、これは可能ですか? 構成ファイルで、<appSettings file="huga.config">を指定、というのも 使わずに読み込む方法があったら教えて下さい。
>>208 要は気にすんなってことだ。
>>210 それはもう構成ファイルである必要が無いような気がするのだが。
XmlSerializerでシリアライズじゃ駄目なの?
212 :
210 :2006/02/07(火) 17:33:33
>>211 ご返答ありがとうございます。おっしゃるとおりですorz
ConfigurationManagerとかであっさり出来るだろうと思い込み、
調べてみてビックリな感じですた。
213 :
デフォルトの名無しさん :2006/02/07(火) 17:33:46
>>211 そうですか…わかりました
結構メモリくってしまうんで、どうにかしたかったんですけどね
基本的にはメモリ使用量は上昇していくのですが、ごくたまに使用量が減っているのを確認しました
たまになんで、ほとんど意味がありません><
form1が親でインスタンス変数に子フォーム form2を持っています。 form2はform1のインストラクタ内で form2 = new Form2(); で割り当てています。 form1のボタン1が押されたらform2を表示したいのです。 そこで private void button1_Click(object sender, System.EventArgs e) { form2.Show(); } と書きました。 ところが、ボタンを一度押してからフォームを閉じ、再び押すと "Form2" という名前の、破棄されたオブジェクトにアクセスできません。 という例外が発生します。 これは、フォームが閉じられる際form2に割り当てられていたForm2()のインスタンスが が破棄されたということでいいのでしょうか? そうならば、解決法がしりたいのですが、ご教授願います。
>>214 Form2のClosingイベントを拾って
ウィンドウを閉じるのをキャンセルして
代わりにHide()してウィンドウを隠す。
あるいはボタンが押されるたびにnewする。
>>215 何つーかその症状見てDisposeとかにブレークしかけてコールスタック見るぐらいするのが基本だろ。
>>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に対してどのようにアクセスすればよいですか? よろしくおねがいします。
キャストすれ
Debug.WriteLine(((DataRow)al[3]).ItemArray[1]);
>>219 >>220 どしよどしよ。。
うれしすぎてリアクションとれない。
ありがとうございました。
222 :
120 :2006/02/07(火) 19:47:27
>>198 できましたああああ!
ありがとう御座います.そのページの方もありがとうございます!!!
>>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; } }
>>224 Form2のf1.Label1 = textBox1.Text;の下にf1.Show();って入れてみれば分かるよ
解決しちゃったぁ 解決しちゃった
227 :
224 :2006/02/07(火) 21:19:30
>>225 解決しました。
ありがとうございます。
もう1つ質問が・・・
できれば、最初に開いているForm1に
文字がでるとうれしいのですが、その
ようなことは可能でしょうか?
>>227 余裕で可能
元の Form1 の参照を渡しとけ
newして設定して出来ないってやたら見るんだが これはオブジェクトとかの概念が理解できてないからなのか?
インスタンスの概念、と言うべきだな そういう人たちのためのふらっとC♯スレなんだがあんまり利用されんのう
オブジェクト指向というよりも、 .NET Frameworkの扱いに慣れてないだけだと思うが
233 :
デフォルトの名無しさん :2006/02/07(火) 23:33:40
C# って処理速度はともかくとして起動速度が異常に遅いですよね? アレを少しでも速くする方法ってありませんかね?
Java Web Sta^C
235 :
224 :2006/02/07(火) 23:43:45
>>228 元のForm1を参照の渡し方ですが・・・
Form1 f1 = new Form1();
f1.Label1 = textBox1.Text;
で渡してるつもりだったりします。。。
参照の渡し方を教えていただけない
でしょうか。。。
> Form1 f1 = new Form1(); > f1.Label1 = textBox1.Text; > で渡してるつもりだったりします。。。 渡してるのは、textBox1のTextプロパティの内容である文字列の参照だ。 Textプロパティを一種の「箱」とみなすと、箱の中身を触らせただけだ。 箱そのものには触れないから、箱に別のものを入れることもできない。
つーかForm2でForm1をnewしていいのか? Form1が2つできるぞ。 参照渡すなら Form2のコンストラクタで受け取れ 例: private Form f1; public Form2(Form form){ f1 = form; } Form1でForm2をnewするときに Form2 f2 = new Form2(this);
32bitのBitmapを作り Save("*.jpg")でjpgとして保存すると透過が含まれた画像が作成されちゃうんですけど どうにか24bitで保存する方法はないものでしょうか?
>>237 だがずまん、読み違いだ。
ていうかその前の
>>229 書いたのも俺だってのに
何を錯乱してんだ、俺はorz
241 :
デフォルトの名無しさん :2006/02/08(水) 01:25:21
>>C# って処理速度はともかくとして起動速度が異常に遅いですよね? アレを少しでも速くする方法ってありませんかね? Win32APIを使ってチューニングすれば速くなります。しかしそれならば最初からC++を使えばよいということになってしまうのです。
つngen
何度も実行してるとネイティブのexeをどこかに格納するらしいから早くなる。
一旦.NET製の別ソフトを起動(終了してもいい)だな。
>>239 え? Jpegは透過をサポートしてないから自動的に24bppになるはずだけど?
実際試した限り24bppRgbだし。
247 :
132 :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) としたときと速度がほぼ同じになり、
本末転倒の結果になってしまいます。
このことについてもわかる方がいたらお願いします。
> Image の有効期間の間は、このストリームを開いておく必要があります。 これだろ。 FromStream使ったからってStream閉じていいわけじゃないぞ。
249 :
132 :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で調べたところ他のオーバーロードは単にこのオーバーロードを呼び出しているだけのようなので、
これは単にミスということなんでしょうか。
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変換するツールはライセンスの額も
けっこうなお値段で、うちのような会社では
ちょっと躊躇してしまい、
251 :
251 :2006/02/08(水) 07:08:27
(承前) 一般的にはどうしているのか気になりまして。 ご教授いただければと思います。
「 ̄ `ヽ、 ______ 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| \ ソ
>>249 一度ファイルからバイト配列に読み込んでMemoryStreamにする。
または
Bitmapを新規に作成。
Image.FromFileで作ったImageをつかってBitmapにDrawImage。
Imageを破棄。
>>246 さん回答ありがとうございます
>>239 です
自己解決したのですが
//bはBitmap;
b.Save("test1.jpg",ImageFormat.Jpeg); //こっちは透過なし
b.Save("test2.jpg"); //こっちは透過あり
この引数の違いで作成されるjpgが違ったようです
>>250 標準機能で無い以上は一般的なやり方なんてない。
標準機能で無い以上は「単純に」なんて言えるやり方はない
標準機能で無い以上は金か時間を費やして実現するしかない。
>>256 それ拡張子がjpgなだけで実際はpngだから。
ヘルプより イメージのファイル形式に対応するエンコーダが存在しない場合は、PNG (Portable Network Graphics) エンコーダが使用されます。
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)); しかしうまく動作しません。 どうすれば良いか教えてください。。。
>>261 IntPtrではなくshort型のSendMessageも宣言する。
それで合ってるはずだが。他のところで間違えてないか? あとうまく動作しないってのは意味不明なのでどううまく動かないのかを書け。 ちなみに忘れがちだがSendMessageは返値もIntPtrだ。影響はないだろうが。
264 :
261 :2006/02/08(水) 16:29:30
>>262 その方法でできました!ありがとうございます!
VB6の時代と一緒なんですね。でもオーバーライドがある分で同じ関数名でできるのは楽ですね。
>>263 説明不足ですみません。
メッセージの動作はC++版で確認していたので、それと同じ結果を得られないことを「上手く動作しません」と曖昧に表現してしまいました。
戻り値も関係したので影響ありまくりでした orz
VS2005のRichTextBoxを使っているのですが、コントロールのFontプロパティでフォントをMSゴシックにしても、半角英数が入力されるとClearTypeの効く他のフォントで表示されてしまいます。 プロポーショナルフォントで表示されたWebページのテキストをコピペしてもMSゴシックで半角英数が表示されるのですが、直接入力だとダメです。 これってRichTextBoxのバグなのでしょうか・・・ ぐぐっても同じような問題が見つからないので、私の環境かな・・・
>>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呼び出しが終わった後に自動的に呼び出す方法ってあるのでしょうか?
それがあれば上手くできそうですが。。。
>>268 これはスタイルに関する問題だから、ハンドルが再作成されるとリセットされる。
なのでHandleCreated辺りでやれば多分うまくいくはず。
>>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);
}
}
オブジェクトのコピーを作りたいんだが、どうしたらいいんでしょうか?
なんのオブジェクトさ。 コピーってどういうコピーさ。
自分で作ったクラスのインスタンスのコピーです。 new してクラス変数の値を書き換えた後、 実体のコピーを取って、片方だけまた書き換える。 説明不足ですみません。
ちなみにいうとクラス変数ってのはstaticが付いてるフィールドのことなんだが
すみません。メンバー変数です。
>>277 Object.MemberwiseClone()あたりとか。
説明をよく読んで参照型のフィールドをコピーするときは気をつけろよ。
自分でCloneメソッドをそのクラスに定義すりゃいいじゃない
>>277 ,279
ありがとうございます。
Cloneメソッドについて調べてみます。
ちなみにメンバー変数というのはstaticもそうじゃないのも含むんだが。
インスタンスフィールドだったっけ?
284 :
132 :2006/02/09(木) 00:37:04
>>255 レスどうもです。
ざっと試してみたんですが、MemoryStreamに読み込む方法だと
普通に Image.FromStream(stream, true, false) で読み込んだ場合とほとんど変わらないパフォーマンスで
実現できました。
この方法でいきたいと思います。
どうもありがとうございました。
あと、ImageAnimator についてもこの方法にしたらうまく動くようになりました。
#何故かぎくしゃくしてはいますが・・・
お前らは何でそんなに親切なのですか?
やることがないから
バイトASCIIからバイトUTFに変換するプログラムを作ってるのですが 今は、Encodingクラスを使って バイトASCIIから一旦、文字列UTFにしてバイトUTFに変換してます 直接バイトASCIIからバイトUTFに変換ってできますか?
Encoding.Convert 結局やることは変わらんが
>>288 レスありがとうございます。Convertでやってみます。
初めてチームで.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 全員がスペシャリストならそれでも構いませんが、そこまで信用できる人々ではないです
今後の拡張で人員追加の可能性もあるので、技術は絞っておきたいという理由もあります
私を含めた技術リード3人はC#2.0とVB8の両方で開発経験がありますが、プログラム技術ばかりを担当するわけではないので脳内整理のためにも単一にしておきたいわけです
C#2.0の優れたところ……VBユーザーを苦しませることができる VB8の優れたところ……VBユーザーをもっと苦しませることができる
いい加減な数字だけどC#やVB.NETを勉強するのにかかる労力は IDEの使い方3割、クラスライブラリの理解5割、文法2割くらいで VB6の経験が生かせるのは文法の半分以下。 それをアドバンテージと考えるかどうかだね。 いっそUI周りは古参の人たちにVB6風に作ってもらって、 中間層をC#でもVB.NETでもいいけど.NETらしいつくりにするのがお勧めかな。
VB6と8って中途半端に似てるから余計戸惑いそう
オブジェクト指向が分かればどちらも書ける。 オブジェクト指向が分からなければどちらも書けない。 VB6しかやってない奴は・・
VB8とC#はどちらも使えるけど、先に覚えたほうが母国語みたいになる。 C#を先に覚えたので、VB8で書くときは脳内でC#->VBの翻訳をしながらコーディングしていたりする。 知り合いに話したらそいつはその逆だそうだ。
オブジェクト指向って言葉が出てきたので、聞きたいんだけど Visual C#でポトペタでプログラミングしてると オブジェクト指向的なプログラミングって無理じゃないですか? デザイナーが生成したコードはいじれないので、無理が生じるというか。 特に描画関係でFormのソースがやたらと長くなってしまうし 皆さんどんな感じでオブジェクト指向のプログラミングしてます?
>>297 Java、C#、C++、VBを使って開発してるけど、それぞれ脳内翻訳なんてしない
それぞれ使うときに合わせて切り替わる感じ
だからC#やってるときにJavaの事聞かれると直ぐに答えられない
例えば英語話すときも日本語から翻訳しないでしょ?
英語話すときは英語で考えない?
VB(7以降)はC#からの翻訳だな。文法以外同じだもん。 C#とC++は切り替わるなぁ。
>>299 英語のときはyahooかエキサイトの翻訳を使ってるよw
>>300 j#でjava.*を使うときはネイティブjavaで思考しますが、
System.*を使い出すととたんにC#からの翻訳モードにかわってしまいます。
>>297 自分も脳内変換などしないが、最近はめんどくさいのでVBでは最低限の文法しかおぼえんし使わん。
MSシンパで.NET万世な俺も、J#、それはいいよ〜状態だ。
C#のコードの断片をMSILに変換するツールってある?
つcsc.exe
>>298 コアになるDLLを作って
データベースアクセスDLLを作って
それらの制御用DLLを作って
最後にGUIを作る。
>>298 .NETではそのボトペタを可能にしてるのがオブジェクトとコンポーネント
バッチファイルかなにかでngenのパスを検出するにはどうしたらよいですか?
環境変数のPATHにngenのディレクトリを設定するとかって話じゃなくて?
他人の環境や.NET Frameworkのバージョンが違う環境で、汎用的にngenを実行する方法が知りたいのです。 PATHが通っていれば話は早かったんですが、そうでないみたいなので。
↓でいけるかねえ。バージョンは何パターンか試すわけにはいかないの? %windir%\Microsoft.NET\Framework\(バージョン)\
自分の.NETアプリかインストーラ実行してmscorlib.dllか何かののフォルダパス取得するとか。
>>314-315 レスありがとうございます。
RuntimeEnvironment.GetRuntimeDirectory()でパスが取得できるようですので、これを使おうと思います。
317 :
デフォルトの名無しさん :2006/02/10(金) 09:01:24
staticメソッドってどんな時に定義します? 今いち使いどころがわからないです。 newしなくていいから楽って事ですか?
>>317 その型のインスタンスを引数に受け取ってなんかするメソッドとか。
DataGridViewColumn.DefaultCellStyle.Formatに設定する書式で悩んでいます System.Int32型の列があり、それをプレフィックスとして "0x" を付与した16進数8桁で表示したいのです 例えば 10000であれば "0x00002710" です Formatに "X08" と設定すれば数値部分は表示できますが、当然 "0x" は付与されません stringのFormatのように "0x{0:X08}" としてもダメでした もしできる方法があれば教えてください
インスタンス以外のコンテキストに結び付いた情報にアクセスする場合とか。 その場合もインスタンスにする事もあるが。
>>317 そういうときは.NET Frameworkの実装を参考にすると良い
どういうメソッドがstaticなのかを見れば思想が見えてくる
>>321 なんてのは、Currentなんてプロパティになってることが多いが
324 :
317 :2006/02/10(金) 10:10:53
みんなありがとうございます。 結局クラスライブラリを参考にするって事は、 自分の脳内だけでの解釈になりそうです。 暇でしたら具体的にお願いします。
>>324 他人の脳内解釈を聞きたいって事?
staticの絶対的な指針が無い以上は十人十色
経験で自分なりの使い方を会得(脳内解釈)するか、一緒に開発する人々とルールを作るかのどっちかしかない
それを理解した上で他人の脳内解釈を聞きたいって事?
>>317 MSDNの関連ドキュメントは熟読したのかよ
staticと関連するそれ以外のドキュメントも一通り
それらを読まないで聞いても基礎が無いから理解できない
少なくとも「newしなくても良いから楽?」とかって聞いてるようじゃ話にならん
>>319 Format プロパティでは無理だと思う
DataGridView.CellFormatting イベントハンドラで e.Value を string.Format でフォーマットすればOK
>>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); で書き出すと、値が入っていないフィールドを書き込んでくれないのですが、 コレをちゃんと書かせるにはどうしたらよいでしょうか?
>>329 WriteXmlのときスキーマも書き込んどけ
331 :
デフォルトの名無しさん :2006/02/10(金) 15:15:13
C#で無線LANの電波状態(強度やID)って取得できますか?
>>332 につけたしです
OSは基本的にXPで動かすことを考えています
>>332 .NET 2.0のSystem.Net.NetworkInformation.NetworkInterfaceが近いのかな。
あとはWMIかWin32APIレベルでできるなら可能だが、どうするかは知らん。
その聞き方から察するに、取得方法の見当も付いてないんだろうな。 不可能ではないけど、C#でやるようなもんじゃない。
はいまったく検討がついていませんでした .NET2.0ですか…LANの件抜きにして1.1からバージョンアップしたほうがいいですかね?
2.0は俺もどうすべきか迷ってるのだが ところでVS2003で.NET2.0って使える? その辺りの設定やったことないからわからんorz
無理だよ。 それぞれのVSで使える.NETバージョンは固定。
.Net2.0が出たのに、わざわざ.Net1.1を使いつづける理由が無いだろ。
いろいろあるのさ ・・客先に1.1で動作するソフト配ってしまっているとかな。
>>336 やっぱそんな感じか。
NDISとか言うので、ある程度NICの情報を得る事は出来るみたいだ。
ただ、資料も少ないし、結構面倒だと思う。
.NETについては何か問題を抱えてるわけでもない限り、2.0に移行したほうがいい。
どうせすぐ3.0が出るんだ…。
>>342 ありがとうございます
C#でやるのはとりあえずやめておきます
>>338 それぞれのVSで使える.NETのバージョンは固定なんですか…
初めて知りました
じゃあ2.0使うにはVS2005買うしかないってことですねorz
ListView のアイテムを選択したときに ListViewItemCollection に履歴として保存したいのですが 新しく作った ListViewItemCollection に追加するとき ListView.SelectedItems[0].Clone() で新しく ListViewItem を 作って追加しているのですが、 なぜかもとの ListView にもコピーが追加されていました。 これを防ぐ方法はないでしょうか?
>>346 ListViewItemCollectionがそういうクラスだから。(同じListViewに対してリストを共有する)
ArrayListかList<ListViewItem>にでもつっこんどけ。
>>345 Framework SDK + Eclipseかメモ量
いやVS2005Expressでいいじゃねーか
>>342 MDC06では、C#3.0はCLR2.0上で動くMSIL吐くようにするって言ってたよ。
なのでしばらくは2.0で行くんじゃないかな。
なんであんなにMSNDは見づらいんですか・・・ 使用例は何十行にもなってるし・・・ 1〜3行で簡素な使用例にしてくれ・・・ ヘルプにはGoogle搭載して欲しい・・・ MSDNの無駄に広大な情報に溺れそうです・・・
まあ馬鹿には無理だから
3行で済むようなものなら使用例なんていらんだろw
>>350 おお、勘違いしてた。ありがとう。
C# 3.0の仕様ももう決まってるし、Vistaが出る頃にヒョイっと出されるのかと思ってた…。
1.0に対する1.1になるような気もするがね Orcasもあるんだし // WinFX対応版はOrcasの次になるのか?
>>347 そうなんですか。List<ListViewItem>に入れることにします。
ありがとうございました。
すまぬ事をお聞きしますが、NET2.0ってNET1.1よりも(いろんな意味で) 速いですか?もしそうなら、乗り換える予定なんですが。
まず日本語を勉強しろ。 あと色んな意味で速いかどうかと言われても答えようがない。
大して違いないんじゃない?
長文読めない病が発病したら終りだぞ MSのセキュリティアップデート情報なんかも明らかに愚民対策
そのうちローカライズされているだけでもマシだと思えるようになる。
.NET FrameworkのリファレンスがほとんどローカライズされているってのにMSの恐ろしさを感じた
機械翻訳じゃね
>>365 KB見てこい。
機械翻訳と断り書きがあるドキュメントが見られるから。
>KB そんな雑誌あるの?
Microsoftの最大のアドバンテージだよな、ドキュメント作成力。ほかじゃ真似できん。
あと
>>367 は開発には向いてないと思う。
>>365 あんな精度で機械翻訳できるソフトがあったらバカ売れだろうな
「機械翻訳されたものです」って書いてあるページもあるよ。 人の手で直してあるのに比べるともちろん読みにくいけど、 それなりに読めないこともない。
ローカライズ版はたまに情報が古いがな。
情報が古いならまだ良いがときどき誤訳があるのが何とも。.NETのでは今のところ見たことないが。 Win32APIの関数でnotの適用範囲を間違ってて正反対の結論になってたことが。
誤訳もしくは不適切な訳はそれなりに有るぞ。 とはいえ、まあこれだけ網羅されてるのは有りがたい。
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
>>375 インスコってなに?
プログラム言語以前に日本語勉強し直せ
>>375 MSDNに立派な資料がいっぱいあるからそれ見てから出直せ。
>>376 きみ、通知表に「周囲から孤立している」とか書かれてたでしょ
379 :
375 :2006/02/11(土) 20:40:05
C#2.0でbyte配列のコピーをしたくて下記のコードを組んでいます //変数sourceのバイトデータを変数copyにコピーする copy = new byte[source.Length]; source.CopyTo(copy, 0); 一発で領域の確保とコピーができる方法とかご存知ですか? 今は自作の関数で対応していますが、ありそうな気がするものの見つけられていません
Clone
byte配列でもう一つだけ教えてください byte配列の一部を切り出して別のbyte配列にしたいのですが、System.Array.Copy以外に方法は無いでしょうか 今はこうしています //変数sourceに切り出し元のバイトデータが入っている byte[] NewBytes = new byte[10]; System.Array.Copy(source, 5, NewBytes, 0, 10); これもまた自作関数で対応していますが、Cloneのように簡単な方法があれば知りたいです。。。
List<byte>でもつかっとけ
手間は変わらないがBuffer.BlockCopy()
>>385 それだとオーバーヘッドが心配でちょっと
#場合によっては1MB超のバイトデータも扱うのです
>>386 同じような感じになっちゃうんですね
でもSystem.Bufferは知りませんでした orz
これはこれで別の目的に使えるので知る事ができて嬉しいです!
下手糞が Array を使うくらいなら List<T> の方がマシなこともあるぞ
キャスト間違いなんて一通り試験すれば見つかるっしょ。
ListViewでContextMenuStripを使いたいんですが、ListViewのContextMenuStripプロパティを設定するやり方だと 当然、ListViewのどこで右クリックしてもContextMenuStripが表示されます。 なにかを選択した状態じゃないとContextMenuを表示したくないんですがこの場合は ListViewのマウスのクリック関係のイベントを使ってContextMenuStripのShowメソッドを呼んだりするしかないですか?
Openingイベントでキャンセルすれば?
>>391 俺が答えようと思ったのに。
この無駄になったプロジェクトどうしてくれる!
破棄
再利用
C#からAccess(mdb)のテーブル名を変更することはできませんか? cmd = new System.Data.OleDb.OleDbCommand("alter table 既存テーブル rename to 新テーブル",コネクション); cmd.ExecuteNonQuery(); このクエリーを実行すると「alter table 文のエラーです」って出るんですけどAccessだからなんでしょうか。
>>396 mdbはSQLではテーブル名変更はできない。
DAOまたはADODB & ADOXをCOM参照して使えばできる。
>>397 そうだったんですか・・・
「出来ないっぽい」とは思ってましたが、「出来ない」ってはっきりと言われると
あきらめがつきます。
ADODBあたりを調べてみます。
ありがとうございました。
>>398 ADODB & ADOXで行くんならADOXを調べたほうがいいよ。
ADODBはConnection開くのに必要なだけだから。
ADO.NETしょっぱいな
※たべられません
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はフィールドを意味しますが、クラスでなければなりません。
>>402 static xxxに戻り値と引数がない。
> private ArrayList list = new ArrayList(); に static がついてないからなんじゃね?
406 :
402 :2006/02/12(日) 15:05:03
セミコロン?どこですか? ちなみに訂正 誤:static xxx 正:static xxx() ですた。
407 :
402 :2006/02/12(日) 15:06:49
>405 それでした。 ありがとうございます。。
list メンバや b メンバに static が付いていないのはなぜなんだ
デリゲートに登録されたメソッドはそのメソッドを持つクラスのインスタンスが生成されたスレッドで実行されると考えて良いのでしょうか。
>411 MSDNの見方をしらないとすぐコレだ
>>410 411は偽物?です。
どのあたりに載っているか、または検索キーワードをご教示ください。
>>414 delegate、デリゲートで検索を行っていますが数が多く、それらしきトピックには的を射た回答がありません。
具体的に項目を教えて頂けると助かります。
>>414 あとちょっと不安になったのですがMSDNに載っているのは確実なのですよね?
>>415 お前は何様だ?
MSDNが検索しづらく、役に立つ情報がないと言うのか?
>>417 何も知らずにMSDNを読めと言ってしまった。だって俺は部活ではC#博士と呼ばれているから。
でも、載っていないと質問者に追求されて逆ギレしてしまった。バカのくせに俺に盾突くからだ。
>>409 全くの勘だけど、呼び出し側のスレッドで実行されるんじゃね?
C#のdelegateはコンパイルされた段階でクラス化される。
だから、クラス内でdelegate型を宣言するとインナークラスになる。
この形はJavaと同じだから、多分動作もJavaと同じだと思うんだ
けど・・・・・・
>>416 オフィシャルドキュメントなんだから絶対的な真と言いたいところだが、人間が書いたのだからミスはある
最終的にはVSの挙動が真
VSの挙動自体がバグっていても、それが最終的な結論なので、真
>>419 実験してみましたがその通りのようです。
DirectoryWatcherの様な非同期で動作するコンポーネントを作成したかったのですが
イベントハンドラからコントロールの操作ができずに困っている状態です。
実現手段が分からなくなってきました。
>>421 Control.BeginInvoke、Invoke
>>422 ありがとうございます。
クライアントがコンポーネントのスレッド使用有無を意識しなければいけないというのは
あまり美しくないのでやり方を探している最中です。
メイン コンポーネント スレッド メソッド →→ 生成 →→ コントロールの操作 X ←←←←←←←←←←イベントハンドラ実行
デリゲートのEndInvokeとか、とにかくEnd○○って呼び出さないとメモリーリークするって本当? 毎回毎回コールバックでEndiInvokeを呼び出すのを書くのが面倒くさい・・・
>>428 を実装してもComponent1.Invokeメソッドをスレッドから呼んだらそれはスレッドで実行されてしまいませんか?
お前はさっきから何言ってるのかさっぱり分からん。 デリゲートがコンポーネントの作成されたスレッドで動くなんて何で思った? コンポーネントのInvokeってなんだ? 普通はISynchronizeInvoke実装しといて、 贅沢言うならデザイナで自動設定されるようにしとけば十分だと思うが。
>>430 もっと勉強して下さい。
はい、次の有益情報どうぞ。
氏ね
>>430 俺の書き込みのどこら辺が勉強不足なのかをきっちり指摘してくれ。
434 :
デフォルトの名無しさん :2006/02/12(日) 23:04:36
質問です。 C#のプロジェクトの一部をVB.NETで書くにはどうすればいいですか?
そんなこと出来たっけかな?
436 :
デフォルトの名無しさん :2006/02/12(日) 23:06:58
>>434 VBで暮らすライブラリ核。それをC#で使う。
VB.NETでクラス・ライブラリを作って、C#から参照汁。
439 :
デフォルトの名無しさん :2006/02/12(日) 23:11:30
>>437 その方法ではDLLファイルができてしまうのでいやです。
それでいいんならそれだね。 同じプロジェクトでないといけないのなら厳しいかも。
2005なら余裕ですょ。
442 :
デフォルトの名無しさん :2006/02/12(日) 23:16:46
無理
445 :
デフォルトの名無しさん :2006/02/12(日) 23:20:27
実用品かどうか不明だが ILMerge で dll や exe をまとめられるらしい
448 :
デフォルトの名無しさん :2006/02/12(日) 23:29:39
>>446 お前誰やねん。
お前の問いってなんやねん?
あれか?component1.Invokeって得体のしれんやつを呼んだときに
スレッドで実行されない(意味不明)ようにする方法ってやつか?
>>448 さっきから何遍もひつこいんだよ。
MSDN読んでこい。
>>449 もうほっとけ。
俺流理解でその間違いに気づきもしないやつは放置
>>450 いや、ひつこいとかじゃなくて、できませんか?と訊ねてる。
>>449 ああ、そらそこだけしか読んでないなら意味不明ですね。
2chには初心者板があるのでそこで勉強されては銅でしょうか。
勘弁してくれ。
全部呼んでも意味わからんわ。
だから
>>430 ではどう駄目なのかかけ。
デザイナの自動設定で足りないってんなら
どんなのを期待してんだ?
勝手に何に同期すればいいか判断しろってか?
だったらForm.ActiveFormあたりか、
それでは怪しいなら、いっそコンストラクタでスタックフレーム
取得して、呼び出し側のコントロールを探して、
SynchronizingObjectに自動設定でもしてやれよ。
どこまでいくか見てる。
まず
>>409 。
delegateと実行スレッドは何の関連性もない。以下のコードのように
どっちでも出来る。
MethodInvoker invoker = delegate { Console.WriteLine(".."); };
invoker(); //これでこのスレッドで実行される
invoker(delegate (IAsyncResult r) { invoker.EndInvoke(r); }, null);
//これでスレッドプールを使う(別スレッド)
んで
>>430 当然のごとく型システムの上にあるコンポーネントもスレッドに依存など
標準ではしないしだから同期する仕組みが必要になる。
そして、WinFormsはMessageLoopのスレッドに依存する。だから別スレッドから
操作することが出来ない。これを解消するために用意されている方法が
ISynchronizeInvokeとSyncObject。FileSystemWatcherあたりがこれを使用する。
>>409 の「完全に間違った」前提で話すから「わけ分からん」といわれるのよ。
分かったらもうくるな屑が
459 :
458 :2006/02/13(月) 00:21:24
訂正 invoker.BeginInvoke(delegate (IAsyncResult r) { invoker.EndInvoke(r); }, null); //これでスレッドプールを使う(別スレッド)
> invoker(delegate (IAsyncResult r) { invoker.EndInvoke(r); }, null); BeginInvokeって書かんでもいけたっけ?俺なんか勘違いしてる? しかし匿名デリゲート使えばこんな風にできるか、そうか… Fire&Forgetがやりやすくなるな…
あら、訂正されてた…失敬。
>>458 で、それを標準的なイベント呼び出しと同等に使えるわけ?
… … イベントの呼び出しを必要に応じてInvokeで実行するんだよ。 ってか非同期イベントもった標準のコンポーネントはみんなそうなってるだろ。
ああ、また勘違いされそうだな。 「イベントを発行する」コンポーネント側でInvokeするんだよ。 だから使う側からは普通とおんなじだ。
まあせっかく教えても何も分かってないってこったな。 以下ループ
>>464 なるほど、ようやく有識者が現れてくれました。ありがとうございました。助かりました。
おいおい(ry
お前らのレベルには正直がっかりだぜ。
>>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);
}
}
}
結局のところ実装者による。
>>458 冷静に読んだ。
当然のごとく型システムの上にあるコンポーネントもスレッドに依存など
標準ではしないしだから同期する仕組みが必要になる。
そして、WinFormsはMessageLoopのスレッドに依存する。だから別スレッドから
操作することが出来ない。これを解消するために用意されている方法が
ISynchronizeInvokeとSyncObject。FileSystemWatcherあたりがこれを使用する。
>>471 >こういう場合にThreadPoolを使用する実装にしたいとしてこんなコードを書いてもいい。
俺はそう言う実装にしたくないので前提が崩れてしまいます。
うーーんどういう意図で書き込んでんだろ?
>>471 >Request(e);
作ったスレッドでメソッドが動こうとする。
>SyncObject.Invoke(Request, new object[] { this, e });
WinFormのスレッドでメソッドが動く。
こういう事?
ちょっと聞いてみたいが、BeginInvokeのとこだけ やめたらいいってことすら分からないのか、それとも ただただ書き込んでるだけなのか?
>>475 >>Request(e);
>作ったスレッドでメソッドが動こうとする。
「作った」スレッドじゃなくて「今まさに動いてる」スレッド。
「今ここを実行してる」スレッド。
説明不足だったな。 この実装はほとんど屑の言っている要件を満たす目的でかいてる。 SyncObjectがセットされている場合はそれに同期したスレッドで実行し、 そうでない場合はThreadPoolを使う。まぁ標準的な実装だ。 ちなみに、実行スレッドと何の関係性もないことを示した先の書き込みの 意味を含めて、実際に実装者が勝手に指定できることを示すために ThreadPoolを使っている。 >SyncObject.Invoke(Request, new object[] { this, e }); WinFormのスレッドでメソッドが動く。 これが同期する場合のすべてだ。この場合SyncObjectはプロパティな。 ちなみに、これのセット用のコードを直接コードジェネレータに吐き出させる ことも出来るだろうがその話は長くなるので省略。
>>478 問題はComponentからではWinFormに属するオブジェクトを取得できないことですな。
>>479 みょんなことはない。
Designerを作ってInitializeあたりでGetServiceでIDesignerHost取って
RootComponentを取ってISynchronizedInvokeにasキャスト。
んでそれを渡されたコンポーネントのSyncObjectプロパティにセット。
もちろんそのコンポーネントのクラスにDesignerAttributeを指定すること。
プロパティ側はきちんとした値がセットされた場合にSerializeしてちょと
指定。でいけるはず。みょん。
482 :
デフォルトの名無しさん :2006/02/13(月) 14:54:38
すみません、DataGridViewの内容を簡単にcsv出力する方法ありませんか? なんか、命令一発で出来そうな気もするんですが、ググっても見当たらないんで、 自分で実装するしかないかないかなとあきらめ気味なんですが。
内容をどうやってるかにもよるがまあ自力実装だな。
コピー → Excelに貼り付け → 保存
質問させてください。 Process.start()で、標準出力に1秒おきに1行適当な文字列を出力するプログラムを実行しています。 Process.StandardError.ReadToEnd()、ReadLine()では、そのプログラムが終了するまでストップしてしまい、リアルタイムに1行ずつ読み取ることができませんでした。 void Run() { while(!this.process.HasExited) { Thread.Sleep(50); this.process.StandardOutput.ReadToEnd(); // ←ここでストップ } } リアルタイムにReadしたい場合はどうすればよいのでしょうか?
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つのスレに投稿させていただきました。)
>>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)」みたいなことがしたいのですが...。 どなたかアドバイスご教授よろしくお願い致します。
ごちゃごちゃにしてしまって大変申し訳ありません。 要は、Start()したProcessをProcess.StandardOutput/Error.ReadLineする時、489の方法ではProcessが終了するまで固まってしまうので、それを回避する方法を探しています。 何かよい方法はありませんか?
>>489 ほぼコピペしただけだけど再現しないね。
// 問題ありまくりなコードだな。
>>490 冷静に考えてみれば実行したいメソッドを呼べば済む話だったりしない?
SendKeysクラスもあるけど。
>>488 C#とどう関係あるか説明してから質問しろ
494 :
デフォルトの名無しさん :2006/02/13(月) 22:04:46
昨日荒れてたテーマなので恐縮です。 Fire-and-Forgetで非同期デリゲートを使うときにコールバックを使うのは理解できているのですが、 Control.BeginInvokeではコールバックを指定することができないようです。 Control.BeginInvokeでFire-and-Forgetをしたいときはどういう手段があるのでしょうか。
monodoc読んで来い。
>>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だろうよ)。
>>480 そこまでせんといかんですか。
Delphiならコンストラクタで親のTComponentが渡ってきてたのですが、
ここまで来るともはやクラスライブラリの設計ミスですね。
>>497 そこまで?クラスコードを入れてせいぜい20行ぐらいでできるけど…。
実装だけなら数行。
というか5分で作って確かめて投稿したんだけど。
Delよりもデザインやらコンポーネントのフレームワーク自体大掛かりだから
クラスは確かに多くて複雑だけど、設計ミスってのは感じないな
質問です。 現在のスレッドのProcessThreadのインスタンスを取得したいのですが、MSDNを読んでもいまいち方法がわかりません。 ProcessクラスやThreadクラスにも取得するメソッドがないようです(コレクションは取得できるようなのですが)。 どなたかわかる方いますか?
Process.CurrentProcess.Threadsを回して、IdプロパティをGetCurrentThreadIdで取得したIDと比較していく。 GetCurrentThreadIdはAppDomainにあったんだが、.NET 2.0でObsoleteになったのでWin32APIの方で。
502 :
500 :2006/02/14(火) 07:58:42
>>501 どうもです。
うーんやっぱりそれしかないんでしょうか・・・
スマートとは言い難い方法なので、できればもっと直接的に取得する方法を知りたいのですが。
まあないのなら仕方ないですが
>>499 うまく動かないねぇ。
原因までは追及できないけど、Cの実行ファイルの問題のようだ。
.NETでない標準出力リダイレクタでも最後にまとめて出力される。
>GetCurrentThreadIdはAppDomainにあったんだが、.NET 2.0でObsoleteになったのでWin32APIの方で。 API使ってまでobsoleteは避けるべきなの? このobsoleteの理由からも意味ないと思うんだが。
3.0で消えてるかもしれないじゃん? それならAPI使った方がいいやってだけ。 warningが鬱陶しいってのもある。
Thread.ManagedThreadId
そういうこと言ってんじゃない。
508 :
デフォルトの名無しさん :2006/02/14(火) 14:47:47
2.0から新規でプロジェクト作成するとIDEが partialキーワードでFormクラスを二つに別けてますよね。 画面上のコントロールに対する独自の初期化処理って みんなどっちに書いてます? どっちかが推奨されているとか無ければ、 InitializeComponent呼び出しの後に追加したいんですが、 どうでしょう?
Designer.cs を弄ってほしくないから別ファイルに分けてあるってのに
>>509 よく分かりました。
ありがとうございました。
511 :
デフォルトの名無しさん :2006/02/14(火) 16:17:04
STLのmapとかvectorみたいに 入れるものの型を指定できるリストは無いですか?
List<T>
>>512 詳しくもくそも.NET 2.0の目玉機能だ。2005Expressを落とせ。
System.Collections.Generic.List<T>
>>514 >>515 System.Collections.Genericが出ない・・・
古いからかorz
>>516 だから 2005 入れろって。
Express ならただだから。
518 :
デフォルトの名無しさん :2006/02/14(火) 18:08:50
ProcessクラスのメンバにはCPU使用率を取得できるのは無いですよね? そこで、PerformanceCounterクラスの説明を読んだのですが、 windowsのタスクマネージャのような プロセス毎のCPU使用率を取得したい場合、 何秒か毎に全プロセスのCPU使用率を取得したら、 メモリかなり食うと思うのですが、 他に方法は無いのでしょうか? (タスクマネージャは家の環境では概ね平均4Mbyte程度のメモリしか使わないので) 厳しく導いてください。
なんでメモリかなり食うと思ったですか?
>>519 今実際にProcessクラスを利用して5秒おきに
プログラムへのフルパス
プログラム名
会社名
このファイルを含む製品の名前
プロセスID
プログラムの説明
メモリ使用量
を取得してます。(実際には毎度取得するのはメモリ使用量だけにしてます)
フォームに上記の機能だけ持たせて実行すると15メガ位メモリを使っています。
これに更にCPU使用率のロジックを追加したら。。っと思いました。
タスクマネージャは軽いのになぁと言う思いから質問させていただきました。
フォームに何の機能も持たせずに実行させてそれとの比較はしたのか?
522 :
デフォルトの名無しさん :2006/02/14(火) 18:51:02
同じGUIプログラムを.NET1.1と.NET2で配布したい場合 コアルーチンとGUI.csを分けるしかないですよね。 コアルーチンを1つ作って 1.1用のGUIと2.0のGUIをVS2003とVS2005で作るのがベター?
全く同じGUIなのなら、app.configでsupportRuntime属性設定すれば良くね?
微妙に間違えた。supportedRuntime つか1.1のアセンブリを2.0しか入ってない環境で動かしたら自動的に2.0で動くんだからそれで良いんじゃね?
互換性のない動作も結構あるけどな・・
>>517 仕事だからさ、開発環境決められてるんだよ・・・・
まぁObject型で入れてキャストして使えばいいんだけどさorz
>>526 そりゃ駄目だ。
つーか、2.0のこと全く調べてなかったのかよ
>>527 新規じゃないから・・・・
1.1からの変更だからorz
>>528 ならあきらめて object からダウンキャスト。
ジェネリクス使いたかったら .NET Framework 2.0 必須。
専門で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を本アプリ上にコピペ、本アプリ上でドラッグで範囲選択してコピー と、いうような手法をとろうと思ってるのですが・・・
矩形選択はWindows標準ではできないぜ?
>>532 お返事ありがとうございます。
出来ないのですか・・・
SQLplusで使える機能で痒いとこに手が届く感じで
便利だと思ったのですが(´・ω・`)
矩形選択できるエディタなんてそこらじゅうに転がってるだろ。
矩形がポイントじゃなくて 自分で '{' 〜 '}' とか欲しいところを 決められるのがキモなのではないかと 第三者が推測してみる。 俺はGUIプログラミングしないから 実現方法はシラネけど。
>>535 それなら
> 例Aを本アプリ上にコピペ、本アプリ上でドラッグで範囲選択してコピー
というのが意味不明になっちゃうしねー。
テキストボックスに文字列貼り付けてその中の条件に合う文字列をピックアップ、なら簡単に可能だけどさ。
>>534 エディタはSakura使ってます。
ただ勉強がてらっていうのと
自分で何かひとつWebアプリとかではない作品を作ってみたかったんですよね。
>>535 ポイントはやっぱし矩形ですねぇ・・・
'{' 〜 '}' ←これだと正規表現で出来ますしね。
それは失礼。
矩形選択は標準じゃないだけで自力実装すれば可能。 ただし、オーナードロー必須だしマンドクセ要素はたくさん。 .NETよりもWin32APIの使い方の方を知る必要があるから.NETの勉強にはならない。 Win32API用の記述となればC#らしい書き方もそんなにできないからC#の勉強にもならない。 勉強でやるとするなら方向を間違ってるからやめとき。
>>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を変更したことは分かるようにしてある)
可能な限りフォームで独自のDisposeが必要になるようなことはしない。
もしくはイベントでやる。
ToolStripに入りきらないくらいボタンたくさん作ると、 はしっこに入りきらなかった分を表示するプルダウンが現れるが、 ボタンが入り切らなくなったら2段にするとかできんのかな。 Windowsのタスクバーはそうなるんだけど。
自分で作れ
レスサンクスです そうしたいのはやまやまなんですけど 他の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 は、存在するものとしてよいのでしょうか。
>>546 僕もoverride派。
こだわりというか最初の仕事のコーディング規約になってたから、慣れちゃったです。
>>547 どうなんだろう。。(じゃ、レスすんなって)
549 :
544 :2006/02/14(火) 23:52:20
>>545 orz
実は自分で作ったのあるけど、ちと重いんだよね・・・
あと、ControlPaintってXP風のコントロール描画には対応してないみたいだし。
>>547 try-catchすれ。そうすれば存在するかどうか悩まなくて済む。
>>550 ありがとうございます。
今のところ発生している例外が2種類ありまして、
System.ArgmentExceptionと
Win32Exceptionなのですが、
他の例外があったとして、発生するかもしれない例外を
全てキャッチするという作業は、例外の切り分けが発生し、(プロセスによって存在するプロパティがまちまち)
結局、汎用性ゼロになってしまわないかと思い、
悩んでしまっていました。
そこで、プロセスIDはどのプロセスにも存在するので、
winlogon.exe
csrss.exe
System Idle Process
System
だけ(もしくは他数種類)なのであれば、条件分岐してしまおうかと思ってしまった次第です。
夜遅くにすみませんでした。
もう少し考えて見ます。
ありがとうございました。
リストビューのサブアイテム部分に コンボボックスかラジオボタンを表示して ユーザーに操作させたいんですけれど オーナードローでどうにかするもなんでしょうか?(できるのかはわからないけど) それともリストビューを使うことが間違ってる? だれかご教示お願いします
DataGridViewの方が楽だと思う
ListViewはオーナードロー自体.NET 2.0にならないと絶望的だが。 そしてそう言う用途なら.NET 2.0ではDataGridViewの方が楽。
でーたぐりっどびゅーですか 了解しました、ありがとうございますた
C#2005で処理結果をhogehoge.txtというファイルに出力したいのですが なんていう命令使えばいいですか
解決したっぽいです
>>552 DataGridView以外だとサブアイテムの位置を取得して、編集のときだけ事前に準備したコンボボックスやらラジオボタンを表示すればいいかと。
オーナードローなんて最終手段であって、別の方法を探せばなんぼでもある。
もしやるとしても、ListViewのオーナードローは.NET的な方法じゃなくWin32API的な方法でやったほうが良い。
DataGridViewってアホが使うと激しく遅くなるな。 アホっておれのことだけど。 「Windows フォーム DataGridView コントロールを拡張するための推奨される手順」 読んでようやく使える速度になってきた
BackgroundWorkerって使い物になる? というのは、画面にボタンとプログレスバー、リストビューを置いて、 ボタンクリック時にRunWorkerAsyncを呼び出して、 DoWorkイベントでループで0〜10000まで回して、 ループの中で別の自分で作った関数を呼び出して(引数にはBackgroundWorkerとDoWorkEventArgs) そこで、GUIの更新(リストビューにアイテムを追加)して、ReportProgressを呼び出す。 そして、ProgressChangedイベントでプログレスバーの値をカウントアップ。 思いっきり、メインのGUIの操作(画面の更新)が出来なくて固まったようになるんだが・・・ 確かにプログレスバーはちゃんと更新されるが、他の操作が出来ない。 キャンセルボタン置いても、イベントが発生しないから止まりゃしない。
そんだけGUIスレッドに付加書け照れば当たり前。 作り方が間違ってる。
563 :
562 :2006/02/15(水) 17:25:12
ということは、GUIスレッド(画面をメインとする)とは別のGUIスレッドで リストビューなどを更新しろって事かな? つまり、BeginInvokeつかって非同期でやれって事? いまいち、BackgroundWorkerの使い方が分からん。 BackgroundWorkerを使った場合、どうすりゃいいんだ?
564 :
561 :2006/02/15(水) 17:25:59
暇だからいうと画面の更新を500ミリ秒ごととかにする。 バックグラウンドスレッドで処理 フラグ立てる。 GUIタイマーでフラグチェック。必要なら描画。
566 :
561 :2006/02/15(水) 17:39:19
>>565 >暇だからいうと画面の更新を500ミリ秒ごととかにする。
これ、意味が良く分からない。
とりあえず、ループの中でSleep(1)とかしたら、いい感じで更新されたが、
いまいち納得できない。
>バックグラウンドスレッドで処理
BackgroundWorkerってバックグラウンドスレッドじゃないの?
>フラグ立てる。
>GUIタイマーでフラグチェック。必要なら描画。
これも、俺には理解できない。(無知ですまん)
ちなみに、リストビュー操作部分をコメントアウトしてみたが、結果は同じだった。
GUIスレッド云々というか、そもそも for でループしてるのが悪いみたいだ。
そういや、BackgroundWorkerのサンプルプログラムって再帰(フィボナッチ)とかSleepしてるのぐらいしか
見たことないなぁ・・・
567 :
562 :2006/02/15(水) 17:48:39
さっき書いたのは、概念なので実装は適当に汁。 BackGroundWOrkerやよく知らんけどたぶんそう。 ・バックグラウンドはフルに仕事していい。 ・仕事する中、GUI画表示するのに必要なデータを場合に応じて更新。データ変わったよ変数trueに。 ・GUIスレッドでタイマー動かしておく。タイマーイベントでデータ変わったよ変数チェック。 ・trueなら必要なデータ見て画面更新。 基本はバックグラウンドはフルに処理。 GUIはフルに表示することに意味がない(人間の反応速度はそれほど速くない)ので適当な間隔500ミリぐらいで更新すれば十分。 いまバックグラウンドで画面更新処理を直接呼んでいるため必要以上にGUIを更新してる->反応しないようになってる。
CPUが複数あるならともかく、一つしかないのなら結局処理できるスレッドは一つ。 そのスレッドが他のスレッドを全く気にせずループ回しゃあ、そりゃ他のスレッドは動けない。
windows3.1かよ
570 :
561 :2006/02/15(水) 18:01:25
>>567 >いまバックグラウンドで画面更新処理を直接呼んでいるため必要以上にGUIを更新してる->反応しないようになってる。
なんか、納得したかも。
確かに、プログレスバーの更新部分も呼ばないようにしたら、動作は問題なくなった。
でも、別の疑問が。
処理が長い場合、プログレスバーとかで状況が確認できるようにしたり、
GUIを操作する場合、例えばあるディレクトリをルートとしてサブディレクトリやファイルを
再帰的に取得したものをツリービューに表示させたりする場合とかだと、
スレッド使って画面が固まったように見せることが出来ないってことなのか?
>>570 ちょっとは自分で調べろ
それ以前に言葉の使い方を勉強し直せ
まさかとは思うがControl.Invoke/BeginIvokeを使わないでワーカースレッドから直接GUIを操作してないだろうな?
573 :
561 :2006/02/15(水) 18:26:39
>>572 使ってないよ。
というか、プログレスバーを使った更新サンプルがMSにある。(フィボナッチ使うやつ)
ProgressChangedでプログレスバーを更新してるのはサンプル通り。
ワーカースレッドからGUIは操作自体出来ないんじゃないのか?(エラーになるだろ)
BackgroundWorkerはその辺の事を自動でやってくれる。 というかそのために作られた。 大体1万回も画面に通知するのが間違い。 例えば100ループで1回にするとか、調整がいる。
画面側がタイマーでやってもいいけど、 BackgroundWorkerはそういう設計にはなってない。 基本は、ワーカー側から通知という考え方になってる。
576 :
561 :2006/02/15(水) 18:57:57
>>574 >大体1万回も画面に通知するのが間違い。
>例えば100ループで1回にするとか、調整がいる。
いや、プログレスバーの更新とかはそれで良いかもしれないが、
さっきも書いたようにディレクトリを再帰的に・・・といった場合、
ツリービューにアイテム追加するとかは、そうもいかないんじゃ?
577 :
562 :2006/02/15(水) 19:05:37
>>570 ,576
すまない。もう少しわかりやすく行ってくれ。
ツリーとかにひとつずつ追加するしかなく、画面更新が頻繁になるということ?
ツリーの仕様がそうならそう。
画面更新せず追加できるモードがあるならそれ使え。
君はもし1万個アイテムがあったとしたら、 1万回「画面」を更新するのかね? BackgroundWorkerの通知は、あくまで進捗状況のユーザへの通知が目的。
579 :
561 :2006/02/15(水) 19:13:21
>>577 、
>>578 いや、ツリービューとかはただの例え話だよ。
>BackgroundWorkerの通知は、あくまで進捗状況のユーザへの通知が目的。
これも言ってる事は分からなくはないが、
進行状況をプログレスバーに表示するだけなのに、画面が使い物にならなくなるんじゃ、
身も蓋も無いって事ね。
進行状況のプログレスバーは1万回画面を更新する必要はあると思うけどね。
確かに100回に1度、更新するって話も分かるが、
実際問題として、更新状況ってのはちゃんと更新されてるアプリのほうが多いよね。
580 :
562 :2006/02/15(水) 19:16:43
・・・なんかもう好きにしてくれ・・・
>>579 CPUバウンドな処理をバックグラウンドでやりたいならスレッドのプライオリティを下げればいいが、
BackgroundWorkerはThreadPoolを使ってるようだから勝手にいじっちゃいけないのかな。
>>579 プログレスバーを一万回更新しても、実際にGUIが変わったように見えるのはその1%あるかって程度だと思うんだけど。
独自プログレスバーでピクセル単位で更新できたとしても精々4、500ピクセルだろ?
使い方間違ってて使い物になんねーって愚痴いってる痴愚がいるスレはここですか?
どのていど通知が必要になるかなんて処理によりけりだろうが そりゃ1時間かけて1万個処理するなら1万回更新してもおかしくないが、 更新処理だけで固まってしまうような頻度の処理毎に 画面を更新なんてありえんだろ。 仮に画面というかウィンドウの更新が間に合ったとしても、 実際に表示されてない速さじゃ無意味。
それ以前に言葉の使い方を勉強し直せ
586 :
562 :2006/02/15(水) 20:54:51
何つーか教える期がうせるやり取りだった
もしかしてProgressChangedでリストビューにコントロール追加してるの? 普通コレクションとかにつっこんどいてあとでまとめて追加するんじゃないの?
588 :
561 :2006/02/15(水) 21:35:49
>>587 まず、話の流れからちゃんと整理してくれ。
ProgressChangedで書いてるのはプログレスバーの値を更新してるだけ。
今のコードがそうなだけで、話の流れからいって、 例えばもし画面のリストに追加していく処理なら きっとその処理も同じとこでやってるだろう。
BackGroundWorkerのサンプルみてないから解らんけど、プログレスバー更新の頻度が多すぎるから、 メインのGUIにユーザーがフォーカスを当ててもプログレスバーがフォーカスを奪ってしまっているとかは? プログレスバーの更新処理を行っているメソッドで適当に時間管理して、何秒経ったらプログレスバーを更新汁、みたいなフラグ入れればいいんじゃない? ちょっと試してくる。
592 :
561 :2006/02/15(水) 22:00:25
>>589 あのさ、もう少し流れ読もうよ。
確かに最初はProgressChangedで全部書いてた。
でもって、これじゃ動作がおかしいから、ProgressChangedにプログレスバーの更新処理だけにした。
だけど、それでも動作がおかしい。(つまり、ここにリストビューの処理を書いていた事が原因じゃない)
試しにプログレスバーの更新処理もコメントアウトしてみた。(ここで予期した通りの動きになった)
そこで沸いたのが別の疑問。
進行状況を知るためのイベントで進行状況を視覚的に分かるように
プログレスバーを使用したら動かない。
これってどういうこと?
って事。
理解できたか?
>>591 プログレスバーにフォーカスって・・・
既に書いたけど、for ループの中にThread.Sleep(1)とでも入れると問題無かった。
>>592 おまえほんとーーーーーーーーーーーにプログラムの素質無いからやめろ。
これだけ説明されて何が原因かわかってないのか?
594 :
591 :2006/02/15(水) 22:18:44
プログレスバーがフォーカス奪う、って俺バカだwwww
>>561 この馬鹿。
お前がちょっとおかしい人だから
ここの他の知識ある奴がいきり立って
俺が質問しにくくなるだろうが。
という理由から、
俺はお前に対して「迷惑なやつだな」と感じている。
お前が「俺はできる方なんだぜ」って暗にアピールしてるのを
俺はちゃんと感じ取ったから、
もうその辺で態度改めてください。
もう訳分からないので、 誰かここまでのやりとりをまとめてください
ToolStripをデフォルトカラーのOffice風じゃなく、 Visual Studioみたいにグレー調にしたんだけど、 やっぱToolStripRendererをちゃんと作らないと駄目かな・・・
任意の文字列のN番目から別の文字列で上書きしたいんですが、 N番目からRemoveしてからInsertするという書き方以外に良い方法 がありましたら、教えてくださいませんか。
String.Format("{0");
nantoka.Substring(0,n-1)+kantoka
書いてる途中で送っちまった。 つまり、String.Format("{0}{1}",a.Substring(0,N),"上書きしたい文字列")とかどうよ。
>>604 なにはともあれ、おまい優しいな。
愛してはないけど好きだ。
おやすみ。
>>600 の為に言っとくけど別人だからw
>>602 ,604
レスありがとうございます。
言葉が足りなくてすみません。
あいうえおかきくけこ←任意の文字列
を
AAA←別の文字列で3番目から上書き
あいAAAかきくけこ
とこういうふうな処理をしたいわけなんですが
Replaceは、検索文字列がいるし
Remove→Insertではスマートじゃないかなあ
と思ってるわけなんですが…、いい方法はありますでしょうか?
607 :
599 :2006/02/16(木) 10:17:38
>>603 さすがに今更それは見栄えがしない・・・
てかなんでOfficeXP風がデフォなんだよ。
せめてstaticで用意してよ、ゲイツタン。
>>606 string s = "あいうえおかきくけこ";
Microsoft.VisualBasic.CompilerServices.StringType.MidStmtStr(ref s, 2, 3, "AAA");
えーとMidステートメントをC#で使うにはこれでいいんだっけ・・・
>>607 ToolStripRenderMode.Systemじゃダメなん?
strip系のメニューでチェックつけるとチェックの背景が ハイライトの色になるってのもなんとかしてほしい
611 :
599 :2006/02/16(木) 12:48:59
>>609 これだとのっぺりしすぎなんだよね。境界線がないし。
613 :
599 :2006/02/16(木) 14:26:19
んなことはわかってるよ。豚。 言いたいのはなんでダサいOfficeXPスタイルがデフォなんだということだ。
ここで文句行ってもただの愚痴だろう。禿。 なんか意味あるとおもってるのか?このちんかす。
>>613 Visual DeveloperのMVPになって直接MPDの開発者に言えよカス
そこまで行けない豚脳がブヒブヒ言ってんじゃねーよ
>>613 何がデフォルトかは、お前がダサいと思うかどうかと関係ねえんだよ。
ピザでも食ってろデブ。
>>613 オレはダサいとは思わない
ビジネスデスクトップ向けアプリを作る上ではOfficeと同じルック&フィールになった方が利益ある。
見栄えってのは個人のセンスではなく、広く普及しているものと同じかが重要。
まあそのルック&フィールとやらも次のOfficeでまたがらりと変わるんだけどな
だから、追随してゆくだろ。
VS2007だか2008だかをまた買わされると
listviewコントロールで、各項目の高さの変更は どうすればいいのでしょうか? Heightプロパティがなくて困っています
622 :
606 :2006/02/16(木) 21:42:54
>>618 Word12とかのリボンとツールバーは別物
Outlook12とかInfoPath12は相変わらずツールバー
今見てみたから間違いない
624 :
デフォルトの名無しさん :2006/02/16(木) 21:57:37
MaxConnections ってどんな感じでつかうのでしょうか? Webを探してもサンプルがみつかりま せんでした。。。。 C#初心者なもので、ご教授お願いし ます。
名前だけ出されても困る。 .NET 2.0のヘルプではSocketOptionName列挙体のメンバで、 > サポートされていません。使用すると SocketException がスローされます。 というのしか見つからないが。
また懐かしいページだなw
628 :
624 :2006/02/16(木) 22:28:14
629 :
デフォルトの名無しさん :2006/02/16(木) 22:29:09
C,C++,FORTRAN(諸事情で勉強せざるを得なかった..),Javaと勉強してきて 次はC#をやってみようと思うのですが,C MAGAZINEから出ている『詳説C++第2版』のような感じの本ってありますか? 「あーコレ,C#使ってる人なら大体持ってるよ…」って感じの本
>>628 IISのページじゃねーか……。
どうやって通信を実装させてるのかも分からずに答えられるか。
すんまそん hogehogeボタンをクリックしたときだけ hogehogeテキストを表示させるようにしたいのですがどうすれば良いですか
>>629 MS系の開発で最初に読むべきは「MSDNライブラリ」
IDEの支援機能も強力だから、Javaとかの経験があるならヘルプ無しでもある程度いける
あとはMSDNオンラインも見とけ
正直、MSの開発ドキュメントに対する力の入れ方は史上最高だと思う
書籍はMSDNライブラリの補足とかケースバイケースな事例を知るために後で買えば十分
どこに表示するんだ
>>632 WindowsアプリですかWindowsコンソールですかASP.NETですか
貴様は何をどこまでやってその疑問が生まれましたか
>>632 hogehogeボタンのイベントハンドラ
>>632 意味が全然わからんぞ。どこに表示したいんだ。
hogehogeボタンの表面から北極星の瞬く夜空までいろいろあるだろが。
>>628 根本的に基礎知識が不足してる
System.Net関連をざっと見てから出直せ
「我ながら上手いフレーズを思い付いたもんだ」とニヤニヤする
>>637 が目に浮かぶ
640 :
637 :2006/02/16(木) 23:44:16
俺がくだらない書き込み打ち込んでる間に
>>632 が集中砲火されてるw
642 :
637 :2006/02/16(木) 23:46:11
>>639 あんたのその書き込みを見てニヤニヤが止まらなくなった。
>>633 MSDNはそんなに大きいんですか..分かりました.それでいってみようと思います
あの,全くの初心者のする質問になっちゃうんですが
VS2005 は .NET の開発環境なんですよね?
あと, .NET はあと何年くらいもつのでしょうか?
645 :
637 :2006/02/16(木) 23:50:56
正直俺もニヤニヤがとまらないのはどうしてw
>>629 C#によるプログラミングWindows(上/下)
Perlにおける駱駝本、JavaにおけるコアJAVAに相当する。
C++とJavaが使えるならC#はこの2冊で万全。
あとは必要性と習熟に応じてプログラミングMicrosoft ADO.NETや
.NETエンタープライズWebアプリケーション開発技術大全辺りを…
647 :
632 :2006/02/16(木) 23:56:45
俺もニヤニヤ止まらない どんなイベントでどこになに表示させるか言ってないのが悪かったね ただどうやったら表示を隠したりできるのかが知りたかったけど何かそれっぽいソース探りあてたのでもうおk
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だけを単純コピーで リリースできる運用にしたいのですが、そうするにはどのような作成方法で 作ればよいのでしょうか?
>\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のランタイムを指定して作成しています。
>>654 いや、VS2003だよね?
じゃ1.1しか作れないはずなんだけど…。
>>654 その腐った環境に合わせてバージョンリダイレクトを適切に設定しろ
もしくはVS2002を使え
.NETにDLL HELLは無いと言っても無設定でなんでもできるわけじゃない
楽しようと思ったら全てにおいてバージョンを合わせるべし
657 :
デフォルトの名無しさん :2006/02/17(金) 10:44:08
>>655 いえプロジェクトの設定で1.0を指定できました。セットアップも1.0指定で作っています。
実際に別マシンには1.0しか乗っていないにも関わらずVS2003で作成したアセンブリが
動作することはできました。
これはバージョンの問題なのでしょうか?認証とかの問題ではないってことですか?
>>646 ちょっと脱線話
だけど
開発元(のようなもの)が書いた本って
何故あんなに分かりにくいのだろうか。
読む気しねえ。
って言うと、
でも一番詳しいとか批判受けそうだけど。
俺
>>629 じゃないよ
>>658 MSが書いてるのはMSDNだけ
他は外部ライター
MSDNの中身も外部ライターが多いけどな
661 :
デフォルトの名無しさん :2006/02/17(金) 23:01:19
別に正解がある訳じゃないけど皆さんはどういうコーディングをしていますか? 1.何らかの処理(範囲チェック、文字列⇔数値変換など)がない場合は、プロパティを使用せず フィールドをpublicで公開するか 2.自分自身のクラスのフィールドにアクセスするときでも必ずプロパティ経由でアクセスするか 3.自分自身のクラスの(1)フィールド(フォームデザイナが作成したコントロールのメンバも含む) (2)プロパティ(3)メソッドを呼び出すときに this.を頭につけるかつけないか ぜひ教えてください。
1)全部プロパティ。P/Invokeの構造体だけはフィールド直接公開することが多い。 2)フィールドに直アクセス。 privateならフィールドをプロパティに書き換えても影響ないから後で変更できるし。 3)thisは必ず。
>>662 参考にしたいので、(1)の理由を教えてください。
後で仕様変更(範囲の限定とか)したくなるかもしれないから。 プロパティの場合PropertyDescriptorであれこれしたりするとかの利用者の便宜が得られるので初めからそうしとく。 リフレクションをたまに使うので混乱しないように。
オレはthisつけない、後で仕様変更したくなるかもしれないから。
>>662 (3)ですが、VS2005だと「フィールドのカプセル化」で自動生成させると
thisがつきませんが、手動でつけてるんでしょうか?またメソッドや
フォームのコントロールもthisをつけてるということですよね。
結構大変なので、自分の場合つけたりつけなかったりで逆に読みづらいorz
エディタの個人的マクロでカプセル化するようにしてるから、VSの自動生成など知らぬ。
EncapsulateField.snippet などを書き換えるべし。
(1) publicフィールドは特殊な構造体や非同期結果保持クラス、Xmlシリアライズデータクラスなどのデータを保持するだけのクラスにしか用いない。 フィールド云々というより、むしろ、クラスはプロパティ(特性)を頭に浮かべて設計するので(I/Fにpublicフィールドなどない感じ (2) 変更可能性が高いと肌で感じたものやLazyInitializeなど特殊な処理をするもの)は 自分専用のプロパティをprivateプロパティで定義する (3) -プロパティにはthisをつける。 理由:プロパティの命名規則は先頭大文字だからクラス名と区別をつきやすくするため。 -フィールドにはthisをつけない。 理由:フィールドは_始まりでやってるため、thisをつけると冗長。Intelisenceが一文字で効くため
1クラスを、フリーソフトみたいな感じで一般公開するなら絶対プロパティだけど そんなことはまだやったこと無いから、結構publicプロパティも使ってる。 ただ、VS2005になってプロパティ作るのそんなに面倒じゃなくなったから最近はきちんとプロパティにしてたりする。 privateなクラスやinternalなクラスは相変わらずだけどね。 2ほとんどプロパティ使ったこと無いな。必要なのはどっちかって言うとメソッドになってたり。 3全部thisはつけない
1.publicは100%プロパティ。 ただしPrivate P/Invokeを除く。Internal P/Invokeはプロパティにする。 こうしとかないとそのクラスListBoxに突っ込んだりもできないじゃん。 2.フィールド直アクセス。 個人的にプロパティ経由アクセスと揺れてたんだけど、経験からこっちの ほうがきれいに書ける場合が多いと判断したのでこっちで。 3.大体つける。でも見通しが悪いと思ったらはずす。
672 :
670 :2006/02/18(土) 10:02:43
結構publicプロパティも使ってる。 ↓ 結構publicフィールドも使ってる
モーダルかモードレスかを引数で選べる、ダイアログを表示する関数を持つアンマネージドDLLがあって、 それをP/Invokeを使ってモードレスで表示すると、いろいろおかしくなるんですが モーダルで表示すると問題は発生しないです。 いろいろおかしい点: ダイアログを閉じれない。 推しても反応しないボタンがある。 ダイアログの中のタブを切り替えるとAccessViolationExceptionが発生する マネージド側で、モードレスダイアログを表示する関数をP/Invokeで呼び出す場合の一般的な注意点ってなにかありますか?
別にそんなものはない
モードレスの時にメッセージループ相当がないとか? モーダルなら自前ループがあるからね。
ちょっと質問です。 半透明のイメージを描画したいのですが、 DoubleBuffered = false; の状態で ImageAttributes.SetColorMatrix() を使って描画するとイメージの描画過程が目で追えるほどに遅くなります。 メモリ上のビットマップに描画してから画面に描画しても結果は同じでした。 DoubleBuffered = true; の状態では遅くなりませんでした。 この件について解決方法や代替手段などあったらよろしくお願いします。
httpのsessionIDがURLに埋め込まれてるのを管理するにはどうすればいいの?
httpのsessionIDって何?
>>677 むしろDoubleBufferedで軽い理由が知りたい。
半透明処理ってのはPerPixelで計算せんといかんからCPUでやると
SIMD使ってるんならまだしもろくな結果にならんはずだが…。
いや、処理自体はDoubleBufferedだろうが変わらんのだからそこじゃないな。
んー…ああ、わかった。たぶんあれだ。DoubleBufferedだと、システムメモリ上で
計算した上でbitblt(単純転送)できるからだ。
ビデオメモリ上でCPUからそれをやりゃ重くもなる罠。
682 :
677 :2006/02/19(日) 16:23:15
>>681 よく考えたらその通りですね。
半透明イメージを描画するときは何らかの形で画面上のイメージと演算処理をしなければならないわけで、
そのためのバッファがなければ遅くなるのは当然でした。
メモリ上のビットマップに描画してもだめだったと書いたんですが、
ビットマップを適当な色でクリアしてから描画したら高速に描画できました。
空のビットマップに半透明イメージを描画してもアルファのデータが残るようです。
というわけこの方法でうまくいきました。
どうもありがとうございました。
683 :
677 :2006/02/19(日) 16:32:24
と、「この方法で」じゃなかった。 上の方法は単なるテストで、実際は別の内容を含んだバッファの上に描画してます。
Eclipseに比べるとusingされてないクラスを入力したときの補完がめんどい。 Shift + Alt + F10はきつい。 しかもクラス名大文字小文字間違わず全部打ってからでないと出ないし。 EclipseみたくCtrl+Shiftで入力補完候補が出る時に、 usingしてないnamespaceのクラスも候補として出て、 それを選んだら、usingを自動的に出力するような風にはならんかなぁ。
Shift+Alt+F10がきついのなら適当なキーに当てればいいじゃない
>>684 お前みたいな香具師のために各種カスタマイズ機能があるわけですが
Eclipseとほぼ同じインタフェースにすることもできますが
687 :
684 :2006/02/19(日) 21:35:39
環境->キーボードからできるかもしれないと思ったんだけど、 どうもやりかたがわかりません。。。 先輩方、へたれなおいらにやり方教えてください。
>>687 オプション→環境→キーボード
「ショートカットキー」にフォーカスを当ててShift+Alt+F10を押す
「現在使用されているショートカット」に割り当てられているコマンドが出るから、その文字の一部を「以下の文字列を含むコマンドを表示」
に入力
#今回なら「スマートタグの表示」で十分
表示されたコマンドへのショートカットをお好きなように割り当てる
689 :
684 :2006/02/19(日) 22:20:50
おおう、そうか、今割り当てられてるキー押せばいいのか。 盲点だった。リストから検索したけど出てこなくて・・・アリガトン!
Java厨の初めてのC#体験中なんだけど、結構違うorz delegate+thread+invoke辺りが目新しくて面食らった。 あとプロパティはフィールドも宣言しないとダメなんだな。 public String Test { set { Test = value; } } とかして無限ループ。原因に気付くまで30分も掛ったよorz て言うか、プロパティ書くのが面倒くせー!ウィザードはどこ行った? 意外と行数食うし使うのには便利だけど記述性はあんまりよくないような? でも一番ビクーリしたのはbyte[]。なんじゃこれ?スゲー プリミティブ型みたいな顔してれっきとしたオブジェクト型。 変なの〜、キモ便利〜wwwww
>>690 プロパティはEclipseの「setter/getterを生成する」みたいな機能があると便利だよね。
Rubyを使うと更にキモ便利さが味わえるぞ
2005ならリファクタリングでフィールドをプロパティにカプセル化できるし アドインでプロパティを勝手に作ってくれるのもあるし
>>693 2005の一番の恩恵はフィールドのカプセル化だとおもた。
正直初めてコレ使ったとき、感動した。
>>693 お〜〜〜!プレビュー見て一瞬ハァ?とか思っちゃったけど
実行してみたらちゃんとプロパティが自動生成される。
いつもの習慣に従ってSNTP鯖&倉書きつつ学習中なんだ
けど、BeginReceiveに渡すユーザー定義オブジェクトを書く
のが面倒で面倒で泣きそうだったんだ、超サンクス激感謝。
できればプライベートフィールドを纏めてプロパティ化して
くれると嬉しいんだけど・・・・・・
そのアドインというのは、もしかしてそういう事をしてくれたり
なんかはするのかな?
Expressにはないんだね。(´・ω・`)
prop と打って Tab とか。
>>690 配列はJavaでもObjectだったことない?
C#にはプリミティブ型なんてないし
C:\Documents and Settings\%UserName%\Local Settings\History の中にあるindex.datをパースする便利クラスはないかな・・・
頑張れ
703 :
デフォルトの名無しさん :2006/02/22(水) 10:35:49
ボタンがマウスで押されてる間ある処理をしたいのですが、マウスダウンのイベントは 一度しかこないため「押されつづけている間」というのが判定できません。 マウスが押されたらスレッド起こして、離されたらスレッド終了みたいなことを しないとだめでしょうか。
スレッドにするかどうかはともかく、そう。
スレッド以外のやり方もあるってことですか? エンターキーが押されてる間 ってことならイベントが何度もくるので 特に何も考えなくてもいいんですが、マウスの場合は特別なことをしないといけない というのが本当に悩ましい。
GetAsyncKeyState() API では、いつでもマウスが押されてるかどうか分かるけど そういうこと?
イベントとしては無理でしょうね。マウスアップがくることが保証されていれば簡単ですけど
>>703 「押され続けている間」と一言で書いてますが、どう定義するつもりですか?
・アプリがアクティブな状態でマウス押下から押上まで
→MouseDown/Upで判別
・アプリ上でマウス押下状態なら全て(アプリ外でマウス押下されてポインタが移動しても対象とする)
→MouseDown/Upとドラッグ系のイベントを併用
・アプリ上に限定せずマウス押下から押上まで
→ポインタをキャプチャ
質問が漠然としすぎ。
>>708 ボタンが押されてる間って書いてあるじゃん
710 :
703 :2006/02/22(水) 12:34:32
>>706 ボタンがクリックされた時のイベントハンドラの中でループで回してマウスの状態を
調べるってことでしょうか?
それだとその間は再描画されないのでちょっと不都合です。
とりあえずスレッドで処理するようにしますが、何かいい案がありましたら
お知恵をお借りしたい。
例:タイマ 大体「処理」ってなんだ「処理」って そんな曖昧なので案も出せるか
>>711 なんの処理かは関係ないだろ?直行性も理解できないアホか?
>>709 アプリ内でのボタン押下→押上
と
アプリ外でのボタン押下→アプリ上に移動
は
別の処理だってゲイツ君が言ってたぉ
>>710 どういう処理したいの?
ゲームでありがちな処理したいってこと?
もしそうならフレームの概念とアルゴリズムを勉強したほうが良いよ
>>715 得意げに答えて満足感を得るのは止めてください。
例えば、
>もしそうならフレームの概念とアルゴリズムを勉強したほうが良いよ
ですが、そのような抽象的な指摘で、
>>710 が今からフレームの概念の本とアルゴリズム入門の本を買いに行くと思いますか?
よって、
>>715 のレスはこのスレ始まって以来の駄レスと考えます。
私は、それを指摘したのでセーフだと考えます。
717 :
703 :2006/02/22(水) 13:16:19
>>714 なるほど。それでいいですね。
GetAsyncKeyState()でマウスの状態を調べて、押されてる間ループで回して
そのなかで描画もするようにすればいいだけですね。
ありがとうございました。
なんか荒れてる気がしますがスルーしときます。
>>716 否定は何も生まない
尊大な態度は真実を遠ざけると知ろう
で、どういう処理したいの?
それに回答しなきゃみんな漠然とした回答しかできないんだけど
ありがちな処理なら定石がある
漠然とした質問には漠然とした回答しかできないから
>>715 の回答も一つの解だと思われ
>>717 Paintを呼ぶよりは
Application.DoEvents()を読んだ方がいいんじゃ?
720 :
715 :2006/02/22(水) 13:21:20
>>716 は?自己満足で回答しちゃいかんのか?
平日日中に無料で知識を曝すのに自己満足も得ちゃいけないとは厳しいね
ここではもう二度と回答側にはなりません
>>717 ゲームみたいなを作ってるならDirectXの仕組みを真似るって手もあるよ
WindowsフォームでDirectXを使う場合はメッセージループを自力で作るから、同じようにマウス確認用のループをフォームとは別に持つって考え方もある。
なんでこの程度の質問で、質問が曖昧だとかフレームや
アルゴリズムがどうこういう話になるんだか。
>>720 その約束絶対守れよ。みんなよろこぶぞw
答えてやってんだからピントはずれでも感謝しろってか
>>720 まぁまぁ、IDが付かないスレでいきり立ってもしょうがないでしょ。
気にするな。
ただ、
>>715 のレス内に知識と呼べるものは無かったが。
ストレスイクナイ。
void MouseDown(oject sender, MouseEventArgs e)
途中でかきこんじゃった・・・ こんな感じかな。 勘違いしてたらスルーしてください。 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; }
727 :
703 :2006/02/22(水) 13:42:08
>>726 そういうことですね。みんな どうもありがとう!!
質問なんだけど 内部にIDisposableを実装するクラスのインスタンスを使用して、 なおかつそのインスタンスには外部から直接アクセスできないクラスについてなんだけど 例えばこんな感じ class Class1{ MemoryStream ms = new MemoryStream(); } MemoryStreamがきちんとデストラクタが実装されているという前提の場合は Class1はIDisposableは実装する必要ありだけどデストラクタは必要ないですよね?
そう言う実装もあるな。 StreamWriter / StreamReader なんかがそうだ。
普通はデストラクタでDisposeを呼ぶんじゃないの? もちろんDisposeの中ではSuppressFinalizeだかなんかして
>>730 普通はそうなんだが、包含してるクラスの Dispose が必ず呼ばれるとまずい、と言う場合がある。
>>729 が挙げたのなんかまさにそうだが。
例えばFileStreamを開いて、Streamを要求するメソッドに渡す。
メソッドは内部でStreamReaderを使って文字列を返す。
このとき、StreamReaderのファイナライザでDisposeを呼んじゃうと、呼び出し元で突然FileStreamを使えなくなってしまう。
だからStreamReaderはファイナライザを定義しない。
明示的にユーザがDisposeを呼んだときだけストリームを閉じる。
>>730 デストラクタで呼ぶのはDispose(false)
Dispose()はDispose(true)呼んでSuppressFinalizeだねぇ。
733 :
728 :2006/02/22(水) 23:09:10
いや、728の例だとMemoryStreamは外部から与えられるものじゃないし、外部からはアクセスできないです。 んで、デストラクタを定義して、Disposeを呼び忘れたときでもMemoryStreamが解放されるようにしろって 解説している人がいたんで疑問に思って質問しました。 なんでデストラクタを定義する必要がないと思ったかと言うと、Class1のインスタンスがGCになったときに その内部のmsもGCが回収するからです。
>>733 デストラクタでのアンマネージドリソースの開放はセーフティネットだから、
アンマネージドリソースを管理しているクラスを包含しているならDisposeは実装しとかないといかんと思う。
もっともMemoryStreamはメモリしか使っていないから放置していてもいいのかもしれないが。
ちょっと例が悪いかも。
>>733 その理解で間違ってないよ。
基本的にマネージクラスはマネージとして扱いなさい。
ファイナライザまで、つまりDispose(false)で処理しなくてはならないレベルは
private IntPtr ptr;
みたいに直接そのクラスがアンマネージ情報を持っている場合。
ところがこの場合も2.0になってSafeHandleみたいなのが出来ちゃったしなぁ、
あまりすることもなくなったかも。
ちなみにそれはJ○tta?
基本的にDisposeを実装しなければならないことはほとんどない。 実装した方がいい場合はたまにある
アンマネージドリソースを持つ場合はDispose(false)とデストラクタを実装する。 IDisposable実装クラスのインスタンスを持つ場合は、必要に応じてDisposable(true)を実装する。 「アンマネージドリソースを持つ」っていう解説は良く見かけるけど、Streamは*アンマネージドリソース*ではないので注意
お約束:ファイナライザでは他の参照型マネージドオブジェクトに触っちゃ駄目!
739 :
730 :2006/02/23(木) 00:19:55
740 :
728 :2006/02/23(木) 00:24:29
回答ありがとうございました
レス見ていろいろ調べたら、
>>738 さんの言うとおり、むしろ実装してはいけないんだね。
don't need to じゃなくて must not だとは思わなかった(;^▽^)
>>735 >ちなみにそれはJ○tta?
ええw
ブログ読んで疑問に思って、指摘しようと思ったんだけど自信がなくて
んでいま調べてたら「例を間違った」とコメントしてました。
void Class1::Dispose(bool disposing) { if (disposing) ms.Dispose(); } つまりこういうこっちゃね。
やばー、Dispose実装しているクラスでは デストラクタでIDisposable.Dispose()呼び出してる。というパターンのコード結構あった Dispose(false)な制御フローでは参照マネージオブジェクト触っちゃダメだったってことか
Disposeはアンマネージリソースを開放する目的で存在するって思想が そもそも気に入らない。 だったらComponentのDisposeってなんやねんとか。 必要である事情は分かるが、いきなり前提崩してるし。
DisposeネタはGDNJでもVSUGでも盛り上がったね MSDN Forumでもまた同じ事が繰り返されそうな悪寒
たとえばSystem.Data.DataTableはIDisposableを実装してますが public void Dispose()をvirtualにしていません。 これはDataTableを継承したらDispose()はいじらなくていいですよ、 ていうかむしろいじるな、やらせはせんっていうことですか? どうせDispose()はDispose(true)しているだけだから、 いじるならprotected virtual void Dispose(bool)をいじれ、 ということでしょうか?
つかpublic Dispose()をvirtualにしてるのって.NETの標準ライブラリにあったっけ? virtualなのは全部protected Dispose(bool)のはずだけど。
本当にないのかどうかは知らんが、基本的にそういう思想になってるとおも
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[*,*]をいじる処理 }
ref は参照を渡すことになるから、参照型と合わせてポインタのポインタと言うことになるが。
>>749 string [][] sではどうですか?
VBの配列はSAFEARRAYだからC++でCOM作るときも結構面倒だった記憶があります。
ちょっと質問があります。 IntPtr から IntPtr へデータを直接コピーをしたいのですがどうすればよいのでしょう。 System.Runtime.InteropServices.Marshal.Copy には相当するオーバーロードがないようです。
・一旦バッファにコピー ・CopyMemory を DllImport
>>753 なるほど。速度重視でいきたいのでCopyMemoryのほうにしたいと思います。
どうもありがとうございました。
755 :
749 :2006/02/24(金) 01:33:59
>>750 refをはずしても同じエラーが出ました。
ちなみにs(0, 0)を渡してC#内でReDimして値を入れて返すというのは成功したのですが、
この時はrefを付けていました。
>>751 試してみたのですが、C#側の変更だけでは引数の型が違うといわれます。
VB6.0では配列の配列はどのように記述すれば良いのでしょう?
SafeArrayを調べてみたのですが、System.Arrayなら何とかなる・・・のかな?
object[,] ならどだ?
あ、object[][]かもしれんが。
オライリーの4版って、本屋に置いてますか? なんか見つかんない...onz
昨日は何もないよい一日でした。 明日も何もないよい一日でありますように。
週末はみんな仕事したくないので何もなかったのです その代わり休日は厄介な日曜プログラム厨が沸きます
>>759 今日見かけたよ
でももうアマゾンで注文済み
VS2005のwebbrowserでINPUT要素をクリックする方法が分かりません。 vs2003のaxWebBrowserならやり方わかるんですけど、どうもいろいろかわってしまったようで。 頑張ってぐぐったりMSDN Libaryと睨めっこしてみたんですが、お手上げです。 だれかわかる人いたら教えてください。 またはwebrowserの扱い方で参考になるページなどありましたら幸いです。
普通に click で InvokeMethod するだけだが。
あ、InvokeMethod じゃなくて InvokeMember だった。
>765 ありがとうございます! browser.Document.GetElementById("submit").InvokeMember("Click"); で、クリックすることができました。 分かりにくいですね、これ(汗
768 :
デフォルトの名無しさん :2006/02/25(土) 22:50:29
先生、delegate があるのに、 なぜ event がキーワードとして 使われているのかが分かりません。 delegate と event の違いは何ですか? event では += と -= としか使えなくなるとか? ほかにどんな違いがありますか?
delegate は型。class とか struct とかと同じ。 event は プロパティの一形態。主にデリゲートインスタンスをカプセル化したもの。 event が用意された理由はまあ色々あるが、簡単なところとしては ・孫クラスが勝手に子クラスや曾孫クラスの登録したイベントハンドラを消したら困る ・であるにも関わらず、デリゲートインスタンスを公開するプロパティではこれに対応できない
2進数を書式指定して表示する方法について質問します。 ある整数、例えば41を2進数で表示すると"101001"ってなりますよねぇ。 これは、Convert.ToString(41, 2) で簡単に実現できるんですけど、 頭を0埋めして全体で8桁にする、つまり"00101001"って表示するための 書式指定ってないでしょうか? 10進数や16進数なら String.Format("{0:D8}", 41) とか String.Format("{0:X8}", 41) とか 指定できるんですけど。。。 どなたか頭冴えてる方、よろしくお願いします。。。
PadLeftすればいいじゃない
イベントってのは内部実装に依存しないってのは重要だと思うぞ。 コンポーネントのインターフェイスとしての側面というか。 現実としては、例えばコントロールなど大量のイベントをどう実装するのか、など。 この辺の柔軟性は、言ってみればメンバフィールドとプロパティの関係にも似てる。
>>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アクセサメソッド。
・イベントメタデータ
を生成している。
ToolStripについて質問です。 ToolStripを動かすときに MenuStripの上にToolStripを配置させない方法はどのようにすればよいでしょうか? (MenuStripはアプリのタイトルの下に常にいてほしい)
>>771 PadLeftなんて関数があったんだ!
長いことStringクラス使ってって初めて気が付きましたw
ありがとうございました(・∀・)
>>774 - FormにMenuStripを単品で追加(MenuStripControlの上に追加しない)
- MenuStripのDockをTopにする
- FormにMenuStripContainerを追加しDockをFillにする
あとは移動しても良いToolStripはMenuStripContainerに追加すればよし。
おお、目からうろこです。何で気づかなかったんだろう。ありがとうございました。
領域に合わせてテキストを改行するラベルのような物を作ろうとしています。 Graphics::MeasureStringで文字列が占める領域が分かりますが、 ある領域に収まる文字列長を取得するメソッドは無いのでしょうか。 2分探索の要領でMeasureStringを何回も呼ぶと言うのは面倒かつ速度が出ないようなので これ以外の方法をお願いします。
>>778 長さはフォントと文字列によるんだからぶっちゃけ無理だろ。それ以上の
ことがしたいんなら直接Fontを使って調べろ。
というか、Graphics.DrawStringにRectangle指定するやつがあるだろ、それ
使えば折り返しもやってくれるぞ。
モードはStringFormatで指定。
>>779 自動に頼ってしまうと今度は何文字表示できたかが分からんくなるんですよ。
>>780 んなのMeasureCharacterRangesでも使えばええやないか
>>781 Graphics.MeasureString メソッド (String, Font, SizeF, StringFormat, Int32, Int32)
で何とかなりそうです。超ありがとうございました。
783 :
デフォルトの名無しさん :2006/02/26(日) 16:39:03
>>779 s パラメータによって表されるテキストは、 layoutRectangle パラメータによって表される四角形の内部に描画されます。四角形の内部に収まらないテキストは切り捨てられます。
騙さないでください。。。。
RectangleFの引数にRectangle渡してるし。
labelの機能で-入れると自動で-がある場所で改行されるんだが、 それを対処にGraphics#MesureStringの引数が最も多いメソッド使って何とかした覚えがある。 たとえば、[label-text]を表示させるときに幅が足りないと左のようになってた [label- --> [label-tex text] t]
C#2.0+.NET2.0で、uintの上位ワードと下位ワードをushortとして切り出す関数って知ってます? Win32のLOWORDとHIWORDマクロみたいな 0xFFFFで論理積取ったり0x10000の商を取ったりで算出はできるんですが、一発関数があるかなと思いまして System.Convertあたりにあるかなと思いましたが見つけられませんでした
>>788 やり方分かってるならそれでやればいいじゃん。そんなに細かい
処理に対してライブラリがいちいち関数を提供してたら、肥大化して
どうしようもなくなる。
791 :
789 :2006/02/26(日) 22:33:44
793 :
デフォルトの名無しさん :2006/02/26(日) 22:34:39
ListViewの行幅って変えられますか?ある特定の行だけ30Pixelにするとか
行の幅? 列の幅ならColumnHeader.Widthだが。 行の高さは無理。
796 :
788 :2006/02/26(日) 23:03:53
>>789 Win32SDKには標準でマクロがあったので、.NET Frameworkにも無いか疑問に思った次第です
>>792 上記理由意外に、できるだけリテラル値をコードに埋め込みたくないという思いがあります
また、定型的な処理なのに毎回計算式を埋め込むのも気持ち悪いという思いも
#現在は上記2点をできるだけクリアするため自作の関数で対処しています
このような発想からFrameworkで関数が準備されていないかなと思いました
こういう発想は一般的じゃないんですね orz
汎用マクロクラスでも自作すれば? できたらクレクレ
>>796 C#の関数は基本的に動的バインディングだから、作ってないだけじゃない?
クリティカルな部分で使うと遅いし。
>C#の関数は基本的に動的バインディングだから くわしく
関数とマクロは重さが絶対的に違うわな #defineで定義されてるだけのLOWORDとかは展開されてからコンパイルされるわけだし 呼び出しのオーバーヘッドを無視してもコードの見通しを良くしたいなら関数化してもいいだろうけど、そういうのが看過できない処理ならリテラルと計算式を埋め込むのも仕方なしかと
ま、いまさらそんなことが全体のパフォーマンスに影響することはないけどね。 そのレベルのチューニングしなきゃならん開発ならMFCでやれってことだ。
JITで関数がかってにインライン展開されることもあるからC#じゃほとんど誤差範囲。
Win32SDKだと次の定義になってる。この程度なら直接書こうが関数にしようが問題なし。 #define LOWORD(l) ((WORD)((DWORD_PTR)(l) & 0xffff)) #define HIWORD(l) ((WORD)((DWORD_PTR)(l) >> 16)) こういうのがC#で必要になるのはP/Invokeを使ってるか、 固定レコードタイプのネットワークパケットを扱ってるかくらいしか思い浮かばない。
大したもんじゃないならなんで実装されていないんだろ? 滅多に使われないような関数を作るくらいなら、Win32SDKにあったマクロを実装してもいいだろうに
そんな古くさい手法は捨てろと言うお達し。 つか「大したもんじゃないから実装しよう」をやると果てしなく膨れあがるだろ
int32とかint64をバイト配列に変換するのがあったはずだけど忘れた
System.BitConverter クラスだ
>>805 へ?何が古臭いの???
バイト操作・ビット操作って古臭いとかそういう次元で語ることなの?
ビット演算はともかく、uintをushort2つに分解というのは古臭いな
>>803 の言う感じに
>>808 ちゅーより一つの値に二つぶち込むって発想はまぁ、なんだ、
その、あれだ。ビット演算程度ならいいんだけどさ。CLRなら
Enumもあるし。
あと、P/Invokeとかの互換部分って普通internalにして隠すんだわ。
古臭いAPIを一新するための.netライブラリだというのに
メモリサイズ節約なら普通にushort使えばいいし・・・ なんなら構造体定義すりゃいいし・・・
ファイル操作とかデータ操作系のアプリ書いてると普通にビット/バイト操作って出てくるけど ドライバとかDLLと通信するとDWORDで来てWORDやBYTEを切り出すとか普通の処理 業務アプリやテキスト操作だけがプログラムじゃないよ
24bitのPCMデータを扱うのが非常にめんどくさいことに今気付いた
>>813 どっちも C#/.NET とはほぼ関係ない話だな
>>814 24bit と言えばビットマップデータも
816 :
813 :2006/02/27(月) 17:13:08
>>815 おいおい関係ないわけないだろw
うちはC#+.NET1.1でそういうアプリ組んでるんだし
ライブラリが充実してるからC/C++でゴリゴリ書くより楽でいいよ
その上で普通にビット/バイト操作があるって言ってるわけで
逆を言えばC/C++でも業務アプリ書いてりゃ滅多にビット/バイト操作は無い
型のありのままでのデータ操作がほとんど
色々なアプリケーションの形があるんだから、操作の種類によって古臭いとか新しいとか無関係とかないわけですよ
所詮メモリ上のデータを操作するのがプログラムなんだから
ふらっとC#スレと重複質問になっちゃって申し訳ないんだけど、こっちの方が人多そうなので。 Visual C# のインストール中に インストールコンポーネントを読み込んでいます。この処理には1〜2分かかる可能性があります。 って表示されたまま永久放置なんだけど、なんで? 常駐ソフトもサービスも全部切っても先に進まないんだけど・・
・マルチと分かってるなら向こうの質問取り下げるのが礼儀 ・環境も書いてない ・β等のインストール履歴も分からない 結論:氏ね
マルチってのは無闇やたらと色んな場所で質問すること。 反応がありそうないくつかの場所で質問するのは当たり前。 解決したら当然全部にお礼して回るよ。 なんでもマルチって書けばいいと思ってる人は言葉の意味を考え直した方がいい。 環境は XP Pro SP2、 Visual C#をインストールするのはこれが初めてです。
擁護意見を書くときは自演しといたほうが無難
せめて元スレッドで一言断っとこうぜ?
>>817 >常駐ソフトもサービスも全部切っても先に進まないんだけど・・
常駐ソフトやサービスを切ることが好影響としか考えられないの?
それとそんなのこのスレで聞いても分からないからM$に聞いてくれ
823 :
817 :2006/02/27(月) 18:41:18
>>820 了解
>>821 んじゃいってくる
1000行きそうだったから変に書き込まない方がいいかなと
>>822 ぐぐったらPart10くらいでアンチウィルス切ったら通ったとか書いてあったので。
とりあえず無関係そうなのから切っていって最終的にMSのサービス以外は全部切ったけどダメだった。
まー色々試してみます。thxでした。
>>817 異常な状態と言うのは普通の人には起きないから異常
であればできるだけ詳細な情報を提供すべし
例えばこの辺り
・ハードウェア構成
・OSのインストールバージョンとサービスパック
・Microsoft Updateをどれだけ当てたか
・システムに影響しそうなソフト(OfficeやIEなど)のバージョン
・インストール時に実行していたソフト
・インストールしたVC#のバージョンと入手先(MSDNでは稀にアップされた版が間違っている場合がある)
あとそのメッセージは一体どこまで進行したかを明記
「インストール中に」だけではエスパー以外は分からない
また、インストールオプションも明記しないと何が怪しそうか見当もつかない
最も大事なのはその異常に対してどこまで原因調査の絞込みを行ったか明記すること
例えば「インストールオプションを○○まで絞りました」とか「ウィルス対策ソフトは○○で、メニューから無効にしています」とか
とにかく「今自分に起きている状態は他人には滅多に起きない異常事態」と認識し、情報を提供せよ
超能力者に聞くような質問をするから煽られる
これを自業自得と言う
このスレ見てるとPGは対人能力に問題ある人が多いってのが良く分かる
テキストボックス内の文字列のサイズを知りたいのですが、方法が分かりません。 例えば以下のような文字列がTextプロパティに設定されているとすると --------------------- 12345678 2345 345678 --------------------- 横幅は半角8文字分、縦幅は3文字分の四角の中と分かりますが、これの具体的なピクセル数を知りたいです MS ゴシックなどの固定幅であれば掛け算で算出できますが、プロポーショナルフォントを使っている場合が分かりません 全ての文字の幅を調べて足し算するしかないのでしょうか?
828 :
デフォルトの名無しさん :2006/02/27(月) 22:30:02
質問です。 C♯で独自のウインドウメッセージを送りたい、また受信したいのですが Cで言う所のWM_APPみたいなのって、C♯にはないのでしょうか? あと、WM_APP+1みたいに使っていくのも嫌なので、何か空いてるメッセージIDを生成してくれるような関数はないのでしょうか?
>>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 のライブラリ設計として妥当なのでしょうか?
俺なら敗者。
後者かなあ。 Dictionaryは、データの本質がDictionaryな場合にのみ外に見えるべきであって アセンブリのロードだの解放だのって機能は、Dictionaryデータ構造を持つのが 本質ではない気がするから。
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にしたのが行けなかったのでしょうか?
extern "C" とか その辺りは?
絶対に後者 迷う余地はない
class PluginDictionary: IDictionary<string, AppDomain>
Dictionaryのインタフェースを使ってイロイロできるので使いやすい。かもしれない。
といいつつ、俺も後者。
用途的に使用するインタフェースが少なそうだから。&ほぼ
>>833 と理由同じ
2)みたいに継承はしない 仕様みるとis-a関係っぽくないし。
あとdllexportは?.defファイル?
839 :
830 :2006/02/27(月) 23:54:55
>>831 >>833 >>836 >>837 ありがとうございます。後者にします。
# Dictionary に限らず、便利なクラスを眺めていると、どうしても
# 本来の意味付けから外れたような使い方ばかり浮かんでしまいます。
# これからは気をつけるように心がけようと思います。
840 :
817 :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#使いの間では有名な現象で、聞いたらすぐわかるかもって思ったんだよね
C#de共用体みたいのはありますか?
>>840 最初から入手先とインストール形態を明記していたら違った回答が来たに違いない
無料のExpress版は色々と報告されていたはずだし
#最初はWebインストールをすると公開しときながらiso公開でこれも問題になったそうだ
844 :
834 :2006/02/28(火) 00:06:02
すみません。勘違いしてました。
え〜と、
C++で
main.cppで
#define DllExport extern "C" __declspec (dllexport)
と
DllExport BOOL foobar(HWND hWnd, UINT Msg);
がありまして。
C♯側から、
>>834 と同様に書いて呼び出しても同じ結果になります。
ASP.NETでC#のユーザコントロールとか呼び出す時って COMの相互運用チェックしてたC#のライブラリコンパイルして ASP側でぺたっと貼り付ければいいんだっけ?
>>844 うーん?なんかC++のほうが間違ってそうなメッセージなんだよね。
Dependency Walkerできちんとexportしてるか確認してみて。
まさかCLRバイナリでコンパイルしたわけではないよね?
>>847 Dependency Walkerでもちゃんとexportされてますし
CLRオプションはつけてません。
>>834 の
[DllImport("foobar.dlll", CharSet = CharSet.Auto)]
dlllってのはただのタイプミス?
850 :
844 :2006/02/28(火) 00:48:19
>>844 dumpbin /exports foobar.dll
で期待してる名前でExportされているか確認
852 :
844 :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
こんな感じです。
AxWebBrowserから.NET 2.0で標準搭載された WebBrowserコントロールへ移行しています。 従来のAxWebBrowser.GetOcx()で得ることができたOLE?オブジェクトを WebBrowserから得たいのですがどうすればよいでしょう? 本来の目的はjavascriptでウィンドウが閉じられたときに WindowClosingイベントを受け取りたいだけなんですが。
>>852 もしかしてC++ってボーランドC++だったり?
昔ボーランド系で勝手に関数名の前にアンダースコア付けられて
難儀した覚えが
>>853 HtmlWindow.AttachEventHandler で対応できないか?
ActiveXインスタンスはWebBrowser.ActiveXInstanceやらHtmlDocument.DomDocumentやらHtmlWindow.DomWindowで取れるが。
>>834 の奴はなかなか解決してませんね。
exportはきちんと出来ていそうですが…
.defはもう使うなって扱いだと思ったんですがどうでしょう。
エラーメッセージからするとERROR_BAD_FORMATのようだけど
なんかC++側で出てるような気がするんですが。
DLLが自作なら、DLL側のプロジェクトを立ち上げて
プロセスにアタッチして、トレースかけられませんか?
(CLRで可能かどうか知りませんが)
切り分けの為に、DLLを呼び出すだけの簡単なプログラムを作って
「C++から」DLLの呼び出しが可能かどうかチェックするのも良いかもです。
858 :
834 :2006/02/28(火) 03:52:11
解決しました・・・。 どういうわけか、C♯側でCPUタイプをANYに設定していたのを x86に変えたら直りました・・・。 実は私の環境、x64のWinXPなんです。 恐らくANYにした事で、X64環境では64bitモードとして、X86環境では32bitモードで動くバイナリが出来てしまったのではないかと・・・。 で、参照しているDLLは32bitなので、フォーマットが違う と言う風になったのだと思います。 お騒がせして申し訳ありませんでした。
質問です。 C#のプログラムに、文字列としてstring型ではなく、char型の配列として ポインタをウインドウメッセージとして送るプログラムがあるのですが この場合、C#側のプログラム内でアンマネージドモードに変えて、そのcharのポインタをstring型に変えて処理する必要があるのでしょうか? 具体的には protected override void WndProc(ref Message m){ string = m.WParam.ToString() base.WndProc(ref m); } こういう感じの変換では、出来ないのでしょうか? 単純にアドレスがstring型になってしまうだけですかね?
>>859 そういうとき何でまずMarshalクラスをみんかね…
つ Marshal.PtrToStringAuto
861 :
853 :2006/02/28(火) 10:25:05
862 :
853 :2006/02/28(火) 14:41:32
自己レス。やっぱだめ。Unloadが呼ばれないときもある。 てか、そもそもなんでWindowClosingイベントが呼ばれないんだ・・・
863 :
デフォルトの名無しさん :2006/02/28(火) 15:06:27
あらかじめ言っておくけど、 .NETではグローバル・フックはできないからね(・∀・)
866 :
853 :2006/02/28(火) 23:39:15
DWebBrowserEvents2です。 (SHDocVw.WebBrowser)webBrowser.ActiveXInstance; ってキャストしてWindowClosingハンドリングしても、 IEEventsでWindowClosingハンドリングしてもイベントがきません。 結局、タイマーで監視してDocumentがnullになったら ウィンドウが閉じられたと判断しようかとおもいます。
>>866 キャストしてイベント登録でいけるんかな?してるとして、どこでしてる?
一応ドキュメントにはCreateSinkでConnectionPointCookieつくるように
かいてあるんやけど。イベント登録にそのコードが入っている?
なんでManagedWebBrowser使ってんのに SHDocVw参照してるんだよ。意味ないじゃん。
>>868 めんどいんだよ。手動で全部定義する必要があるから(動くことを確認したら
これにしたほうがいいけど)。拡張したことないんなら黙ってろ。
873 :
853 :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に戻しても良いかな。
>>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.
これは満たしてる?よなぁたぶん
875 :
874 :2006/03/01(水) 01:06:29
あごめん、勘違いしてた。「発生しない」わけではないのか。
876 :
853 :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);
C# 2.0 でのデリゲートインスタンスに new HogeEventHandler( ) が不要になったありがたみが分かるコードだな
RichTextBoxでテキストの選択をさせない方法をどなたかご存じないでしょうか。 ReadOnlyだけでは選択が可能ですし、SetStyleでControlStyles.UserMouseを有効にしたりキー操作を無効にしてもカーソルは表示されてしまいます。 コードからの選択やスクロールは行わせたいので、Labelなどでは実現できません。 選択は無理でも最悪スクロールだけでも行わせたいです。 Win32APIを使う方法でも良いですので、実現方法をご存知の方は教えてください。
かなりとんちがきいてるが正しいな。
>>879 確かに、
Enabled=falseにしてスクロールバーを別途配置。
スクロールのイベント取ってコードからRichTextをスクロールでいけないかな?
885 :
デフォルトの名無しさん :2006/03/01(水) 19:20:09
パネルの中にRichTextほおりこんで、 パネルよりでっかいサイズにしたら駄目?
886 :
879 :2006/03/01(水) 19:24:48
>>880 それも考えたのですが、スクロールバーまでdisableになってしまいます
また、色もグレーアウトしてしまいますので。。。
先に書いておくべきでした、すみません
>>882 すみません、「コードから」が掛かるのは「選択」だけです
スクロールはマウスからも行いたいのです
>>884 スクロールバーとの組み合わせですか
色を解決できれば使えそうですね
色の変更方法と合わせて調査してみます
>>884 ん?ユーザーからは選択もスクロールもさせたくないんじゃないのか?
コードからのみしたいって話で。
>>886 何、つまりスクロールはさせたいが選択はさせたくない?
選択って何?ハイライトさせたいだけ?
ならんなものPanel継承して自分で作れ。それのほうが早い。
>>885 それも考えたのですが、そうすると、選択してもスクロールしない、テキストに合わせたサイズにできない、など動作の違いが出るので止めました。
内部のテキストのサイズを計測して同じサイズにすれば良いかとも思いましたが上手く解決できませんでした(
>>826 は私です)
>>887 不明確な言葉ですみません
スクロールはユーザにさせたいのです
>>888 RichTextBoxと同等の描画機能(RTFによるフォーマット)を実装する必要があるので工数的に厳しいです
というかRTFのパーサを組むと考えるだけでも頭がクラクラします・・・
>>889 RichTextBox を継承したコントロールを作って、WndProc をオーバーライドして
WM_LBUTTONDOWN 等を捨ててしまえばいいのでは・・・
>>889 private void richTextBox1_SelectionChanged( object sender, EventArgs e )
{
richTextBox1.SelectionLength = 0;
}
カーソルは表示されるけど
同じような要件があってこういう風に実装してる 1.ReadOnlyプロパティをtrueに設定 2.TabStopプロパティをfalseに設定 3.Enterイベントで適当なコントロールのFocus()を呼んでフォーカスを飛ばす(次のタブインデックスのコントロールなど) 4.SelectionChangedイベントで現在の選択範囲を維持するようにする(Enterの時点で選択が解除されるため/コードで選択した範囲はクラス内で保持しておく) ・タブオーダーに影響しない ・ユーザ操作では選択されない ・ユーザ操作でスクロールできる ・コードから選択範囲を変更可能 ・RTFテキストが使用できる
7÷2=3...1ですがこのあまりの1を使うにはどうすればよいですか 答えの3は/で使えました
>>893 「演算子」で検索すればでてくるよ。
とりあえずShiftキーを押さえながら5を押すんだ。
>894さん 「演算子 [C#]」に%演算子というものがありました 7%3にすると1が使えました ありがとうございました >895さん 7%3でも1が使えました ありがとうございました
897 :
デフォルトの名無しさん :2006/03/02(木) 18:31:28
>896 まちがえました まえのは7%2でつぎのが7%3でした どちらも1がとれました ありがとうございました
>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;
>>899 それだけじゃわかんね。
DataTableに追加するところと、Updateするところはどないになっとる?
ビルドでコピーしてるんだろう。
失礼します。 C#の初心者専用スレが見つからなかったので、ここでよろしいかわからないのですが、質問があります。 PanelのAutoScrollをtrueにし、その上にピクチャーボックスを貼り付けています。 うまいぐあいに「大きい画像には自動的にスクロールバーがつき、スクロールさせて見られる」という仕組みができました。 ただ、Panelに十分な横幅を持たせているのにも関わらず、横幅がPanel幅未満の画像をロードしても 横スクロールバーが無効になってくれません。 無効になってくれないだけではなく、ちょびっとだけ画像のが隠れてしまい、スクロールしないと全横幅が見られなくなってしまいます。 どうも縦スクロールバーの幅の分だけ隠れてしまうようなのですが、これに対処するプロパティなどはありますでしょうか?
SqlCommand.ExecuteNonQueryじゃだめなんだろうか。 SqlDataAdapterを使う意図が感じられんのだが。
905 :
988 :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);}
>>903 再現しないんだが。
PictureBox のサイズはどうやってるんだ?
>>906 回避も何も、どっかで変なことやってるんだろう。
ブレークポイント設置してどこでListViewItemのラベルが変更されてるかチェックしていってみろよ。
//恐ろしく読みづらく且つ意味のない例示コードだな。
リドロウがうまく言ってないだけじゃないの? listView_Local_AfterLabelEditの最後で listView->Invalidate(); でもしてみたら?
>>905 いや、そのコード根本的な部分で間違いまくってるから。
ADO.NET周りのドキュメントやらチュートリアルやら@ITあたりの入門記事やらを
読んで最低限の知識ぐらいはつけて。
んん〜? (200,200) の Panel に乗った PictureBox に (190, 210) のイメージを読み込ませたらスクロールバーが両方出ちゃうってこと? そりゃ当たり前の動作だが。 縦スクロールバーが表示されて、その縦スクロールバーのために横表示領域が 200 より小さくなるからな。 (200 - SystemInformation.VerticalScrollBarWidth, 210) のイメージなら当然縦スクロールバーのみだし。
>>912 はい。
ただ、Panelが十分横に大きいのだから「横スクロールバーは消える」「縦スクロールバーだけになる」というのが最も望ましい結果です。
もしそれは(縦スクロールバーのせいで)難しいのであれば、「バーが消える」のではなく「バーが無効になる」動作でも構わないと思っています。
横に十分な大きさがあるのに、スクロールしないと横の全景が見えないのは不満かと思います。
(そういえばIEでフレームが使われているページにいくと、十分横にIEを広げても同じ現象になりますね)
914 :
898 :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(); }
>>913 それはつまり(画像を表示できる幅を減らさないように)
幅ゼロで縦スクロールバーを表示して欲しいということですか?
プログラムは簡単になるでしょうけれども、実現不可能なような気がします。
913 の言うことは、横は十分表示してるから最後の数ピクセルは切れてても良いよね、ってことなのかなぁ。
>>915 いえ。縦スクロールバーを考慮に入れた上で、十分な横幅を確保して欲しいということです。
■が画像
□がスクロールバーだとします。
横4■, 縦10■ の画像をセットすると↓こうなってしまいます。
■■■□
■■■□
■■■□
■■■□
■■■□
□□□
私としては
■■■■□
■■■■□
■■■■□
■■■■□
■■■■□
こうなって欲しいわけです。それができるくらい十分に横幅がある(それくらいスペース空けてる)のですから。
もしくはせめて
■■■■□
■■■■□
■■■■□
■■■■□
■■■■□
□□□□
こうなって欲しいのです。横スクロールバーは、いわゆる触れない「無効なスクロールバー」ですが。
それどうみても Panel のサイズが変わってるんだが。 そう言う解決で良いのなら画像変えるときに Panel のサイズ変更すれば良いだけだろ。
要は縦横のoverflowで別々にスクロールバーを出したり出したくなかったりしたいってことだろ? AutoScrollでは無理 ユーザコントロールで自力でスクロールバーの表示制御をするコントロールを作るべし
>>918 AutoScrollをTRUEにしていると、Panelのサイズがかわったごとき動作になるようです
実際はPanelは十分に横幅をもっており、AutoSizeはFALSEです
>>919 Autoでは無理ですか。がんばって自作してみることにします
車輪の再発明って感じですが、C#を理解するステップとしては丁度いいかもしれません。
>ALL
ありがとうございました。
標準のスクロールバーの出方でいいと思うんだけどなあ。 何が不満なのかさっぱりわからん。
いや、俺もあれはむかつくぞ。横にスクロールさせる意味ねーだろ!!って思う
そうか? 実際に表示し切れてないんだからスクロールできるようにせにゃならんだろ
縦スクロールバーも考慮に入れた上で、きちんと横一杯表示してほすぃ
相談です 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+を使っているのでハードウェアアクセラレーターが効かないのは重々承知なのですが、転送元の画像がでかいと遅くなるというのは…
GDI+ だしなぁ。 ていうか街の全景って一枚絵にするもんなの?
>>926 はい。いわゆる水彩画のようなタッチで描いたでかい1枚の町絵を背景としたRPGとなります。
どうもある一定の大きさを境に、ガクっと速度が落ちるようです。
Imageを読み込んだあと、分割して持つしかないですかね…。
うーん交差点に黒い丸が見える・・・
927です 画面を256*256ずつに分割したらちょっぱやになりました。 手抜きで、256*256を全部DrawImageしてるんですけどね…。参照元の大きさが一定以上いくと激遅になる。と記憶しました ただ、分割する時にすら信じられないほど遅くて、5120*5120を256*256に分解すると30秒くらいかかりましたわ…
知らんと Managed DirectX と言ってみる
>>929 Google Map見てきたほうが良いよ
あれはピクセル数で言えば億単位以上の画像をスクロール可能にしてる
どうすれば巨大画像を効率良く扱えるか見えてくる
別に物理的に画像を分割しなくてもビットマップをヘッダとデータで分割してランダムシークとか方法は色々ある
ファミコン時代のドラクエなんかも仕組みは同じ
表示する箇所だけ描画
スクロールするときはスクロール量(ドラクエだったら一歩/一マス)の分だけ先に書いておいてスクロール
スクロールアウトした箇所は描画から落ちる
時代が変わってもやることは一緒
で、単に表示ではなく60fpsものフレームレートが必要な理由って何?
そんだけのフレームレートを出すならDirectXを使うべき
意固地にGDI+に執着するは勝手だが苦労するだけなので、適材適所の製品選択を
単に表示して再描画だけならGDI+で十分だと思うけど60fpsも出すとなるとハードリソースに頼りすぎだと思う
>>925 C++で同じプログラム書いて速度計測してみた?
>>927 5120*5120*32だとすると約800MBだよね
それだけをメモリ上に確保してってやってりゃスワップも発生しないか?
あとDrawImageがどういう実装か分からんけど、効率的にメモリ上のビットマップにアクセスできてるのかね。
C++時代は考えられないとか書いてるけど、C++の時は自力でそのあたりも実装したんでしょ?
だとすればC#でも同じコード書いてみ。
935 :
933 :2006/03/03(金) 09:47:00
32掛けてたよママン orz 色に32バイトもかけてる贅沢な画像はまだ無いよね orz
>>929 MouseMoveイベントで描画で十分じゃないの
マップエディタであってゲームじゃないよね
>>925 > 転送元の画像がでかいと遅くなるというのは
普通だろ
転送元がどう格納されているかなんてC#じゃ制御できないし
60fpsものパフォーマンスを求めるならC++とDirectXでフルスクラッチ
お世話様です925, 927です 私も本来なら描画範囲だけ動的に作ればいいと思っていたのですが 描画範囲をチップで構築するのがこれまた遅いのです。 マウスクリック&ドラッグによるスクロールを実装しているのに FPSがガタオチでスクロールがスムーズに行なえません。 FPS60にこだわっていたのは、このクリック&ドラッグスクロールがあるためです。
>>925 単に変数に盛っておいて、pictureBox の Image に入れなけりゃ早くなるんじゃないの?
pictureBox1.Image にでかい画像いれて、pictureBox1.Invalidate(); なんて
したら大変なことになるのは当然のような・・・
>>939 いえ。925の実装ではpictureBoxのImageには描画範囲分しか持たせておりません。
(今よくみたら、Graphics gへの代入が変ですね)
最初はpictureBox.Imageに町の全景を持たせていたのですが、ちょっとした大きさでもすぐ重くなってしまって使えませんでした。
ネットで調べたところ、.Imageへの代入はあくまで簡易に表示するためとありましたので、今回の実装に変更しました。
pictureBoxの大きさ(256*256)のImageをもたせる。
そのImageに、256*256分だけ町全景ImageからDrawImageで転送する。
>>938 MouseMoveイベントでクリップ描画すれば事足りるだろ
ドラッグ操作と描画を分けて考えるからそんな面倒が実装になる
1200dpiのA0画像を編集するツールを作って客に出してるけど、DirectX使わずとも現行機レベルなら実用レベルで動いてるよ
>>941 MouseMoveイベントで行いましても、描画自体の重さが解消されるわけではありません。
また、移動させたあとに余韻をもったスクロール(マップを滑らせながら離した場合、しばらくスクロールが続く)をさせるためにもTimerは必要となります。
ところでMouseMove中に描画処理をするようにしましたところ
画像の転送が遅すぎてInvalidateのWM_PAINT(がとんでると思っています)よりさきにWM_MOUSEMOVEが大量に溜まり、ほとんど再描画されないようになりました。
描画はタイマーに逃がしてしまわないとまずいのではないでしょうか?
>>942 あのさ、最初にこう書いてるじゃん
> C#を使い始めたのはつい最近なのですが、C++時代には考えられない遅さです。
C++時代はどう組んでたの?
それと同じ組み方すればいいんじゃないの
ImageとかGraphicは巨大なデータの最適化より利便性優先だから遅くても仕方ないと思うし
>>942 DirectXみたいに別の描画面があるわけじゃないから、描画はOnPaintでいいんでは
課題で式を微分する関数を作らなければいけません しかし方法が全く分かりません 検索でも上手く見つかりません 何かヒント教えてください
>>943 C++時代は画像元が大きいと転送速度ガタオチという現象はありませんでした。
仮に32*32のようなチップを並べて画面を構築するタイプだとしても、描画必要範囲分をその時その時で構築してあまりあるスピードでした。
>>944 私としてはTimerだろうとOnPaintだろうとどちらでも良いと思っています。
ただ、描画速度の遅さというボトルネックが解決できないことには変わりません。
ついで
>>945 C#相談室ではなく、アルゴリズムスレとかで質問したほうがいいぞ
みんな、プロファイラはどうしてるんだ・・・ プロファイラさえあれば、C# 2.0 に移行できるのに
>>946 > C++時代は画像元が大きいと転送速度ガタオチという現象はありませんでした
それはC++/CLIで同じロジックを組んだものですか?
ビットマップへのアクセスをフルスクラッチした、全く違うアルゴリズムのものではありませんか?
描画はGDI直ですか?GDI+ですか?DirectXですか?
> 仮に32*32のようなチップを並べて画面を構築するタイプ
それは違う話ではないでしょうか
小さな画像を並べるのと巨大画像からクリップして貼り付けるのではアルゴリズムもメモリ上の扱いも違うと思います
> TimerだろうとOnPaintだろうとどちらでも良い
Timerではメッセージキューに描画命令が次々と入れられます
OnPaintであれば描画できるタイミングでの描画になります
もしかして描画が遅いのではなく、Timerから刻々とくる描画命令の負荷に耐えられないのでは無いのでしょうか
それが見かけ上描画遅延に見えるとか
まず、C++時代の十分に有り余る処理能力のコードを検証してみてはいかがでしょうか?
それとC#のコードがどう違うか、それを検証してはいかがでしょう
アドバイスありがとうございます。 >もしかして描画が遅いのではなく、Timerから刻々とくる描画命令の負荷に耐えられないのでは無いのでしょうか この可能性を考え、検証コードを組んでみたいと思います。 ちなみにC++の時はGDI直でした。GDI+も使えますが半透明などを使うつもりはないもので。
>>946 逆に問題スピードのC++実装を見てみたい
それをC#に移植する助言できる人は沢山いると思うよ
>>947 CLR Profiler for the .NET Framework 2.0 じゃあかんの?
949です。
描画まわりをペイントがわに移し、MOUSE_MOVEでInvalidateを呼ぶスタイルにしてみました。
速度は変わらないようです。
>>950 単純にGDIリソースにチップ(ある程度小さい画像に分けてある)として読み込み
描画領域に移っているチップだけその場でBitBltしていただけです。
ハードウェアアクセラレーターがきくので滅茶苦茶速かったです。
>>952 同じように組めばいいんでは
OSネイティブではない.NET Frameworkでは不得手なこともあるわけで
それと、GDI直でやるよりDirectXでやるべき仕様のような気がする
Managed DirectX使えばコードも簡単だしGDIより速いし文句の付けようが無いと思うよ
>>953 なるほど。私もC++時代に使った経験がありますし、DirectXを検討してみようと思います。
Managed DirectXというものを調べて実装試してみます。
アドバイスありがとうございました。
>>952 確かGraphics.DrawImageってソフトウェアレンダじゃなかったっけ?
DirectXでもいいけど、単純にpinvokeしてBitBlt使えば速くなると思うよ。
なんかどっかにグラフィックの高速化について色々書いてあるTIPSだか コラムだかを見たような気がして探してみたが見つからなかった。 結局は直接ごりごりやらんとムリって結論だったような気がしたが。
Microsoft のサイトにあった奴か? それなら結論は「クリッピングを巧く使え」だったと思う。 このスレの流れ的には多分意味がない結論だな。
60fpsを安定して出したいならDirectX BitBltも悪くは無いけど餅は餅屋に任せるべき
※DirectXはマシンの環境によっては使用できない事があるので注意
>>959 今時どんな環境だよw
それ言い出したら.NET Framework入れてなきゃC#使えないわけで
あらゆるWin32環境で動くのを作ろうと思ったらC#は選べないよ
DirectX かー。 今話しに上がってるような大きな画像はテクスチャにできないのでダメだと思うけどな。 システムメモリのサーフェスから転送するんだったらCPUで処理するのと大差ないし。
ボトルネックが描画なのか転送なのか切り分けできてるの?
ネイティブ吐き出すC#も検討されてるようだね
ソースは?
>>957 うーん・・ITmediaか@ITだったか。
結論は4バイトまとめてドン。とかそんな感じ。
@IT っつーと C# 入門のアンセーフのところにあったセピア化のあれが思いつくな。
>>960 そんなに単純な話でもない。
細かいフューチャーはサポートしているかどうかチップによっても違う。
だから「使うなら確認せよ」っていうんがDirectXの方針。
今回の場合でかいサイズのテクスチャだからDXTCあたり使うとよさげ。
でもDirectX云々抜きにしてメッセージループで60fpsは無謀です。みょん。
ゲームでよくPeekMessageぶん回すけどそのせい。
それにここまで上げるとティアリングの問題も出てくるし(無視すりゃいいが)、
「60fps絶対いる!」とかいうのでもない限り求めるな。そういうのはWindowsは
死ぬほど向いてない。Vistaでマシになるけども。
>>967 細かい違いって言うけど、救いようのない違いってそんなにあるか?
大概代替手段が提供されていて、パフォーマンス低下するけどなんとかなる的に組まれてると思うが
そりゃサウンド無いのに音出せって言っても無理だが、それが一般的かと言われりゃそうじゃない
100%は無理でも代替でほぼ100%いけるのがDirectXの良さ
でなきゃDirectXでゲームは作れない
まぁ、よほど細かい事しない限り、DirectXで大丈夫でしょ。 まさかC♯で最新技術を使ったFPSやらを作るわけじゃあるまいし
なんだと
なんだと
> まさかC♯で最新技術を使ったFPSやらを作るわけじゃあるまいし なんだと
973 :
945 :2006/03/04(土) 00:13:00
>>946 アルゴリズムなのですか?
C#で組みたいのですが・・・
>>968 サポートしていない機能を使おうとするとエラーです。
っていうかつまり「代替機能」は「アプリケーションプログラマがやる」のが
基本スタンスなんす。
まぁ挙げている程度のことなら大丈夫だと思うけどね。注意するところは
サポートフォーマットとサイズぐらい?D3DXで吸収されるかな。
>>973 だから「C#特有の部分が分からない」んじゃなくて「微分する関数」そのものが
分からんのでしょ?
「微分する関数」そのものがわかっていればあまり悩むこともないやろうし。
そのレベルならアルゴリズムスレ。んで、「〜するためにこうこうした(こういう
コードを書いた)んですが、よく分かりません」ってレベルになったらここ。
安西先生ゲームが作りたいです・・・
>>974 > っていうかつまり「代替機能」は「アプリケーションプログラマがやる」のが
> 基本スタンスなんす。
DirectXの環境依存対策の基本は代替手段の“選択”
普通ハード環境に合わせて最適なDirectXドライバを使うようにプログラム組む
もしくはユーザにドライバを選択するためのインタフェースを提供する
これらはDirectXが提供しているものを選択するだけで、機能を実装する必要は無い
特定のハードでしかサポートしていない機能“だけ”を使って組むことはDirectX開発の基本から外れてる
その場合は“特異”であるものとして別途明記すべきレベルの話になると思うが
極論を持ち出せばどうとでもいえるが、今は一般論で十分じゃないか?
ちなみに“代替機能の提供”となると、DirectXでできないならGDIで実装とかDirectPlayできないならSocketで実装とかそういうレベルでしょ
貴方的にはそこまで実装すべきで、自分は今までそうしているから書いたというのであれば、貴方の言葉足らず
・・・もうC#の話題じゃないなw
978 :
945 :2006/03/04(土) 00:32:56
>>975 > だから「C#特有の部分が分からない」んじゃなくて「微分する関数」そのものが
> 分からんのでしょ?
そうです、微分する関数をどう作るか分からないのです
> そのレベルならアルゴリズムスレ
すみません、他の言語は分からないので、最初からC#で組みたくてこちらに投げました
微分などの処理はアルゴリズムで書くのが一般的なのですか?
もしそうだとしたら移植しようにもアルゴリズムが分からないので難しいです orz
980 :
945 :2006/03/04(土) 01:01:34
>>979 すみません、茶化さないで下さい
本当に困っています... orz
アルゴリズムというキーワードと微分というキーワードで検索してみました
非常に難しい話が多く、まったくチンプンカンプンです
もしかして大学レベルでやることなのでしょうか?
授業でやる微積とは全然違うのですね orz
>>980 一体何がわからんのかがわからん。
式を微分する方法を聞きたいなら、スレ違い。まずそいつをどっか適切なスレで
解決しれ。
式が判っててプログラム化がわからないなら、こういう入力でこういう出力を
したいって書いてくれ。
正直、ここの連中は人の宿題を代ってやってやる義理などないんで。
「アルゴリズムで書く」って。なんか勘違いしてる予感
>>925 PictureBoxつかうより、Panelに直に描いたほうがだいぶ速いはず。
(再描画処理は自前でやることにはなる。)
PictureBoxは高速に書き換える用途には向かない。
984 :
デフォルトの名無しさん :2006/03/04(土) 02:02:41
dfgdf
>>982 多分最終的にプログラムそのものを書いてやんないとわかんないレベルだろ。
そんなん課題にならんがな。
986 :
983 :2006/03/04(土) 02:18:11
>>925 それから街の全景の読み込みにImage.FromFileを使ってないか?
こいつは必要に応じて画像をメモリから廃棄したりファイルから読み直したりするから、
頻繁にファイルの読み直しが発生してるかも知れないな。
C#からMathmatica呼べばいいじゃん 微分・積分楽勝じゃん
例えばDirectSoundが使えない環境(マシン)を挙げれば 東芝/Dynabook Satellite 4360 などはダメ
配列の要素を削除するにはどうするのですか? VB6にあるReDimのようなものはないのでしょうか?
990 :
デフォルトの名無しさん :2006/03/04(土) 10:53:04
>>989 無いのでArrayList使った方が良い。
>>989 VB6 の ReDim はよく知らないが、C#2.0 なら Array.Resize かな。
ArrayList.Removeですね
>>990 ありがとうございます
>>945 本屋さんに行って、おまいさんの理解できる本を探すか、
一番良いのは課題出した先生か同級生に相談することじゃないかな。
数学忘れたから微分判らんが、
どういうレベルの話をしてるのか、おまいさんの脳味噌がどんなぐあいか、
その人達が一番よく知ってるだろう。
>>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なら明日君に
∩__∩ (`・ω・´) .ノ^ yヽ、 ヽ,,ノ==〆ノ / l | """~""""""~"""~"""~"
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。