C♯相談室 Part24

このエントリーをはてなブックマークに追加
1名無しさん♯

(#゚ー゚)つ < C#、.NETの話題はこちらでどうぞ。


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


関連リンク
http://onigiri.s3.xrea.com:8080/csharp/index.php?%5B%5B%A5%EA%A5%F3%A5%AF%5D%5D
2名無しさん♯:2005/06/01(水) 22:03:54 BE:236998087-
3名無しさん♯:2005/06/01(水) 22:04:33 BE:190445459-
4デフォルトの名無しさん:2005/06/01(水) 22:08:58
>>1
おつ
5デフォルトの名無しさん:2005/06/01(水) 22:09:46
>1
もつ
6デフォルトの名無しさん:2005/06/01(水) 22:36:02
キター
今回は立つの遅めだったねw
7デフォルトの名無しさん:2005/06/02(木) 00:15:38
アプリが終了する時に実行したい処理があって、それが時間を使う処理の場合
どのように記述するのがよいのでしょうか
ためしにAppDomain.ProcessExit で記述して
Enviroment.Exit(0)を実行してみてもスキップされてしまうのですが
private static void CurrentDomain_ProcessExit(object sender, EventArgs e)
{
Console.WriteLine("CurrentDomain_ProcessExit");
while(true);
}
8デフォルトの名無しさん:2005/06/02(木) 08:54:27
コントロールからGraphicsオブジェクトを生成するにはCreateGraphics()
というメソッドがありますが、例えばImageとかBitmapからGraphicsオブジェクト
を生成する方法はないでしょうか。

要するに、画面に見えない所でGraphicsの描画メソッドをImageなどに適用
しておき、それを返す関数などを作りたいのです。何かいい方法があったら
ぜひご教授下さい。
9デフォルトの名無しさん:2005/06/02(木) 09:00:28
>>8
Graphicsのメンバをよーく調べてみ?
10デフォルトの名無しさん:2005/06/02(木) 09:12:22
>>9
ありがとうございました!FromImage()というメソッドがありました。
これで早速やってみます。
11前スレ919:2005/06/02(木) 13:40:25
↓「開始」をクリックしたら「中止」ボタンを有効にして、終わったら
もとに戻しています。「中止」をクリックすると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のほうに持ってくると、今度は終了時に
無効になった「中止」ボタンにフォーカスが残ってしまいます。
12デフォルトの名無しさん:2005/06/02(木) 13:45:53
>>11
UIスレッド以外のスレッドからコントロールをいじるのにはInvoke/BeginInvokeを使えと。
1311:2005/06/02(木) 15:00:54
>>12
ぬはぁっ、即効で解決しました。感謝します。ムチだな俺・・・
前と後ろそれぞれ別メソッドにしてデリゲート作ってInvokeしました。
14デフォルトの名無しさん:2005/06/02(木) 16:28:23
IntPtr型の変数が指すint型のデータを読み込むにはどうすればいいですか?
C/C++も使っているので、ポインタの考え方が身に染みついてしまっています。
1514:2005/06/02(木) 16:35:07
分かりました。Marshalを使う必要がありそうですね。
ReadByte()とかReadInt32()とか・・・・ポインタも使おうと思えば
使えますが、あまりC#らしくないプログラムにしたくないので。
16デフォルトの名無しさん:2005/06/02(木) 18:12:19
ポインタも使えるのまで含めて「C#らしさ」だと思うんだがなー。
IntPtr/Marshal使うのもunsafe/ポインタ使うのも実際かわらんし。
17デフォルトの名無しさん:2005/06/02(木) 18:45:48
正直C#を使う前は、CLRなぞ遅いだろうとたかをくくっていたら、
実際使ってみるとこれがなかなか速い。そりゃC/C++で書いた物に
比べれば遅いだろうが、開発時間がとても短くなる。コンパイルも速いし。
18デフォルトの名無しさん:2005/06/02(木) 19:43:52
どっちかっつーと起動時間が遅いのがあれだな。特にWinFormを使ったやつは。
19デフォルトの名無しさん:2005/06/02(木) 20:01:05
>>18
それはあるな。DLLを山ほど読み込むし、あれだけライブラリが豊富
なら仕方ないかと思う。メモリも多量に食うしね。Javaは体質的に
受け付けないが、C#ならすんなり使えた。(そんなに変わらないという
話もあるが、Windowsとの相性はC#の方が絶対上。メーカー一緒
だもんね)
20デフォルトの名無しさん:2005/06/02(木) 21:13:14
>>17
結局実行される直前にネイティブコードになるわけだしね。
21デフォルトの名無しさん:2005/06/02(木) 21:22:59
>>20
そうだな。それに必要とあらば、ngenを使って初めからネイティブに落として
おく手もあるし。これでも環境が変わったら(64bitとか)ちゃんとJIT動かしてくれるらしいし。
22デフォルトの名無しさん:2005/06/02(木) 22:42:00
遅延初期化とか駆使すれば多少起動は速くなる。
23デフォルトの名無しさん:2005/06/02(木) 23:13:16
おい、おまえら。
まずは旧スレ埋めようぜ
24デフォルトの名無しさん:2005/06/03(金) 01:14:48
999 :デフォルトの名無しさん[sage] :2005/06/03(金) 01:03:36
任せた


1000 :デフォルトの名無しさん[sage] :2005/06/03(金) 01:04:15
Java!!!
25デフォルトの名無しさん:2005/06/03(金) 02:01:18
Graphics.DrawImageの速度に関してなんだけど。
ソースの領域同じ、描写先の領域も同じで、
元のイメージの大きさが違うときにやたら速度に差が出るのってなんとかならなりません?

2000x2000の画像の一部分をDrawImageをしたらやったらと遅い。
26デフォルトの名無しさん:2005/06/03(金) 07:36:13
それはGDI+が遅いんじゃないの?
27デフォルトの名無しさん:2005/06/03(金) 11:40:59
C#でCSVを高速で読むのってなんかあるかなぁ?

splitで読むとなんか遅いんですが。。。
2827:2005/06/03(金) 11:55:24
CSVの容量は300MBぐらいで
C++で作ったものだと10秒
c#だと20秒かかります。(Split使用)

うーむ、、、なんとかC#を勝たせてあげたい。。。orz
29デフォルトの名無しさん:2005/06/03(金) 12:27:37
流石に勝つのは無理だ。
Splitの代わりに正規表現とか頭から舐め回してSubstringとかどうよ。保証はしないが。
30デフォルトの名無しさん:2005/06/03(金) 12:41:12
SplitってどのSplitだ?
Microsoft.VisualBasic.StringsクラスのSplitやSystem.Text.RegularExpression.RegexクラスのSplitもあるぞ
31デフォルトの名無しさん:2005/06/03(金) 12:48:23
C#スレなんだからRegex.Splitの方じゃねーの?
3227:2005/06/03(金) 13:29:29
んと、普通いっぱんに
filestreamで読んで、Readlineでstringとって、splitしてるです。
正規表現つかうと更におそくなるからつかってないです。
33デフォルトの名無しさん:2005/06/03(金) 13:53:39
引数に文字列を取るメソッドを作ってるんですが、文字列がnull参照だった場合、
String.Emptyと扱うほうが良いのか、ArgumentNullExceptionを投げたほうがいいのか…

メソッドの処理の内容は、文字列が空なら空で何の問題もない処理です。

34デフォルトの名無しさん:2005/06/03(金) 13:57:34
>>33
作る側の事情によるが、俺ならString.Emptyとして扱う。
35デフォルトの名無しさん:2005/06/03(金) 14:03:14
nullに特別な意味を持たせる必要がないのなら空文字列で良いんじゃない?
36デフォルトの名無しさん:2005/06/03(金) 14:40:46
>>25
Graphics.InterpolationModeがコストの高い設定に
なってない?
37デフォルトの名無しさん:2005/06/03(金) 15:22:11
C#、コンソールアプリを作成したのですが、当たり前に
コンソールが一瞬表示されます。(そりゃそうですが・・・)

コンソールを表示したくない場合は、どうしたらいいでしょうか。
ご存知の方、よろしくご教授ください。
38デフォルトの名無しさん:2005/06/03(金) 16:17:27
Windowsアプリケーションで出力すれ。
39デフォルトの名無しさん:2005/06/03(金) 17:01:11
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);

こんな感じでやってるんですけど、色ごとの変化がうまく行かず、明るさだけ変化
しているようなおかしな感じなんです。ぱっと見変な所があります?
40デフォルトの名無しさん:2005/06/03(金) 17:34:59
>>39
なんでr,g,bがbyteなのかとかFormArgb().ToArgb()ってコスト高そうとか些細な疑問はあるが、
特に問題はなさそうだが。

rf, gf, bfが同じ値とか言わない?
ん、LockBitsするときにPixelFormat.Format32bppArgbでロックしてるよね?
41デフォルトの名無しさん:2005/06/03(金) 18:03:35
>>40
レスありがとうございます。

rf、gf、bfを変化させて色調をいじります。例えば赤を強くしたい時にはrfを1.1位に
するとか、そういう感じです。

LockBitsする時はPixelFormat.Format24bppRgbでロックしています。これを
おっしゃる通りPixelFormat.Format32bppArgbでロックしてみたりもしているん
ですが、症状は全く変化無しです。

FromArgb、ToArgbは、Color構造体にコンストラクタがないのでこうやっちゃって
ますが、普通にビット演算でARGB32ビット作り出した方が速いですね。
早速試してみます。

画像は今一種類のみで試してみていますが、もっといろんな画像でテストして
みたいと思います。もしかしたら画像の色分布が悪くて、変化がわかりにくいの
かもしれません。
42デフォルトの名無しさん:2005/06/03(金) 18:04:33
>>40
それと、r, g, bもintにしてみます。考えられるのはここら辺ですし。
43デフォルトの名無しさん:2005/06/03(金) 18:12:51
ReadInt32/WriteInt32の第二引数は"バイトオフセット"。Int32を順に読むなら4つずつずらしていかないと駄目。
あ、Rgbだったら3バイトずつか。
> for (int x = 0; x < w * 3; x ++) {
だと1ピクセルずつじゃなくて1色ずつになっちゃうぞ。
44デフォルトの名無しさん:2005/06/03(金) 18:17:51
>>43
それでした。初歩的なミスでした。
C/C++だと勝手に4バイト飛びにポインタを替えてくれる癖が抜けきって
いませんでした。もっと精進します。ありがとうございました。
45デフォルトの名無しさん:2005/06/03(金) 18:22:42
あ、それと言い忘れました。

>>40
わかりもしないなら偉そうに書き込まないでください。
4644 ◆yl7ZecjHlY :2005/06/03(金) 18:34:04
>>45は私じゃありませんので。>>40さんは怒らないで下さい。
47デフォルトの名無しさん:2005/06/03(金) 19:07:54
VC♯2005EE betaってヘルプは英語のみですか?
48デフォルトの名無しさん:2005/06/03(金) 20:02:29
>>27
C#だとbyte[] <--> Stringでエンコーディングの変換が発生するから
遅いというのもあるだろう

StreamReader#ReadLine()とか使わずにバイトのまま処理したらどうよ。
行・フィールド分解はunsafe使ってポインタ操作で。
49デフォルトの名無しさん:2005/06/03(金) 20:04:54
>>48
そこまで行くと素直にC/C++を使おうと思わない?
50デフォルトの名無しさん:2005/06/03(金) 20:12:04
>>49
いや、>>27はなんとかC#に勝たせたいんだそうだから。
俺ならC#使う時点で多少のパフォーマンスは気にしないけどな。
51デフォルトの名無しさん:2005/06/03(金) 22:32:32
Winアプリでデータグリッドとツリーコントロールが合体したものが欲しいのですが、
どなたか、そのようなサンプルコードをご存知ないでしょうか?

階層化できるデータグリッドというか、グルーピングというか、たためるグリッドというか、
例えば、Outlookのメールのサブジェクトビューのように、「日付:先週」で畳める感じで。

階層の深さは親子ではなく、任意にしたいんです。
左にツリービュー、右にリストコントロールを並べても、ツリーノードの1と2を展開して、
3と4を畳んだ表示とかが不可能です。

http://www.codeproject.com/cs/miscctrl/csharpgridcontrol.asp
の作者が、協力してくれるなら自分が途中まで作ったものを提供すると書いてますが、
自分の技術に自信が・・・
52デフォルトの名無しさん:2005/06/03(金) 22:52:55
>>51
商用ならTreeView + DataGridもあるんだけど。
TreeView + DataGridじゃなくてTreeView + ListViewでいいならTreeListViewで検索。
例えば...

The Code Project - TreeListView - C# Controls
http://www.codeproject.com/cs/miscctrl/treelistview.asp

[C#] TREELISTVIEW
http://www.csharpfr.com/code.aspx?ID=27623
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行目に問題があると思うのですが、どうすれば正常に動くのかが分かりません。
どうすれば正常に動くのか、ご教授いただけると有難いです;
54デフォルトの名無しさん:2005/06/03(金) 22:59:00
new test[10];
この時点ではtest[]オブジェクトを作っただけで、それぞれの中身はnull。
55最凶VB厨房:2005/06/03(金) 23:00:10
for(int i=0;i<10;i++)
{
test[i]=new test();
}
56デフォルトの名無しさん:2005/06/03(金) 23:26:14
なんつーかFAQだな。
57デフォルトの名無しさん:2005/06/03(金) 23:33:40
C++だとデフォルトコンストラクタが呼ばれるからな
元C++ユーザなのかもしれん


多分違うけど
58デフォルトの名無しさん:2005/06/04(土) 00:50:17
C#に慣れたら、C++やDelphiの文法が汚く思えるようになった。
C++はまだ許せるとして、DelphiはPascalベースなのでちょっと考えると
綺麗そうに思えるが、実際はあちこちつぎはぎだらけの拡張で汚い。
59デフォルトの名無しさん:2005/06/04(土) 01:28:01
うん、C系はBasic系よりすっきりしてる
6053:2005/06/04(土) 01:36:55
>>54,55
解決しました。
お陰様で助かりました、
どうもありがとうございましたm(_ _)m
61デフォルトの名無しさん:2005/06/04(土) 08:05:39
>>58
後出しした方が洗練されているのは当然
ということはDのほうが上の可能性もあるのか
62デフォルトの名無しさん:2005/06/04(土) 09:47:46
あとで出して汚かったらある意味凄いな。
63デフォルトの名無しさん:2005/06/04(土) 09:57:34
個人的にDはちょっとみてみた感じ多機能性に主眼が行っていてあんまり洗練はされてないと思ふ。
64デフォルトの名無しさん:2005/06/04(土) 14:42:22
C#の強力なRADを開発した人って、元々BorlandでVCLを作っていた人が
Microsoftにヘッドハントされたんだっけ?使い勝手がDelphiそっくりなんですけど。
65デフォルトの名無しさん:2005/06/04(土) 16:18:21
C#の言語仕様を策定した人とDelphiのそれを策定した人は同じだけど、
IDEはわかんねえな
66デフォルトの名無しさん:2005/06/04(土) 16:32:30
DelphiのIDEそのものを知らないが、VC#のIDEはVBからの流れじゃないの?
.NETに対応したDelphi8が出たときの紹介記事を読む限り、IDEの操作性がVSに近づいたとかそう言う論調が多かったし。
67デフォルトの名無しさん:2005/06/04(土) 16:47:50
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"
に変換することってできないんでしょうか。
69デフォルトの名無しさん:2005/06/04(土) 17:41:51
>>66
RADという物がメジャーになったのがVBから。
それを真似たのがDelphi。
70デフォルトの名無しさん:2005/06/04(土) 17:47:43
>>68
いいたいことはサッパリわからんが置換すれば?

>>61
でもjavaより汚い気がする。
デストラクタ+ファイナライザ+IDisposeとか
プロパティとか例外処理とか色々。
71デフォルトの名無しさん:2005/06/04(土) 17:50:26
>>70
俺は逆だなー。
基本的にすべてobjectの派生として通してるところとか。
72デフォルトの名無しさん:2005/06/04(土) 17:53:19
プロパティは状態を巧く隠蔽する良い解決だと思ってる。
やっぱり状態と動作は区別すべきだと思うし。
73デフォルトの名無しさん:2005/06/04(土) 17:53:57
>>70
たしかにいいたいことはわからんが・・・置換できるのか?
>>68
ソースより先に日本語直せ。
74デフォルトの名無しさん:2005/06/04(土) 17:58:00
>>70
デストラクタとファイナライザって同じでは?
IDisposeの管理は確かにめんどくさいけど。
75デフォルトの名無しさん:2005/06/04(土) 17:58:24
>>68
もうちょっと現状の整理を
PATH が null になる状況は端から見てありえない

>>72
プロパティは、java では別々に用意する必要がある setter と getter を纏めてある以上、
無駄にメソッドが増えなくて良いかもね

>>73
置換は String.Replace だけど、null はそもそも置換できないよな
76デフォルトの名無しさん:2005/06/04(土) 17:59:14
>>74
java でも、ファイル操作とかは close しなくちゃいけないから、むしろ IDispose でまとめて using した方が楽かと
77デフォルトの名無しさん:2005/06/04(土) 18:13:33
>>76
JavaがC++使いに受け入れられない最大の理由がそこだからね
78デフォルトの名無しさん:2005/06/04(土) 18:31:48
>>70
プロパティはCLR的にはただsetterとgetterをまとめた
という程度の意味しかもたないけど、
クラスライブラリ的にはコンポーネントの基本要素としての性質
があって、System.ComponentModelとかTypeDescriptorあたりのことが
分かってくると、無駄にメソッドが増えないとかそういうレベルの恩恵ではない
と思いますよ。
MSとかがC#のことを「コンポーネント指向言語」ってよんでる理由が
この辺にあるんだろうと思ってますけど。

IDisposableも確定的デストラクションのギミックとしてはusingとかで
最低限の使い勝手にはなってるだろうし、2.0での拡張とか見てると
なかなか面白い発展性を持ってるです
79デフォルトの名無しさん:2005/06/04(土) 18:40:06
両方あるでしょ?で、それが混乱するって言いたいんです。
さらにIDisposeもあるし。

例外処理もメソッドの宣言みても何を投げるかわかんないから
ついつい全部キャッチするようなの書いちゃったり。

プロパティはアクセス制限がセッタとゲッタで分けられないのが不満なのと
パブリック変数かメソッド呼び出しなのかハッキリしないのが。
80デフォルトの名無しさん:2005/06/04(土) 18:44:08
>>79
??
デストラクタとファイナライザは同一のものだし、
こいつらは何時実行されるかわかんないから IDispose があるんじゃ?

throws は納得
81デフォルトの名無しさん:2005/06/04(土) 18:47:20
>>79
> プロパティはアクセス制限がセッタとゲッタで分けられないのが不満なのと
.NET 2.0/C#2.0で分けられるようになった。

> パブリック変数かメソッド呼び出しなのかハッキリしないのが。
まさにそのように隠蔽するための物なんだが……。

throwsは欲しいねぇ。
82デフォルトの名無しさん:2005/06/04(土) 18:55:36
>両方あるでしょ?で、それが混乱するって言いたいんです。
>さらにIDisposeもあるし。
??ないよ。「ファイナライザはデストラクタ構文によって書かれる」
だけだし、IDisposableがないと、確定的デストラクションは
どうするのさ?

>例外処理もメソッドの宣言みても何を投げるかわかんないから
>ついつい全部キャッチするようなの書いちゃったり。
これは基本的には同意なんだが、例外処理ではjavaとは
ちょっと発想というか考え方が違うので、その辺のことを書いた
本とか読んでみるといいよ。

>プロパティはアクセス制限がセッタとゲッタで分けられないのが不満なのと
2.0で解決済み

>パブリック変数かメソッド呼び出しなのかハッキリしないのが。
そもそもパブリック変数基本的に禁止
83デフォルトの名無しさん:2005/06/04(土) 18:55:45
throwsつけたときdelegateはどうすんだ?
84デフォルトの名無しさん:2005/06/04(土) 18:57:27
2.0はすげえよ。
javaの進化が遅すぎるのかC#が速すぎるのか知らんが、
すげぇよ。
85デフォルトの名無しさん:2005/06/04(土) 18:58:16
>>79
> パブリック変数かメソッド呼び出しなのかハッキリしないのが。

パブリック変数かメソッド呼び出しかはっきりしていないと
利用できないような設計ならば、
きっと設計が間違っている。
86デフォルトの名無しさん:2005/06/04(土) 19:22:28
>>82
別の機能というか構文が2通りあるでしょ。
>確定的デストラクション
これがC++だとデストラクタ。javaだとfinallyではっきりしてるけど
C#だとひとつじゃないから機能を詰め込みすぎな気がする

>>85
他人のソース見たときね。

javaが出て10年後ってこと考えると
言語仕様が練れてないと思わない?

個人的にいいなと思った機能はオーバライドを明示する必要があるってとこだけだ。
87デフォルトの名無しさん:2005/06/04(土) 19:30:52
>>86
> 他人のソース見たときね。

意味わかんね。
88デフォルトの名無しさん:2005/06/04(土) 19:31:49
>>86
>別の機能というか構文が2通りあるでしょ。 

C# では
    ~ClassName() {}
の一択だから、構文は1つだけ


>これがC++だとデストラクタ。javaだとfinallyではっきりしてるけど 

finally はデストラクタではない
89デフォルトの名無しさん:2005/06/04(土) 19:37:41
お前ら、C#のファイナライザとデストラクタは別物だぞ。
デストラクタはコンパイル時にファイナライザに置換され、”最後に基本クラスのファイナライザを呼び出すコードが付加される”
ファイナライザを明示的にオーバーライドしたときはそういうことは行われない。
90デフォルトの名無しさん:2005/06/04(土) 19:40:42
>>89
C# では、Object.Finalize を独自にオーバーライドすることは出来ない
デストラクタ構文を使う
91デフォルトの名無しさん:2005/06/04(土) 20:00:43
>>87
すんません。人の作ったクラス使うとき。

>>88
>finally はデストラクタではない
すんません。finallyに終了処理を書く

あと構造体も有るの、ややこしくない?
92デフォルトの名無しさん:2005/06/04(土) 20:03:35
あー。すいません。しつこすぎた。
93デフォルトの名無しさん:2005/06/04(土) 20:07:23
>>91
> すんません。人の作ったクラス使うとき。
に、設計が間違っているのか?
話がつながっていなくないか?

> あと構造体も有るの、ややこしくない?
使う必要がなければ使わなくてもなんとかなるよ。

代入文が、構造体とクラスで振る舞いが違うが、
変数名、クラス(構造体)名を見ただけではどっちかわからないのが
C#の問題かなと漏れは思った
逆に変数名で構造体とクラスが判別できても
気持ち悪いが。
94デフォルトの名無しさん:2005/06/04(土) 20:08:16
まあJavaは出発点がいかにC++から不要なもんを殺ぎ落とすかみたいな感じだからな
後で結局Genericsとか追加する羽目になっとるが

C#のプロパティはまあ、MSのCOMの経験に基づいてるんじゃないかな
C++でプロパティが使えないのはやはり不便だと
まあVC++の場合はプロパティライクな記法が使えるけどな
95デフォルトの名無しさん:2005/06/04(土) 20:10:05
>>86
だからな、C++が確定的デストラクタなのはわかってるわけよ。
そうじゃなく、C#はGCのために確定的デストラクションは出来ない
から「デストラクタ構文はファイナライザ」になってるわけだ。んで、
>>88-90 のようにファイナライザの構文は一つだろ
っていうかJavaだって確定的デストラクタのない状況は
GCつかってるんだから一緒だろ。
必要性を認めてIDisposableとusing、Containerを用意してるC#とどっちがましだよ

んで、パブリック変数は「基本的に禁止」なんだ。
「プライベートなネストクラス」とかなら「許される」程度だ。

>個人的にいいなと思った機能はオーバライドを明示する必要があるってとこだけだ。
こんなこといってる段階でC#は聞きかじった程度の知識しかない
と思ってしまうよ
96デフォルトの名無しさん:2005/06/04(土) 20:11:12
>> あと構造体も有るの、ややこしくない?
> 使う必要がなければ使わなくてもなんとかなるよ。

この、「使わないものには害をこうむらない」というNo overhead ruleは
C++の理念だけど
それを積み上げてああバカでかくなったことを思うとねえ。

C#には言語設計思想のポリシーがないというと言い過ぎだが、
要するに実用よりなんだと思う。
97デフォルトの名無しさん:2005/06/04(土) 20:15:32
構造体についてもJavaみたく固定的にintとか用意するのと
,NETみたいに「型システム」に組み込まれてるのと
どっちがきれいよ?.NETのやり方だと「すべてオブジェクト」を実現してるぜ

Javaは固定的だから拡張性もないわ、オブジェクトじゃないから
オブジェクトとしてすら扱えないが(最近中途半端にパクったけどな)。
98デフォルトの名無しさん:2005/06/04(土) 20:17:37
値型の扱いは流石に.NETのがいいよね
99デフォルトの名無しさん:2005/06/04(土) 20:17:56
それは感じるな
javaは理想を追い求める言語で、
C#は「夢じゃ飯は喰えねーよ」と言わんばかり
100デフォルトの名無しさん:2005/06/04(土) 20:19:29
この前Javaをやって、間違えて、int型変数にtoString()をやろうとしたことがある。
いかにC#が便利かどうかがわかったよ。
101デフォルトの名無しさん:2005/06/04(土) 20:21:06
>>99
まあ今んとこはJava屋のが飯食えるだろうけどな(w
102デフォルトの名無しさん:2005/06/04(土) 20:21:27
俺はC#しか知らないから、さっきから会話についていけないんだけど、>>100の例はわかりやすいな
103デフォルトの名無しさん:2005/06/04(土) 20:25:19
>>102
ちなみにJavaだと
String.valueOf( x );
になる。
104デフォルトの名無しさん:2005/06/04(土) 20:26:35
まあ、オブジェクトなのに値型の ValueType だとか、メタ属性だとか、妙にゴチャゴチャした構造にもなっているんだけどな
その点 Java はシンプルで良いかも知れない

まあ、C# は実際使いやすいんだけど


ところで >>82 さん
C# と java の例外処理の概念について書かれた本ってなんスか?
調べて出てこんかった……
105デフォルトの名無しさん:2005/06/04(土) 20:26:59
>>95
>>個人的にいいなと思った機能はオーバライドを明示する必要があるってとこだけだ。
>こんなこといってる段階でC#は聞きかじった程度の知識しかない

じゃあ言語仕様としてjavaより優れてる点は何だと思う?
106デフォルトの名無しさん:2005/06/04(土) 20:27:08
Javaは糞。
いずれ滅びる。
107デフォルトの名無しさん:2005/06/04(土) 20:28:26
C#はC++の代用にもJavaの代用にもなれん
108デフォルトの名無しさん:2005/06/04(土) 20:29:20
>>105
struct と enum をサポートしている点
逆に interface 内に定数を入れられないのがいやん
109デフォルトの名無しさん:2005/06/04(土) 20:31:08
>>104
> まあ、オブジェクトなのに値型の ValueType だとか、
ValueTypeはクラスだぞ、と混ぜっ返してみるテスト。
//Managed C++でひっかかったんだこれ。
110104:2005/06/04(土) 20:35:28
>>109
ん?

Managed C++ での __gc class または __gc struct は C# の class、
Managed C++ での __value class または __value struct は C# の struct

だと思ってたけど違うの?
111デフォルトの名無しさん:2005/06/04(土) 20:35:29
>逆に interface 内に定数を入れられないのがいやん
しらなかった。

>>95出てこないなあ。
112デフォルトの名無しさん:2005/06/04(土) 20:39:17
>>109
あ、ごめん。ValueType は確かに C# のクラスだけど、値型です
113デフォルトの名無しさん:2005/06/04(土) 20:40:57
>C# と java の例外処理の概念について書かれた本ってなんスか?
メインなのはMSからでている例外のガイドラインあたり
ttp://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpgenref/html/cpconerrorraisinghandlingguidelines.asp

副次的には
ttp://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?mode=viewtopic&topic=21003&forum=7
こことか
「.NET エンタープライズ Web アプリケーション大全」あたりでも
触れてた(と思う)とか、何でthrowsがないかとかもMSの誰かが書いてたりとか
他にも情報はあるはず。
114デフォルトの名無しさん:2005/06/04(土) 20:42:38
スマソ あげてもた
115デフォルトの名無しさん:2005/06/04(土) 20:43:26
>>110 >>112
そうじゃなくて、全ての構造体の基底型であるValueTypeは構造体じゃないクラスなんだ。あとEnumとかも。
考えてみれば当然なんだけど。構造体は継承を禁止してるから。
だからMC++だと全ての列挙体を引数に取るようなメソッドへ渡すときにはbox()を明示しないといけなかった。
C#だと暗黙にボクシングされるから気にならないが。
116104:2005/06/04(土) 20:46:08
>>115
悪い。俺 「ValueType は構造体」 なんて一度も言ってないw
117デフォルトの名無しさん:2005/06/04(土) 20:47:54
>>116
>オブジェクトなのに値型の ValueType
これのことじゃないか
118104:2005/06/04(土) 20:48:51
>>117
構造体は値型だけど、構造体=値型ではない……よね?
119104:2005/06/04(土) 20:50:49
あーごめん。>>115 の最後の2行をやっと理解できました。こっちの勘違いみたいすまぬ。
120デフォルトの名無しさん:2005/06/04(土) 20:57:02
>>113
いまいちjavaとの違いが理解できないけど
>例外をスローすることなく正常に処理を続行できるかどうかを確認するためのメソッドを用意する必要があります。
チェックしない者がダメで、つまりjavaでいうRuntimeExcption扱いですよ。
なのでthrowsは必要ありませんってことかな?
強引な解釈だけど。
121デフォルトの名無しさん:2005/06/04(土) 20:57:13
そうだ。
「System.Drawing.Graphic」 よりも 「java.awt.Graphics」 の方が優れた設計だと思ったんだった。
122デフォルトの名無しさん:2005/06/04(土) 20:57:48
s が抜けてる
123デフォルトの名無しさん:2005/06/04(土) 20:58:41
なんか伸びてると思ったら・・・

なかなか面白い議論をしているじゃないか!
124デフォルトの名無しさん:2005/06/04(土) 21:01:13
ここ行って本格的に話さないか?

「C# vs Java」
ttp://pc8.2ch.net/test/read.cgi/tech/1068377418/l50
12595:2005/06/04(土) 21:09:08
いくらでもあるんだが、「コンポーネント指向言語」とかの利点をば。

Property, Event, CustomAttribute、これらはすべてコンポーネントのため
にあるんだよな。
Property, Eventがコンポーネントの基本要素。
付随情報(Browsableとかな)のためのAttribute
CLRがこれらを許容し、メタデータは自己記述だ。そのためのCLR。
そして、System.ComponentModelに実装されているコンポーネントアクセス
インターフェイス。

コンポーネントの利点としては再利用性を上げる人も多いんだが、DataBindingがらみで
の面白い利点とか。つまり、現状のオブジェクト指向の問題点として、
状態管理に依存しているために状態が爆発的に増えたときの複雑さが
どうしてもでてくる。それに対しての一種の解決策だな。状態をBindingというもので
Staticに連結し、管理するべき状態を減らせたり、XAMLのような静的定義
言語を用意してみたり。

ただ、この辺は言語仕様よりも広い話だ、と思うだろう。
いいたいのは、そういう思想が言語仕様から考えて作られている点だ。
どちらかといえば、.NETはCOMの後継っていうのは、ものすごく的確なんじゃないかって思う。
126デフォルトの名無しさん:2005/06/04(土) 21:18:00
例外の話が出てたけど
何でC#にchecked exceptionをつけなかったかについては↓参照
http://www.artima.com/intv/handcuffs.html

C#のチーフアーキテクトが理由を語ってるよ。英文だけど。
大体以下のような理由のようだ。

1) メソッドA、もしくはそこから直接間接に呼び出されるコードの実装変更により
 throwされる例外が増えると、checked exceptionがあった場合には、
 メソッドAのクライアントはコードの書き換えを要求されてしまう。

2) 比較的大規模なコードでは、それだけハンドリングされる例外の種類が多くなり
 最終的には皆 throws Exception とだけ書くようになってしまう。それでは
 まったく意味が無い
127デフォルトの名無しさん:2005/06/04(土) 21:20:54
例外についてはちょっと前に@ITで議論ってたな。
128デフォルトの名無しさん:2005/06/04(土) 21:23:36
>>126
ありがとです

>メソッドAのクライアントはコードの書き換えを要求されてしまう

要求されたら素直に従っとかないと、肝心の例外を逃しそうな気はする

>最終的には皆 throws Exception とだけ書くようになってしまう。それではまったく意味が無い

意味があるかどうかは使う側が決めることだよなぁ……
設計論になるけど、投げられる例外が多いのならば俺はそれらを一まとめにした基底クラス作ってそれを捕まえる


……っていうか、完全に 『好み』 の問題のような希ガス
129デフォルトの名無しさん:2005/06/04(土) 21:23:52
>>126 これも
Why doesn't C# have exception specifications?
http://www.gotdotnet.com/team/csharp/learn/columns/ask.aspx#exception
130デフォルトの名無しさん:2005/06/04(土) 21:26:00
悪い。catch の方と勘違いしていた。throws の方ね。
131デフォルトの名無しさん:2005/06/04(土) 21:26:29
>>125
>この辺は言語仕様よりも広い話だ、と思うだろう。
思う。

>126
例外クラスの継承関係をきちんとすれば対応できると思うんだけどな。
javaのソースみても
catch(Exception){}
ってのが多いから皆必要としてないのかな?
132126:2005/06/04(土) 21:27:26
>>129
あ、そっちのが簡潔に良くまとまってるね
133デフォルトの名無しさん:2005/06/04(土) 21:31:14
この辺もJavaとC#の思想の違いかなあとおもた。

理念で言えば例外はインタフェースの一部であり、それをコンパイル時に
チェックするchecked exceptionは、素晴らしいものである
ってのはC#のデザイナも認めている

どっちかっつーとC#の場合は実を取った印象
134デフォルトの名無しさん:2005/06/04(土) 21:37:36
catch(Exception){}
これもコンパイルエラーにすれば問題ない。
135デフォルトの名無しさん:2005/06/04(土) 21:49:11
自分用ではなく、一般的に公開するクラスライブラリのクラス(や構造体)の設計に関する相談です。

参照型を返すメソッドやプロパティにおいて、返り値がnullの可能性ってのはあっても良いんでしょうか?
あるいは、ドキュメントに明記しない場合は、nullは返らないことが前提なんでしょうか。
136デフォルトの名無しさん:2005/06/04(土) 21:50:14
いいとおもうよ
137135:2005/06/04(土) 21:51:32
ていうことは、逆に言うと、使う側は、参照型が返る場合は必ずnullかどうかをチェックしなきゃまずいですか?
138デフォルトの名無しさん:2005/06/04(土) 21:54:07
>>137
するに越したことはない。

ただ、配列を返す処理では、ほとんどの場合は
Lengthが0の配列を期待してnullが返ることはまず考えない。
俺の場合。
139デフォルトの名無しさん:2005/06/04(土) 21:59:19
>>131
まぁ広いんだけど。そういう広い話で
プロパティとイベントとカスタムアトリビュートがないと
こんなこと出来ないよね?(=プロパティとイベントと
カスタムアトリビュートの利点)

メソッドの名前規則
リスナーインターフェイス
とかって手で実現するぐらいならプロパティ、イベントを特殊化して、
「言語仕様として」用意したほうがきれいだよねって話。
140デフォルトの名無しさん:2005/06/04(土) 22:03:38
>>139
同感

ただ、全てのものを言語内に取り込むと、逆に煩雑になってしまい混乱を招く原因にもなりかねないかと
個人的には 「java はシンプルで好き」 「C# は扱いやすくて好き」 が決定稿なんだけど
whoisサーバーに接続してドメインの情報を取るDLLを作ろうと思っているのですが、
http://www.mentalis.org/
にあるソースファイルを改造しようと思っています。
シンプルなプログラムなのですが、当然日本語は文字化けしてしまうので
受信したデーターを日本語にデコードしてやらなくてはいけません。
一応、S-JISやEUC、UTF8などを試したのですが、
未熟故に方法が誤っているのか、完全に日本語が文字化けしてしまいます。
.orgなどは問題なく使用できるのですが、co.jpなどが使えないと致命的です。

漠然とした質問で申し訳ないのですが、ご教示お願いいたします。
ソースのSSは
http://cdrtest.hp.infoseek.co.jp/cgi-bin/snup/src/VisualVision0073.gif
こちらです(わざわざソースをDLして貰うのは面倒ですし。。。)
143デフォルトの名無しさん:2005/06/04(土) 22:09:44
>>140
うん、JavaはSimplicity、C#はSimplexityってことで (先のヘジたんのインタビュー参照)
144デフォルトの名無しさん:2005/06/04(土) 22:25:34
そこまで話ひろげていいなら。。
COMをC++で作るとVBのためにIDispatchから派生させたりVARIANTでリターンしたり文字列はSysAllocでかえしたりとか
色々面倒だったけどその辺が楽になるなあ
145デフォルトの名無しさん:2005/06/04(土) 23:01:59
>>140
同意。
だからC#は十分吟味して取り込んでいっているんだろうね。

っていうかヘジたんの言語設計のセンスは改めて天才的だと思う・・・
いろんな技術をまとめるのうまいよね、この人。

ただ、JavaのSimplicityは以前は信じてました。
でも、あのTigerは…いや、10年の歴史を持つ
言語ですから、仕方ないんでしょうけど。

>>144
COMは大変だった…。
もうなんていうか行き当たりばったりばかりだし。
146デフォルトの名無しさん:2005/06/04(土) 23:07:46
.netも時間がたつうちに糞設計になってゆくんだろうな('A`)
147デフォルトの名無しさん:2005/06/04(土) 23:14:51
いや、すでに・・・
148デフォルトの名無しさん:2005/06/04(土) 23:59:55
>>141
いや素直に.cs揚げてくれた方が楽だから。

で、
ttp://www.tcat.ne.jp/~nashorn/terminal/whois.html
によるとエンコーディングはiso-2022-jpらしいけど。
ついでに1024バイトごとに文字列化してるようだけど、もし1024バイト目に2バイト文字の1バイト目が来たらどうする気?
149デフォルトの名無しさん:2005/06/05(日) 00:14:08
ThreadPriorityって
hoge.exeの中での相対優先度ですよね?

タスクマネージャのプロセスタブで、それぞれのプロセスに優先度をつけれますが、
こっちの優先度をリアルタイム等に指定したいときはどうすればいいんでしょうか?
150デフォルトの名無しさん:2005/06/05(日) 00:26:15
>>141
>>148

ISO-2022-JPはSystem.Text.Encodingでサポートされてるみたいだから
何の問題もなさげ
素直にEncoding.GetEncoding("ISO-2022-JP")でよし

半端バイトがある場合、Decoderを使えみたいにMSDNにはあるが
Decoderでは、結果としてUnicode文字が何文字生成されたかは分かるが
どのバイトまで変換できたか分からない困ったインタフェースのようだから、
行読みするのが楽だろう。
151>>141-142:2005/06/05(日) 00:43:06
誰か・・・
152デフォルトの名無しさん:2005/06/05(日) 00:57:32
すでにレスされてるようですが?
153デフォルトの名無しさん:2005/06/05(日) 00:57:45
>>149
Process.PriorityClass
154デフォルトの名無しさん:2005/06/05(日) 01:00:10
>>150
> 行読みするのが楽だろう。

Socket.ReceiveはStreamReaderにつっこめないので、
読んだのをMemoryStreamに溜めてからGetStringした方が楽な希ガス
155149:2005/06/05(日) 01:03:40
>>153
多謝。
ほんとに多謝。
156デフォルトの名無しさん:2005/06/05(日) 01:12:10
みんな答えてるけど
157デフォルトの名無しさん:2005/06/05(日) 01:44:41
>>154
あ、そのやりかた結構便利だな
俺はSocket行読みするときは専用のバッファクラス自前で作ってたよ
それはそれで別に単純な実装だから大した話じゃないんだけどさ
158デフォルトの名無しさん:2005/06/05(日) 01:48:00
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#で作りたい、ということだな。
160デフォルトの名無しさん:2005/06/05(日) 01:57:52
>>158
Socketはストリーム指向以外のネットワークも扱うので、Streamに関するメソッド/プロパティは存在しない。

>>159
ていうかどっちかに統一した方が分かりやすくないか。どうせただのシンタックスシュガーなんだし。

ということで、
"src\\data"と"src\\\\data"が等しいと判断できれば良いと言うことだよな?

後者の\\\\を\\に置換すれば済む話だな。
161159:2005/06/05(日) 02:00:15
>>160
さ、さすが。
あっという間に案がw

というかさっきあげちゃってすみません。
162>>141-142:2005/06/05(日) 03:31:31
あ!リロードせずに書き込みしてました!
初歩的なミス・・・情けないです。

本当に申し訳ありません!&ありがとうございます!
163デフォルトの名無しさん:2005/06/05(日) 03:32:55
C#でCOMのアウトプロセスサーバ(にみせかけられるアセンブリ)って
つくれますか?
インプロセスサーバは問題なくつくれるんですが、EXEプロジェクトだと
VSの「COM相互運用機能の登録」というオプションが無効になっていて
選択ができないもので、regasmで手動で登録してみたんですがうまく
いきません。。。
164>>141-142:2005/06/05(日) 03:36:44
早速試してみたのですが、どうも改行をうまく受け取れません。
¥rを¥r¥nに置換したりいろいろしたのですが・・・
どうも無理なようです。

もともと改行がはいっていないデータなんでしょうか??
165デフォルトの名無しさん:2005/06/05(日) 03:50:31
>>161
いやいや、簡単に納得しちゃって。
まず置換をどうするのかが問題、でしょ。
そこで、Stringクラスの何のメソッド使おうか、と。
166デフォルトの名無しさん:2005/06/05(日) 04:00:37
>>163
exe、サービスは知らんけどCOM+はあるよね
167デフォルトの名無しさん:2005/06/05(日) 04:06:40
>>165
それ以前にそんな処理が本当に必要なのかという問題が
168デフォルトの名無しさん:2005/06/05(日) 05:36:38
>>167確かに。
>>159がまとめてくれたが、文字列Bの\\はなんで\じゃないのかな。
そんなこといっても始まらないのかもしれないが
そもそも文字列の頭に@をつけると、エスケープシーケンスが
無効化されるんだよね?
\\じゃなくていいと思うんだ。
まぁそれで渡されるならしょうがないけど。
169デフォルトの名無しさん:2005/06/05(日) 08:00:52
WebClientクラスを利用してデータ送信する際、
Flashで作られたボタンを実行することは可能でしょうか。

例)
Flashボタン

処理を行うURL ←ここにRequestしたい

処理後のURL

170デフォルトの名無しさん:2005/06/05(日) 08:55:38
C#から、mysqlを使いたいのですが、
うまくいきません。

new OleDbConnection((string)str)
で、strをどうすればいいのかご教授ください。

とりあえず、
MyOdbcなるものもインストールしました。
また、コネクションで使用するクラスは
SqlConnectionではなく
OleDbConnectionらしいという程度の知識を何とか得てます。
ODBCデータソースアドミニストレータで何かするらしいというのも
わかっています。

おながいします。

171デフォルトの名無しさん:2005/06/05(日) 09:35:53
172デフォルトの名無しさん:2005/06/05(日) 10:12:06
>>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などから
も呼び出せるものを作りたかったんですが…。
174デフォルトの名無しさん:2005/06/05(日) 12:26:24
>>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に登録しているようには
みえないのですが、どういう仕組みで動いているんだろう…。
176デフォルトの名無しさん:2005/06/05(日) 13:52:47
>>163
そのインプロセスサーバーを VB6 でラップして ActiveX EXE にしろ。すぐできる。
177デフォルトの名無しさん:2005/06/05(日) 13:59:51
>>175
> DLLプロジェクトで、VS IDEからCOMInterOPの登録をさせると、
> WSHファイルと同じところにアセンブリを配置すれば動いていたので
> 気がつきませんでした。 VS IDEは特にGACに登録しているようには
> みえないのですが、どういう仕組みで動いているんだろう…。

ありゃ本当だ、いい加減なこといっちまった。

regasm.exeのオプションに/codebaseってのがあって、これにアセンブリのフルパスを指定すれば直接参照できるようになる。
ただしsn.exeを使ってアセンブリに厳密名を与えておかないとフルパス指定はできない。
ということのようだ。
178デフォルトの名無しさん:2005/06/06(月) 00:05:23
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でソートするにはどうすればよいでしょうか?
179デフォルトの名無しさん:2005/06/06(月) 00:06:34
ハッシュ表ってどういうデータ構造か知っとるかね君
180デフォルトの名無しさん:2005/06/06(月) 00:47:53
つ SortedList
181デフォルトの名無しさん:2005/06/06(月) 02:21:10
列挙型の要素数を得る方法を教えてください
182デフォルトの名無しさん:2005/06/06(月) 03:08:45
つ Reflection
183デフォルトの名無しさん:2005/06/06(月) 04:18:42
Enum.GetNamesから
184デフォルトの名無しさん:2005/06/06(月) 04:58:17
C#ではヌルリっていうの?
185デフォルトの名無しさん:2005/06/06(月) 05:06:00
C#。javaに比べてコレクションのライブラリが貧相だよな。
186デフォルトの名無しさん:2005/06/06(月) 07:26:53
>>181
番兵(?)使うとか。
enum TEST{ A, B, C, NUM }

Hoge[] hoge = new Hoge[TEST.NUM];
列挙要素の値を個別に設定してる場合は利用しにくいけど。
187デフォルトの名無しさん:2005/06/06(月) 13:23:20
.NETはコレクションの種類は少ないのだがなにも困ったことはないなぁ。
なぜだろう・・
188デフォルトの名無しさん:2005/06/06(月) 13:47:12
System.Collection.Generic は便利だよ。
189デフォルトの名無しさん:2005/06/06(月) 21:08:39
1.x のころに LinkedList がなかったのは何か理由があったんですか
190デフォルトの名無しさん:2005/06/06(月) 21:15:14
優先度が低いから。
191デフォルトの名無しさん:2005/06/06(月) 21:43:21
.NETにはSet系が全然ないけど、Setはあっちでも使ったことないや・・
192デフォルトの名無しさん:2005/06/06(月) 22:12:14
LinkedList がなくても Queue で大抵は事足りるし
193デフォルトの名無しさん:2005/06/07(火) 13:30:15
Genericsがないと汎用LinkedListは使いづらいしー。
194デフォルトの名無しさん:2005/06/07(火) 16:32:50
LinearGradientBrush.BlendのFactorsプロパティ、Positionsプロパティに
2個以上の値を入れたいのですが、配列の大きさが1に固定されていて、
2個以上代入できません。

どうすれば2個以上代入できますか?
195194:2005/06/07(火) 16:37:16
すみません自己解決しました。
Blendオブジェクトをnew Blend(n);で初期化してからそのFactors、Positions
プロパティにそれぞれ代入したものをLinearGradientBrush.Blendに入れたら
うまく行きました。

C#のこの辺の感覚がうまくつかめない・・・・慣れるまで頑張ります。
196デフォルトの名無しさん:2005/06/07(火) 21:43:22
C#の、というのはちょっと語弊があると思う。
197デフォルトの名無しさん:2005/06/07(火) 23:48:34
>>196
Win32で直接GDI+いじくってる奴は少ないのでは?
ぐぐっても少ない。
198デフォルトの名無しさん:2005/06/08(水) 00:17:00
あるUserControlの上に乗っているすべてのControlが
ClickやKeyPressされたときに実行したい処理を記述する簡単な方法はないでしょうか?

UserControlのControlsに対して全てClickイベントを記述して
ControlAddedでClickイベントを記述するようなイベントを記述する方法を思いついたのですが、
なんだか周りくどいような気がしてるので
199デフォルトの名無しさん:2005/06/08(水) 00:29:14
>>197
ライブラリ、.NET Framework/GDI+の都合であってC#とは直接関係ないということでしょ。

>>198
簡単なのはないな。
コントロールをAddし終わった後Controlsをforeachで回して.GetType().GetEventでEventInfo取得してAddEventHandlerで追加していくか。
200デフォルトの名無しさん:2005/06/08(水) 01:38:57
>>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
201デフォルトの名無しさん:2005/06/08(水) 09:37:48
ところで、参考になるサイトへのリンクもてんぷらに追加した方がよくないか?
202デフォルトの名無しさん:2005/06/08(水) 09:44:50
GDIとかRGNのハンドルとれたり
メッセージループ上書きできたり
昔のAPIがモロだね。
MFCとあんまかわらんな。
203デフォルトの名無しさん:2005/06/08(水) 10:16:34
>>201
リンク/その1の内容じゃ足りない?
204デフォルトの名無しさん:2005/06/08(水) 10:41:46
>>181
Enum.GetValues(列挙型名)とかGetNames(列挙型名)で要素の配列が取れますよ。
Enumは先頭大文字で。
205デフォルトの名無しさん:2005/06/08(水) 10:43:49
206デフォルトの名無しさん:2005/06/08(水) 11:25:26
ちょっとスレ違いですが

開発環境にVisual Studio .Net 2003を使っているのですが
他のPCで作業をする際に
今まで使っていたPCの設定(ボタンの位置とかウインドウの位置とか)を
移行する方法はないですか?
207デフォルトの名無しさん:2005/06/08(水) 11:52:22
>>206
%APPDATA%\Microsoft\VisualStudio\の中を漁れ。
208デフォルトの名無しさん:2005/06/08(水) 12:24:10
>>203
個人ページをもっとあげてくべきかなと。
初心者ってのはMSDNとかそういったもので解決できない人が多いでしょ。
まあそれが初心者なんだけど。

VB.NETは初心者が集まる傾向にあるから結構充実してる。
http://pc8.2ch.net/test/read.cgi/tech/1114217190/5-8n

で見ると、VB.NETだけじゃなくて.NET全般(死語だけど)つまり、C#とかも扱ってるサイトが多い。
こういったサイトももっと増やすといいかも。
209デフォルトの名無しさん:2005/06/08(水) 12:31:59
>>208
初心者にはふらっとスレがあるじゃないか……
210デフォルトの名無しさん:2005/06/08(水) 13:26:38
>>208
Wikiなんだから言いだしっぺの法則で
211デフォルトの名無しさん:2005/06/08(水) 16:10:18
C++からC#に移行した俺としては、VB.NETはとっつきにくい。C#は
すぐ慣れた。吐くマネージコードはどちらも同じようなもんだろうけど。
212デフォルトの名無しさん:2005/06/08(水) 16:40:18
VBプログラマーならVB.NETからやったほうがおすすめ

VBからC#は戸惑うはず
213デフォルトの名無しさん:2005/06/08(水) 20:34:10
>>211
とあるサイトの掲示板で、VB.netをやったときにgetとsetで型の違うプロパティを
書いて質問してる書き込みを見たときに小一時間混乱したのを思い出した。
214デフォルトの名無しさん:2005/06/08(水) 20:41:57
>>213
詳しく

インターフェイスを実装するのに同じメンバ名を使わないでも良いと知ったのは衝撃だった。
代わりに明示的実装ができないが。
215デフォルトの名無しさん:2005/06/08(水) 23:24:14
>>214
すまん、覚え違いだった。
正しくはC#で使おうとするとメソッド扱いになるプロパティ。

Public Property Hoge(ByVal i As Integer) As String
 Get
 End Get
 Set(ByVal Value As String)
 End Set
End Property
216デフォルトの名無しさん:2005/06/09(木) 01:11:13
Defaultつけてインデクサにしてしまえってそういう話じゃないか。
C#で引数付きプロパティが使えないのはちょっと残念。
217デフォルトの名無しさん:2005/06/09(木) 12:01:57
ウィンドウの位置とサイズとかを保存するのに、どこにどう保存するのが
一般的でしょうか?
VB6ではiniやレジストリに保存してました。それらはレガシーで
新しいやり方があるのかなと勝手に思ったんですが、
app.configかなと思ったんですがドキュメントには読み取り専用として
使うようなことが書いてあるので
(実際ConfigurationSettingsクラスも読み取りメソッドしかないし)
じゃあ保存は?と。こだわらずにiniを使えばいいんでしょうか。
218デフォルトの名無しさん:2005/06/09(木) 12:07:59
漏れは設定を保存したクラスにXmlSerializer使ってる。リフレクション万歳。
219デフォルトの名無しさん:2005/06/09(木) 13:33:42
>>217
独自のXMLファイルに読み書きするのがお勧め。218の方法やDataSetが使える。
MSとしては分離ストレイジを勧めたいようであるが、現状では低レベルのAPI(CLR)や
ツールしか提供されていない。VS2005からはSettingsオブジェクト他その辺が充実
してくるようなのでだんだん使われるようになると予想される。
220デフォルトの名無しさん:2005/06/09(木) 16:45:06
自分が呼ばれた親プロセスの名前って、取得できないっすかぁ?


CreateProcess1.exe プロセス起動--> Prog01.exe


CreateProcess2.exe プロセス起動--> Prog01.exe

Prog01.exeはCreateProcess1.exeから呼ばれたか、CreateProcess2.exeから呼ばれたか判断したい。
221デフォルトの名無しさん:2005/06/09(木) 17:17:00
>>220
適当なコマンドライン引数(/aとか/bとか)で区別ってのはどう?
222デフォルトの名無しさん:2005/06/09(木) 17:20:14
あるいは/a:CreateProcess1.exeみたいな感じで。
223デフォルトの名無しさん:2005/06/09(木) 17:20:41
ぬるり
224デフォルトの名無しさん:2005/06/09(木) 23:12:56
ドラッグ&ドロップ中のエフェクトでドラッグしたいコンポーネントを
うっすらと浮かすようなやり方はどのようにすればよいのでしょうか?
+とか□のような地味なエフェクトはDragEffectででるのですが、アイコンなど
色のついたオブジェクトにドラッグエフェクトをつけたいです
225単発ですが・・・:2005/06/09(木) 23:57:56
MobileMeter
http://www.geocities.co.jp/SiliconValley-Oakland/8259/
のようにユーザーの操作を透過するウィンドウはどのように作れば良いでしょうか?
また、フォーカスを失っても常に一番上に表示されるウィンドウも・・・

ご存じの方がおりましたらご教示お願いいたします。
226デフォルトの名無しさん:2005/06/10(金) 02:16:08
>>225
一番上に表示されるのはForm.TopMostとか。
操作の透過は・・・スパイってみたがメッセージすらきてないな。ってことは
フックかいな
Win32スレいったほうが詳しい人いると思うよ
227デフォルトの名無しさん:2005/06/10(金) 02:56:24
>>225
WM_NCHITTESTでHTTRANSPARENTを返す。
アクティブ状態も変化しないようにしたほうがいいかな。
228デフォルトの名無しさん:2005/06/10(金) 14:15:41
空のテーブルからデータセット作って、それの行のカウント取ると1になるのは何でなのかな?
ds.Tables[ tablename ].Rows.Count;
229デフォルトの名無しさん:2005/06/10(金) 14:19:56
>>228
すまん。誰かがデータ突っ込んでた。首吊ってくる。orz
230デフォルトの名無しさん:2005/06/10(金) 16:01:45
Bitmapオブジェクトを2つ定義し、それぞれ適当なImageオブジェクトで
初期化しておきます。それぞれの名前は例えばsrc, dstとします。

次に、dst = src; を実行した後に、dstに変更を加えると、srcまで変更
されてしまいます。C#ではそんな物なのでしょうか?

C++のように、ディープコピーが行われる(普通はそのように組む)事を期待
していたのですが、どうもオブジェクトへの先頭ポインタを付け替えるだけの
動作のようです。いろいろ試した結果、Clone()メソッドを使えば、新しい
中身を作り出してくれるようで、動作はまともになりましたが、どうもすっきり
しない気分です。
231デフォルトの名無しさん:2005/06/10(金) 16:04:09
>>230
値型と参照型の違いを調べれ
232デフォルトの名無しさん:2005/06/10(金) 16:43:06
>>231
ありがとうございます。プリミティブな型以外はほとんど参照型なんですね。
そして、クラスの中に参照型変数を持っていた場合、=代入演算子では
C#の場合、ディープコピーしない事もわかりました。

うーまだまだ初心者だ・・・・精進します。
233デフォルトの名無しさん:2005/06/10(金) 16:48:44
あと、簡易コピーと詳細コピーという用語も発見しました。
簡易コピー=ポインタの付け替えのみ、詳細コピー=ディープコピーの事、
と読み替えて理解しました。そして、=演算子は簡易コピーを実行する
という事もわかりました。

配列はちょっと複雑で、配列の中身が参照型の場合、配列の中身は
詳細コピーしますが、中身が参照しているオブジェクトはそのままにされる
という事もわかりました。C++では配列のコピーは演算子がないので、
必ず気をつけていましたが、C#の場合はちと気を付ける必要がありそうです。
234デフォルトの名無しさん:2005/06/10(金) 16:51:33
>>232

ま、C#の参照型変数(クラスのインスタンスは全部そうだ)は要するに
ポインタだと思っておけばよい。
C++でもポインタの代入ではコピーコンストラクタやoperator=は実行されないだろ。
単に同じオブジェクトを指すようになるだけで。
それと同じ。
235デフォルトの名無しさん:2005/06/10(金) 17:00:13
>>234
そうですね。そう思えば理解できます。
くそー今までBitmap関連のプログラムの動きが怪しかったのはこやつが
原因だったのかー。でもまだ数が少なくて、被害は最小限でよかった。

これからはさぼらずにClone()書きます。トホホ・・・・
236デフォルトの名無しさん:2005/06/10(金) 17:07:12
>>235
Bitmapといえば、IDisposableについても調べといたほうがよい気がする。
BitmapはDispose!
237デフォルトの名無しさん:2005/06/10(金) 17:12:47
>>236
> BitmapはDispose!

違うな。
IDisposableはDispose!
238デフォルトの名無しさん:2005/06/10(金) 17:15:24
>>236>>237
using使えばいいだけのような希ガス。
239デフォルトの名無しさん:2005/06/10(金) 17:43:41
>>238
1ブロックに収まるなら何の問題もないが、Managedリソースの感覚で
複数のオブジェクトで共有したりすると面倒なんだよ。
(放置しておいて、リソースが尽きる前にGCされることを祈るというテクニックもある)
240デフォルトの名無しさん:2005/06/10(金) 19:53:41
GCが走るよりGDIリソースの使いすぎで画面表示がおかしく成りだすほうが大抵先なんだよな。
グラフィック関係にDisposeの必要なクラスが多すぎる気がする。
241デフォルトの名無しさん:2005/06/10(金) 20:08:40
GDI+って、GDIの諸問題を解決してるのかな?
GDIはWIndows3.1からの伝統を引きずってる点が多くて、最近画像関係を
いじくり始めた俺には理解不能の制限が多いな。

Delphi Graphic Secretsなどの本を読んで、だいたいわかってきたけど。
242デフォルトの名無しさん:2005/06/10(金) 20:39:09
C#というか.NETというかを使い始めてそろそろ1年になる。
小物とはいえいろんなアプリも作ったし、Managed DirectX使ったりもしている。

が、System.Drawing名前空間は魔物が住んでいそうで、いまだに使ったことがない
243デフォルトの名無しさん:2005/06/10(金) 20:42:02
>>242
コントロールのSizeをいじったことすらないと言うのか……すごいな。
244デフォルトの名無しさん:2005/06/10(金) 20:46:51
ああ、そういえばいじってるな、Sizeとか。すっかり忘れてた
245デフォルトの名無しさん:2005/06/10(金) 23:16:04
>>227
WM_NCHITTESTやHTTRANSPARENTでぐぐったのですが、
C++などの記事はあるものの、VB.netやC#での例を見つけることができませんでした。
本当に申し訳ありません、もうすこし具体的にご教示頂けないでしょうか?
私の力不足が原因なのですが・・・申し訳ありません!
246デフォルトの名無しさん:2005/06/10(金) 23:54:20
System.Drawing.Point とか、Drawing 名前空間になくてもいいのになあって思う。
描画に関係なくよく使うのに。

自分でつくりゃあいいのか。
247デフォルトの名無しさん:2005/06/11(土) 00:28:16
java.awt にも文句言ってくれ
248226:2005/06/11(土) 00:57:09
>>245
無視かよ
C++わからないんならあきらめろ、な。
Win32でごにょごにょやらなあかんからその辺のAPIと
格闘になる。だからWin32スレいけといったんだよ。

というかHTTRANSPARENTはスレッドローカルだった希ガス
(=この場合使えない)。
こいつをspy++で見たところメッセージ自体
がWindowに飛んでいっていないし(WM_NCHITTESTすら)。
249デフォルトの名無しさん:2005/06/11(土) 01:05:03
>>246
いや、でもGraphicsで使う意味でのPointに特化されてるし、この構造体。
だからここにあるのに何で不満なんだ?
250デフォルトの名無しさん:2005/06/11(土) 01:11:21
JavaだとXがねーとawtほにゃららは使えねーとか
そおゆう実質的な問題があったけどな
251デフォルトの名無しさん:2005/06/11(土) 02:14:21
>>249
using 書くのがめんどくさい、というのもあるが、それはおいておいて。

> Graphicsで使う意味でのPointに特化されてるし
そうかあ?
画像処理だけでなくもっと抽象的な処理にも使えるけど。
252デフォルトの名無しさん:2005/06/11(土) 02:17:42
> using 書くのがめんどくさい
たったの1行書くのが面倒ならコーディングなんてやってられねーだろ

ま、TupleでもComplexでも好きなクラス書けばいいじゃん
Generics使ってさ
253デフォルトの名無しさん:2005/06/11(土) 02:22:24
>>252
> たったの1行書くのが面倒ならコーディングなんてやってられねーだろ
ごめんなさい

> ま、TupleでもComplexでも好きなクラス書けばいいじゃん
> Generics使ってさ
そうだな、大した構造体じゃないしな
254デフォルトの名無しさん:2005/06/11(土) 05:46:11
255デフォルトの名無しさん:2005/06/11(土) 07:06:36
>>254
へー、LayerWindowってHittest透過も出来たのか。
256デフォルトの名無しさん:2005/06/11(土) 12:31:28
Directory.GetFiles(string path, string searchPattern)
でsearchPatternに複数の拡張子を含めるにはどうしたらいいでしょうか?

string searchPattern = "*.txt; *.htm"てな具合にしてもだめなんですが
257デフォルトの名無しさん:2005/06/11(土) 12:34:27
できないので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でまわして何回も呼ぶのはなんかやだけどな…。
259デフォルトの名無しさん:2005/06/11(土) 13:04:24
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の読み込みで例外が起きた場合はファイルをロック
しないようになっているのでしょうか…。。。
261デフォルトの名無しさん:2005/06/11(土) 15:02:29
>>260
・それ以前の問題としてusingって知ってる?
・コンストラクタで例外がおきたときにはDispose呼ばなくてもいいと思うよ
262デフォルトの名無しさん:2005/06/11(土) 15:05:44
>>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サイトや本、手法等をご存知の方がいましたら
アドバイスをお願いします。
265デフォルトの名無しさん:2005/06/11(土) 16:50:18
>>264
BitmapにせよImageにせよストリームから直接インスタンスを作るコンストラクタ/静的メソッドが存在するが。
266264:2005/06/11(土) 17:51:23
>>265さんありがとうございます。
public Bitmap(Stream) ですね。これでクライアント側の問題は解決できます。
後はサーバ側の事なのですが、既に読込み済みのBitmapをNetworkStreamに
書き込むことは可能でしょうか?FileStreamからファイルを読込むのではなく
Bitmap bmp = new Bitmap("../../image.bmp"); といった風に画像を読込んだ
bmpをNetworkStreamに書き込みたいのです。
bmpをbyte[]化するといいと書かれていたのをネット見つけたのですが、具体的な
手法が載ってませんでした。何度もすみません。アドバイスよろしくお願いします。
267デフォルトの名無しさん:2005/06/11(土) 18:01:59
Image.Saveに引数をStreamにとるオーバーロードがあるな。
268デフォルトの名無しさん:2005/06/11(土) 18:14:45
>>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);
269デフォルトの名無しさん:2005/06/11(土) 18:20:07
>>268
それじゃイメージのデータだけでメタデータが含まれてないから駄目。
しかもビットマップ限定だからネットワーク越しに送受信には不向き。

MemoryStreamに対してSaveして、それをToArrayするのがベター。
270268:2005/06/11(土) 18:32:39
>>269
確かにおっしゃる通りで
そのやり方だとちゃんとBITMAPFILEHEADER、BITMAPINFOHEADERつきの
データになるし、復元も簡単でよいですね
ある意味手動でメモリ内シリアライズしてるみたいな
271264:2005/06/11(土) 21:21:24
>>267さん
>>268さん
>>269さん
ありがとうございます。さっそくMemoryStreamについて勉強したいと思います。
272デフォルトの名無しさん:2005/06/11(土) 23:58:30
C#+.NET環境でタスクマネージャのプロセス画面のような
レイアウトが実現したいのですが
どのようなコントロールが使われているのでしょうか
リストボックスとボタンで自作するのはなんだか大変そうで・・
273デフォルトの名無しさん:2005/06/12(日) 00:03:33
あれはListViewだろ
Spy++とかで調べればわかるが
274デフォルトの名無しさん:2005/06/12(日) 00:05:59
VC#.netスレが見当たらないのでここで質問させてね♪

hello woldなコンソールプログラムを作ったんだけど、F5で実行すると、コンソールが即閉じちゃうんだよね。
閉じないようにするにはどうしたらいい?
275272:2005/06/12(日) 00:08:16
>>273
先にSpy++について調べてみることにします
ありがとうございました
276デフォルトの名無しさん:2005/06/12(日) 00:10:21
System.Console.Read();
277デフォルトの名無しさん:2005/06/12(日) 00:12:26
>>275
Spy++を使う前に一通りSystem.Windows.Formsのコントロールを確認すべきだな。
同じことができるListViewコントロールがすでにあるという意味だ。
278274:2005/06/12(日) 00:20:26
できた!できたよ!
デバッグなしで開始(Ctrl+F5)を押せばいいんだね!
279デフォルトの名無しさん:2005/06/12(日) 00:40:00
280デフォルトの名無しさん:2005/06/12(日) 06:35:19
動的に曲線を描画(簡単なアニメーション)したいんですが方法がわかりません教えていただけますか
知識は完全に素人レベルです
281デフォルトの名無しさん:2005/06/12(日) 14:00:27
>>280
ちっともよくわかんない
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);
}

ツリービューでも同様のことを試してみましたがうまくいきません
この場合どうやって比較すればよいのでしょうか
283デフォルトの名無しさん:2005/06/12(日) 14:13:14
>>282
> ListViewItem lvi = new ListViewItem(stringdata);
> if(listView1.Items.Contains(lvi))

ListViewItemは参照型。
今ここに新しいのを作った。
さて今までのListView.Itemsの中に、まさに作ったばかりの物は入ってるだろうか?

foreachで回してそれぞれの.Textと比較でもすればー?
284デフォルトの名無しさん:2005/06/12(日) 14:25:01
>>280
ベジェ曲線でぐぐれ
285282: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);
}
286デフォルトの名無しさん:2005/06/12(日) 14:54:06
>>285
ちょwwwwおまwwwwwwwforeach使えよwwwwwww
287282:2005/06/12(日) 15:09:25
foreach使い慣れてなくて
i==listView1.Items.Countの部分のうまい処理が思いつかず

int i;
foreach(ListViewItem lvi in listView1.Items)
{
//ごちゃごちゃ
i++;
}
と言う風にforeachなのにループカウンタっぽいのを定義するぐらいなら
forでいっかなって・・
288デフォルトの名無しさん:2005/06/12(日) 15:19:29
そんなことせんでもboolでフラグもっときゃいいがな。
まあ別にどっちでもいいけどね……
289デフォルトの名無しさん:2005/06/12(日) 16:21:24
僕はgoto派
290デフォルトの名無しさん:2005/06/12(日) 17:30:05
>>280
DrawBezier
291デフォルトの名無しさん:2005/06/12(日) 17:51:18
>>284>>290
曲線が書きあげられる様をアニメーション表示したいんです><
というか画面エフェクトとして曲線で飛んでくレーザーのような物に使いたいんです><
292デフォルトの名無しさん:2005/06/12(日) 17:53:16
>>291
説明ベタ杉
293デフォルトの名無しさん:2005/06/12(日) 17:57:21
まずは日本語の勉強から
294デフォルトの名無しさん:2005/06/12(日) 18:03:10
>>291
そういうことならベジェ曲線の数式のパラメータを動かして
いけばいい。ただ、多分等速運動にはならない。
295デフォルトの名無しさん:2005/06/12(日) 18:10:00
>>291
ベクトルを変化させつつ、2点間を線で描画していけばいいんじゃないかな。
C#とあんまり関係ないね。それ系のアルゴリズムについて調べるとよい。
296280: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メソッドを送って噛むかどうかテストせよ」

298デフォルトの名無しさん:2005/06/12(日) 18:41:32
>>297
宿題は自分でやれ。
299デフォルトの名無しさん:2005/06/12(日) 18:42:17
#include って C# じゃ使えないよ
300デフォルトの名無しさん:2005/06/12(日) 18:43:14
>>298
すいません。宿題というわけではなくて、模範解答をしりたくて。色々考え抜いた結果です。
うまくコンパイルがいかないもので。 お願いします。
301デフォルトの名無しさん:2005/06/12(日) 18:44:20
>>299
オブジェクト指向の考えの元、C++で書いていただきたいのです。
302デフォルトの名無しさん:2005/06/12(日) 18:44:52
いや、
だから、
ここC#スレ
303デフォルトの名無しさん:2005/06/12(日) 18:46:40
#includeってのを見ただけでレスを読む気にならない
304デフォルトの名無しさん:2005/06/12(日) 19:00:50
>>301
お前見たいな奴は死んだ方が世のため
305デフォルトの名無しさん:2005/06/12(日) 19:03:14
>>304
分かりました.........そうします。
あちこちでたたかれて、ここが最後の多のみの綱だったのですが...
306デフォルトの名無しさん:2005/06/12(日) 19:07:41
そのくせC/C++宿題スレには書いてないのな。
なんか人として間違ってる奴。
307デフォルトの名無しさん:2005/06/12(日) 19:08:36
>>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メソッドを送って噛むかどうかテストせよ」
308デフォルトの名無しさん:2005/06/12(日) 19:10:16
>>307
引用せんでよろしい
309306:2005/06/12(日) 19:11:07
>>307
うお、なぜかブラウザが読み込んでくれてなかった。

逝ッテキマス……
310デフォルトの名無しさん:2005/06/12(日) 19:12:57
>>297
class Dog{

void bites(string s)
{
cout<<s<<endl;
}
}

int main()
{
Dog a();
a.bites("ガブ!");
}
311デフォルトの名無しさん:2005/06/12(日) 19:15:01
>>310
Objectクラスのサブクラスになってない…って相手せんでよろしい。
せっかく俺が宿題スレで相手してんだから。
312デフォルトの名無しさん:2005/06/12(日) 19:17:38
なんだ?C++ではObjectクラスを明示的に継承しないといかんのか?
313デフォルトの名無しさん:2005/06/12(日) 19:18:30
314デフォルトの名無しさん:2005/06/12(日) 19:22:47
ちょいアレな質問ですが教えてください。

今、Formがアクティブになってるかどうかを調べる方法は
どうすればよいのでしょうか?

なさけねぇ話ですいませんがおながいします...
315デフォルトの名無しさん:2005/06/12(日) 19:25:28
>>312
必要ない(というかデフォルトでそんなものは提供されてない)から
そいつはどこにあるんだ?と聞きたい。
316デフォルトの名無しさん:2005/06/12(日) 19:55:14
>>314
Form.ActiveFormと自分自身を比較。
317デフォルトの名無しさん:2005/06/12(日) 20:06:30
>>316
ありがとうございます
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";という結果を期待しています。


319デフォルトの名無しさん:2005/06/13(月) 00:25:11
正規表現じゃ駄目なのかね?
320デフォルトの名無しさん:2005/06/13(月) 00:39:19
>>318
何スレか前に<>を処理する正規表現のサンプルを挙げたレスがあったな。
XHTMLなら普通にXML周りを使えばどうとでもなるが。

>HTMLDocument doc = (HTMLDocument)test;(ここが無理なのですが)
ところで関係ないが、こういう場合C#ではたいていは

>HTMLDocument doc = new HTMLDocument(test);

という形だろう。
321デフォルトの名無しさん:2005/06/13(月) 08:30:13
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)とか入れると、全てのファイルがきちんと生成されます。
こういう場合の定石があったら教えてください、宜しくお願いします。

323322:2005/06/13(月) 14:50:58
自分で書いていて、んなアホな・・・って気になったので、調べました。
ファイル名をDateTime t = DateTime.Now;で付けていたので、
同じ名前になって上書きされていました。_| ̄|○

ミリセカンドまでファイル名に使っていたので、かぶるとは思いませんでした。
申し訳ありませんでした。
324デフォルトの名無しさん:2005/06/13(月) 15:20:01
構造体のpublicメンバに対して「既定値0を使用します」という警告
(CS0649)がいちいち出るので、/nowarnオプションで出ないように
したのですが、これだと本当に使い忘れてごみになっているメンバに
気づきづらくなってしまいます。ほかに出ないようにする方法はないですか?
325デフォルトの名無しさん:2005/06/13(月) 15:54:20
>>324
publicなものには出ないはずだが。

コンストラクタを定義する。
引数付きコンストラクタを定義するのが不自然な物はclassにする事を検討する。
326デフォルトの名無しさん:2005/06/13(月) 19:39:54
>>325
警告レベル4でやってます。3にしたら出ませんでした。4がデフォルトみたいなので。。
構造体というのがWin32のWINDOWPLACEMENTなんですが、いまいろいろ
試していて、[StructLayout(LayoutKind.Sequential)]属性が必要らしいので
付けたら、警告が出なくなりました。なぜでしょうか?
とりあえずこれでおkにしようと思います。
327デフォルトの名無しさん:2005/06/13(月) 19:48:38
>>322
fs.Close();の前に
fs.Flush();してみればどう?
昔おなじような現象で4KB(?)ずつファイルに書き出してたみたいだから、
Flushですぐ書き出すようにしたらうまくいったよ。
328デフォルトの名無しさん:2005/06/13(月) 19:54:06
>>326
> [StructLayout(LayoutKind.Sequential)]属性が必要

structはデフォルトでLayoutKind.Sequentialなので、それだけなら属性宣言は必要なかったりする。
CharSetとかが必要な場合は書かなきゃなんないけど。
しかし>>325の言ってるようにpublicフィールドには出ない警告のはずなんだが……?
329デフォルトの名無しさん:2005/06/13(月) 21:56:55
型がinternalというオチでは?
330デフォルトの名無しさん:2005/06/14(火) 01:17:35
DLLの拡張子(".dll")を返すようなプロパティなかったっけ?
Environmentあたり探したけどなかった。
331デフォルトの名無しさん:2005/06/14(火) 01:24:16
DLLの拡張子は.dllだろうそりゃ。
332デフォルトの名無しさん:2005/06/14(火) 01:38:06
いや、見かけた気がしたんだよ。
気のせいか・・・
333デフォルトの名無しさん:2005/06/14(火) 05:53:43
>>321
「大量」ってかいてあるからクォータかけてるとか

>>331
Linuxにも移植されてると聞くけどそんときは.soなんじゃないの?しらんけど。
334デフォルトの名無しさん:2005/06/14(火) 06:48:59
SPIファイルも中身はDLLだが、拡張子がDLLじゃないぞ。
335デフォルトの名無しさん:2005/06/14(火) 08:53:15
>>334
それは論点が違う。そいつに必要なのはIsDllとかIsAssemblyとかだ。
336322:2005/06/14(火) 09:55:15
>>327
有難うございます。
DateTime.Nowでも15〜16ms程度の精度はあるようなので、
処理時刻で名前がかぶるのはおかしいと思ったんですが、
バッファの関係だったんですね。

有難うございました。
337デフォルトの名無しさん:2005/06/14(火) 10:59:35
>>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の設定はほとんど触っていないので、そちらが原因の可能性もあるのですが・・・
誰かわかる人はいませんか?
339デフォルトの名無しさん:2005/06/14(火) 17:23:45
>>338
ttp://dev.mysql.com/downloads/connector/net/1.0.html

Connector/Net使ってみたらどうだろう。
340デフォルトの名無しさん:2005/06/14(火) 17:37:43
>>339
ありがとう
試してみたけどこれだとウィザード使えないみたいですね
どうにか解決できないものですかね
ウィザードを使用して開発できればodbcかどうかは気にしないんですけど・・・
341デフォルトの名無しさん:2005/06/14(火) 22:42:54
.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"
/>
以下略
342デフォルトの名無しさん:2005/06/14(火) 22:51:28
>>341
名前空間がある場合はSelectNodes/SelectSingleNodesはちと手間が必要。
ttp://www.atmarkit.co.jp/fdotnet/easyxml/easyxml05/easyxml05_03.html
343デフォルトの名無しさん:2005/06/14(火) 22:51:57
SingleNodesって矛盾したのは何だー!
344デフォルトの名無しさん:2005/06/15(水) 01:38:07
345デフォルトの名無しさん:2005/06/15(水) 13:47:05
質問失礼します。
window formのスクロールバーのBackColorを変えるには
どのような継承コードを書けばいいのでしょうか
ご教授お願いします
346デフォルトの名無しさん:2005/06/15(水) 14:27:37
347デフォルトの名無しさん:2005/06/15(水) 15:57:04
二つのファイルが同じファイルかどうか比較したいのですが、
比較するファイルが大量にあるので、比較部が遅くて困っています。
↓の高速化の手法を教えてください。


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();
}
348デフォルトの名無しさん:2005/06/15(水) 16:30:04
>>347
4096バイトずつ読み込んで比較しろ。
349デフォルトの名無しさん:2005/06/15(水) 16:55:45
そんなに高速化したいなら最初にファイルのサイズ比較するとか
350347: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);
  
(切断)
351347: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を使え。
353デフォルトの名無しさん:2005/06/15(水) 19:46:55
>>347
1) ブロック読みするんならBufferedStreamである必要はない。
  バッファリングする分余計なコピーが発生して損なだけ。

2) バッファサイズは4096じゃなくて8192にしてみ。

3) 最後の手段としては、unsafeで明示的なポインタアクセスをすることで
 配列境界チェックを避ける。

こんなところかな。それと、簡単なコードなんだから、等価なCのコード
と比較してどの程度遅いのか確認するのも良かろう。それ以上は
速くなりっこ無いんだから。
354デフォルトの名無しさん:2005/06/15(水) 20:27:56
32bit比較しろ。4倍位速くなるかも。
てか、byte配列比較のよさげなメソッドってどこかにある?
355デフォルトの名無しさん:2005/06/15(水) 20:38:29
>>354
アラインメントだのバウンダリだのを考えると、どのみちunsafeな
コードにはなるわなあ。
356デフォルトの名無しさん:2005/06/15(水) 21:08:14
32bit比較と言うと、BinaryReaderでReadInt32?
357デフォルトの名無しさん:2005/06/15(水) 21:25:21
2 つのファイルの MD5 ハッシュを作成して、それを比較というのは
どうだろうか?
358デフォルトの名無しさん:2005/06/15(水) 21:26:05
>>357
それは遅い。しかも確実ではない
359デフォルトの名無しさん:2005/06/15(水) 21:27:38
あ? いや、MD5 をキャッシュしておけば速くなるかも
360デフォルトの名無しさん:2005/06/15(水) 21:38:55
MD5が同じ場合、結局全部比較することになるから。
361デフォルトの名無しさん:2005/06/15(水) 21:50:22
しかし数十のファイルを相互比較するならチェックサムを使うのは有効だろう。MD5じゃなくて単純に足していくだけでも。
初めて比較するときについでにチェックサムを残しておいて。
362347: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;
 }
363347:2005/06/15(水) 22:54:04
unsafe コードは API呼び出しのときしか使ったこと無いので勉強中です。
チェックサムは、参考にさせてもらおうと思います。
364デフォルトの名無しさん:2005/06/15(水) 23:45:37
FCコマンド
WinDiff
365デフォルトの名無しさん:2005/06/16(木) 00:48:24
>>362
おいおいなんでBinaryReaderを使うんだよ。
BufferedStreamである必要が無いと言っただけ。
普通にFileStreamでいいだろ。
366デフォルトの名無しさん:2005/06/16(木) 00:50:03
と思ったが、32bit整数で比較しろと言われたからそうしたワケね。
367デフォルトの名無しさん:2005/06/16(木) 12:53:08
こんなの自分で作らずにFC使えって。
368デフォルトの名無しさん:2005/06/16(木) 13:23:19
CSV形式のファイルから検索条件をかけて特定列だけを
抽出したいのですがどのようにすればよろしいでしょうか?
369デフォルトの名無しさん:2005/06/16(木) 13:30:24
370347: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;
}
371347: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;
372347: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;
  }
 }
}
373347:2005/06/16(木) 14:41:12
つたないコードを突っついてくれた人、ありがとう。
374デフォルトの名無しさん:2005/06/16(木) 16:34:04
ちなみにどれぐらい速くなったの?
375347: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、タスクマネージャ
376347:2005/06/16(木) 17:42:37
バッファサイズに関しては、4096,8192,16384,65535 バイトと試しましたけどどれもほとんど同じという結果になりました。
377デフォルトの名無しさん:2005/06/16(木) 17:47:33
そのLibC#memcmp()だけど、
ポインタアクセスしてる区間はまるごとfixed{ }で囲んでおかないと危険だよ。
378デフォルトの名無しさん:2005/06/16(木) 22:06:38
>>375=347
何をどうしたところで大きな高速化は望めないわけで、
プログラムの動作を変更して、比較する回数を減らすような
方法を考えるのが本筋。

例えば、あるファイル群Aにあるファイルで内容が同じものを探すのに
foreach (string s in A)
{
 foreach (string t in A)
 {
  if (s != t && compare_file(s, t)) ... ; // 見つかった
 }
}
なんてやってるなら基本的に大間違いしているわけで。
379デフォルトの名無しさん:2005/06/16(木) 23:04:56
windowアプリを作成しています
外部exeをフォーム内で起動させ稼動させるにはどうすればよろしいでしょうか?
現時点では外部exeを起動できるとこまで出来ています
380デフォルトの名無しさん:2005/06/16(木) 23:08:07
フォーム内で起動させ稼働させるって、一体どういうのを想定してるのさ。
381デフォルトの名無しさん:2005/06/16(木) 23:13:52
.NETじゃなくてもそんなの不可能
382379:2005/06/16(木) 23:17:51
>>380
エミュレーターのようなアプリを想定しています。
>>381
そうですか。ありがとうございます
383デフォルトの名無しさん:2005/06/16(木) 23:25:38
OpenJaneの某派生にそういった機能があるぞ
スレビューで秀丸を走らせたり出来る
384デフォルトの名無しさん:2005/06/16(木) 23:25:54
>>379
VirtualPC見たいなやつを想定しているのか?
385379:2005/06/16(木) 23:29:14
>>383
ありがとうございます。調べてみます

>>384
はい、そのような感じでexeを指定してForm内のWindowで起動/操作といった感じです。
386デフォルトの名無しさん:2005/06/17(金) 00:18:55
出来たらぜひください
387デフォルトの名無しさん:2005/06/17(金) 14:27:52
C#でコンポーネント(ボタンやラベルなど)をドラッグした時に、デザイン時のように
元のコンポーネントの枠をカーソルに合わせて表示するにはどうすればいいんでしょうか?

どなたか知っていたらご教授お願いしますm(_ _)m
388デフォルトの名無しさん:2005/06/17(金) 18:37:36
ちょっとした疑問なんですけど、C#にはガベージコレクタが付いてますよね。
どうしてIDisposableインターフェースが必要なのかよくわかりません。
newして放っておけば、スコープが切れた所でいつか勝手にガベージコレクト
されて行くような気がするんですが。

それとも、一つの関数の中で巨大なオブジェクトを一時的に作り、開放して
まだスコープが外れないうちに別のメモリが必要になる場合に備えての事なん
でしょうか?
389デフォルトの名無しさん:2005/06/17(金) 18:49:55
>>388
ガベージコレクタにまかせっきりだとまずかったり枯渇したりしかねない
ソケットやデータベースの接続、GDIオブジェクトなどの
リソースを意識的に開放するのに使う。
390デフォルトの名無しさん:2005/06/17(金) 18:56:22
>>388
C:\superfree.txt というファイルがあるとして

private void certainMethod(){
  FileStream f = new FileStream(@"c:\superfree.txt", FileMode.Open, FileAccess.ReadWrite, FileShare.None);
}

こうすると、certainMethodを呼び出したら、しばらくC:\superfree.txtにアクセスできなくなる。
391デフォルトの名無しさん:2005/06/17(金) 19:17:32
>>389
レスありがとうございます。
という事は、IDisposableインターフェースはC#では文法的に汚い部分
ではあるけれど、現実面を見据えて(有限なリソース)、必要悪という
事で理解しました。

自作クラスにはできるだけ付けるようにします。
392デフォルトの名無しさん:2005/06/17(金) 19:18:40
>>390
あ、こちらにもレスが。感謝感謝。
そうですね。排他アクセスが解かれるのがいつなのか不明、というのでは
困りますからね。よく理解できました。
393デフォルトの名無しさん:2005/06/17(金) 19:24:31
GCが管理するのは「Managedリソース」のみ。
UnmanagedリソースはUnmanaged。
394デフォルトの名無しさん:2005/06/17(金) 19:28:12
>>393
あ、はい、LockBits/UnlockBitsなどは意識的に気を付けています。
というか、LockBitsしたGraphicsオブジェクトに描画操作をしても、無視
されるって事を最近知りました。
395デフォルトの名無しさん:2005/06/17(金) 19:30:41
あっ、、、そうか、、、マネージメモリが一時的にアンマネージ化されている
のに、マネージメモリのように扱ったら、後からガベージコレクトする時に
具合が悪いんだ。
396デフォルトの名無しさん:2005/06/17(金) 19:32:36
>>395
なんか変
397デフォルトの名無しさん:2005/06/17(金) 19:34:25
>>396
んーそうですか。まだどこか思い違いをしているのかな・・・・
GDI+でいろいろ遊んでいるんですが、LockBitsしたGraphics
オブジェクトへの描画メソッドは完全に無視されるんですよ。

その理由を考えていたんですが・・・・
398デフォルトの名無しさん:2005/06/17(金) 21:24:06
>>397
Graphics は単純な GDI+ のラッパーなわけで、
そもそもマネージドではない。

LockBits した Bitmap に Graphics 経由で描画できないのは、
単に GDI+ の仕様。
399デフォルトの名無しさん:2005/06/17(金) 21:51:26
>>398
そうなんですか。C++などでGDI+を使うと、LockBitsでReadWriteもしくは
Writeになっていれば、Lockした状態でも書けるんですけどね。

多分C#のラッパーGraphicsがLock中だとフラグを立てて、わざと無視して
いるんじゃないかと思います。C++とC#で動作が異なるので気になっていました。
400デフォルトの名無しさん:2005/06/18(土) 01:13:51
>>388
>どうしてIDisposableインターフェースが必要なのかよくわかりません。
>newして放っておけば、スコープが切れた所でいつか勝手にガベージコレクト
されて行くような気がするんですが。

そのいつかがいつ発生するかが問題。

クラスのコンストラクタでファイルから適当な値を読み込み(無ければ初期値)、
読み込んだデータに何らかの操作をし、
デストラクタでファイルに保存

というクラスを書いた場合、デストラクタが呼ばれるのは GC が発生したときらしい。

IDisposable を使わずにこのクラスを new して解放という動作を繰り返した場合、
1 初期値
2 初期値
3 初期値
1 書き込み
2 書き込み
4 初期値
3 書き込み
:
:
といった感じの動作になる。
401デフォルトの名無しさん:2005/06/18(土) 01:14:49
しまった。

4 初期値

じゃなくて、

4 読み込み

だった。
402デフォルトの名無しさん:2005/06/18(土) 09:26:48
cscでコンパイルしたexeを他マシンに持っていって実行すると「署名がありません」とかいわれませんか?
コンパイルする側も実行する側もWinXP SP2です。
ただ単に..NET Frameworkのディレクトリにあったcscを/t:winexeで使ってます。
解決方法など知っている方よろしくお願いします
403デフォルトの名無しさん:2005/06/18(土) 09:46:08
OSの設定でフェード効果などのアニメーションを有効にしているかどうかを
知るためにはどうしたらよいでしょうか
404デフォルトの名無しさん:2005/06/18(土) 10:02:52
>>402
ttp://www.atmarkit.co.jp/fwin2k/win2ktips/498zoneid/zoneid.html

>>403
SystemInformationにプロパティが追加されるまではSystemParametersInfo関数を。
405デフォルトの名無しさん:2005/06/18(土) 13:26:11
>>404
C#が原因ではないんですね。
自分なりに調べていた内容だと、署名に関するものかと思っていたので、証明されてる機関に申請しないといけないのかと考えていました。
ありがとうございました。
406デフォルトの名無しさん:2005/06/18(土) 20:08:00
Form上に配置しているコントロール(ボタンなど)
を画像として保存したいのですが、どうすればいいでしょうか?
407最凶VB厨房:2005/06/18(土) 23:48:05
http://www.kawaz.jp/diary/?1217
@ Control から Bitmap を取得する:
408デフォルトの名無しさん:2005/06/18(土) 23:49:55
>>407
ありがとうございます。
409デフォルトの名無しさん:2005/06/19(日) 08:20:46
すいません。
C#でファイルロックはどうしたら良いのでしょうか?
410デフォルトの名無しさん:2005/06/19(日) 08:24:27
FileShare
411デフォルトの名無しさん:2005/06/19(日) 08:52:08
そうか、StreamWriterやらStreamReaderを行き成り使わないで、
FileStreamから作ればいいのか。
412デフォルトの名無しさん:2005/06/20(月) 05:41:35
今Format8bppIndexed形式のBitmapデータですごく悩んでいます。

パレットに256色のColorをセットする所まではわかるのですが、例えば
これをグレースケールにしたい場合、Flagsの解釈を0x00000002にする
必要があります。

ところが、なぜかわかりませんが、ColorPalette.Flagsはgetしかありません。
どうやったらグレースケールにパレットをセットできるのでしょうか?
413デフォルトの名無しさん:2005/06/20(月) 10:43:01
Flagsなど無視して素直に0,0,0から255,255,255までの色で埋める。どうせ灰色はR=G=Bなんだし。
414デフォルトの名無しさん:2005/06/20(月) 11:32:42
激しく池沼と罵倒されるのを承知で質問します。

コンソールアプリですが、Mainからbitmapを引数とするvoidメソッドが呼べません。
コンパイラ0120エラーなんですが、どのような記述を追加or削除する必要がありますかね?
415デフォルトの名無しさん:2005/06/20(月) 11:35:44
>>414
激しく池沼

エラーメッセージに書かれてるとおりだが。
オブジェクト指向の基礎から教えるにはここは向かないぞ。
416デフォルトの名無しさん:2005/06/20(月) 11:54:09
>>415
やはりそうですよね

吊ってきます
417デフォルトの名無しさん:2005/06/20(月) 12:12:48
事故解決しますた、スマソ >>415さん
418デフォルトの名無しさん:2005/06/20(月) 13:21:42
>>413
ありがとう。うまく行きました。
419デフォルトの名無しさん:2005/06/20(月) 15:11:05
C#には、VB.NETのような引数付きプロパティはありませんが、似たような
ものを実現するには、やはりメンバ関数によるしかないのでしょうか?
420デフォルトの名無しさん:2005/06/20(月) 15:35:52
>>419
まあそうだな。あとは用途が幾らか異なるがインデクサ。
しかし必要と思うことはあんまり無いので別にいいや。
ガイドラインでも1つより多くは使用するなって書いてるし。
421デフォルトの名無しさん:2005/06/20(月) 22:39:31
ソケットサーバー作るのめんどくせぇー
同期ソケットをマルチスレッドで使いたいんだよ
プール?使うかボケ
結局クラス作らなきゃいけねーしあほくさ
422デフォルトの名無しさん:2005/06/21(火) 20:51:08
DataTableのキー列のDataColumnのAutoIncrementをtrueにして、
NewRow()で作ったDataRowをフォームに表示して、詳細を入力させてから
[OK]でDataTable.Rows.Add(DataRow)しているのですが、
たとえば今回新規のキーが5で、フォームで[キャンセル]されると、
次に新規作成するとき6が出てきます。
作ったDataRowを結局使わなかったときに、次のNewRow()でまた5が
出てきてほしいのですが、どうにかできませんか?
423デフォルトの名無しさん:2005/06/21(火) 21:03:59
どうにもできないし気にする必要もない。
いっそ非表示にしてても良いくらいだ。
424デフォルトの名無しさん:2005/06/21(火) 23:32:36
>>419
ま、コレクションを返すプロパティで代用くらいかな。
425デフォルトの名無しさん:2005/06/21(火) 23:59:01
>>424
代用って言うか、そもそも C# で index 付きプロパティがサポートされてない理由って、
コレクションのプロパティで実現すべきだと判断されたからじゃないの?
426デフォルトの名無しさん:2005/06/22(水) 03:20:41
>>421
君が作り方を知らないだけ
427デフォルトの名無しさん:2005/06/22(水) 09:17:29
C#でアンマネージなデータを扱うクラスを書いたのですが、メンバ関数の
コールがとても遅い気がするのです。C++ではメンバ関数の呼び出しが
高速だったので、とても気になります。
428デフォルトの名無しさん:2005/06/22(水) 09:29:06
気にするな。
429デフォルトの名無しさん:2005/06/22(水) 13:37:34
Windowsフォームで、Javaで言うGridLayoutを簡単に実装する方法ってありますか?
カレンダーみたいに方眼状にパネルを貼り付けるアプリケーションを作りたいのですが、レイアウトの所は自分で実装しないと駄目ですか?
430デフォルトの名無しさん:2005/06/22(水) 13:44:49
標準では無いな。

いくつか転がってるような感じだが、逆に面倒かモナー。
ttp://www.google.com/search?oe=utf8&q=C%23+GridLayout
431デフォルトの名無しさん:2005/06/22(水) 16:14:21
.net2.0にはなんかあった気がする。
使ってないけど。
432デフォルトの名無しさん:2005/06/22(水) 17:18:11
コンソールアプリで、参照をつかって、Formsを出してるんだけど
this.TopMostがしたいんだけどコンソールアプリだから、thisがないんだけど、どうしたらいいかな?
433デフォルトの名無しさん:2005/06/22(水) 17:38:19
そのFormのTopMostを呼べば良いんじゃないかな?
434デフォルトの名無しさん:2005/06/22(水) 21:07:40
文字列の比較で ==比較演算子 よりも Equalsメソッド を使う利点って何かある?

VB.NETだったらソースの頭に Option Compare Text って入れると
== は大文字小文字区別しないけど Equals だと区別するっつー事で
異なる動きするから気をつけないといけないみたいだけど
C#はこの問題は無いみたいだし、Equalsメソッドでの比較はただ見づらいだけだと思うんだけど。
435デフォルトの名無しさん:2005/06/22(水) 21:13:36
利点も何もop_equalityはEqualsを呼んでるだけだから差はない。
強いて言うならEqualsはObject型のStringインスタンスでも文字列の比較になる点とか。
436デフォルトの名無しさん:2005/06/22(水) 21:43:00
==は比較される側がnullでもぬるぽで落ちない。

C#はぬるぽじゃないけどついついぬるぽと言ってしまう
437デフォルトの名無しさん:2005/06/22(水) 21:58:47

 ぬ る  り
438デフォルトの名無しさん:2005/06/22(水) 23:01:54
object a = "A".ToLower();
object b = "a";
a == b はtrueかfalseか?
439デフォルトの名無しさん:2005/06/22(水) 23:26:08
>>429
Avalon / XAML 待ち。
440デフォルトの名無しさん:2005/06/22(水) 23:45:48
>>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するしか手はないんでしょうか?
442デフォルトの名無しさん:2005/06/23(木) 00:15:28
>>441
そうじゃないとRowStateの管理がやってられないからな。
443441:2005/06/23(木) 00:21:45
ありがとうございます。
RowStateとやとやらは触ったことがないのですが、
扱うときは心してかかります。

ありがとうございました。
444デフォルトの名無しさん:2005/06/23(木) 00:33:39
コンソールからフォームを開いたあと、
コンソールのウィンドウを閉じて、
フォーム側で全制御を行いたいのですが、
コンソールのウィンドウってどうやって閉じればいいんでしょうか?
445デフォルトの名無しさん:2005/06/23(木) 01:27:01
DataGridでColumnの境界線をダブルクリックすると丁度いい長さに自動調整
してくれますが、これをwidthChange系のイベントで取得することは可能なのでしょうか?
ColumnStyleクラスでWidthが変化したときのイベントを拾って処理をしたいのですが
どうしたらいいのかな
446デフォルトの名無しさん:2005/06/23(木) 10:27:53
普通にDataGridColumnSyleにWidthChangedイベントがあるようだが。
447デフォルトの名無しさん:2005/06/23(木) 10:40:47
と思ったけど幅の自動調整時には発生しないっぽい。
DataGridView待ち。
448デフォルトの名無しさん:2005/06/23(木) 13:26:31
     .┌━┐    ┌━┐
      ┃┌╋──╋┐┃
      └╋┘    └╋┘
        ┃ ・   ・  ┃        ┌━━┐
    ●━╋┐    ┌╂━━━━╂┐  ┃
    └━┷┴━━╂┘        └╋━┘
同じスレにはコピペ ┌╋┐        ┌╋┐
できるけど、違う  ┃└╋╋━━╋╋┘┃
スレにはコピペでき ┃  ┃┃    ┃┃  ┃
ない不思議コピペ ┃  ┃┃    ┃┃  ┃
           └━┘┘   └└━┘

てすと
449デフォルトの名無しさん:2005/06/23(木) 13:42:07
>>448
他のスレに貼れないかどうか試して〜〜〜
という心理を狙った荒らし?
450デフォルトの名無しさん:2005/06/23(木) 18:58:24
変数のスコープのルールが厳しすぎる・・・orz
隠蔽を意図的にやろうとしてもコンパイル時にエラーで叱られる。

というか、バグじゃないかこれ?

for文中でfor (int i = として宣言した i は、for文のスコープが切れると
消滅するが、その後で int i = としようとすると、CS0136エラー発生。
451デフォルトの名無しさん:2005/06/23(木) 19:01:24
いや当然だし。
forの外のスコープから見ればiを2つ宣言してるじゃん。
452デフォルトの名無しさん:2005/06/23(木) 19:05:36
>>451
・・・ばか?
453デフォルトの名無しさん:2005/06/23(木) 19:13:39
C#って、名前空間が同じでも、違うファイルに納められて分割コンパイルされると、
その間のモジュールコールがすごく遅くならねえ?

同一ファイルにあるアセンブリは一緒にJITによってネイティブに落とされるが、ファイル
が違うと、JITはその都度ネイティブを発生するのかねえ。

まだ検証中の段階だけど、すごくよく呼び出される関数は、同一ファイルに入れて
しまった方がずっとコールが速いようだ。
454デフォルトの名無しさん:2005/06/23(木) 20:48:03
二次元配列の初期化用データをコピペで貼り付けると、中括弧 { が
二重になっていると、括弧毎に自動的にインデントされてしまい、前に
どんどん空白が入るんですけど、何とかなりませんか?

↓こんな具合

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}};
455デフォルトの名無しさん:2005/06/23(木) 20:54:22
あー俺もVisual Studioの配列初期化のインデントだけはいただけんな。
糞だよあれは。
456デフォルトの名無しさん:2005/06/23(木) 21:18:58
>>454
そうなんですか・・・・・
そしたら、コピー前に // でも入れてコピペして、後から // を取る、とかの
エディタを騙す方法で行くしかないですね。ありがとうこざいました。
457デフォルトの名無しさん:2005/06/23(木) 21:19:24
×>>454
>>455
458デフォルトの名無しさん:2005/06/23(木) 23:10:03
>>450
そんなくだらないことに悩んでる暇があったら変数名変えろ。

>>453
それはC#の話ではないんではないか?
459デフォルトの名無しさん:2005/06/24(金) 02:24:17
Visual Studioはフォーマットのスタイルもカスタマイズできんし
リファクタ機能もないし
「定義へ移動」するとバカチョンで候補がいっぱい出てくるし
どうなっとるんじゃ。
460デフォルトの名無しさん:2005/06/24(金) 02:37:14
リファクタはVS2005で追加されるんじゃなかったっけ?
461デフォルトの名無しさん:2005/06/24(金) 03:03:24
C#1.1使ってていろいろと不満が出てきたから、これらがC#2.0で解消されると
したら、素晴らしいね。
462デフォルトの名無しさん:2005/06/24(金) 07:14:02
>>459
どっちも2005で付いてるよ
463デフォルトの名無しさん:2005/06/24(金) 11:31:59
>>454
貼り付け直後にUndoするといいかもです。
左端に//書いた行をコピペするとインデント位置まで寄ってしまう現象は
それで回避してます。
464デフォルトの名無しさん:2005/06/24(金) 15:22:01
FormのコンストラクタとLoadイベントはどう使い分けるべきでしょうか。
VB6のときは、一度閉じたフォームのインスタンスをまたShowしたり、
コンストラクタでコントロールにアクセスすると勝手にロードされるとか
いろいろあったので使い分けの基準があったのですが、Windows Formsだと
どうせ閉じるたびにインスタンス作成からやり直しなので、開くたびに
コンストラクタもLoadも通るのだからどっちでも同じな気がします。
hWndが必要な処理だけはLoad、とかそんな感じでしょうか?
465デフォルトの名無しさん:2005/06/24(金) 16:05:44
http://dobon.net/vb/dotnet/file/getfolderpath.html

Application Dataで、ローミングユーザーと非ローミングユーザーってあるけど、
どう使い分けたらいいの?
466デフォルトの名無しさん:2005/06/24(金) 16:07:07
eventに登録済みのハンドラを列挙したり全削除したり
+=でハンドラを加えるのではなく単に現在のハンドラと置き換える方法はありますか?
467デフォルトの名無しさん:2005/06/24(金) 16:17:37
468デフォルトの名無しさん:2005/06/24(金) 16:29:43
>>467
EventDescripterはAddEventHandler(), RemoveEventHandler()というメソッドを持っていますが
イベントの保持するマルチキャストデリゲートのコレクションは公開していないし、
それらを一挙に消したり直接置き換えたりすることはできないようですね。

私のような要求は特に珍しくも無いと思うのですが、一般に皆さんはどうやっているのでしょうか?
469デフォルトの名無しさん:2005/06/24(金) 17:18:57
>467をちょいと考えれば要求は満たせるはずだが。
470デフォルトの名無しさん:2005/06/24(金) 18:08:07
そうでしたか。
結局、本当にやりたいのは追加型ではなく置き換え型でイベントハンドラを操作したかっただけなので、
イベントハンドラ群を明示的に他の場所に保存しておき、
-=で削除してから+=で追加という愚直な方法でとりあえず対応しました。
471デフォルトの名無しさん:2005/06/24(金) 19:12:37
>>465
文字通りローミングするかしないかで使い分ける。
一般的にはユーザー固有のものをMachine Independentかどうかで判断する。

例えば、「前終了したWindowの位置」なんて情報はローミングするとダメポ。
こういう情報を保存して次に起動されたときにその位置に復元するってのがよくある使い方。
でも、あるMachineで1600*1200の解像度を持っていて、終了時に
1400, 1024の位置で終了して、次もその位置で表示するとする。
これが他のMachineで使われたとして、そのMachineの画面全体の解像度が
1024*768だったら画面外に表示してしまうだろう?

逆の例はIMEのユーザー辞書とか。これはどのMachineで使用されてもOKなので
ローミングされるべき。

ただ、サイズの関係でローミングしないという判断をすることもある。
ローミングは(一般的には)ネットを通じて移動するので重いっちゃ重いから。
ただ、運用で解決できるのでこれはあまり考慮しなくてもよい。

っていうかこういう詳しい話はDesigned for WindowsXPとか嫁。
472デフォルトの名無しさん:2005/06/24(金) 19:27:17
>>464
どっちでもいい場合が多いけど、一般的にはコンストラクタで
重かったり例外出すようなことはするな。コンストラクタはシンプルなほうがいい。
っていうか、一般的に処理は遅らせられるだけ遅らせるべき。
表示直前まで必要のないことはLoad、作った瞬間から必要なものはコンストラクタ
でやる。
473459:2005/06/24(金) 21:41:47
>>462
付きますか。しばらくeclipseでjavaやってたのでイライラしますわ。
はやく正式版でないかな。
474デフォルトの名無しさん:2005/06/25(土) 02:04:21
>>466
イベントハンドラのに登録するメソッドでデリゲートを呼び出すようにして、
イベントを置き換えたいときはそのデリゲートをいじればいい
例えば

MouseEventHandler onMouseDown;

public MyForm() {
...
button.MouseDown += new MouseEventHandler(OnMouseDown);
}


private void OnMouseDown(object sender, MouseEventArgs e) {
onMouseDown(sender, e);
}

みたいにしてbutton.MouseDownを置き換える代わりにonMouseDownの中身を変えればいい
475デフォルトの名無しさん:2005/06/25(土) 02:15:56
タブコントロールの背景色って変更できないんでしょうか?(TabPageではなく)
タブがない部分の後ろに見えるタブコントロールを透過したいのですが何か方法はありませんか?
476デフォルトの名無しさん:2005/06/25(土) 02:16:43
>>474
イベントハンドラの候補がNコあったりするとそれではつらいのでは
ないでしょうか。
477デフォルトの名無しさん:2005/06/25(土) 02:41:33
>>475
無理。
だけど自分で塗ることは出来る。
478デフォルトの名無しさん:2005/06/25(土) 03:44:24
>>476
それはマルチキャストの場合ってこと?
479475:2005/06/25(土) 23:41:44
>>477
無理ですか。
自分で塗るというのはどうすればいいんでしょうか?
TabControlを継承した自作TabControlクラスのOnPaintをオーバーライドしてみましたが、
OnPaintイベント自体呼ばれない様子・・・


ちなみに現在は、タブのない部分にフォームを親に持つパネルを貼り付けて、
パネルを透過させることでタブコントロールの背景が見えないようにしています。
480デフォルトの名無しさん:2005/06/25(土) 23:48:42
DrawMode DrawItem
481デフォルトの名無しさん:2005/06/26(日) 04:57:54
C#には、C/C++で言う所のtypedefが無いようです。
例えば、あるクラスの配列を新しい型として定義したい時は、どうすれば
いいのでしょうか?
482デフォルトの名無しさん:2005/06/26(日) 06:44:42
using で typedef に近いことは出来るけれども配列は無理かも
483デフォルトの名無しさん:2005/06/26(日) 06:50:42
>>482
わかりました。ありがとうございます。
484デフォルトの名無しさん:2005/06/26(日) 15:02:26
string[]でもっているものをArrayListに移したいとき
(ArrayList.RemoveAt(int)が使いたい)
ってどう書くのがスマートですか?
ループまわして一個ずつ読み込んでってのがきれいじゃないので…
485デフォルトの名無しさん:2005/06/26(日) 15:13:30
>>484
string[] strArray = {"123", "456", "789"};
ArrayList lstString = new ArrayList(strArray);
lstString.RemoveAt(0);
foreach (string str in lstString) 
{
    Console.WriteLine(str);
}
486デフォルトの名無しさん:2005/06/26(日) 15:20:03
>>481
その配列をメンバーに含んだクラスを定義するのじゃ駄目なの?
487484:2005/06/26(日) 15:50:36
>>485さん
コンストラクタでひっぱれたんですね。
ありがとうございました。
488デフォルトの名無しさん:2005/06/27(月) 12:44:45
逆に「あるクラスの配列を新しい型として定義したい時」の
メリットって何だろ。それを書けば代替策のレスがつくかもしれない
ですね
489デフォルトの名無しさん:2005/06/27(月) 13:59:19
>>488
いえ、単に読みやすさを考えての事だったんです。
それと、C/C++の癖が抜けて無くて。それだけです。
490デフォルトの名無しさん:2005/06/27(月) 14:52:14
インターフェースとabstractクラスの
違いがわかならくてインターフェースの場合
複数継承できるってぐらいしか思いつかないだけど
どう使い分けるの?
491デフォルトの名無しさん:2005/06/27(月) 16:35:35
>>490
abstract class は実装を持てる。
interface は文字通りインターフェースのみを持てる。

なので、全ての派生クラスに共通する何らかの処理を基底クラスでやりたかったら
abstract class を使わないと駄目。
そういう必要がなければ interface を使う。
492デフォルトの名無しさん:2005/06/27(月) 18:37:46
ひとつのクラスは複数のinterfaceを実装できるが、
abstractなものを含め、基底クラスはひとつしか持てない。

ライブラリやコンポーネントなど他人が書いたものを
利用するときにinterfaceは役に立つ。
493デフォルトの名無しさん:2005/06/27(月) 21:40:59
まあそういった技術的なものだけでなくて
インターフェイスとは何かとか抽象化とは何かを考えてみるのもいいかもな。
494デフォルトの名無しさん:2005/06/27(月) 23:27:37
未だにまともなドッキングコントロールはないの?
フリーソフトでシェアウェア使うのもなんだし・・・
495デフォルトの名無しさん:2005/06/27(月) 23:35:49
あるし。
496デフォルトの名無しさん:2005/06/27(月) 23:37:42
まともというのの定義が分からないと答えようもないな。
497デフォルトの名無しさん:2005/06/27(月) 23:50:05
まともは、IDEとほぼ同じ挙動・軽さでかつ
フォームデザイナーで編集可能なものと考えてくれ。

>>495
Magic Docking(+DockingManagerExtender)以外なら教えてくれ。
498デフォルトの名無しさん:2005/06/27(月) 23:55:08
499デフォルトの名無しさん:2005/06/27(月) 23:57:37
>>498
前に使ったことあるんですが、何かが気に入らなくてやめたような・・・
思い出せないので、また使ってみます。
ありがとうございました。
500デフォルトの名無しさん:2005/06/28(火) 01:08:22
漏れは Office XP 以降で付いたスマートタグみたいな奴が欲しいな
501豆腐:2005/06/28(火) 17:23:12
質問です。
 RS232Cでつないだ機器から出力されるデータ(文字列)を保存したいと思っています。
こういった場合、逐次ファイル一行づつ書き込みを行えばいいのか、テキストボックスなどに
格納しておいて出力が終了されてからファイルに書き込めばいいのかわかりません。
 後者のほうは、メモリを食いそうです。前者のほうは、ファイルの書き込みがおいつけるのか?
という疑問があります。
 こういった場合、一般的には、どのようにしてファイルに保存するのでしょうか?
ご教授をお願いします。よろしくお願いします。
502デフォルトの名無しさん:2005/06/28(火) 17:43:41
>>501

ファイルの書き込みストリーミングでは、書き込みメソッド呼んでも、ある程度は自動的にメモリにバッファされて、まとめてHDDに書き込まれる仕組みだと思う。
ストリーミングをクローズする処理で確実に全部書き込まれるみたいにね。このバイト値を大きく設定すれば、自動的に無駄なHDDアクセスはコントロールできるような気もする。
少なくとも、自分はクローズしていない時点で、ファイル開いてみたら、書き込まれているはずのテキストが書き込まれていなかったというバグを作った。

多分HDDへの書き込みが追いつかないという問題は発生しないと思うけど、いずれにせよ、ずっとガアガアHDDにアクセスしてるのはパフォーマンス的にスマートな方法じゃないのは確かだと思う。
最初に書いたWriteメソッドのバッファがうまく使えれば使うか、配列もしくは、テキストボックスで効率よいバッファリングができるのなら、その方向で考えたらいいんじゃないかな?

503デフォルトの名無しさん:2005/06/28(火) 17:47:06
RS232Cの転送速度とHDDの転送速度くらいは把握してるんだな?
いずれにせよ真っ当なOSならバッファを使って読み書きするから大した問題ではないがな。

あとテキストボックスって何さ。なんで文字列の一時保存にわざわざコントロール?
stringなりStringBuilderなりに溜めていきゃいい話。
ついでに表示もしときたいってんならわからんでもないけど。
504デフォルトの名無しさん:2005/06/28(火) 21:09:43
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() ;
505デフォルトの名無しさん:2005/06/28(火) 21:17:31
権限
506デフォルトの名無しさん:2005/06/28(火) 23:17:44
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' の定義が既に含まれています。

}

なぜこのようなエラーが出るのか、どなたか解説していただけないでしょうか。
508デフォルトの名無しさん:2005/06/29(水) 08:09:58
>>507
> public int this[int i]

これは内部でプロパティ 'Item' として作られるので、

> public class Item

この内部クラスと名前がぶつかる。
509デフォルトの名無しさん:2005/06/29(水) 08:15:27
>>508
ああ、それをすっかり忘れていました!
サンクス。
510デフォルトの名無しさん:2005/06/29(水) 08:16:26
ちなみに回避したい場合はインデクサにSystem.Runtime.CompilerServices.IndexerNameAttribute属性を適用する。
511デフォルトの名無しさん:2005/06/29(水) 13:51:34
>>510
サンクス
512デフォルトの名無しさん:2005/06/29(水) 13:56:52
C#に限った話ではないが、
コードレビューで文字列のある桁数毎に"-"を挿入する処理があったのだが、その"-"を HAIHUN って定数きってそれを使うように作ってあった。
こういう場合って普通定数きるもん?ハイフンに対してハイフンって定数きってもしょうがない気がするのだが。
何故定数名がローマ字なのかも気になるがそこは無視してくれ。
513デフォルトの名無しさん:2005/06/29(水) 14:02:56
Separatorなら良かったかもな。
美しく書くなら、区切り文字を受け取るオーバーロード作ってそれに処理を任す。
514デフォルトの名無しさん:2005/06/29(水) 14:41:14
>>512
そりゃ単なる、よくある糞コードです。
そのコードを書いた人をののしってくるといいでしょう。
515デフォルトの名無しさん:2005/06/29(水) 15:46:43
定数ってのはそれ自体に意味が無いものに分かりやすい名前をつけてソースを理解しやすくしたり、
後に変更が入った時に一箇所変えるだけで全部に対応できるようにする為の物。

512の例だったらハイフンにハイフンって名前を付けてるので意味が無い。
やるなら513があげた様にSeparatorとか"-"がどういう意味かを表す名前にするか、直書きするか。
いつか"-"じゃなくて別の値に変更になるかもとかが無いんだったら直書きで良いんでないの。
516デフォルトの名無しさん:2005/06/29(水) 20:09:37
商用利用可なコマンドバーコントロール(Rebar, CommandBar, CoolBar)でお勧めなのはありますか?

今はこれを試してるんですがどうもデザイナでの配置がうまくいかないんだよなぁ・・・。
ttp://www.codeproject.com/cs/menu/rebarcontrol.asp
517デフォルトの名無しさん:2005/06/29(水) 20:38:48
インデクサにstaticがつけられないのは何か理由があるんでしょうか?(ないわけがないと思いますが
518デフォルトの名無しさん:2005/06/29(水) 20:53:38
new Array[x] ってやられると「インデクサ読み込み」と「配列生成」の区別が付かなかったとか、きっとそんな理由
519デフォルトの名無しさん:2005/06/29(水) 21:03:44
つか静的インデクサって想像がつかないんだが、どんなのに使おうっての?
520デフォルトの名無しさん:2005/06/29(水) 21:19:14
静的インデクサの話は、なぜか定期的に出てくるよな。
521デフォルトの名無しさん:2005/06/30(木) 00:46:01
すみません。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#だとどのように書いたらよろしいでしょうか?
ヒントでも結構ですので教えていただけますか?
522デフォルトの名無しさん:2005/06/30(木) 00:52:44
つ C# 言語の仕様  2.4.4.5 文字列リテラル
つ C# プログラマーズ リファレンス  string
523デフォルトの名無しさん:2005/06/30(木) 00:54:18
TcpClient client = new TcpClient(server, port);
string message = ?????
byte[] data = System.Text.Encoding.ASCII.GetBytes(message);
524デフォルトの名無しさん:2005/06/30(木) 01:41:10
>522-523
探してみます。ありがとうございます。
525デフォルトの名無しさん:2005/06/30(木) 10:51:18
たとえばエクスプローラで、ファイル名の変更モードで
ファイル名として無効な文字を含んだ文字列を貼り付けると、それだけ
はじかれて張り付いたり、無効な文字のキーをタイプしても
無反応だったりするんですが、これをTextBoxでやるには
どうしたらよいでしょう。
526デフォルトの名無しさん:2005/06/30(木) 11:01:10
Key〜イベントがあるじゃん
527521: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オーバーライドしてできるのようなのですが
シャットダウンを中止する方法がわからないのですが
529デフォルトの名無しさん:2005/06/30(木) 21:30:42
>>528
Microsoft.Win32.SystemEventsクラスのSessionEndingイベントで通知をもらう。
SessionEndingEventArgsが渡ってくるので、Cancelプロパティをセット。
530デフォルトの名無しさん:2005/07/01(金) 02:25:33
非常に初歩的な質問ですみません。

文字列を半角英字(アルファベット)で始まるかをチェックするために、
Char.IsLetter( input[0] );
を利用しようとした所、全角文字でもTrueが返ってきてしまいます。
(そういう仕様の様です)

私が望む事を実現するために、使える手段を探しています。
やはり、正規表現を使うしかないのでしょうか?
531デフォルトの名無しさん:2005/07/01(金) 02:43:31
'a' <= input[i] <= 'z' && 'A' <= input[i] <= 'Z'
だと動かんの?
532デフォルトの名無しさん:2005/07/01(金) 02:43:54
Char.IsLetter(input[0]) && input[0] < 0xff
とかではまずいのか
533530:2005/07/01(金) 11:29:10
両方、思いついていませんでしたorz
なぜか、そういうメソッドを探すの一生懸命になってました。
視野が狭くなっていたんだなぁ、と勉強になりました。ありがとうございます。

ちなみに、531は&&ではなく、||ですよね?
534デフォルトの名無しさん:2005/07/01(金) 12:58:36
>533
||だと全ての文字がヒットするだろw
535534:2005/07/01(金) 13:00:49
'a' <= input[i] && input[i] <= 'Z' と見間違えたorz 吊ってきます
536デフォルトの名無しさん:2005/07/01(金) 13:05:28
'a' <= input[i] <= 'z'
C#においてこの書き方って有効なのか?
537デフォルトの名無しさん:2005/07/01(金) 13:09:14
C#において、「クラスAはクラスBからしか生成できない」ということを明示することは可能でしょうか?

あと、クラスのメンバを現在のネームスペースの外からはアクセスできないようにすることはできますか?
538デフォルトの名無しさん:2005/07/01(金) 13:59:13
>>537
クラスAのコンストラクタで引数を秘密の合言葉にして、
それをクラスBの中に仕込む。

あと、現在のネームスペースを別DLLにしてメンバをinternalにする。
539531:2005/07/01(金) 14:06:06
すまん
540デフォルトの名無しさん:2005/07/01(金) 20:18:11
>>536
無効。「'a' <= input[i]」 の時点で bool になってドボン

>>537
クラスBをクラスAの内部クラスにするとか
541デフォルトの名無しさん:2005/07/01(金) 20:46:08
enum Hoge{
One=1, Two=2,}

ってあった場合に文字列の "One" から Hoge.One に変換する方法きぼん
542デフォルトの名無しさん:2005/07/01(金) 20:48:46
enum#parse
543デフォルトの名無しさん:2005/07/01(金) 20:50:54
EnumクラスもParseメソッドも先頭大文字だぜ。
544デフォルトの名無しさん:2005/07/01(金) 21:25:53
int. って打てば IntelliSense が効くのに
enum. じゃ反応せえへん
enum って System.Enum へのエイリアスじゃないの
545デフォルトの名無しさん:2005/07/01(金) 21:27:01
その理屈だとclassやstructでもインテリセンスがきくことになるな。
546デフォルトの名無しさん:2005/07/01(金) 21:41:05
>>542
サンキュー
typeof(Hoge) ってしてから必死にメンバを探していたぜ
547デフォルトの名無しさん:2005/07/01(金) 22:07:42
AppDomainにプログラム?をロードしたり
特定のAppDomain切り離して停止したり
とかそういうことをやるには、ホストアプリケーションを書かなければ
ならんのでしょうか?
548デフォルトの名無しさん:2005/07/02(土) 00:29:34
別に書かなくても良いがあんまり旨味もないな。
549537: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();
  }
 }
}
という方法を思いつきました。なんか変態的な気がするのでやらないけど。
550デフォルトの名無しさん:2005/07/02(土) 08:11:11
private class A にすりゃ鍵なんて要らないじゃん
551デフォルトの名無しさん:2005/07/02(土) 13:51:12
DataRowクラスの実装が参考になるかも。
552デフォルトの名無しさん:2005/07/02(土) 13:57:07
要するにコンストラクタをinternalにしてDLLにしろってことだな。
553デフォルトの名無しさん:2005/07/02(土) 16:22:53
>>545
きいたほうが自然だとおもうんだけど
なんできかないの?
554デフォルトの名無しさん:2005/07/02(土) 16:29:51
お前は本当に馬鹿だな
555デフォルトの名無しさん:2005/07/02(土) 18:23:52
ASP.NETが閑散としてるっぽいのでここでお聞きしたいのですが、
勉強の為に有名なWebアプリのソースを見たいのですが、
BlogやWiliや掲示板でASP.NETの有名なのって無いでしょうか?

Blogは.Textが見つかりましたが、うなぎスクリプトのC#版とか無いですか?・・・
556デフォルトの名無しさん:2005/07/02(土) 18:49:04
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についての詳しい解説している本やサイトってないでしょうか。
557デフォルトの名無しさん:2005/07/02(土) 18:57:44
>>556
どういう具合にネイティブ型にマップするか、については唯一の正解はない。
動けばいい、とも言えるし、目的によっても違う。

早い話がWin32だとint,long, pointerが全て32bit整数で、まあ符号あり無しの
違いはあるが、全てごっちゃにしてしまえるのも確かだ。

SendMessage()の例でいうと、wParamやlParamは色々な使い方をされる。
ただの整数、ハンドル、ポインタといったものが渡される可能性があって、
Win32ではそれらが全て32bit整数だから、ごっちゃにできるワケだ。

で、あんたのプログラムでただの整数を渡すような使い方しかしないのであれば、
wParamやlParamはたんにintとすればよいし、他のものを渡すのであれば、
IntPtrのほうが便利かもしれない。その辺は、単に利便性の問題。

558デフォルトの名無しさん:2005/07/02(土) 19:00:10
MSDN。

まあ簡単に言えば、サイズさえ合えば何でも良い。
32bitプラットフォームなら、ポインタをInt32でやろうがUInt32でやろうがIntPtrでやろうがshort二つ並べようが、
はたまたclassインスタンスの参照を渡そうがref参照を渡そうが。
使いやすいものを使えばいい。
UINTは(Win32なら)unsigned INT32としてどっかのヘッダで定義されてるから、UInt32でやるのが自然だが別にInt32でやってもいいし。

が、まあプラットフォームの縛りから逃れるにはInt32やらUInt32やらInt16*2やらは避けた方が無難だ。
実際にはそうも言ってられないが。
559デフォルトの名無しさん:2005/07/02(土) 20:22:02
>>557-558
>早い話がWin32だとint,long, pointerが全て32bit整数で、
>まあ簡単に言えば、サイズさえ合えば何でも良い。

ああ、なるほど、なんとなく分かった気がする。ありがとう
560デフォルトの名無しさん:2005/07/02(土) 21:03:49
C#とVBでは、どっちが速いの?
561デフォルトの名無しさん:2005/07/02(土) 21:07:20
今度は相手がVBか。そう言えばあんまり見かけないなこの2つを比較するの。

ていうか何の速さだよ。
562デフォルトの名無しさん:2005/07/02(土) 21:14:16
>>555
>勉強の為に有名なWebアプリのソースを見たいのですが、
>BlogやWiliや掲示板でASP.NETの有名なのって無いでしょうか?

WiliじゃなくてWikiでいいのかな?
とりあえず、http://www.atmarkit.co.jp/ad/ms/aspnet0503/asp01.html のリンクに
ASP.NETで作られたBlogやらWikiがあります。

また、http://www.microsoft.com/japan/msdn/asp.net/starterkit/ のスタートキットや
http://www.microsoft.com/japan/msdn/net/aspnetsolution/ のASP.NET KITも参考になるかと思います。
563デフォルトの名無しさん:2005/07/02(土) 21:14:17
中間言語が同じなら速度同じかと思ってたけど
どっかのページでVB.netの特集してて、そこでVB6.0より早くなったってあって
その比較対象にC#があってC#よりはVB.netは遅かった・・・(分かりづらい文章だなw

んと、質問なんですが、DNSサーバーに問い合わせてMXレコードを調べるプログラムと作ろうと思います。
無論、C#で作るんですが、質問の内容自体はC#ぢゃ(ry
一応、あくまでついでということで・・・

DNSとのやりとりってどんな風にしてるのかご存じの方います?
nslookupはつかえんし、
http://setup.value-domain.com/index.php?p=mx_search
こういうページに毎回アクセスかけると拒否られそうだし、
http://www.vector.co.jp/soft/win95/net/se313883.html?y
これはJavaだから解析してもわからんし・・・

お願いいたします・・・
564デフォルトの名無しさん:2005/07/02(土) 21:18:00
System.Net名前空間のDnsクラスってMXレコード無理だっけ。
無理ならTCPやUDPを生で。TcpClient, UdpClient, Socket の各クラス。
565デフォルトの名無しさん:2005/07/02(土) 21:29:30
DNSクラスだとAレコードだけだったと思います。
TCPやUDPで生でやることを技術的にはできるはずなんですが、
実際、接続してからどんなコマンドやらを送るのかがわからんのです。
つまりC#の話ではないんですが・・・もしも知っているからがいたらなぁってことです
566デフォルトの名無しさん:2005/07/02(土) 21:44:46
>>565
私も知らないが
ttp://www5e.biglobe.ne.jp/~aji/3min/index.html
を読めば何となく自前で実装できそうな気がしてくるな。
567デフォルトの名無しさん:2005/07/02(土) 22:37:33
>>566
激しくThanksです!!
いやぁUDPだったとは・・・
568デフォルトの名無しさん:2005/07/02(土) 22:41:40
う〜・・・だけど具体的な通信内容がない(泣
パケットをモニタリングすればわかるかなぁ?
569デフォルトの名無しさん:2005/07/02(土) 22:49:02
570デフォルトの名無しさん:2005/07/02(土) 23:22:08
Perlキター
571デフォルトの名無しさん:2005/07/03(日) 03:07:56
C++toC#なんてのないかなぁ
572デフォルトの名無しさん:2005/07/03(日) 06:25:40
>>571
C++/CLIじゃ不満かね?
573デフォルトの名無しさん:2005/07/03(日) 10:40:02
C#->Javaが欲しい
574デフォルトの名無しさん:2005/07/03(日) 12:35:10
>>568
DNSメッセージをそのままやりとりするだけだが。
ネットワークではビッグエンディアンが普通である点に注意すれば問題ない。
566の、Qnameの解説が微妙に間違ってるけど。(文字長は1バイトで表現する)
575デフォルトの名無しさん:2005/07/03(日) 14:13:56
ううう・・・
マジわからんわぁ〜、そのDNSメッセージとやらが分からぬのです(汗;
情けない。。。

あれっす、例えばメール送信の場合はTCPで接続して

HELO xxx.com
MAIL FROM:<[email protected]>
RCPT TO:<[email protected]>
DATA
TEST
.
QUIT

みたいな感じぢゃないですかぁ?(雑すぎますが。。。
DNSでMXレコードかける場合はUDPで接続したあとにどんなことをすればいいのか予想がつかぬのです。
Perl勉強すればよかったかなぁ
576デフォルトの名無しさん:2005/07/03(日) 14:23:35
>>575
DNSメッセージの構造は分かるね?
まず16bitのIDがあって、続けて16bitのフラグ。
16bitのQDCount、ANCount、NSCount、ARCount。
その後実際に投げる質問。ある場合はその後の回答。
質問や回答は、.で分離して文字列長をプリフィクスにしたQname、16bitのタイプ、クラス、32bitのTTL、16bitのRD長、可変長のRD。

で、これらをbyte[]にしてDNSサーバの53ポートにSendして、結果をReceiveして解析するだけ。
577デフォルトの名無しさん:2005/07/03(日) 14:25:23
Marshal.StringToHGlobalAutoメソッドなどでメモリを確保して、ネイティブDLLにポインタを
渡した場合、渡したメモリがネイティブDLL内で使用され続けることはあるのでしょうか?
言い換えると、DLLに渡してすぐMarshal.FreeHGlobalメソッドで開放して問題が起こる可能性はありますか?
578デフォルトの名無しさん:2005/07/03(日) 14:25:51
http://www5d.biglobe.ne.jp/~stssk/dns.html

>>569の送信データ生成部分と受信データ解析部分

読んで分からないなら無理
579デフォルトの名無しさん:2005/07/03(日) 14:35:04
>>577
渡した関数によるとしか言いようがないな。
その関数が自分で完結せずにグローバル変数に渡してたりしたら当然問題は起こりうる。
580デフォルトの名無しさん:2005/07/03(日) 14:43:48
>>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);
      }
   }
}
581555:2005/07/03(日) 17:08:01
>>562
いや〜ん、想像以上です。素晴らしいです。
ご親切にどうも有難うございます。
こんなにあっただなんて知りませんでした。
どうも有り難うございました。
582デフォルトの名無しさん:2005/07/03(日) 18:59:29
プログラム板が荒れているため、IDを導入するか検討中です。
賛成の方も反対の方も、このスレで自分は賛成か反対かをお書きください。

プログラム技術板に強制ID制を導入すべきか否か
http://etc4.2ch.net/test/read.cgi/vote/1118144381/

理由などの記入は別に構いません。
<<賛成>>か<<反対>>かだけ御記入頂ければ結構です。
ちなみに、当たり前ですが運営の方にIPが見えているので、1日ごとにIDが変わるからといって多重投稿しないでください。
583デフォルトの名無しさん:2005/07/03(日) 19:28:22
駄目だぁ〜自分の力量ぢゃ無理です。
DLLやらなにかないのかなぁ〜
そこら辺で配布されている簡単なメーラーもこんな処理してるんでしょうか?
584デフォルトの名無しさん:2005/07/03(日) 19:31:56
むしろ何が分からないのかが分からない。
585デフォルトの名無しさん:2005/07/03(日) 19:35:04
Win32APIにもDnsQuery関数以下DnsAPIがあるけどな。
C#から直接P/Invokeするには共有体がでかすぎて絶対やりたくないけど。
586デフォルトの名無しさん:2005/07/03(日) 20:11:55
nslookupに値を渡して吐いたのを受け取ることってできますか?
587デフォルトの名無しさん:2005/07/03(日) 20:21:10
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#だと←部分ってどう書くのでしょうか?
589デフォルトの名無しさん:2005/07/04(月) 15:16:34
ヘルプ見れ。
C# 言語の仕様  10.10.1 コンストラクタ初期化子
590デフォルトの名無しさん:2005/07/04(月) 21:24:57
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 属性を使ってください。
と出てきて保存できない。どうすればよいのだろう。
591デフォルトの名無しさん:2005/07/04(月) 21:27:49
>>590
TestObject の宣言をおせ−て
592デフォルトの名無しさん:2005/07/04(月) 21:32:25
XmlSerializer(Type, Type[])
コンストラクタを使って、二番目の引数にArrayListに含まれる型を指定してやんな。
593590:2005/07/04(月) 21:40:12
>>592
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemxmlserializationxmlserializerclassctortopic5.asp
コレだね。
出来たよ!!ありがとう。
しかし、投稿から10分で答えてもらえるとは、素晴らしいスレですね。
594デフォルトの名無しさん:2005/07/04(月) 21:59:23
VS 2005 で enum のメンバ姪のリファクタリングが出来ないのはなぜなんだよ
595デフォルトの名無しさん:2005/07/04(月) 22:05:27
βだから…じゃないの?
596デフォルトの名無しさん:2005/07/04(月) 23:59:40
StreamWriterオブジェクトをDisposeすると、基底のストリームもDisposeされてしまうのでしょうか?
597デフォルトの名無しさん:2005/07/05(火) 00:02:13
>>596
Disposeされるよ
598デフォルトの名無しさん:2005/07/05(火) 00:03:01
されなかったら恐いな。
599デフォルトの名無しさん:2005/07/05(火) 02:19:44
{\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デフォルトの名無しさん:2005/07/05(火) 07:31:03
600
601デフォルトの名無しさん:2005/07/05(火) 08:07:02
>>599
ReadToEndで一気に読み込んでそれだけ時間がかかってるならそういう仕様なんだろう。
もしStringBuilderを使わずに1行ずつ読んで文字列の足し算やってるなら
そっちで時間がかかってる。
602588:2005/07/05(火) 12:01:18
>>589
ありがとうございます。そこはかとなくわかりました。
603デフォルトの名無しさん:2005/07/05(火) 13:19:55

C#とかJavaのメモリの使い方で質問なんですけど、
この2つって、クラスのインスタンスを作るときに
必ず new しますよね。

これってクラスのインスタンスは必ずヒープメモリ上
に作られて、スタックに積まれることはないという
認識で良いんでしょうか?

C++の場合はローカル変数として宣言した場合など
スタック上にインスタンスが生成されていると思うんですが、
C#やJavaではメモリの使い方を変えているという認識で
いいんですかね?

C#に関しては理論的には「組み込み型」が存在しないと
思うのですが、スタック上に積まれるのはすべて
参照型なのでしょうか?

604デフォルトの名無しさん:2005/07/05(火) 13:30:59
値型って知ってる?
605デフォルトの名無しさん:2005/07/05(火) 15:41:53
>>604
Vartypeから派生したものとかなんとか読んだ記憶が
あります。なるほど。参照型じゃないものも確かにありますね。

606デフォルトの名無しさん:2005/07/05(火) 19:05:44
ファイルの絶対パスとカレントの絶対パスからファイルの相対パスを求めたり、
ファイルの相対パスとカレントの絶対パスからファイルの絶対パスを求めたりするメソッドってありますか?
607デフォルトの名無しさん:2005/07/05(火) 19:13:51
後者はPath.Combine
前者は必要性が分からないぜ。
608デフォルトの名無しさん:2005/07/05(火) 19:46:50
> Vartype

惜しい!!
609デフォルトの名無しさん:2005/07/05(火) 22:49:40
>>606
P/Invoke で PathRelativePathTo あたりを呼び出すとか。
610デフォルトの名無しさん:2005/07/05(火) 22:52:32
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 を共存させたいということになります。

やはり無理でしょうか?わかりづらいかと思いますがよろしくお願いします。
611デフォルトの名無しさん:2005/07/05(火) 23:05:54
実際に試してみろよ。
612デフォルトの名無しさん:2005/07/05(火) 23:33:23
613610:2005/07/05(火) 23:36:32
>>611
あぁ、すみません。実際に試した結果でできなかったので、
何か方法ややり方があるのであればアドバイスを頂きたく
思いました。

実際やってみた結果は
「アセンブリの1つ以上の型を読み込めませんでした」

でした。よろしくお願いします。
614デフォルトの名無しさん:2005/07/05(火) 23:52:42
アプリケーション構成ファイルとか作ってあげないとバージョンの違うdllはロードされないね。
そして、dllのバージョンを全て固定番号にするという行為に出たシステムが……orz
615デフォルトの名無しさん:2005/07/06(水) 00:01:21
>>607
俺はそれと似たようなものが最近、必要になった。
複数のファイルを管理する都合で。
616デフォルトの名無しさん:2005/07/06(水) 00:03:07
P/InvokeでCOMのメソッドを呼び出すときに引数をC#側でどう変換すればいいのかよくわかりません

既存のライブラリのint Hoge(char* name, int length)というメソッドを呼び出すときに、
C#側でint Hoge(byte[] name, int length)でないと上手く行きませんでした。
一つ目の引数をchar[] name にするとダメでした。
Cのchar*に、C#のchar[]では何故いけないのでしょうか?
617デフォルトの名無しさん:2005/07/06(水) 00:05:56
ヒント:型のサイズ
618デフォルトの名無しさん:2005/07/06(水) 00:06:54
>>616
というかbyte[]でうまくいくのか。
俺ならIntPtrにしてるところだな。
619デフォルトの名無しさん:2005/07/06(水) 00:18:58
>>617
C#ではchar型は16bitだったのですね
char = 1だと思い込んでました。
ありがとうございました。

あともう一点・・・
void*はC#では何に対応するのでしょうか?
4byteだからint[]とかで大丈夫かと思ってやってますが(今のところ動いてます
一般的にvoid*はどうするべきですか?
620デフォルトの名無しさん:2005/07/06(水) 00:22:59
618の言うとおりIntPtr構造体、つまりポインタ/ハンドル型でやるのが本道。
読み書きとかバイト配列との相互コピーとかメモリ確保とかはSystem.Runtime.InteropServices.Marshalクラスの各メソッドで行う。
面倒だから対象の関数にマッチするのを使うことも多いけどな。
621デフォルトの名無しさん:2005/07/06(水) 00:25:23
>>616
COMだとtypelib使って自動でラッパ生成させる方法しかやったことないんで
よくわからんが、

DLLの場合だと、DllImportAttributeでCharSet指定すれば、Unicodeと
Ansiの変換は勝手にやってくれるはずよ
[ DllImport( "foo.dll", CharSet=CharSet.Ansi )]
とか。
StringBuilderでもいいはず。

詳しくは.NET SDKドキュメントなり、interopサンプルでも見ればいい。
622デフォルトの名無しさん:2005/07/06(水) 00:28:14
あれ、cha*ならstringかStringBuilderで動かないっけ
最近P/Invoke使ってないから忘れたけど
623622:2005/07/06(水) 00:28:37
おお、かぶった
624デフォルトの名無しさん:2005/07/06(水) 00:28:55
失礼しました
>>618
>>620
Cに明るくないのでポインタは避けたかったのですが明日試してみることにします。
ありがとうございました。
625622:2005/07/06(水) 00:30:36
byte[]を使うのは思いつかなかったぞ
何かに使えるかもしれないから覚えとこう
626デフォルトの名無しさん:2005/07/06(水) 00:31:41
>>624
Cに明るくないのにP/Invokeってある意味猛者だな
627デフォルトの名無しさん:2005/07/06(水) 00:32:52
>>625
Cのchar*はテキストであるとは限らないから
ANSI<->Unicode変換を避けたければ当然byte[]しかないだろうね
628デフォルトの名無しさん:2005/07/06(水) 00:32:53
>>625
一つ注意を。
関数に配列を渡すだけなら良いけど、関数でその配列の要素に書き込みが発生する場合、そのままでは変更は破棄される。
変更を受け取るにはその配列型の引数にSystem.Runtime.InteropServices.OutAttribute属性を付ける必要がある。
629デフォルトの名無しさん:2005/07/06(水) 00:35:52
ていうか
ms-help://MS.NETFrameworkSDKv1.1.JA/cpguidenf/html/cpconmarshalingstrings.htm
でも見れ
630デフォルトの名無しさん:2005/07/06(水) 00:41:03
VS2002しかないんですがどうしたら。>629
//ヘルプなら直接URI書くよりタイトルを書いて欲しいところ。
631デフォルトの名無しさん:2005/07/06(水) 00:43:48
>>630
.NET Frameworkを使用したプログラミング
-->アンマネージドコードとの相互運用
をざっくり嫁

上のページは「文字列のマーシャリング」だ
632599:2005/07/06(水) 00:50:50
MemoryStreamを作成し一気に読み込みかけてやったが
結局なんも代わらない。やっぱりどうにもなんようだ。
どこかに簡単に色付きTextEdit作れそうな土台ないかな?
633デフォルトの名無しさん:2005/07/06(水) 01:41:32
.netプラットホームつってもみんな結局WindowsAPI呼んでんのね。
634デフォルトの名無しさん:2005/07/06(水) 02:04:01
>>633
当たり前w
でもUNIX上に乗るCLIがあれば、UNIXのシステムコールをするだろ。
635デフォルトの名無しさん:2005/07/06(水) 07:49:11
>>633
それはJavaに対する利点
636デフォルトの名無しさん:2005/07/06(水) 07:54:29
JavaのVMだってAPIやシステムコール呼ばなきゃ動かんだ炉
637デフォルトの名無しさん:2005/07/06(水) 11:33:26
すいません。
自分はc#+マネージドダイレクトxを学習中のものですが、
一応ダイレクトインプットで
キーボードとマウスはコントロールできるようにはなったのですが、
ジョイスティックをコントロールするにはどうすれば良いのでしょうか?

もしかしてまだジョイスティックはコントロールできないのでしょうか?
バージョンアップを待つか、c++とネィティブなダイレクトxに手を出すか
するしかないのでしょうか?

知ってる方いらしましたらお願いします。
638デフォルトの名無しさん:2005/07/06(水) 11:55:35
639デフォルトの名無しさん:2005/07/06(水) 12:20:16
どうして
> ジョイスティックをコントロールするにはどうすれば良いのでしょうか?
から
> もしかしてまだジョイスティックはコントロールできないのでしょうか?
に飛躍するのか聞いてみたいもんだ。
列挙体とかにもそれっぽいのがあったりするだろうに。
640デフォルトの名無しさん:2005/07/06(水) 12:24:52
>>638
へへ、どうもありがとうございやすです!!

>>639
死ねよ馬鹿!
641デフォルトの名無しさん:2005/07/06(水) 13:41:08
>>636
対応するのはJNIでしょ。
でおそらくc#のネイティブ呼び出しほどJNIは使われてない気がする。
javaプログラマにjavaから入った人が多いからか
「その機能はjavaだから無理です」って言いやすいからか。
642デフォルトの名無しさん:2005/07/06(水) 16:49:07
>>641
単純にお手軽さが違うからでしょ
643デフォルトの名無しさん:2005/07/06(水) 22:37:48
マネージドDirectXって勉強する価値あんのか?
644デフォルトの名無しさん:2005/07/06(水) 23:23:48
DirectX だけのことはあって速くていいよ
645デフォルトの名無しさん:2005/07/06(水) 23:33:50
アクションとかシューティングに使うにはGCが恐いがな。
646デフォルトの名無しさん:2005/07/06(水) 23:40:10
スペックがいいからか知らんが、コレクトするタイミングでもあまり気にならない。
647デフォルトの名無しさん:2005/07/07(木) 00:23:26
素直にDirectX覚えた方がいいと思うが
そもそもDirectXが必要なソフト開発でC#を使う必要性がない希ガス
648デフォルトの名無しさん:2005/07/07(木) 00:25:15
みんなDirect3DやDirectDrawのことしか頭にないのか?
音を自由に出力するにはDirectSoundを使うしかないのだが
649デフォルトの名無しさん:2005/07/07(木) 00:34:54
>>647
World Wind
650デフォルトの名無しさん:2005/07/07(木) 00:47:41
>>647
C#でもDirectXの知識は必要。
651デフォルトの名無しさん:2005/07/07(木) 00:59:09
グローバルフックをDirectInputで代用とか
652デフォルトの名無しさん:2005/07/07(木) 18:12:37
クライアント側:Windowsアプリケーション
サーバ側:ASP.NET WEBサービス + クラスライブラリ
という形で開発してるんだけど質問させてください

サービスからクラスライブラリを使ってサーバ側のフォルダにファイルの保存と呼び出しを行いたいのですが
クラスライブラリで指定するファイルの保存場所はどういった形式で書けばいいのでしょうか?
現在は@"C:\Image\"+ファイル名
という形で指定してますが、読み込み時に指定されたパスのフォーマットはサポートされませんといったエラーがでてしまいます
ウィンドウズアプリケーションから直接クラスライブラリを呼び出した場合は問題なく動くのですが・・・
解決策を知ってる方がいたら教えてください。お願いします
653デフォルトの名無しさん:2005/07/07(木) 21:09:53
>>652
正体不明の「クラスライブラ」の質問などされても誰も答えられないから、
FileStream あたりで試してみてから質問するべきでは・・・
654デフォルトの名無しさん:2005/07/07(木) 21:11:57
/ じゃねーの?
655デフォルトの名無しさん:2005/07/07(木) 23:16:41
一般的に言ってストリームを開きっぱなしで読み書きをし続けるというのはよくないのでしょうか?
656デフォルトの名無しさん:2005/07/07(木) 23:19:39
使わないなら閉じちゃえ
657デフォルトの名無しさん:2005/07/07(木) 23:41:21
>>656
Streamを使ってシリアルの送受信をしてるので
受信待ち受けのために閉じるわけにはいかないんです
658デフォルトの名無しさん:2005/07/07(木) 23:47:32
使ってるんなら開きっぱなしにしちゃえ
659デフォルトの名無しさん:2005/07/08(金) 14:48:31
>>653
天秤座の聖衣のことか?「クラスライブラ」って。
660デフォルトの名無しさん:2005/07/08(金) 16:30:49
用語の質問なんですが
「イベントハンドラ」って言ったら正確には何を指すんですか?
(1)イベント用に定義したデリゲート(XxEventHandler)
(2)そのデリゲートのインスタンス(MyControl.Xx)
(3)そのインスタンスに入れるメソッド(myControl1_Xx())
661デフォルトの名無しさん:2005/07/08(金) 17:45:26
>>660
特にそんなのの正確な定義ってない気もするけど、
俺の認識では (3)。
662デフォルトの名無しさん:2005/07/08(金) 23:57:45
C#の質問、お願いします。
メソッドの中で、自分が属してるクラス名やメソッド名の文字列を取り出す方法ありませんか?
検索しても見つからなくて。
属してるusing名も取り出せるのかな?
663デフォルトの名無しさん:2005/07/09(土) 00:00:59
>>662
クラス名はthis.ToString()とでもすればいいだろ(staticメソッドでなければ)
メソッド名はリフレクションを使う

System.Reflection.MethodBase.GetCurrentMethod().Name

とかそんな感じだ
664デフォルトの名無しさん:2005/07/09(土) 00:23:55
>>663
ありがとうございます、今からやってみます。
665デフォルトの名無しさん:2005/07/09(土) 00:50:22
this.ToStringはダメかも知らんね、用途が分からんが多分。
※This.GetType()もダメよ。
確実にやるなら
System.Reflection.MethodBase.GetCurrentMethod()からたどれ。
666デフォルトの名無しさん:2005/07/09(土) 01:36:07
>>665
sutaticメソッドとmain()以外は問題なく出来ました、ありがとうございます。
using名も出てくるんですね。
用途は単なるエラーログです。
sutaticはthis.ToStringがだめでした。
667デフォルトの名無しさん:2005/07/09(土) 01:44:14
うーんと、派生される可能性のあるクラスだと、
メソッドを書いてるクラスじゃなくて派生クラスの名前が
出ちゃうと思うけど、それは問題ない?
668デフォルトの名無しさん:2005/07/09(土) 02:53:28
>>666
ログ用途ならlog4j.net使え。独自仕様のログ処理とか無駄の極致。
前任者が独自仕様のログ処理してた場合、後任の人間は激しく気分が悪い。
669デフォルトの名無しさん:2005/07/09(土) 02:56:47
>>666から>>668へのつながりが微妙な気ガス
670599:2005/07/09(土) 03:22:46
>>668
たぶん、ログ吐かせたい訳ではなくおそらくそのエラー吐くクラスを特定されると
まずいから、小細工してエラーを独自に吐かせようとしてるんじゃね?それだとlog4でも辛くないか?
671デフォルトの名無しさん:2005/07/09(土) 04:09:23
すみませんが質問です。
従来C++で
signal(Ctrl+Cをあらわす定数, 実行される関数)
というようにあらわしていた割り込みシグナルを
c#で実現するにはどのようにしたらよいのでしょうか。
signal関数に該当するものはC#では見当たらないので
ちょっと悩んでしまって、、、当方初心者なんですが
何かアドバイスいただけたらと思います。
672デフォルトの名無しさん:2005/07/09(土) 11:14:41
>>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.");
  }
673デフォルトの名無しさん:2005/07/09(土) 11:18:11
>>667
今のところ問題はないようです。(5クラスぐらいしか出していないが)
有難うございます。
>>668
log4j.netを知らないので、調べてみます。(チラッと見た限りでは用途が違うような
>>670
もう、なんといっていいか、人間不信か?
674デフォルトの名無しさん:2005/07/09(土) 14:49:53
>>673
昔からJAVAでもいるけど仕様にあってないヤバイ作りこみしていて
出るはずのないエラーを隠すために小細工するやつはよくいるよ。
675デフォルトの名無しさん:2005/07/09(土) 15:17:31
log4j.net てなに?
676デフォルトの名無しさん:2005/07/09(土) 15:26:12
677デフォルトの名無しさん:2005/07/09(土) 16:13:30
>>672さん、ありがとうございます。
>>671です。
「.NET2.0のイベントで拾える」、というのは
System.Console.CancelKeyPress
等を利用する、ということでしょうか。
当方の開発環境は残念ながら.NET2.0ではありませんので、
アドバイスに従い、まずはCで記述して確認してみます。
678660: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#ではなかなかすっきり書けないんですね。
皆さん困ってないのかな…。
680デフォルトの名無しさん:2005/07/09(土) 18:51:09
>>679
C Runtimeの関数を使うよりも、Windows API(SetConsoleCtrlHandler)を使った方がいいんじゃね?
681デフォルトの名無しさん:2005/07/09(土) 19:06:55
キーでアクセスするコレクションを作りたいんですが、
DictionaryBaseを継承すると、foreachのときにGetEnumeratorが
DictionaryEntryを返すので、キャストするのが面倒なんですが
インデクサで返す型と同じ型を返すようにする方法はないですか?
またはそれに適した基底クラスはないですか?

682デフォルトの名無しさん:2005/07/09(土) 19:10:09
>>680
ぼくもそうおもいます
683デフォルトの名無しさん:2005/07/09(土) 19:45:40
>>681
HashtableみたいにValuesメンバが値のコレクションを返すようにしたら?
684デフォルトの名無しさん:2005/07/09(土) 20:38:07
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の方が望ましいのでしょうか。
687デフォルトの名無しさん:2005/07/09(土) 21:27:27
クリティカルセクションに相当するのは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
いや、それじゃ変数の値が反映されないだろ。
691デフォルトの名無しさん:2005/07/09(土) 22:19:48
取りあえずマルチスレッドについてのお勉強
ttp://www.atmarkit.co.jp/fdotnet/mthread/index/index.html
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ファイルも作成されない。)

どう記述すればいいんでしょうか?よろしくお願いします。
693デフォルトの名無しさん:2005/07/10(日) 01:46:53
Console.InもConsole.OutもConsole.Errorも、型は TextReader か TextWriter のようですが、
.NETでは、標準入出力にテキストデータしか使えないのですか?
694デフォルトの名無しさん:2005/07/10(日) 10:58:58
>>693
OpenStandard〜メソッド参照。Streamで使えるよ。
695デフォルトの名無しさん:2005/07/10(日) 21:02:40
SharpZipLibのライセンスの
Bottom line In plain English this means you can use this library in commercial closed-source applications.
は「簡単に言えばこのライブラリは商用クローズドソース
アプリケーションに使ってもいいよ。」
って言うことですか?

つまりフリーソフトに使うときでもソースコードを開示しなくてもよいということでFA?
696デフォルトの名無しさん:2005/07/10(日) 21:06:37
>>695
たしか、DLL 参照による使用に関しては、こっちのコードまで GPL が感染する事は無かった筈
多分その意味で在ってる。
697デフォルトの名無しさん:2005/07/10(日) 23:07:41
ライセンスが GPL なら感染するのでは?
ライブラリ利用が認められているのは LGPL じゃないと駄目だった気がするが。
698デフォルトの名無しさん:2005/07/10(日) 23:16:11
完全なGPLではないということらしいな。

>The library is released under the GPL with the following exception
「ライブラリは以下の例外事項を含んだGPLでリリースされている。」
699デフォルトの名無しさん:2005/07/10(日) 23:44:58
>696-698
サンクス。

ちなみにふつうのGPLライセンスだと
DLL参照かどうかに関わらず感染するみたいです。

Wikipedia オープンソース・LGPLの項より

〜GPL はリンクされるすべてのソースコードが GPL であることを要求するので、ライブラリとしての価値を低くしてしまう。つまり、ライブラリが GPL であると、そのライブラリは GPL のソフトウェアを作るためにしか使えないものとなってしまう。
700デフォルトの名無しさん:2005/07/11(月) 00:48:21
700
701デフォルトの名無しさん:2005/07/11(月) 08:49:57
思ったんだけどGPLなdllがあっても、リフレクションで動的にロードする場合なら感染しないよね?
プラグインとして設定したdll、クラスを使用できるようにしといて。

702デフォルトの名無しさん:2005/07/11(月) 14:16:48
>>701
いっしょに配布したらだめだろうと思う。
ユーザーが他者から勝手にダウンロードしてリンクした場合はダークだな。(気持ち的には大丈夫かな?
ただ、ソフトの説明に、ダウンロード先や使い方の説明をしたらだめだろうと思われ。

ただここまでして、GPLを使うならぐらいなら、そんなの自分で作る。w
703デフォルトの名無しさん:2005/07/11(月) 18:22:15
意見1
DLLとメモリ上で実行時に結合するので、DLLを使用するソフトはDLLの二次著作物である。
そしてDLLの二次著作物は、配布するときはGPLに基づいて配布しなければならない。

意見2
DLLを呼び出すのは、ただ単に呼び出し規約に従って呼び出すだけだから、二次著作物でもなんでもない。
二次著作物でない以上、ソフトウェアを作っても何の義務も負わない。


ライセンスとかGPL関連のスレで散々繰り返されてきた議論。
そしてどちらの意見が日本において正しいかは、判例がないので、裁判になるまで分からない。

仮に意見1が正しかった場合、DLL参照でもリフレクションでもアウト。
意見2が正しければ、DLL参照でもリフレクションでもOK。
判例がないので
704デフォルトの名無しさん:2005/07/11(月) 18:42:50
>>703
アメリカ等の判例は無いのか?
705デフォルトの名無しさん:2005/07/11(月) 18:53:24
まあ、要はオプソのライセンスはウイルス同様だから使うなってこった
706デフォルトの名無しさん:2005/07/11(月) 19:03:15
>>704
たぶん無かったと思うよ
707デフォルトの名無しさん:2005/07/11(月) 19:03:21
>>705
スレ違いだけど、オープンソース一般とGPLを一緒にしないで。
708デフォルトの名無しさん:2005/07/11(月) 19:13:01
一般人の認識:オープンソース=GPL
709デフォルトの名無しさん:2005/07/11(月) 19:22:44
=なにそれ?
710デフォルトの名無しさん:2005/07/11(月) 19:47:16
代入
711デフォルトの名無しさん:2005/07/11(月) 20:39:49
うちらは一般人じゃなくて開発者だからせめて区別付けようぜ。
712デフォルトの名無しさん:2005/07/11(月) 20:58:19
はいはい、バナナはおやつに含まれますか。
713デフォルトの名無しさん:2005/07/11(月) 21:15:15
>703
つーか意見2だったらLGPLいらんやん
714デフォルトの名無しさん:2005/07/11(月) 21:18:08
GPLなライブラリを使う時は使う側もGPLにしてる。
使う側をGPLにしたくない時はGPLなライブラリは初めから使わない事にしてる。

一旦GPL絡みで叩かれ始めると、もう際限なく違法だのアンフェアだのと叩かれ
捲くる。単にソースを手に入れたいだけの奴や面白がって叩く奴まで集まってき
たら正当性も糞もない。危うきには近寄らずが一番。
715デフォルトの名無しさん:2005/07/11(月) 21:19:14
>>713
そうだよ
716デフォルトの名無しさん:2005/07/11(月) 21:29:31
GPLスレいけよ
717デフォルトの名無しさん:2005/07/11(月) 21:45:08
すいません。
アセンブリ、参照、
アプリケーションがリソースにアクセスする方式、、、
これらのことをわかりやすく教えてくれないでしょうか?
または、教えてくれる書籍かwebなどありましたらお願いします。
今日一日、あっちこっちの本屋を巡ってみたのですが、
一通り最新のc#参考書を読んでみたのですが、かなり詳しい本でも、
その辺の情報はほとんど無いに等しかったです。
詳しい人は一体どこから情報を手に入れているのでしょうか?
知ってる人いましたらお願いします。
718デフォルトの名無しさん:2005/07/11(月) 21:57:03
MSDN
719デフォルトの名無しさん:2005/07/11(月) 22:58:54
初心者です。
解決法が見つけられなかったのでお願いします。

Visual Studio 2003のC#でGroupBoxの中にGroupBoxを作り
それぞれFlatStyleをSystemにし、マニフェストでXPスタイルにします。
すると内側GroupBoxのフォントとフォントサイズがおかしく表示されるようになりました。
(最も外側のGroupBoxはちゃんと正常されます)

はじめは問題なかったのですが、.NET Framework1.1 SP1をあてると?正常に表示されなくなるようです。

どなたか解決方法をご存知でしたらよろしくお願いします。m(_ _)m
720デフォルトの名無しさん:2005/07/11(月) 23:18:42
721デフォルトの名無しさん:2005/07/11(月) 23:24:32
ListView で ShowGroup を true にしていると
TopItem で期待した値が返ってこないのはなぜ
722デフォルトの名無しさん:2005/07/11(月) 23:32:51
int型をToString()でstringに変換する際に、桁数を指定して満たない部分は0を表記させることって出来ますか?
ex: int a = 1; a.ToString()→01 ←こんな感じにしたいんです。
723デフォルトの名無しさん:2005/07/11(月) 23:41:40
ToString("00")
724デフォルトの名無しさん:2005/07/12(火) 02:10:25
もしかして、
c#からdllファイルを作成する方法は、
コマンドラインコンパイルしか方法がないのですか?
今日は、コマンドラインからコンパイルできるように設定するだけでえらく時間食われてしまいました。
俺のは古いバージョンなのですが、新しいバージョンを入れてる人なら、
dllファイルを作成するビルドオプションがビジュアルエディタからワンクリックで
設定できたりしますか?

こんな最新のエディタがコマンドラインからしかコンパイルできないなんて
漏れ的にはちょっとしたカルチャーショックなのですが、皆さんはその辺、どうですか?
725デフォルトの名無しさん:2005/07/12(火) 02:12:55
何のC#使ってる?
VSなら、簡単だが。
726デフォルトの名無しさん:2005/07/12(火) 02:17:46
Standardだとクラスライブラリは作れないんだっけ
それなら解決法がここに載ってる
http://dobon.net/vb/dotnet/vs/stdmakeclasslibrary.html

俺も検証してないけど
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
すげえ、こわいウイルスだな。。。
730デフォルトの名無しさん:2005/07/12(火) 04:09:53
>>728
何でまたC#スレに?
HDDの容量が減る、でピンと来るのはウイニー関係のウイルスだろ。w
731デフォルトの名無しさん:2005/07/12(火) 04:41:30
明らかにここで書くのはおかしいと思ったのですが、
パソコンが重たくて中々動作しなかったので、一番上にあった奴に書かしてもらったんです・・・。すいません蛇魔でした。

ウィニー最近久しぶりに立ち上げた時exeファイルでも踏んだかな。。
取り合えず調べます どうもです
732デフォルトの名無しさん:2005/07/12(火) 06:44:07
ローカルルールを100回朗読の刑
733デフォルトの名無しさん:2005/07/12(火) 10:08:08
>>730
ほら、Cドライブだから。
734デフォルトの名無しさん:2005/07/12(火) 11:10:10
>>731
多くの個人情報が流されたのは間違いが無い。
今度はどんなニュースに。w
735デフォルトの名無しさん:2005/07/12(火) 16:15:54
質問です。
threadpoolのQueueUserWorkItemでinvokeを呼ぶメソッドを25個登録すると、
24個目のinvokeを呼ばれた時にSystem.InvalidOperationException
(メッセージ:操作を完了するために十分なスレッドがThreadPool
オブジェクトにありませんでした)が発生します。
対処法としては、QueueUserWorkItemで登録するメソッド数を制限する以外
ないのでしょうか?
736デフォルトの名無しさん:2005/07/12(火) 16:59:00
>>735
ん〜、ごく簡単なコードでは再現しないな。
普通に25個実行して残りは待機する。
再現コード書けない?
737デフォルトの名無しさん:2005/07/12(火) 17:39:11
>>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());
}
}
740デフォルトの名無しさん:2005/07/12(火) 20:51:36
>>738
Webサービスとなるとあんまり助言はできないが、
Webサービスのプロクシクラスには非同期用メソッドが用意されてるはずだからそれを使ってみるのは?
741デフォルトの名無しさん:2005/07/12(火) 21:01:51
C#アプリから他のプログラムの特定のコントロールにキーストロークを送信する方法ってないですか?
特定のコントロールって条件でなければForegroundしたあとにSendKeysって方法でできたんですが、検索してもコントロールまでは指定できないみたいで・・・
相手プログラムのコントロールのクラス名はわかってます
742デフォルトの名無しさん:2005/07/12(火) 21:04:20
FindWindow&FindWindowExで探し当ててSendMessageでWM_KEYDOWN。厳密にはストロークじゃないが。
ていうかもうC#じゃないね。
743デフォルトの名無しさん:2005/07/12(火) 21:11:05
>>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
);
746デフォルトの名無しさん:2005/07/13(水) 12:42:32
>>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)
747デフォルトの名無しさん:2005/07/13(水) 12:55:59
>>746
「終端文字のポインタ」は「NULL 終端文字へのポインタ」を変に略したものと思われ。
748747:2005/07/13(水) 12:59:11
間違ってますた。
回線切ってry
749デフォルトの名無しさん:2005/07/13(水) 13:09:01
>>746
ありがとうございます。

某正規表現DLLのラッパー作らないといけなくなり、そのための質問でした。
750745: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) );
751デフォルトの名無しさん:2005/07/13(水) 19:42:14
CodeProject落ちてないか?
752デフォルトの名無しさん:2005/07/13(水) 19:54:24
いつものことだから気にしなーい。
……名前解決で失敗してるっぽいのが気になるけど気にしなーい。
753デフォルトの名無しさん:2005/07/13(水) 20:29:00
お、繋がった。
重いけどけっこう重宝するんだよな。
754デフォルトの名無しさん:2005/07/13(水) 23:50:09
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を使わずに取得したいのです。
何かいい方法はないでしょうか?
755754:2005/07/13(水) 23:51:51
WindowsCEの_wfopen(fopenは使えないっぽい)ではカレントディレクトリの概念がないのか

WindowsCEではカレントディレクトリの概念がないのか

に訂正します
756デフォルトの名無しさん:2005/07/14(木) 00:01:47
757デフォルトの名無しさん:2005/07/14(木) 00:02:35
ちなみに検索キーワード:compact アセンブリ パス
758デフォルトの名無しさん:2005/07/14(木) 00:07:15
http://www.codeproject.com/
にでてるサンプルコードやそれをコンパイルしたものって
自作フリーウェアに勝手に添付していいものなんでしょうか?

どうも権利関係の記述が見つからないんですが……



759754:2005/07/14(木) 00:07:59
>>756-757
なるほど、こんな手があったんですね・・・
即レスありがとうございます。
760デフォルトの名無しさん:2005/07/14(木) 14:00:29
あるダイアログボックスにTabControlがあって、そのなかにTabPageと
その中にTextBoxがあって、テキストボックスにフォーカスが当たってる
状態で開きたいんですけど、TabIndexの設定の仕方がわかりません。
コンテナの中のコントロールが、どうしてもコンテナより順番があとに
なってしまいます。あとForm_LoadでtextBox1.Focus()とかやっても
無効でした。
761デフォルトの名無しさん:2005/07/14(木) 14:03:13
>>760
「Load」と「Focus()」という文だけ読んで脊髄反射してみる。

http://www.atmarkit.co.jp/fdotnet/dotnettips/226winloadfocus/winloadfocus.html
762760: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
764デフォルトの名無しさん:2005/07/14(木) 22:00:35
mainLoop ってなによ
765デフォルトの名無しさん:2005/07/14(木) 22:01:19
ああ、悪い。普通に書いてあったな orz
766デフォルトの名無しさん:2005/07/14(木) 22:01:41
>>763
MSDNには目を通したかい?

> スレッドがメッセージキューからキーボードメッセージを削除すると、仮想キーの状態が変化します。
> キーボードメッセージがスレッドのメッセージキューにポストされたり、
> 他のスレッドのメッセージキューへのキーボードメッセージのポストや削除が発生しても、状態は変化しません。

> 対応するキーボードメッセージがメッセージキューから取得されたかどうかにかかわりなく、
> 個別のキーの現在の状態を取得するには、GetAsyncKeyState 関数を使います。

メインスレッドで実行させるようにInvokeを使うのも有りだな。
つかわざわざ各スレッドで取得せんでも、取得してからスレッドを起動させるようにしちゃいかんのかね。
767デフォルトの名無しさん:2005/07/14(木) 22:53:50
かね
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使いました、これだとリプレイ機能付けるのが大変なんですがこの際だから仕方ないです。

ありがとうございました(*^-^)
771デフォルトの名無しさん:2005/07/15(金) 12:30:08
まあGoogleで検索してMSDNのページがひっかかることもあるけどね。
リプレイ機能って、ゲームか。
772デフォルトの名無しさん:2005/07/15(金) 15:04:30
て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の処理が
同時に走ってしまい、いまいちうまくいきません。

なにかうまい方法があればお教え下さい。よろしくお願いいたします。
774デフォルトの名無しさん:2005/07/15(金) 23:32:06
最近VS.NETでC#をいじりだした新参者ですが、ちょっと質問をさせてください。
MIDIを使用して音を出すようなプログラムを書こうと思ったのですが
色々な本をみても、そのようなプログラムのサンプルや説明が見つからず四苦八苦しています。

とりあえず、ドレミファソラシドと音を出す程度のものでよいので、どうすればいいか教えていただけませんでしょうか。
775デフォルトの名無しさん:2005/07/15(金) 23:38:05
先ずは MIDI で音を出す方法を調べて、次はそれを C# でどう組めばいいのかを調べる。
776デフォルトの名無しさん:2005/07/16(土) 00:13:05
MIDIとC#をキーワードにぐぐるに投げ込んだ結果

http://www.codeproject.com/cs/media/MIDIToolkit.asp
777デフォルトの名無しさん:2005/07/16(土) 02:41:24
今まで.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と巧妙な名前付けがなされるようになったり。

以上、チラシの裏。
778デフォルトの名無しさん:2005/07/16(土) 02:44:18
DataGridで選択されたセルが降順でソートされている時に
データが追加されようがどうしようが選択されたセル番号不変にする方法
ないですか?
 DataGridの選択しているRowの一覧を収めたDataTableはプロテクトメソッドの
ため逆汗して見えるけど使えない。どうすりゃいいだろ?
779デフォルトの名無しさん:2005/07/16(土) 20:03:42
10進数を16進で表示したいのですが、
16未満の時に、0Fというようにするにはどうすればいいでしょうか?
10進の文字列表記の際の桁数指定は使えないようなのです。
780デフォルトの名無しさん:2005/07/16(土) 20:21:51
は?
5.ToString("X2");
で問題ないだろ?
781スレ違い?ならゴメン:2005/07/18(月) 11:20:43
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
782スレ違い?ならゴメン:2005/07/18(月) 11:20:55
一応解析してみたけど・・・

【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属性に詳しい人、教えて。
783デフォルトの名無しさん:2005/07/18(月) 19:21:29
C#のstruct型に定数を入れる方法を教えてください。

private struct Keyid
{
int id;
string name;
};
private Keyid[] ketData = new keyid[]
{
{1,"aaa"}, <----エラー
{5,"bbb"}, <----エラー
};

上記のように、定数を入れたいのですが、方法は分からなくて。{では駄目みたいで・・
お願いします。
784デフォルトの名無しさん:2005/07/18(月) 19:22:15
上げます。
785デフォルトの名無しさん:2005/07/18(月) 19:32:35
>>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"),
}; 
786デフォルトの名無しさん:2005/07/18(月) 19:33:29
大文字と小文字が混じってる…… Keyid に統一で
787デフォルトの名無しさん:2005/07/18(月) 19:40:05
>>786
2chでのタイプミスです。
>>785
なんと、そんな方法なのですか。何処探しても見つからなかった・・・・
今からやってみます。
788デフォルトの名無しさん:2005/07/18(月) 19:44:53
>>785
うまくいきました、有難うございます。
789783:2005/07/18(月) 21:00:33
structの質問をした783ですが、考えてみるに、classでもいいじゃないのか?
何でわざわざstructに・・・・(C++の過去知識影響だろうな〜
じゃここにキー名が一致確認でID戻しのメソッド置いて・・・・とか思ってしまうし。
ただ単に文字列キーのID数値変換だけなのだが、もっとスマートな方法が有るんじゃないかと
思ってしまうのですが、ひょっとして有りますか?
790デフォルトの名無しさん:2005/07/18(月) 21:03:25
文字列から (予め登録された) 対応する数値を探したいのなら

Hashtable table = new Hashtable();
table["aaa"] = 1;
table["bbb"] = 5;

……でいいんでない?
791783:2005/07/18(月) 21:33:27
>>790
うぐ、一番簡単そう・・・・・(C++時はスピード優先がデフォルトで入っていたから^^;
ちなみに逆変換は。↓な感じですか?

Hashtable tableRv = new Hashtable();
table[1] = "aaa";
table[5] = "bbb";

たいした数も無いので、これでいいかな。
起動時とパラメーターセーブ時だけ生成すればいいし。(な考え方でもいいかな?
792デフォルトの名無しさん:2005/07/18(月) 21:38:59
あ〜 string と int が等しくなる事は無いから、1つのテーブルに押し込めちゃって構わないかと
793783:2005/07/18(月) 21:42:36
そうですね、1つで充分。
妙なクラスを複数と検索等の複数メソッド作るより。
1クラスで単純に管理できるのこれにします。
有難うございました。
794デフォルトの名無しさん:2005/07/18(月) 22:54:18
ほんまにC++できんのか?かなり頭わるそうだけど。
795デフォルトの名無しさん:2005/07/18(月) 23:06:24
どこら辺が頭悪そうなのか。指摘キボンヌ
796デフォルトの名無しさん:2005/07/18(月) 23:07:45
797デフォルトの名無しさん:2005/07/18(月) 23:10:00
キボンヌとかいってるとこ
798790:2005/07/18(月) 23:10:59
(要素数が多いときには) 線形探索よりもハッシュ探索の方が普通は高速なのに、
「C++時はスピード優先が〜」 なんて言っちゃったからのような気がする
799デフォルトの名無しさん:2005/07/18(月) 23:12:04
>>798
それ、俺も思った。
800デフォルトの名無しさん:2005/07/18(月) 23:13:04
>>791
>たいした数も無いので、これでいいかな。
といっとるがな。
801790:2005/07/18(月) 23:14:20
>>800
いや、だから (要素数が多いときには) って但し書きがしてあって……
794 の未間違いかなと
802デフォルトの名無しさん:2005/07/18(月) 23:15:03
「未間違い」って間違えてないやん「見間違い」の間違いですスマヌ
803デフォルトの名無しさん:2005/07/18(月) 23:16:34
>>802
プギャー
804783:2005/07/18(月) 23:20:51
盛り上がってるな、皆さん仮定の話で・・・・
一言言ってみる、色々な意味でハッシュより余裕で速い要素数だ。
805デフォルトの名無しさん:2005/07/18(月) 23:22:26
色々な意味で
とか付けなくていいよ
806デフォルトの名無しさん:2005/07/18(月) 23:22:39
>>798
非標準ではないが、STLport(SGI系)にはハッシュとそのコンテナが入っている。
でも実際使ってみるとわかるが、遅い遅い。
807デフォルトの名無しさん:2005/07/18(月) 23:23:00
×非標準ではないが
○標準ではないが

orz
808デフォルトの名無しさん:2005/07/18(月) 23:23:41
間違いが多いスレでつね
809デフォルトの名無しさん:2005/07/18(月) 23:24:17
>>805
何で付けなくていいか、理由を説明よろ。
810デフォルトの名無しさん:2005/07/18(月) 23:26:28
>>809
バカの壁読んでごらん
811デフォルトの名無しさん:2005/07/18(月) 23:28:32
C++知ってて配列初期化できんとかマップしらんなんてありえん。
プログラム初心者ならわかるけど。
812デフォルトの名無しさん:2005/07/18(月) 23:29:03
>>810
藻前、C/C++よくしらんだろ。
813783:2005/07/18(月) 23:31:01
>>811
思いっきり誤解してるな、まあ好きにしろ。俺はこれで終わる。
814デフォルトの名無しさん:2005/07/18(月) 23:31:34
>>809=>>812=>>783
こんなバカも珍しいな
815デフォルトの名無しさん:2005/07/18(月) 23:31:42
>>812
ヲタからみればしらないレベルかもねw
816デフォルトの名無しさん:2005/07/18(月) 23:36:02
何で叩きあいになったのか意味不明
仲良く行きましょうや
817デフォルトの名無しさん:2005/07/18(月) 23:52:58
C++できる人間がこんな馬鹿な質問すると思われるのは遺憾だ
おまけに「C++はスピード重視だから」とか言い訳するとこがみっともない
818デフォルトの名無しさん:2005/07/18(月) 23:53:35
今更だが>>783の質問もどうかと思うが
819デフォルトの名無しさん:2005/07/18(月) 23:55:25
^^;の顔文字と、
頭が悪そうと書かれてからの文体の変わり様が783の人の浅さをよく表している
820デフォルトの名無しさん:2005/07/19(火) 00:39:48
底か?
821デフォルトの名無しさん:2005/07/19(火) 00:47:41
間違えた^^;
822デフォルトの名無しさん:2005/07/19(火) 02:03:25
リストやマイコンピュータやデスクトップなどで表示される、
矩形選択のようなものをTabPage上で実現したいのですが、
どのように処理をするのが望ましいのでしょうか?
他にも描写しているものがあり、マウスが動くたびに再描写では
すごく重くて悩んでいます。
823デフォルトの名無しさん:2005/07/19(火) 02:08:04
>>822
ControlPaint.FillReversibleRectangle のようなもの?
824デフォルトの名無しさん:2005/07/19(火) 04:17:33
>>822
> マウスが動くたびに再描写ではすごく重くて
どうやろうが最終的にはマウスが動くたびに再描画しなくちゃなんねぇぜ。
825デフォルトの名無しさん:2005/07/19(火) 04:22:37
やってみたんですが、TabPageにいくつかSetStyleしているので、
ちらついたりコントロール上が再描写されなかったりと問題がありました。
実際は一部だけ再描写する技術を身に付けたほうが良いのでしょうか?
826デフォルトの名無しさん:2005/07/19(火) 20:24:21
すべてを再描画するのが悪い
更新しなければいけない部分だけ再描画すればいいだけのこと!
827デフォルトの名無しさん:2005/07/20(水) 15:06:00
で、それどうやんのよ。
828デフォルトの名無しさん:2005/07/20(水) 21:58:30
はぁ・・・
829デフォルトの名無しさん:2005/07/20(水) 22:19:20
Microsoft .NET Framework の Windows フォームを使用したペインティング テクニック
ttp://www.gotdotnet.com/japan/team/windowsforms/windowsformspainting.aspx
830デフォルトの名無しさん:2005/07/20(水) 22:26:16
>>829
一番下の画像ワロス
831デフォルトの名無しさん:2005/07/20(水) 23:03:21
>>830
なにがおもしろいのか、それが禿しく疑問
単なる皮肉じゃんw
832デフォルトの名無しさん:2005/07/20(水) 23:38:25

[STAThread]
これってstart thread なんすか?
なんて読むの?
廃スレ?

禿げ既スマソ
833デフォルトの名無しさん:2005/07/20(水) 23:40:29
「Single Threaded Apartment スレッド」

つづり合ってたっけ?
834デフォルトの名無しさん:2005/07/20(水) 23:56:22
Single Thread Apartment <-> Multi Thread Apartment
ちなみにCOMで使われる概念な。
835デフォルトの名無しさん:2005/07/21(木) 00:04:30
じゃあ[MTAThread]っていけるの?
やったことないんだけど。
836デフォルトの名無しさん:2005/07/21(木) 00:08:03
Windows Formsを扱うスレッドはSTAThreadじゃないと具合が悪い。
そのほかは扱うCOMの設計次第。
COMを扱わないなら関係ないが、内部で使ってる可能性は捨てられない(Windows Formsのように)。
837デフォルトの名無しさん:2005/07/21(木) 00:19:30
838デフォルトの名無しさん:2005/07/21(木) 10:31:27
仕事で使うActiveXコントロールが、[STAThread]つけないと
動かない、ということはあった。
その人は、手でMain()書いたから[STAThread]を書いてなかった。
839デフォルトの名無しさん:2005/07/21(木) 13:35:20
STAThread書かないとDrag&Dropもできないよね。
内部でCOM使ってるらしい。
840デフォルトの名無しさん:2005/07/21(木) 16:25:39
Write()をstringに対して適用するメソッドってありますか?
いつも ToString() と "+" で連結して使ってるんですが、面倒で・・・・
841デフォルトの名無しさん:2005/07/21(木) 16:29:06
わけわからん。なんのクラスのWriteメソッドなのさ。
842デフォルトの名無しさん:2005/07/21(木) 16:29:52
>>841
すみません。Console.Write()です。要するに、Cのsprintf()のような事を
させたいのです。
843デフォルトの名無しさん:2005/07/21(木) 16:32:51
public static void Write(string format, params object[] arg);
のことか?
844デフォルトの名無しさん:2005/07/21(木) 16:36:58
>>843
そう、それです。それをstringに対して適用したいのです。
845デフォルトの名無しさん:2005/07/21(木) 16:38:11
stringに対して適用とか言うから分からなかったぞ。
String.Formatのことだな。
846デフォルトの名無しさん:2005/07/21(木) 16:39:01
>>845
俺は>>844を見てもわからなかったのに、お前はすごいな。
847デフォルトの名無しさん:2005/07/21(木) 16:39:39
>>845
ありがとうございます!まさにそれです。これでだいぶ楽になります。
848デフォルトの名無しさん:2005/07/21(木) 16:43:17
>>846
言葉足らずで済みません。sprintf()に例えれば分かってもらえると
思ったのですが・・・この中にはC/C++を知らない人もいるんでした。
失礼しました。
849デフォルトの名無しさん:2005/07/21(木) 17:22:27
>>848
C++を知っていたとしてもあれでは普通わからん。
850デフォルトの名無しさん:2005/07/21(木) 17:22:32
>>848
sprintf といわれたら分かるけど、
Console.Write() を string にって言われても一瞬、意味分からなかった。
Write() メソッド、何パターンもオーバーロードがあって、format 指定無しのものもあるし。
851デフォルトの名無しさん:2005/07/21(木) 18:18:33
>>849>>850
これから質問の仕方に気をつけます。
852初心者:2005/07/21(木) 23:29:07
まじで初心者なんですがC言語などを機械が分かるようにするやつを何ていうんでしたっけ?_| ̄|○
853デフォルトの名無しさん:2005/07/21(木) 23:31:42
すれ立てるまでもない質問はここで 第68刷
http://pc8.2ch.net/test/read.cgi/tech/1120720976/
854XP:2005/07/21(木) 23:36:53
windowsXPならコンパイラは何がいいですかね?
855Me:2005/07/21(木) 23:47:43
gcc
856デフォルトの名無しさん:2005/07/21(木) 23:51:06
gccってソースみるとわかるが、正直ダメダメだぞ
しかも汚い
857XP:2005/07/21(木) 23:56:02
VS spokeが良いらしいのですが?
858デフォルトの名無しさん:2005/07/21(木) 23:57:35
>>856
何と比べてどういうところがダメダメで汚いの?
859デフォルトの名無しさん:2005/07/22(金) 00:01:27
>>856
お前の頭がダメダメ
860デフォルトの名無しさん:2005/07/22(金) 00:01:59
スレ違いは適当に切り上げろよー
861デフォルトの名無しさん:2005/07/22(金) 00:03:38
>>856
Intelのコンパイラに比べればマシ
AMDでエラーが出るようにコンパイルされるとか終わってる。
862デフォルトの名無しさん:2005/07/22(金) 00:20:38
>>861
CPUベンダーが自社のCPUに最適なコンパイラを作るのは当然だと思うが
互換性はあくまでAMD側が維持するべき問題だろ
それ以前に拡張命令に対応したコンパイラを自社開発できないAMDはうんk
863デフォルトの名無しさん:2005/07/22(金) 00:21:54
インテルのコンパイラは速度が違うよ
864デフォルトの名無しさん:2005/07/22(金) 00:22:11
スレ違い
865デフォルトの名無しさん:2005/07/22(金) 00:47:37
MS製のCLRとMonoのCLRでも速度が大分違ってたな
866デフォルトの名無しさん:2005/07/22(金) 00:51:49
OSのシャットダウンが行われていることを
(他のアプリよりも先に)知るにはどうしたらよいでしょうか?
他のアプリが閉じる前にやりたい処理があるのですが
867デフォルトの名無しさん:2005/07/22(金) 10:45:48
System.Runtime.InteropServices.Expando という名前空間があるんですが
エキスパンドゥーってなんですか?Web辞書には載ってなかったんですが。
868デフォルトの名無しさん:2005/07/22(金) 12:07:37
ふらっとが次スレに移行〜

ふらっとC♯(初心者用) Part6
http://pc8.2ch.net/test/read.cgi/tech/1122001458/l50
869デフォルトの名無しさん:2005/07/22(金) 12:34:40
データテーブルをCSVとして吐き出したいんだけどなんかいい方法ないかな
単純に文字列連結すればいいのはわかってるんだけど
870デフォルトの名無しさん:2005/07/22(金) 12:39:19
それが一番手っ取り早いさ。
871869:2005/07/22(金) 12:44:42
やっぱり?
どっかソース落ちてたら楽かなーとか思ったんだけど
手組みするかね・・・だるぅ
872デフォルトの名無しさん:2005/07/22(金) 12:53:24
言うほどめんどくさいか? ほとんどループだけじゃん?
XSLTを使う手法もあるが。
ttp://www.ailight.jp/blog/mnow/archive/2005/01/15/3706.aspx
873869:2005/07/22(金) 13:03:29
単純作業が死ぬほど嫌いなんだけだよー
まぁいいや、今から組んでくる
874デフォルトの名無しさん:2005/07/22(金) 13:42:53
>>873
普通のやつは複雑なことを複雑に考える。
馬鹿は単純なことを複雑に考える。
頭のいいやつは複雑なことを単純に考える。

シンプルにやれるものはシンプルにやろうや。
875デフォルトの名無しさん:2005/07/22(金) 14:14:23
>>866
WM_QUERYENDSESSIONでもグローバルフックすれば?
・・・出来るんかいな?
876869: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();
}
もっとシンプルになるかな?
877デフォルトの名無しさん:2005/07/22(金) 17:29:40
>>866
SetProcessShutdownParameters
878デフォルトの名無しさん:2005/07/22(金) 23:49:28
>>876
データ中の区切り文字の処理せんと
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'の定義がありません

とエラーが出てしまいます.


何が間違っているのでしょうか?
880デフォルトの名無しさん:2005/07/23(土) 04:24:07
>>879
つか、Mobilityってなに?

Form1 form1 = this.Owner as Form1;
if(form1 != null)
{
    // form1.Mobilityを使う
}
881つまらないことかもしれませんが・・・:2005/07/23(土) 04:24:34
配列(たとえばbyte[])の要素を他の配列にコピーしたいとき
★ArrayクラスのCopyToメソッドを使うか?
★ループでインデックスをカウントアップし要素を一つずつ代入するか?
どちらが早いですか?
パフォーマンスをあげたいとき一般的にはどっちを使います?
882879:2005/07/23(土) 04:29:12
>>880
> つか、Mobilityってなに?
すいません,自分で追加したプロパティです.

出来ました.
ありがとうございました.
883デフォルトの名無しさん:2005/07/23(土) 04:44:27
> >881
Array.Copyを使え。
884デフォルトの名無しさん:2005/07/23(土) 06:53:08
>>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番目の引数の数値を基準に小さい順に
並べ替えたいのですが、どのように書けばいいのかわからず
困ってます。
数値は第一引数に置かなければいけないのでしょうか。
それとも、何か書き方があるのでしょうか。
888デフォルトの名無しさん:2005/07/23(土) 14:17:00
>>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;
    }
}
889デフォルトの名無しさん:2005/07/23(土) 14:22:24
CompareToは

>定義により、すべてのオブジェクトは null 参照 (Visual Basic では Nothing) よりも大きく、また 2 つの null 参照は互いに等しくなります。
>obj パラメータは、このインターフェイスを実装するクラスまたは値型と同じ型である必要があります。それ以外の場合は、 ArgumentException がスローされます。

という実装が要求されることに注意。
//実用上困ることはないと思うが。
890887:2005/07/23(土) 14:28:34
>>888-889
できました。
CompareToの中身をいじればよかったのですね。
al.Sort(1)とかal.Sort(time)とかal.Sort周りばかりいじってました。

CompareToの中身がどんな仕組みか完全に理解しきってないので、いろいろいじって
試してみようと思います。
どうもありがとうございました。
891デフォルトの名無しさん:2005/07/23(土) 15:20:05
>>889
見落としとった。

>>890
Sortに投げ込むのはIComparerのほうだな。
動的にソートの条件を変えるならこっちのほうが便利。

あと、MSDN読むことに慣れておいたほうがいい。
892887:2005/07/23(土) 15:53:31
>>891
アドバイスありがとうございます。
IComparableとIComparerがあるんですね。
IComparerは動的に条件変えれて便利と。
MSDNってわかりにくいので、できるだけ読むのは避けてたのですが
今度から、調べるときにちょくちょく見て慣れておくことにします。
893デフォルトの名無しさん:2005/07/23(土) 16:26:40
C#やる以上MSDNを避けることは出来ないと思われ
書籍やらネットだとこんな情報得られないしね
894デフォルトの名無しさん:2005/07/23(土) 16:35:33
最初はSDK(Visual Studioではない)にくっついてくるドキュメントで、
クラスライブラリを調べるのがやりやすいかもしれない。
どうせドキュメントの目的の大半はライブラリのドキュメント調べだし。

それがわかればあとはVS付属のやつもMSのオンラインのも似た要領でどうにかなるな。
895887:2005/07/23(土) 16:53:07
>>893-894
見るのに慣れたら便利なしろもののようなので、さっきも見てみましたがまだ見ぬくいのですが
ネットで調べてもあまり情報がないものを調べるときに助かるかもと思うので
がんばって見慣れようと思います。
どうもありがとう。
896デフォルトの名無しさん:2005/07/23(土) 18:20:30
地震を予測したいのですが
どうすればいいでしょうか
897デフォルトの名無しさん:2005/07/23(土) 18:31:46
>>896
1.なんか意味ありげで婉曲的な表現を
  適当な日付に表示するプログラムを作る。
2.キバヤシのPCに入れる。
3.あとは自動的にこじつけてくれるので当たる、
  当たらないは関係なくなる。
898デフォルトの名無しさん:2005/07/23(土) 18:32:51
The best way to predict an earthquake is to invent it
899デフォルトの名無しさん:2005/07/23(土) 19:36:58
ナマズ1万匹のエミュレーションを作れ。
900デフォルトの名無しさん:2005/07/23(土) 20:06:52
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にも実装済みってことになるのかなあと迷ってます。
902デフォルトの名無しさん:2005/07/23(土) 20:19:49
  ヽ、.三 ミニ、_ ___ _,. ‐'´//-─=====-、ヾ       /ヽ
        ,.‐'´ `''‐- 、._ヽ   /.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によって起こされるということを暗示しているんだ!!
903デフォルトの名無しさん:2005/07/23(土) 20:23:53
>>901
public class RendaAlarmData : AlarmData , IComparable
{
}

インターフェイスはこれで複数継承できるが、
クラスは多重継承できない。為念。
904デフォルトの名無しさん:2005/07/23(土) 20:24:04
>>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();
}
905903:2005/07/23(土) 20:26:49
ああ、AlarmDataにIComparebleが実装されてる、って部分を見落としてた。
906デフォルトの名無しさん:2005/07/23(土) 20:27:22
なお、基底クラスが実装するインターフェイスを派生クラスで定義し直す場合のことは、MSDNの
C# 言語の仕様  13.4.4 インターフェイスの再実装
を読む。
907901: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
http://upload.squares.net/upload/src/file0138.txt //Form1.csです
http://upload.squares.net/upload/src/file0139.txt //FruitList.csです
http://upload.squares.net/upload/src/file0140.jpg //画面の画像です

テキストボックスに入力して、リストボックスに追加。
追加したリストボックスをダブルクリックすると編集できるというものなのですが。

リストボックスに、
果物1タブからのみリストボックスに追加した場合、編集はうまくいきます。
果物2タブからのみリストボックスに追加した場合も、編集はうまくいきます。
ところが、
果物1タブ、果物2タブ両方ごちゃまぜでリストボックスに追加したあと
果物2タブで入力した項目を編集しようとするとエラーがでます。
しかし、果物1タブで入力した項目はちゃんと編集できるんです。

どのようにすれば、果物1タブと果物2タブからごちゃまぜに追加したリストボックスの
果物2タブから追加した項目を編集するときにエラーがでないようにできるのかわからず
困っています。

エラー内容は
'System.InvalidCastException'のハンドルされていない例外がtest26.exeで発生しました。
追加情報:指定されたキャストは有効ではありません。

とでますが、FruitData2 item = (FruitData2)(it.Current);
の部分は(FruitData2)でキャストしないと
item.SetG(g); が使えなくなるので困っています。
909デフォルトの名無しさん:2005/07/25(月) 10:47:15
IDisposableで質問です。

IDisposable は解放時には便利なのですが、例外発生時の処理はそれぞれを中に書く必要が生じます。
つまり毎回このように↓書かなくてはいけません。
using(...)
{
    try
    {
        //処理
    }
    catch
    {
        //例外発生時処理
    }
}

これを、こう↓書くだけで、
using(...)
{
    //処理
}
あとはIDisposableを実装するクラスで処理したいのですが、可能でしょうか?
つまり Disposeメソッドで直前の処理が例外か否かを判定できれば実現できると思うのですが。

IDisposableにCatchメソッドがあったり、ICatchableインターフェイスとかあったら便利なのに・・・
と思ってはいけないのでしょうか。
910デフォルトの名無しさん:2005/07/25(月) 10:48:40
エラー内容のまんまだろ
911デフォルトの名無しさん:2005/07/25(月) 10:50:37
//コードに言いたいところは色々あるがおいといて。

いやそりゃthis.allの中にFruitDataとFruitData2があるのに、
なんでもかんでもFruitData2にキャストしようとしちゃFruitDataの方はInvalidCastExceptionが出るだろ。
派生クラスのインスタンスは基底クラスのオブジェクトとして扱えるが、逆は不可なんだから。

キャストできるかどうかの判断のためにインスタンスの型を調べるには is 演算子とか as 演算子を使う。
912デフォルトの名無しさん:2005/07/25(月) 10:54:33
>>909
なに言ってるか分からん。
913デフォルトの名無しさん:2005/07/25(月) 11:01:53
>>909
それができたとして、
Catchメソッドにどんな例外が投げられるのか分からないのにどんなCatchメソッドを作るの?
デリゲート? try-catchでいいじゃん。
914デフォルトの名無しさん:2005/07/25(月) 11:04:30
>>909
なんだかしらんが void Commit() { _commit = true; }; とか定義しておいて、
using (..) {
a.hoge;
a.commit();
}
などしてDisposeで ! _commit なら失敗時の処理を行うようにでもしてみては?
915908: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で入れた項目も編集することができました。
いったいどこが問題があるのかさっぱりわからず困っていたので大変助かりました。
どうもありがとうございました。

916909:2005/07/25(月) 14:40:56
なんか中途半端な書き込みで申し訳ありません。

やりたいことは数多くある既存のコードに対して、部分的に
開始処理・終了処理・例外処理をつけたいということです。
(ちなみにこれらの追加処理は同じクラスのメソッドを呼びます)
ひとつひとつの箇所に以下のようなコードを書くのが面倒なため
もう少しシンプルな方法はないかと思案中でした。
try
{
//開始処理
//【既存の処理】
//終了処理
}
catch
{
//例外処理
}
これらの箇所をメソッドに限定した場合、カスタム属性でも実現可能なのでしょうか?

>>909
すいません、努力します。
>>913
例外の種類は特定されている必要は無いと思います。
GetType()で調べられるし、方法はいくらでもあると思います。
>>914
それはいけるかもしれません。検討してみます。
ですが、できればその「commit()」の部分を無くしたいのです。
917909:2005/07/25(月) 14:42:04
アンカーミスりました。

>>912
すいません、努力します。
918デフォルトの名無しさん:2005/07/25(月) 15:37:33
>>916
基本的に
・「構造化例外」の概念を分かってない
・IDisposable.Disposeの概念を分かってない
と思われる。
そのメソッドローカルで扱うオブジェクトをどのように扱うかは
そのメソッドの責任。オブジェクトに責任はないから混ぜるな。
一番近い概念はTransactionだろうがそれはC#言語には現状
組み込まれていないし、RollBackやCommitはどっちにしろ
必要なので、そんな組み込まれ方はしないと思うよ。
それとそのコードはおかしい。

try {
 //処理
} catch(Exception) {
 //例外処理
} finally {
 //終了処理
}

こう。
919デフォルトの名無しさん:2005/07/25(月) 15:54:20
>>918
ご指摘ありがとうございます。
IDisposableの概念的には理解していたつもりですが、
応用の例として使えたら便利かも、ということで話に上げました。
手法として良くない様でしたら別の良法を選択します。

コード例を記述して頂きましてありがとうございます。
トランザクションの場合には確かにそのようになるのですが、
今回は成功か否かで処理を分けたいのです。
finallyにて共通の終了処理は必要ではありません。

以下のような処理が汎用化できるかどうかを知りたいのです。
try
{
//開始処理
//既存の処理
//成功時処理
}
catch
{
//失敗時処理
throw
}
920909:2005/07/25(月) 16:20:14
何度もすいませんが補足です。
解放と例外は常に密接な関係を持っています。
解放処理はIDisposableで切り出しの汎用化が可能となっているのに
例外処理はtry-catch-finallyの構造を維持し続けなければならず、
拡張性が低いと思います。
なのでICatchable(ITryable?)なる切り出し用のインターフェイスがあっても良さそうなもの、
と思った次第なのです。
921デフォルトの名無しさん:2005/07/25(月) 17:16:33
(゚听)イラネ
922デフォルトの名無しさん:2005/07/25(月) 19:05:26
charをSystem.Windows.Forms.Keysに変換する方法はありますか?
923デフォルトの名無しさん:2005/07/25(月) 19:12:16
あんまりないな。
ある程度の範囲(0-9A-Zあたり)ならintにキャストしてからKeysにキャストしてやればいいが。
924922:2005/07/25(月) 19:24:22
>>923
それで十分です。ありがとうございます。
925デフォルトの名無しさん:2005/07/25(月) 20:58:26
あのね、説明すると、
・終了時処理の勘違いがある。
IDisposable.DisposeはGCの動作の想定している理想状態ならば必要ないもの
(つまりすべてのリソースが無限に存在する)だが、現実の問題としてDBの
コネクション等リソースは有限でクリティカルなものがある。そういうもの「のみ」を想定して
いて「クリティカルリソースを開放してもよいというフラグをオブジェクトに通知する」のが
IDisposable.Disposeなの。もっと言えば実は終了処理なるものとはまったく関係がない。
終了処理に破棄処理(IDisposable.Dispose)を含めるかどうかはメソッド側の責任。

・構造化例外の勘違い
try句の中に書くものは成功時&失敗時処理(?)等「すべての処理を含める」のが普通。
もっと言えばtry句は「(例外条件を除いて)成功することを強く想定してかくべき」。
なんていったらいいかな、「try-catch構文って言うのはif文のように処理フローを分岐させる
ためにあるわけではない」とか?ぶっちゃけていえばフローチャートをかいたときにその中には
(catch句は)絶対にかかない。
メソッドというか手続きを書くときには絶対「想定条件」というものが設定される。例を
挙げればまず間違いなくほとんどの手続きで想定されているのが「メモリがたりなくなる
ことはない」とか。何でかっていえば、すべての条件を想定して書けばコードは非常に
複雑になるから。条件を設定する必要性を認め、その場合でも問題のないようにかくことを
可能にしたのがtry-catch構文。
きみはtry-catchに「例外が発生すれば失敗」等の考え方を抱いているようだが違う。
例外発生は「想定条件外事象が発生した」以上の意味はない。それが失敗かどうかは
メソッド側って言うかcatchした側が決める。

>解放と例外は常に密接な関係を持っています。
これがそもそも変で君が勝手に結び付けてるの。分けるのが合理的だと考えたから
こうなっていることを理解すべき。拡張性が低いというのはむしろ君の考え方のほうが
低い(しかも実用に耐えないほど)。
926デフォルトの名無しさん:2005/07/25(月) 21:26:24
長い
927デフォルトの名無しさん:2005/07/25(月) 21:29:45
>>909が何を言いたいのかいまだに理解できない。
928デフォルトの名無しさん:2005/07/25(月) 21:32:19
>>926
ごめん
929デフォルトの名無しさん:2005/07/25(月) 21:39:20
>>927
多分こうだろうという推測。

・using句の意味を変更。
 IDisposableだけじゃなくICatchable(仮)を実装するオブジェクトにも適用できるようにする。
・ICatchableはCatchメソッドを定義。Catchメソッドはusing句の終了時に自動的に呼び出される。
・Catchメソッドの仮引数にはExceptionがあり、
 using句が正常に終了した場合はnull、例外が発生した場合は発生したExceptionが渡される。
・発生した例外はCatchメソッド終了後自動的に再スローされる

要するにusing句に使えるからと安易にDisposeを出してきたのが混乱の原因。
個人的にはこんな機構イラネ。
930デフォルトの名無しさん:2005/07/25(月) 21:46:17
状況によるとは思うが、

try{
   using(…){
   }
}
catch(…){
}
finally{
}

ってのが多いと思う。

using(…){
  try{
  }
  catch(…){
  }
}

ってどういうことよ
931デフォルトの名無しさん:2005/07/25(月) 21:48:18
>>930
状況によるんじゃない?
932デフォルトの名無しさん:2005/07/25(月) 22:33:02
これだけ言ってもまだ>>909は( ゚Д゚)ポカーンとしている希ガス。
933927:2005/07/25(月) 23:02:34
漏れもまだポカーンとしている。
例外とIDisposableの意味を根本的に誤解しているような気はするが、
ああ、結局何がしたいのかさっぱりわからん。
934デフォルトの名無しさん:2005/07/25(月) 23:11:33
携帯でコマンドボタンを押してもSessionID みたいに
セッションを識別する良き方法を知りたいのですが
935デフォルトの名無しさん:2005/07/25(月) 23:42:49
app.configの1つの項目にデータを複数定義ってできるの?

<add key="DataPath" value[]={"E:\" , "C:\"} />

みたいに。できないなら別の方法を教えてください。できるならデータの取得方法を教えてください.
よろしくお願いします。
936デフォルトの名無しさん:2005/07/25(月) 23:55:09
取りあえずその気の狂った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できているのでそのようにしたいのですが
938909: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

主たる疑問は、類似した例外処理(に関わる同様の処理)は如何に汎用化できるか、です。
既存のコードへの手入れを最小限にして同様の処理を組み込める手段を模索しています。
939デフォルトの名無しさん:2005/07/26(火) 09:34:17
>>938
> >要するにusing句に使えるからと安易にDisposeを出してきたのが混乱の原因。
> 今のところusingはIDisposeしか対応してないですね。(元々それだけのためなのでしょうけど)
> もっと色々なインターフェイスに対応すれば更に柔軟になると思うのです。
> 確かにusingがなければ余計な混乱はなかったかもしれません。
> でも記述量は減りますよね。ILはtryステートメントと同様のコードになるようですし。

ここを読み違えるか……
940デフォルトの名無しさん:2005/07/26(火) 09:41:26
もうなんかみんな変だよ、おかしいよ
941デフォルトの名無しさん:2005/07/26(火) 09:49:22
ICatchableというインターフェースがあって、Catchというメソッドがあったとして、そこに何を書くのさ。
IDisposableのDisposeメソッドは、実装するクラスの破棄処理だが、
汎用的な「失敗時処理」とはなんだ?
942デフォルトの名無しさん:2005/07/26(火) 09:53:59
class HogeStream : Stream, ICatchable{
   public void Catch(Exception ex){
    //?
   }
}



using(HogeStream hs = new HogeStream()){
}


ここまで頭に思い浮かべたのだが、普通にHogeStreamのメソッドで、例外をスローするメソッドの中で処理を行えば済む話
943デフォルトの名無しさん:2005/07/26(火) 10:03:06
ああ、つまりこーいうこと?

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メソッドをどうやって複数実装するのかわからんけど
944デフォルトの名無しさん:2005/07/26(火) 10:04:59
いままでのcatchに書く処理を、あらかじめクラスのCatchメソッドに書きたいってことだろ。
例外をスローするメソッドに書けばすむ話なのだが。
945デフォルトの名無しさん:2005/07/26(火) 10:05:51
>>943
それは実装できないだろ。CatchがExceptionを受け取ってその内部でisとか使って判断してやるんだろうな。
うむ必然性がわからん。
946デフォルトの名無しさん:2005/07/26(火) 10:09:23
>>944
どういうこと?
947デフォルトの名無しさん:2005/07/26(火) 10:15:32
エラー処理はユーザに近い上位層でやるのが基本だろ
そもそもエラーをどうしたいか、そのクラスには判断できないから
スローしているのであって。

なんか考え方が根本からおかしいぞ
948デフォルトの名無しさん:2005/07/26(火) 10:16:55
>>946
HogeStreamのWriteメソッドが例外をスローするとして
HogeStreamのCatchメソッドでそれを受けて何か処理をするぐらいなら

最初からWriteメソッドに処理を書けばいいじゃないか
949デフォルトの名無しさん:2005/07/26(火) 10:21:19
909はtry-catchとは違ったやり方で例外処理できないか、って言いたいの?現状ではそうすべきではないでしょ。
仮に違う手法でできるとしても、新しい構文やインターフェイス?がもっと整備されないとダメじゃないかな。
950デフォルトの名無しさん:2005/07/26(火) 10:26:37
>>948 例外をスローするのはusingを使うクラスじゃないのか?

>>943 どうでもいいがHogeクラスにはメソッドが必要と思われる。
951デフォルトの名無しさん:2005/07/26(火) 10:36:49
はぁん
952デフォルトの名無しさん:2005/07/26(火) 12:07:32
具体例きぼんぬ>>909

こういう機構があったら、いままでこう書いてたコードがこんなに短くできて便利ですよーとか。
サンプルコードが欲しい。
953デフォルトの名無しさん:2005/07/26(火) 12:52:00
こんな感じ?

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(^Д^)プギャー");
  }
}
954デフォルトの名無しさん:2005/07/26(火) 12:52:41
使用例は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
955デフォルトの名無しさん:2005/07/26(火) 13:08:24
>>953
Catchメソッドを自前で追加しても意味ナイト
956デフォルトの名無しさん:2005/07/26(火) 13:10:35
もしかして>>953>>954は連続の説明なのか。わかりにく。
957952:2005/07/26(火) 13:20:21
やりたいことはわかったが、どんな状況においてその機能が役立つのかがわからない。
DoTest内でthrowする代わりにCatchを呼んじゃいけないの?
958デフォルトの名無しさん:2005/07/26(火) 13:32:10
>>957
DoTest内で例外投げてるのはとりあえずテストということで、
本来ならusing2ブロック内のどこかから例外が飛ぶことを想定してます。
959名無しさん♯:2005/07/26(火) 13:41:21
新スレ立てときますた。( ゚д゚)ノ
http://pc8.2ch.net/test/read.cgi/tech/1122352650/l50

あとは1000まで心おきなくICatchable話をドゾ。
960952:2005/07/26(火) 14:06:43
>>958
あーなるほど。
でもやっぱり、それが役に立つ状況ってのが想像しがたいんですが。
自分のクラス以外から例外が飛んだとして、Catchでそれを受けて一体どんな処理を行えというのか。
961デフォルトの名無しさん:2005/07/26(火) 14:27:41
>>960
例外発生イベントの代わりみたいなもんですかね。
WinFormsのApplication.ThreadExceptionみたいなやつ。
962デフォルトの名無しさん:2005/07/26(火) 14:43:55
結局>>909への最終的な回答としては「C# 3.0を待て」ということでいい?
963デフォルトの名無しさん:2005/07/26(火) 15:02:36
>>962
つ[Extension Methods, Lambda Expressions]
964デフォルトの名無しさん:2005/07/26(火) 15:10:59
なんだ、C#とICashable(仮)を絡めて欲しいって要望かよ。
そんなのはM$に言えよ。このスレで揉めたって永遠に実装されんよ。
965デフォルトの名無しさん:2005/07/26(火) 15:12:01
×ICashable
○ICatchable
966デフォルトの名無しさん:2005/07/26(火) 15:14:44
>>963 は変態的と言いたいんだろう、そうだろう
967デフォルトの名無しさん:2005/07/26(火) 15:58:12
F#なんてわからんよ、>>954
968デフォルトの名無しさん:2005/07/27(水) 01:15:45
>>962
つか、C#が3.0まで持つかどうかが最大の問題では?
969デフォルトの名無しさん:2005/07/27(水) 01:36:22
「ほげABCDEFGこんにちは」
というような文字列の”ABCDEFG”だけを半角にしたいのですが、
str.Replace("A", "A");
のように文字数分繰り返す以外の簡単な方法はないでしょうか。
970デフォルトの名無しさん:2005/07/27(水) 01:47:40
Microsoft.VisualBasic.dllを参照に追加して
Microsoft.VisualBasic.Strings.StrConv
971デフォルトの名無しさん:2005/07/27(水) 09:06:11
>>969
LCMapString()
972デフォルトの名無しさん:2005/07/27(水) 13:06:40
>>969
Regex.Replace あたりでカスタム変換
973デフォルトの名無しさん:2005/07/28(木) 18:58:17
2005は今年中にでるの?
974デフォルトの名無しさん:2005/07/28(木) 19:00:28
>>973
英語版が11月だから、年末ギリギリぐらいじゃない?
975デフォルトの名無しさん:2005/07/28(木) 21:10:01
3月までに出ないと身内から学生がいなくなってしまうよ。
976デフォルトの名無しさん:2005/07/28(木) 21:16:31
はじめましてなんとなくかくことにしました。
977デフォルトの名無しさん
今日夜10:00から電車男があります。   見ますか