1 :
デフォルトの名無しさん :
2006/03/04(土) 16:47:48
2 :
デフォルトの名無しさん :2006/03/04(土) 16:50:01
前スレで相談室と統合しようという発言があったけど、 この板を恐る恐る覗き込んだ初心者が居るかと思い建ててしまった。 反省はしていない。
たぶんだけど、相談室だけで十分だと思うよ 2つある理由がないもん
本スレでは Win32API の GetPixel 使え、で済ますことでも、 こちらなら DllImport から教える余裕が出るな、何故か
6 :
デフォルトの名無しさん :2006/03/04(土) 17:19:31
配列の最大数っていくつなんですか?
一応、メモリの許す限り
8 :
デフォルトの名無しさん :2006/03/04(土) 17:32:01
>>7 そうなんですか。Integerくらいかと思っていました。
ありがとう御座いました。
C#でフリーソフトを作る一番簡単な方法を教えてください ベクターで人気が出ることが目的です
悩む暇があったら作れ
12 :
デフォルトの名無しさん :2006/03/04(土) 18:21:19
C#.net と VB.net は何が違うんでしょうか?教えてください。
使用する言語が違う 後は大体同じ
.netプログラムって逆コンパイル可能ですか?
16 :
13 :2006/03/04(土) 21:32:32
>>14 ありがとうございます。
プログラムの記述の仕方が違うということですね。
すっきりしました。
同じオブジェクトへの参照をまとめて記述したいのですが(vbでいうとwithステートメント)、 VC#ではどう記述すればいいのでしょうか。
無くなった 理由はソースの可読性が下がって見づらい
int型の配列の変数hogeの5番目を配列の先頭としてアクセスしたいとき、Cでは (hoge+5)[0] でできたのですが、C#ではできません 何か設定が間違っているのでしょうか
なんでそんな事する必要がある あとポインタと配列は全く別モンだ Cではほぼ同じように扱うが
配列とポインタは別物です 素直に hoge[5] と書いてください
>>20 private class SubArray<T> {
private T[] array;
private int seed;
public SubArray(T[] array, int seed) {
this.array = array;
this.seed = seed;
}
public T this[int index] {
get { return this.array[index + seed]; }
set { this.array[index + seed] = value; }
}
public static SubArray<T> operator+(SubArray<T> value, int seed) {
return new SubArray<T>(value.array, this.seed + seed);
}
}
半分ギャグだから本気にとるな?
25 :
20 :2006/03/05(日) 00:33:26
>>21 >>23 別物と言うのはどういうことでしょうか?
CとC#では配列の扱いが変わってしまったという事でしょうか?
もしかしてC#には完全な下位互換性が無いのでしょうか!?
>>24 演算子のオーバーロードが必要という事は、やはり配列の実装が変わってしまったのでしょうか。。。
あのね、ちょっと調べてみれば全く別物ってことが分かると思うよ。 Cとjavaの違いに近い程度に違う。
Cにあった便利機能がないせいでC♯は地獄だぜ おかげで俺しか読めないソースが作れなくなって いつ肩を叩かれるかと娘に肩を叩かせながら飲んでる毎日だ
多分C++でCのソースが使えるように、C#でもCのソースがそのまま使えると
思ってるのだろう。
>>25 C#はC++の皮を被ったjavaだ。
Hello, Worldみりゃ明らかに違うってわかりそうなもんだけどなあ・・・
むしろMainで気づくだろう、普通。
32 :
デフォルトの名無しさん :2006/03/05(日) 04:01:56
プログラミングC# 第4版(O'REILLY)で勉強を始めましたが、コレクションのところで躓きました。 genericなどというやつはひとまず飛ばしてもかまわんでしょうか…?
OK C# 1.0 には無かったし、無くてもプログラミングは可能 ただ知ってると便利ではあるから、全貌を把握してまた読み返すといい
>>33 ありがとう。ちょっと安心しました。
精進しまふ(`・ω・´)
35 :
デフォルトの名無しさん :2006/03/05(日) 06:27:06
つか、テンプレは貼らんでいいの?
あ、新スレ立ったんですね 前スレの最後のほうではお世話になりました また質問があったら来ます。
37 :
天麩羅ってこれ? :2006/03/05(日) 09:32:04
38 :
デフォルトの名無しさん :2006/03/05(日) 14:06:00
画像を配列に読み込む方法を教えてください。 現在はBitmapクラスをわざわざ作成してそこから抜き出しています。 こんな感じ Bitmap bmp = new Bitmap(filename); BitmapData bmpdata = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppRgb); int[] data = new int[bmp.Width * bmp.Height]; Marshal.Copy(bmpdata.Scan0, data, 0, bmp.Width * bmp.Height);
39 :
デフォルトの名無しさん :2006/03/05(日) 14:42:22
windowsアプリケーションをC#で作りたいんですが やはりがっちりした文法書を読まなくてはいけないんですかね? 作りたいソフトは指定したフォルダに変化(ファイルの増加・削除など)があった場合に メッセージボックスを出すというものです。
>>39 第2章 ボタンを押したらメッセージが出る簡単なプログラムを作ろう!
程度の知識で出来る。
>>40 習作かもしれんだろう。
脊髄反射厨がイルのは初心者スレだからか。。。
>>42 いいすぎたかなあ。そんならあやまる。
でも、
>>39 は、すぐ前にある
>>37 を見る努力するらしてないようだし。
それに、
>>1 のガイドラインには従ってるつもりだけど。
> 内容に応じて、他スレ・他板へ行くことを勧められる
>>43 >それに、
>>1 のガイドラインには従ってるつもりだけど。
ガイドラインに違反していると判断した場合は
独断で煽りその他の攻撃を開始することが出来る。
なんて書いてないけど。
まあちゃんと教えてあげてるだけ優しいんじゃね?w
>>39 フォルダの情報を定期的に見に行って蓄えて、変化があったらログ出力。
なんか、ちゃんと動いたらどうでもいいような気もするが。
47 :
38 :2006/03/05(日) 16:02:49
誰か僕のにも答えてくれるとうれしいです
>>40-46 僕のせいでちょっと荒れてさせてしまったらすいません。
すでにvectorなどにあるソフトの組み合わせで事足りてるのですが
時間に余裕ができたので自分で作ってみようと思ったのです。
>>37 に乗ってるサイトはほとんど知っててみながらコピペコピペで作っていたんですが
この方法に不安になったので質問させていただきました。
回答ありがとうございました。
アプリケーションを終了したときに 例外 unknown software exception (0xc0020001) がアプリケーションの 0x7c81eb33 で発生しました とのダイアログがたまに出るのですが、原因がわかりません。 どのようにしたら回避できるでしょうか? なお wmp.dll を Interop して使用しています。
折れんとこじゃでない
>>38 ArrayListにでもほおりこんじゃえばいい...のかな?
>>38 はビットマップの各ピクセルのデータを配列として取り込みたいって言ってるんじゃないか?
>>53 そう、それが知りたいです
Bitmapを作成せずに直接ファイルからピクセルデータを読めませんか?
56 :
55 :2006/03/05(日) 23:28:58
むしろ
>>38 のコードの意味を理解して使ってるなら
>>38 の方がスマートに思えるんだがどうだろうか
VisualC#の練習するのって、Visual Web Developer 2005 Express Editionでいいかな?
どういうこと?
素直にVisualC#を使えばいいじゃないのよさ それともASPやりたいの?
>>55 >>56 レス、ありがとうございます
とりあえずあんな読み方をしていたんですが
その参考ページを見た限りでは確かに今のままのほうがよさそうですね。
けどせっかくなので一応試してみます
ところで
>>38 のコード、32bppならいいがそうでない場合コピーする量が足りてない可能性があるぞ。
横は4バイト境界に切り上げるから。
>>60 VisualC#の製品版がないので替わりに使えるかと思ったのですが。
>>63 つ Visual C# 2005 Express Edition
じゃぁ、それで。
>>54 BITMAPフォーマットを理解してバイナリ操作すればいーじゃん
.NET Frameworkの利便性に目が眩んでいるようだけど、そんなもの無い環境ではバイナリフォーマットを理解して操作するのが普通
数万ファイルとか一気に処理するならともなく、普通に使っているならBitmapでもパフォーマンス的な差は無いと思うけどね
今更かもだけども。
C#でマイクロソフトMVPを取るにはどうすれば良いですか VS2005は落としました
ハ_ハ ハ_ハ (^( ゚д゚)^) むりだとおもう ('(゚д゚∩ ) / むりだよ ヽ 〈 (_ノ_ノ ヽヽ_)
>>70 MCPの上位資格を一通り取ったら会社から「MVPになれ」と言われました
なので無理でもなりたいです
>>71 マイクロソフトの社員と仲良くなれば良いのでしょうか
そもそもどうやって取得するのでしょうか
74 :
72 :2006/03/06(月) 23:15:59
結論から言えばアクティブに動いてそれなりに有名になれってことだな スキルだけじゃダメ
75 :
74 :2006/03/06(月) 23:17:03
訂正 72 -> 73
データソースにするオブジェクトって 例えばpublicなクラスを作ってただpublicなフィールドを配置しまくればいいんですよね?
プロパティにすれ 値変更のイベントも置ける
public class hoge{ private string unkoValue; public string unko { get { return unkoValue; } set { unkoValue = value; } } これだとOKで public class hoge{ public string unko; } これだけだと駄目なんですね。訳わかんないけど有難うございます。
publicなプロパティは大文字ではじめるとよろし
Hashtable.IsReadOnlyを設定するには、生成時にIDictionaryの部分を どうこうするんだろう、というところまでは推測したんだが、そこから先がわからん。 どうすれば設定できる?
visual C# 2005 expressを入れようとしたらSP2入れろと警告されました。 SP2が公開されたときは色々不具合が報告されていたので、ずっと遠慮してたんですが、解決されているのでしょうか? また、入れてから不具合が見つかったらSP2だけアンインストールできるんでしょうか?
>>81 XPSP2以降のバグやセキュリティリスクなんかは定期アップデートで直ったりしてる
全部完璧直っているかと言われれば多分それは永久に無いと思うが、XPSP1aよりはマシだと思う
あとは君の開発するアプリがXPSP2で都合が悪いとかXPSP1aじゃないと絶対駄目だとかそういう理由があるかどうかくらい
個人的には“現時点での”危険性やバグは XPSP2 < XPSP1a だと思うよ
SP2入れた時点でPCが起動するなら比較的安全にSP2外せるようになったな 前は戻せなくて困ったりしたもんだが まあアップデートする前に一時的にサービスとスタートアップを無効にすること オフィシャルに注意書きがあるからよく読むといい
>>80 Hashtable は IsReadOnly は常に false を返すよ。
せいぜい派生クラスでも作るとか。
85 :
81 :2006/03/07(火) 14:46:23
ありがとうございます。
♭C♯
87 :
デフォルトの名無しさん :2006/03/07(火) 21:06:01
ApplicationSettingsBase.Save メソッドは 例えばapp.configに値を保存するってことですか? app.configに書き込んで保存すれば次回起動時にapp.config読み込めばその状態引き継げますよね?
>>87 やれば分かる事を聞くな
やってみても分からない事を聞け
>>88 やってみたんですけど保存されないんです。
Saveメゾットってどこに保存してるんでしょうか?
public void MyThread() { Thread.Sleep(1000); } private void button1_Click(object sender, EventArgs e) { for (int i = 0; i < 5; i++) { ThreadStart ts = new ThreadStart(MyThread); Thread thread = new Thread(ts); thread.Start(); thread.Join(); } このコードを実行して、ボタン1を押すと、 ループが終わるまでの約5秒間、フォーム全体が無反応になります。 スレッドを使ってるのに、なぜこうなるのでしょうか?
Join の意味を知っているか? ……知らないんだろうな。
知らないです。 教えて欲しいです。 スレッドの終了を待つのではないのですか?
そうだよ。 で、待ってる間はその待ってる方のスレッドが止まる。 91 のコードは元スレッドが新スレッド起動>新スレッドが終了するまで元スレッド待機、という記述だ。
わかりました。 やりたいことは、 MyThreadを別スレッド動かしつつ、(フォームが無反応にならずに)スレッドの終了を待つことなのですが、 どうすればいいでしょうか
そんな理解ででスレッド使わないでください。
待つって、待ってからどうしたいんだ? 終わったタイミングで何かしたいんなら、 コールバックのデリゲートを渡すなり、イベントを作るなり、 コールバック用のオブジェクトを渡すなり、 もともとコールバックの機能を持ってる機能を使うなり、 2005ならBackgroundWorkerつかうなり 好きにしてくれ。
わかりました。 イベントを作るのが簡単そうなのでそうしてみます
backgroundworkerって意外と使えるな。
>>84 回答ありがとう。
>常に false を返す
そうだったの? MSDNに「読み取り専用の場合は true」
とか書いてるからできるもんだと思ってたよ。
サブクラス化して IsReadonly をオーバーライドし true を返してみたが
ちっとも読み取り専用になってなかった……。
そりゃそうだ。 きっちり Add とかで NotSupportedException 投げるようにオーバーライドしないと。
104 :
デフォルトの名無しさん :2006/03/08(水) 10:59:07
COMのクラスを使うときって、うしろにClassが付いてる名前を 選べばいいんだっけ?
new できればそれでいいよ。どうせメインはインターフェイスだし。 何やりたいのか知らないけど。
>>104 命名規約が無いのでそういう決め付けはできない
たびたびすいません。 ApplicationSettingsBase.Save メゾットを実行するときに 「'System.Security.AccessControl.DiscretionaryAcl' のタイプ初期化子が例外をスローしました。」 というエラーがでるときとでないときがあります。 詳細みたりいろいろやってみたのですが解決法がわかりません。 どう解決すればいいか教えてください。
見た詳細の中身といろいろやってみたことの中身をまずは説明してくれ 同じ内容を言ってしまう手間を省くためにも頼むぜ
メゾットってたべられるの?
大きなデータも扱えるテキストエディタを作ろうとするとき、 ドキュメントのデータは、1行1クラスにして、それのコレクションにして 管理すればいいと思うんですが、表示するときどうしたらいいのでしょう? TextBox使うんじゃないですよね? こういうの作ったことが無くて、見当が付きませんです。
BitBliとかのBltってどういう意味でしょうか? Copyと同義?
C# と何の関係があるんだ?
C#で画像を扱う関数を作っていて名前で悩んでます
13>> つ private static favorite Pornografity()
pornographyか? pornograffittiか?
>>111 Bse Livedoor Taishingisou
Form1.csで作業中、プロジェクト→Windows フォームの追加 でDebugFormというフォームを作成しました。 しかしForm1で DebugForm df = new DebugForm(); df.Shouw(); とすると、 型または名前空間名 'DebugForm' が見つかりませんでした。 というエラーが出ます。 他に何か宣言が必要だったりするのでしょうか。
すみません。 namespaceのつづりを間違えていました。 解決しました。
axWebBrowser でウェブページを読み込み、HTMLを解析しようとしているのですが、 スクリプトエラーのあるページを開いてしまったときに、 「Internet Explorer スクリプト エラー」 このページのスクリプトでエラーが発生しました。 このページのスクリプトを実行し続けますか? はい いいえ というダイアログが出てしまいます。 ウェブページの解析にはスクリプトの部分は関係ないので、このエラーを無視したいのですが、 どうもこのエラーが原因でaxWebBrowser.Busy状態になっているようなのです。 try catchに入れてみるなど試したのですが、プログラムとは関係無いところで動いているようで、だめでした。 このダイアログを出さないようにする、または無視する方法を知っている方いますか?
Silent プロパティで抑止できた気がする
>121 ありがとうございますm(_ _)m
>122 ありがとうございますm(_ _)m
デザイナーで作業している時は、XP風なボタンなのですが、 プログラムを実際に起動すると、98風なボタンになってしまいます。 なぜでしょうか?
>>125 もはやFAQな気もしますが。
フォームの表示前にApplication.EnableVisualStyles();を呼ぶとか
マニフェストファイルを書くとかしたらいいんじゃないかと。
127 :
デフォルトの名無しさん :2006/03/09(木) 21:47:56
>>108 質問の仕方が悪く申し訳ないです
'System.Security.AccessControl.DiscretionaryAcl' についてまずgoogle検索しました
InnerExceptionがDLL 'advapi32.dll' の 'CreateWellKnownSid' というエントリ ポイントが見つかりません。となってるので
advapi32.dllについてgoogle検索しました。
しかしどちらとも有益な情報は得られませんでした。
saveメゾットについてはmsdnライブラリを読み、その通りコードを書いています。
またsettiin1.settingsというファイルに設定を書いていてプログラム起動時に読み込む設定にしてあるのですが
まったく別の情報(チェックボックスのチェック状態が設定ではfalseなのにtrueで起動するなど)になってしまいます。
アプリケーション設定の保存・読み込みに異常があるとは思うのですが根本的な原因・解決法がわかりません。
おねがいします。
>>128 タイプミスだとばかり思ってた。
身の回りそう思い込んでるやつっているか…?
>>129 プパロティって言われたときは脳みそがグルグルした
Windows2003って言われたことはある。server 2003 じゃなく。
133 :
デフォルトの名無しさん :2006/03/10(金) 18:10:25
>132 んにゃ。本人曰くOffice2003とごっちゃにしてたらしい。(server2003の存在自体知らなさそう) スレ違いなのでこの辺で。
>>135 エスパーにしか分からないネタを書かないで下さい
137 :
デフォルトの名無しさん :2006/03/10(金) 20:34:37
お前はわざとやってるのか
これはひどい
自分で「コンピュータでプログラムを組むということ自体が向いていない」と思っているのだろう
142 :
133 :2006/03/10(金) 23:09:36
やりたいことは、単なるサーバ、クライアント間の通信です。 サーバ側でデータ取得さえできれば問題ありません。 サーバの -- RemotingConfiguration.RegisterWellKnownServiceType( System.Type.GetType("ServerClass.myRemoteClass, ServerClass"), "RemoteTest", WellKnownObjectMode.SingleCall); -- この部分でデータを取得して、WriteLineで出力していますよね。 この出力データをサーバ部の変数に取り込むにはどうしたらいいのかと 言う質問です。 myRemoteClass tmp = RemotingConfiguration.Re...... とういう風にして読み込めればいいのですが・・・。 きっと単純なことなのでしょうが、サンプルみてもどれも、WriteLineで出力 して変数に格納しているようなサンプルが見つからないもので質問しました。
>>138-140 メゾットでもメゾッドでもなくメソッドですね。素で間違えてました。
答える気も失せますね。申し訳なかったです。失礼します。
>>142 き、きみは何を言っているのかね?
てそのまえに何をやってるのか、どういうことが起こってるのか
ぜんぜん理解してないだろ。
>>142 System.Consoleのようなstaticなクラスかシングルトンでどこからでも参照可能な単一のオブジェクトを作って、
リモートサーバーオブジェクトとサーバーのメインコード(たとえばUIを担当しているオブジェクトのコード)
の両方からアクセスできるようにする。
サンプルのmyRemoteClassはインターフェイスを使って実装して
public class myRemoteClass: MarshalByRefObject, ImyRemoteClass
クライアント側はインターフェイスでアクティベーションすると何かと都合がいい。
myRemoteClass obj = (ImyRemoteClass) Activator.GetObject(typeof(ImyRemoteClass) ...
ImyRemoteClassだけを単独のDLLにしてサーバー、クライアントの両方にコピーすることになる。
>>142 答えがそのKBに書いてあるじゃん
それも理解できないようならヤバいよ
複数textBoxに渡ってUndo可能な方法って、 どうするのですか?
自分で作れ
それぞれのTextBoxでUndoしたらいいんじゃないか?
コーディングの話じゃないんで微妙にスレ違いかもしれないんですが、
C# 用のフリーなグラフライブラリってありませんかね?
Java では JGraph というのがあるんですが、C# 用でそういうのがないのかと。
Google で探し回ったけど、どうにも見つからなかったので
皆様のお知恵を借りれたらと。
JGraph はこんなん
ttp://www.jgraph.com/screenshots.html
152 :
デフォルトの名無しさん :2006/03/12(日) 14:14:46
http://santamartadotnet.hp.infoseek.co.jp/documents/csharp/structandunion.html ここを参考に共用体の勉強してますが
ページの下のほうにある
[StructLayout(LayoutKind.Explicit)]
struct Color
{
[FieldOffset(0)] public System.UInt32 Value;
[FieldOffset(0)] public System.Byte R;
[FieldOffset(1)] public System.Byte G;
[FieldOffset(2)] public System.Byte B;
[FieldOffset(3)] public System.Byte A;
}
これをたとえば配列にして
それをint型の配列にキャストする方法を教えてください。
そう言うコードを書く。マジで プロパティにすれば良いんじゃない? //どうでもいいが B G R A の順番だろ
154 :
デフォルトの名無しさん :2006/03/12(日) 15:25:50
IntPtrとはポインタと同じ愉快方ができるものでしょうか? 愉快方を教えてください
不愉快だ。帰る。
156 :
デフォルトの名無しさん :2006/03/12(日) 16:19:19
たとえばptrがIntPtrだとして *(int*)ptr.ToPointer() = value; 以外に書き方はありますか?
同じものではなくてマネージドの中でポインタを処理するためのもの
Marshal.WriteInt32(ptr, value);
>>158 ありがとうございます。
そんな関数があるんですね。
IntPtrを1バイト進めるにはどうすればいいんですか?
ポインタ使え
163 :
150 :2006/03/12(日) 21:26:32
>151 提示のURLからreferされているNetron Libraryが大体希望の機能を 満たしているようです。というか、希望の物そのものっぽいです。 お蔭様で目処は立ちましたので、これから詳細を調査したいと思います。 回答、どうもありがとうございました。
165 :
161 :2006/03/12(日) 21:32:39
えっと、結論は”できない”ってことですか? 残念です。。
つかどんなことやってんだか
フォームを最小化してるときに、通常時のフォームの位置&大きさを取得って P/InvokeでGetWindowPlacement使う以外にないですか? 位置大きさ保存のためだけにPOINTやらRECTやらWINDOWPLACEMENTやら 定義しないとならないんですかね〜
>>167 2005ならRestoreBoundsっていうプロパティがあるけど、2003ならそうなんじゃない?
169 :
161 :2006/03/13(月) 00:21:07
えっと、もうひとつだけ
IntPtrはポインタにキャストしてから使うのが一般的な用法ってことでしょうか?
>>166 何もやったません。情報集めです。
ポインタをIntPtrに置き換えたほうがいいのかと思ったんですけど違うようですね
>>167 SizeChanged でフィールドに取っとけばいいんじゃね?
>>168 ポインタを使わないのが一般的
171 :
167 :2006/03/13(月) 01:25:06
よくある話だが2.0で追加されたメソッドやらクラスやらのリストが要るな。
>>173 んなもん不要だろ
以前のバージョンを知っているからと新しいバージョンの調査もしない輩が悪い
2.0から入ってくるヤツは当たり前のように使ってるんだし
>>174 別にみんなが職業的プログラマという訳でもあるまいに。
>>175 んなこと関係ないだろ
世の中なんでも「やる」人間と「やらない」人間の格差が開いて当然
>>176 むしろ「ヤった」人間と「ヤってない」人間の格差が…('A`)
いくつものHtmlDocumentを管理して、 場合に応じてwebBrowserに描画するHtmlDocumentを 切り替えたいと思っています。 HtmlDocumentのインスタンスを生成する場合、 HtmlDocument hd = webBrowser.Document; このような方法があると思うのですが、 これだと、いくつものインスタンスを生成し そのうちひとつのインスタンスを変更すると、 切り替える作業無しにwebBrowserの描画が変わってしまいます。 HtmlDocument hd = new HtmlDocument(); は出来ませんでした。 webBrowserとは関連しないHtmlDocumentを生成する方法はあるのでしょうか。
>>180 > HtmlDocument hd = webBrowser.Document;
インスタンスを作ってるんじゃなくて、インスタンスの参照をコピーしてるだけだ。実体は同じ。
普通に WebBrowser 複数作れ。
>>180 単にHTMLを文字列で複数持ってりゃいいだろが
あとはDocumentTextプロパティに設定するだけ
表示中に何か変更書けたらDocumentTextから取得すればいいだけ
技術が先に来て仕様が疎かになってるよ
目的が何かを理解して無いからそういうアホな疑問が湧くんだよ
>>181 > HtmlDocument hd = new HtmlDocument();
> は出来ませんでした。
んなコンストラクタねーよ
ヘルプくらい嫁
相談室じゃないんだから優しくしてやろうぜw
Visual C# 2005 Express Editionを使っています。 コードウィンドウに行番号を表示したいのですが、 ツール→オプションの中に見つかりません。 どこにあるかわかる方いますか?
↑分かりません(><) ↓わかる方いますか?
ダイアログ左下のチェックボックスはチェックしてる?
すべてを表示ダイアログをチェックしていませんでした。 ありがとうございますm(_ _)m
プログラミングC# 第4版ってどう?
>>182 WebBrowserの話してるみたいなんで便乗
DocumentTextで渡すとフォントが明朝っぽくなるのはどうにかならんか?
UnicodeじゃなくてShift-JISとかで渡したいんだがこの場合どうすんの?
フォントの話なのかエンコードの話なのかわからんけど、 Encodingで変換したらいいんじゃね。
193 :
デフォルトの名無しさん :2006/03/14(火) 23:11:31
初歩的な質問で申し訳ありませんが int[] x; x=new int[20]; x=new int[100]; これって問題ありますか? newした後、deleteの代わりの何かありますか?
>>192 stringは内部的にUnicodeで扱われるみたいなんで
string→Stream(Shift-JIS)でDocumentStreamに
渡そうと思ってるんですが的はずれですか?
IEでUnicodeのページ開くとフォントが明朝っぽくなるのがわかるとおもいます。
>>193 ない。ほっといて良し
>>194 そりゃユーザの問題だからな。
いやならインターネットオプションでラテン語基本のところのを変えろ。
>>195 ありがとうございます
やっぱり勝手にGCがやってるんですか?
まあ、ほっといていいってのが気分悪いですが気にしないことにします
>>49 ですが
アンマネージ コード デバッグを有効にするにチェックを入れたら
終了時にfree.cでエラーが起こっていました。
また以下のようなメッセージがダイアログで出ました
app.exe の 0x7c81eb33 でハンドルされていない例外が発生しました: 0xC0020001: その文字列結合は無効です。
そもそもunknown software exceptionが出たときはどうやって原因を探ればいいんでしょうか?
>>199 Interopとかアンマネージ コード デバッグとかいってるけどC#にその機能あったっけ?
C++/CLIのことなら別にスレがあるから探してみろ。
>>200 Interopもアンマネージコードデバッグもあります。
どうやらWeBrowserコンポーネントが怪しい気がしてきました。
202 :
デフォルトの名無しさん :2006/03/15(水) 12:19:15
C#って、配列の開始インデックスを変更できるようなメソッドかクラスありませんか? たとえば、開始インデックスを-2にして、array[0]とすると、 実際にはarray[2]にアクセスできるようなやつです。
あるけどバグの温床をわざわざ使うな
いや、C→C#の移植やってるんですけど、 Cで配列の途中のポインタとって、そこから配列ライクに使われてるんで… 開始インデックス変更できないと、結構書き直さないといけないとです。 というわけで、教えていただけ無いでしょうか。
それで何がしたいのかさっぱり判らないが、少なくとも C# だと対応できない。
Cで int buffer[1024]; int *p1 = buffer + a, *p2 = buffer + b; for(int i = 0 ; i < c ; ++i) /* p1[i]とp2[i]でごにょごにょ */ みたいのがたくさんあるんで、 C#にすると、全部buffer[i + a]とかに書き直さないといけないんです。 インデックス底上げする配列ラップクラスとか作るべきでしょうか?
p1[1024+a]とp2[1024+b]作っちゃダメ?
すまん、配列全部コピーするはめになるなwwwwwwwwwww orz
>>201 COM Interop のことね。了解。
.NET frameworkで開始インデックス変更できないようなので、
>>24 みたいなクラスでがんばろうと思います。
>>204 > Cで配列の途中のポインタとって、そこから配列ライクに使われてるんで…
それをC#でどう実装するつもり?
全く同じにできないんだから、いっそC#らしいコードに書き換えた方がいいと思うよ
>>206 一応できたが出来なかったことにしたほうが幸せそうだ。
int [] abc = { 1, 2, 3, 4, 5, 6, 7, 8, 9,10 };
unsafe {
fixed (int* x = &abc[3]) { textBox1.Text = x[0].ToString(); }
}
stringの"1,000"の","を取り除きたいのですが、 何か良い方法はあるでしょうか。 for文で、substringして、","を探すしかないのでしょうか。
>>213 string s = "1,000".Replace(",", "");
そんなものがあったのですね。 m(_ _)m
string s = (Convert.ToInt("1,000")).ToString; ってのが真っ先に浮かんだ俺は間違いなく逝ってよし
<html><head></head><body>aiueo</body></html> このページをwebBrowser1で表示させている状態です。 しかし string str = webBrowser1.DocumentText; としてstrを表示させると、"<html></html>"と表示されます。 なぜ<head>や<body>がなくなってしまうのでしょうか。
全く再現しない ごく普通に書いたとおりの HTML が出力される むしろ DOM で解析される前のテキストが出てきてちょっとびっくり
>218 検証ありがとうございます。 webBrowser1.DocumentText = "<html><head></head><body><font>aiueo</font></body></html>"; Console.Write(webBrowser1.DocumentText); でも<html></html>となるので、 私の環境がおかしいのかもしれません。
そりゃそうやったらそうなるだろうな。 DocumentText に代入するってのは詳しい動作はヘルプ嫁、として、非同期の処理だから。 書き込めてない内に取得してもそりゃまともには取れない。
webBrowser1.Navigate("about:blank"); で初期化していたのですが、この部分を削除したら解決しました。 ありがとうございました。
>>221 解決になってねーよ
>>220 が書いてることちゃんと理解したか?
お前この前からずっと質問しまくってるやつだろ?
現象ベースで解決しただの何だの思い込んでないで、ちゃんと根本原因を理解しろよ
それじゃいつまで経っても質問厨だぞ
224 :
デフォルトの名無しさん :2006/03/16(木) 18:46:02
リストボックス内での項目の移動を可能にするため、 ListBoxを継承したOrderedListBoxクラスを作成しました。 その中で「上へ移動」を行うメソッドを次のように定義しました。 public void MoveUp(int index)// index:選択項目のインデックス { if (index <= 0 || index >= this.Items.Count) return; ItemData data = (ItemData)this.Items[index]; this.Items.RemoveAt(index); this.Items.Insert(index - 1, data); this.SelectedIndex = index - 1; } ItemDataはリストボックス内の項目を表します。 これで動いているようですが、 RemoveAtを行った時点でdataが指すオブジェクトは破棄されませんか? 例えば次のようにコピーコンストラクタを呼び出して、 新規にItemData型オブジェクトを作成した方よろしいですか? ItemData data = new ItemData((ItemData)this.Items[index]);
dataが参照を持ってるじゃん。 破棄されるときってのは既にこっちの手から離れてどうしようもなくなってるものだから気にすんな。
226 :
224 :2006/03/16(木) 19:01:50
質問が不明瞭でした、すみません。 this.Items.Insert(index - 1, data); でdataを使っているのでこれはまずいかなということです。
いや、何がまずいのかが判らないんだが……。 > ItemData data = (ItemData)this.Items[index]; で[data]に[Items[index]]の参照が入る。 この時点で、[Items[index]]の寿命は ・Itemsから削除された ・dataがアクセスできなくなった の両方を満たしたときになる。(別のところで参照されてる場合は別だが) > this.Items.RemoveAt(index); ここで一番目の条件は満たされたが二番目の条件は満たされていないので寿命はきていない。 > this.Items.Insert(index - 1, data); 問題なくdataは存在する。 更にItems[index-1]に参照されたことで、寿命条件の「Itemsから削除された」が復活する。 > } ここでdataの参照が無くなるが、条件一が復活しているので寿命はまだ来ない。
>>227 RemoveAtされた時点で[Items[index]]の寿命が尽きて
dataが無効なオブジェクトを指してしまうのではと勘違いしていました。
丁寧なご説明ありがとうございました。
>>223 頭からしっぽまで抽象的デスね。
抽象論では何も解決はしないです。
わはははは、頭わるそう。
>>229 >>223 の口調(文調?)から推測するに、今までWebBrowser系の質問に対し辛辣ながら優しい回答をしていた方だと思われ
232 :
デフォルトの名無しさん :2006/03/17(金) 19:15:47
ArrayListで2次元配列のような扱いをしたいのですがやり方が分かりません。 教えてください。またその参照方法も教えてください。 エラー ArrayList [] AL = new ArrayList[2]; AL[0}.Add("TEST1"); ←ここでエラーとなる。
ListViewの文字を右寄せするにはどのプロパティいじればいいですか? 探しても、無いようなんですが
>>232 AL[0] は Object 型。このままではどんなものか分からない。
どんな型なのか分かるようにプログラム側で指示してやらないと。
あと、配列を作っただけではその各要素までは初期化されない。一つずつ new してやらないと。
>>233 サブアイテムの一番左以外は、ColumnHeader の TextAlign で列単位で可能。
それ以外は .NET 2.0 ならオーナードローすることになるな。それ以前なら諦めろ。
>>232 ArrayList[] AL = { new ArrayList(), new ArrayList() };
>>234 AL[0]はArrayListでしょ。
236 :
232 :2006/03/17(金) 19:43:27
>>234 AL[0]はArrayListでしょ。
>>234 AL[0]はArrayListでしょ。
break;
240 :
http://www.vector.co.jp/soft/win95/util/se072729.html :2006/03/18(土) 19:05:22
TextSS のWindowsXP(Professional)64bit化おながいします もしくは64bitにネイティブ対応したテキスト置換ソフトありますか?
誤爆した(;´Д`) だけど謝らないからね
242 :
デフォルトの名無しさん :2006/03/19(日) 12:40:01
フォーム上にListBoxとTextBoxがあるとします。 ListBoxには"アイテム1","アイテム2","アイテム3"が登録されているとします。 ここでTextBoxに文字列を入力したら、 それと連動してListBox内の選択項目の表示を変えるにはどうすればよいですか。 例えば"項"と入れたら項目の表示が"項"へ、 "項目"まで入れたら"項目"へという具合です。
表示を変えるってどういうこと? ListBox に入ってる文字列を変更するってこと? SelectedItem 書き換えれば良さそうだけど。
リストボックス内の項目をインクリメンタルサーチしたいてことじゃね?
245 :
デフォルトの名無しさん :2006/03/19(日) 13:04:48
>>243 文字列を変更するということです。
>SelectedItem 書き換えれば良さそうだけど。
これでリアルタイムで反映されますか?
>>244 いえ、そんなに高度なものじゃないです。
まずはやってみろ。話はそれからだ。
247 :
デフォルトの名無しさん :2006/03/19(日) 13:20:29
これでは動かなかったのですが。 private void textBox1_TextChanged(object sender, System.EventArgs e) { listBox1.SelectedItem = textBox1.Text; }
FindString使え
>>248 項目を検索するわけではないです。
リストボックス内の選択されている項目の表示を
テキストボックスに入力中の文字列と同期させたいのです。
あんまりメゾット(なぜかこう入力された)とかようわからんけど foreach(SelectedItem item in listBox.1) { if(item.Text == textBox1.Text) 選択する } みたいなかんじでいいんじゃね?
>>250 おー、まさにこれです。本当に有り難うございました。
>>251 こちらも試してみようと思います。
>>251 もうちょっと流れを読んだりしっかり要求項目を把握したりするようにしような
>>242 ていうか普通にComboBox使ったらだめなのか?
ArrayListは配列みたいに添字で(hogeList[0]で)アクセスできないのでしょうか?
できるよ?
キャストしたか?
259 :
256 :2006/03/20(月) 17:32:53
>>259 おまいが先にコードかかんとなんともいえないと思うんだが
261 :
256 :2006/03/20(月) 18:01:25
>>260 foreach(string s in hogeList)
を
for(int i = 0; i < hogeList.length; i++)
string s = hogeList[0];
な感じにしたいです。
hogeList[i] で返ってくるのは Object 型。 キャストしてやんなさい。
263 :
256 :2006/03/20(月) 18:29:38
>>262 ありがとうございます。出来ました。
for(int i = 0; i < hogeList.Count; i++)
string s = (string)hogeList[i];
今ファイル検索プログラムを組んでいるのですが、検索最中にアクセス権限がないフォルダ などに当たるとUnauthorizedAccessExceptionというエラーを吐いて止まってしまいます。 そこで、こいつにアクセス権限を与えたいのですが、どのようにしたらいいでしょうか?
素直にUnauthorizedAccessExceptionが投げられたときはそのフォルダを検査不能であると返しておけ。
プロジェクトを新規作成する際に、テンプレートを 「Windowsアプリケーション」にしたのですが、 デバッグのためのコンソールを表示したくなりました。 どのようにしたらコンソールを表示出来るのでしょうか。 初歩的な質問ですみません。
267 :
264 :2006/03/20(月) 18:59:28
>>265 やはりその方がいいのですか・・・
有り難う御座いました。
先週からC#をはじめ、現在「Visual C# .NET 逆引き大全500」を見ながら勉強しています。 読み終わりそうなので、次に買う本を探しています。 基本的なクラス一覧やたくさんのサンプルがのっているリファレンスで おすすめなものがあれば参考にさせて欲しいです。
>>266 デバッグのためならコンソール使うよりも System.Diagnostics.Debug の WriteLine 使った方が良いかも。
>270,272 ありがとうございます、参考にさせていただきます。
コントロールのハンドルを取得したいのですが、どのようにすれば良いでしょう??
コントロールによる。 自分のプロセス内の、Control から派生してるコントロールなら Handle プロパティ。
>>275 レスどうもありがとうございます。
MSDNライブラリには
「コントロールのバインド先のウィンドウ ハンドルを取得します。」とあったのですが、
これでコントロールのハンドルを取得できるでしょうか??
コントロールにIMessageFilterを実装させてメッセージのフックには成功したんですが、
そのコントロールだけじゃなくフォーム内全てが対象になってしまっているので
ハンドルを取得して操作対象を絞りたいなと思いまして・・・
IMessageFilter での処理なら、ハンドルを取得するんじゃなくて逆に Control を取得した方が良いだろう。 Control.FromHandle 静的メソッドがある。nullチェックも忘れずにな。
どうもありがとうございます。 Controlの取得に成功しました(^^ ですが、 PreFilterMessage( ref Message m ) の引数のm.HWndに格納されているハンドルのコントロールが存在していないらしく、nullが返ってきました。 TextBox等だと成功するんですが、WebBrowserコントロール上でクリックした時などに送られてくるm.HWndの正体が分かりません・・・。 どうにかWebBrowser宛てのメッセージだけを処理したいのですが。。。 何度も何度も申し訳ないです(汗)
そう言うことは早く言え。 HtmlDocument のマウスイベントじゃ駄目な理由を述べろ。
string str = @"test"; サンプルコードにこのようなコードがありました。 @"で検索したのですが、一致しませんでした。 わかる方がいましたら、教えてください。
>>280 エスケープ無視だった気がする
\nとかそのまま表示だったかなー
\を普通に文字として読む。改行も普通\r\nと書くのと同義になる。 C# の言語仕様とか調べると良いよ。
>>280 具体的には
string str = "c:\\windows\\hoge.txt";
なんて書かなくて
string str = @"c:\windows\hoge.txt";
で済む。それから
string str =@"
select
CustomerID
from
Customers ";
なんて書けたりする。
いわゆるヒアドキュメントもどきだ。
ありがとうございます!
あるプログラムの上から特定のプログラムを強制終了させたいのですが、 とのようにしたらいいのでしょうか? kill等を使うのはわかったのですが、どうやっても例外が発生して 強制終了させることが出来ません。 よろしくお願いします。
例外が発生するならそれを書け。 そもそもkill等を使うとか曖昧なこと書かずに実際に試した手順を省略せずに書け。
288 :
デフォルトの名無しさん :2006/03/21(火) 23:36:58
すいません。 プログラムは以下のようなものです。 string exe_name = "プログラムの名前"; if (Process.GetProcessesByName(exe_name).Length >= 1) { Process p = Process.Start(exe_name); p.Kill(); } そして、発生した例外はWin32Exceptionでした。 このことに関しては全くわからないのでIntellisenseで出てきた物を手探りで いろいろ試してるところです。 他にも、終了させる側のプログラムを二重起動禁止にしてもしてみましたが 意味はありませんでした。
インテリセンスじゃなくてヘルプ(ドキュメント)を使おうな。手探りなら。 > string exe_name = "プログラムの名前"; > if (Process.GetProcessesByName(exe_name).Length >= 1) > { > Process p = Process.Start(exe_name); > p.Kill(); > } Process.Start ってのはヘルプを見たら分かるとおり、「プロセスを開始する」メソッドだ。 終了させたいのにそれどころか起動させてどうする。 終了させたいプロセスはすでに GetProcessesByName で取得できているだろう? それを使うんだ。
290 :
デフォルトの名無しさん :2006/03/21(火) 23:59:47
>>289 こういうことでしょうか?
if (Process.GetProcessesByName(exe_name).Length >= 1)
{
Process p = new Process.GetProcessesByName(exe_name);
p.Kill();
}
取得したのをどうしたらいいんだ・・・orz
いやいや、new する必要はないだろ? ・Process.GetProcessesByName でその名前のプロセスの Process 配列が手に入る ・この Process 配列は今起動しているプロセスの一覧である ・つまりその各要素であるそれぞれの Process はそれぞれ起動中のプロセスである で、起動中のプロセスに対してどう操作する?
>>291 いろいろ考えてもこんなのしか出てきませんでした・・・
if (Process.GetProcessesByName(exe_name).Length >= 1)
{
int pNo = Process.GetProcessesByName(exe_name).Length;
Process p = Process.GetProcessById(pNo);
p.Kill();
}
でもこれじゃ要素の数だから全く違うんだよな・・・
配列の意味は分かってる? string[] names = new string[]{"a", "b", "c"}; "a"が欲しいときはどう書くか分かる?
>>293 string a = names[0]
・・・ですよね?
配列滅多に使わないからうろ覚え・・・
配列を滅多に使わないってのも凄いな。 で、今回のことに応用したらどうなる? 配列の全ての要素にアクセスするにはどんな手段が考えられる?
>>295 まだ駆け出しの駆け出しなので練習用プログラムしか組んだことないです。
上の例で行くと
foreach(string a in string names)
{
/*何らかの処理*/
}
ですよね?
今頃ですが、もしかしたらProcess配列からどうやって配列を取り出すのかが
わかってないかもしれません・・・
> foreach(string a in string names) 二番目の string はミススペリングかな。 配列から配列を取り出してどうする。 配列からは各要素を取り出すんだ。 string 配列である names をぶんまわして取れるのは string であって string 配列じゃないだろ? Process.GetProcessesByName で Process 配列が手に入る。 さて、これをぶんまわせば何が取れる?
>>297 できました・・・
if (Process.GetProcessesByName(exe_name).Length >= 1)
{
foreach (Process p in Process.GetProcessesByName(exe_name))
{
p.Kill();
}
}
これで合ってる・・・かな?
うん、基本的に正解。 じゃ次。 string names = new string[0]{}; foreach (string str in names) { /* */ } これはどういう意味で、実行結果はどうなる? string names = null; foreach (string str in names) { /* */ } これは?
あー、例題が間違えとるw string[] names = new string[0]{}; と string[] names = null; な。
>>299 上の方は配列の配列・・・?
実行結果はstring[0]が返ってくるのでしょうか
下の方は返ってくるのはnullでしょうか?
names の型は宣言通りの型だ。(間違えて書いたわけでアレだが) どっちも string[] として宣言してる。 string[0]{} ってのは、string[0] とも string[]{} とも書ける。要素数 0 、空の配列ってことだな。 さて、それぞれの names に何が入ってるのかは分かったね? じゃあそれに対して foreach を使うとどうなるか? ってのが趣旨。
訂正 >実行結果はstring[0] →names[0]
>>302 何も返ってこないまたはnullが返ってくる
でしょうか?
まあ取りあえずやってみ。 ループ中はConsole(かDebugか).WriteLineで文字列を出力するとかブレークポイント置くとかして流れがきちんと把握できるようにな。
>>305 試したところ、
string[] names = new string[0]{};の方ではmanesに{次元:[0]}が
返ってきてました。
string[] names = null;の方は、foreachのinで例外NullReferenceExceptionが発生しました。
うむ。 さて元のコードに立ち返ろう。 君が書いたコードではまず GetProcessesByName で取得した配列の長さで条件判断しているが、これは何故かな?
>>308 指定したプロセスがあれば1以上、無かったら0が返ってくるので
>= 1で比較することが出来るため
です
あんまり自信がないな・・・
じゃあ何故そこで比較して 1 以上の時だけ foreach を回すようにしようと思ったのかな?
>>310 指定したプログラムを強制的に終了させるためです。
そうじゃないそうじゃない。 ……うーん、いつまでたっても隙間が埋まらない気がしてきた。 何故 0 のときは foreach をスキップしたんだ? ってことなんだけど。 さっきの実験で foreach に対して要素数 0 の配列を渡しても別に問題はなかったよね? だからわざわざ長さで条件判断する必要はない、と結論付けたかったんだが。 まあいいや、じゃ最後。 > 無かったら0が返ってくるので これは保証があるの? ひょっとして null が返ってきたりしない? もし null が返ってくるのなら foreach に渡すのも Length プロパティを取得するのも失敗するけど?
>>312 あ、そうか。
わざわざ比較してからforeachを通す必要は無かったのか・・・
最後については、
Process.GetProcessesByName().Lengthの解説では、
System.Arreyのすべての次元内の要素の総数を表す32ビット整数を取得するので
大丈夫だとおもいます。
>>314 > Process.GetProcessesByName().Lengthの解説では、
> System.Arreyのすべての次元内の要素の総数を表す32ビット整数を取得するので
うん、Process.GetProcessesByName() が配列のインスタンスを返したらそうだろうね。
じゃあ、Process.GetProcessesByName() が配列を返す(null を返さない)って保証は?
保証がないのなら確実に null かどうか判断しないと、Length を調べる時点で例外が出ちゃうぞ。 さて、本当に保証がないんだろうか? そこでヘルプの出番だ。 Process.GetProcessesByName を調べてみ?
318 :
デフォルトの名無しさん :2006/03/22(水) 03:05:16
>現在ローカル コンピュータ上で実行されていない実行可能ファイルも指定できるため、 >メソッドが返す配列は空のこともあります つまりこれは保証されているってことですすよね?
そう。空の配列はつまり要素数0の配列。 実行されてるのが無いときは空の配列が返るってことだね。 つまり null かどうか確認する必要も無し。直接 foreach にたたき込んじまえ。 以上で今回の講義は終了。 補講: if (Process.GetProcessesByName(exe_name).Length >= 1) { foreach (Process p in Process.GetProcessesByName(exe_name)) みたいに GetProcessesByName で確保した配列を何回か使う場合、 一旦 Process[] processes = Process.GetProcessesByName(exe_name); とやってから if (processes.Length >= 1) { foreach (Process p in processes) としたほうが良いぞ。 Process.GetProcessesByName は結構重い処理だからな。
>>319 有り難う御座いました。
質問の回答どころか、それ以上の事を教えてもらえて、
かけることが出来るお礼の言葉が見つかりません。。
これからはより一層力を入れて勉強したいと思います。
本当に有り難う御座いました。
感動した
ToolTipを勝手に消えないように(マウスを動かしても消えないように) したいんですが、どうすればいいんでしょうか?
>>324 ToolTip.Showを使えばいいような気がしないでもないです。2.0限定らしいですけど。
>>325 うーん・・・使ってみたんですけど消えちゃいます
枠のないウィンドウを作ってツールチップに見立てれば?
Hide()をオーバーライドしてみるとか
↑無理ですすみません
ToolTip.Show()だとモーダルになるはずだけど?
C#と関係なくて申し訳ないんだけど、 「〜の数」とかを格納する変数の名前ってどんなのつけてる?? numberOfPageとか アンダースコアとか"Of"は個人的にはあんまり使いたくないけど・・・ Ofはなんか見にくい感じがする
hogeCount とか。
あ〜、そういえばxxCountとかは結構見かけるかもね どうもありがと(^-^
hoge.Countと見分けづらい
hogeCnt
IDEが普及している昨今に省略単語やらハンガリアンやらを使うなって どこかのだれかが言ってた。 気がする。
最近は変数名が英文になってる人が増えた せめて数語の単語程度にしようぜ
JavaあたりからなんちゃらOfなんちゃらとか増えたような。 浅学ゆえ、それ以前にもあったかどうかは知らんが。 とはいえCやらUNIXコマンドやらの如き省略っぷりも初見では見切れんしな strpbrkとかxmkmfとか
プロパテーと見分けが付くようにと HogeCNTってのを強制したコーディング規約を見たことある HogeLENGTHとかHogeINDEXとか後に付くのは全部大文字 固定ピッチのフォントで Hoge.Count と HogeCount が見分け辛いってあるか?
クラス名や名前空間名との区別のためじゃないの?
>IDEが普及している昨今に省略単語やらハンガリアンやらを使うなって >どこかのだれかが言ってた。 >気がする。 ひらがなてどうよ?
そう言えばひらがなカタカナつかえるっぽいな
変数名とかに普通に日本語使えますよ
まじ?知らんかった・・・
2005とか普通に自動生成してくるやん
今時変数名に英数字以外使えない言語ってあるの?
class ぬるぽウィンドウ : Form
>>347 つか、プロジェクト名もクラス名も当然のごとく全部英数字でやってたんで、
自動生成でも日本語出ないし。
質問です。適切で無い場合は、恐れ入りますが誘導お願います。 オブジェクトのコピーってどうやるんでしょうか? あるオブジェクトを暫定的に処理して、その結果をコピー元のオブジェクトへ反映したいのですが、 どうもうまく行きません。 例: class Original { public string str = "abc"; } class Temp{ private Original ori; public Temp( Original ori ) { this.ori = ori; //これだと参照ですよね? this.ori = new Original(); //これだといちいちメンバの値を直さないといけないし }
自前で実装する。その例だと Original クラスがメソッドを持つ必要があるな。 普通は ICloneable を実装させるがまあ別に必須ではない。 Object が protected メソッドとして全てのフィールドをシャローコピーする MemberwiseClone を持っているから、 特に考える必要がないのなら実装するメソッドはこれを呼び出すだけで良い。
>>352 ありがとうございます。稚拙な質問にも返答いただき感謝しております。
さっそくICloneableメンバのClone()を実装し、MemberwiseClone()にて
オブジェクトを返したところすべて上手くいきました!!
適切かつ迅速に回答頂き、心より感謝申し上げます。
ありがとうございました。
一つ注意。 MemberwiseClone はシャローコピー、つまり浅いコピー。 つまりフィールドに参照型を持っている場合、それは参照しかコピーされない。
アドバイスありがとうございます。 テストして確認し、実感いたしました。きっとミスしていたと思います。 ご忠告ありがとうございました。
Formを表示させないようにするにはどのようにするのでしょうか。 FormのプロパティにVisibleが無いので困っています。 Opacityやサイズの変更ではない方法というのは無いんでしょうか。
いや、Visible あるよ? 基底クラスである Control のプロパティなんだし。 インテリセンスやプロパティグリッドには出てないかも知れないけど。 あと Hide メソッドがある。
プロパティグリッドに出ていないので無いのかと勘違いしていました。 ありがとうございます、調べてみます
Formを非表示にすると、CPUやメモリの負担を多少なりと減らすことが出来ると思いますか? 今試していますが、なんとなく表示時より安定しています。
dataGridView1.Rows[0].Height = 15; WriteLine(dataGridView1.Rows[0].Height); 行の高さを15に設定したはずが、WriteLineでは20と表示されます。 Rows[0].MinimumHeightは3なのですが、何がいけないんでしょう。 わかる方いらっしゃいますか?
>>343 2005に関連する話題ということで少し続けさせてもらうと。
例えばToolStripMenuItemをデザインモードで入力したときに
Nameが「ファイルFToolStripMenuItem」とかなるのは勘弁してほしい…
せめて「toolStripMenuItem1」くらいにしておいて欲しかったなあ。
「コントロールのクラス名をサフィックスにする」のと 「メリケンではアクセスキーを"&File"式で付ける」のとが 合わさってこういう仕様になったのを、そのまま日本語化したので こんなことになってしまったんだろう。こまったもんだ。 それでまた話がそれるけどコントロールのクラス名をサフィックスに 付けてますかおまいらは? おいらは「toolStripMenuItemファイル」「textBoxファイル名」みたいに クラス名+キャプションてのがお気に入りなんですが。
>>361 β1で触ってえ゛っーで、正式版では当然直るだろうと思ってたのに。
>>363 かなり変則的だな。むしろ変態的かもしれん。
たとえば、
fileToolStripMenuItem
で、このメニューの下に「開く」メニューがあると
fileToolStripMenuItemOpen
みたいな。
tsmiFile tsmiFileOpen みたいなかんじ。 インテリセンスで同じ種類のが並ぶから便利
>>366 はハンガリアン記法ではなくて先頭が頭字語なだけでは?と釣られてみる。
>>366 からは外れるが
Pascal式は単語の先頭だけ大文字にするっていう一貫性のあるルールだからいい。
ハンガリー記法も、接頭語とそれ以外の単語で意味が違うから問題ない。
だけど先頭単語とその単語に意味の違いがあるわけでもないのに
先頭の単語はすべて小文字にするcamel式は気持ち悪くてしょうがない。
ハンガリー記法の法が数倍マシ。
>>369 俺は何ともないけど気持ちはわかるな。でも
英語とかは1文中の各単語は単語で代わりはないけど、先頭の単語だけ
先頭大文字で書くじゃん。それの逆だとか考えたら気持ち悪さ減少しないか?
>>370 英語は先頭大文字の文化が確立している
ところがCamel法だけはそれを無視してる
だから気持ち悪いんだろ
Camel法は、日本語で言えば平仮名と片仮名が逆転したような気持ち悪さがある
コノこんぴゅーたノCPUハ何ぎがへるつデスカ
あ、書いてみたらちょっと気持ち悪さが取れたかもw
初歩的な質問ですみません。 foreachの中で現在の要素が何番目の要素かどうかというのは、 自前でcount++;などしていく方法しかないのでしょうか。
そう。
ありがとうございました。
逆にforとインデクサっつー手もある。
新しいFormインスタンスを作った場合、そのFormはもともとのFormとは別スレッドなのでしょうか?
別スレッドで作るようにコーディングしない限り同じスレッドだ。
WebBrowserでページをダウンロード・描画している間やListBoxに大量のデータを格納しようとする場合に マウスが砂時計になるのを防ぎたいんですが this.Cursor = Cursors.Arrow; ↑これではだめでした。なにがいけないですか?
コンポーネントやシステムの内部でやってることに口を出そうとしたこと……かな
いえてる。
Close()がないのに(Dispose()なのに)Close()のつもりでcl[enter]とタイプして、 Clone()で確定していたことに ずーっと気付かなかった・・・て経験ないですか?
DataGridViewとSQLを接続している方に伺いたいことがあります。 SQLにはstring型以外のデータをセットできますか?
383 :
デフォルトの名無しさん :2006/03/29(水) 21:56:43
timeGetTime関数が使いたかったので試しにクラスを作ってみたんですが 何か問題があれば指摘してください。 public sealed class CMMTimer : IDisposable { private static readonly CMMTimer mmtimer = new CMMTimer(); private static int flagDisposed = 0; public static CMMTimer Instance { get { flagDisposed++; return mmtimer; } }
384 :
デフォルトの名無しさん :2006/03/29(水) 21:57:48
private CMMTimer() { timeBeginPeriod(1); } ~CMMTimer() { Dispose(); } public void Dispose() { if (--flagDisposed == 0) { timeEndPeriod(1); GC.SuppressFinalize(this); } }
385 :
デフォルトの名無しさん :2006/03/29(水) 21:58:32
public int Time { get { return timeGetTime(); } } [DllImport("winmm.dll")] private static extern int timeGetTime(); [DllImport("winmm.dll")] private static extern uint timeBeginPeriod(uint uPeriod); [DllImport("winmm.dll")] private static extern uint timeEndPeriod(uint uPeriod); }
何か問題があればてw 何のためにコンパイラがあるんだ。 デストラクタてw
387 :
383 :2006/03/29(水) 22:17:38
>>386 > デストラクタてw
初めてDisposeを使ったので、使い方があってるか分かりませんが
とりあえずDisposeのサンプルにもデストラクタがあったので、、、まずいですか?
388 :
383 :2006/03/29(水) 22:18:46
その場合、timeEndPeriodはどこで呼べばよいでしょう?
というかだな、わざわざシングルトンにするな。 ・コンストラクタで timeBeginPeriod を呼ぶ ・public void Dispose() は private void Dispose(true) を呼び出してから SuppressFinalize ・ファイナライザは private void Dispose(false) を呼び出す ・private void Dispose(bool) はまだ呼ばれていない場合に timeEndPeriod を呼び出す
390 :
383 :2006/03/29(水) 22:29:31
timeBeginPeriod(1)が何回も呼ばれるとまずいと思ったのでシングルトンにしたんですけど ひょっとして問題ないですか? それだけでだいぶ楽になります。 >・public void Dispose() は private void Dispose(true) を呼び出してから SuppressFinalize >・ファイナライザは private void Dispose(false) を呼び出す >・private void Dispose(bool) はまだ呼ばれていない場合に timeEndPeriod を呼び出す ↑ さっそくやってみます
392 :
383 :2006/03/29(水) 23:55:59
こんな感じになりましたがDisposeがやっぱり変ですか? public sealed class CMMTimer : IDisposable { private bool flagDisposed = false; public CMMTimer() { timeBeginPeriod(1); } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } private void Dispose(bool flag) { if (!flagDisposed) { if (flag) { } timeEndPeriod(1); flagDisposed = true; } } ~CMMTimer() { Dispose(false); } public int Time { get { return timeGetTime(); } } [DllImport("winmm.dll")] private static extern int timeGetTime(); [DllImport("winmm.dll")] private static extern uint timeBeginPeriod(uint uPeriod); [DllImport("winmm.dll")] private static extern uint timeEndPeriod(uint uPeriod); }
いやtimeEndPeriodを複数回呼ぶことになったらまずいんでないの? ※詳しくないからMSDN読み違えかも知れんけど。
>>393 どういう意味で言ってるのか分からんが、timeEndPeriod は timeBeginPeriod と同じ回数呼ばねばならない。
取りあえず 392 のコードで問題なさそうだが。
395 :
383 :2006/03/30(木) 23:02:23
今日はtimeSetEventを使ってみようと思ったのですがさっぱり分かりませんでした。。 どなたかヒントをお願いします。
丸投げはよせ。 まずどこまでコード書いてどこまで理解したか書くんだ。
397 :
383 :2006/03/30(木) 23:12:47
コードを書く前で詰まってます ここをどーすればいいのか分からないです↓ private static extern uint timeSetEvent(uint uDelay, uint uResolution, LPTIMECALLBACK fptc, int dwUser, uint fuEvent);
コールバックなら、基本的にコールバック関数と同じ返値&引数を持ったデリゲートを宣言して、それを使えばいい。 例えばコールバック関数が DWORD HOGECALLBACK(DWORD value); なら public delegate int HogeCallback(int value); で引数に HogeCallback デリゲートが分からないってんならまずそっちから勉強する必要があるぞ。
399 :
383 :2006/03/30(木) 23:21:38
ありがとうございます デリゲートの勉強からはじめます。
400 :
383 :2006/03/30(木) 23:51:04
わーい、ありがとうございます。 かなり勘だけで作ったけど何とか動きました。 もうひとつだけ質問です。 試してみたら TIME_ONESHOT → 0 TIME_PERIODIC → 1 みたいだったけど、こういうのってどこで調べればいいんですか?
VC++ 入れてたり PlatformSDK 入れてたりするならヘッダファイル。 そうでないなら Google。
402 :
デフォルトの名無しさん :2006/03/31(金) 03:56:14
textboxでEnableをfalseにした状態のフォント色の変更って出来ませんか?
>>400 そーいう感じでCLRの外に(マーシャリングして)関数ポインタを晒した
delegate は、static 変数に入れるとかして保持しておかないと gc されて
アボーンするから気をつけてね。
MS のなんかのドキュメントにも書かれてるけど。
一瞬も true にすることはできないのか?
>>402 TextBox継承してEnabledを自前で実装
WindowsApplicationを作っているのですが、デバッグモードで起動すると2回に1回、ロードがはじまりません。 このようなことはよくありますか?
よくとは言わないがそれなりに。
410 :
デフォルトの名無しさん :2006/03/31(金) 19:29:23
フォームデザイナで作成したフォームの、各コントロールに += されているイベントハンドラって、実行中に動的に 別のイベントハンドラと関連付け直すってことは できるのでしょうか?
-= して += すれば? 同じメソッドなら -= new HoveEventHandler(hogehoge) でも問題ないよ。
そろそろ2005の書籍が何冊か出てるみたいですが オススメありますか?
Form_Closing イベントの追加はどのようにやればいいですか? イベントを選択するプロパティにないためわかりませんでした。
イベントを選択するプロパティってのもなかなか複雑だな 2005 か? なら代わりに FormClosing 使え
ありました、ありがとうございます。
ArrayListに50文字のstringが1000個ほど入れてあり、 foreachのStreamWriterでファイルに記録しようとしているのですが もっと良いおすすめの方法などがあれば教えてください。
ArrayList やめて一つのベタ string にする。 まともに答えるなら、それでいいんじゃない?
ArrayListをシリアライズ
べたstringでArrayListにインデックスを持たせる
DateTimeで今日の日付ってどうやって取得するんですか?
Now 静的プロパティ
DateTime date = new DateTime( 2006, 3, 32 ); ArgumentOutOfRangeException はハンドルされませんでした。
423 :
416 :2006/03/32(土) 01:11:31
>>420 DateTime dt = DateTime.Now;
int today = dt.Day;
ArrayList list = new ArrayList();
list.Add(new string[] { "山田", "太郎" });
list.Add(new string[] { "山田", "次郎" });
このようなArrayListがあります。
これをシリアライズしてXMLファイルにしたいのですが、
InvalidOperationException はハンドルされませんでした。
XML ドキュメントを生成中にエラーが発生しました。
というエラーになります。
ご教授願います。
XmlSerializer lizer = new XmlSerializer(typeof(ArrayList));
using (FileStream stream = new FileStream("hoge.xml", FileMode.Create))
{
lizer.Serialize(stream, list);
}
XmlSerializer(Type, Type[]) 使え。
425 :
416 :2006/03/32(土) 01:37:59
>>424 Type[] et = new Type[] { typeof(string) };
XmlSerializer lizer = new XmlSerializer(typeof(ArrayList), et);
で試してみたのですがだめでした。
× Type[] et = new Type[] { typeof(string) }; ○ Type[] et = new Type[] { typeof(string[]) }; こちらで出来ました。ヒントありがとうございました。
おめ!
Form1にあるWebBrowser1に表示されているページにて 新しいウィンドウで開くようなリンクなどをクリックした場合、 そのリンク先をForm2のWebBrowser2に表示させたいのですが どうすればいいでしょうか? WebBrowser1のNewWindowイベントで何かすればいいのかなぁ・・と漠然としてます。
>>428 CodeProjectにサンプルがあるから
Googleで ExtendedWebBrowser で調べてみな。
>>429 お早い返信ありがとうございます。早速見つけました。
読んで試してみます!
>>431 やることわかってるなら>430のフィードバックセンターから
コードをコピーした方が早いよ。
やってることは同じだけどCodeProjectの方が詳しいっていうだけ。
>>430 入れ違いで見逃してました、ありがとうございます。
>>432 始めたばかりの自分には二つともコードが長すぎて正直どうすればいいかさっぱりですたorz
もうちょいがんばってみます。
最近、C#を勉強し始めたのですが、質問させて下さい。
10 行でズバリ !! リレーショナルデータテーブルの構築 (C#)
ttp://www.microsoft.com/japan/msdn/thisweek/300x10/phase2/relationaldata/cs.aspx を参考にし、データベースの内容を表示させるようにしてみたのですが、
確かに上記の説明で、リレーションを元にデータを表示する事が出来るのは理解できました。
そこで、単純な疑問が湧いたのですが、
>// Orders テーブル用のデータ アダプタを準備する
>SqlDataAdapter da1 = new SqlDataAdapter ("SELECT OrderID, CustomerID, OrderDate FROM Orders" , con);
>
>// Orders Details テーブル用のデータ アダプタを準備する
>SqlDataAdapter da2 = new SqlDataAdapter ("SELECT OrderID, ProductID, UnitPrice, Quantity FROM [Order Details]" , con);
とありますが、これだと必ず全レコードを取得してしまうような気がするのですが、どうなのでしょうか?
内部処理がどうなっているのかが不明なのですが、
Orders Detailsを全件ローカルに取得してから、親レコードのOrdersのカレントレコードが変わったときに
該当するデータを絞り込んでいるように見えます。
それとも、こういったソースで、Ordersのカレントレコードと関連のあるOrders Detailsのレコードを
動的にDBから取得しているのでしょうか?
仮に後者なら、業務で数万件〜数百万件のレコードが存在するような親−子テーブルを処理する場合、
レスポンス的に業務では使えないものになるような気がするのですが?
435 :
434 :2006/04/02(日) 19:47:43
追記です。 今さっき、ちょっとテストしてみました。 ・クエリアナライザをしようして監視 ・最初にデータを表示されてから、SQLServerのサービスを停止させる 結局の所、親−子とも全レコードを最初に抽出したあと、リレーションにもとづいて データを表示させているだけでした。 これを、親レコードが選択された場合に、リレーションにもとづいて DBからデータを取得するようにするにはどうしたらいいのでしょうか?
GraphicsクラスのDrawStringメソッドで改行禁止で文字列を描画したいのですが・・・ 事情があって、Rectangleのサイズは変えられません。 Rectangleのサイズが大きめなので文字列が長いと2列になってしまうのですが、 何かいい方法はありませんでしょうか・・・?
どんな事情か聞かせろ。 StringFormat 使えば何とかなると思うが。
438 :
436 :2006/04/02(日) 23:44:48
xx.FormatFlags = StringFormatFlags.NoWrap; でいけました。 StringFormatは使ってたんですが見落としてました。 ごめんなさい。(´・ω・`)
どうしてEventHandlerのsender引数はobject型と決まってるの?
EventHandler デリゲートの第一引数が object 型を要求するから
EventHandlerから継承したdelegateの第一引数はobjectじゃなくていいの? HogeHogeEventHandler(string text, int index)とかやってるんだけど無問題? これがOKならEventArgsがなんのためにあるのか分からなくなってきた・・・
デリゲートは全て暗黙に MulticastDelegate から派生するので、EventHandler とはなんの関係もない。 構わないと言えば構わないが、Microsoft のガイドラインに従うのなら、 イベントのデリゲートは delegate void HogeEventHandler(object, HogeEventArgs) にすべきである。 イベント引数の要素を後で変更したくなったときにイベントシグネチャを変える必要がないから。 // HogeEventArgs を継承する HogehogeEventArgs をイベントに渡す。
443 :
439 :2006/04/03(月) 19:50:30
ガイドラインであってルールではない 自分なりのガイドラインがあっても良いし、Microsoftのガイドラインに沿ってもいい 今回の場合はMSガイドラインに沿うと拡張性は上がる でも嫌なら好きなように作ればいい
イベントハンドラは複数のイベントで実行されうる。 例えば、IE のメニューの「文字のサイズ-最大/大/中/小/最小」なんて、 同じイベントハンドラを呼び出してそこで「どこから呼び出されたのか」を判断する方が自然だ。 そのための sender 。 で、ガイドラインにするのはイベントをそう言う統一的概念で扱えるようにするため。
まあ、イベントは汎用だっていう考え方なんだろね。
マイクロソフトのガイドラインが絶対じゃない 自分なりに統一的概念を作れるなら他の実装でも構わない ただ、自分が考えるガイドラインってのは往々にして「自分の理解の範囲」に特化した劣化版がほとんど 最後は開発側であるマイクロソフトのガイドラインに帰結すると思うよ
質問です。 以下のようなメール送信プログラムを作ったのですが、 SmtpMail.Send(textBox1.Text, label2.Text, label5.Text, textBox2.Text); MessageBox.Show("送信しました", "送信完了", MessageBoxButtons.OK, MessageBoxIcon.Information); this.Close(); ※送信先(label2)とタイトル(label5)は固定 自分のところではうまく送信できたのですが、ビルドした物を友人に送信して試してもらったところ、 以下のようなエラーが出て送信できませんでした。 System.Web.HttpException: "SendUsing" の構成値は無効です。 ---> System.Reflection.TargetInvocationException: 呼び出しのターゲット が例外をスローしました。 いろいろ試しても自分のところで再現することが出来ず、何が原因かわからず困っています。 上のエラーは何が原因なのでしょうか?
一行ずつデバッグしていってエラー飛んだところだカス
>>448 あまりに突っ込みどころが多すぎて困る
まずは友人とやらの環境を確認しろ
・SMTPでインターネットへパケットを飛ばせる環境なのか
・SMTPの送信に制限が掛かっていないか
・メールサーバの設定は正しいか
・メールサーバのSMTP認証に反した送信をしていないか
・メールサーバがプロバイダのものなら、そのプロバイダ以外からの接続を許可しているのか
ネットワーク系の場合はコード以外に環境も確認しろ
451 :
デフォルトの名無しさん :2006/04/04(火) 23:38:10
byte→stringしたいのですが、 Convert.ToChar(bytes[i]); をループさせるのと Encoding.ASCII.GetString(bytes); って何が違うの? 逆にstr→byteしたいときも BitConverterつかうのとASCII.GetBytes(str) って何が違うの? 文字コードとかワケワカラン・・・
AやBだけのキーで実行できるいわゆるワンキーショートカット を実装したいのですがどうすればいいでしょうか? もうちょっと具体的にいいますと ContextMenuStrip内のToolStripMenuItem.ShortCutKeyDisplayStringプロパティに "A"や"B"などのショートカットを設定してそれを実行できるようにしたいのです。
453 :
デフォルトの名無しさん :2006/04/04(火) 23:48:20
ListView + TreeView みたいなのって、標準では存在しないのでしょうか。 VS2005 の「プロパティ」がまさにそれだと思うのですが。
>>453 PropertyGrid
柔軟性が欲しいならコンポ探せ
>>451 メモ帳でUTF8とシフトJISのテキストファイルを作って読み込んでみろ
>>452 無理。
KeyDownとかで代用
>>453 あれはPropertyGrid
>>451 使われるのが ASCII コード(0x00-0x7F)だけなら変わらん
それ以上知りたければエンコーディングを勉強すれ
>>453 プロパティグリッド? プロパティの表示専用みたいなもんだが。
’ ↑これってなんて読むのですか? ネットで検索したいんだけど一文字だからできなくて おねがいします
459 :
451 :2006/04/05(水) 00:20:44
みなさんレスありがとうございます。 hmac_md5計算しようとしてるんですが、byteやらstrやらが入り乱れて わけわからんくなってきてます・・・ 地道にがんばります。
460 :
453 :2006/04/05(水) 00:22:44
MSDNライブラリの.NETのクラスリファレンスのURLを教えてください、
ms-help://MS.MSDNQTR.v80.ja/MS.MSDN.v80/MS.NETDEVFX.v20.ja/dv_fxgenref/html/ こうですか? わかりません!
>>464 その言葉をここに書き込むよりGoogleの検索欄に書いた方が速いよ?
まあこんなレスするより教えた方が速いんだが
>>465 ごめんなさい。MSDNサイト上のURLです。
>>464 いままで検索からきていたのですが、新サイトに移行してから分からなくなってしまいました。C#やVB.NETのリファレンスなら見つかったのですが…。
.NET 2.0 で追加されたクラスとかメソッドとか検索すれば一発だよ
textBoxに一行づつstringを書き込みたいんですけど textBox.Textは一度に読み込ませないとだめみたいで こういう場合どうすればいいでしょうか?
AppendText で追加できるけど。
472 :
470 :2006/04/06(木) 00:22:00
>>471 おお、こんな便利なメソッドがあったとは
ありがとうございます
BinaryReader.ReadUInt32()で0x12345678を読み込ませると78563412と逆になってしまいます(リトルエンディアン?) これを逆にならずに読み込ませる方法を教えてください。
x86 使う以上、リトルエンディアンでごく自然なことだと思うけどね。 数値をビッグエンディアンで解釈するには System.Net.IPAddress.HostToNetworkOrder なんてメソッドもあるけど。
なるほど… 分かりました。ありがとうございました。
>>472 ,474の呼び方は「イベントハンドラ」だと思っていたけど「メソッド」でいいの?
イベントを処理する訳じゃないからな。 イベントハンドラは、イベントに関連づけられてイベントが発生したときに実行されるメソッド。
文字列を指定文字で分割する場合Splitがありますが 2文字以上の連続した文字列で分割したい場合 便利なクラスはありますでしょうか?
String.Split .NET 1.x なら Regex 使えば?
481 :
478 :2006/04/06(木) 19:50:49
ListViewItem.ListViewSubItem これはどういう構造なんでしょうか? ListViewSubItemはListViewItemを継承してるんでしょうか? こういう感じのものをArrayListを使って作りたいんですけど やり方がよくわかりません 学校.クラス[0].クラスメイト[0].名前="まっちゃん"; 学校.クラス[0].クラスメイト[0].身長="230cm"; みたいなものを作りたいんです 構造はlistviewに近いので参考にしようと思ったのですが よくわからなくて・・・
ArrayList のなかに ArrayList をぶち込めばいいだろ
>>483 ぶち込めばいんですがやり方がよくわからないんです
Class クラス:ArrayList
{
public クラスメイト=new クラスメイト();
}
こういう感じにすればいいんですか?
どうも違うような?これだと、学校からの継承がなくなるし
どうしたらいいもんか・・
別に ListViewSubItem は ListViewItem を継承してる訳じゃない。 そんなことしたら ListViewSubItem が ListViewSubItem コレクションを持つことになるじゃないか。 ListView が持つ ListViewItemCollection で ListViewItem を管理する。 ListViewItem が持つ ListViewSubItemCollection で ListViewSubItem を管理する。 特定のコレクションは、ArrayList やら List<T> やらを使ったりを派生させたり CollectionBase から派生させたり。 public class Item { public LisT<SubItem> SubItems {get;} } public class SubItem { } 学校はクラスのコレクションを持つ。 クラスはクラスメイトのコレクションを持つ。というだけの話。
つーか思考回路がプログラムに向いてないんじゃね?
>>485 なんとなくわかったようなわからないような
解説サイトは人間の中の学生の・・とかをモデルに継承を説明してたけど
安易に継承したらダメってことかな
例えば、人間クラスに複数の学生クラスを保持してたとすると
一人一人の学生にすべて学生のクラスを保持できる変数まで継承してしまいますよね?
じゃあなんでそういうモデルを例にあげたのかさっぱりわからない
継承なんかしないで、人間クラスに学生を保持するArraylistを宣言すればいいだけでは?
と思ったり、とにかくこういう場合は継承しないほうがいいみたいですね
>>487 > 例えば、人間クラスに複数の学生クラスを保持してたとすると
訳分からんこと言うな。
人間がどうして複数の学生を保持するんだ?
その人間ってのは担任の先生なのか?
学生を持つのは学校であって人間ではない。
そして学校は学生とは継承関係にあるはずもない(「学生は学校である」「学校は学生である」どっちも偽だ)。
コレクションと継承をごっちゃにしてるのがまるわかりw
>>489 いや、まったくその通りで
機能ほ受け継ぎたい→継承
量を保持したい→コレクション
こんな感じですかね?
自分が何を誤解してたのかようやくわかった
ありがd
もう理解はしたようだからいらん一言になるけど、 そのサイトの例は機能を受け継ぐっつー例やね
エクセルのファイルとか作りたいんだけど エクセル入ってないとつくれない?
エクセル持ってないのにエクセルのファイルを作ってどうするんだ
継承すげえええええええええええええええええええええええ 今まで同じ基本クラス持ってるコントロールにそれぞれ同じメソッド書いてたけど 自作コントロールを作成してそのにメソッド書いてそれぞれに継承させれば楽チンじゃん! しかもイベントも全部その自作クラスのイベントにキャストすればイベントコードも1つで済むじゃんん!!! 早く教えてよ!こんな便利な機能
WMI RebootでWindowsをリブートさせるにはどうしたらいいんでしょう? 特権がないとエラーが出てしまうんですが・・・。 Web上もリモートPCのなら載ってるんですけどorz 検索して見つけたコードです。サイトの人もエラー吐くかもと認識しているみたいですorz ManagementObjectSearcher searcher = new ManagementObjectSearcher(); searcher.Query.QueryString = "SELECT * FROM Win32_OperatingSystem"; ManagementObjectCollection operatingSystems = searcher.Get(); foreach (ManagementObject operatingSystem in operatingSystems) { operatingSystem.InvokeMethod("Reboot", new string[] { "" }); }
>>499-500 うぅー、やっぱそこら辺になりますかぁ・・・。
宇宙仮面さんのとこは正直分からなかったですがやるしかなさそうですね。
どもでした、おやすみー
>>495 XML形式で良ければテキスト操作で作れる
DIFF形式ならXLSoftのExcelCreatorとか買うしかない
自力でDIFF形式出力を実装することもできなくもないが茨の道
>>498 ManagementScope.Options使って管理者に偽装すりゃいいんじゃねーの?
>>497 うん、まあよかったな。その調子でがんがれよ。
506 :
デフォルトの名無しさん :2006/04/07(金) 16:44:44
C#のlong(Int64)は64ビットですが、 Win32のlongは32bitでいいんでしょうか? 64bit対応を考えたとき、 wParamとかハンドルとか、IntPtrで受けた方がいいですか?
x86 でも x64 でも LONG / long は 32bit。 WPARAM とか HANDLE とかは当然 IntPtr だね。.NET の標準ライブラリでもそうなってるし。
描画関係で質問です。簡易ワードを作っています。 オートシェイプみたいなオブジェクトをドラッグ中、画面が狭いと滑らかに動くんですが 全画面表示にするとフレーム落ちしたような動きになります。 ワードクラス(コントロールを継承) 図形クラス(座標、サイズ、Drawメソッドを持つ) ドラッグ中の処理(ワードクラスMouseMoveivイベント) ・図形クラスの座標にマウスの座標を設定 ・図形クラスのRectangleで Invalidate(rect, false);//必要なエリアだけ描画 OnPaintイベント発生 描画処理(ワードクラスOnPaintイベント) protected override void OnPaint(PaintEventArgs e) { Bitmap bmp = new Bitmap(this.Width, this.Height); Rectangle re = new Rectangle(0,0,this.Width, this.Height); using(Graphics g = Graphics.FromImage(bmp)) { g.Clear(SystemColors.Window);//背景描画 図形クラス.Draw(g);//Rectangleの枠を描画するだけ e.Graphics.DrawImage(bmp, re, re, GraphicsUnit.Pixel); } } 大体こんな感じの処理ですが、アドバイスお願いします。 Framework1.1です。
LabelのBackColorを変更したりもとに戻したりしたいのですが、 もとの色は何色でしょうか。 プロパティを見るとBackColorがControlになっていますが、 label1.BackColor = Color.Control; が出来ないので困ってます。
できないって事はないと思うが…… 取りあえず ResetBackColor メソッド インテリセンスには出ないかもしれんが
>>511 ありがとうございます。
選択肢に出ないものもあるんですね。
あ、なんか違和感があると思ったら。 SystemColors クラス見てみ。
509です 解決できそうです。 PaintEventArgsのClipRectangleプロパティを見落としていました。 でもここはあまり問題じゃなかったです。 問題のフレーム落ちみたいになったのは ダブルバッファようのBitmapのサイズがまさに全画面で...orzなのと DrawImage()での描画位置などの指定も同じく全画面でした...orz ところでワードのようなコントロールってないんですかね? 文章書けて、画像が配置できるような。。。
Wordつかえば
仕事をしている間だけ処理をするプログラムを書いています。 DateTime.Now.HourやDateTime.Now.Minuteを使ったif文だととても複雑になってしまうのですが、 もっとスマートに書く方法はありますか? たとえば、「8:00-11:30 12:30-17:00」の場合だと 時間部分が8以上かつ12未満で、11の時は分部分が30以下 または 時間部分が12以上かつ17未満で、12の時は分部分が30以上 ただしきっかり17時の時を含める このように長くなります。 if(8:00-11:30 || 12:30-17:00) このような感じのものはないのでしょうか?
>>516 TimeOfDay プロパティを使えば多少は楽になるだろ
DateTime は不等号演算子もオーバーロードしてるから、 日付部分さえ同じなら DateTime 同士の単純な比較で問題ないけど。
TimeOfDayで楽になりそうです。 気づいたのですが、DateTime.Nowの時間と、タスクトレイの時計の時間は数秒違うのですね。 これは同期する方法はあるのでしょうか?
configFile["Width"] = width.ToString(); このような記述を見つけました。 どうやら[ ]は配列では無いことはわかるのですが何を表しているかわかりません。 どんなキーワードで検索すればわかるでしょうか。
連想配列、いやどっちかってーとインデクサか? ていうかまずそのクラスを調べようよ
HashTableだったんですね。 ありがとうございます。
Visual C# 2005 Express Edition を使用しています。 プロジェクト内のすべての.csファイルを一括印刷する方法はありますでしょうか。
>>524 マクロかアドインでって、Expressじゃ使えないんだよな。
例えばtextBox1で、デザイナ画面でイベント定義すると、 textBox_Click(object......... てな感じでメソッド名の始まりが小文字になるでしょ? でも、作法としてはPascal形式で大文字始まりにする べきだよね。みなさんどうしてる?
プライベートだから気にしない
外部から見えるメンバはPascal形式と決まってるだけで、 見えないものはどうでもいい
530 :
デフォルトの名無しさん :2006/04/09(日) 23:53:15
System.Collections.Generic.Comparer <T> これの <T> を調べたいんだけど、 これなんて呼ばれてんの?
型パラメータとか呼ばれるが、そもそも調べてどうすんの?
っていうか何を調べたいんだ? まあ、ジェネリック型パラメータとか、型パラメータ、とかかな。
>System.Collections.Generic.Comparer <T> おまいは上の名前空間を自分で使ってたんじゃなかったのか!
質問します。 C#にリストがあるっぽいので使ってみたの class Game{ public static ArrayList list = new ArrayList(); プログラムの初期化で Game.list.Add(new SystemTask(50,50)); 適当に追加したの。 で、メインで リストを回してるの。 foreach(Task myObj in Game.list) { myObj.OnIdle(); } このOnIdle内で Game.listに追加すると なんか警告出るの。 foreach中に対応リスト追加するとだめっぽい。 追加するための対策どうすればいいですか?
for ループにしろ。無限ループにならんようにな。 あと日本語をもっと勉強しろ。
foreach以外のループを使う。
for文はどうかと思うけどね
>>536-537 とりあえずいけたの。
ありがとうなの。
で、
C++のSTLのlistとかmapとかでiteratorみたいなので指定して使いたいけど
それっぽいのはないの?
イテレータを使うならforeachと同じじゃないの?
Web版のMSDN2の、ページ移動時のフェードアウトがすさまじくウザいのですがどうすれば消せますか?
爆破
念力
継承について質問させてください 基本クラスのListViewを継承したサブクラスのメソッドを使う場合に 当然なんでしょうが、基本クラスのメソッドも見えてしまうのでわかりづらいんです サブクラスで定義したパブリックなメソッドだけが見えるようにできないでしょうか?
そういうのは実装の継承といって、できれば避けるべきパターン。 C#の場合、新規クラスがListViewを保持するのが上席。
546 :
544 :2006/04/10(月) 20:53:01
>>545 なるほど、継承するからややこしくなるんですね。
でも、新規クラスが保持した場合、デザイン編集画面には表示されないですよね?
できれば、デザイン編集画面でコラムや外見を編集できるようにもしたいんですが
そういう場合はどうすればいいんでしょうか?
ListViewを配置したユーザーコントロールを作成して、 必要なListViewのプロパティを自分のコントロールのプロパティとして間接的に公開
548 :
544 :2006/04/10(月) 21:38:29
コントロールに関しちゃそれはあまり当てはまらんと思うぞ。 たいたい、実装の継承を避けるべきってのは依存を避けたいわけで、 はなから特定のクラスに依存しているというか、 そのものの動作を必要とするものを、 わざわざ委譲に書き換える意味が分からない。
550 :
544 :2006/04/10(月) 22:42:34
>>549 では、どうすればいいんでしょうか?
ListViewクラスのメソッドなどをprotectedできれば一番いいんですけど・・
呼び出す側にはサブクラスのメソッドだけを見せたいんです
C言語みたいに構造体の配列一気に初期化したい public static StageTablestage_tbl[]= { { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } { 20 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } }; } ↑こんなの これだとエラーでます。 やっぱ、引数ありのコンストラクタ書かないと駄目ですか?
んでどうすればフェードアウトかくせるんですか(゚Д゚)
ちなみにそれってどこ?msdn2.microsoft.com?うちじゃフェードアウトとか しないけど。
>>554 IEなら インターネットオプション-詳細設定-ブラウズ-ページの切り替えを行う をオフに
558 :
デフォルトの名無しさん :2006/04/11(火) 18:10:30
文字コードを判別するサンプルはいくつかみつかったのですが、 単純に与えられたstringが半角のみかどうかを調べる方法ってありますか?
半角って何を指すのかって話だが。 Shift_jis のバイト列に変換して 2 バイト文字のコードが含まれてるかチェックすれば? // 別に Unicode のままでもいいか……。
560 :
558 :2006/04/11(火) 18:39:08
レスありがとうございます。 byte[] b = Encoding.GetEncoding("shift_jis"))).GetBytes("ほげ"); して、頭から2byte読んでひたすらshift_jisのコードと照らし合わすって事ですか?
ヒント:2バイト文字の第1バイトは範囲が限定されていて1バイト文字とかぶらないようになってる。
562 :
558 :2006/04/11(火) 18:49:46
何度もありがとうございます。
if (str.Length != Encoding.GetEncoding("shift_jis").GetByteCount(str))
上のコード書いてみました。
>>561 の方法だと
byte[] b = Encoding.GetEncoding("shift_jis"))).GetBytes("ほげ");
のb[0]がascii tableになければ2byteって認識でいいですか?
ところで Shift_jis に含まれていない文字はどうするんだ?
564 :
デフォルトの名無しさん :2006/04/11(火) 19:01:56
アプリの名前(プロセスの所にでるやつ)を書き換えるにはどういう手順でやれば いいんですか?
565 :
558 :2006/04/11(火) 19:04:13
>>563 わかりません…
とりあえず今回は普通に使う日本語文字(微妙な表現…)か
普通のascii tableにあるような1byteか判断できれば十分なのでこれでよしとします。
>>559 >if (str.Length != Encoding.GetEncoding("shift_jis").GetByteCount(str))
1バイト文字は1文字=1バイトなんだから、
これで良しと思われます。
DllImportで uft-8 でエンコードされた char* を受け取りたいのですが 単純に StringBuilder を渡すだけでは文字化けしてしまいました。 解決策はないでしょうか?
[Out] byte[] で受け取って Encoding.UTF8 でデコード汁 多分 String.Split で NULL 文字以降を切らんと駄目だぞ
>>568 ありがとうございます。できました。
NULL 文字以降を切らなくてもちゃんとできてるみたいです。
C言語の標準習得時間はどのくらいですか?
>>571 もう8年目になるけど
完全に習得できてない
共用体の存在意義が未だによくわかりません!><
アンマネージドとの相互運用のためだけに存在すると考えて良し。C# 的には。
mscorlibのcorって何の略ですか?
corin star
Microsoft Control Library
Microsoft Console Library
Microsoft Contikusyou Library
Microsoft Corporate Library
Microsoft Corpus Library
Microsoft C organized Library
Microsoft COBOL Routine
foreachって何て呼ぶの? フォレアッチ?
フォー・イーチ
フォレアーーーーーーーーーーーッチ!!!! ワロスw
⊂ ● ⊃
ふぉれあっち♥
590 :
585 :2006/04/12(水) 15:58:11
ふぉれあっちあげ
VC#2003ってSpy++は付属してる? MSDNに書いてあるフォルダにないんだが。
ぐぐったら落とせるとこ見つかるよ><
MSのサイト? Managed Spy は試したが、いきなり例外出るし全然反応しないし 付属ソースも2003じゃIDEでコンパイルできないしですぐに消した。 VC6.0のSpy++があったんで使ってみた。 でもUnknownが多い。反応しないイベントも数あるようだ。
VSの評価版入手して抜けば
string.Empty が const ではなく readonly になっているのはなぜですか
ではなぜreadonlyだといけないのですか
readonly だと [DefaultValue(string.Empty)] と書けなくて不便
DefaultValue("") の方がよほど便利だと思うのだが
ではなぜ "" で良いのに string.Empty を用意しているのか
""だとその都度stringのインスタンスが生まれるけど String.Emptyだとstatic readonlyだからアプリケーション中に1つだけ っていうことじゃない?
>>601 それも正しくない。
string はインターンプールって領域でインスタンスを管理してて、
基本的に同じ文字列は同じインスタンスを返す仕組みになってる。
// 明示的に new した場合は別。
"" を複数回使った場合もインスタンスは一つ。
で、それと String.Empty は別インスタンスになる。
String.Empty と同じインスタンスを指すのは new string(new char[]) だね。
通常 new したときは必ず新しいインスタンスが作られるんだが、空の char[] 使ったときは例外のようだ。
でも実は String の静的コンストラクタを覗くと "" を Empty にストアしてる不思議。
翻訳単位を超えてユニークな""が欲しかったのかな。
>>602 string s1 = string.Empty;
string s2 = string.Empty;
string s3 = "";
string s4 = new string(new char[0]);
Console.WriteLine("s1, s2: {0}",
(Object.ReferenceEquals(s1, s2)) ? "t" : "f");
Console.WriteLine("s1, s3: {0}",
(Object.ReferenceEquals(s1, s3)) ? "t" : "f");
Console.WriteLine("s1, s4: {0}",
(Object.ReferenceEquals(s1, s4)) ? "t" : "f");
Console.WriteLine("s3, s4: {0}",
(Object.ReferenceEquals(s3, s4)) ? "t" : "f");
結果:
s1, s2: t
s1, s3: f
s1, s4: t
s3, s4: f
new string(new char[0])とString.Emptyが一緒になるとは知りませんでした。
そういう情報ってどこで見つけられるんです?
MSDN
>>605 stringクラスのあたりをmsdnとmsdn2で眺めていたんですけど
見つからなかったんですよね…。
検索スキルが足りてないようなので出直してきます。
いや多分載ってないんじゃないか。 今回のは自分で調べただけだし。
VBだとFor Eachだから悩まないね。
ほんじゃあ結局 const じゃなくて readonly なのはなぜなんだろう
const だと、結局リテラルの "" と同じになって、 1つの参照をさすとは限らなくなるとか。
>>611 .NET ではそう言う実装になってるが、そうでない実装も考えて、とか?
まあ、最適化の結果
>>610 の結果になったと言うだけの話で、
規格として保証されてないからかな。
どんな実装であっても同一の参照になることを保証しようとすると readonly になるのかな。
constってのはリテラルと変わらんからな…
って
>>610 と同じこと言ってた…
ストリームから1024バイトで分割しながら出力しているのですが、 最後の配列の内容は、最後に読み取った分+一つ前に読み取った内容 の後ろ部分になってしまいます。 buf.Initialize();で初期化しているつもりなんですが、 どこがいけないのでしょうか? int byteSize = 1024; byte[] buf = new byte[byteSize]; int bytesRead; while ((bytesRead = outStream.Read(buf, 0, byteSize)) > 0) { Response.BinaryWrite(buf); buf.Initialize(); }
void バックグラウンド処理中断および中止か再開() { thread.suspend(); if (処理を中止しますか? == Yes) { thread.resume();←★ thread.Abort(); thread.Join(); } else { thread.Resume(); } } ★でResumeしてからAbortしないと「Suspend中です」という例外が 出るので入れてみたんですが、このResumeからAbortの間に、スレッドの 中でちょこっと処理が進んでしまったりしませんか?
>>615 Initializeってその型のコンストラクタ呼び出すだけだった希ガス
んでbyteとかのコンストラクタは空
別に0に初期化されるなんてことはない
Clearでも使うヨロシ
>>615 Initialize の解説嫁。C# にしか言及してないが VB.NET でも同じだ。
>>616 進むかもね。
Suspend とか使うとデッドロックになりがちだぞ。
VB.NETスレと勘違い……orz
620 :
615 :2006/04/14(金) 11:56:33
>>617 buf.Initialize()をbuf.Clear()に変えるとコンパイルエラーに
なってしまいます。
Clearの使い方が違ってるのでしょうか?
エラーになってしまいます、じゃなくて。 エラーの中身を読もうよ。
622 :
615 :2006/04/14(金) 12:09:36
>>621 すいません。
引数を '0' 個指定できる、メソッド 'Clear' のオーバーロードはありません。
というエラーでbyteにはメソッドがないと思われます。
そのエラーは、Clear メソッドの引数の指定が間違ってるって意味。 そう言う場合はリファレンスを見るんだ。
624 :
615 :2006/04/14(金) 12:35:13
すいません。根本的に間違ってました。 buf.Clear()ではなく、Array.Clear(buf, 0, 1024) でクリアできているようです。 ありがとうございました。
Dictionary<string,int> foo; があったとして コレクション内のint型の配列を取得するのに今は、 int[] work = new int[foo.Values.Count]; foo.Values.Copyto(work,0); とint型配列を作ってそれにコピーしていますが もっとスマートな方法があれば、ご教授お願います。
626 :
616 :2006/04/14(金) 17:25:48
>>618 工エエェェ('д`)ェェエエ工工
デッドロックといえば、実はスレッドの終了時に終了イベントを
出していまして、それを受けたフォームがボタンのEnabledを実行前に
戻したりしているんですが、それをInvokeでやると固まってしまって、
BeginInvokeだと通ります。Suspendを抜かして速攻Abortにしたら
InvokeでもOKでした。Suspendは難しいんですね。。。
Suspend抜きでこういう「中止しますか」処理をするにはどうしたら
いいですか?
>>625 それでいいんじゃないかな。
あえて書くなら
new List<int>(foo.Values).ToArray()
なんてのもあるけど、コピーが二回発生するし。
>>626 スレッドを処理するメソッドが、中断フラグを随時確認するとか。
スレッド側が自分で流れを管理するようにして、外部スレッドはオブジェクトの状態を変更するだけ。
Abort とか Suspend なんて必要なし。
と言うのが良い。
デッドロックなんて話は別にしても、 基本的に非同期に例外を発生させるようなことは避けたほうがいい。 スレッドのアボートも同様。 例外が発生するタイミングが予測できないコードを適切に記述するのは困難。
結局544氏の質問は、547がファイナルアンサー?
overrideすりゃ見えなくなるような気するけど・・・
632 :
631 :2006/04/15(土) 00:43:58
なんか勘違いしてる気がしてきたので気にしないで(´・ω・)
GUI関連についてはメソッドかくさんでもいい気はするけどなーということで俺は
>>549 派
633 :
616 :2006/04/15(土) 02:36:58
>>628 ああ〜じつはVB6でDoEvents使った非同期処理を作ってるときに
そう言う書き方してました。そっかスレッドだからって同じでいいのか・・・
サンクスです。
大規模な修正をしたい場合、プロジェクト全体を丸ごとコピーしてから 修正加えて、やっぱりやめたーってときは破棄して、また元のプロジェクトをやりたいんですけど そういう場合どうすればいいですか?
VSS (Visual Source Safe)、AnkhSVN、CVS から好きなものを使う。
>>635 あらら、やっぱ専用ソフトみたいなのがいるんですねぇ
ありがとー。試してみますー。
>>636 バージョン管理とか必要ないなら
Zipで固めといて戻したいときに削除してZip展開でいいんでない?
くだらないとは思うんですが、 OpenFileDialog にある RestoreDirectory なんですが RestoreDirectory=falseが既定値ですよね trueの方がイイと思うんですが、 理由が判る方教えてください
639 :
636 :2006/04/16(日) 01:47:47
>>637 今まではそうしてましたw
なんか、あんまかっこよくないかなぁーって思って
>>638 Windows の標準的にもディレクトリは保存される方向だと思うのだが。
初期ディレクトリ固定したけりゃ明示的に指定すれば良いんだし。
true の方が何故良いと思ったのさ?
falseだとカレントディレクトリまでもが変わっちゃうよ
独習Cという本で勉強しています。 まだ if 文、else 文がでてきたあたりですが、 if の意味、else の意味のみ抑えておいて、 演習や説明文をすっとばしたい欲求にかられてしまうのですが、 やっぱりひとつひとつこなして行った方が良いのかな?
C 言語はスレ違いだが、別にそんなの何時間もかかるもんじゃないんだから素直にこなしとけ
>>643 レスありがとう。
C#ってまた別のもんだったのか。
スレ違い失礼しました。
最近ようやく自作DLLを扱えるようになったのですが、dllファイルがなかったら処理を変更する場合、 普通にifでファイルがあるかないか判別してその中で処理するだけでいいんでしょうか?
Assembly.Load とかそのへんつかえ
647 :
645 :2006/04/18(火) 22:34:08
>>646 調べてみたけどなんだかさっぱりだ・・・
もう少し本を読むなり調べるなりして使えるようにがんばります。
ありがとうございました。
>>647 いなくなったようなので簡単な方法を教えるが、
DLLが無い場合には DLL への初回呼び出し時に例外が発生するので、
これを catch するのが簡単。
649 :
645 :2006/04/19(水) 21:23:51
>>648 |Д゚)ジーッ
そっちでも弄ってみます。
ありがとうございました。
System.XML.Serialize.XmlSerializer()でTestクラスの連想配列を保存したいのですが、 // 普通ではできなかった public class Test1 { public Dictionary<int ,string> testDict; public SaveClass() { this.testDict = new Dictionary<int ,string>(); } } // ぜんぜん解らないのですが、こんな事もしてみました public class Test2 { public MyDictionary myDict = new MyDictionary(); public class MyDictionary :Dictionary<int ,string> { public MyDictionary() : base() { } } public Test2b() { this.myDict = new MyDictionary(); } }
// 改行多くて書き込めなかった・・・ void Serialize() { using( FileStream fs = new FileStream( filePath ,FileMode.Create )) { // Test1での記述 XmlSerializer xs = new XmlSerializer( Test1 ); // Test2での記述 Type[] types = new Type[]{ typeof( Test2.MyDictionary ) }; XmlSerializer xs = new XmlSerializer( Test2 ,types ); // 共通部位 xs.Serialize( fs ,test ); } } これらの何れが悪いかご指摘お願いします。 少しでも良いので何か仰っていただければ、後はそれもとに気合で調べます。
DictionaryはXMLシリアライズできないよ っていう例外が投げられてくるはずだけど
あ、そうだったんですか、例外出てました。 でも型の宣言とか初期化が上手くないのかな?とか思っちゃって。お手数おかけしました。 できないとわかってさっぱりしました!ありがとうございます。 とりあえずリスト2つとインデクサをつかってにせ辞書は保存できましたので、 そのまま以降と思います。 ご指摘ありがとうございました。 さっぱりした。感謝です。
OLEでexcelを操作しようと思い、button1_Clickに次のようなコードを書きました。 参照するExcelファイル(test.xls)にはA1〜C10の各セルに適当な数値が入っています。 Excel.Application XL; Excel._Workbook WB; Excel._Worksheet Sheet; Excel.Range range; XL = new Excel.Application(); WB = XL.Workbooks.Open(@"E:\cygwin\tmp\Visual Studio Projects\ocha\bin\Debug\test.xls", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); Excel.Sheets sheets = WB.Sheets; Object after = sheets[sheets.Count]; Object before = System.Reflection.Missing.Value; Excel.Worksheet sheet = (Excel.Worksheet) sheets.get_Item(1); range = sheet.get_Range("A1", "C10"); Object[,] saRet; saRet = (System.Object[,])range.get_Value(Missing.Value); double x = (double) saRet[0,0]; 一番最後の行で例外が発生します。(配列の境界外へのアクセス) デバッガで見てみると、saRet[,]は確保されており、各要素にはきちんとdoubleが納められています (saRetは、10行3列の配列になっていることが確認できます) なぜ例外が投げられるのか分かりません。 ご指摘おねがいします。
GetLowerBound とかしたらどうなる?
>>655 それでした。
行も列も1から始まってました。(なんで?)
ありがとうございました。
STLの pair<,> のようなクラスを作って使っているのですが、make_pair<,>関数のようなものを C#で実装するのは不可能でしょうか? 配列の中でいちいち { new Pair<string, int>("Taro", 32), new Pair<string, int>("Kazuo", 14), ... } と書いていくのが面倒なので。 ついでにSTLでいう set, multiset, multimap のようなコンテナってありますか?
>>657 using Pair Pair<string, int>; とかしとけば?
あと、C# 3.0 を待つなら、new { new { "Taro", 32 }, new { "Kazuo", 14 } } でも OK になる。
set とかは、確か、ない。
>>657 型推論できるのならそう言うメソッド書けば推論してくれるよ。
// のような ばっかりだね。
660 :
デフォルトの名無しさん :2006/04/26(水) 14:24:49
質問させてくださいな。 下記の用法で使われる"[]"はなんでしょう? /// <summary> /// アプリケーションのメイン エントリ ポイントです。 /// </summary> [STAThread]←--------------(・ω・) static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); }
属性
[STAThread] =[STAThreadAttribute]
663 :
デフォルトの名無しさん :2006/04/26(水) 17:01:26
>>658-659 レスどうもです。
>>658 using にそのような使い方があるとは知りませんでした。
でもソースファイルレベルで宣言しなくてはならないのがちょっと不便ですね。
>>659 普通にC++のように宣言すればできたんですね。
書き込む前に試してみるべきでした。
どうもありがとうございました。
DelphiからC#に入ろうと思ってるんですが、二つの差異はどのあたりにあるのでしょうか? 文法的なもの以外で というかDelphiから入るのは間違ってますか
設計者が同じだよ
質問です。 DataGridViewの編集中のRow/Col、あるいはCellを取得するにはどうしたらよいでしょうか。 DataGridViewのメンバにはそれらしいものがないように見えます。
CurrentCell でいいんじゃね? どのタイミングで取得するのさ?
とりあえずはEditingControlShowingイベントのタイミングで取得できれば十分です。 編集中のセルがCurrentCellと等しいというのはどんなときでも保障されているのでしょうか?
と言うか現在のセルしか編集できない
>>665 間違ってないと思う。
言語設計者が同じだし、ある意味Delphiの後継としても使えるし。
672 :
669 :2006/04/27(木) 06:05:26
>>670 なるほど、了解しました。
どうもありがとうございました。
DataViewのRowFilterで使うSQLのSelectみたいな言語で 比較演算の値は¥でエスケープすると思うのですが、 ..RowFilter = "ColumnName Like ’ * ¥’ * ’ ” // ※見難いので大文字空白入り としたい場合、どのように入力すればよいのでしょう? (シングルクォーテーションをエスケープするには) "ColumnName Like ’ * \ ' * ' "; でもダメですし、 "ColumnName Like ' * \ \ ' * ' "; でもダメでした。
>>673 > // ※見難いので大文字空白入り
よけい見づらい
シングルクォーテーションもう一つでエスケープ
>>674 ありがとうございます。出来ました!
[[] ' []] とか試したり、結構検索してみたんですが甘かったです。
助かりました。ありがとうございました
>>よけい見づらい
失礼しました。|||orz
673
>>674 ちょっと試してみました
比較する値に関しては、
' " \ * % [ ] がエスケープする必要あり
' \ は自身で、"は\で、任意文字記号と中括弧は中括弧でくくるみたいですね。
1つ解ったおかげでいろいろ知る事が出来ました。改めてありがとう
= @"foobar"; とかでもいいんじゃないかと思った。思っただけ。
678 :
667 :2006/04/27(木) 22:28:18
すみません、DataGridView に関してもう一度質問させてください。 セルのドロップダウンリストの内容を動的に変更したいと思っています。 そこで、EditingControlShowing イベントで e.Control as DataGridViewComboBoxEditingControl に対して ctrl.Items.Clear(); ctrl.Items.AddRange(new string[] { ... } ); のように項目を追加しました。 すると、リストから選択すると「DataGridViewComboBoxCell の値が有効ではありません」とのメッセージが出るようになってしまいました。 ドロップダウンリストの内容を動的に変更するにはどうしたらよいのでしょうか?
今までどうやってたの? DataTable とかにバインドしてたのならそっちを書き換えれば良いわけだけど。 DataGridViewComboBoxColumn をまともにいじろうと思うと結構大変だよん。
680 :
667 :2006/04/27(木) 22:48:35
最近使い始めたばかりなのでよくわからないのですが、 ListView の拡張版くらいの感じで使おうと思っているので データは内部にもたせようと思っています。
内部か外部かはどうでも良いけど。 かなり面倒だよ。 取りあえず思いついたのは、 ・DataTable 作成。long の ID 列と string の NAME 列を持つ。 ・DataGridViewComboBoxColumn に上記の DataTable を設定。ValueMember と DisplayMember は NAME に。 ・EditingControlShowing で、該当の列だった場合 ・DateTime.Now.Ticks を取得。これを ID とする。 ・上記の DataTable に、上記の ID と、必要な NAME を持った行を必要なだけ追加する。 ・その DataTable を元に DataView を作成し、RowFilter で ID 列を先ほど取得した ID のみにフィルタする。 ・e.Control を ComboBox にキャストして、DataSource をこの DataView に。 ValueMember と DisplayMember を NAME にする。 これだけだと選択するたびに DataTable が増え放題だからなんらかの対応が必要だけど。 ID を DateTime.Now.Ticks の代わりになんか適当な識別子使うのが良いかな。
DDE通信するCOMオブジェクトを利用するコードを VBScriptで書いたものですが、 これをC#で実現するコードとか教えてもらえませんか? Sub B2_onclick dim result Set o = CreateObject("KNDDDEML.DDEClient") If Not (o Is Nothing) then o.Initialize If Err.Number = 0 Then document.f01.T1.value = "Initialized" Call o.Connect("RSS", "7203.T") If Err.Number = 0 Then document.f01.T1.value = "Connected" result = o.Request( "銘柄名称", 1000) If Err.Number = 0 Then document.f01.T1.value = result else MsgBox "Connection failed. Error=" & Err.Number End if Else MsgBox "Connection failed. Error=" & Err.Number End if End if End if End Sub
COM の参照設定すりゃ多分大体直感的に使えるだろ
684 :
667 :2006/04/28(金) 05:35:00
>>681 よくわかってなくてすみません。
なかなか大変そうですね・・・。
勉強しながら少しずつ実装していきたいと思います。
どうもありがとうございました。
C#.NETでアプリケーションのウィンドウクラス名を変更したいのですが どのようにすればよいのでしょうか?
687 :
685 :2006/04/28(金) 13:59:02
>>686 ありがとうございます。
ウィンドウクラス名を固定にすることはできないのでしょうか?
"WindowsForms10.{クラス名}.appX"
appXのXが起動毎に変わらないようにしたいのです。
無理だと思うよ
689 :
682 :2006/04/28(金) 16:54:26
>>683 どうも。
ExcelをCOM登録して起動するMSのサンプルを参考に、
登録したCOMをnewして変数に入れてみると
Initialize、Connect、Requestが出てきました。
どんなクラス?メソッド?があるか分からなくてもなんとかなりそうです。
確かVS6からだったと思いますが、ほんとすごい開発環境ですね。
690 :
682 :2006/04/29(土) 06:34:01
C#とVBの区別もつかんのか
692 :
682 :2006/04/29(土) 08:32:20
>掲示板では丸カッコ使ってるのが多くって。 わろた
MSDNにはoutキーワードは[Out]属性に対応すると書いてあるのに、 デリゲートのパラメータではoutと[Out]は同一にみなされないのが気になるんだけど
別物だもの。 out は呼び出し先で値が代入されることを表す、参照渡しを意味するキーワード。 OutAttribute は呼び出し先で値の中身が書き換えられることを表す、参照が渡ったときにしか意味がないキーワード。 OutAttribute の MSDN の解説は間違い紙一重だね。
なるほど。同じではないんですね。ありがとう。
C#に限った事ではないと思いますし、初歩の初歩なのですが、 ある例外があった際、try catch で処理するのと自前で処理するのは 理想、思想、効率的などにはどちらが良いのでしょうか? 例えば、string数値をintに変換したい場合など、 try { intNum = Int32.Parse( strNum ); } catch( System.FormatException ) { // 無視 } と、try catch するかそれとも自前で foreach( cahr c in strNum ) { if( Char.IsNumber( c ) ) blnIsNum = false; } if( blnIsNum ) { intNum = Int32.Parse( strNum ) }; // 実際にはローマ数字とか問題ありますが。 一長一短だとは思うのですが、基本的にはみたいな考え方と聞いてみたいんです。
あ、すみません、自分の今の考えかいてなかったです。 今はなるべくtry catchは控えています。なんだか対処療法みたいな感じでなので。 なるべく根本敵に排他したりしています。
そこで TryParse、と梯子を外してみる。 Parse ならともかく、そうでないなら事前に値チェックするのが基本、と言うのが どっかの掲示板の決着点だったと思う。 でもたとえばファイルのオープンとかは事前に存在チェックした上で try-catch しなきゃなんないし。
パーズ可能な文字列が入力される確率を弄りながら Parse と TryParse の速度比較をするためのプログラムが WinFX のサンプルにあったとおも
>>699 はっきりした例外はともかく、基本的にはチェック、
それでも必要なときはやっぱりある。
ケースバイケースというか。。。
ともかくすごく参考になりました。ありがとうございます。
>>700 情報ありがとうございます。ちょっと検索してみます。
事前にチェックするか、例外が少ないなら後にするか、
条件によって全然異なりますよね。
経験によるものも多いと思います。とにかく書いていろいろ
勉強していきたいと思います。
どちら様もありがとうございました。大変参考になり勉強になりました。
TryParseが使えるならこれ使えばいいでそ。 使えないなら知らんが…
>>701 tryは呼び出し側に設置、呼び出され側はthrowを返すのが基本
ユーザーから数字を受ける場合はregexを判定すればいい
正規表現で有効な数値を正しく判定するのは存外骨なんだよな
>>702 ,703
ご進言ありがとうございます
>>702 Parseがどうとかではなくて、例外に対して基本的に try catchすべきか
どうかという事でした。例が悪くてすみませんでした。
>>703 具体的な対処法お知らせ頂いてありがとうございます。
これまで正規表現などは余り利用していなかったので
これからちょくちょく使っていこうと思います。
C#で、DataSetから上位5件を取り出す場合、 SQL Serverの(Transact-SQL)とかOracleならできるらしいと分かりましたが、 C#で盛り込まれたというLINQではできないでしょうか? SQLにはこだわらないので、類似のことをするコードがあれば紹介してください。
LINQ はまだ preview だが。C#3.0で取り込まれる予定。 DataView つかってソートして、 DataTable を元の DataTable から Clone でスキーマとってきて、 ソート済み DataView から先頭 5 つの行を ImportRow 。 とかどう?
708 :
706 :2006/04/30(日) 20:31:48
>>707 2005版はまだC#3になってなかったんですか。
件数が少ないかDataGridViewが速ければ簡単で良い方法なんですが。
DataGridViewが遅いから、DataSetからなん通りかのランキングだけを
画面に出そうと思ったんで、その方法はいただけないですね。
ソートは単独でなん通りかでやるんで、ソート済み配列も無駄だし。
データは常に更新するんで、データを更新するときにランキングのリストに反映するのがよさそうです。
ランキングは過去のデータからの変動率が関係するから、ランク外のデータも持っておく必要はあるんですが。
DataView と DataGridView をごっちゃにすんじゃねぇ
710 :
706 :2006/04/30(日) 20:38:12
>>707 試しに二つめのDataGridViewを作って同じDataSetを指定してみたらできました。
ありがとうございました。
自分でソートとかの処理なしに、一つのDataSetに持っておくだけでそれぞれにランキングを表示できました。
BindingSourceが同じだと操作もリンクしてしまいましたが、
BindingSourceを別にしておけば単独で動作しました。
>>709 それぞれあるんですか?よく分からなくて。
あせんぶりばーじょん と ふぁいるばーじょん の 違いって何でしょうか?
コンソールアプリケーションを統合環境で実行したときに、 最後にウインドウを閉じない方法はないでしょうか。 最後に、ブレークポイント設定する方法もありますが面倒です・・・。
Console.ReadLine(); でも仕込んどけ
マルチスレッドのlockステートメントなんですが、 ロック対象のオブジェクトに属する下位のオブジェクトも含まれるのでしょうか? 具体的にはDataTableをロックした場合、DataTableが持つDataRowのValueオブジェクト もロックされるのでしょうか。 MSDNでlockステートメントを読んでみたんですが、ちょっと確信が持てなくて。 誘導先などでもお知らせ頂ければ幸いです。
そんなときはテストしてみるんだ public class B { public C C = new C(); } public class C { public long count; } public class A { public B B = new B(); const int count = 10000000; // 負荷が軽いならもっと増やす static A a = new A(); static void Hoge() { for (int i = 0; i < count; i++) { lock(a) { a.B.C.count++; } //a.B.C.count++; } } [STAThread] unsafe public static void Main() { Thread t = new Thread(new ThreadStart(Hoge)); t.Start(); Hoge(); t.Join(); Debug.WriteLine(a.B.C.count); } }
つうかlockをちゃんと理解してるか?
しかもテストになってねーだろ。
結論だけいうなら、ロックされない。
>>715-717 テストしました!自分でも
>>715 さんを参考にしてテストしてみたところ、
ロックした場合書き込む際、きちんと待ってから書き込んだようです。
ありがとうございました。
>>716 恥ずかしながら理解していません。
オブジェクトの状態を保持するという事でしたので、
もしかしたらDataTableをロックした場合、Rowの参照アドレスの値を保障していて
参照先のオブジェクトが保持する値までは保障されないのかなとか思ったんです。
実際にはきちんとロックしてくれたようです。
愚問だったと思いますが、付き合って頂きありがとうございました。
>>718 え・・・ あれ? あ、書き込んだからロックされてないのか
どうもかなりお馬鹿さんでした・・・
みなさん感謝です。
もう一度しっかり理解する為にもテストをしっかり作って確かめて
理解してみたいと思います。
ロックってのは、他のスレッドからアクセスできなくするものではない。
全てのスレッドのうち、特定のオブジェクトのロックを獲得できるのは
ひとつのスレッドだけ。これが基本、かつこれがすべて。
>>715 のテストでは、ロックしてる対象のオブジェクトは唯一のa。
aのロックを同時に獲得できるのは1スレッドだけだから、
当然排他処理になる。
でも、これはaオブジェクトの内部のオブジェクトを
ロックしていることにはならない(ていうかしていない)。
あ、言い忘れたけど、参照先のオブジェクトがロックされないからって
それがまずいわけじゃない。
論理的な排他範囲を明確にして、その中での代表オブジェクトを
ロックするようにすれば十分。
>>715 だとaにあたる。
だから
>>715 はテストにはなってないけど
使い方としては特別おかしいわけではない。
>>721 ご教授ほんとうにありがとうございました。
>>715 さんのテストでは、aを排他しているだけで、結果的にロックされている様に
見えるが、実際には内部オブジェクトはロックされていないのですね。
本当に勉強になりました。
>>715-722 さん本当にありがとうございました。
あ、またアホな書き方を・・ オブジェクトじゃなくてコードをロックしているんですね。
>オブジェクトじゃなくてコードをロックしているんですね。 いや言葉的にはオブジェクトをロックするの方が普通の言い方だと思うが、 ただ、実動作的にはコード(というかスレッド)をロックするという 感覚のほうが近いかもしれん。 ただし、このコードというのが、上記プログラム上のaという意味で 書いてるならそれはちがうぞ。 それならまだオブジェクトをロックのほうがいい。
>>725 感覚としては lock( obj ) と示されるように、オブジェクトのロックと感じていいのですね。
まだまだ勉強不足で抽象的な知識と具体的な知識が大幅にかけています。
もっと勉強して頑張って行きたいと思います。
最後まで面倒見て頂いて本当に申し訳ありません。
でもすごくためになりました。本当にありがとうございました。
個人的には オブジェクトのロックを取得する、ロックを獲得する、ロックを要求する って表現が、感覚的に実態をよくあらわしていて分かりやすい。 というか誤解されにくい表現だと思う。
728 :
デフォルトの名無しさん :2006/05/02(火) 17:44:30
double d = 1 / 2; とやってもd=0.0になってしまいますが、この式何か問題ありますか?
1 も 2 も int なので演算結果も int
>>728 整数 / 整数 は 整数 になるんじゃね?
だから、
double d = 1.0 / 2;
か
double d = 1 / 2.0;
でいいんじゃね?
double d = 1d / 2d; でもいいのかな
732 :
デフォルトの名無しさん :2006/05/02(火) 18:02:25
レスありがとうございます。 皆さんの言うとおりでした。
ListViewなどだとデザイナ上で、Itemsプロパティをコレクションエディタを用い編集できますよね。 これに必要な準備というのは、どんなことをすればよいのでしょうか? CustomItemを定義し、ICollection<CustomItem>, IList<CustomItem>を実装したCustomCollectionを CustomControlに持たし、Itemsプロパティを定義したのですか、これでは不足か間違っているようです。 どうかご教授お願いします。
1/2・・ひさびさになごむ質問を見た。
>>733 そのプロパティに System.ComponentModel.EditorAttribute 属性を付加する。
EditorAttribute 属性の引数には typeof(System.ComponentModel.Design.CollectionEditor) と typeof(System.Drawing.Design.UITypeEditor) を与える。
コレクションの要素が特殊なら、CollectionEditor の代わりにその派生クラスを独自に作成する必要があるかも知れない。
>>735-736 お二方、回答どうもありがとうございます。
CollectionEditorの派生クラスを作らないといけないようで、
難しそうですが、なんとかなりそうです。
2005ExpressってCollectionEditorないよね? ComponentModelもない・・・
へ?
740 :
738 :2006/05/03(水) 00:29:31
キーワードで探してもないの・・><
ComponentModel は名前空間の一部だから、それだけでは引っかからないだろうけど。
自分もそこでつまずいてちょっと焦ったけど、 System.Designを参照するといいよ。
743 :
738 :2006/05/03(水) 01:05:33
ソリューションエクスプローラで参照設定でSystem.Disignを追加しても using System. って入力してもDesignって文字が出てこにゃい>< ヘルプにもない死・・・・ もう、だめにゃん><無料ではダメみたいにゃん><
いや、System.Design なんて名前空間もクラスも存在しないが……
ヘルプは .NET 2.0 SDK を入れれば多分大丈夫 VC#2005 Exp. だけだと確か不完全だったはず
746 :
738 :2006/05/03(水) 01:12:27
>>744 System.ComponentModel.Designってのがあったけど
やっぱり、このネームスペースのメンバ情報とか全然にゃい
>>745 それで試してみるにゃん。情報ありがとにゃん。
747 :
738 :2006/05/03(水) 01:18:05
って・・・すでに無料版落とす時に一緒に落としてインストール済みにゃん・・・>2.0 SDK みんなのはちゃんとヘルプで見れるの? うう・・・マイクロソフトのばかぁ・・・
どうでもいいがにゃはよせキモウザい
750 :
738 :2006/05/03(水) 01:40:07
>>749 ヘルプがないとダメなの!
ネットのヘルプだと遅いにゃん
ローカルヘルプになんでComponentModelがないの?
マイクロソフトのばか!
ローカルヘルプも死ぬほど遅いわけだが……
ベータの時のに比べりゃ天国だぜ
Helpを見るとよくわからんインストーラが起動するorz 2ページに1回出て激しくウザい。 しかたなくOperaでWebのMSDNを見る始末。下の階層にいくと左のフレームだけで1MB越え。IDEより重い。
ていうか SDK 入れ直せ。
OperaだとMSDNちゃんと表示されない… ビルゲイツのアホ
ゲイツのバカ
Q) Helpを見るとよくわからんインストーラが起動するのですが? A) 面倒ですがインストーラで修復、再インストールしてください。 インストーラの情報が壊れているのが原因です。 今後はレジストリ操作系のソフト(Officeの情報まで壊してしまうソフトあり) はなるべく使わない。あるいは慎重に手動で操作する。 また、これとは別にファイルも手動でいじったりしないように。
ちょっと気になったんですが描画の時に使う Pen や Brush や StringFormat などのオブジェクトも 使い終わったら Dispose しないとまずいんでしょうか。 ふと気づいたらそういったものをまったく Dispose していなかったもので・・・
>>759 できる奴はしたほうがいいけど、できないものはDisposeのメソッドがないはず
まあ、しなくても勝手にしてくれたりするし気にしなくてもいい
頻繁に呼ばれるようなものなら Dispose しないとまずいだろね で Paint イベントは頻繁に呼ばれるのに入るだろうなぁ
なるほど、どうもありがとうございます。 Brushes.XXX 系のと new SolidBrush(...) 系のものが入り混じってるのでかなり億劫です・・・ 必ずしも必須というわけではないんですね。 気が向いたら修正することにします。
かくしてリークしまくりアプリがまたひとつ
今時高性能PCでメモリリークなんて気にするほどでもない
この場合はメモリじゃなくてその他のリソースだろう
リソースってなんだよ 日本語でしゃべれよ
767 :
706 :2006/05/03(水) 21:39:34
濃口醤油
李宋守 (り そうす・1273?〜1349・元) 南宋の武人の家に生まれる 幼い頃より兵法を学び、天賦の才から来る洗練された用兵を行ったことで有名 宋守の用兵は人馬のみならず大自然のあらゆる要素を複雑に計算し尽くしたものであり、その緻密な戦術は地球シミュレータですら打ち破れない この宋守の功績は遥かユダヤにも及び、その末裔が携わったコンピュータシステムであらゆる要素を表す言葉として「リソース」が使われるようになった 民名書房刊「魂の秘より得るもの多し」より
769 :
デフォルトの名無しさん :2006/05/04(木) 04:12:37
マルチスレッドを使わずにウィンドウプロシージャを多重実行する方法ってありますか? マルチスレッドはできたんですが、1スレッドに1MBも使っちゃってて、 できればそれを300個作りたいんでもうちょっと省メモリでいけないかと思うんですが。
ウィンドウプロシージャを多重実行? 300? 状況がさっぱり分からんから答えようもないな
771 :
769 :2006/05/04(木) 08:49:09
>>770 マルチスレッドでメモリ食い過ぎなんで・・・
でも、Threadの引数でスタックを指定できてましにはなりました。
ところで、DataGridViewにリンクしたDataSetのデータアクセスが遅いので、
更新をコピーしたDataSetに対してやってて、たまに戻してやりたいんですが、
セル一個ずつしかコピーできなくて、しかもめちゃめちゃ遅いんですが、どうにかなりませんか?
.Copy()を入れようとしても、互換性がないとか言われるし。
773 :
769 :2006/05/04(木) 10:43:08
とりあえず全データを消して追加し直したら驚くほど速かったです。(約1秒) ただ、ユーザーが変更したデータをすぐにコピーにも反映させておかないと、 データは眺めるだけになっちゃいますね。 testDataSet.RSSTABLE.Clear(); testDataSet.RSSTABLE.Rows.Add(dsCollect.RSSTABLE.Rows[i].ItemArray);
774 :
769 :2006/05/04(木) 13:22:44
一応レコード単位でのコピー方法(20秒)も書いておきます。 testDataSet.RSSTABLE.Rows[i].ItemArray = dsCollect.RSSTABLE.Rows[i].ItemArray; レコード単位とかまとめてコピーしようとして気付いたのが、 DBから持ってきたDataSetは、上記で言えばtestDataSet型になってて 型互換がなかったことですね。驚きました。 testDataSet型にしたらテーブル名もtestDataSet.Tables[0].Rowsから testDataSet.QTABLE.Rowsて感じでテーブル名が使えてなるほどだった。 最初めちゃめちゃお手軽だったけど、やっぱいろいろ不満で手を加えていくと、 やっぱりDB読み込みからデータ操作、画面はそれぞれしっかり設計して コーディングしないとだめだと思いました。 でも、最初にほとんどコーディングしなくても動いたからその後も続けられたんですよね。
775 :
769 :2006/05/04(木) 13:44:05
C#って、Cで書いたダイヤログウィンドウプロシージャみたいにできますか? やっぱFormクラスみたいなpublic partial classを作ればいいんですかね?
>>758 もう一度VSを入れ直しましたが、やはりインストーラが起動してしまいますorz
777 :
デフォルトの名無しさん :2006/05/04(木) 14:06:18
>>776 昔、C:\Documents and Settings\ユーザー\Local Settings\Temp の下を
綺麗に掃除したら直ったこともあった。
778 :
769 :2006/05/04(木) 14:13:45
>>774 >型互換がなかったことですね。驚きました。
どんなDBから生成してるか知らんけど、普通はDataSetを継承した型だと思うが、
DataSetにキャストすればいいだけのような気がする。
あとそのDBから持ってきたDataSetは、DBの制約なんかもそのまま持ってきてると思うので、Addなんかが遅くなる。
>>774 基本的にデータはstruc型に格納して、それに対して操作(検索、削除、追加)する
ListViewやDataGridはあくまで表示させるためだと言う風に割り切ると処理が速い
removeやAddを直接Datasetで扱うと非常に処理が遅い
加工したデータはAddRangeでdatasetに追加
ユーザーが項目を削除したのを反映する場合も一旦すべてのアイテムをClearしてからAddRangeで追加したほうが速い
781 :
769 :2006/05/04(木) 16:13:48
>>780 structですか。検討してみます。
DataSetなら集計とか便利な機能がついてるかなとか、
DBとリンクするからDB更新とかも簡単かなとか思ったんですが・・・・
WindowMessageのセットの仕方は分かりました。
あとはどうやってDDE鯖に送るか・・・
C# クリップボードへコピーpublic static Message Create (
IntPtr hWnd,
int msg,
IntPtr wparam,
IntPtr lparam
)
>>781 便利だけど、今のPCの現状じゃ処理重いんだよな
>>781 いまさらDDEより、IPCチャネルのリモーティングじゃダメなん?
784 :
769 :2006/05/04(木) 22:50:47
>>782 あの重さはまるで10年前のパソコンのようですよね。
実際動かすまで、ちょっと想像できませんでした。
PInvoke を使用してマネージ コードからネイティブ DLL を呼び出す
User32.dll をインポートしてSendMessageを使うのか・・・
>>783 相手がDDEなんで。NetDDEでもないDDEなんで。
つか DDE にはなんか COM 作って公開してるのがあったぞ このスレでも出てたはずだが
786 :
769 :2006/05/05(金) 00:45:32
>>785 ラクテンショウケン(←nazeかカナにしか変換されない)のRSSでそれを使うと、
違う銘柄のデータを受け取ろうとすると初期化しちゃって
1件に0.1秒くらいかかってしまうんです。
その時間をなくすために1スレッド1件の接続にすると120件で40MB消費します。
しかも、そのCOMコンポーネントの制約で127件までしか使えず、
RSSの制限の300と比較して少なすぎます。
結局RSSと効率よく通信するには専用の部品を作るか自分でDDE通信するしかありません。
787 :
769 :2006/05/05(金) 00:54:18
Initializeを10回やれば銘柄切り替えても問題なかったりするかな?
788 :
デフォルトの名無しさん :2006/05/05(金) 01:12:16
Form1のツリービューの内容をForm2のツリービューに反映?させるには どうしたら良いのでしょうか。 やりたいイメージはOutlookExpressでツリーのところ右クリックして フォルダの作成を選んだときになんか出てきて場所を選べるやつです。
なんか出てきて場所を選べるやつ。わかりやすすぎて涙が出そうだ。 然るべきイベントで然るべき処理を書けばいいよ。
790 :
デフォルトの名無しさん :2006/05/05(金) 01:41:50
.NET Framework 2.0 SDKでC#を始めようとしているんですが、 ネット上のサンプルとかが上手くコンパイルされません。 Form1とかButton2とかは使用できないんですか?
>>790 .NET Framework のバージョンが違うとそのままコンパイルできないよ
ソースコードレベルでは後方互換性はほぼ確保されているが。 サンプルというのがどんなのか分からんし。 どうやってコンパイルしているのかも分からんし。
>>790 推測だけど、Nunit使ったテスト駆動とかかな?
794 :
デフォルトの名無しさん :2006/05/05(金) 01:55:25
僕のおしりからも場所を選ばずになんか出てきます。ちなみに右クリックはしてません。
795 :
790 :2006/05/05(金) 02:53:03
>>794 ≠
>>790 Form Form1 = new Form();
ってやったらあっさり解決してしまいました。
俺が見たサンプルの真意はわかりませんがとりあえず何とかなりました。
というかそのサンプルというの教えてくれんか
797 :
788 :2006/05/05(金) 03:20:44
getitemを使うのでしょうか?
何の話か全く分からんのでもっと詳細に説明しろ 特に*具体的に何が*分からんのかを
799 :
sage :2006/05/05(金) 03:42:38
あwせdrftgyふじこlp;@
800 :
sage :2006/05/05(金) 04:11:16
private void treeView1_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e) { ここに何を入れるか分かりません。 }
801 :
788 :2006/05/05(金) 04:13:49
↑自体が見当違いかもしれないですね。 2回も間違えてすみません。
ちょっと説明下手すぎてどうにもならないので諦めます。 ありがとうございました。
ま、それならそれで良いけどな。 ・何をしたいのか ・〜〜みたいな、は使わない 例:ContextMenuStrip で右クリックメニューを出すとき、イメージ表示領域を消したい。 ・何をしたのか ・コードをずらずら書かない。書くなら必要最小限 例:ContextMenuStrip の ShowImageMargin を false にしたら一階層目は消えた。 ・何が駄目なのか ・エラーメッセージがあるなら書く 例:しかし二階層目以降が消えない。解決方法はないか。 サンプルは最近本スレであがった質問だが。
魚おおおおおおおおおおおおおおおおおおお 説明できねえええええええええええええええ ・したいこと 別のフォーム間でコントロールを参照したい? 言い方が分かりません ・Form1とForm2があります Form1にTreeView,contextmenuを配置 Form2(フォルダの作成ダイアログ)にTextBoxとtreeViewを配置 Form1のTreeViewを右クリック→contextmenuからフォルダの作成を選択→ Form2が出ます。 そこで出たForm2のTreeViewにForm1のTrEeViewの中身を表示したいです。 分かりにくかったらすみません。おねがいします。
TreeView の中身って具体的には何よ。 たとえば Form1.TreeView1 の選択されているノード以下のツリー構造を Form2.TreeView2 で表示したいとか。
806 :
769 :2006/05/05(金) 18:49:59
>>804 2つのTreeViewに同じ内容で表示したいわけ?
Form2でTreeViewを表示するのに必要なデータを 何らかの型でForm2のコンストラクタ引数として渡す つーか両方にTreeViewって設計間違ってない?
808 :
804 :2006/05/05(金) 22:47:56
>>805 中身は全てのノードです。
選択されているかいないか関係なく全部です。
>>806 2つのTreeViewに同じ内容で表示したいです。
>>807 >つーか両方にTreeViewって設計間違ってない?
そうなんですか?!普通はどのように設計するのでしょうか?
表示したいのはアプリケーション内で作ったフォルダなので、
FolderBrowserDialogは使えないと思ったので、こういう風に
したのですが…
みなさんありがとうございます。
同じ物を表示する意味ってどこにあるんだ?
取りあえずそれを実現するだけなら
>>807 の言う通り、
各トップレベルノードをそれぞれ Clone した配列を、
Form2 のコンストラクタとか自作の Show のオーバーロードとかに渡してやればいいんだが。
810 :
804 :2006/05/06(土) 00:20:26
コンストラクタとかデストラクタとかオーバーロードとか難しすぎです・・・
>>809 さんの言うように、わざわざダイアログ出さなくていい気がしてきたので
この使用はやめようと思います。
OEを参考にしてソフトを作っていたので、なんかこだわりすぎました。
右クリックでダイアログを出さず、直接その場所にフォルダを作ることにします。
アドバイスしてもらったのにすみません
目に見えないだけなので、クリックして MyNotePad 入力すれば OK
813 :
769 :2006/05/06(土) 13:41:40
そうそう。 心の目で見ることも大切ですよ。パソコンは。
ポインタって何ですか?
大雑把に言えば、C# には関係ない物。
unsafe で関係あるだろ。
ファイルポインタ
だから大雑把にって言ってるじゃん
大雑把杉
C++/CLIだと、ハンドル型として区別されてるね
みんな連休明けでまだ本格稼働していないのか 連休中働いて代休消化中なのか 代休なんてもらえずに働きづめで書き込む気力もないのか知らんが 明日も何もないよい一日でありますように。
仕事もないし、希望も無い
時間はある
クリック
フォームのマウスイベントを無視して 重なった下のウィンドウやデスクトップを操作できるようにしたいのですが、 どうしたらいいでしょうか?
まずその設計をなんとかしてみる
C#でファイラを作ろうと思うのですが、C++のシェルと同等の機能は.netではないのでしょうか。 ex)ゴミ箱等の特殊なフォルダの表示、ファイルの実行など またひどく初歩的な質問なのですが、javaから移行してきたせいか例外のthrowsがないことがとても不安に感じます。 上級者の方々はどのように例外を処理してますか?
>>829 ある程度はあるが、ある程度以上はないな。
//「C++ のシェル」が意味分からんが。
> またひどく初歩的な質問なのですが、javaから移行してきたせいか例外のthrowsがないことがとても不安に感じます。
> 上級者の方々はどのように例外を処理してますか?
どうせ処理しきれない例外なら Application.ThreadException で纏めて処理。
.NET C#でウィザード形式のアプリケーションを作りたいんですが、どうすれば良いですか?
>>829 ・特殊なフォルダはP/Invoke
・ファイルの実行は Process.Start()
834 :
829 :2006/05/10(水) 18:43:51
>>830 最近までC++を使うつもりだったので思わず付けてしまいました。
> どうせ処理しきれない例外なら Application.ThreadException で纏めて処理。
そうですか、例外の処理はJavaよりもC/C++に近い感じですね。
>>832 細かい処理はシェルを使わないとだめですか。
>>833 その最初の一歩が分からないのです……
ウィザード形式でないふつうのアプリならwindowsフォームの追加で
作れるんですが
つっても「普通のアプリ」と変わらんし ウィンドウの遷移なら ApplicationContext でも使うとか
>>835 単純に固定位置でボタン押してフォーム切り替えていくだけでないの?
>>834 次の質問を予想:複数ファイルのプロパティ画面をだすのってどうやるんですか?
839 :
デフォルトの名無しさん :2006/05/10(水) 21:43:02
WindowsFormのCheckboxをプログラムからチャックをはずすにはどうすればいいでしょうか?
チャックを外すのは難しいな チェックなら、チェックが付いてるか確認するプロパティが実は
×チャックをはずす ○チャックをあける chuck.opened=true;
842 :
デフォルトの名無しさん :2006/05/10(水) 22:02:44
最近C言語始めました。開発の環境にLSIC86を使って教科書通りにやっているのですが、コンパイルしようとすると lccは操作可能なバッチファイルとして認識されていません と表示されます どうしたらいいのでしょう… 助けて下さい。
スレ違い
スレ違いです
ケコン
846 :
839 :2006/05/10(水) 22:23:03
>>840 難しいですか。Checkbox辞めて別の方法試します。
ありがとうございました。
>>846 ネタじゃなかったの?
checkBox.Checked = false;
最後に釣られたか?
848 :
デフォルトの名無しさん :2006/05/10(水) 23:46:36
C言語をある程度勉強していたのですが、C#とつながることがあるのでしょうか? ちょっとやり始めた感じだと、全く違う言語のように見えるのですが・・・ あと、まっさらな状況でやるのだったらJAVAとどちらが将来性がありますか?
>>848 C# は C の孫。
世代違うけど、血族。
血筋自体違うほかの言語一度覗いてみ。
Java と C# 比べると、俺の感覚では将来的には C# 有利だと思う。
(ただ、このスレでその質問すれば C# よりの返事が返ってきて当たり前だと思ってね。)
どうも、世界的に見るとすでに C# 有利っぽい感じだけど、
日本では携帯アプリのおかげか Java が健闘してて、
現状はまだちょっと Java 有利かも。
850 :
デフォルトの名無しさん :2006/05/11(木) 00:08:50
Form1 form = new Form1(); form.Show(); のようにモードレスのフォームを表示しているのですが、 Show()のときに非アクティブなまま表示するにはどうしたらよいのでしょうか?
任意のPath文字列またはUriが、 ファイルかディレクトリを示しているのかを調べるにはどうすればいいでしょう?
厳密に調べたいなら実際に問い合わせるしかあるまい。
>>852 回答ありがとうございます。
実際に問い合わせるとは、
new DirectoryInfo(path)をやってみて例外を投げたら、今度はFileInfo〜ということでしょうか?
これだと、もし同じファイル名とディレクトリ名があった場合駄目じゃ…。
と思ったら、そういうことは出来ないようになっているんですね。プログラム以前の問題でした。
あ、よく考えたらDirectory.Exists(path)、File〜でもいいや スレ汚しすみませんでした。
>>850 Win32API の ShowWindow 使う必要がある
>>848 ,849
将来の就職意識してとかでなく、趣味でプログラム組むんだったら、Windowsでだけ
動けばよいソフトを作るのか、そうでないのかで決めればよかろ。
とはいえ、Microsoft&Windowsが3年後・5年後も安泰だったら、C#選んで問題ない
と思うけど、将来どうなるかはわからんもんなー。
857 :
デフォルトの名無しさん :2006/05/11(木) 04:22:25
>>848 基本はC#もJavaも似たようなものだから両方やっときゃ無問題。
文法が多少違うぐらいだし。
859 :
846 :2006/05/11(木) 11:45:22
>>847 >checkBox.Checked = false;
え、そんな簡単な方法で良かったの?
切り替えスイッチ作っちゃったよ。
ネタじゃなかったのに・・・ ネタじゃなかったのに・・・ ネタじゃなかったのに・・・・・・・・・ orz
840 が一応答えてたのに……
僕のチャックも外されそうです
862 :
850 :2006/05/11(木) 14:41:38
>>855 そうなんですか。それに関するソースってないでしょうか。
[DllImport( "user32.dll" )] private static extern bool ShowWindow( IntPtr hWnd, int nCmdShow ); private void button1_Click( object sender, EventArgs e ) { Form2 form2 = new Form2(); IntPtr p = form2.Handle; ShowWindow( p,8 ); //this.BringToFront(); }
864 :
850 :2006/05/11(木) 17:50:27
>>863 できました。
それにしても何でこんなことがAPI使わないとできないんだろ。
>>864 普通そういうことは想定されてないから、だと思うが。
if (User.Identity.Name == null) と書いたら、NullRefernceExceptionが出ます。 nullのチェック方法がまちがっているのでしょうか?
User.Identity が null なんだろ User が null なんかもしれんが
>867 その通りでした。 2時間くらい悩んでいました。。 あなたは神です。 ありがとうございます。
>>864 アンマネージドもマネージドもAPI
.NETはまだOSの全機能を網羅していないだけ
>>864 WinFormsの基本設計のせいかな
Visibleプロパティ遷移にパラメータなんてないから。
んーむ、SetVisibleCoreあたりにパラメータつけてShowを
オーバーロードしたらよかったね>MS。今更無理だが
DirectoryInfo.GetDirectories()でディレクトリを取得したんだが、 この並び順はどっからもってきてるんだろう。 文字コード順かと思うと微妙にエクスプローラーの並び順とは違うし、 かといって日付とも違う。取得時に並び替えのオプションなんてあったか?
FindFirstFile で見つかった順。 どういう順かはファイルシステムによる。 NTFS なら文字順(文字コードとは別の基準)。
>>872 なるほど。ありがとん。
じゃ、いちいちソートしてやんないといけないね。( ゚Д゚)マンドクセー
874 :
デフォルトの名無しさん :2006/05/13(土) 14:39:43
ASP.NETでページ内のテキストボックスをすべてクリアするメソッドを作ろうと しているのですが,どのように実装していいのかわかりません。一応,次のよう 作ってみましたが,「 'System.Web.UI.Control' に 'Text' の定義がありません。」 というエラーが出てしまい,コンパイルできません。 TextBoxにキャストすれば,うまくいくと思ったのですが,どうも,ダメなようです。 なお,このメソッドはClearAll(this)にような形で使う予定です。 よろしくお願いします。 public void ClearAll(Control parent) { foreach (Control c in parent.Controls) { if (c.HasControls()) { ClearAll(c); } if (c is TextBox) { (TextBox)c.Text = String.Empty; // ここでエラー } } }
クライアントサイドのスクリプトでクリアした方が良いと思うんだがなぁ…… > (TextBox)c.Text = String.Empty; // ここでエラー c.Text を TextBox にキャストする、になるぞ、これだと。
876 :
デフォルトの名無しさん :2006/05/13(土) 14:53:30
C#とVBのどちらか始めようと思うのだけど、どっちがいいと思う? 仕事があるかないかという視点で判定をお願いします。
日本では圧倒的に VB 。 まあ .NET 案件そのものが大して無いけどな。
878 :
デフォルトの名無しさん :2006/05/13(土) 15:08:48
世界的にはC#なの? 以前、MS社のC#開発者のインタヴュー記事を読んだのだけど、 アメリカではVB使用者が減ってるって言っていた。
>>875 確かにそういうのはクライアントサイドの方がいいよね
要するに
((TextBox)c).Text = String.Empty;
って書くんじゃないの?
>>874
>>874 List<TextBox>に全部つっこんどいてforeachでまわしたら?
882 :
874 :2006/05/13(土) 15:39:49
>>880 レスサンクス。その通りでした。どうもありがとうございます。
.netのリファレンスみにくいんだよ! あるコントロールのメンバの一覧表示するなら、せめて一般的に使われそうなメンバと、 ただ継承されただけのメンバを分離して表示しろよ。
>>883 継承(のみの)メンバ含むかどうかとかチェックボックスですぐに
切り替えられるんだけど何が不満?
>>884 継承元の大事なメンバも表示されずイライラする
>>887 何が大事かなんて主観やし。
最小機能ならCompact Frameworkでもみたら?
JavaAPIリファレンスなんかに比べたら遥かに見やすいと思う
できればメソッドやプロパティの型くらいは一覧でも出てくれると助かる。 ただまあオーバーロードの場合にどうかってのもあるしな… 総評としてはそこそこ見やすいとは思うんだけどね。
Webのほうは仕方ないにしろローカルの方は起動遅すぎ。 これなんとかしてほしい
>>891 フォームの読み込みに時間がかかるけど
処理速度は他の言語よりもダントツ早い
てのがC#じゃなかったっけ?
>>892 いやドキュメントのことです。すんません
Managed C++ で C# のような使い方をしたら大差がないか逆に遅くなるんじゃないかな
確かに起動は異様に重いってか表示も結構重い。 これはなんとかしてほしいなあ。
遅いって言ってる人って、どんな環境? 自分ので、WinXP・P4の2.26・メモリ1Gで、ハードディスクは 5400rpmでちょっと遅め。この環境だと、特に起動が遅いとか、 動作が遅いとかいう事はそんなに感じないんだけど。まあ、 走らせるものの大きさにも影響されるだろうけど。 後、常駐ものが動いてるから、.Net Frameworkの初期読み 込みの時間が節約できてるのかもしれない。
>>897 だから問題は初回起動と描画の遅さだって。
>>898 だな、明らかに遅い。高速起動パッチ当てたらマシになったけど
単に ngen するだけの糞ツールだろ 宣伝してんじゃねえよ
パッチじゃないし
ngen使うと動作が遅くなるらしいけど
あ、でもngen1.0はイマイチだったけど2.0はとても優秀だよ。
だから
>>904 は心配しなくていい。
ぶっちゃけ速度は大して変わらない ngen をする手間の分だけ無駄になるだけ
>>908 動作速度は知らないけど起動速度はかなり改善されるぽいよ
ちょっと ngen 使ってない場合と使った場合測定してみたら
顕著なところでは 平均 80→20ms な箇所と 50→0ms な箇所があった
910 :
909 :2006/05/14(日) 20:33:26
てか起動直後とはいえアセンブリロードしたあとの処理だから動作速度か。
結論 Frameworkはウンコ
万能じゃないだけで確かに速くなる。
915 :
デフォルトの名無しさん :2006/05/14(日) 21:15:49
こんばんは。質問させてくださいな。 VC#2005を使ったアプリで、http通信を用いてとあるPHPをたたき、 その処理が終了したことを検知したいのですがどうすればよろしいでしょうか。 申し訳ありませんが 1)PHPの軌道の仕方 2)処理終了の検出 の二つに分けてヒントを教えていただければと思います。 よろしくお願いします。
>>916 レスありがとうございます。
ただ、もそっと詳しく教えていただければ…。
「2)処理終了の検出」をAPIを用いて取得するのでしょうか。
918 :
デフォルトの名無しさん :2006/05/14(日) 21:29:23
これからはFedoreCore5+Mono-C#の時代だね。 Javaの時代は終わりつつある。
>>915 構成がよく分からんのだが。
http ってことはリモートサーバの Web アプリ?
それなら HttpWebRequest とかで良いが。
>顕著なところでは 平均 80→20ms な箇所と 50→0ms な箇所があった ぜんぜんうれしくない。 その箇所が100個とかあって軌道が数秒以上変わるんなら別だが。
>>920 レスありがとうございます。
処理の目的は、DBのデータをCSVに書き出して、それをローカル側に取得することです。
(サーバ:RedHatEE+PostgreSQL クライアント:WinXP + VS2005)
サーバにはhttp経由でしかアクセス出来ないので、DBのストアドプロシージャをキックする
PHPを作成して、それをクライアントから叩こうかと思ったのです。
上記を満たすようなことがHttpWebRequestを用いれば実現出来るでしょうか。
HttpWebRequestって何か分かってる?
>>923 今調べました。
GetResponse()を使えば、PHPが処理終了時に返す値を取得することができそうですね。
.Netで作った常駐アプリをスタートアップに登録して、常に走らせとけば .Net Frameworkの読み込み時間分起動速くなるんでねえの?
タイムスリップ気分をありがとう
>>921 それはあくまで顕著な部分であって、他の部分も総合的に速くなってるよ
800ms 程度かかってた起動時間が 500ms 程度になった。
800msと500msの違いなんてあってないようなもの
脳経由の反応速度が0.3秒だしね
んなわきゃない。
OpenFileDialog を使う限り不可能。何故か sealed だからな。 FileDialog もコンストラクタが internal なので拡張不可能。 DllImport 駆使して自前で書くしかないな。 codeproject とかの集積所に誰か既に書いたのがあるかも知れないけど。
934 :
デフォルトの名無しさん :2006/05/16(火) 09:08:27
_,,,-ー、_,,.. り 発 あ ,," _、、..._ ヲ、_ 近 射 り オ イttv'-‐-、弋 ゙`、_,,._ づ す 丶 チ i(.)(.)ノ ト ヾミ、 う き る そ ン | レ'、レ'レ' { 、_ ゙~=、_ た 丶 .こ チ _,, | i゙ ー三~__,,,....,,,r-、、 く .と .か ン ,->_,(((、 ̄'ー.| {{・}} _,,." ,r"~ ̄ _(((_ ァ''"ー- 、 な い ら が / / i \~゙ー-、ト'' ヽ" _,,.、,'' イ r-''"~ / i ヽ _,ゝい う 火 3 / ノ t ,,.. 〉゙`'"~ . 丿 ノ _/ / ノ て~ 妖 あ 炎 つ / `t ( ,`{ ⌒ヽ { ノ /^ー' 怪 ま を も ⌒ヽ rr( i !、ノー-、 ` ) _/⌒ー' 。 し'⌒ー`{ ( ヾ} ( ( ( ノ-‐ i'_/ `i_j〜´,r'ソ'ソソ'ヽ }_,、_,-、 r"ソ/ r"ソ `ヽ ' _}}} .{ , ''"r"ソ,'" `-'" { j r"ソ ,''"rソ ''`゙' : .、 ''" rソ '" , '' \从、仆从,'// , '
パシャッ パシャッ パシャッ ∧_∧ パシャッ パシャッ ( )】Σ . / /┘ パシャッ ノ ̄ゝ
__[警] ( ) ('A`) ( )Vノ ) | | | |
Socketを使ってFTPサーバーからテキストファイルをダウンロードするプログラムを組みました。 (組んだというより本を見ながら書いたという感じですが・・・。) byte[] bb = new byte[256]; for (; (count = socket.Receive(bb)) > 0; ) { tempS = Encoding.ASCII.GetString(bb, 0, count); output += tempS; if (socket.Available == 0) { break; } } こんな感じで256バイトずつ読み込んでいるのですが、最後まで読み込まないうちにSocketに データがなくなってしまいます。 600kくらいのデータなのに半分くらいしかダウンロードできません。 しかも、うまく行くときもあれば行かないときもあり、50kダウンロードできるときもあれば 400kダウンロードできるときもあります。 で、何を聞きたいかというとどうやってデバッグすればいいのでしょうか? コードは何度も見直しましたがどうしてもわかりません。
読み込み処理に、転送が追いついてないんだろう。 Available == 0 なのはバッファが空と言うだけの意味であってそれ以上転送されないと言う意味ではないからな。 Read の返値が終了条件、で良いはずだ。 ところで何故 while じゃなくて for なんだ?
>>937 たぶん承知してるとは思うんだけど、マルチバイトのエンコーディングの場合は
少なくとも行区切りまでためてから GetString する必要があって結構面倒。
ここは素直に StringReader 使うのが吉。
StreamReader の誤字? しかしネットワークストリームに対して StreamReader 使うのは個人的にどうも信用おけないんだよな。 途中でぶち切られるような気がして。 マニアックだが Decoder クラスを使う手があるぞ。 これなら勝手に泣き別れをバッファしてくれる。
941 :
939 :2006/05/16(火) 22:24:16
まー漏れも実は自前で改行探したりしてるけど。 DoS 攻撃とか考えると、1行は1024バイトまでしか読まないとか自分で制御したいし。
942 :
937 :2006/05/16(火) 23:08:54
>>938 なるほど。読み出せないからといってもう全部読み込んだというわけではないのですね。
読み込めるまで待つのが正解ということですね。
あと、なぜwhileじゃないのかというと、お恥ずかしながら「本にそう書いてあった」というのが正直なところ。
理解した部分は自分なりに応用したりして書き換えてますが、問題無い部分はそのまま流用してたりします。
StreemReaderとDecoderクラスも調べてみます。
ありがとうございました。
#解決できなかったのでユーザーに「別のソフトでファイルをダウンロードして、ダウンロードしたファイルを読み込んでください」とか言ってごまかしてました・・・。これでボタン一つで処理してもらえるようになるかもしれません。感謝します。
つかASCIIエンコーディングとか使ってるから関係ないんでね?
944 :
デフォルトの名無しさん :2006/05/17(水) 22:16:46
NumericUpDown みたいなやつの矢印だけのコントロールで矢印が左右向いてる やつってないんですか? ようするにmsctls_updown32の横向きで作りたいんですが UpDownBaseにもそれらしいプロパティがないですし
this.listView1 = new ListView(); これでフォームのリストビューが 新規に生成したリストビューに代わるかと思ったら変化なし。なぜ?
フィールドにセットしただけで入れ替わったらびっくりだ。
実際に表示してるのは Controls プロパティに格納されている ListView 。 で、this.listView1 に新しいインスタンスを代入すると、 元々は一致していた this.listView1 と Controls 内の ListView が別インスタンスを指すことになる。
948 :
945 :2006/05/19(金) 00:39:43
根本的な部分で激しく間違えてた。深夜に速攻をありがとう。
949 :
デフォルトの名無しさん :2006/05/20(土) 17:19:59
3ペインのアプリケーションを作っています。 ツリービューからマイドキュメントなどのフォルダを選んで、リストビューに そのフォルダの内容を表示します。リストビューで選択した項目を axwebbrowserに表示したいです(表示したいものはhtmのファイル)。 緑のバイクのコードを参考にして下記のコードを記述しています。 private void listView1_SelectedIndexChanged(object sender, System.EventArgs e) { //ブラウザに表示する object o = null ; string my_url = "c:\\Documents and Settings\\Owner\\My Documents\\HomepageDesigner\\index.htm"; axWebBrowser1.Navigate(my_url, ref o, ref o, ref o, ref o) ; } このコードでリストビューの項目を選択したらaxwebbrowserに表示させること はできました。 これを選択したアイテムを表示されるようにするにはどのへんにどのような コードを記述すればいいでしょうか。
950 :
949 :2006/05/20(土) 17:24:34
なんか日本語おかしかったかも 上記のコードではいつでもindex.htmが表示されるのを→その選択している項目 が表示されるようにしたいのですが・・・
951 :
949 :2006/05/20(土) 17:40:37
すみません。できました。 宇宙仮面のC#さんからとってきたステータスバーにファイル名までのフルパス を表示させるコードをstring my_url = のところにそのまま貼り付けたら できました。でもそのコードでは違う項目を選択したらエラーになるし 同じ内容を2回記述していて変なのでもうちょっと修正します。 すみませんでした。
既製のコマンドラインのプログラムに対するラッパー的なフロントエンドのプログラムを 作りたいと思っています。その手のプログラムを組むに当たって初心者向けの解説サイト というのはございますか?
無いんじゃね?
954 :
952 :2006/05/20(土) 20:02:28
。・゚・(ノД`)・゚・。
>>952 その手もなにもGUIだけ作ればいいんじゃない?
956 :
952 :2006/05/20(土) 20:34:53
>>955 たとえばどうパラメータをコマンドラインプログラムの引数として渡してやるかとか、
コマンドラインプログラムを実行した結果生じるステータスをどうしたら知ることができるのかな
と思いまして・・・
そんなの悩むもんじゃないからな
958 :
952 :2006/05/20(土) 21:32:40
( ´・ω・)・・・
>>958 Process.StandardOutput でぐぐる。
960 :
952 :2006/05/20(土) 22:14:02
>>959 > Process.StandardOutput
便利な関数ありがとうございます。
以下のような複数行からなる返り値も余すことなく拾いたかったところなんですよ( ´∀`)
C:\temp>hoge.exe
rep Run = LIVE
status ok
C:\temp>
>>960 関数じゃなくてプロパティ。まずは基礎を…。
962 :
952 :2006/05/21(日) 03:04:57
あ、プロパティでしたか、こりゃ失敬(*´∀`) ところで実際のコマンドラインプログラムの振る舞いをもう少し詳細に説明しますと、 C:\temp>hoge.exe rep Run = LIVE status ok の状態で止まっているんです。しかも二行目、status okが表示されるまでそこそこの 時間がかかります。このプログラムを抜け、プロンプトに戻るためにはCtrl + Cを押さな ければなりません。 C:\temp>hoge.exe rep Run = LIVE status ok ^c C:\temp> このようなコマンドラインプログラムでも2行目の status ok まですべての出力を余すことなく拾うことはできますか?
WaitForExit つーか、ドキュメント、読め、ハゲ。
964 :
952 :2006/05/21(日) 03:25:55
>>963 > WaitForExit
どうもです。WaitForExitというのはプログラムが終了するまで待ってろと言う意味ですね。
ということはこの場合、明示的にCtrl + Cを押してやらない限りいつまでたっても
rep Run = LIVE
status ok
の文字列は読み込めないということですね?
できることならCtrl + Cを押す前の待機中の状態でも読みたかったんですが・・・。
と、言いますのも、
status ok
の部分次第ではさらに新しい命令を続けて打ち込む必要があるので・・・。
自分で簡易サイドバーみたいなものをつくりたいのですが、 タスクバーみたいに画面の領域を占拠?するにはどうしたらいいんでしょうか?
>>965 簡単で良いのなら、Screen クラスを使えばデスクトップの範囲を取得できるので
それを元に Form の位置サイズを調整すればいい。
TopMost にしとけば隠れることもない。他のウィンドウが後ろに行ってしまうけどな。
本格的にやるのなら、大変面倒。
MSDN で Taskbar の仕様を調べるところから。
// Band Objects でいいのかな?
968 :
デフォルトの名無しさん :2006/05/21(日) 17:38:25
C#の#ってどんな意味をこめているのですか? あげて、質問いたします。
C++++
そういえばC++ってどうして++Cにしなかったんだろうね?
++CだとCに仕様を追加した格好になる C++だとこれから仕様を追加する格好になる したがって、C++にはこれからみんなでCを使いやすくしようという意味が込められている
972 :
952 :2006/05/21(日) 19:55:00
う〜ん、やはり C:\temp>hoge.exe rep Run = LIVE status ok hoge.exeプロセスが生きている間は Console.WriteLine(p.StandardOutput.ReadToEnd()); を実行しても文字列は拾えませんね。 というか、 C:\temp>hoge.exe rep Run = LIVE status ok ^c C:\temp> Ctrl + Cをかけた後でなければ途中の文字列は拾えません。 でもそれだとプログラムが終了してしまうのでアクションが取れなくなってしまうんですよね(´・ω・`) C:\temp>hoge.exe rep Run = LIVE status ok プログラムの実行中でもまずここまで読んで、 その上で C:\temp>hoge.exe rep Run = LIVE status ok set Text = test という風にさらにコマンドを実行したいんですが・・・
ヒント:別スレッド
974 :
952 :2006/05/21(日) 20:03:44
いやでも、C#に関する、質問なんですが(;´Д`)・・・
釣られてもいいですか?
952は凄腕の釣り師だなw
977 :
952 :2006/05/21(日) 20:12:13
(´・ω・`)ショボーン
>>977 別スレッドをスレ違いと読み違えたのはおそらくネタなんだろうが、
それでもお前は基礎から勉強した方が良いぞ
System.Threading.Thread と言えばいいか? しかしまあこの場合の問題は別だな。 冷静に考えろ、ReadToEnd() ってことは終わりまで読むんだよな。 終わりって何だ?
>>967 ありがとうございます、本格的な方ですねorz
ざっと見た感じでは
VisualStyleElement.Taskbar
でしょうか?
981 :
952 :2006/05/21(日) 20:26:35
>>978 > 別スレッドをスレ違いと読み違えたのはおそらくネタなんだろうが
>>979 > System.Threading.Thread と言えばいいか?
Σ(´Д`; )!
(´・ω:::::.....
そういう意味でしたか。ありがとうございます。
> 「結論から言えば、スレッドは起動するな。」と予め言っておく、
> スレッドを起動しないでも別スレッドで処理を実行する方法はある。
> 別スレッドで処理をするという事の説明の前段階であり、
> これを見て喜んでスレッドを起動しないでほしい。
ttp://www.ailight.jp/blog/kazuk/articles/6281.aspx 結構鬼門そうなテクニックですね。
ちょっと調べてみます。
983 :
952 :2006/05/22(月) 00:07:10
スレッドに関して調べてみました。 ですがどうも自分のやりたいことと違うような気もするのですが・・・ C:\temp>hoge.exe rep Run = LIVE status ok hoge.exeを実行し、任意の時間ののち status ok の表示でプログラムが停止しているとします。 この表示が出されたことを確認した上でさらに続けてコマンドを入力していくわけですが、 C:\temp>hoge.exe rep Run = LIVE status ok set Text = test 別スレッドでこれをやるとなるとまた他のプロセスでhoge.exeを実行することになり 連続性が失われてしまいます。あくまでも最初に動かしたhoge.exeに続けてコマンドを 入力していきたいのですが、それでも別スレッドを立てて実行した方がいいのでしょうか?
もう帰れ
986 :
952 :2006/05/22(月) 00:17:25
>>979 > しかしまあこの場合の問題は別だな。
> 冷静に考えろ、ReadToEnd() ってことは終わりまで読むんだよな。
> 終わりって何だ?
つまりプログラムが終わらない限りReadToEnd()は全く読んでくれないということですね。
そして肝心のhoge.exeを終了させるにはCtrl + Cをかけなければならないと( ´・ω・)・・・
で、StandardOutput である StreamReader には読み込むのに ReadToEnd しか用意されてないってのか?
988 :
952 :2006/05/22(月) 02:23:08
>>987 そういえばReadToEnd()だけでなく、ReadLine()というメソッドもありましたね(*´∀`)
ただ一度にではなく、不定期に現れてくる文をどう拾ってやるかという問題がありますね。
文が現れたときに読み込んでくれるようなメソッドがあれば便利なんですが・・・
989 :
952 :2006/05/22(月) 03:35:57
いや、ReadLine()で出来ました(*´∀`)・・・
990 :
デフォルトの名無しさん :2006/05/22(月) 03:43:28
こんばんわ。 mhtmlを使わずにHTMLのタグを取得したいのですがつまずいてしまいました。 1object htm; 2type typ ; 3string docbody; 4 typ = Type.GetTypeFromProgID("mhtmlfile") ; 5 htm = axWebBrowser2.Document ; 6docbody = typ.InvokeMember("title",BindingFlags.GetProperty, null, htm, null).ToString(); 7textBox1.Text=("" + docbody); 上記のソースを記述しています。 タグの全てを表示したいのですが、うまくいきません。 とりあえず6行目の"title"できちんとHTMLで書かれたTITLEが表示されるのですが、 全体を表示しようとするとうまくいきません。 他のHPなどを参考に"title"の部分を"body"とか"outerHTML"とか"documentElement"に 変えてみたんですが、エラーが出ます。 どなたかご教授いただければと思います。
せめてエラーとやらの内容ぐらい書け。
c#8.0,win2000です
FrameWork2.0から追加されたWebBrowserコントロールを使って
ページが読み込まれるまで待ってからページのDocumentに対
して操作したいのですが
WebBrowser.IsBusyプロパティを使った判定の仕方がわかりません
private void button1_Click(object sender, EvebtArgs e)
{
WebBrowser wb = new WebBrowser();
wb.Navigate("
http://www.google.com ");
//ここでwbがページ読み込み中かどうか判定したい
while(wb.IsBusy)
{
}
//ここに来た時点でページの読み込みは完了しているはず
//しかし wb.Document.GetElementById("xx");などとすると
//System.NullReferenceException例外が起こる
//ステップイン実行してみるとwhile(wb.IsBusy)のループを
//一度も回っていない
}
そういうのってDocumentCompletedイベントでやるべきでは?
994 :
992 :2006/05/22(月) 10:49:15
ありがとうございます
やってみましたが駄目でした
bool b = false;
private void button1_Click(object sender, EvebtArgs e)
{
WebBrowser wb = new WebBrowser();
wb.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(wb_DocumentCompleted);
wb.Navigate("
http://www.google.com ");
b = true;
//ここでwbがページ読み込み中かどうか判定したい
while(b)
{
}
wb.Document.GetElementById("xx"); //同じエラーになってしまう
}
private void wb_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
b = false;
}
どこか間違っているでしょうか?
995 :
990 :2006/05/22(月) 11:44:12
>>991 例えばHTMLのタイトルがふらっとC#だとしたら"title"でちゃんと「ふらっとC#」とでます
が"body"にすると「mshtml.HTMLBodyClass」と表示されて中身が出ません。
すみません、他にも「文字列が長すぎます」とか出たんですがそれは今出ません。
>>994 private void button1_Click( object sender, EventArgs e )
{
WebBrowser wb = new WebBrowser();
wb.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler( wb_DocumentCompleted );
wb.Navigate( "
http://www.google.com " );
}
void wb_DocumentCompleted( object sender, WebBrowserDocumentCompletedEventArgs e )
{
HtmlElement element = ((WebBrowser)sender).Document.GetElementById( "1a" );
MessageBox.Show( element.InnerHtml );
}
>>995 body で取得できるのは HTMLBodyClass オブジェクトであって文字列じゃないから。
大体中身って何を想定してるんだ?
998 :
990 :2006/05/22(月) 23:51:12
>>997 そうなんですか・・・
中身はhtmlのソース(タグ?)をそうていしています
>>996 できたー!
ありがとうございました
ただ、DocumentCompletedイベントってあんましあてに
ならないのです。
例えば最初に飛んだページがLocationヘッダ吐いても、
ページがフレームで構成されていても、IFRAME使っていても
その都度DocumentCompetedが起こってしまいます。
うんこぶりぶり
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。