1 :
名無しさん♯ :
2005/06/01(水) 22:03:20 BE:101571146-
2 :
名無しさん♯ :2005/06/01(水) 22:03:54 BE:236998087-
3 :
名無しさん♯ :2005/06/01(水) 22:04:33 BE:190445459-
>1 もつ
キター 今回は立つの遅めだったねw
アプリが終了する時に実行したい処理があって、それが時間を使う処理の場合 どのように記述するのがよいのでしょうか ためしにAppDomain.ProcessExit で記述して Enviroment.Exit(0)を実行してみてもスキップされてしまうのですが private static void CurrentDomain_ProcessExit(object sender, EventArgs e) { Console.WriteLine("CurrentDomain_ProcessExit"); while(true); }
コントロールからGraphicsオブジェクトを生成するにはCreateGraphics() というメソッドがありますが、例えばImageとかBitmapからGraphicsオブジェクト を生成する方法はないでしょうか。 要するに、画面に見えない所でGraphicsの描画メソッドをImageなどに適用 しておき、それを返す関数などを作りたいのです。何かいい方法があったら ぜひご教授下さい。
>>8 Graphicsのメンバをよーく調べてみ?
>>9 ありがとうございました!FromImage()というメソッドがありました。
これで早速やってみます。
↓「開始」をクリックしたら「中止」ボタンを有効にして、終わったら もとに戻しています。「中止」をクリックするとmyThreadをAbortしてます。 private void buttonStart_Click(object sender, System.EventArgs e) { myThread.Start(); } private void MyThreadProc() { this.buttonAbort.Enabled = true; this.buttonStart.Enabled = false; this.buttonAbort.Select(); this.buttonAbort.Focus(); Thread.Sleep(2000); //何か処理 this.buttonAbort.Enabled = false; this.buttonStart.Enabled = true; this.buttonStart.Select(); this.buttonStart.Focus(); } ところが、開始すると「開始」ボタンが無効になるんですが、フォーカスを 持ったままになってしまいます。無効なのに点線がついてて、スペースキーを押すと 「開始」ボタンが反応するんです(XPだと見て分かる) 別スレッドだとフォーカス関係はうまく動作しないのでしょうか? 上記のようにSelectとかFocusとかいろいろやってみたのですが効きません。 開始前の処理をbutton_Clickのほうに持ってくると、今度は終了時に 無効になった「中止」ボタンにフォーカスが残ってしまいます。
>>11 UIスレッド以外のスレッドからコントロールをいじるのにはInvoke/BeginInvokeを使えと。
13 :
11 :2005/06/02(木) 15:00:54
>>12 ぬはぁっ、即効で解決しました。感謝します。ムチだな俺・・・
前と後ろそれぞれ別メソッドにしてデリゲート作ってInvokeしました。
IntPtr型の変数が指すint型のデータを読み込むにはどうすればいいですか? C/C++も使っているので、ポインタの考え方が身に染みついてしまっています。
15 :
14 :2005/06/02(木) 16:35:07
分かりました。Marshalを使う必要がありそうですね。 ReadByte()とかReadInt32()とか・・・・ポインタも使おうと思えば 使えますが、あまりC#らしくないプログラムにしたくないので。
ポインタも使えるのまで含めて「C#らしさ」だと思うんだがなー。 IntPtr/Marshal使うのもunsafe/ポインタ使うのも実際かわらんし。
正直C#を使う前は、CLRなぞ遅いだろうとたかをくくっていたら、 実際使ってみるとこれがなかなか速い。そりゃC/C++で書いた物に 比べれば遅いだろうが、開発時間がとても短くなる。コンパイルも速いし。
どっちかっつーと起動時間が遅いのがあれだな。特にWinFormを使ったやつは。
>>18 それはあるな。DLLを山ほど読み込むし、あれだけライブラリが豊富
なら仕方ないかと思う。メモリも多量に食うしね。Javaは体質的に
受け付けないが、C#ならすんなり使えた。(そんなに変わらないという
話もあるが、Windowsとの相性はC#の方が絶対上。メーカー一緒
だもんね)
>>17 結局実行される直前にネイティブコードになるわけだしね。
>>20 そうだな。それに必要とあらば、ngenを使って初めからネイティブに落として
おく手もあるし。これでも環境が変わったら(64bitとか)ちゃんとJIT動かしてくれるらしいし。
遅延初期化とか駆使すれば多少起動は速くなる。
23 :
デフォルトの名無しさん :2005/06/02(木) 23:13:16
おい、おまえら。 まずは旧スレ埋めようぜ
999 :デフォルトの名無しさん[sage] :2005/06/03(金) 01:03:36 任せた ↓ 1000 :デフォルトの名無しさん[sage] :2005/06/03(金) 01:04:15 Java!!!
Graphics.DrawImageの速度に関してなんだけど。 ソースの領域同じ、描写先の領域も同じで、 元のイメージの大きさが違うときにやたら速度に差が出るのってなんとかならなりません? 2000x2000の画像の一部分をDrawImageをしたらやったらと遅い。
それはGDI+が遅いんじゃないの?
C#でCSVを高速で読むのってなんかあるかなぁ? splitで読むとなんか遅いんですが。。。
28 :
27 :2005/06/03(金) 11:55:24
CSVの容量は300MBぐらいで C++で作ったものだと10秒 c#だと20秒かかります。(Split使用) うーむ、、、なんとかC#を勝たせてあげたい。。。orz
流石に勝つのは無理だ。 Splitの代わりに正規表現とか頭から舐め回してSubstringとかどうよ。保証はしないが。
30 :
デフォルトの名無しさん :2005/06/03(金) 12:41:12
SplitってどのSplitだ? Microsoft.VisualBasic.StringsクラスのSplitやSystem.Text.RegularExpression.RegexクラスのSplitもあるぞ
C#スレなんだからRegex.Splitの方じゃねーの?
32 :
27 :2005/06/03(金) 13:29:29
んと、普通いっぱんに filestreamで読んで、Readlineでstringとって、splitしてるです。 正規表現つかうと更におそくなるからつかってないです。
引数に文字列を取るメソッドを作ってるんですが、文字列がnull参照だった場合、 String.Emptyと扱うほうが良いのか、ArgumentNullExceptionを投げたほうがいいのか… メソッドの処理の内容は、文字列が空なら空で何の問題もない処理です。
>>33 作る側の事情によるが、俺ならString.Emptyとして扱う。
nullに特別な意味を持たせる必要がないのなら空文字列で良いんじゃない?
>>25 Graphics.InterpolationModeがコストの高い設定に
なってない?
37 :
デフォルトの名無しさん :2005/06/03(金) 15:22:11
C#、コンソールアプリを作成したのですが、当たり前に コンソールが一瞬表示されます。(そりゃそうですが・・・) コンソールを表示したくない場合は、どうしたらいいでしょうか。 ご存知の方、よろしくご教授ください。
Windowsアプリケーションで出力すれ。
Image.FromFileで読んだ画像データをBitmapに変換し、RGB毎の 値をいじって色調を変えようとしているんですが、どうもうまく行きません。 pscanline = bd.Scan0; stride = bd.Stride; for (int y = 0; y < h; y++) for (int x = 0; x < w * 3; x ++) { Color color = Color.FromArgb(Marshal.ReadInt32(pscanline, x + y * stride)); c = Convert.ToInt32(color.R * rf); r = (c > 255) ? (byte)255 : Convert.ToByte(c); c = Convert.ToInt32(color.G * gf); g = (c > 255) ? (byte)255 : Convert.ToByte(c); c = Convert.ToInt32(color.B * bf); b = (c > 255) ? (byte)255 : Convert.ToByte(c); Marshal.WriteInt32(pscanline, x + y * stride, Color.FromArgb(color.A, r, g, b).ToArgb()); } bmp.UnlockBits(bd); こんな感じでやってるんですけど、色ごとの変化がうまく行かず、明るさだけ変化 しているようなおかしな感じなんです。ぱっと見変な所があります?
>>39 なんでr,g,bがbyteなのかとかFormArgb().ToArgb()ってコスト高そうとか些細な疑問はあるが、
特に問題はなさそうだが。
rf, gf, bfが同じ値とか言わない?
ん、LockBitsするときにPixelFormat.Format32bppArgbでロックしてるよね?
>>40 レスありがとうございます。
rf、gf、bfを変化させて色調をいじります。例えば赤を強くしたい時にはrfを1.1位に
するとか、そういう感じです。
LockBitsする時はPixelFormat.Format24bppRgbでロックしています。これを
おっしゃる通りPixelFormat.Format32bppArgbでロックしてみたりもしているん
ですが、症状は全く変化無しです。
FromArgb、ToArgbは、Color構造体にコンストラクタがないのでこうやっちゃって
ますが、普通にビット演算でARGB32ビット作り出した方が速いですね。
早速試してみます。
画像は今一種類のみで試してみていますが、もっといろんな画像でテストして
みたいと思います。もしかしたら画像の色分布が悪くて、変化がわかりにくいの
かもしれません。
>>40 それと、r, g, bもintにしてみます。考えられるのはここら辺ですし。
ReadInt32/WriteInt32の第二引数は"バイトオフセット"。Int32を順に読むなら4つずつずらしていかないと駄目。 あ、Rgbだったら3バイトずつか。 > for (int x = 0; x < w * 3; x ++) { だと1ピクセルずつじゃなくて1色ずつになっちゃうぞ。
>>43 それでした。初歩的なミスでした。
C/C++だと勝手に4バイト飛びにポインタを替えてくれる癖が抜けきって
いませんでした。もっと精進します。ありがとうございました。
あ、それと言い忘れました。
>>40 わかりもしないなら偉そうに書き込まないでください。
VC♯2005EE betaってヘルプは英語のみですか?
>>27 C#だとbyte[] <--> Stringでエンコーディングの変換が発生するから
遅いというのもあるだろう
StreamReader#ReadLine()とか使わずにバイトのまま処理したらどうよ。
行・フィールド分解はunsafe使ってポインタ操作で。
>>48 そこまで行くと素直にC/C++を使おうと思わない?
>>49 いや、
>>27 はなんとかC#に勝たせたいんだそうだから。
俺ならC#使う時点で多少のパフォーマンスは気にしないけどな。
Winアプリでデータグリッドとツリーコントロールが合体したものが欲しいのですが、
どなたか、そのようなサンプルコードをご存知ないでしょうか?
階層化できるデータグリッドというか、グルーピングというか、たためるグリッドというか、
例えば、Outlookのメールのサブジェクトビューのように、「日付:先週」で畳める感じで。
階層の深さは親子ではなく、任意にしたいんです。
左にツリービュー、右にリストコントロールを並べても、ツリーノードの1と2を展開して、
3と4を畳んだ表示とかが不可能です。
http://www.codeproject.com/cs/miscctrl/csharpgridcontrol.asp の作者が、協力してくれるなら自分が途中まで作ったものを提供すると書いてますが、
自分の技術に自信が・・・
53 :
デフォルトの名無しさん :2005/06/03(金) 22:53:19
最近C#を始めたのですが、一つ質問させて下さい。 classの配列を使用したいのですが、どうも上手くできません。 01:public class test 02:{ 03:public int[,] A; 04:public test() 05:{ 06:A = new int[25, 25]; 07:} 08:} 09: 10:public test[] a = new test[10]; 11: 12:private void Form1_Load(object sender, EventArgs e) 13:{ 14:a[0].A[0, 0] = 0; 15:} 10行目を public test a = new test(); 14行目を a.A[0, 0] = 0; として、配列じゃない状態にしたら正常に動いたので、10行目に問題があると思うのですが、どうすれば正常に動くのかが分かりません。 どうすれば正常に動くのか、ご教授いただけると有難いです;
new test[10]; この時点ではtest[]オブジェクトを作っただけで、それぞれの中身はnull。
for(int i=0;i<10;i++) { test[i]=new test(); }
なんつーかFAQだな。
C++だとデフォルトコンストラクタが呼ばれるからな 元C++ユーザなのかもしれん 多分違うけど
C#に慣れたら、C++やDelphiの文法が汚く思えるようになった。 C++はまだ許せるとして、DelphiはPascalベースなのでちょっと考えると 綺麗そうに思えるが、実際はあちこちつぎはぎだらけの拡張で汚い。
うん、C系はBasic系よりすっきりしてる
60 :
53 :2005/06/04(土) 01:36:55
>>54 ,55
解決しました。
お陰様で助かりました、
どうもありがとうございましたm(_ _)m
>>58 後出しした方が洗練されているのは当然
ということはDのほうが上の可能性もあるのか
あとで出して汚かったらある意味凄いな。
個人的にDはちょっとみてみた感じ多機能性に主眼が行っていてあんまり洗練はされてないと思ふ。
C#の強力なRADを開発した人って、元々BorlandでVCLを作っていた人が Microsoftにヘッドハントされたんだっけ?使い勝手がDelphiそっくりなんですけど。
C#の言語仕様を策定した人とDelphiのそれを策定した人は同じだけど、 IDEはわかんねえな
DelphiのIDEそのものを知らないが、VC#のIDEはVBからの流れじゃないの? .NETに対応したDelphi8が出たときの紹介記事を読む限り、IDEの操作性がVSに近づいたとかそう言う論調が多かったし。
VB6とVS.NETをどちらも持っているのですが、 VB6のコントロールをVS.NETで使用するのはライセンス上問題ありますか?
68 :
デフォルトの名無しさん :2005/06/04(土) 17:35:24
verbatim文字列によるパスの比較について質問します。 別クラスに存在する定数 const string PATH = "src\\data" と、パラメータとして渡される string path1 (例えば、string path1 = @"src\\data" verbatim文字列なんですが\\の文字列が渡されます) の比較をString.Compareで行い、等しいかどうかをチェックするメソッドを作成しています。しかし、比較がうまく行えずちょっと悩んでいます。 メソッド(path1){ if (String.Compare(path1, 別クラス.PATH) == 0) } で比較すると、PATHがnull値になり常に偽になってしまいます。(なんでnullになるのかもよく理解できてないのですが) メソッド(path1){ string compPath = 別クラス.PATH; if (String.Compare(path1, compPath) == 0) } とか メソッド(path1){ string compPath = @別クラス.PATH; if (String.Compare(path1, compPath) == 0) } だとうまくいきそうなのですがcompPathの中身が@"src\data"になってしまい、うまく比較できません。 この場合、どのようにしたらいいのでしょうか。定数を const string PATH = @"src\\data" にするとか、そもそもパラメータを string path1 = @"src\data" にできればいいんでしょうが、他のメソッドで大量に使用しており変更できそうにありません。 verbatim文字列のパラメータ string path1 = @"src\\data を "src\data" に変換することってできないんでしょうか。
>>66 RADという物がメジャーになったのがVBから。
それを真似たのがDelphi。
>>68 いいたいことはサッパリわからんが置換すれば?
>>61 でもjavaより汚い気がする。
デストラクタ+ファイナライザ+IDisposeとか
プロパティとか例外処理とか色々。
>>70 俺は逆だなー。
基本的にすべてobjectの派生として通してるところとか。
プロパティは状態を巧く隠蔽する良い解決だと思ってる。 やっぱり状態と動作は区別すべきだと思うし。
73 :
デフォルトの名無しさん :2005/06/04(土) 17:53:57
>>70 たしかにいいたいことはわからんが・・・置換できるのか?
>>68 ソースより先に日本語直せ。
>>70 デストラクタとファイナライザって同じでは?
IDisposeの管理は確かにめんどくさいけど。
>>68 もうちょっと現状の整理を
PATH が null になる状況は端から見てありえない
>>72 プロパティは、java では別々に用意する必要がある setter と getter を纏めてある以上、
無駄にメソッドが増えなくて良いかもね
>>73 置換は String.Replace だけど、null はそもそも置換できないよな
>>74 java でも、ファイル操作とかは close しなくちゃいけないから、むしろ IDispose でまとめて using した方が楽かと
>>76 JavaがC++使いに受け入れられない最大の理由がそこだからね
>>70 プロパティはCLR的にはただsetterとgetterをまとめた
という程度の意味しかもたないけど、
クラスライブラリ的にはコンポーネントの基本要素としての性質
があって、System.ComponentModelとかTypeDescriptorあたりのことが
分かってくると、無駄にメソッドが増えないとかそういうレベルの恩恵ではない
と思いますよ。
MSとかがC#のことを「コンポーネント指向言語」ってよんでる理由が
この辺にあるんだろうと思ってますけど。
IDisposableも確定的デストラクションのギミックとしてはusingとかで
最低限の使い勝手にはなってるだろうし、2.0での拡張とか見てると
なかなか面白い発展性を持ってるです
両方あるでしょ?で、それが混乱するって言いたいんです。 さらにIDisposeもあるし。 例外処理もメソッドの宣言みても何を投げるかわかんないから ついつい全部キャッチするようなの書いちゃったり。 プロパティはアクセス制限がセッタとゲッタで分けられないのが不満なのと パブリック変数かメソッド呼び出しなのかハッキリしないのが。
>>79 ??
デストラクタとファイナライザは同一のものだし、
こいつらは何時実行されるかわかんないから IDispose があるんじゃ?
throws は納得
>>79 > プロパティはアクセス制限がセッタとゲッタで分けられないのが不満なのと
.NET 2.0/C#2.0で分けられるようになった。
> パブリック変数かメソッド呼び出しなのかハッキリしないのが。
まさにそのように隠蔽するための物なんだが……。
throwsは欲しいねぇ。
>両方あるでしょ?で、それが混乱するって言いたいんです。 >さらにIDisposeもあるし。 ??ないよ。「ファイナライザはデストラクタ構文によって書かれる」 だけだし、IDisposableがないと、確定的デストラクションは どうするのさ? >例外処理もメソッドの宣言みても何を投げるかわかんないから >ついつい全部キャッチするようなの書いちゃったり。 これは基本的には同意なんだが、例外処理ではjavaとは ちょっと発想というか考え方が違うので、その辺のことを書いた 本とか読んでみるといいよ。 >プロパティはアクセス制限がセッタとゲッタで分けられないのが不満なのと 2.0で解決済み >パブリック変数かメソッド呼び出しなのかハッキリしないのが。 そもそもパブリック変数基本的に禁止
throwsつけたときdelegateはどうすんだ?
2.0はすげえよ。 javaの進化が遅すぎるのかC#が速すぎるのか知らんが、 すげぇよ。
>>79 > パブリック変数かメソッド呼び出しなのかハッキリしないのが。
パブリック変数かメソッド呼び出しかはっきりしていないと
利用できないような設計ならば、
きっと設計が間違っている。
>>82 別の機能というか構文が2通りあるでしょ。
>確定的デストラクション
これがC++だとデストラクタ。javaだとfinallyではっきりしてるけど
C#だとひとつじゃないから機能を詰め込みすぎな気がする
>>85 他人のソース見たときね。
javaが出て10年後ってこと考えると
言語仕様が練れてないと思わない?
個人的にいいなと思った機能はオーバライドを明示する必要があるってとこだけだ。
>>86 > 他人のソース見たときね。
意味わかんね。
>>86 >別の機能というか構文が2通りあるでしょ。
C# では
~ClassName() {}
の一択だから、構文は1つだけ
>これがC++だとデストラクタ。javaだとfinallyではっきりしてるけど
finally はデストラクタではない
お前ら、C#のファイナライザとデストラクタは別物だぞ。 デストラクタはコンパイル時にファイナライザに置換され、”最後に基本クラスのファイナライザを呼び出すコードが付加される” ファイナライザを明示的にオーバーライドしたときはそういうことは行われない。
>>89 C# では、Object.Finalize を独自にオーバーライドすることは出来ない
デストラクタ構文を使う
>>87 すんません。人の作ったクラス使うとき。
>>88 >finally はデストラクタではない
すんません。finallyに終了処理を書く
あと構造体も有るの、ややこしくない?
あー。すいません。しつこすぎた。
>>91 > すんません。人の作ったクラス使うとき。
に、設計が間違っているのか?
話がつながっていなくないか?
> あと構造体も有るの、ややこしくない?
使う必要がなければ使わなくてもなんとかなるよ。
代入文が、構造体とクラスで振る舞いが違うが、
変数名、クラス(構造体)名を見ただけではどっちかわからないのが
C#の問題かなと漏れは思った
逆に変数名で構造体とクラスが判別できても
気持ち悪いが。
まあJavaは出発点がいかにC++から不要なもんを殺ぎ落とすかみたいな感じだからな 後で結局Genericsとか追加する羽目になっとるが C#のプロパティはまあ、MSのCOMの経験に基づいてるんじゃないかな C++でプロパティが使えないのはやはり不便だと まあVC++の場合はプロパティライクな記法が使えるけどな
>>86 だからな、C++が確定的デストラクタなのはわかってるわけよ。
そうじゃなく、C#はGCのために確定的デストラクションは出来ない
から「デストラクタ構文はファイナライザ」になってるわけだ。んで、
>>88-90 のようにファイナライザの構文は一つだろ
っていうかJavaだって確定的デストラクタのない状況は
GCつかってるんだから一緒だろ。
必要性を認めてIDisposableとusing、Containerを用意してるC#とどっちがましだよ
んで、パブリック変数は「基本的に禁止」なんだ。
「プライベートなネストクラス」とかなら「許される」程度だ。
>個人的にいいなと思った機能はオーバライドを明示する必要があるってとこだけだ。
こんなこといってる段階でC#は聞きかじった程度の知識しかない
と思ってしまうよ
>> あと構造体も有るの、ややこしくない? > 使う必要がなければ使わなくてもなんとかなるよ。 この、「使わないものには害をこうむらない」というNo overhead ruleは C++の理念だけど それを積み上げてああバカでかくなったことを思うとねえ。 C#には言語設計思想のポリシーがないというと言い過ぎだが、 要するに実用よりなんだと思う。
構造体についてもJavaみたく固定的にintとか用意するのと ,NETみたいに「型システム」に組み込まれてるのと どっちがきれいよ?.NETのやり方だと「すべてオブジェクト」を実現してるぜ Javaは固定的だから拡張性もないわ、オブジェクトじゃないから オブジェクトとしてすら扱えないが(最近中途半端にパクったけどな)。
値型の扱いは流石に.NETのがいいよね
それは感じるな javaは理想を追い求める言語で、 C#は「夢じゃ飯は喰えねーよ」と言わんばかり
この前Javaをやって、間違えて、int型変数にtoString()をやろうとしたことがある。 いかにC#が便利かどうかがわかったよ。
>>99 まあ今んとこはJava屋のが飯食えるだろうけどな(w
俺はC#しか知らないから、さっきから会話についていけないんだけど、
>>100 の例はわかりやすいな
>>102 ちなみにJavaだと
String.valueOf( x );
になる。
まあ、オブジェクトなのに値型の ValueType だとか、メタ属性だとか、妙にゴチャゴチャした構造にもなっているんだけどな
その点 Java はシンプルで良いかも知れない
まあ、C# は実際使いやすいんだけど
ところで
>>82 さん
C# と java の例外処理の概念について書かれた本ってなんスか?
調べて出てこんかった……
>>95 >>個人的にいいなと思った機能はオーバライドを明示する必要があるってとこだけだ。
>こんなこといってる段階でC#は聞きかじった程度の知識しかない
じゃあ言語仕様としてjavaより優れてる点は何だと思う?
Javaは糞。 いずれ滅びる。
C#はC++の代用にもJavaの代用にもなれん
>>105 struct と enum をサポートしている点
逆に interface 内に定数を入れられないのがいやん
>>104 > まあ、オブジェクトなのに値型の ValueType だとか、
ValueTypeはクラスだぞ、と混ぜっ返してみるテスト。
//Managed C++でひっかかったんだこれ。
110 :
104 :2005/06/04(土) 20:35:28
>>109 ん?
Managed C++ での __gc class または __gc struct は C# の class、
Managed C++ での __value class または __value struct は C# の struct
だと思ってたけど違うの?
>逆に interface 内に定数を入れられないのがいやん
しらなかった。
>>95 出てこないなあ。
>>109 あ、ごめん。ValueType は確かに C# のクラスだけど、値型です
113 :
デフォルトの名無しさん :2005/06/04(土) 20:40:57
スマソ あげてもた
>>110 >>112 そうじゃなくて、全ての構造体の基底型であるValueTypeは構造体じゃないクラスなんだ。あとEnumとかも。
考えてみれば当然なんだけど。構造体は継承を禁止してるから。
だからMC++だと全ての列挙体を引数に取るようなメソッドへ渡すときにはbox()を明示しないといけなかった。
C#だと暗黙にボクシングされるから気にならないが。
116 :
104 :2005/06/04(土) 20:46:08
>>115 悪い。俺 「ValueType は構造体」 なんて一度も言ってないw
>>116 >オブジェクトなのに値型の ValueType
これのことじゃないか
118 :
104 :2005/06/04(土) 20:48:51
>>117 構造体は値型だけど、構造体=値型ではない……よね?
119 :
104 :2005/06/04(土) 20:50:49
あーごめん。
>>115 の最後の2行をやっと理解できました。こっちの勘違いみたいすまぬ。
>>113 いまいちjavaとの違いが理解できないけど
>例外をスローすることなく正常に処理を続行できるかどうかを確認するためのメソッドを用意する必要があります。
チェックしない者がダメで、つまりjavaでいうRuntimeExcption扱いですよ。
なのでthrowsは必要ありませんってことかな?
強引な解釈だけど。
そうだ。 「System.Drawing.Graphic」 よりも 「java.awt.Graphics」 の方が優れた設計だと思ったんだった。
s が抜けてる
なんか伸びてると思ったら・・・ なかなか面白い議論をしているじゃないか!
125 :
95 :2005/06/04(土) 21:09:08
いくらでもあるんだが、「コンポーネント指向言語」とかの利点をば。 Property, Event, CustomAttribute、これらはすべてコンポーネントのため にあるんだよな。 Property, Eventがコンポーネントの基本要素。 付随情報(Browsableとかな)のためのAttribute CLRがこれらを許容し、メタデータは自己記述だ。そのためのCLR。 そして、System.ComponentModelに実装されているコンポーネントアクセス インターフェイス。 コンポーネントの利点としては再利用性を上げる人も多いんだが、DataBindingがらみで の面白い利点とか。つまり、現状のオブジェクト指向の問題点として、 状態管理に依存しているために状態が爆発的に増えたときの複雑さが どうしてもでてくる。それに対しての一種の解決策だな。状態をBindingというもので Staticに連結し、管理するべき状態を減らせたり、XAMLのような静的定義 言語を用意してみたり。 ただ、この辺は言語仕様よりも広い話だ、と思うだろう。 いいたいのは、そういう思想が言語仕様から考えて作られている点だ。 どちらかといえば、.NETはCOMの後継っていうのは、ものすごく的確なんじゃないかって思う。
例外の話が出てたけど
何でC#にchecked exceptionをつけなかったかについては↓参照
http://www.artima.com/intv/handcuffs.html C#のチーフアーキテクトが理由を語ってるよ。英文だけど。
大体以下のような理由のようだ。
1) メソッドA、もしくはそこから直接間接に呼び出されるコードの実装変更により
throwされる例外が増えると、checked exceptionがあった場合には、
メソッドAのクライアントはコードの書き換えを要求されてしまう。
2) 比較的大規模なコードでは、それだけハンドリングされる例外の種類が多くなり
最終的には皆 throws Exception とだけ書くようになってしまう。それでは
まったく意味が無い
例外についてはちょっと前に@ITで議論ってたな。
>>126 ありがとです
>メソッドAのクライアントはコードの書き換えを要求されてしまう
要求されたら素直に従っとかないと、肝心の例外を逃しそうな気はする
>最終的には皆 throws Exception とだけ書くようになってしまう。それではまったく意味が無い
意味があるかどうかは使う側が決めることだよなぁ……
設計論になるけど、投げられる例外が多いのならば俺はそれらを一まとめにした基底クラス作ってそれを捕まえる
……っていうか、完全に 『好み』 の問題のような希ガス
悪い。catch の方と勘違いしていた。throws の方ね。
>>125 >この辺は言語仕様よりも広い話だ、と思うだろう。
思う。
>126
例外クラスの継承関係をきちんとすれば対応できると思うんだけどな。
javaのソースみても
catch(Exception){}
ってのが多いから皆必要としてないのかな?
132 :
126 :2005/06/04(土) 21:27:26
>>129 あ、そっちのが簡潔に良くまとまってるね
この辺もJavaとC#の思想の違いかなあとおもた。 理念で言えば例外はインタフェースの一部であり、それをコンパイル時に チェックするchecked exceptionは、素晴らしいものである ってのはC#のデザイナも認めている どっちかっつーとC#の場合は実を取った印象
catch(Exception){} これもコンパイルエラーにすれば問題ない。
自分用ではなく、一般的に公開するクラスライブラリのクラス(や構造体)の設計に関する相談です。 参照型を返すメソッドやプロパティにおいて、返り値がnullの可能性ってのはあっても良いんでしょうか? あるいは、ドキュメントに明記しない場合は、nullは返らないことが前提なんでしょうか。
いいとおもうよ
137 :
135 :2005/06/04(土) 21:51:32
ていうことは、逆に言うと、使う側は、参照型が返る場合は必ずnullかどうかをチェックしなきゃまずいですか?
>>137 するに越したことはない。
ただ、配列を返す処理では、ほとんどの場合は
Lengthが0の配列を期待してnullが返ることはまず考えない。
俺の場合。
>>131 まぁ広いんだけど。そういう広い話で
プロパティとイベントとカスタムアトリビュートがないと
こんなこと出来ないよね?(=プロパティとイベントと
カスタムアトリビュートの利点)
メソッドの名前規則
リスナーインターフェイス
とかって手で実現するぐらいならプロパティ、イベントを特殊化して、
「言語仕様として」用意したほうがきれいだよねって話。
>>139 同感
ただ、全てのものを言語内に取り込むと、逆に煩雑になってしまい混乱を招く原因にもなりかねないかと
個人的には 「java はシンプルで好き」 「C# は扱いやすくて好き」 が決定稿なんだけど
whoisサーバーに接続してドメインの情報を取るDLLを作ろうと思っているのですが、
http://www.mentalis.org/ にあるソースファイルを改造しようと思っています。
シンプルなプログラムなのですが、当然日本語は文字化けしてしまうので
受信したデーターを日本語にデコードしてやらなくてはいけません。
一応、S-JISやEUC、UTF8などを試したのですが、
未熟故に方法が誤っているのか、完全に日本語が文字化けしてしまいます。
.orgなどは問題なく使用できるのですが、co.jpなどが使えないと致命的です。
漠然とした質問で申し訳ないのですが、ご教示お願いいたします。
>>140 うん、JavaはSimplicity、C#はSimplexityってことで (先のヘジたんのインタビュー参照)
そこまで話ひろげていいなら。。 COMをC++で作るとVBのためにIDispatchから派生させたりVARIANTでリターンしたり文字列はSysAllocでかえしたりとか 色々面倒だったけどその辺が楽になるなあ
>>140 同意。
だからC#は十分吟味して取り込んでいっているんだろうね。
っていうかヘジたんの言語設計のセンスは改めて天才的だと思う・・・
いろんな技術をまとめるのうまいよね、この人。
ただ、JavaのSimplicityは以前は信じてました。
でも、あのTigerは…いや、10年の歴史を持つ
言語ですから、仕方ないんでしょうけど。
>>144 COMは大変だった…。
もうなんていうか行き当たりばったりばかりだし。
.netも時間がたつうちに糞設計になってゆくんだろうな('A`)
いや、すでに・・・
149 :
デフォルトの名無しさん :2005/06/05(日) 00:14:08
ThreadPriorityって hoge.exeの中での相対優先度ですよね? タスクマネージャのプロセスタブで、それぞれのプロセスに優先度をつけれますが、 こっちの優先度をリアルタイム等に指定したいときはどうすればいいんでしょうか?
>>141 >>148 ISO-2022-JPはSystem.Text.Encodingでサポートされてるみたいだから
何の問題もなさげ
素直にEncoding.GetEncoding("ISO-2022-JP")でよし
半端バイトがある場合、Decoderを使えみたいにMSDNにはあるが
Decoderでは、結果としてUnicode文字が何文字生成されたかは分かるが
どのバイトまで変換できたか分からない困ったインタフェースのようだから、
行読みするのが楽だろう。
誰か・・・
すでにレスされてるようですが?
>>149 Process.PriorityClass
>>150 > 行読みするのが楽だろう。
Socket.ReceiveはStreamReaderにつっこめないので、
読んだのをMemoryStreamに溜めてからGetStringした方が楽な希ガス
155 :
149 :2005/06/05(日) 01:03:40
みんな答えてるけど
>>154 あ、そのやりかた結構便利だな
俺はSocket行読みするときは専用のバッファクラス自前で作ってたよ
それはそれで別に単純な実装だから大した話じゃないんだけどさ
Reader r = new StreamReader(socket.getStream()) みたいにできんのか?
159 :
デフォルトの名無しさん :2005/06/05(日) 01:52:53
>>75 よっしゃ、私が整理してあげよう。
文字列A="src\\data"
に対して、
文字列B=@"src\\data"
の場合は「AとBは等しい」
文字列B≠@"src\\data"
の場合は「AとBは等しくない」
と判定できるロジックをc#で作りたい、ということだな。
>>158 Socketはストリーム指向以外のネットワークも扱うので、Streamに関するメソッド/プロパティは存在しない。
>>159 ていうかどっちかに統一した方が分かりやすくないか。どうせただのシンタックスシュガーなんだし。
ということで、
"src\\data"と"src\\\\data"が等しいと判断できれば良いと言うことだよな?
後者の\\\\を\\に置換すれば済む話だな。
161 :
159 :2005/06/05(日) 02:00:15
>>160 さ、さすが。
あっという間に案がw
というかさっきあげちゃってすみません。
あ!リロードせずに書き込みしてました! 初歩的なミス・・・情けないです。 本当に申し訳ありません!&ありがとうございます!
163 :
デフォルトの名無しさん :2005/06/05(日) 03:32:55
C#でCOMのアウトプロセスサーバ(にみせかけられるアセンブリ)って つくれますか? インプロセスサーバは問題なくつくれるんですが、EXEプロジェクトだと VSの「COM相互運用機能の登録」というオプションが無効になっていて 選択ができないもので、regasmで手動で登録してみたんですがうまく いきません。。。
早速試してみたのですが、どうも改行をうまく受け取れません。 ¥rを¥r¥nに置換したりいろいろしたのですが・・・ どうも無理なようです。 もともと改行がはいっていないデータなんでしょうか??
165 :
デフォルトの名無しさん :2005/06/05(日) 03:50:31
>>161 いやいや、簡単に納得しちゃって。
まず置換をどうするのかが問題、でしょ。
そこで、Stringクラスの何のメソッド使おうか、と。
>>163 exe、サービスは知らんけどCOM+はあるよね
>>165 それ以前にそんな処理が本当に必要なのかという問題が
168 :
デフォルトの名無しさん :2005/06/05(日) 05:36:38
>>167 確かに。
>>159 がまとめてくれたが、文字列Bの\\はなんで\じゃないのかな。
そんなこといっても始まらないのかもしれないが
そもそも文字列の頭に@をつけると、エスケープシーケンスが
無効化されるんだよね?
\\じゃなくていいと思うんだ。
まぁそれで渡されるならしょうがないけど。
WebClientクラスを利用してデータ送信する際、 Flashで作られたボタンを実行することは可能でしょうか。 例) Flashボタン ↓ 処理を行うURL ←ここにRequestしたい ↓ 処理後のURL
170 :
デフォルトの名無しさん :2005/06/05(日) 08:55:38
C#から、mysqlを使いたいのですが、 うまくいきません。 new OleDbConnection((string)str) で、strをどうすればいいのかご教授ください。 とりあえず、 MyOdbcなるものもインストールしました。 また、コネクションで使用するクラスは SqlConnectionではなく OleDbConnectionらしいという程度の知識を何とか得てます。 ODBCデータソースアドミニストレータで何かするらしいというのも わかっています。 おながいします。
>>163 > regasmで手動で登録してみたんですがうまくいきません。。。
具体的に何がどううまくいかないの?
そもそも.exeをCOMに登録したいだけなのか、本当にアウトプロセスで実行したいのか。
後者は無理な気がするが可能なのかな。
173 :
デフォルトの名無しさん :2005/06/05(日) 12:22:09
>>172 regasmで登録すると、レジストリのクラスルートには登録されて
いるようなんですが、ためしにwshなんかでCreateObjectしてみると
「ファイルが見つかりません」というエラーがでてしまいます。
(スクリプトファイルはアセンブリと同じディレクトリに配置してあります。)
regasmで/unregisterすると、「オブジェクトを作成できません」というエラーに
なるので、レジストリへの登録自体は一応きちんと行われているようなんですが…。
インプロセスサーバ(DLL)の場合、VS IDEで「COM相互運用機能の登録」にチェックつけて
コンパイルするとwshからでも何の問題もなく呼び出せています。
EXEプロジェクトだと、このオプションが無効になっていて使えないのでひょっとしてDLL形式しか
COMに公開できないのかなと思ったしだい。
特にアウトプロセスでなくてもいいのですが、EXEとして単独でも実行しかつWSHなどから
も呼び出せるものを作りたかったんですが…。
>>173 > (スクリプトファイルはアセンブリと同じディレクトリに配置してあります。)
アセンブリを配置するのは、COMを呼び出す"実行ファイル"と同じ位置またはGAC(グローバルアセンブリキャッシュ)。
WSHを動かす実行ファイルは.vbs/.jsじゃなくて、cscript.exe/wscript.exe。
VSで登録するときはアセンブリをGACに登録するようにしてるからいける。
175 :
デフォルトの名無しさん :2005/06/05(日) 12:49:15
>>174 > アセンブリを配置するのは、COMを呼び出す"実行ファイル"と同じ位置またはGAC(グローバルアセンブリキャッシュ)。
> WSHを動かす実行ファイルは.vbs/.jsじゃなくて、cscript.exe/wscript.exe。
> VSで登録するときはアセンブリをGACに登録するようにしてるからいける。
おおお!ほんとだ!それに気がつきませんでした。
たすかりますた。
DLLプロジェクトで、VS IDEからCOMInterOPの登録をさせると、
WSHファイルと同じところにアセンブリを配置すれば動いていたので
気がつきませんでした。 VS IDEは特にGACに登録しているようには
みえないのですが、どういう仕組みで動いているんだろう…。
>>163 そのインプロセスサーバーを VB6 でラップして ActiveX EXE にしろ。すぐできる。
>>175 > DLLプロジェクトで、VS IDEからCOMInterOPの登録をさせると、
> WSHファイルと同じところにアセンブリを配置すれば動いていたので
> 気がつきませんでした。 VS IDEは特にGACに登録しているようには
> みえないのですが、どういう仕組みで動いているんだろう…。
ありゃ本当だ、いい加減なこといっちまった。
regasm.exeのオプションに/codebaseってのがあって、これにアセンブリのフルパスを指定すれば直接参照できるようになる。
ただしsn.exeを使ってアセンブリに厳密名を与えておかないとフルパス指定はできない。
ということのようだ。
Hashtable HT = new Hashtable(); HT.Add( "ア", null ); HT.Add( "イ", null ); HT.Add( "ウ", null ); HT.Add( "エ", null ); HT.Add( "オ", null ); // 以下50音続く 上のように50音がKeyになった連想配列があります。 これをforeachで50音順に値を取得していきたいのですが、 HashtableをKeyでソートするにはどうすればよいでしょうか?
ハッシュ表ってどういうデータ構造か知っとるかね君
つ SortedList
181 :
デフォルトの名無しさん :2005/06/06(月) 02:21:10
列挙型の要素数を得る方法を教えてください
つ Reflection
Enum.GetNamesから
C#ではヌルリっていうの?
C#。javaに比べてコレクションのライブラリが貧相だよな。
>>181 番兵(?)使うとか。
enum TEST{ A, B, C, NUM }
Hoge[] hoge = new Hoge[TEST.NUM];
列挙要素の値を個別に設定してる場合は利用しにくいけど。
.NETはコレクションの種類は少ないのだがなにも困ったことはないなぁ。 なぜだろう・・
System.Collection.Generic は便利だよ。
1.x のころに LinkedList がなかったのは何か理由があったんですか
優先度が低いから。
.NETにはSet系が全然ないけど、Setはあっちでも使ったことないや・・
LinkedList がなくても Queue で大抵は事足りるし
Genericsがないと汎用LinkedListは使いづらいしー。
LinearGradientBrush.BlendのFactorsプロパティ、Positionsプロパティに 2個以上の値を入れたいのですが、配列の大きさが1に固定されていて、 2個以上代入できません。 どうすれば2個以上代入できますか?
195 :
194 :2005/06/07(火) 16:37:16
すみません自己解決しました。 Blendオブジェクトをnew Blend(n);で初期化してからそのFactors、Positions プロパティにそれぞれ代入したものをLinearGradientBrush.Blendに入れたら うまく行きました。 C#のこの辺の感覚がうまくつかめない・・・・慣れるまで頑張ります。
C#の、というのはちょっと語弊があると思う。
>>196 Win32で直接GDI+いじくってる奴は少ないのでは?
ぐぐっても少ない。
198 :
デフォルトの名無しさん :2005/06/08(水) 00:17:00
あるUserControlの上に乗っているすべてのControlが ClickやKeyPressされたときに実行したい処理を記述する簡単な方法はないでしょうか? UserControlのControlsに対して全てClickイベントを記述して ControlAddedでClickイベントを記述するようなイベントを記述する方法を思いついたのですが、 なんだか周りくどいような気がしてるので
>>197 ライブラリ、.NET Framework/GDI+の都合であってC#とは直接関係ないということでしょ。
>>198 簡単なのはないな。
コントロールをAddし終わった後Controlsをforeachで回して.GetType().GetEventでEventInfo取得してAddEventHandlerで追加していくか。
>>198 奥の手。
IMessageFilterをUserControlに実装して、コンストラクタでApplication.AddMessageFilterで追加。
んで、PreFilterMessageで
Control ctrl = Control.FromHandle(m.HWnd);
if(ctrl!=null && this.Contains(ctrl)) {
...
}
return false;
if文自信ない。難点はMessageを直でいじらないといけないとこ。
実はこれで色々出来たりする便利な方法なのにあまり知られていないのは秘密。
それなりにWin32とWinFormの知識がいるので素人には(ry
ところで、参考になるサイトへのリンクもてんぷらに追加した方がよくないか?
GDIとかRGNのハンドルとれたり メッセージループ上書きできたり 昔のAPIがモロだね。 MFCとあんまかわらんな。
204 :
デフォルトの名無しさん :2005/06/08(水) 10:41:46
>>181 Enum.GetValues(列挙型名)とかGetNames(列挙型名)で要素の配列が取れますよ。
Enumは先頭大文字で。
206 :
デフォルトの名無しさん :2005/06/08(水) 11:25:26
ちょっとスレ違いですが 開発環境にVisual Studio .Net 2003を使っているのですが 他のPCで作業をする際に 今まで使っていたPCの設定(ボタンの位置とかウインドウの位置とか)を 移行する方法はないですか?
>>206 %APPDATA%\Microsoft\VisualStudio\の中を漁れ。
>>208 初心者にはふらっとスレがあるじゃないか……
>>208 Wikiなんだから言いだしっぺの法則で
C++からC#に移行した俺としては、VB.NETはとっつきにくい。C#は すぐ慣れた。吐くマネージコードはどちらも同じようなもんだろうけど。
VBプログラマーならVB.NETからやったほうがおすすめ VBからC#は戸惑うはず
>>211 とあるサイトの掲示板で、VB.netをやったときにgetとsetで型の違うプロパティを
書いて質問してる書き込みを見たときに小一時間混乱したのを思い出した。
>>213 詳しく
インターフェイスを実装するのに同じメンバ名を使わないでも良いと知ったのは衝撃だった。
代わりに明示的実装ができないが。
>>214 すまん、覚え違いだった。
正しくはC#で使おうとするとメソッド扱いになるプロパティ。
Public Property Hoge(ByVal i As Integer) As String
Get
End Get
Set(ByVal Value As String)
End Set
End Property
Defaultつけてインデクサにしてしまえってそういう話じゃないか。 C#で引数付きプロパティが使えないのはちょっと残念。
217 :
デフォルトの名無しさん :2005/06/09(木) 12:01:57
ウィンドウの位置とサイズとかを保存するのに、どこにどう保存するのが 一般的でしょうか? VB6ではiniやレジストリに保存してました。それらはレガシーで 新しいやり方があるのかなと勝手に思ったんですが、 app.configかなと思ったんですがドキュメントには読み取り専用として 使うようなことが書いてあるので (実際ConfigurationSettingsクラスも読み取りメソッドしかないし) じゃあ保存は?と。こだわらずにiniを使えばいいんでしょうか。
漏れは設定を保存したクラスにXmlSerializer使ってる。リフレクション万歳。
>>217 独自のXMLファイルに読み書きするのがお勧め。218の方法やDataSetが使える。
MSとしては分離ストレイジを勧めたいようであるが、現状では低レベルのAPI(CLR)や
ツールしか提供されていない。VS2005からはSettingsオブジェクト他その辺が充実
してくるようなのでだんだん使われるようになると予想される。
自分が呼ばれた親プロセスの名前って、取得できないっすかぁ? 親 CreateProcess1.exe プロセス起動--> Prog01.exe 親 CreateProcess2.exe プロセス起動--> Prog01.exe Prog01.exeはCreateProcess1.exeから呼ばれたか、CreateProcess2.exeから呼ばれたか判断したい。
>>220 適当なコマンドライン引数(/aとか/bとか)で区別ってのはどう?
あるいは/a:CreateProcess1.exeみたいな感じで。
ぬるり
224 :
デフォルトの名無しさん :2005/06/09(木) 23:12:56
ドラッグ&ドロップ中のエフェクトでドラッグしたいコンポーネントを うっすらと浮かすようなやり方はどのようにすればよいのでしょうか? +とか□のような地味なエフェクトはDragEffectででるのですが、アイコンなど 色のついたオブジェクトにドラッグエフェクトをつけたいです
>>225 一番上に表示されるのはForm.TopMostとか。
操作の透過は・・・スパイってみたがメッセージすらきてないな。ってことは
フックかいな
Win32スレいったほうが詳しい人いると思うよ
>>225 WM_NCHITTESTでHTTRANSPARENTを返す。
アクティブ状態も変化しないようにしたほうがいいかな。
空のテーブルからデータセット作って、それの行のカウント取ると1になるのは何でなのかな? ds.Tables[ tablename ].Rows.Count;
>>228 すまん。誰かがデータ突っ込んでた。首吊ってくる。orz
Bitmapオブジェクトを2つ定義し、それぞれ適当なImageオブジェクトで 初期化しておきます。それぞれの名前は例えばsrc, dstとします。 次に、dst = src; を実行した後に、dstに変更を加えると、srcまで変更 されてしまいます。C#ではそんな物なのでしょうか? C++のように、ディープコピーが行われる(普通はそのように組む)事を期待 していたのですが、どうもオブジェクトへの先頭ポインタを付け替えるだけの 動作のようです。いろいろ試した結果、Clone()メソッドを使えば、新しい 中身を作り出してくれるようで、動作はまともになりましたが、どうもすっきり しない気分です。
>>231 ありがとうございます。プリミティブな型以外はほとんど参照型なんですね。
そして、クラスの中に参照型変数を持っていた場合、=代入演算子では
C#の場合、ディープコピーしない事もわかりました。
うーまだまだ初心者だ・・・・精進します。
あと、簡易コピーと詳細コピーという用語も発見しました。 簡易コピー=ポインタの付け替えのみ、詳細コピー=ディープコピーの事、 と読み替えて理解しました。そして、=演算子は簡易コピーを実行する という事もわかりました。 配列はちょっと複雑で、配列の中身が参照型の場合、配列の中身は 詳細コピーしますが、中身が参照しているオブジェクトはそのままにされる という事もわかりました。C++では配列のコピーは演算子がないので、 必ず気をつけていましたが、C#の場合はちと気を付ける必要がありそうです。
>>232 ま、C#の参照型変数(クラスのインスタンスは全部そうだ)は要するに
ポインタだと思っておけばよい。
C++でもポインタの代入ではコピーコンストラクタやoperator=は実行されないだろ。
単に同じオブジェクトを指すようになるだけで。
それと同じ。
>>234 そうですね。そう思えば理解できます。
くそー今までBitmap関連のプログラムの動きが怪しかったのはこやつが
原因だったのかー。でもまだ数が少なくて、被害は最小限でよかった。
これからはさぼらずにClone()書きます。トホホ・・・・
>>235 Bitmapといえば、IDisposableについても調べといたほうがよい気がする。
BitmapはDispose!
>>236 > BitmapはDispose!
違うな。
IDisposableはDispose!
>>238 1ブロックに収まるなら何の問題もないが、Managedリソースの感覚で
複数のオブジェクトで共有したりすると面倒なんだよ。
(放置しておいて、リソースが尽きる前にGCされることを祈るというテクニックもある)
GCが走るよりGDIリソースの使いすぎで画面表示がおかしく成りだすほうが大抵先なんだよな。 グラフィック関係にDisposeの必要なクラスが多すぎる気がする。
GDI+って、GDIの諸問題を解決してるのかな? GDIはWIndows3.1からの伝統を引きずってる点が多くて、最近画像関係を いじくり始めた俺には理解不能の制限が多いな。 Delphi Graphic Secretsなどの本を読んで、だいたいわかってきたけど。
C#というか.NETというかを使い始めてそろそろ1年になる。 小物とはいえいろんなアプリも作ったし、Managed DirectX使ったりもしている。 が、System.Drawing名前空間は魔物が住んでいそうで、いまだに使ったことがない
>>242 コントロールのSizeをいじったことすらないと言うのか……すごいな。
ああ、そういえばいじってるな、Sizeとか。すっかり忘れてた
>>227 WM_NCHITTESTやHTTRANSPARENTでぐぐったのですが、
C++などの記事はあるものの、VB.netやC#での例を見つけることができませんでした。
本当に申し訳ありません、もうすこし具体的にご教示頂けないでしょうか?
私の力不足が原因なのですが・・・申し訳ありません!
System.Drawing.Point とか、Drawing 名前空間になくてもいいのになあって思う。 描画に関係なくよく使うのに。 自分でつくりゃあいいのか。
java.awt にも文句言ってくれ
248 :
226 :2005/06/11(土) 00:57:09
>>245 無視かよ
C++わからないんならあきらめろ、な。
Win32でごにょごにょやらなあかんからその辺のAPIと
格闘になる。だからWin32スレいけといったんだよ。
というかHTTRANSPARENTはスレッドローカルだった希ガス
(=この場合使えない)。
こいつをspy++で見たところメッセージ自体
がWindowに飛んでいっていないし(WM_NCHITTESTすら)。
>>246 いや、でもGraphicsで使う意味でのPointに特化されてるし、この構造体。
だからここにあるのに何で不満なんだ?
JavaだとXがねーとawtほにゃららは使えねーとか そおゆう実質的な問題があったけどな
>>249 using 書くのがめんどくさい、というのもあるが、それはおいておいて。
> Graphicsで使う意味でのPointに特化されてるし
そうかあ?
画像処理だけでなくもっと抽象的な処理にも使えるけど。
> using 書くのがめんどくさい たったの1行書くのが面倒ならコーディングなんてやってられねーだろ ま、TupleでもComplexでも好きなクラス書けばいいじゃん Generics使ってさ
>>252 > たったの1行書くのが面倒ならコーディングなんてやってられねーだろ
ごめんなさい
> ま、TupleでもComplexでも好きなクラス書けばいいじゃん
> Generics使ってさ
そうだな、大した構造体じゃないしな
>>254 へー、LayerWindowってHittest透過も出来たのか。
256 :
デフォルトの名無しさん :2005/06/11(土) 12:31:28
Directory.GetFiles(string path, string searchPattern) でsearchPatternに複数の拡張子を含めるにはどうしたらいいでしょうか? string searchPattern = "*.txt; *.htm"てな具合にしてもだめなんですが
できないので2回に分けるか全部取得して自分で判断。
258 :
デフォルトの名無しさん :2005/06/11(土) 12:50:09
くううう、、、そうなんだ… ArrayList fileList = new ArrayList(); string[] searchPatterns = new string[]{"*.jpg", *.bmp","*.gif"} foreach(string pattern in searchPatterns) { fileList.AddRange(Directory.Getfiles(dirPath, pattern); } こんな感じにするしかないか…。 Directory.GetFilesってファイル数が多いと結構コスト高そうなんで foreachでまわして何回も呼ぶのはなんかやだけどな…。
2回目からはキャッシュが効いてほとんどコストはかからない……はず。
260 :
デフォルトの名無しさん :2005/06/11(土) 14:58:47
try finallyについて質問があります たとえば Image img = Image.FromFile(filePath); try { //do something } finally { img.Dispose(); } Image.FromFileはfilePathをロックしてしまうので確実にDisposeかける 必要がありますが、上のコードでFromFile()自体で例外が起きた場合 (画像ががサポートされていない形式である場合など)にはどうやって 例外をハンドリングしたらいいでしょうか。 一行目をtryブロックの中に入れると、imgが初期化されていないと おこられてしまうし…。 Image.FromFileの読み込みで例外が起きた場合はファイルをロック しないようになっているのでしょうか…。。。
>>260 ・それ以前の問題としてusingって知ってる?
・コンストラクタで例外がおきたときにはDispose呼ばなくてもいいと思うよ
>>260 1) もう一段tryブロックを作る(tryブロックをネストする)
2) Imageをtryの外で宣言し、nullを代入しておく。finally句でnullチェックも行う。
3) Disposeの実行の代わりにusingブロックを使用する
> Image.FromFileの読み込みで例外が起きた場合はファイルをロックしないようになっているのでしょうか…。。。
当然ロックしないに決まってる。
もしロックされるとしたら、FromFileが失敗するとImageインスタンスは作られないのにどうやってロックを解除するんだ?
263 :
デフォルトの名無しさん :2005/06/11(土) 15:27:02
>>261 >>262 どもありがとうございます。
> ・それ以前の問題としてusingって知ってる?
usingは知っていますが、using(object obj =...)の初期化部分で
例外起きたらおんなじことかなあとおもってしまいましたorz
>もしロックされるとしたら、FromFileが失敗するとImageインスタンスは
>作られないのにどうやってロックを解除するんだ?
まったくごもっとも。。。よく考えたらそのとおりですよね…。
264 :
デフォルトの名無しさん :2005/06/11(土) 16:44:20
サーバ側の既に読込み済みであるBitmapイメージをクライアント側のPictureBoxに 表示させる良い方法はないでしょうか? 現在、サーバ側でFileStreamを使ってイメージファイルを読込みNetworkStreamに書込む。それを クライアント側で受け取りFileStreamでファイルを生成、その画像を読み込む。という方法を 試しているのですが、生成されたbitmapファイルがアプリケーションを終了さないと ちゃんとしたファイルにならないようで。(Closeの問題?) この手法だとファイルが生成されてしまうので、ファイルを生成せずに画像データをやり取りする 良い方法はないでしょうか? 解決の糸口になりそうなWebサイトや本、手法等をご存知の方がいましたら アドバイスをお願いします。
>>264 BitmapにせよImageにせよストリームから直接インスタンスを作るコンストラクタ/静的メソッドが存在するが。
266 :
264 :2005/06/11(土) 17:51:23
>>265 さんありがとうございます。
public Bitmap(Stream) ですね。これでクライアント側の問題は解決できます。
後はサーバ側の事なのですが、既に読込み済みのBitmapをNetworkStreamに
書き込むことは可能でしょうか?FileStreamからファイルを読込むのではなく
Bitmap bmp = new Bitmap("../../image.bmp"); といった風に画像を読込んだ
bmpをNetworkStreamに書き込みたいのです。
bmpをbyte[]化するといいと書かれていたのをネット見つけたのですが、具体的な
手法が載ってませんでした。何度もすみません。アドバイスよろしくお願いします。
Image.Saveに引数をStreamにとるオーバーロードがあるな。
>>266 >>267 の回答でまったく問題ないと思うけど、
byte[]化したければ(やったことねーけど)こんな感じでできそう
BitmapData bmData
= bitmap.LockBits(new Rectangle(new Point(0,0), bitmap.Size),
ImageLockMode.ReadOnly, bitmap.PixelFormat);
byte[] byArray = new byte[bmData.Height * bmData.Stride];
Marshal.Copy(bmData.Scan0, byArray, 0, byArray.Length);
bitmap.UnlockBits(bmData);
>>268 それじゃイメージのデータだけでメタデータが含まれてないから駄目。
しかもビットマップ限定だからネットワーク越しに送受信には不向き。
MemoryStreamに対してSaveして、それをToArrayするのがベター。
270 :
268 :2005/06/11(土) 18:32:39
>>269 確かにおっしゃる通りで
そのやり方だとちゃんとBITMAPFILEHEADER、BITMAPINFOHEADERつきの
データになるし、復元も簡単でよいですね
ある意味手動でメモリ内シリアライズしてるみたいな
271 :
264 :2005/06/11(土) 21:21:24
272 :
デフォルトの名無しさん :2005/06/11(土) 23:58:30
C#+.NET環境でタスクマネージャのプロセス画面のような レイアウトが実現したいのですが どのようなコントロールが使われているのでしょうか リストボックスとボタンで自作するのはなんだか大変そうで・・
あれはListViewだろ Spy++とかで調べればわかるが
274 :
デフォルトの名無しさん :2005/06/12(日) 00:05:59
VC#.netスレが見当たらないのでここで質問させてね♪ hello woldなコンソールプログラムを作ったんだけど、F5で実行すると、コンソールが即閉じちゃうんだよね。 閉じないようにするにはどうしたらいい?
275 :
272 :2005/06/12(日) 00:08:16
>>273 先にSpy++について調べてみることにします
ありがとうございました
System.Console.Read();
>>275 Spy++を使う前に一通りSystem.Windows.Formsのコントロールを確認すべきだな。
同じことができるListViewコントロールがすでにあるという意味だ。
278 :
274 :2005/06/12(日) 00:20:26
できた!できたよ! デバッグなしで開始(Ctrl+F5)を押せばいいんだね!
動的に曲線を描画(簡単なアニメーション)したいんですが方法がわかりません教えていただけますか 知識は完全に素人レベルです
282 :
デフォルトの名無しさん :2005/06/12(日) 14:08:42
コントロールに含まれていない場合、データを追加したいのですが リストボックスの場合はうまく行くのに リストビューの場合はうまく行きません ※stringdataはstring型のデータです //これはOK if(listBox1.Items.Contains(stringdata)) { listBox1.Items.Add(stringdata); } //これはNG //stringdataと内容が同じitemがあっても追加される ListViewItem lvi = new ListViewItem(stringdata); if(listView1.Items.Contains(lvi)) { listView1.Items.Add(lvi); } ツリービューでも同様のことを試してみましたがうまくいきません この場合どうやって比較すればよいのでしょうか
>>282 > ListViewItem lvi = new ListViewItem(stringdata);
> if(listView1.Items.Contains(lvi))
ListViewItemは参照型。
今ここに新しいのを作った。
さて今までのListView.Itemsの中に、まさに作ったばかりの物は入ってるだろうか?
foreachで回してそれぞれの.Textと比較でもすればー?
285 :
282 :2005/06/12(日) 14:30:24
>>283 アドバイスありがとう
期待する動作のコードが書けました
※stringdataはstring型のデータです
ListViewItem lvi = new ListViewItem(stringdata);
for(i=0;i<listView1.Items.Count;i++)
{
if(listView1.Items[i].Text==item.Text)
break;
}
if(i==listView1.Items.Count)
{
listView1.Items.Add(lvi);
}
>>285 ちょwwwwおまwwwwwwwforeach使えよwwwwwww
287 :
282 :2005/06/12(日) 15:09:25
foreach使い慣れてなくて i==listView1.Items.Countの部分のうまい処理が思いつかず int i; foreach(ListViewItem lvi in listView1.Items) { //ごちゃごちゃ i++; } と言う風にforeachなのにループカウンタっぽいのを定義するぐらいなら forでいっかなって・・
そんなことせんでもboolでフラグもっときゃいいがな。 まあ別にどっちでもいいけどね……
僕はgoto派
>>284 >>290 曲線が書きあげられる様をアニメーション表示したいんです><
というか画面エフェクトとして曲線で飛んでくレーザーのような物に使いたいんです><
まずは日本語の勉強から
>>291 そういうことならベジェ曲線の数式のパラメータを動かして
いけばいい。ただ、多分等速運動にはならない。
>>291 ベクトルを変化させつつ、2点間を線で描画していけばいいんじゃないかな。
C#とあんまり関係ないね。それ系のアルゴリズムについて調べるとよい。
296 :
280 :2005/06/12(日) 18:19:23
皆さんありがとう! 曲線の数式から調べなおしてがんばってみます
297 :
デフォルトの名無しさん :2005/06/12(日) 18:40:23
どなたか、#include <iostream> #include <string> using namespace std; class Neko { private: string name; public: Neko(string s){ name = s; } void naku(){ cout<<"にゃあ。俺様は"<<name<<"だ。"<<endl; } }; int main() { Neko dora("ボス"); //「ボス」というの名前を持ったdoraが生成される cout<<"あなたの名づけた猫がメモリ上に生成されました。"<<endl; cout<<"猫が鳴きます。"<<endl; dora.naku(); } を例として、これを少し改造するだけで、以下の問題のソースを書いてくださいm(__)m 「Objectクラスのサブクラスとして、Dogクラスを作成し、 インスタンスメソッドとして、噛む(bites)を作成しなさい。 bitesメソッドの内容は、"ガブ!"という文字列(String)を渡すものとする。 クラスおよびメソッドを作成したら、一時変数(a)としてDogクラスのインスタンスを作成, bitesメソッドを送って噛むかどうかテストせよ」
#include って C# じゃ使えないよ
300 :
デフォルトの名無しさん :2005/06/12(日) 18:43:14
>>298 すいません。宿題というわけではなくて、模範解答をしりたくて。色々考え抜いた結果です。
うまくコンパイルがいかないもので。 お願いします。
301 :
デフォルトの名無しさん :2005/06/12(日) 18:44:20
>>299 オブジェクト指向の考えの元、C++で書いていただきたいのです。
いや、 だから、 ここC#スレ
#includeってのを見ただけでレスを読む気にならない
305 :
デフォルトの名無しさん :2005/06/12(日) 19:03:14
>>304 分かりました.........そうします。
あちこちでたたかれて、ここが最後の多のみの綱だったのですが...
そのくせC/C++宿題スレには書いてないのな。 なんか人として間違ってる奴。
>>306 223 名前:デフォルトの名無しさん[] 投稿日:2005/06/12(日) 18:46:20
どなたか、#include <iostream> #include <string>
using namespace std;
class Neko
{
private:
string name;
public:
Neko(string s){
name = s;
}
void naku(){
cout<<"にゃあ。俺様は"<<name<<"だ。"<<endl;
}
};
int main()
{
Neko dora("ボス"); //「ボス」というの名前を持ったdoraが生成される
cout<<"あなたの名づけた猫がメモリ上に生成されました。"<<endl;
cout<<"猫が鳴きます。"<<endl;
dora.naku();
}
を例として、これを少し改造するだけで、以下の問題のソースを書いてくださいm(__)m
「Objectクラスのサブクラスとして、Dogクラスを作成し、
インスタンスメソッドとして、噛む(bites)を作成しなさい。
bitesメソッドの内容は、"ガブ!"という文字列(String)を渡すものとする。
クラスおよびメソッドを作成したら、一時変数(a)としてDogクラスのインスタンスを作成,
bitesメソッドを送って噛むかどうかテストせよ」
309 :
306 :2005/06/12(日) 19:11:07
>>307 うお、なぜかブラウザが読み込んでくれてなかった。
逝ッテキマス……
>>297 class Dog{
略
void bites(string s)
{
cout<<s<<endl;
}
}
int main()
{
Dog a();
a.bites("ガブ!");
}
>>310 Objectクラスのサブクラスになってない…って相手せんでよろしい。
せっかく俺が宿題スレで相手してんだから。
なんだ?C++ではObjectクラスを明示的に継承しないといかんのか?
313 :
デフォルトの名無しさん :2005/06/12(日) 19:18:30
ちょいアレな質問ですが教えてください。 今、Formがアクティブになってるかどうかを調べる方法は どうすればよいのでしょうか? なさけねぇ話ですいませんがおながいします...
>>312 必要ない(というかデフォルトでそんなものは提供されてない)から
そいつはどこにあるんだ?と聞きたい。
>>314 Form.ActiveFormと自分自身を比較。
318 :
デフォルトの名無しさん :2005/06/13(月) 00:00:04
stringをmshtmlか何かに放り込んで、body.innerTextのように htmlタグを取り除くにはどうすればよいですか? イメージ: string test = "<html>hello</html>"; HTMLDocument doc = (HTMLDocument)test;(ここが無理なのですが) string str = doc.body.innerText; str=="hello";という結果を期待しています。
正規表現じゃ駄目なのかね?
>>318 何スレか前に<>を処理する正規表現のサンプルを挙げたレスがあったな。
XHTMLなら普通にXML周りを使えばどうとでもなるが。
>HTMLDocument doc = (HTMLDocument)test;(ここが無理なのですが)
ところで関係ないが、こういう場合C#ではたいていは
>HTMLDocument doc = new HTMLDocument(test);
という形だろう。
XMLファイルを大量に作っていると、そのうち、 string path = @"〜"; XmlDocument doc = 〜 doc.Save(path); で、指定されているpathは完全に新しいファイル名なので パーミションが設定されてるわけがないんです。 なのに、ファイルのパーミションが原因でファイルが保存できないと IOException が出るので困っています。 この問題の回避の方法をご存じの方、教えてください。
322 :
デフォルトの名無しさん :2005/06/13(月) 14:34:12
C#のWinFormやクラスライブラリで、小さいファイルを幾つか生成しようとして ループでグルグル回しても、生成されないファイルが出来てくるのはどうしてですか? FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write); でfs.Write(・・・ のような感じなんですけれど、ちゃんと一回ごとにクローズもしてます。 Thread.Sleep(5000)とか入れると、全てのファイルがきちんと生成されます。 こういう場合の定石があったら教えてください、宜しくお願いします。
323 :
322 :2005/06/13(月) 14:50:58
自分で書いていて、んなアホな・・・って気になったので、調べました。 ファイル名をDateTime t = DateTime.Now;で付けていたので、 同じ名前になって上書きされていました。_| ̄|○ ミリセカンドまでファイル名に使っていたので、かぶるとは思いませんでした。 申し訳ありませんでした。
324 :
デフォルトの名無しさん :2005/06/13(月) 15:20:01
構造体のpublicメンバに対して「既定値0を使用します」という警告 (CS0649)がいちいち出るので、/nowarnオプションで出ないように したのですが、これだと本当に使い忘れてごみになっているメンバに 気づきづらくなってしまいます。ほかに出ないようにする方法はないですか?
>>324 publicなものには出ないはずだが。
コンストラクタを定義する。
引数付きコンストラクタを定義するのが不自然な物はclassにする事を検討する。
>>325 警告レベル4でやってます。3にしたら出ませんでした。4がデフォルトみたいなので。。
構造体というのがWin32のWINDOWPLACEMENTなんですが、いまいろいろ
試していて、[StructLayout(LayoutKind.Sequential)]属性が必要らしいので
付けたら、警告が出なくなりました。なぜでしょうか?
とりあえずこれでおkにしようと思います。
327 :
デフォルトの名無しさん :2005/06/13(月) 19:48:38
>>322 fs.Close();の前に
fs.Flush();してみればどう?
昔おなじような現象で4KB(?)ずつファイルに書き出してたみたいだから、
Flushですぐ書き出すようにしたらうまくいったよ。
>>326 > [StructLayout(LayoutKind.Sequential)]属性が必要
structはデフォルトでLayoutKind.Sequentialなので、それだけなら属性宣言は必要なかったりする。
CharSetとかが必要な場合は書かなきゃなんないけど。
しかし
>>325 の言ってるようにpublicフィールドには出ない警告のはずなんだが……?
型がinternalというオチでは?
DLLの拡張子(".dll")を返すようなプロパティなかったっけ? Environmentあたり探したけどなかった。
DLLの拡張子は.dllだろうそりゃ。
いや、見かけた気がしたんだよ。 気のせいか・・・
>>321 「大量」ってかいてあるからクォータかけてるとか
>>331 Linuxにも移植されてると聞くけどそんときは.soなんじゃないの?しらんけど。
SPIファイルも中身はDLLだが、拡張子がDLLじゃないぞ。
>>334 それは論点が違う。そいつに必要なのはIsDllとかIsAssemblyとかだ。
336 :
322 :2005/06/14(火) 09:55:15
>>327 有難うございます。
DateTime.Nowでも15〜16ms程度の精度はあるようなので、
処理時刻で名前がかぶるのはおかしいと思ったんですが、
バッファの関係だったんですね。
有難うございました。
>>330 System.IO.Path.GetExtension?
338 :
デフォルトの名無しさん :2005/06/14(火) 17:13:06
MySql + VS2003でC#を使って開発してるのですが、odbcDataAdapterで困ったことが起こりました odbcDataAdapterの構成ウィザードを使用してSQLを生成しているのですが select a,b,c From test where b = ? (aが主キーでbは文字項目) のようなSQLを書いて作成しようとすると完了する前にエラーがでてVS2003が落ちてしまいます MySqlとMyODBCの設定はほとんど触っていないので、そちらが原因の可能性もあるのですが・・・ 誰かわかる人はいませんか?
340 :
デフォルトの名無しさん :2005/06/14(火) 17:37:43
>>339 ありがとう
試してみたけどこれだとウィザード使えないみたいですね
どうにか解決できないものですかね
ウィザードを使用して開発できればodbcかどうかは気にしないんですけど・・・
.manifestファイルを作るプログラムを作ろうと思って、以下のような テンプレートを読み込んで、必要なところを書きかえて保存するような プログラムを書いているのですが、DOMがうまく使えません。 まずdocumentElementを取得して、documentElement.SelectSingleNode(@"child::assemblyIdentity")で XmlNodeを取得しようとしたのですが、取得できずにnullが帰ってきます。 XPathが間違ってますか? ちなみにdocumentElement.SelectNodes(@"child::*")を調べるとちゃんと "assemblyIdentity"のXmlNodeが入っています。 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity version="0.1.0.0" processorArchitecture="X86" name="xx.xx.xx" type="win32" /> 以下略
SingleNodesって矛盾したのは何だー!
w
質問失礼します。 window formのスクロールバーのBackColorを変えるには どのような継承コードを書けばいいのでしょうか ご教授お願いします
二つのファイルが同じファイルかどうか比較したいのですが、 比較するファイルが大量にあるので、比較部が遅くて困っています。 ↓の高速化の手法を教えてください。 bool Different = false; Trace.Assert(fs.CanRead); using(IO.FileStream fs2 = new IO.FileStream(LastPathFile, IO.FileMode.Open, IO.FileAccess.Read)) { IO.BufferedStream bufstream1 = new IO.BufferedStream(fs); IO.BufferedStream bufstream2 = new IO.BufferedStream(fs2); for(bool fileend = false; !Different && !fileend; /* no step. */) { int i1 = bufstream1.ReadByte(); int i2 = bufstream2.ReadByte(); Different = i1 != i2; fileend = i1 == -1; } fs2.Close(); }
>>347 4096バイトずつ読み込んで比較しろ。
そんなに高速化したいなら最初にファイルのサイズ比較するとか
350 :
347 :2005/06/15(水) 17:46:19
>>348 ↓のようにしてみました。
bool Different1 = false;
#region Different1 = LastPathFile の内容と FilePath の内容が異なる;
Trace.Assert(fs.CanRead);
using(IO.FileStream fs2 = new IO.FileStream(LastPathFile, IO.FileMode.Open, IO.FileAccess.Read))
{
IO.BufferedStream bufstream1 = new IO.BufferedStream(fs);
IO.BufferedStream bufstream2 = new IO.BufferedStream(fs2);
const int bufsize = 4096;
byte[] buf1 = new byte[bufsize];
byte[] buf2 = new byte[bufsize];
bool fileend = false;
for(int readsize, offset = 0;
!Different1 && !fileend;
fileend = readsize < bufsize)
{
int readsize1 = bufstream1.Read(buf1, offset, bufsize);
int readsize2 = bufstream2.Read(buf2, offset, bufsize);
(切断)
351 :
347 :2005/06/15(水) 17:46:34
if(readsize1 != readsize2)
{
Different1 = true;
break;
}
readsize = readsize1;
for(int i = 0;
!Different1 && i < readsize ;
i++)
{
Different1 = buf1[i] != buf2[i];
}
}
fs2.Close();
}
#endregion
で、こういう結果が得られました。
New : 919531250[ticks] / 同じファイル
Old : 1227812500[ticks] / 同じファイル
>>349 thx. でも、最初にやってあります。
352 :
デフォルトの名無しさん :2005/06/15(水) 17:47:45
DOSのFCを使え。
>>347 1) ブロック読みするんならBufferedStreamである必要はない。
バッファリングする分余計なコピーが発生して損なだけ。
2) バッファサイズは4096じゃなくて8192にしてみ。
3) 最後の手段としては、unsafeで明示的なポインタアクセスをすることで
配列境界チェックを避ける。
こんなところかな。それと、簡単なコードなんだから、等価なCのコード
と比較してどの程度遅いのか確認するのも良かろう。それ以上は
速くなりっこ無いんだから。
32bit比較しろ。4倍位速くなるかも。 てか、byte配列比較のよさげなメソッドってどこかにある?
>>354 アラインメントだのバウンダリだのを考えると、どのみちunsafeな
コードにはなるわなあ。
32bit比較と言うと、BinaryReaderでReadInt32?
2 つのファイルの MD5 ハッシュを作成して、それを比較というのは どうだろうか?
あ? いや、MD5 をキャッシュしておけば速くなるかも
MD5が同じ場合、結局全部比較することになるから。
しかし数十のファイルを相互比較するならチェックサムを使うのは有効だろう。MD5じゃなくて単純に足していくだけでも。 初めて比較するときについでにチェックサムを残しておいて。
362 :
347 :2005/06/15(水) 22:50:20
BinaryReaderを使うと、EOF到達の告知が例外で行われるので最初のものよりも遅くなってしまいました。 IO.BinaryReader br1 = new IO.BinaryReader(fs1); IO.BinaryReader br2 = new IO.BinaryReader(fs2); while(!Different) { long l1, l2; bool fileend = false; try { l1 = br1.ReadInt64(); } catch(IO.EndOfStreamException) { fileend = true; l1 = 0; } try { l2 = br2.ReadInt64(); } catch(IO.EndOfStreamException) { Different = !fileend; break; } Different = fileend || l1 != l2; }
363 :
347 :2005/06/15(水) 22:54:04
unsafe コードは API呼び出しのときしか使ったこと無いので勉強中です。 チェックサムは、参考にさせてもらおうと思います。
FCコマンド WinDiff
>>362 おいおいなんでBinaryReaderを使うんだよ。
BufferedStreamである必要が無いと言っただけ。
普通にFileStreamでいいだろ。
と思ったが、32bit整数で比較しろと言われたからそうしたワケね。
367 :
デフォルトの名無しさん :2005/06/16(木) 12:53:08
こんなの自分で作らずにFC使えって。
CSV形式のファイルから検索条件をかけて特定列だけを 抽出したいのですがどのようにすればよろしいでしょうか?
370 :
347 :2005/06/16(木) 14:31:26
だいたいこんなんなりました。ここらへんでストップしておこうと思います。 public static bool DifferentFile(IO.FileStream fs1, IO.FileStream fs2) { bool Different = false; const int bufsize = 8192; byte[] buf1 = new byte[bufsize]; byte[] buf2 = new byte[bufsize]; int readsize, offset = 0; for(bool fileend = false; !Different && !fileend; fileend = readsize < bufsize) { readsize = fs1.Read(buf1, offset, bufsize); int readsize2 = fs2.Read(buf2, offset, bufsize); Different = (readsize != readsize2) || LibC.memcmp(readsize, buf1, buf2) != 0; } return Different; }
371 :
347 :2005/06/16(木) 14:31:49
sealed class LibC { public static int memcmp(int size, byte[] buf1, byte[] buf2) { if(size == 0) return 0; unsafe { byte* b1, b2; fixed(byte* bt1 = &buf1[0], bt2 = &buf2[0]) { b1 = bt1; b2 = bt2; } if(b1 == b2) return 0; #warning ■■うろおぼえ■ C# だと sizeof (long) == 64bits だよね? const int BlockSize = 8;
372 :
347 :2005/06/16(木) 14:32:08
if(size > BlockSize && ((long)b1 & (BlockSize - 1)) == 0 && ((long)b2 & (BlockSize - 1)) == 0){ long* a1 = (long*)b1, a2 = (long*)b2; for(/* no init */; size > BlockSize; size -= BlockSize) if(*a1 != *a2) break; a1++; a2++; } b1 = (byte*)a1; b2 = (byte*)a2; } for(/* no init */; size > 0; size--){ if(*b1 != *b2) return *b1 - *b2; b1++; b2++; } return 0; } } }
373 :
347 :2005/06/16(木) 14:41:12
つたないコードを突っついてくれた人、ありがとう。
ちなみにどれぐらい速くなったの?
375 :
347 :2005/06/16(木) 17:38:03
えーと、白状すると 350 ではあのメソッドが最初(347)のものに比べて約3/4の実行時間になっていますが、 あのスコアをたたき出したのは最初の一回だけで、あの書き込み以降、最初のものとほとんど変わらない 実行時間になってしまってました。理由はよくわかりません。 その反省から、今回はループで10回回して平均をとると次の結果になりました。 Old : 387126660.8[ticks] New : 322343507.2[ticks] 時間にしてだいたい8割。ただ、最初のものはタスクマネージャで見ると CPU使用率がずっと100%だったのに比べて、370の方はずっと60%ぐらいをうろうろしてました。 CPUにやさしいといえるのかな? カーネル時間は両方ともずっと25%ぐらい?でした。あと、デバッグビルドで計測しました。 CPU: P4-1.4GHz RAM: 1GB HDD-I/F: USB2 OS: Windows XP2 Pro SP2 常駐: Cotton、Winamp5、タスクマネージャ
376 :
347 :2005/06/16(木) 17:42:37
バッファサイズに関しては、4096,8192,16384,65535 バイトと試しましたけどどれもほとんど同じという結果になりました。
そのLibC#memcmp()だけど、 ポインタアクセスしてる区間はまるごとfixed{ }で囲んでおかないと危険だよ。
>>375 =347
何をどうしたところで大きな高速化は望めないわけで、
プログラムの動作を変更して、比較する回数を減らすような
方法を考えるのが本筋。
例えば、あるファイル群Aにあるファイルで内容が同じものを探すのに
foreach (string s in A)
{
foreach (string t in A)
{
if (s != t && compare_file(s, t)) ... ; // 見つかった
}
}
なんてやってるなら基本的に大間違いしているわけで。
windowアプリを作成しています 外部exeをフォーム内で起動させ稼動させるにはどうすればよろしいでしょうか? 現時点では外部exeを起動できるとこまで出来ています
フォーム内で起動させ稼働させるって、一体どういうのを想定してるのさ。
.NETじゃなくてもそんなの不可能
382 :
379 :2005/06/16(木) 23:17:51
>>380 エミュレーターのようなアプリを想定しています。
>>381 そうですか。ありがとうございます
OpenJaneの某派生にそういった機能があるぞ スレビューで秀丸を走らせたり出来る
>>379 VirtualPC見たいなやつを想定しているのか?
385 :
379 :2005/06/16(木) 23:29:14
>>383 ありがとうございます。調べてみます
>>384 はい、そのような感じでexeを指定してForm内のWindowで起動/操作といった感じです。
出来たらぜひください
C#でコンポーネント(ボタンやラベルなど)をドラッグした時に、デザイン時のように 元のコンポーネントの枠をカーソルに合わせて表示するにはどうすればいいんでしょうか? どなたか知っていたらご教授お願いしますm(_ _)m
ちょっとした疑問なんですけど、C#にはガベージコレクタが付いてますよね。 どうしてIDisposableインターフェースが必要なのかよくわかりません。 newして放っておけば、スコープが切れた所でいつか勝手にガベージコレクト されて行くような気がするんですが。 それとも、一つの関数の中で巨大なオブジェクトを一時的に作り、開放して まだスコープが外れないうちに別のメモリが必要になる場合に備えての事なん でしょうか?
>>388 ガベージコレクタにまかせっきりだとまずかったり枯渇したりしかねない
ソケットやデータベースの接続、GDIオブジェクトなどの
リソースを意識的に開放するのに使う。
>>388 C:\superfree.txt というファイルがあるとして
private void certainMethod(){
FileStream f = new FileStream(@"c:\superfree.txt", FileMode.Open, FileAccess.ReadWrite, FileShare.None);
}
こうすると、certainMethodを呼び出したら、しばらくC:\superfree.txtにアクセスできなくなる。
>>389 レスありがとうございます。
という事は、IDisposableインターフェースはC#では文法的に汚い部分
ではあるけれど、現実面を見据えて(有限なリソース)、必要悪という
事で理解しました。
自作クラスにはできるだけ付けるようにします。
>>390 あ、こちらにもレスが。感謝感謝。
そうですね。排他アクセスが解かれるのがいつなのか不明、というのでは
困りますからね。よく理解できました。
GCが管理するのは「Managedリソース」のみ。 UnmanagedリソースはUnmanaged。
>>393 あ、はい、LockBits/UnlockBitsなどは意識的に気を付けています。
というか、LockBitsしたGraphicsオブジェクトに描画操作をしても、無視
されるって事を最近知りました。
あっ、、、そうか、、、マネージメモリが一時的にアンマネージ化されている のに、マネージメモリのように扱ったら、後からガベージコレクトする時に 具合が悪いんだ。
>>396 んーそうですか。まだどこか思い違いをしているのかな・・・・
GDI+でいろいろ遊んでいるんですが、LockBitsしたGraphics
オブジェクトへの描画メソッドは完全に無視されるんですよ。
その理由を考えていたんですが・・・・
>>397 Graphics は単純な GDI+ のラッパーなわけで、
そもそもマネージドではない。
LockBits した Bitmap に Graphics 経由で描画できないのは、
単に GDI+ の仕様。
>>398 そうなんですか。C++などでGDI+を使うと、LockBitsでReadWriteもしくは
Writeになっていれば、Lockした状態でも書けるんですけどね。
多分C#のラッパーGraphicsがLock中だとフラグを立てて、わざと無視して
いるんじゃないかと思います。C++とC#で動作が異なるので気になっていました。
>>388 >どうしてIDisposableインターフェースが必要なのかよくわかりません。
>newして放っておけば、スコープが切れた所でいつか勝手にガベージコレクト
されて行くような気がするんですが。
そのいつかがいつ発生するかが問題。
クラスのコンストラクタでファイルから適当な値を読み込み(無ければ初期値)、
読み込んだデータに何らかの操作をし、
デストラクタでファイルに保存
というクラスを書いた場合、デストラクタが呼ばれるのは GC が発生したときらしい。
IDisposable を使わずにこのクラスを new して解放という動作を繰り返した場合、
1 初期値
2 初期値
3 初期値
1 書き込み
2 書き込み
4 初期値
3 書き込み
:
:
といった感じの動作になる。
しまった。 4 初期値 じゃなくて、 4 読み込み だった。
cscでコンパイルしたexeを他マシンに持っていって実行すると「署名がありません」とかいわれませんか? コンパイルする側も実行する側もWinXP SP2です。 ただ単に..NET Frameworkのディレクトリにあったcscを/t:winexeで使ってます。 解決方法など知っている方よろしくお願いします
403 :
デフォルトの名無しさん :2005/06/18(土) 09:46:08
OSの設定でフェード効果などのアニメーションを有効にしているかどうかを 知るためにはどうしたらよいでしょうか
>>404 C#が原因ではないんですね。
自分なりに調べていた内容だと、署名に関するものかと思っていたので、証明されてる機関に申請しないといけないのかと考えていました。
ありがとうございました。
Form上に配置しているコントロール(ボタンなど) を画像として保存したいのですが、どうすればいいでしょうか?
すいません。 C#でファイルロックはどうしたら良いのでしょうか?
FileShare
そうか、StreamWriterやらStreamReaderを行き成り使わないで、 FileStreamから作ればいいのか。
今Format8bppIndexed形式のBitmapデータですごく悩んでいます。 パレットに256色のColorをセットする所まではわかるのですが、例えば これをグレースケールにしたい場合、Flagsの解釈を0x00000002にする 必要があります。 ところが、なぜかわかりませんが、ColorPalette.Flagsはgetしかありません。 どうやったらグレースケールにパレットをセットできるのでしょうか?
Flagsなど無視して素直に0,0,0から255,255,255までの色で埋める。どうせ灰色はR=G=Bなんだし。
激しく池沼と罵倒されるのを承知で質問します。 コンソールアプリですが、Mainからbitmapを引数とするvoidメソッドが呼べません。 コンパイラ0120エラーなんですが、どのような記述を追加or削除する必要がありますかね?
>>414 激しく池沼
エラーメッセージに書かれてるとおりだが。
オブジェクト指向の基礎から教えるにはここは向かないぞ。
C#には、VB.NETのような引数付きプロパティはありませんが、似たような ものを実現するには、やはりメンバ関数によるしかないのでしょうか?
>>419 まあそうだな。あとは用途が幾らか異なるがインデクサ。
しかし必要と思うことはあんまり無いので別にいいや。
ガイドラインでも1つより多くは使用するなって書いてるし。
ソケットサーバー作るのめんどくせぇー 同期ソケットをマルチスレッドで使いたいんだよ プール?使うかボケ 結局クラス作らなきゃいけねーしあほくさ
DataTableのキー列のDataColumnのAutoIncrementをtrueにして、 NewRow()で作ったDataRowをフォームに表示して、詳細を入力させてから [OK]でDataTable.Rows.Add(DataRow)しているのですが、 たとえば今回新規のキーが5で、フォームで[キャンセル]されると、 次に新規作成するとき6が出てきます。 作ったDataRowを結局使わなかったときに、次のNewRow()でまた5が 出てきてほしいのですが、どうにかできませんか?
どうにもできないし気にする必要もない。 いっそ非表示にしてても良いくらいだ。
>>419 ま、コレクションを返すプロパティで代用くらいかな。
>>424 代用って言うか、そもそも C# で index 付きプロパティがサポートされてない理由って、
コレクションのプロパティで実現すべきだと判断されたからじゃないの?
C#でアンマネージなデータを扱うクラスを書いたのですが、メンバ関数の コールがとても遅い気がするのです。C++ではメンバ関数の呼び出しが 高速だったので、とても気になります。
気にするな。
Windowsフォームで、Javaで言うGridLayoutを簡単に実装する方法ってありますか? カレンダーみたいに方眼状にパネルを貼り付けるアプリケーションを作りたいのですが、レイアウトの所は自分で実装しないと駄目ですか?
.net2.0にはなんかあった気がする。 使ってないけど。
コンソールアプリで、参照をつかって、Formsを出してるんだけど this.TopMostがしたいんだけどコンソールアプリだから、thisがないんだけど、どうしたらいいかな?
そのFormのTopMostを呼べば良いんじゃないかな?
文字列の比較で ==比較演算子 よりも Equalsメソッド を使う利点って何かある? VB.NETだったらソースの頭に Option Compare Text って入れると == は大文字小文字区別しないけど Equals だと区別するっつー事で 異なる動きするから気をつけないといけないみたいだけど C#はこの問題は無いみたいだし、Equalsメソッドでの比較はただ見づらいだけだと思うんだけど。
利点も何もop_equalityはEqualsを呼んでるだけだから差はない。 強いて言うならEqualsはObject型のStringインスタンスでも文字列の比較になる点とか。
==は比較される側がnullでもぬるぽで落ちない。 C#はぬるぽじゃないけどついついぬるぽと言ってしまう
ぬ る り
object a = "A".ToLower(); object b = "a"; a == b はtrueかfalseか?
>>438 false
(string)a == (string)b はtrueか
441 :
デフォルトの名無しさん :2005/06/22(水) 23:46:01
SQLサーバーからdatasetにごそっと読み込んだ後、 任意のRowを書き換えたいときってどうしたらいいですか? dataSet1.Tables["hoge"].Rows[i] = row; にするとdataSet1.Tables["hoge"].Rows[i]は読み取り専用って起こられます。 Rows[i]を削除して、iにrowをInsertするしか手はないんでしょうか?
>>441 そうじゃないとRowStateの管理がやってられないからな。
443 :
441 :2005/06/23(木) 00:21:45
ありがとうございます。 RowStateとやとやらは触ったことがないのですが、 扱うときは心してかかります。 ありがとうございました。
コンソールからフォームを開いたあと、 コンソールのウィンドウを閉じて、 フォーム側で全制御を行いたいのですが、 コンソールのウィンドウってどうやって閉じればいいんでしょうか?
DataGridでColumnの境界線をダブルクリックすると丁度いい長さに自動調整 してくれますが、これをwidthChange系のイベントで取得することは可能なのでしょうか? ColumnStyleクラスでWidthが変化したときのイベントを拾って処理をしたいのですが どうしたらいいのかな
普通にDataGridColumnSyleにWidthChangedイベントがあるようだが。
と思ったけど幅の自動調整時には発生しないっぽい。 DataGridView待ち。
.┌━┐ ┌━┐ ┃┌╋──╋┐┃ └╋┘ └╋┘ ┃ ・ ・ ┃ ┌━━┐ ●━╋┐ ┌╂━━━━╂┐ ┃ └━┷┴━━╂┘ └╋━┘ 同じスレにはコピペ ┌╋┐ ┌╋┐ できるけど、違う ┃└╋╋━━╋╋┘┃ スレにはコピペでき ┃ ┃┃ ┃┃ ┃ ない不思議コピペ ┃ ┃┃ ┃┃ ┃ └━┘┘ └└━┘ てすと
>>448 他のスレに貼れないかどうか試して〜〜〜
という心理を狙った荒らし?
450 :
デフォルトの名無しさん :2005/06/23(木) 18:58:24
変数のスコープのルールが厳しすぎる・・・orz 隠蔽を意図的にやろうとしてもコンパイル時にエラーで叱られる。 というか、バグじゃないかこれ? for文中でfor (int i = として宣言した i は、for文のスコープが切れると 消滅するが、その後で int i = としようとすると、CS0136エラー発生。
いや当然だし。 forの外のスコープから見ればiを2つ宣言してるじゃん。
C#って、名前空間が同じでも、違うファイルに納められて分割コンパイルされると、 その間のモジュールコールがすごく遅くならねえ? 同一ファイルにあるアセンブリは一緒にJITによってネイティブに落とされるが、ファイル が違うと、JITはその都度ネイティブを発生するのかねえ。 まだ検証中の段階だけど、すごくよく呼び出される関数は、同一ファイルに入れて しまった方がずっとコールが速いようだ。
二次元配列の初期化用データをコピペで貼り付けると、中括弧 { が 二重になっていると、括弧毎に自動的にインデントされてしまい、前に どんどん空白が入るんですけど、何とかなりませんか? ↓こんな具合 int[,] i = new int [5,5] { {1,1,1,1,1}, {2,2,2,2,2}, {3,3,3,3,3}, {4,4,4,4,4}, {5,5,5,5,5}};
あー俺もVisual Studioの配列初期化のインデントだけはいただけんな。 糞だよあれは。
>>454 そうなんですか・・・・・
そしたら、コピー前に // でも入れてコピペして、後から // を取る、とかの
エディタを騙す方法で行くしかないですね。ありがとうこざいました。
>>450 そんなくだらないことに悩んでる暇があったら変数名変えろ。
>>453 それはC#の話ではないんではないか?
459 :
デフォルトの名無しさん :2005/06/24(金) 02:24:17
Visual Studioはフォーマットのスタイルもカスタマイズできんし リファクタ機能もないし 「定義へ移動」するとバカチョンで候補がいっぱい出てくるし どうなっとるんじゃ。
リファクタはVS2005で追加されるんじゃなかったっけ?
C#1.1使ってていろいろと不満が出てきたから、これらがC#2.0で解消されると したら、素晴らしいね。
>>454 貼り付け直後にUndoするといいかもです。
左端に//書いた行をコピペするとインデント位置まで寄ってしまう現象は
それで回避してます。
FormのコンストラクタとLoadイベントはどう使い分けるべきでしょうか。 VB6のときは、一度閉じたフォームのインスタンスをまたShowしたり、 コンストラクタでコントロールにアクセスすると勝手にロードされるとか いろいろあったので使い分けの基準があったのですが、Windows Formsだと どうせ閉じるたびにインスタンス作成からやり直しなので、開くたびに コンストラクタもLoadも通るのだからどっちでも同じな気がします。 hWndが必要な処理だけはLoad、とかそんな感じでしょうか?
465 :
デフォルトの名無しさん :2005/06/24(金) 16:05:44
eventに登録済みのハンドラを列挙したり全削除したり +=でハンドラを加えるのではなく単に現在のハンドラと置き換える方法はありますか?
>>467 EventDescripterはAddEventHandler(), RemoveEventHandler()というメソッドを持っていますが
イベントの保持するマルチキャストデリゲートのコレクションは公開していないし、
それらを一挙に消したり直接置き換えたりすることはできないようですね。
私のような要求は特に珍しくも無いと思うのですが、一般に皆さんはどうやっているのでしょうか?
>467をちょいと考えれば要求は満たせるはずだが。
そうでしたか。 結局、本当にやりたいのは追加型ではなく置き換え型でイベントハンドラを操作したかっただけなので、 イベントハンドラ群を明示的に他の場所に保存しておき、 -=で削除してから+=で追加という愚直な方法でとりあえず対応しました。
>>465 文字通りローミングするかしないかで使い分ける。
一般的にはユーザー固有のものをMachine Independentかどうかで判断する。
例えば、「前終了したWindowの位置」なんて情報はローミングするとダメポ。
こういう情報を保存して次に起動されたときにその位置に復元するってのがよくある使い方。
でも、あるMachineで1600*1200の解像度を持っていて、終了時に
1400, 1024の位置で終了して、次もその位置で表示するとする。
これが他のMachineで使われたとして、そのMachineの画面全体の解像度が
1024*768だったら画面外に表示してしまうだろう?
逆の例はIMEのユーザー辞書とか。これはどのMachineで使用されてもOKなので
ローミングされるべき。
ただ、サイズの関係でローミングしないという判断をすることもある。
ローミングは(一般的には)ネットを通じて移動するので重いっちゃ重いから。
ただ、運用で解決できるのでこれはあまり考慮しなくてもよい。
っていうかこういう詳しい話はDesigned for WindowsXPとか嫁。
>>464 どっちでもいい場合が多いけど、一般的にはコンストラクタで
重かったり例外出すようなことはするな。コンストラクタはシンプルなほうがいい。
っていうか、一般的に処理は遅らせられるだけ遅らせるべき。
表示直前まで必要のないことはLoad、作った瞬間から必要なものはコンストラクタ
でやる。
473 :
459 :2005/06/24(金) 21:41:47
>>462 付きますか。しばらくeclipseでjavaやってたのでイライラしますわ。
はやく正式版でないかな。
>>466 イベントハンドラのに登録するメソッドでデリゲートを呼び出すようにして、
イベントを置き換えたいときはそのデリゲートをいじればいい
例えば
MouseEventHandler onMouseDown;
public MyForm() {
...
button.MouseDown += new MouseEventHandler(OnMouseDown);
}
private void OnMouseDown(object sender, MouseEventArgs e) {
onMouseDown(sender, e);
}
みたいにしてbutton.MouseDownを置き換える代わりにonMouseDownの中身を変えればいい
タブコントロールの背景色って変更できないんでしょうか?(TabPageではなく) タブがない部分の後ろに見えるタブコントロールを透過したいのですが何か方法はありませんか?
>>474 イベントハンドラの候補がNコあったりするとそれではつらいのでは
ないでしょうか。
>>475 無理。
だけど自分で塗ることは出来る。
479 :
475 :2005/06/25(土) 23:41:44
>>477 無理ですか。
自分で塗るというのはどうすればいいんでしょうか?
TabControlを継承した自作TabControlクラスのOnPaintをオーバーライドしてみましたが、
OnPaintイベント自体呼ばれない様子・・・
ちなみに現在は、タブのない部分にフォームを親に持つパネルを貼り付けて、
パネルを透過させることでタブコントロールの背景が見えないようにしています。
DrawMode DrawItem
C#には、C/C++で言う所のtypedefが無いようです。 例えば、あるクラスの配列を新しい型として定義したい時は、どうすれば いいのでしょうか?
using で typedef に近いことは出来るけれども配列は無理かも
string[]でもっているものをArrayListに移したいとき (ArrayList.RemoveAt(int)が使いたい) ってどう書くのがスマートですか? ループまわして一個ずつ読み込んでってのがきれいじゃないので…
>>484 string[] strArray = {"123", "456", "789"};
ArrayList lstString = new ArrayList(strArray);
lstString.RemoveAt(0);
foreach (string str in lstString)
{
Console.WriteLine(str);
}
>>481 その配列をメンバーに含んだクラスを定義するのじゃ駄目なの?
487 :
484 :2005/06/26(日) 15:50:36
>>485 さん
コンストラクタでひっぱれたんですね。
ありがとうございました。
逆に「あるクラスの配列を新しい型として定義したい時」の メリットって何だろ。それを書けば代替策のレスがつくかもしれない ですね
>>488 いえ、単に読みやすさを考えての事だったんです。
それと、C/C++の癖が抜けて無くて。それだけです。
インターフェースとabstractクラスの 違いがわかならくてインターフェースの場合 複数継承できるってぐらいしか思いつかないだけど どう使い分けるの?
>>490 abstract class は実装を持てる。
interface は文字通りインターフェースのみを持てる。
なので、全ての派生クラスに共通する何らかの処理を基底クラスでやりたかったら
abstract class を使わないと駄目。
そういう必要がなければ interface を使う。
ひとつのクラスは複数のinterfaceを実装できるが、 abstractなものを含め、基底クラスはひとつしか持てない。 ライブラリやコンポーネントなど他人が書いたものを 利用するときにinterfaceは役に立つ。
まあそういった技術的なものだけでなくて インターフェイスとは何かとか抽象化とは何かを考えてみるのもいいかもな。
未だにまともなドッキングコントロールはないの? フリーソフトでシェアウェア使うのもなんだし・・・
あるし。
まともというのの定義が分からないと答えようもないな。
まともは、IDEとほぼ同じ挙動・軽さでかつ
フォームデザイナーで編集可能なものと考えてくれ。
>>495 Magic Docking(+DockingManagerExtender)以外なら教えてくれ。
>>498 前に使ったことあるんですが、何かが気に入らなくてやめたような・・・
思い出せないので、また使ってみます。
ありがとうございました。
漏れは Office XP 以降で付いたスマートタグみたいな奴が欲しいな
501 :
豆腐 :2005/06/28(火) 17:23:12
質問です。 RS232Cでつないだ機器から出力されるデータ(文字列)を保存したいと思っています。 こういった場合、逐次ファイル一行づつ書き込みを行えばいいのか、テキストボックスなどに 格納しておいて出力が終了されてからファイルに書き込めばいいのかわかりません。 後者のほうは、メモリを食いそうです。前者のほうは、ファイルの書き込みがおいつけるのか? という疑問があります。 こういった場合、一般的には、どのようにしてファイルに保存するのでしょうか? ご教授をお願いします。よろしくお願いします。
502 :
デフォルトの名無しさん :2005/06/28(火) 17:43:41
>>501 ファイルの書き込みストリーミングでは、書き込みメソッド呼んでも、ある程度は自動的にメモリにバッファされて、まとめてHDDに書き込まれる仕組みだと思う。
ストリーミングをクローズする処理で確実に全部書き込まれるみたいにね。このバイト値を大きく設定すれば、自動的に無駄なHDDアクセスはコントロールできるような気もする。
少なくとも、自分はクローズしていない時点で、ファイル開いてみたら、書き込まれているはずのテキストが書き込まれていなかったというバグを作った。
多分HDDへの書き込みが追いつかないという問題は発生しないと思うけど、いずれにせよ、ずっとガアガアHDDにアクセスしてるのはパフォーマンス的にスマートな方法じゃないのは確かだと思う。
最初に書いたWriteメソッドのバッファがうまく使えれば使うか、配列もしくは、テキストボックスで効率よいバッファリングができるのなら、その方向で考えたらいいんじゃないかな?
RS232Cの転送速度とHDDの転送速度くらいは把握してるんだな? いずれにせよ真っ当なOSならバッファを使って読み書きするから大した問題ではないがな。 あとテキストボックスって何さ。なんで文字列の一時保存にわざわざコントロール? stringなりStringBuilderなりに溜めていきゃいい話。 ついでに表示もしときたいってんならわからんでもないけど。
schtasksを利用して、タスクを追加しようと思っているのですが、 schtasksコマンドを実行すると、 現在ログオンしているユーザーのパスワードを求められます。 以下のコードに何を追加すればパスワードも与えられるんでしょうか? p = new Process() ; p.StartInfo.FileName = Environment.GetEnvironmentVariable("ComSpec") ; p.StartInfo.CreateNoWindow = false ; p.StartInfo.UseShellExecute = false ; p.StartInfo.RedirectStandardInput = true ; p.StartInfo.RedirectStandardOutput = true ; p.StartInfo.Arguments = arg; p.Start() ; p.WaitForExit() ;
権限
WMIのWin32_ScheduledJobでも使っておけという話では。
507 :
デフォルトの名無しさん :2005/06/29(水) 07:36:43
class A { public class Item{} public int this[int i] { get{ return 0; } } // ^^^^ error CS0102:クラス 'A' に 'Item' の定義が既に含まれています。 } なぜこのようなエラーが出るのか、どなたか解説していただけないでしょうか。
>>507 > public int this[int i]
これは内部でプロパティ 'Item' として作られるので、
> public class Item
この内部クラスと名前がぶつかる。
>>508 ああ、それをすっかり忘れていました!
サンクス。
ちなみに回避したい場合はインデクサにSystem.Runtime.CompilerServices.IndexerNameAttribute属性を適用する。
C#に限った話ではないが、 コードレビューで文字列のある桁数毎に"-"を挿入する処理があったのだが、その"-"を HAIHUN って定数きってそれを使うように作ってあった。 こういう場合って普通定数きるもん?ハイフンに対してハイフンって定数きってもしょうがない気がするのだが。 何故定数名がローマ字なのかも気になるがそこは無視してくれ。
Separatorなら良かったかもな。 美しく書くなら、区切り文字を受け取るオーバーロード作ってそれに処理を任す。
>>512 そりゃ単なる、よくある糞コードです。
そのコードを書いた人をののしってくるといいでしょう。
定数ってのはそれ自体に意味が無いものに分かりやすい名前をつけてソースを理解しやすくしたり、 後に変更が入った時に一箇所変えるだけで全部に対応できるようにする為の物。 512の例だったらハイフンにハイフンって名前を付けてるので意味が無い。 やるなら513があげた様にSeparatorとか"-"がどういう意味かを表す名前にするか、直書きするか。 いつか"-"じゃなくて別の値に変更になるかもとかが無いんだったら直書きで良いんでないの。
516 :
デフォルトの名無しさん :2005/06/29(水) 20:09:37
インデクサにstaticがつけられないのは何か理由があるんでしょうか?(ないわけがないと思いますが
new Array[x] ってやられると「インデクサ読み込み」と「配列生成」の区別が付かなかったとか、きっとそんな理由
つか静的インデクサって想像がつかないんだが、どんなのに使おうっての?
静的インデクサの話は、なぜか定期的に出てくるよな。
すみません。VB厨なんですが、 Dim client As New TcpClient(server, port) Dim message As String = Chr(&H2) & "hoge" & Chr(&H3) Dim data As [Byte]() = System.Text.Encoding.ASCII.GetBytes(message) とmessageを送りたいんですが、 C#だとどのように書いたらよろしいでしょうか? ヒントでも結構ですので教えていただけますか?
つ C# 言語の仕様 2.4.4.5 文字列リテラル つ C# プログラマーズ リファレンス string
TcpClient client = new TcpClient(server, port); string message = ????? byte[] data = System.Text.Encoding.ASCII.GetBytes(message);
>522-523 探してみます。ありがとうございます。
たとえばエクスプローラで、ファイル名の変更モードで ファイル名として無効な文字を含んだ文字列を貼り付けると、それだけ はじかれて張り付いたり、無効な文字のキーをタイプしても 無反応だったりするんですが、これをTextBoxでやるには どうしたらよいでしょう。
Key〜イベントがあるじゃん
527 :
521 :2005/06/30(木) 12:43:41
出来ました。Chr使わなくてもいいんですね。ありがとうございました。 TcpClient client = new TcpClient(server, port); string message = "\x02" + "hoge" + "\x03"; byte[] data = System.Text.Encoding.ASCII.GetBytes(message);
528 :
デフォルトの名無しさん :2005/06/30(木) 21:21:26
Windowsのシャットダウン時に確認ダイアログを出して なおかつ、キャンセルを押した場合、シャットダウンを中止するにはどうしたらよいでしょうか? 確認ダイアログまではWinProcオーバーライドしてできるのようなのですが シャットダウンを中止する方法がわからないのですが
>>528 Microsoft.Win32.SystemEventsクラスのSessionEndingイベントで通知をもらう。
SessionEndingEventArgsが渡ってくるので、Cancelプロパティをセット。
非常に初歩的な質問ですみません。 文字列を半角英字(アルファベット)で始まるかをチェックするために、 Char.IsLetter( input[0] ); を利用しようとした所、全角文字でもTrueが返ってきてしまいます。 (そういう仕様の様です) 私が望む事を実現するために、使える手段を探しています。 やはり、正規表現を使うしかないのでしょうか?
'a' <= input[i] <= 'z' && 'A' <= input[i] <= 'Z' だと動かんの?
Char.IsLetter(input[0]) && input[0] < 0xff とかではまずいのか
533 :
530 :2005/07/01(金) 11:29:10
両方、思いついていませんでしたorz なぜか、そういうメソッドを探すの一生懸命になってました。 視野が狭くなっていたんだなぁ、と勉強になりました。ありがとうございます。 ちなみに、531は&&ではなく、||ですよね?
>533 ||だと全ての文字がヒットするだろw
535 :
534 :2005/07/01(金) 13:00:49
'a' <= input[i] && input[i] <= 'Z' と見間違えたorz 吊ってきます
'a' <= input[i] <= 'z' C#においてこの書き方って有効なのか?
C#において、「クラスAはクラスBからしか生成できない」ということを明示することは可能でしょうか? あと、クラスのメンバを現在のネームスペースの外からはアクセスできないようにすることはできますか?
>>537 クラスAのコンストラクタで引数を秘密の合言葉にして、
それをクラスBの中に仕込む。
あと、現在のネームスペースを別DLLにしてメンバをinternalにする。
539 :
531 :2005/07/01(金) 14:06:06
すまん
>>536 無効。「'a' <= input[i]」 の時点で bool になってドボン
>>537 クラスBをクラスAの内部クラスにするとか
enum Hoge{ One=1, Two=2,} ってあった場合に文字列の "One" から Hoge.One に変換する方法きぼん
enum#parse
EnumクラスもParseメソッドも先頭大文字だぜ。
int. って打てば IntelliSense が効くのに enum. じゃ反応せえへん enum って System.Enum へのエイリアスじゃないの
その理屈だとclassやstructでもインテリセンスがきくことになるな。
>>542 サンキュー
typeof(Hoge) ってしてから必死にメンバを探していたぜ
AppDomainにプログラム?をロードしたり 特定のAppDomain切り離して停止したり とかそういうことをやるには、ホストアプリケーションを書かなければ ならんのでしょうか?
別に書かなくても良いがあんまり旨味もないな。
549 :
537 :2005/07/02(土) 07:49:34
>>538 >>540 class AFactory {
public A CreateA() {return new A(m_key);}
static object key=new object();
public class A {
public A(object o) {
if(o!=Factory.key) throw ApplicationException();
}
}
}
という方法を思いつきました。なんか変態的な気がするのでやらないけど。
private class A にすりゃ鍵なんて要らないじゃん
DataRowクラスの実装が参考になるかも。
要するにコンストラクタをinternalにしてDLLにしろってことだな。
>>545 きいたほうが自然だとおもうんだけど
なんできかないの?
お前は本当に馬鹿だな
555 :
デフォルトの名無しさん :2005/07/02(土) 18:23:52
ASP.NETが閑散としてるっぽいのでここでお聞きしたいのですが、 勉強の為に有名なWebアプリのソースを見たいのですが、 BlogやWiliや掲示板でASP.NETの有名なのって無いでしょうか? Blogは.Textが見つかりましたが、うなぎスクリプトのC#版とか無いですか?・・・
Win32APIのSendMessage関数を使いたいのですが、定義は
LRESULT SendMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
とのことで、引数や返り値がC#でどの型にあたるか、HWNDとUINTしか分からず困っていました。
そこでGoogleでSendMessage C#で検索したところ、
http://support.microsoft.com/default.aspx?scid=kb;ja;812425 では
[DllImport("USER32.dll")]
static extern IntPtr SendMessage (IntPtr hWnd , int msg , IntPtr wp, IntPtr lp);
http://dobon.net/vb/dotnet/control/lvcolumnorder.html では
[DllImport("user32.dll", CharSet=CharSet.Auto)]
private static extern int SendMessage(IntPtr hWnd, int msg, int wParam, int [] lParam);
となっていました。
http://www.atmarkit.co.jp/fdotnet/dotnettips/024w32api/w32api.html によると UINT は uint (System.UInt32) と書いてあるし…
P/Invokeについての詳しい解説している本やサイトってないでしょうか。
>>556 どういう具合にネイティブ型にマップするか、については唯一の正解はない。
動けばいい、とも言えるし、目的によっても違う。
早い話がWin32だとint,long, pointerが全て32bit整数で、まあ符号あり無しの
違いはあるが、全てごっちゃにしてしまえるのも確かだ。
SendMessage()の例でいうと、wParamやlParamは色々な使い方をされる。
ただの整数、ハンドル、ポインタといったものが渡される可能性があって、
Win32ではそれらが全て32bit整数だから、ごっちゃにできるワケだ。
で、あんたのプログラムでただの整数を渡すような使い方しかしないのであれば、
wParamやlParamはたんにintとすればよいし、他のものを渡すのであれば、
IntPtrのほうが便利かもしれない。その辺は、単に利便性の問題。
MSDN。 まあ簡単に言えば、サイズさえ合えば何でも良い。 32bitプラットフォームなら、ポインタをInt32でやろうがUInt32でやろうがIntPtrでやろうがshort二つ並べようが、 はたまたclassインスタンスの参照を渡そうがref参照を渡そうが。 使いやすいものを使えばいい。 UINTは(Win32なら)unsigned INT32としてどっかのヘッダで定義されてるから、UInt32でやるのが自然だが別にInt32でやってもいいし。 が、まあプラットフォームの縛りから逃れるにはInt32やらUInt32やらInt16*2やらは避けた方が無難だ。 実際にはそうも言ってられないが。
>>557-558 >早い話がWin32だとint,long, pointerが全て32bit整数で、
>まあ簡単に言えば、サイズさえ合えば何でも良い。
ああ、なるほど、なんとなく分かった気がする。ありがとう
560 :
デフォルトの名無しさん :2005/07/02(土) 21:03:49
C#とVBでは、どっちが速いの?
今度は相手がVBか。そう言えばあんまり見かけないなこの2つを比較するの。 ていうか何の速さだよ。
System.Net名前空間のDnsクラスってMXレコード無理だっけ。 無理ならTCPやUDPを生で。TcpClient, UdpClient, Socket の各クラス。
DNSクラスだとAレコードだけだったと思います。 TCPやUDPで生でやることを技術的にはできるはずなんですが、 実際、接続してからどんなコマンドやらを送るのかがわからんのです。 つまりC#の話ではないんですが・・・もしも知っているからがいたらなぁってことです
>>566 激しくThanksです!!
いやぁUDPだったとは・・・
う〜・・・だけど具体的な通信内容がない(泣 パケットをモニタリングすればわかるかなぁ?
Perlキター
571 :
デフォルトの名無しさん :2005/07/03(日) 03:07:56
C++toC#なんてのないかなぁ
C#->Javaが欲しい
>>568 DNSメッセージをそのままやりとりするだけだが。
ネットワークではビッグエンディアンが普通である点に注意すれば問題ない。
566の、Qnameの解説が微妙に間違ってるけど。(文字長は1バイトで表現する)
ううう・・・
マジわからんわぁ〜、そのDNSメッセージとやらが分からぬのです(汗;
情けない。。。
あれっす、例えばメール送信の場合はTCPで接続して
HELO xxx.com
MAIL FROM:<
[email protected] >
RCPT TO:<
[email protected] >
DATA
TEST
.
QUIT
みたいな感じぢゃないですかぁ?(雑すぎますが。。。
DNSでMXレコードかける場合はUDPで接続したあとにどんなことをすればいいのか予想がつかぬのです。
Perl勉強すればよかったかなぁ
>>575 DNSメッセージの構造は分かるね?
まず16bitのIDがあって、続けて16bitのフラグ。
16bitのQDCount、ANCount、NSCount、ARCount。
その後実際に投げる質問。ある場合はその後の回答。
質問や回答は、.で分離して文字列長をプリフィクスにしたQname、16bitのタイプ、クラス、32bitのTTL、16bitのRD長、可変長のRD。
で、これらをbyte[]にしてDNSサーバの53ポートにSendして、結果をReceiveして解析するだけ。
Marshal.StringToHGlobalAutoメソッドなどでメモリを確保して、ネイティブDLLにポインタを 渡した場合、渡したメモリがネイティブDLL内で使用され続けることはあるのでしょうか? 言い換えると、DLLに渡してすぐMarshal.FreeHGlobalメソッドで開放して問題が起こる可能性はありますか?
>>577 渡した関数によるとしか言いようがないな。
その関数が自分で完結せずにグローバル変数に渡してたりしたら当然問題は起こりうる。
>>577 IDisposableを実装してるクラスのインスタンスをメソッドに渡して、
そのメソッドから処理が返ってきてからすぐにDisposeを呼んで問題が起こることだってある、
それと同じだと思うよ。
class Hoge{
private FileStream f;
private void Method1(FileStream fs){
this.f = fs;
}
public void Method2(){
using(FileStream file = File.Create(@"c:\aaaaa.txt") ){
Method1(file);
}
}
}
581 :
555 :2005/07/03(日) 17:08:01
>>562 いや〜ん、想像以上です。素晴らしいです。
ご親切にどうも有難うございます。
こんなにあっただなんて知りませんでした。
どうも有り難うございました。
駄目だぁ〜自分の力量ぢゃ無理です。 DLLやらなにかないのかなぁ〜 そこら辺で配布されている簡単なメーラーもこんな処理してるんでしょうか?
むしろ何が分からないのかが分からない。
Win32APIにもDnsQuery関数以下DnsAPIがあるけどな。 C#から直接P/Invokeするには共有体がでかすぎて絶対やりたくないけど。
nslookupに値を渡して吐いたのを受け取ることってできますか?
ProcessStartInfo.RedirectStandardOutput
588 :
デフォルトの名無しさん :2005/07/04(月) 15:14:12
Public Class LoginException Inherits System.Exception 'コンストラクタ Public Sub New(ByVal Msg As String) MyBase.New(Msg) ←ココ End Sub End Class というサンプルがあるのですがC#だと←部分ってどう書くのでしょうか?
ヘルプ見れ。 C# 言語の仕様 10.10.1 コンストラクタ初期化子
ArrayListをシリアライズ化して保存したいのだけどできない。 ArrayList TestList = new ArrayList(); TestList.Add(new TestObject(aaa, bbb, ccc)); System.Xml.Serialization.XmlSerializer serializerTest = new System.Xml.Serialization.XmlSerializer(typeof(ArrayList)); serializerTest.Serialize(fileTest, TestList); こんな感じで実行すると、 XML ドキュメントを生成中にエラーが発生しました。 ---> System.InvalidOperationException: 型 TestObject は指定されていません。 スタティックに使用できない型を指定するには XmlInclude または SoapInclude 属性を使ってください。 と出てきて保存できない。どうすればよいのだろう。
>>590 TestObject の宣言をおせ−て
XmlSerializer(Type, Type[]) コンストラクタを使って、二番目の引数にArrayListに含まれる型を指定してやんな。
593 :
590 :2005/07/04(月) 21:40:12
VS 2005 で enum のメンバ姪のリファクタリングが出来ないのはなぜなんだよ
βだから…じゃないの?
StreamWriterオブジェクトをDisposeすると、基底のストリームもDisposeされてしまうのでしょうか?
されなかったら恐いな。
{\rtf1\ansi\ansicpg932\deff0\deflang1033{\fonttbl{\f0\froman\fcharset128 \'82\'6c\'82\'72 \'82\'6f\'83\'53\'83\'56\'83\'62\'83\'4e;}} {\colortbl ;\red0\green0\blue255;\red127\green0\blue0;\red255\green0\blue0;} \viewkind4\uc1\pard\nowidctlpar\cf1\lang1041\f0\fs20 <\cf2 test \cf3 hoge\cf0 =\cf3 "test"\cf1 >\cf0\par } <\cf2 test \cf3 hoge\cf0 =\cf3 "test"\cf1 >\cf0\parこの部分を 2.4MB分繰り返したデータを作成します。そのようなRTFをRichTextBoxに食わせると、2.4MB程度で読み込み表示時間が 20分かかるのですがこれはバグなのでしょうか?それとも仕様なのでしょうか? ちなみに、普通のWindow2000、XP付属のワードパッドだと遅いマシンでも30数秒早いマシンだと10数秒で終わります。 逆汗してみると、糞コード以外の何者でもないのは解るのですがなんとかならないでしょうか?
600
>>599 ReadToEndで一気に読み込んでそれだけ時間がかかってるならそういう仕様なんだろう。
もしStringBuilderを使わずに1行ずつ読んで文字列の足し算やってるなら
そっちで時間がかかってる。
602 :
588 :2005/07/05(火) 12:01:18
>>589 ありがとうございます。そこはかとなくわかりました。
603 :
デフォルトの名無しさん :2005/07/05(火) 13:19:55
C#とかJavaのメモリの使い方で質問なんですけど、 この2つって、クラスのインスタンスを作るときに 必ず new しますよね。 これってクラスのインスタンスは必ずヒープメモリ上 に作られて、スタックに積まれることはないという 認識で良いんでしょうか? C++の場合はローカル変数として宣言した場合など スタック上にインスタンスが生成されていると思うんですが、 C#やJavaではメモリの使い方を変えているという認識で いいんですかね? C#に関しては理論的には「組み込み型」が存在しないと 思うのですが、スタック上に積まれるのはすべて 参照型なのでしょうか?
値型って知ってる?
>>604 Vartypeから派生したものとかなんとか読んだ記憶が
あります。なるほど。参照型じゃないものも確かにありますね。
ファイルの絶対パスとカレントの絶対パスからファイルの相対パスを求めたり、 ファイルの相対パスとカレントの絶対パスからファイルの絶対パスを求めたりするメソッドってありますか?
後者はPath.Combine 前者は必要性が分からないぜ。
> Vartype 惜しい!!
>>606 P/Invoke で PathRelativePathTo あたりを呼び出すとか。
1つの Exe から、複数の DLL を呼びだしています。 Exe も dll も C# で作成したものです。 この時、呼び出される DLL の1本に機能改善を行ないました。 で、その DLL が参照している別のDLL(カスタムコントロール)の バージョンが、この DLL を当初配布した時と今とでアセンブリ バージョンが異なっています。 この時、変更を加えた DLL 以外はリビルドなしで、 新しい DLL と共存する事はできないでしょうか? 例として MENU.exe が FUNC1.DLL と FUNC2.DLL と FUNC3.DLL を呼びだす。 FUNC1,2,3 はどれも CUSTOM.DLL を参照、使用している。 FUNC3.DLL を機能改善した。この時 CUSTOM.DLL のバージョンもあがっている。 この状態で、既に MENU.EXE, FUNC1,2,3 が導入されている PC に 新しい FUNC3.DLL と CUSTOM.DLL を導入し、従来の MENU.EXE, FUNC1, FUNC2 と、新しい FUNC3 を共存させたいということになります。 やはり無理でしょうか?わかりづらいかと思いますがよろしくお願いします。
実際に試してみろよ。
613 :
610 :2005/07/05(火) 23:36:32
>>611 あぁ、すみません。実際に試した結果でできなかったので、
何か方法ややり方があるのであればアドバイスを頂きたく
思いました。
実際やってみた結果は
「アセンブリの1つ以上の型を読み込めませんでした」
でした。よろしくお願いします。
アプリケーション構成ファイルとか作ってあげないとバージョンの違うdllはロードされないね。 そして、dllのバージョンを全て固定番号にするという行為に出たシステムが……orz
>>607 俺はそれと似たようなものが最近、必要になった。
複数のファイルを管理する都合で。
P/InvokeでCOMのメソッドを呼び出すときに引数をC#側でどう変換すればいいのかよくわかりません 既存のライブラリのint Hoge(char* name, int length)というメソッドを呼び出すときに、 C#側でint Hoge(byte[] name, int length)でないと上手く行きませんでした。 一つ目の引数をchar[] name にするとダメでした。 Cのchar*に、C#のchar[]では何故いけないのでしょうか?
ヒント:型のサイズ
>>616 というかbyte[]でうまくいくのか。
俺ならIntPtrにしてるところだな。
>>617 C#ではchar型は16bitだったのですね
char = 1だと思い込んでました。
ありがとうございました。
あともう一点・・・
void*はC#では何に対応するのでしょうか?
4byteだからint[]とかで大丈夫かと思ってやってますが(今のところ動いてます
一般的にvoid*はどうするべきですか?
618の言うとおりIntPtr構造体、つまりポインタ/ハンドル型でやるのが本道。 読み書きとかバイト配列との相互コピーとかメモリ確保とかはSystem.Runtime.InteropServices.Marshalクラスの各メソッドで行う。 面倒だから対象の関数にマッチするのを使うことも多いけどな。
>>616 COMだとtypelib使って自動でラッパ生成させる方法しかやったことないんで
よくわからんが、
DLLの場合だと、DllImportAttributeでCharSet指定すれば、Unicodeと
Ansiの変換は勝手にやってくれるはずよ
[ DllImport( "foo.dll", CharSet=CharSet.Ansi )]
とか。
StringBuilderでもいいはず。
詳しくは.NET SDKドキュメントなり、interopサンプルでも見ればいい。
あれ、cha*ならstringかStringBuilderで動かないっけ 最近P/Invoke使ってないから忘れたけど
623 :
622 :2005/07/06(水) 00:28:37
おお、かぶった
失礼しました
>>618 >>620 Cに明るくないのでポインタは避けたかったのですが明日試してみることにします。
ありがとうございました。
625 :
622 :2005/07/06(水) 00:30:36
byte[]を使うのは思いつかなかったぞ 何かに使えるかもしれないから覚えとこう
>>624 Cに明るくないのにP/Invokeってある意味猛者だな
>>625 Cのchar*はテキストであるとは限らないから
ANSI<->Unicode変換を避けたければ当然byte[]しかないだろうね
>>625 一つ注意を。
関数に配列を渡すだけなら良いけど、関数でその配列の要素に書き込みが発生する場合、そのままでは変更は破棄される。
変更を受け取るにはその配列型の引数にSystem.Runtime.InteropServices.OutAttribute属性を付ける必要がある。
ていうか ms-help://MS.NETFrameworkSDKv1.1.JA/cpguidenf/html/cpconmarshalingstrings.htm でも見れ
VS2002しかないんですがどうしたら。>629 //ヘルプなら直接URI書くよりタイトルを書いて欲しいところ。
>>630 .NET Frameworkを使用したプログラミング
-->アンマネージドコードとの相互運用
をざっくり嫁
上のページは「文字列のマーシャリング」だ
632 :
599 :2005/07/06(水) 00:50:50
MemoryStreamを作成し一気に読み込みかけてやったが 結局なんも代わらない。やっぱりどうにもなんようだ。 どこかに簡単に色付きTextEdit作れそうな土台ないかな?
.netプラットホームつってもみんな結局WindowsAPI呼んでんのね。
>>633 当たり前w
でもUNIX上に乗るCLIがあれば、UNIXのシステムコールをするだろ。
JavaのVMだってAPIやシステムコール呼ばなきゃ動かんだ炉
637 :
デフォルトの名無しさん :2005/07/06(水) 11:33:26
すいません。 自分はc#+マネージドダイレクトxを学習中のものですが、 一応ダイレクトインプットで キーボードとマウスはコントロールできるようにはなったのですが、 ジョイスティックをコントロールするにはどうすれば良いのでしょうか? もしかしてまだジョイスティックはコントロールできないのでしょうか? バージョンアップを待つか、c++とネィティブなダイレクトxに手を出すか するしかないのでしょうか? 知ってる方いらしましたらお願いします。
どうして > ジョイスティックをコントロールするにはどうすれば良いのでしょうか? から > もしかしてまだジョイスティックはコントロールできないのでしょうか? に飛躍するのか聞いてみたいもんだ。 列挙体とかにもそれっぽいのがあったりするだろうに。
640 :
デフォルトの名無しさん :2005/07/06(水) 12:24:52
>>636 対応するのはJNIでしょ。
でおそらくc#のネイティブ呼び出しほどJNIは使われてない気がする。
javaプログラマにjavaから入った人が多いからか
「その機能はjavaだから無理です」って言いやすいからか。
マネージドDirectXって勉強する価値あんのか?
DirectX だけのことはあって速くていいよ
アクションとかシューティングに使うにはGCが恐いがな。
スペックがいいからか知らんが、コレクトするタイミングでもあまり気にならない。
素直にDirectX覚えた方がいいと思うが そもそもDirectXが必要なソフト開発でC#を使う必要性がない希ガス
みんなDirect3DやDirectDrawのことしか頭にないのか? 音を自由に出力するにはDirectSoundを使うしかないのだが
グローバルフックをDirectInputで代用とか
クライアント側:Windowsアプリケーション サーバ側:ASP.NET WEBサービス + クラスライブラリ という形で開発してるんだけど質問させてください サービスからクラスライブラリを使ってサーバ側のフォルダにファイルの保存と呼び出しを行いたいのですが クラスライブラリで指定するファイルの保存場所はどういった形式で書けばいいのでしょうか? 現在は@"C:\Image\"+ファイル名 という形で指定してますが、読み込み時に指定されたパスのフォーマットはサポートされませんといったエラーがでてしまいます ウィンドウズアプリケーションから直接クラスライブラリを呼び出した場合は問題なく動くのですが・・・ 解決策を知ってる方がいたら教えてください。お願いします
>>652 正体不明の「クラスライブラ」の質問などされても誰も答えられないから、
FileStream あたりで試してみてから質問するべきでは・・・
/ じゃねーの?
一般的に言ってストリームを開きっぱなしで読み書きをし続けるというのはよくないのでしょうか?
使わないなら閉じちゃえ
>>656 Streamを使ってシリアルの送受信をしてるので
受信待ち受けのために閉じるわけにはいかないんです
使ってるんなら開きっぱなしにしちゃえ
>>653 天秤座の聖衣のことか?「クラスライブラ」って。
用語の質問なんですが 「イベントハンドラ」って言ったら正確には何を指すんですか? (1)イベント用に定義したデリゲート(XxEventHandler) (2)そのデリゲートのインスタンス(MyControl.Xx) (3)そのインスタンスに入れるメソッド(myControl1_Xx())
>>660 特にそんなのの正確な定義ってない気もするけど、
俺の認識では (3)。
C#の質問、お願いします。 メソッドの中で、自分が属してるクラス名やメソッド名の文字列を取り出す方法ありませんか? 検索しても見つからなくて。 属してるusing名も取り出せるのかな?
>>662 クラス名はthis.ToString()とでもすればいいだろ(staticメソッドでなければ)
メソッド名はリフレクションを使う
System.Reflection.MethodBase.GetCurrentMethod().Name
とかそんな感じだ
>>663 ありがとうございます、今からやってみます。
this.ToStringはダメかも知らんね、用途が分からんが多分。 ※This.GetType()もダメよ。 確実にやるなら System.Reflection.MethodBase.GetCurrentMethod()からたどれ。
>>665 sutaticメソッドとmain()以外は問題なく出来ました、ありがとうございます。
using名も出てくるんですね。
用途は単なるエラーログです。
sutaticはthis.ToStringがだめでした。
うーんと、派生される可能性のあるクラスだと、 メソッドを書いてるクラスじゃなくて派生クラスの名前が 出ちゃうと思うけど、それは問題ない?
>>666 ログ用途ならlog4j.net使え。独自仕様のログ処理とか無駄の極致。
前任者が独自仕様のログ処理してた場合、後任の人間は激しく気分が悪い。
670 :
599 :2005/07/09(土) 03:22:46
>>668 たぶん、ログ吐かせたい訳ではなくおそらくそのエラー吐くクラスを特定されると
まずいから、小細工してエラーを独自に吐かせようとしてるんじゃね?それだとlog4でも辛くないか?
671 :
デフォルトの名無しさん :2005/07/09(土) 04:09:23
すみませんが質問です。 従来C++で signal(Ctrl+Cをあらわす定数, 実行される関数) というようにあらわしていた割り込みシグナルを c#で実現するにはどのようにしたらよいのでしょうか。 signal関数に該当するものはC#では見当たらないので ちょっと悩んでしまって、、、当方初心者なんですが 何かアドバイスいただけたらと思います。
>>671 .NET 2.0ではSystem.Consoleのイベントで拾えるようになったけど、
.NET 1.Xでは標準ライブラリではそういう機能はないと思う。
まあ、最悪Cのsignalを直接使う手もあるんだけどね。
const int SIGINT = 2;
delegate void sigfunc(int n);
[DllImport("msvcrt.dll")]
static extern void signal(int sig, sigfunc f);
static void Main() {
signal(SIGINT, new sigfunc(SigTest));
Console.ReadLine();
}
static void SigTest(int sig) {
Console.WriteLine("called.");
}
>>667 今のところ問題はないようです。(5クラスぐらいしか出していないが)
有難うございます。
>>668 log4j.netを知らないので、調べてみます。(チラッと見た限りでは用途が違うような
>>670 もう、なんといっていいか、人間不信か?
>>673 昔からJAVAでもいるけど仕様にあってないヤバイ作りこみしていて
出るはずのないエラーを隠すために小細工するやつはよくいるよ。
log4j.net てなに?
677 :
デフォルトの名無しさん :2005/07/09(土) 16:13:30
>>672 さん、ありがとうございます。
>>671 です。
「.NET2.0のイベントで拾える」、というのは
System.Console.CancelKeyPress
等を利用する、ということでしょうか。
当方の開発環境は残念ながら.NET2.0ではありませんので、
アドバイスに従い、まずはCで記述して確認してみます。
678 :
660 :2005/07/09(土) 17:38:58
>>661 私も個人的には(3)でした。Webを見ると(1)や(2)に使ってる
こともよくあるので。。。
でも今考えたら、デリゲートを関数ポインタだと思えば(1)もそうだし、
だったら(2)もそうだという気もします。
なんか納得しました。
679 :
デフォルトの名無しさん :2005/07/09(土) 18:30:02
追伸
>>671 です。
672さんの方法で確認したところ、
問題なくCtrl+Cのシグナルを拾うことができました。
ありがとうございます。
signalでの割り込みシグナル受信時の実行関数の指定って、
C++だったら頻繁に使われる手法だと思っていたんですが
C#ではなかなかすっきり書けないんですね。
皆さん困ってないのかな…。
>>679 C Runtimeの関数を使うよりも、Windows API(SetConsoleCtrlHandler)を使った方がいいんじゃね?
キーでアクセスするコレクションを作りたいんですが、 DictionaryBaseを継承すると、foreachのときにGetEnumeratorが DictionaryEntryを返すので、キャストするのが面倒なんですが インデクサで返す型と同じ型を返すようにする方法はないですか? またはそれに適した基底クラスはないですか?
>>681 HashtableみたいにValuesメンバが値のコレクションを返すようにしたら?
DictionaryBaseはもともとValuesとか持ってるはずなんだけど、 明示実装されてるのかな、DictionaryBaseのインターフェイスとしては出てこないね。 IDictionaryにキャストしたら使えると思うが…
685 :
デフォルトの名無しさん :2005/07/09(土) 21:18:39
質問です。 C++でクリティカルセクションを使用していたのですがC#に書き直したいと思っています。 同じ機能が実現できればいいのですが.NETにはこのような機能はないのでしょうか? 排他制御をかけたい部分をlock (this)ステートメントでくくる、あるいはMutexを使用する、 という方法があるようですが、2つの使い分け方や違いがよくわかりません。 それとも、もっと簡単な方法があるのでしょうか。ご教授ください。 関数A InitializeCriticalSection( &critSec );/*初期化 /* _beginthreadで関数Bをスレッド起動 */ DeleteCriticalSection( &critSec );/*解放 関数B EnterCriticalSection( &critSec );/* 処理スタート /* メモリへの書き込み処理 */ /* 同一クラスの関数Cもそのメモリに書き込むので */ /* 排他制御をかけたい */ LeaveCriticalSection( &critSec );/* 処理終了 関数C EnterCriticalSection( &critSec );/* 処理スタート /* メモリへの書き込み処理 */ /* 同一クラスの関数Bもそのメモリに書き込むので */ /* 排他制御をかけたい */ LeaveCriticalSection( &critSec );/* 処理終了
686 :
デフォルトの名無しさん :2005/07/09(土) 21:26:17
>>680 同一の機能ならWindows APIの方が望ましいのでしょうか。
クリティカルセクションに相当するのはlockの方。 Mutexはプロセス間での排他制御も行ないたい場合。
688 :
たびたびすみませんが・・ :2005/07/09(土) 21:43:07
>>687 さん、ありがとうございます。
すると、lockで排他制御を実現するんですね。
早速実際にやってみたところ、下記メソッドBの
lockステートメント内でクラスのメンバ変数に値を代入したのですが
◎部分でメンバ変数内を参照すると反映されていない…
lockステートメント内での変数の変更は
ステートメント外には反映されない、ということなんでしょうか?
メソッドA {
スレッドB = new Thread(new ThreadStart(メソッドB));// スレッド処理
スレッドB.Start();// スレッドの開始
}
メソッドB {
lock (this) {/* 処理スタート
/* メモリへの書き込み処理 */
/* 同一クラスの関数Cもそのメモリに書き込むので */
/* 排他制御をかけたい */
メンバ変数 = 1;
Console.WriteLine("{0}", メンバ変数);
}/* 処理終了
/* ◎lockステートメント外で参照すると・・・
Console.WriteLine("{0}", メンバ変数);
}
メソッドC {
lock (this) {/* 処理スタート
/* メモリへの書き込み処理 */
/* 同一クラスの関数Bもそのメモリに書き込むので */
/* 排他制御をかけたい */
}/* 処理終了
}
689 :
& ◆yFciIU7CCs :2005/07/09(土) 21:46:45
すみません、メンバ変数うんぬんは早とちりでした。失礼しました。 lockステートメントを使って再度確認してみます。
690 :
デフォルトの名無しさん :2005/07/09(土) 21:58:07
>>689 いや、それじゃ変数の値が反映されないだろ。
692 :
デフォルトの名無しさん :2005/07/09(土) 23:42:36
ttp://www.geocities.co.jp/SiliconValley-SanJose/1892/pc/arc_cmd.html を見ながら、複数のフォルダに入っている複数のファイルをひとつのLzhに圧縮しようとしてます。
c:\hoge\a.txt
c:\hoge\b.txt
c:\hoge\hage\c.txt
c:\hoge\hage\d.txt
というファイルがあるとするとき、
a.txtとc.txtだけを階層関係を維持したまま、圧縮するにはどうしたらいいでしょうか?
上記のURLの最後の例で、ベースディレクトリにc:\hoge\ レスポンスファイルにa.txt[改行]hage\c.txtと記述しても
LZH圧縮されません。(圧縮が行われず、LZHファイルも作成されない。)
どう記述すればいいんでしょうか?よろしくお願いします。
Console.InもConsole.OutもConsole.Errorも、型は TextReader か TextWriter のようですが、 .NETでは、標準入出力にテキストデータしか使えないのですか?
>>693 OpenStandard〜メソッド参照。Streamで使えるよ。
SharpZipLibのライセンスの Bottom line In plain English this means you can use this library in commercial closed-source applications. は「簡単に言えばこのライブラリは商用クローズドソース アプリケーションに使ってもいいよ。」 って言うことですか? つまりフリーソフトに使うときでもソースコードを開示しなくてもよいということでFA?
>>695 たしか、DLL 参照による使用に関しては、こっちのコードまで GPL が感染する事は無かった筈
多分その意味で在ってる。
ライセンスが GPL なら感染するのでは? ライブラリ利用が認められているのは LGPL じゃないと駄目だった気がするが。
完全なGPLではないということらしいな。 >The library is released under the GPL with the following exception 「ライブラリは以下の例外事項を含んだGPLでリリースされている。」
>696-698 サンクス。 ちなみにふつうのGPLライセンスだと DLL参照かどうかに関わらず感染するみたいです。 Wikipedia オープンソース・LGPLの項より 〜GPL はリンクされるすべてのソースコードが GPL であることを要求するので、ライブラリとしての価値を低くしてしまう。つまり、ライブラリが GPL であると、そのライブラリは GPL のソフトウェアを作るためにしか使えないものとなってしまう。
700
思ったんだけどGPLなdllがあっても、リフレクションで動的にロードする場合なら感染しないよね? プラグインとして設定したdll、クラスを使用できるようにしといて。
>>701 いっしょに配布したらだめだろうと思う。
ユーザーが他者から勝手にダウンロードしてリンクした場合はダークだな。(気持ち的には大丈夫かな?
ただ、ソフトの説明に、ダウンロード先や使い方の説明をしたらだめだろうと思われ。
ただここまでして、GPLを使うならぐらいなら、そんなの自分で作る。w
意見1 DLLとメモリ上で実行時に結合するので、DLLを使用するソフトはDLLの二次著作物である。 そしてDLLの二次著作物は、配布するときはGPLに基づいて配布しなければならない。 意見2 DLLを呼び出すのは、ただ単に呼び出し規約に従って呼び出すだけだから、二次著作物でもなんでもない。 二次著作物でない以上、ソフトウェアを作っても何の義務も負わない。 ライセンスとかGPL関連のスレで散々繰り返されてきた議論。 そしてどちらの意見が日本において正しいかは、判例がないので、裁判になるまで分からない。 仮に意見1が正しかった場合、DLL参照でもリフレクションでもアウト。 意見2が正しければ、DLL参照でもリフレクションでもOK。 判例がないので
まあ、要はオプソのライセンスはウイルス同様だから使うなってこった
>>705 スレ違いだけど、オープンソース一般とGPLを一緒にしないで。
一般人の認識:オープンソース=GPL
=なにそれ?
代入
うちらは一般人じゃなくて開発者だからせめて区別付けようぜ。
はいはい、バナナはおやつに含まれますか。
>703 つーか意見2だったらLGPLいらんやん
GPLなライブラリを使う時は使う側もGPLにしてる。 使う側をGPLにしたくない時はGPLなライブラリは初めから使わない事にしてる。 一旦GPL絡みで叩かれ始めると、もう際限なく違法だのアンフェアだのと叩かれ 捲くる。単にソースを手に入れたいだけの奴や面白がって叩く奴まで集まってき たら正当性も糞もない。危うきには近寄らずが一番。
GPLスレいけよ
717 :
デフォルトの名無しさん :2005/07/11(月) 21:45:08
すいません。 アセンブリ、参照、 アプリケーションがリソースにアクセスする方式、、、 これらのことをわかりやすく教えてくれないでしょうか? または、教えてくれる書籍かwebなどありましたらお願いします。 今日一日、あっちこっちの本屋を巡ってみたのですが、 一通り最新のc#参考書を読んでみたのですが、かなり詳しい本でも、 その辺の情報はほとんど無いに等しかったです。 詳しい人は一体どこから情報を手に入れているのでしょうか? 知ってる人いましたらお願いします。
MSDN
初心者です。 解決法が見つけられなかったのでお願いします。 Visual Studio 2003のC#でGroupBoxの中にGroupBoxを作り それぞれFlatStyleをSystemにし、マニフェストでXPスタイルにします。 すると内側GroupBoxのフォントとフォントサイズがおかしく表示されるようになりました。 (最も外側のGroupBoxはちゃんと正常されます) はじめは問題なかったのですが、.NET Framework1.1 SP1をあてると?正常に表示されなくなるようです。 どなたか解決方法をご存知でしたらよろしくお願いします。m(_ _)m
ListView で ShowGroup を true にしていると TopItem で期待した値が返ってこないのはなぜ
int型をToString()でstringに変換する際に、桁数を指定して満たない部分は0を表記させることって出来ますか? ex: int a = 1; a.ToString()→01 ←こんな感じにしたいんです。
ToString("00")
724 :
デフォルトの名無しさん :2005/07/12(火) 02:10:25
もしかして、 c#からdllファイルを作成する方法は、 コマンドラインコンパイルしか方法がないのですか? 今日は、コマンドラインからコンパイルできるように設定するだけでえらく時間食われてしまいました。 俺のは古いバージョンなのですが、新しいバージョンを入れてる人なら、 dllファイルを作成するビルドオプションがビジュアルエディタからワンクリックで 設定できたりしますか? こんな最新のエディタがコマンドラインからしかコンパイルできないなんて 漏れ的にはちょっとしたカルチャーショックなのですが、皆さんはその辺、どうですか?
何のC#使ってる? VSなら、簡単だが。
727 :
デフォルトの名無しさん :2005/07/12(火) 02:31:24
ああ、自分は、そのとおりです。
スタンダードです。
>>726 ありがとうございます。
みてます
728 :
デフォルトの名無しさん :2005/07/12(火) 02:57:27
質問です。 今日の夕方パソコンつけると起動時間に10分ぐらいかかりほかの動作もかなり時間かかったので、 プロセス見ると48個も開いてました。 おまけにさっきまで要領あったローカルディスク(C)を見たら500MBぐらいになっており、 「元:28GB 残り:9GBぐらい」 ローカルディスクCの場所で、プロパティ開いたらほぼ使ってるんですが。 windowsやプログラムファイルス見てもそこまで要領食ってるものはないのですが。 やっぱりこれってウイルスですよね・・ 思い当たるウイルスなどありましたら教えてください。 ノートンの検索でもひっかからなかったらしいので。対処できません・・ よろしくおねがいします os:windowsXP
729 :
デフォルトの名無しさん :2005/07/12(火) 02:59:46
すげえ、こわいウイルスだな。。。
>>728 何でまたC#スレに?
HDDの容量が減る、でピンと来るのはウイニー関係のウイルスだろ。w
731 :
デフォルトの名無しさん :2005/07/12(火) 04:41:30
明らかにここで書くのはおかしいと思ったのですが、 パソコンが重たくて中々動作しなかったので、一番上にあった奴に書かしてもらったんです・・・。すいません蛇魔でした。 ウィニー最近久しぶりに立ち上げた時exeファイルでも踏んだかな。。 取り合えず調べます どうもです
ローカルルールを100回朗読の刑
>>731 多くの個人情報が流されたのは間違いが無い。
今度はどんなニュースに。w
735 :
デフォルトの名無しさん :2005/07/12(火) 16:15:54
質問です。 threadpoolのQueueUserWorkItemでinvokeを呼ぶメソッドを25個登録すると、 24個目のinvokeを呼ばれた時にSystem.InvalidOperationException (メッセージ:操作を完了するために十分なスレッドがThreadPool オブジェクトにありませんでした)が発生します。 対処法としては、QueueUserWorkItemで登録するメソッド数を制限する以外 ないのでしょうか?
>>735 ん〜、ごく簡単なコードでは再現しないな。
普通に25個実行して残りは待機する。
再現コード書けない?
>>720 ありがとうございました。
無事解決できました。
738 :
デフォルトの名無しさん :2005/07/12(火) 19:19:03
>>736 サンプルソースは以下のものです。
WINDOWSアプリで作成して、対向として
WEBサービスを作成しました。
// 最初にスレッドプールのスレッドを24個使用
private void button1_Click(object sender, System.EventArgs e)
{
for(int i = 0; i < 24; i++)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(TP));
}
}
// 次にWEBサービスを呼ぶ
private void button2_Click(object sender, System.EventArgs e)
{
localhost.Service1 serv = new Req.localhost.Service1();
System.Diagnostics.Process P = System.Diagnostics.Process.GetCurrentProcess();
Console.WriteLine("WEBサービス呼び出し:スレッドID "+P.Id.ToString());
string s = serv.HelloWorld();
Console.WriteLine(s);
}
739 :
デフォルトの名無しさん :2005/07/12(火) 19:19:23
static void TP(Object stateInfo) { // No state object was passed to QueueUserWorkItem, so // stateInfo is null. MessageBox.Show("TEST"); } static void ThreadProc(Object stateInfo) { try { // No state object was passed to QueueUserWorkItem, so // stateInfo is null. localhost.Service1 serv = new Req.localhost.Service1(); serv.Timeout = 1000000; string s = serv.HelloWorld(); } catch( Exception ex ) { // button2_Click がクリックされたらここに入ってくる int i = new int(); int j = new int(); int k = new int(); int l = new int(); ThreadPool.GetAvailableThreads(out i, out j); ThreadPool.GetMinThreads(out k, out l); Console.WriteLine(ex.ToString()); } }
>>738 Webサービスとなるとあんまり助言はできないが、
Webサービスのプロクシクラスには非同期用メソッドが用意されてるはずだからそれを使ってみるのは?
C#アプリから他のプログラムの特定のコントロールにキーストロークを送信する方法ってないですか? 特定のコントロールって条件でなければForegroundしたあとにSendKeysって方法でできたんですが、検索してもコントロールまでは指定できないみたいで・・・ 相手プログラムのコントロールのクラス名はわかってます
FindWindow&FindWindowExで探し当ててSendMessageでWM_KEYDOWN。厳密にはストロークじゃないが。 ていうかもうC#じゃないね。
>>738 ,
>>739 button1_Click()でWaitCallbackに指定しとるのはTP()だし
button2_Click()ではWebService呼び出しを単に同期で実行しとるし
そのThreadProc()って、ナニ?
744 :
デフォルトの名無しさん :2005/07/13(水) 07:47:33
>>743 すいません ThreadProc() は意味無いです。
非同期はこれから試してみます。
745 :
デフォルトの名無しさん :2005/07/13(水) 12:22:22
DLL内のメソッド呼び出し方法の質問です。 DLLが公開しているメソッドを呼び出したいのですが、 ・string の終端文字のポインタをどうやって取得するか (targetendp) ・二重ポインタ(findp)の渡し方 の2点をアドバイスしてもらえないでしょうか? 対象のメソッドは次の物で int foo( char* pattern, // 検索したい文字列 char* target, // 検索対象の文字列 char* targetendp, // 同、NULL 終端文字へのポインタ FIND** findp, //(戻り値)FIND 構造体 ); C#側では次のようにしてます。 [DllImport("BREGEXP.DLL")] public static extern int foo( string pattern, string target, IntPtr targetendp ref IntPtr findp );
>>745 終端文字へのポインタって何でそんなマニアックな。
ん〜、Encoding.GetBytesでバイト配列にして、
Marshal.AllocHGlobal/Copyでバイト配列+終端文字分確保・コピーして、
//ここまでの作業はMarshal.StringToHGlobalAnsi(Auto)とMarshal.ReadByte辺りで代用できるかな。手間は大差ないが
AllocHGlobalで確保したIntPtrにバイト配列の長さ足せば終端文字のポインタになる。
ポインタのポインタはref IntPtrで宣言してるところから見て理解してるように思えるけど?
//普通は呼出側がメモリ確保するだろうし。->Marshal.AllocHGlobal
(string pattern, IntPtr target, IntPtr targetendp, ref IntPtr findp)
>>746 「終端文字のポインタ」は「NULL 終端文字へのポインタ」を変に略したものと思われ。
748 :
747 :2005/07/13(水) 12:59:11
間違ってますた。 回線切ってry
>>746 ありがとうございます。
某正規表現DLLのラッパー作らないといけなくなり、そのための質問でした。
750 :
745 :2005/07/13(水) 14:54:43
こんな形で解決しました。(3行目が気持ち悪いですが) 報告まで string target_base="foobar"; IntPtr target = Marshal.StringToHGlobalAnsi( target_base ); IntPtr targetendp = new IntPtr(p.ToInt32() + Encoding.Default.GetByteCount(target) );
CodeProject落ちてないか?
いつものことだから気にしなーい。 ……名前解決で失敗してるっぽいのが気になるけど気にしなーい。
お、繋がった。 重いけどけっこう重宝するんだよな。
Compact Frameworkについて質問なんですが、
WindowsCEの_wfopen(fopenは使えないっぽい)ではカレントディレクトリの概念がないのか
相対パスを使ってオープンできないようなので
仕方なく実行ファイルのパスを取得して絶対パスにしようと考えたのですが、
http://dobon.net/vb/dotnet/vb6/apppath.html 上記のサイトにある
System.Reflection.Assembly.GetExecutingAssembly.Location
Application.StartupPath
Application.ExecutablePath
System.AppDomain.CurrentDomain.BaseDirectory
のいずれの方法もCompact Frameworkでは削られていて使うことが出来ません。
現在はGetModuleFileNameをp/Invokeで呼び出して取得していますが、
できればp/Invokeを使わずに取得したいのです。
何かいい方法はないでしょうか?
755 :
754 :2005/07/13(水) 23:51:51
WindowsCEの_wfopen(fopenは使えないっぽい)ではカレントディレクトリの概念がないのか ↓ WindowsCEではカレントディレクトリの概念がないのか に訂正します
ちなみに検索キーワード:compact アセンブリ パス
759 :
754 :2005/07/14(木) 00:07:59
>>756-757 なるほど、こんな手があったんですね・・・
即レスありがとうございます。
あるダイアログボックスにTabControlがあって、そのなかにTabPageと その中にTextBoxがあって、テキストボックスにフォーカスが当たってる 状態で開きたいんですけど、TabIndexの設定の仕方がわかりません。 コンテナの中のコントロールが、どうしてもコンテナより順番があとに なってしまいます。あとForm_LoadでtextBox1.Focus()とかやっても 無効でした。
762 :
760 :2005/07/14(木) 19:05:40
>>761 ナイスな脊髄をお持ちです。ありがとうございます。
763 :
デフォルトの名無しさん :2005/07/14(木) 21:54:08
GetKeyboardStateについての質問です。 Threadを使用して呼び込むとうまく動作してくれません。具体的には --mainLoop------------------------------------- GetKeyboradState(byte) ↓ if(((int)byte[(int)Keys.A]&0x80)!=0) Console.WriteLine("A"); ----------------------------------------------- という処理をしているのですがこれを普通に mainLoop() で呼ぶと動作するのに Thread t=new Thread(new ThreadStart(mainLoop)); t.Start(); で呼ぶと動作してくれません。state[(int)Key.A]の値が 1 or 0でキーが入力されたことに なってくれません。 ループでまわしているのでThread使ってやったほうが楽に終了・一時停止しょり出来るので 使いたいのですが、原因がわからなくて困っています、どなたかご存じないでしょうか。 環境 WindowsXP Microsoft Visual Studio 2003
mainLoop ってなによ
ああ、悪い。普通に書いてあったな orz
>>763 MSDNには目を通したかい?
> スレッドがメッセージキューからキーボードメッセージを削除すると、仮想キーの状態が変化します。
> キーボードメッセージがスレッドのメッセージキューにポストされたり、
> 他のスレッドのメッセージキューへのキーボードメッセージのポストや削除が発生しても、状態は変化しません。
> 対応するキーボードメッセージがメッセージキューから取得されたかどうかにかかわりなく、
> 個別のキーの現在の状態を取得するには、GetAsyncKeyState 関数を使います。
メインスレッドで実行させるようにInvokeを使うのも有りだな。
つかわざわざ各スレッドで取得せんでも、取得してからスレッドを起動させるようにしちゃいかんのかね。
かね
768 :
デフォルトの名無しさん :2005/07/14(木) 23:44:34
>>766 ありがとうございます(*´∇`*)MSDN…Googleばっかり使ってて存在忘れてましたorz
> つかわざわざ各スレッドで取得せんでも、取得してからスレッドを起動させるようにしちゃいかんのかね。
流れ的には
メインスレッド起動
↓
バックグラウンドでスレッド起動
↓
ループ処理(ゲーム)
↓
メインスレッド終了
↓
自動的にバックグラウンドスレッド終了となるので毎回バックグラウンドスレッドのなかで呼び出して状態を取得しなければならないんですよ。ゲームあまり作ったことがないので定石をしらず、終了したときにループを終了する方法が
isExit=false
do
{
//何か処理
}while(!isExit);
Form_Close()
{
isExit=true;
}
程度しか思いつかなかったのでこのスレッドをわける方法をとったんですよ、もっと綺麗な方法があるのならばそちらを使いたいのですが…それにInvoke…初めて聞きました、調べてみたのですが使い方がよくわかりません。
769 :
デフォルトの名無しさん :2005/07/14(木) 23:45:16
768続き --Keyboard[class]-------------------- private byte[] state; void Get(){ GetKeyboardState(state); } bool isPress(Keys key) (省略) ------------------------------- --mainLoop[class]-------------------------- delegate void KeyboardGetDelegate(); --mainLoop(Form owner)--------- Keyboard key = new Keyboard(); do{ owner.Invoke(new KeyboardGetDelegate(key.Get)); if(key.isPress(Keys.A)) Console.WriteLine("A"); } ------------------------------ 一応呼び出し元であるForm1を引数として渡してInvoke使ってみたんですがうまくいきませんでした。
770 :
デフォルトの名無しさん :2005/07/15(金) 00:12:09
自己解決しました GetAsyncKeyState使いました、これだとリプレイ機能付けるのが大変なんですがこの際だから仕方ないです。 ありがとうございました(*^-^)
まあGoogleで検索してMSDNのページがひっかかることもあるけどね。 リプレイ機能って、ゲームか。
てst
773 :
デフォルトの名無しさん :2005/07/15(金) 17:11:06
質問させてください。 DBにユーザ情報テーブルと職業種別テーブルがあり、 ユーザ情報を登録・編集するWebアプリを作成しています。 Panelの上に以下のような感じで項目が乗っています。 名前:TextBox 住所:TextBox . . . 職業種別:DoropDownList この条件で以下のようなふたつの処理を両立させることが 可能でしょうか? 1.事前に職業種別のDoropDownListの項目を職業種別テーブル よりDataBindで設定したい。 2.既存項目の編集時にPanelのDataBindで各項目にユーザ情報 テーブルの値を設定したい。この際、職業種別のDoropDownList のSelectedValueもDataBindで設定したい。 自分が試したところ、DoropDownListのDataBindで1と2の処理が 同時に走ってしまい、いまいちうまくいきません。 なにかうまい方法があればお教え下さい。よろしくお願いいたします。
最近VS.NETでC#をいじりだした新参者ですが、ちょっと質問をさせてください。 MIDIを使用して音を出すようなプログラムを書こうと思ったのですが 色々な本をみても、そのようなプログラムのサンプルや説明が見つからず四苦八苦しています。 とりあえず、ドレミファソラシドと音を出す程度のものでよいので、どうすればいいか教えていただけませんでしょうか。
先ずは MIDI で音を出す方法を調べて、次はそれを C# でどう組めばいいのかを調べる。
今まで.NET Framework 2.0 ベータ1を使っていた。
Document Explorerの使用期限がついに来たので、面倒ながらベータ2を入れることにした。
何故かベータ1をアンインストールする際にVS2002付属のDocument Explorerの終了も強制させられた。
SDKまで入れ終わったあと、VS2002付属のDocument Explorerを起動したら、目次のツリーのアイコンが変わってた。
ついでに中身もWOW64に関する記事とかが入ってたがこれはベータ2を入れたからなんだろうか。
しかしベータ2付属のDocument Explorer、ベータ1の時に比べて大幅に速くなったなー。
ベータ1(2.0.4****)で作成したのをベータ2(2.0.50215)で実行したら、XmlReader.Disposeメソッドが見つかりませんと実行時例外が出て焦る。
再コンパイルしたら問題なくなった。
ベータ1で作ったのは一通り再コンパイルが必要だな。
流石にベータだけあってクラスの変更が多い。
ベータ1でXSLTの処理クラスとして導入されたXsltCommandクラスがあっさりObsolete、XslCompiledTransformに置き換えられたり。
そもそも2.0ベータ1で追加されたSystem.Xml.Query名前空間が消滅、System.Xml.Xslに出戻ってたり。
//こんな記事にもなったのにねぇ。
//
ttp://www.itmedia.co.jp/enterprise/articles/0501/24/news009.html System.Windows.Forms.Direction列挙体を汎用に使おうかと思ったらSystem.Windows.Forms.ArrowDirectionと巧妙な名前付けがなされるようになったり。
以上、チラシの裏。
DataGridで選択されたセルが降順でソートされている時に データが追加されようがどうしようが選択されたセル番号不変にする方法 ないですか? DataGridの選択しているRowの一覧を収めたDataTableはプロテクトメソッドの ため逆汗して見えるけど使えない。どうすりゃいいだろ?
10進数を16進で表示したいのですが、 16未満の時に、0Fというようにするにはどうすればいいでしょうか? 10進の文字列表記の際の桁数指定は使えないようなのです。
は? 5.ToString("X2"); で問題ないだろ?
NUnit2.2.2のNUnitTests.nunitで at NUnit.Framework.EqualAsserter.FailNotEqual() at NUnit.Framework.EqualAsserter.Assert() at NUnit.Core.Tests.ExpectExceptionTest.MethodThrowsArgumentOutOfRange() が発生するのって俺だけ? .NET Version: 1.1.4322.2032
一応解析してみたけど・・・ 【ExpectExceptionTest.csより】 [TestFixture] internal class TestThrowsArgumentOutOfRangeException { [Test] [ExpectedException(typeof(ArgumentOutOfRangeException), "the message\r\nParameter name: param\r\nActual value was actual value.")] public void TestThrow() { throw new ArgumentOutOfRangeException("param", "actual value", "the message"); } } [Test] public void MethodThrowsArgumentOutOfRange() { TestResult result = RunInternalTest( typeof( TestThrowsArgumentOutOfRangeException ) ); Assert.AreEqual(true, result.IsSuccess ); } 日本語ローカライズされててArgumentOutOfRangeExceptionのメッセージは 「the message\r\nパラメータ名 : param\r\n実際の値は actual value です。」 になるから、単純にテストコードの各国語対応バグと考えていればいいのかな。 NUnitのExpectedException属性に詳しい人、教えて。
C#のstruct型に定数を入れる方法を教えてください。 private struct Keyid { int id; string name; }; private Keyid[] ketData = new keyid[] { {1,"aaa"}, <----エラー {5,"bbb"}, <----エラー }; 上記のように、定数を入れたいのですが、方法は分からなくて。{では駄目みたいで・・ お願いします。
上げます。
>>783 private struct Keyid
{
int id;
string name;
public Keyid(int id, string name) {
this.id = id;
this.name = name;
}
};
private Keyid[] ketData = new keyid[]
{
new keyid(1,"aaa"),
new keyid(5,"bbb"),
};
大文字と小文字が混じってる…… Keyid に統一で
>>786 2chでのタイプミスです。
>>785 なんと、そんな方法なのですか。何処探しても見つからなかった・・・・
今からやってみます。
789 :
783 :2005/07/18(月) 21:00:33
structの質問をした783ですが、考えてみるに、classでもいいじゃないのか? 何でわざわざstructに・・・・(C++の過去知識影響だろうな〜 じゃここにキー名が一致確認でID戻しのメソッド置いて・・・・とか思ってしまうし。 ただ単に文字列キーのID数値変換だけなのだが、もっとスマートな方法が有るんじゃないかと 思ってしまうのですが、ひょっとして有りますか?
文字列から (予め登録された) 対応する数値を探したいのなら Hashtable table = new Hashtable(); table["aaa"] = 1; table["bbb"] = 5; ……でいいんでない?
791 :
783 :2005/07/18(月) 21:33:27
>>790 うぐ、一番簡単そう・・・・・(C++時はスピード優先がデフォルトで入っていたから^^;
ちなみに逆変換は。↓な感じですか?
Hashtable tableRv = new Hashtable();
table[1] = "aaa";
table[5] = "bbb";
たいした数も無いので、これでいいかな。
起動時とパラメーターセーブ時だけ生成すればいいし。(な考え方でもいいかな?
あ〜 string と int が等しくなる事は無いから、1つのテーブルに押し込めちゃって構わないかと
793 :
783 :2005/07/18(月) 21:42:36
そうですね、1つで充分。 妙なクラスを複数と検索等の複数メソッド作るより。 1クラスで単純に管理できるのこれにします。 有難うございました。
ほんまにC++できんのか?かなり頭わるそうだけど。
どこら辺が頭悪そうなのか。指摘キボンヌ
796 :
デフォルトの名無しさん :2005/07/18(月) 23:07:45
顔
キボンヌとかいってるとこ
798 :
790 :2005/07/18(月) 23:10:59
(要素数が多いときには) 線形探索よりもハッシュ探索の方が普通は高速なのに、 「C++時はスピード優先が〜」 なんて言っちゃったからのような気がする
>>791 >たいした数も無いので、これでいいかな。
といっとるがな。
801 :
790 :2005/07/18(月) 23:14:20
>>800 いや、だから (要素数が多いときには) って但し書きがしてあって……
794 の未間違いかなと
「未間違い」って間違えてないやん「見間違い」の間違いですスマヌ
803 :
デフォルトの名無しさん :2005/07/18(月) 23:16:34
804 :
783 :2005/07/18(月) 23:20:51
盛り上がってるな、皆さん仮定の話で・・・・ 一言言ってみる、色々な意味でハッシュより余裕で速い要素数だ。
805 :
デフォルトの名無しさん :2005/07/18(月) 23:22:26
色々な意味で とか付けなくていいよ
>>798 非標準ではないが、STLport(SGI系)にはハッシュとそのコンテナが入っている。
でも実際使ってみるとわかるが、遅い遅い。
×非標準ではないが ○標準ではないが orz
間違いが多いスレでつね
>>805 何で付けなくていいか、理由を説明よろ。
C++知ってて配列初期化できんとかマップしらんなんてありえん。 プログラム初心者ならわかるけど。
813 :
783 :2005/07/18(月) 23:31:01
>>811 思いっきり誤解してるな、まあ好きにしろ。俺はこれで終わる。
815 :
デフォルトの名無しさん :2005/07/18(月) 23:31:42
何で叩きあいになったのか意味不明 仲良く行きましょうや
C++できる人間がこんな馬鹿な質問すると思われるのは遺憾だ おまけに「C++はスピード重視だから」とか言い訳するとこがみっともない
^^;の顔文字と、 頭が悪そうと書かれてからの文体の変わり様が783の人の浅さをよく表している
底か?
間違えた^^;
822 :
デフォルトの名無しさん :2005/07/19(火) 02:03:25
リストやマイコンピュータやデスクトップなどで表示される、 矩形選択のようなものをTabPage上で実現したいのですが、 どのように処理をするのが望ましいのでしょうか? 他にも描写しているものがあり、マウスが動くたびに再描写では すごく重くて悩んでいます。
>>822 ControlPaint.FillReversibleRectangle のようなもの?
>>822 > マウスが動くたびに再描写ではすごく重くて
どうやろうが最終的にはマウスが動くたびに再描画しなくちゃなんねぇぜ。
825 :
デフォルトの名無しさん :2005/07/19(火) 04:22:37
やってみたんですが、TabPageにいくつかSetStyleしているので、 ちらついたりコントロール上が再描写されなかったりと問題がありました。 実際は一部だけ再描写する技術を身に付けたほうが良いのでしょうか?
826 :
デフォルトの名無しさん :2005/07/19(火) 20:24:21
すべてを再描画するのが悪い 更新しなければいけない部分だけ再描画すればいいだけのこと!
で、それどうやんのよ。
828 :
デフォルトの名無しさん :2005/07/20(水) 21:58:30
はぁ・・・
831 :
デフォルトの名無しさん :2005/07/20(水) 23:03:21
>>830 なにがおもしろいのか、それが禿しく疑問
単なる皮肉じゃんw
832 :
デフォルトの名無しさん :2005/07/20(水) 23:38:25
[STAThread] これってstart thread なんすか? なんて読むの? 廃スレ? 禿げ既スマソ
「Single Threaded Apartment スレッド」 つづり合ってたっけ?
Single Thread Apartment <-> Multi Thread Apartment ちなみにCOMで使われる概念な。
じゃあ[MTAThread]っていけるの? やったことないんだけど。
Windows Formsを扱うスレッドはSTAThreadじゃないと具合が悪い。 そのほかは扱うCOMの設計次第。 COMを扱わないなら関係ないが、内部で使ってる可能性は捨てられない(Windows Formsのように)。
仕事で使うActiveXコントロールが、[STAThread]つけないと 動かない、ということはあった。 その人は、手でMain()書いたから[STAThread]を書いてなかった。
STAThread書かないとDrag&Dropもできないよね。 内部でCOM使ってるらしい。
Write()をstringに対して適用するメソッドってありますか? いつも ToString() と "+" で連結して使ってるんですが、面倒で・・・・
わけわからん。なんのクラスのWriteメソッドなのさ。
>>841 すみません。Console.Write()です。要するに、Cのsprintf()のような事を
させたいのです。
public static void Write(string format, params object[] arg); のことか?
>>843 そう、それです。それをstringに対して適用したいのです。
stringに対して適用とか言うから分からなかったぞ。 String.Formatのことだな。
>>845 ありがとうございます!まさにそれです。これでだいぶ楽になります。
>>846 言葉足らずで済みません。sprintf()に例えれば分かってもらえると
思ったのですが・・・この中にはC/C++を知らない人もいるんでした。
失礼しました。
>>848 C++を知っていたとしてもあれでは普通わからん。
>>848 sprintf といわれたら分かるけど、
Console.Write() を string にって言われても一瞬、意味分からなかった。
Write() メソッド、何パターンもオーバーロードがあって、format 指定無しのものもあるし。
852 :
初心者 :2005/07/21(木) 23:29:07
まじで初心者なんですがC言語などを機械が分かるようにするやつを何ていうんでしたっけ?_| ̄|○
854 :
XP :2005/07/21(木) 23:36:53
windowsXPならコンパイラは何がいいですかね?
855 :
Me :2005/07/21(木) 23:47:43
gcc
856 :
デフォルトの名無しさん :2005/07/21(木) 23:51:06
gccってソースみるとわかるが、正直ダメダメだぞ しかも汚い
857 :
XP :2005/07/21(木) 23:56:02
VS spokeが良いらしいのですが?
>>856 何と比べてどういうところがダメダメで汚いの?
スレ違いは適当に切り上げろよー
>>856 Intelのコンパイラに比べればマシ
AMDでエラーが出るようにコンパイルされるとか終わってる。
>>861 CPUベンダーが自社のCPUに最適なコンパイラを作るのは当然だと思うが
互換性はあくまでAMD側が維持するべき問題だろ
それ以前に拡張命令に対応したコンパイラを自社開発できないAMDはうんk
インテルのコンパイラは速度が違うよ
スレ違い
MS製のCLRとMonoのCLRでも速度が大分違ってたな
866 :
デフォルトの名無しさん :2005/07/22(金) 00:51:49
OSのシャットダウンが行われていることを (他のアプリよりも先に)知るにはどうしたらよいでしょうか? 他のアプリが閉じる前にやりたい処理があるのですが
System.Runtime.InteropServices.Expando という名前空間があるんですが エキスパンドゥーってなんですか?Web辞書には載ってなかったんですが。
データテーブルをCSVとして吐き出したいんだけどなんかいい方法ないかな 単純に文字列連結すればいいのはわかってるんだけど
それが一番手っ取り早いさ。
871 :
869 :2005/07/22(金) 12:44:42
やっぱり? どっかソース落ちてたら楽かなーとか思ったんだけど 手組みするかね・・・だるぅ
873 :
869 :2005/07/22(金) 13:03:29
単純作業が死ぬほど嫌いなんだけだよー まぁいいや、今から組んでくる
>>873 普通のやつは複雑なことを複雑に考える。
馬鹿は単純なことを複雑に考える。
頭のいいやつは複雑なことを単純に考える。
シンプルにやれるものはシンプルにやろうや。
>>866 WM_QUERYENDSESSIONでもグローバルフックすれば?
・・・出来るんかいな?
876 :
869 :2005/07/22(金) 15:21:38
private string CreateCSV(DataSet data){ StringBuilder sb = new StringBuilder(); foreach(DataRow dr in data.Tables[0].Rows){ for(int i = 0;i<dr.ItemArray.Length;i++){ sb.Append(dr[i]); if(dr.ItemArray.Length != i+1){ sb.Append(","); } } sb.Append("\r\n"); } return sb.ToString(); } もっとシンプルになるかな?
>>866 SetProcessShutdownParameters
879 :
デフォルトの名無しさん :2005/07/23(土) 03:56:20
Form1から Form2 f2 = new Form2(); f2.ShowDialog(this); として開いたForm2から,Form1のpublicなプロパティMobilityにアクセスしたいのですが, this.Owner.Mobilityとすると 'System.Windows.Forms.Form'に'Mobility'の定義がありません とエラーが出てしまいます. 何が間違っているのでしょうか?
>>879 つか、Mobilityってなに?
Form1 form1 = this.Owner as Form1;
if(form1 != null)
{
// form1.Mobilityを使う
}
881 :
つまらないことかもしれませんが・・・ :2005/07/23(土) 04:24:34
配列(たとえばbyte[])の要素を他の配列にコピーしたいとき ★ArrayクラスのCopyToメソッドを使うか? ★ループでインデックスをカウントアップし要素を一つずつ代入するか? どちらが早いですか? パフォーマンスをあげたいとき一般的にはどっちを使います?
882 :
879 :2005/07/23(土) 04:29:12
>>880 > つか、Mobilityってなに?
すいません,自分で追加したプロパティです.
出来ました.
ありがとうございました.
> >881 Array.Copyを使え。
>>881 プリミティブ型ならBuffer.BlockCopyがたぶん一番速い
885 :
デフォルトの名無しさん :2005/07/23(土) 14:02:57
//Form1.cs static void Main() { Application.Run(new Form1()); ArrayList al = new ArrayList(); al.Add( new ClassSample("田中", 2359)); al.Add( new ClassSample("鈴木", 0324)); al.Add( new ClassSample("佐藤", 0830)); al.Sort(); foreach( ClassSample cs in al ) { System.Diagnostics.Debug.WriteLine(cs.ToString()); } }
886 :
デフォルトの名無しさん :2005/07/23(土) 14:03:55
//ClassSample.cs public class ClassSample : IComparable { public string name; public int time; public ClassSample(string name, int time) { this.name = name; this.time = time; } public int CompareTo( object obj ) { return 0; } public override string ToString() { string moji; moji = String.Format("{0} {1}", name, time); return moji; } }
887 :
デフォルトの名無しさん :2005/07/23(土) 14:04:32
上のコードを実行すると、 佐藤 830 鈴木 324 田中 2359 と、苗字のあいうえお順に並べ替えられます。 これをClassSampleの2番目の引数の数値を基準に小さい順に 並べ替えたいのですが、どのように書けばいいのかわからず 困ってます。 数値は第一引数に置かなければいけないのでしょうか。 それとも、何か書き方があるのでしょうか。
>>887 CompareToの引数は比較されるオブジェクトなので、
キャストするなりして使う。
返値は比較した結果を返す。0未満なら自分(this)のほうが小さい。
0なら同じ。1以上なら引数のほうが大きい。
public int CompareTo( object obj )
{
ClassSample o = obj as ClassSample;
if(o != null)
{
// timeフィールド同士を比較する
return this.time.CompareTo(o.time);
}
else
{
// ClassSampleと別のクラスが比較された。ここでは現状維持
return 0;
}
}
CompareToは >定義により、すべてのオブジェクトは null 参照 (Visual Basic では Nothing) よりも大きく、また 2 つの null 参照は互いに等しくなります。 >obj パラメータは、このインターフェイスを実装するクラスまたは値型と同じ型である必要があります。それ以外の場合は、 ArgumentException がスローされます。 という実装が要求されることに注意。 //実用上困ることはないと思うが。
890 :
887 :2005/07/23(土) 14:28:34
>>888-889 できました。
CompareToの中身をいじればよかったのですね。
al.Sort(1)とかal.Sort(time)とかal.Sort周りばかりいじってました。
CompareToの中身がどんな仕組みか完全に理解しきってないので、いろいろいじって
試してみようと思います。
どうもありがとうございました。
>>889 見落としとった。
>>890 Sortに投げ込むのはIComparerのほうだな。
動的にソートの条件を変えるならこっちのほうが便利。
あと、MSDN読むことに慣れておいたほうがいい。
892 :
887 :2005/07/23(土) 15:53:31
>>891 アドバイスありがとうございます。
IComparableとIComparerがあるんですね。
IComparerは動的に条件変えれて便利と。
MSDNってわかりにくいので、できるだけ読むのは避けてたのですが
今度から、調べるときにちょくちょく見て慣れておくことにします。
C#やる以上MSDNを避けることは出来ないと思われ 書籍やらネットだとこんな情報得られないしね
最初はSDK(Visual Studioではない)にくっついてくるドキュメントで、 クラスライブラリを調べるのがやりやすいかもしれない。 どうせドキュメントの目的の大半はライブラリのドキュメント調べだし。 それがわかればあとはVS付属のやつもMSのオンラインのも似た要領でどうにかなるな。
895 :
887 :2005/07/23(土) 16:53:07
>>893-894 見るのに慣れたら便利なしろもののようなので、さっきも見てみましたがまだ見ぬくいのですが
ネットで調べてもあまり情報がないものを調べるときに助かるかもと思うので
がんばって見慣れようと思います。
どうもありがとう。
地震を予測したいのですが どうすればいいでしょうか
>>896 1.なんか意味ありげで婉曲的な表現を
適当な日付に表示するプログラムを作る。
2.キバヤシのPCに入れる。
3.あとは自動的にこじつけてくれるので当たる、
当たらないは関係なくなる。
898 :
デフォルトの名無しさん :2005/07/23(土) 18:32:51
The best way to predict an earthquake is to invent it
ナマズ1万匹のエミュレーションを作れ。
emulation 【名-1】 模倣{もほう} ウナギを1万匹用意すればよい。
901 :
デフォルトの名無しさん :2005/07/23(土) 20:19:30
public class RendaAlarmData : AlarmData { } このように既にAlarmDataクラスを継承しているRendaAlarmDataクラスに、更にIComparable を実装しようとすれば、どのように書けばいいのでしょうか。 継承元のAlarmDataは public class AlarmData : IComparable { } のように書いて、既にIComparableが実装されているので、AlarmDataを継承しているRendaAlarmData クラスもIComparableは実装されているので書く必要はないという解釈で正解でしょうか。 public class RendaAlarmData : AlarmData IComparable や public class RendaAlarmData : AlarmData : IComparable とか 書いてみましたが、エラーが出ます。 継承してるからRendaAlarmDataにも実装済みってことになるのかなあと迷ってます。
ヽ、.三 ミニ、_ ___ _,. ‐'´//-─=====-、ヾ /ヽ ,.‐'´ `''‐- 、._ヽ /.i ∠,. -─;==:- 、ゝ‐;----// ヾ.、 [ |、! /' ̄r'bゝ}二. {`´ '´__ (_Y_),. |.r-'‐┬‐l l⌒ | } ゙l |`} ..:ヽ--゙‐´リ ̄ヽd、 ''''  ̄ ̄ |l !ニ! !⌒ // . i.! l .::::: ソ;;:.. ヽ、._ _,ノ' ゞ)ノ./ ` ー==--‐'´(__,. ..、  ̄ ̄ ̄ i/‐'/ i .:::ト、  ̄ ´ l、_/::| ! |: | ヽ ー‐==:ニニニ⊃ !:: ト、 おれたちはとんでもない思い違いをしていたようだ。これを見てみろ。 まず「ナマズ10000」を英字で表記する 『NAMAZU10000』 これを逆にすると、 『00001UZAMAN』 これは暗号になっていると思われるので0000→O4、1→Iと変換すると 『O4IUZAMAN』となる。意味不明な文字列なのでアナグラムと考え 並び替えてみると『ZI4N』と『UMA』と『UO』いう文字が浮かび上がる。 するとできあがる言葉は・・・・・・『地震』と『UMA』と、Fを足して『UFO』。 ここまでくれば間違いない。 つまり!地震はUMAによって起こされるということを暗示しているんだ!!
>>901 public class RendaAlarmData : AlarmData , IComparable
{
}
インターフェイスはこれで複数継承できるが、
クラスは多重継承できない。為念。
>>901 基底クラスのインターフェイスの実装を変更しないのなら、
基底クラスを継承するだけで基底クラスが実装するインターフェイスを扱える。
そうじゃなきゃ変なことになる。
public interface IInterface {
void Do();
}
public class A : IInterface {
void Do() {}
}
public class B : A {
}
public static void Main() {
IInterface ii = new B();
ii.Do();
}
905 :
903 :2005/07/23(土) 20:26:49
ああ、AlarmDataにIComparebleが実装されてる、って部分を見落としてた。
なお、基底クラスが実装するインターフェイスを派生クラスで定義し直す場合のことは、MSDNの C# 言語の仕様 13.4.4 インターフェイスの再実装 を読む。
907 :
901 :2005/07/23(土) 20:34:23
>>903 そのように書けばいいのですね。ただし複数継承できるけど、クラスを2つ以上継承はできないということですね。
>>904 ということは、RendaAlarmDataに
public class RendaAlarmData : AlarmData , IComparable
{
}
と書かなくても、AlarmDataに実装されているIComparableは扱えるので
書かなくても大丈夫なのですね。
>>906 調べて目を通しとこうと思います。
皆さんどうもありがとうございました。これでまた頓挫したところから前へ進めます。
908 :
デフォルトの名無しさん :2005/07/25(月) 10:25:21
IDisposableで質問です。 IDisposable は解放時には便利なのですが、例外発生時の処理はそれぞれを中に書く必要が生じます。 つまり毎回このように↓書かなくてはいけません。 using(...) { try { //処理 } catch { //例外発生時処理 } } これを、こう↓書くだけで、 using(...) { //処理 } あとはIDisposableを実装するクラスで処理したいのですが、可能でしょうか? つまり Disposeメソッドで直前の処理が例外か否かを判定できれば実現できると思うのですが。 IDisposableにCatchメソッドがあったり、ICatchableインターフェイスとかあったら便利なのに・・・ と思ってはいけないのでしょうか。
エラー内容のまんまだろ
//コードに言いたいところは色々あるがおいといて。 いやそりゃthis.allの中にFruitDataとFruitData2があるのに、 なんでもかんでもFruitData2にキャストしようとしちゃFruitDataの方はInvalidCastExceptionが出るだろ。 派生クラスのインスタンスは基底クラスのオブジェクトとして扱えるが、逆は不可なんだから。 キャストできるかどうかの判断のためにインスタンスの型を調べるには is 演算子とか as 演算子を使う。
>>909 それができたとして、
Catchメソッドにどんな例外が投げられるのか分からないのにどんなCatchメソッドを作るの?
デリゲート? try-catchでいいじゃん。
>>909 なんだかしらんが void Commit() { _commit = true; }; とか定義しておいて、
using (..) {
a.hoge;
a.commit();
}
などしてDisposeで ! _commit なら失敗時の処理を行うようにでもしてみては?
915 :
908 :2005/07/25(月) 11:05:25
>>910-911 FruitData2 item = (FruitData2)(it.Current); の部分を
FruitData2 item = new FruitData2();
if(it.Current is FruitData2)
{
item = (FruitData2)(it.Current);
}
と、書き直し、it.Current is FruitData2 でFruitData2か判断してから
FruitData2に入れたところ
ちゃんと、果物タブ2で入れた項目も編集することができました。
いったいどこが問題があるのかさっぱりわからず困っていたので大変助かりました。
どうもありがとうございました。
916 :
909 :2005/07/25(月) 14:40:56
なんか中途半端な書き込みで申し訳ありません。
やりたいことは数多くある既存のコードに対して、部分的に
開始処理・終了処理・例外処理をつけたいということです。
(ちなみにこれらの追加処理は同じクラスのメソッドを呼びます)
ひとつひとつの箇所に以下のようなコードを書くのが面倒なため
もう少しシンプルな方法はないかと思案中でした。
try
{
//開始処理
//【既存の処理】
//終了処理
}
catch
{
//例外処理
}
これらの箇所をメソッドに限定した場合、カスタム属性でも実現可能なのでしょうか?
>>909 すいません、努力します。
>>913 例外の種類は特定されている必要は無いと思います。
GetType()で調べられるし、方法はいくらでもあると思います。
>>914 それはいけるかもしれません。検討してみます。
ですが、できればその「commit()」の部分を無くしたいのです。
917 :
909 :2005/07/25(月) 14:42:04
アンカーミスりました。
>>912 すいません、努力します。
>>916 基本的に
・「構造化例外」の概念を分かってない
・IDisposable.Disposeの概念を分かってない
と思われる。
そのメソッドローカルで扱うオブジェクトをどのように扱うかは
そのメソッドの責任。オブジェクトに責任はないから混ぜるな。
一番近い概念はTransactionだろうがそれはC#言語には現状
組み込まれていないし、RollBackやCommitはどっちにしろ
必要なので、そんな組み込まれ方はしないと思うよ。
それとそのコードはおかしい。
try {
//処理
} catch(Exception) {
//例外処理
} finally {
//終了処理
}
こう。
>>918 ご指摘ありがとうございます。
IDisposableの概念的には理解していたつもりですが、
応用の例として使えたら便利かも、ということで話に上げました。
手法として良くない様でしたら別の良法を選択します。
コード例を記述して頂きましてありがとうございます。
トランザクションの場合には確かにそのようになるのですが、
今回は成功か否かで処理を分けたいのです。
finallyにて共通の終了処理は必要ではありません。
以下のような処理が汎用化できるかどうかを知りたいのです。
try
{
//開始処理
//既存の処理
//成功時処理
}
catch
{
//失敗時処理
throw
}
920 :
909 :2005/07/25(月) 16:20:14
何度もすいませんが補足です。 解放と例外は常に密接な関係を持っています。 解放処理はIDisposableで切り出しの汎用化が可能となっているのに 例外処理はtry-catch-finallyの構造を維持し続けなければならず、 拡張性が低いと思います。 なのでICatchable(ITryable?)なる切り出し用のインターフェイスがあっても良さそうなもの、 と思った次第なのです。
(゚听)イラネ
charをSystem.Windows.Forms.Keysに変換する方法はありますか?
あんまりないな。 ある程度の範囲(0-9A-Zあたり)ならintにキャストしてからKeysにキャストしてやればいいが。
924 :
922 :2005/07/25(月) 19:24:22
>>923 それで十分です。ありがとうございます。
あのね、説明すると、 ・終了時処理の勘違いがある。 IDisposable.DisposeはGCの動作の想定している理想状態ならば必要ないもの (つまりすべてのリソースが無限に存在する)だが、現実の問題としてDBの コネクション等リソースは有限でクリティカルなものがある。そういうもの「のみ」を想定して いて「クリティカルリソースを開放してもよいというフラグをオブジェクトに通知する」のが IDisposable.Disposeなの。もっと言えば実は終了処理なるものとはまったく関係がない。 終了処理に破棄処理(IDisposable.Dispose)を含めるかどうかはメソッド側の責任。 ・構造化例外の勘違い try句の中に書くものは成功時&失敗時処理(?)等「すべての処理を含める」のが普通。 もっと言えばtry句は「(例外条件を除いて)成功することを強く想定してかくべき」。 なんていったらいいかな、「try-catch構文って言うのはif文のように処理フローを分岐させる ためにあるわけではない」とか?ぶっちゃけていえばフローチャートをかいたときにその中には (catch句は)絶対にかかない。 メソッドというか手続きを書くときには絶対「想定条件」というものが設定される。例を 挙げればまず間違いなくほとんどの手続きで想定されているのが「メモリがたりなくなる ことはない」とか。何でかっていえば、すべての条件を想定して書けばコードは非常に 複雑になるから。条件を設定する必要性を認め、その場合でも問題のないようにかくことを 可能にしたのがtry-catch構文。 きみはtry-catchに「例外が発生すれば失敗」等の考え方を抱いているようだが違う。 例外発生は「想定条件外事象が発生した」以上の意味はない。それが失敗かどうかは メソッド側って言うかcatchした側が決める。 >解放と例外は常に密接な関係を持っています。 これがそもそも変で君が勝手に結び付けてるの。分けるのが合理的だと考えたから こうなっていることを理解すべき。拡張性が低いというのはむしろ君の考え方のほうが 低い(しかも実用に耐えないほど)。
長い
>>909 が何を言いたいのかいまだに理解できない。
>>927 多分こうだろうという推測。
・using句の意味を変更。
IDisposableだけじゃなくICatchable(仮)を実装するオブジェクトにも適用できるようにする。
・ICatchableはCatchメソッドを定義。Catchメソッドはusing句の終了時に自動的に呼び出される。
・Catchメソッドの仮引数にはExceptionがあり、
using句が正常に終了した場合はnull、例外が発生した場合は発生したExceptionが渡される。
・発生した例外はCatchメソッド終了後自動的に再スローされる
要するにusing句に使えるからと安易にDisposeを出してきたのが混乱の原因。
個人的にはこんな機構イラネ。
状況によるとは思うが、 try{ using(…){ } } catch(…){ } finally{ } ってのが多いと思う。 using(…){ try{ } catch(…){ } } ってどういうことよ
これだけ言ってもまだ
>>909 は( ゚Д゚)ポカーンとしている希ガス。
933 :
927 :2005/07/25(月) 23:02:34
漏れもまだポカーンとしている。 例外とIDisposableの意味を根本的に誤解しているような気はするが、 ああ、結局何がしたいのかさっぱりわからん。
携帯でコマンドボタンを押してもSessionID みたいに セッションを識別する良き方法を知りたいのですが
935 :
デフォルトの名無しさん :2005/07/25(月) 23:42:49
app.configの1つの項目にデータを複数定義ってできるの? <add key="DataPath" value[]={"E:\" , "C:\"} /> みたいに。できないなら別の方法を教えてください。できるならデータの取得方法を教えてください. よろしくお願いします。
取りあえずその気の狂ったXMLは勘弁。 適当に区切り文字で区切れば良いんじゃね? 取り出す側が分割する。
937 :
デフォルトの名無しさん :2005/07/26(火) 06:45:32
自作アプリ内の[フォームA]から[フォームB]へのD&Dで Bが前面にある状態のまま、AにあるオブジェクトをD&DでBに移したいと思った時 どのタイミングでDoDragDropを実行すればよいのでしょうか? 現在、AのあるUserControlにMouseDown>MouseMove時にDoDragDropを発行しているのですが MouseDownした瞬間にAが前面に出てきてしまいD&Dがしにくい感じになってしまったいます。 WindowsでExploreを二つ立ち上げてウィンドウ間でのD&Dでは ちゃんと背面のウィンドウが背面のままD&Dできているのでそのようにしたいのですが
938 :
909 :2005/07/26(火) 09:10:28
IDisposeを話題にしたのは終了処理というイベントを using というステートメントで
安易に実現できるのが便利だから、という理由です。
別に解放処理云々は割とどうでも良いです。
なので
>>925 さんとは少し論点が違います。
前にも言いましたが、特定の場所のコードに対し、安易なアプローチで
終了処理を汎用化できる手段の例、として話に出したまでです。
>分けるのが合理的だと考えたからこうなっていることを理解すべき。
分かれたのではなく、もともと別ですよね。何も無理矢理一緒のステートメントでやるべきだ、
なんて思ってません。ただ、例外用のインターフェイスが用意されていて、
プログラマの一つの選択肢としてあっても良いのではないか、という単なる思いつきです。
>>929 さん
>要するにusing句に使えるからと安易にDisposeを出してきたのが混乱の原因。
今のところusingはIDisposeしか対応してないですね。(元々それだけのためなのでしょうけど)
もっと色々なインターフェイスに対応すれば更に柔軟になると思うのです。
確かにusingがなければ余計な混乱はなかったかもしれません。
でも記述量は減りますよね。ILはtryステートメントと同様のコードになるようですし。
ttp://www.divakk.co.jp/aoyagi/csharp_tips_using.html これは余談ですがVC++2005での情報です。
ttp://mag.autumn.org/Content.modf?id=20050506023118 主たる疑問は、類似した例外処理(に関わる同様の処理)は如何に汎用化できるか、です。
既存のコードへの手入れを最小限にして同様の処理を組み込める手段を模索しています。
>>938 > >要するにusing句に使えるからと安易にDisposeを出してきたのが混乱の原因。
> 今のところusingはIDisposeしか対応してないですね。(元々それだけのためなのでしょうけど)
> もっと色々なインターフェイスに対応すれば更に柔軟になると思うのです。
> 確かにusingがなければ余計な混乱はなかったかもしれません。
> でも記述量は減りますよね。ILはtryステートメントと同様のコードになるようですし。
ここを読み違えるか……
もうなんかみんな変だよ、おかしいよ
ICatchableというインターフェースがあって、Catchというメソッドがあったとして、そこに何を書くのさ。 IDisposableのDisposeメソッドは、実装するクラスの破棄処理だが、 汎用的な「失敗時処理」とはなんだ?
class HogeStream : Stream, ICatchable{ public void Catch(Exception ex){ //? } } using(HogeStream hs = new HogeStream()){ } ここまで頭に思い浮かべたのだが、普通にHogeStreamのメソッドで、例外をスローするメソッドの中で処理を行えば済む話
ああ、つまりこーいうこと? class HogeStream : Stream, ICatchable{ public void Catch(Exception1 ex){ //失敗したときの処理1 } public void Catch(Exception2 ex){ //失敗したときの処理2 } public void Finally(){ } } class Hoge { using(HogeStream hs = new HogeStream()){ //既存のコード } } Catchメソッドをどうやって複数実装するのかわからんけど
いままでのcatchに書く処理を、あらかじめクラスのCatchメソッドに書きたいってことだろ。 例外をスローするメソッドに書けばすむ話なのだが。
>>943 それは実装できないだろ。CatchがExceptionを受け取ってその内部でisとか使って判断してやるんだろうな。
うむ必然性がわからん。
エラー処理はユーザに近い上位層でやるのが基本だろ そもそもエラーをどうしたいか、そのクラスには判断できないから スローしているのであって。 なんか考え方が根本からおかしいぞ
>>946 HogeStreamのWriteメソッドが例外をスローするとして
HogeStreamのCatchメソッドでそれを受けて何か処理をするぐらいなら
最初からWriteメソッドに処理を書けばいいじゃないか
909はtry-catchとは違ったやり方で例外処理できないか、って言いたいの?現状ではそうすべきではないでしょ。 仮に違う手法でできるとしても、新しい構文やインターフェイス?がもっと整備されないとダメじゃないかな。
>>948 例外をスローするのはusingを使うクラスじゃないのか?
>>943 どうでもいいがHogeクラスにはメソッドが必要と思われる。
はぁん
具体例きぼんぬ
>>909 こういう機構があったら、いままでこう書いてたコードがこんなに短くできて便利ですよーとか。
サンプルコードが欲しい。
こんな感じ? using System; public interface ICatchable : IDisposable { void Catch(Exception x); } public class Test : ICatchable { public void Catch(Exception x) { Console.WriteLine("Catch: " + x.Message); } public void Dispose() { Console.WriteLine("Dispose"); } public void DoTest() { Console.WriteLine("Test"); throw new Exception("m9(^Д^)プギャー"); } }
使用例はF#で。C# 3.0になれば、Extensionで文法拡張がある程度できるようになると思われ。 let using2 (ic :> ICatchable) f = try try f() with x -> ic.Catch(x) finally ic.Dispose() let obj = new Test() let _ = using2 (obj) begin fun () -> obj.DoTest() end (実行結果) Test Catch: m9(^Д^)プギャー Dispose
>>953 Catchメソッドを自前で追加しても意味ナイト
957 :
952 :2005/07/26(火) 13:20:21
やりたいことはわかったが、どんな状況においてその機能が役立つのかがわからない。 DoTest内でthrowする代わりにCatchを呼んじゃいけないの?
>>957 DoTest内で例外投げてるのはとりあえずテストということで、
本来ならusing2ブロック内のどこかから例外が飛ぶことを想定してます。
960 :
952 :2005/07/26(火) 14:06:43
>>958 あーなるほど。
でもやっぱり、それが役に立つ状況ってのが想像しがたいんですが。
自分のクラス以外から例外が飛んだとして、Catchでそれを受けて一体どんな処理を行えというのか。
>>960 例外発生イベントの代わりみたいなもんですかね。
WinFormsのApplication.ThreadExceptionみたいなやつ。
結局
>>909 への最終的な回答としては「C# 3.0を待て」ということでいい?
>>962 つ[Extension Methods, Lambda Expressions]
なんだ、C#とICashable(仮)を絡めて欲しいって要望かよ。 そんなのはM$に言えよ。このスレで揉めたって永遠に実装されんよ。
×ICashable ○ICatchable
>>963 は変態的と言いたいんだろう、そうだろう
968 :
デフォルトの名無しさん :2005/07/27(水) 01:15:45
>>962 つか、C#が3.0まで持つかどうかが最大の問題では?
969 :
デフォルトの名無しさん :2005/07/27(水) 01:36:22
「ほげABCDEFGこんにちは」 というような文字列の”ABCDEFG”だけを半角にしたいのですが、 str.Replace("A", "A"); のように文字数分繰り返す以外の簡単な方法はないでしょうか。
Microsoft.VisualBasic.dllを参照に追加して Microsoft.VisualBasic.Strings.StrConv
>>969 Regex.Replace あたりでカスタム変換
973 :
デフォルトの名無しさん :2005/07/28(木) 18:58:17
2005は今年中にでるの?
>>973 英語版が11月だから、年末ギリギリぐらいじゃない?
975 :
デフォルトの名無しさん :2005/07/28(木) 21:10:01
3月までに出ないと身内から学生がいなくなってしまうよ。
976 :
デフォルトの名無しさん :2005/07/28(木) 21:16:31
はじめましてなんとなくかくことにしました。
977 :
デフォルトの名無しさん :
2005/07/28(木) 21:31:00 今日夜10:00から電車男があります。 見ますか