C#, C♯, C#相談室 Part45

このエントリーをはてなブックマークに追加
208デフォルトの名無しさん
 今日は凄いくだらない事にメチャクチャ腹が立ったので、
懺悔の心でココに書くよ。

 "C# bmp LockBits "でグーグル検索するとLockBits()メソッドの1つめの引数rectに

Rectangle rect = new Rectangle(0,0,bmp.Width,bmp.Height);

 を指定するブログやら、Tipsサイトが大量に出てくるよね。
初心者向けとか言って、ご丁寧に赤と緑を入れ替えた画像とか貼ったりしてさー。

 LockBits()はRectangle型のxとyしか見ない、あからさまなバグ入り関数なんだよね。
 あそこは new Rectangle(0,0,1,1)で十分。
っていうか、大きな画像の一部のIntPtrを取り出したいときは、また別途Bitmapインスタンスが必要なぐらい使えない関数ww。
そっちの方がTipsとして必要だろうがwww。

 10も20も「自称」プログラマのブログがあって、MSが作ったバグには一つも触れ無いんだよwwww。
おまえらは、MSの糞が食卓に並んでても気にならない本物のブタ共だよwww。
自分のブログで晒し上げにしようかと思っちゃったよww。
209デフォルトの名無しさん:2008/02/14(木) 19:34:43
まあ208が「懺悔」の意味を勘違いしていることはよくわかった。
210デフォルトの名無しさん:2008/02/14(木) 19:42:35
今日は凄いくだらない事にメチャクチャ腹が立ったのでやつあたりしている。
が正しいな。
211デフォルトの名無しさん:2008/02/14(木) 19:48:43
「これはひどい」
「突っ込み所満載」
212デフォルトの名無しさん:2008/02/14(木) 19:56:13
>>208
普通にRectangleで指定した範囲だけロックされるぞ
(0,0,1,1)の範囲を指定したのにその外を触ろうとしたらAccessViolationExceptionが出る
213デフォルトの名無しさん:2008/02/14(木) 20:05:04
八つ当たりする先に困ってココに書いてるんだけどね。

>208
釣れた!! ソースはってみろよ。
214デフォルトの名無しさん:2008/02/14(木) 20:05:32
>212だ
自分が釣られてどうする。
215デフォルトの名無しさん:2008/02/14(木) 20:25:23
おら 奇跡は起きたか豚!
tmp.Save(@"c:\tmpA.Png", ImageFormat.Png); //tmpがBitmap型な。
BitmapData bmpData = tmp.LockBits(new Rectangle(0,0,1,1), ImageLockMode.ReadOnly,
                  tmp.PixelFormat);
int bytes = (tmp.Width) * (tmp.Height) * 4;
byte[] rgbValues = new byte[bytes];
IntPtr ptr = bmpData.Scan0;
int a = bmpData.Height;
int b = bmpData.Width;
Console.WriteLine(a.ToString()+"+"+b.ToString());   //1+1

Marshal.Copy(ptr, rgbValues, 0, bytes);
for (int d = 0; d < bytes; d++)
{
   rgbValues[d] = 0xff;
}
Marshal.Copy(rgbValues, 0, ptr, bytes);
tmp.UnlockBits(bmpData);
tmp.Save(@"c:\tmpB.Png", ImageFormat.Png);
216デフォルトの名無しさん:2008/02/14(木) 21:14:12
むしろブログでやってくれたほうが愉快だったのに、と思ってしまう。
217208,213,215:2008/02/14(木) 21:15:04
おまえら反応無いなと思ったら。
>208>213>215 は全部俺>208だ。
ttp://hey.chu.jp/up/source3/No_13803.zip
今日は気分が良いからアプロダにサンプルまで置いてしまうぞ。

最後に俺のTipsを付けておく。
bmpData = tmp.LockBits(new Rectangle(0, 0, 1, 1), ImageLockMode.ReadOnly,
             tmp.PixelFormat);
ptr = bmpData.Scan0;
Marshal.Copy(ptr, rgbValues, 0, bytes);
Rectangle rect = new Rectangle(64,64,256,128);//目的範囲をrectとすると。
for (int i= rect.X;i<rect.X + rect.Width;i++)
   for (int j = rect.Y; j<rect.Y+ rect.Height;j++)
   {
      int d = j*tmp.Width+i;
      swap = rgbValues[d * 4 + 1];
      rgbValues[d * 4 + 1] = rgbValues[d * 4 + 2];
      rgbValues[d * 4 + 2] = swap;
   }
218デフォルトの名無しさん:2008/02/14(木) 21:16:29
>216
っていうか、 MSのフォーラムに行け。
219208:2008/02/14(木) 21:19:43
>218も俺。 って。

>216はVSインストールした事も無いのに書き込んで居るんだね。
220208:2008/02/14(木) 21:48:05
どうしたのですか?
ゲイツのうんこ大好きなスカトロ豚さん?

31行目か60行目を
Marshal.Copy(ptr, rgbValues, 0, bytes+1); // +1(・∀・) イイ
って変更すると、多分お探しのエラーコードがでまちゅよ。
221216:2008/02/14(木) 21:57:35
215で例外になるじゃんと思いつつも、217やったらたしかに動くね。
違いと言えば、215のコードを動かしたときは
tmpのインスタンスを作るときにファイルから読み込むBitmapのコンストラクタを使ったということくらい。

あと、217でtmpの中身を作るときのPixelFormatをFormat16bppRgb565にしつつ、
LockBitsに渡すPixelFormatをFormat32bppArgbにしても、探してた例外になったよ。
222デフォルトの名無しさん:2008/02/14(木) 21:57:44
えっと・・・何?こいつ
223208:2008/02/14(木) 22:02:30
>216
あんまり頑張るなよ。
自分でも苦しい言い訳だと思わない?

>int bytes = (tmp.Width) * (tmp.Height) * 4;
の"4"の意味が解らないなんて無理があるだろ。

けど、とりあえず反応してくれて、 あ り が と 。
ちなみに実行した環境とかも教えてくれちゃうと嬉しいな。
224208:2008/02/14(木) 22:05:12
>222
良いTipsを思いついたからブログに書こうと思ったら、
世間の奴らのブタ過ぎに書くに書けなくなった。
225デフォルトの名無しさん:2008/02/14(木) 22:06:44
>>223
いやそういうことではなさそう
PixelFormat.Format32bppArgbで作ってPixelFormat32bppRgbでロックしても例外出る

ビットマップのPixelFormatと違うフォーマットでロックしたらRectangleの中だけロックされるみたいだ
226デフォルトの名無しさん:2008/02/14(木) 22:19:43
>225
そうだろうな。

そして人は
Format32bppArgbなら、Format32bppArgbでLockBitする。
Format32bppPArgbなら、Format32bppPArgbでLockBitする。
Format32bppRgbなら、Format32bppRgbでLockBitする。

そうでない時エラーになるのは人として当然。
そして >225はnew Rectangle(0, 0, tmp.Width, tmp.Height)の時どう動いて欲しいのかな?
>ビットマップのPixelFormatと違うフォーマットでロックしたらRectangleの中だけロックされるみたいだ
(・∀・)ニヤ

ぶっちゃけ書くけど、2008まだインストールして居ないんだ。俺。
227デフォルトの名無しさん:2008/02/14(木) 22:33:39
>>223
ペイントで24ビットビットマップとして保存して、
Bitmap tmp = new Bitmap(@"h:\P1000220.bmp");のようにした。
.NET Framework 1.1 SP1と2.0 SP1 (3.5)、
VC#コンパイラ.NET 2003, 2005, 2008の3つで試した。

32ビットビットマップでやるとtmp.PixelFormatがFormat32bppArgbになってうまくいくね。
(217からGraphics作ってる部分だけ抜き出して、tmp.Saveで作った)
228デフォルトの名無しさん:2008/02/14(木) 22:35:19
>>226
違うフォーマットでロックすることは可能
これでお前の期待する結果になる
こういう仕様のようにも見える
Rectangle rect = new Rectangle(0, 0, 10, 10);
BitmapData bmpdata = tmp.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format32bppRgb);
for (int i = 0; i < rect.Width * rect.Height; i++) ((uint*)(void*)bmpdata.Scan0)[i] = 0xfffffff;
tmp.UnlockBits(bmpdata);
229208:2008/02/14(木) 22:43:13
>227
良く嘘をつく奴だな程度に思っていたけど、只の低脳なのか?

Bitmap tmp = new Bitmap(@"h:\P1000220.bmp"); //この次の行に書け。
Console.WriteLine("tmp.PixelFormat =" + tmp.PixelFormat.ToString()); //何が見える?

ペイントで24ビットビットマップとして保存して居る奴に必要なコード変更はこういう事だ。
//int bytes = (tmp.Width) * (tmp.Height) * 4;
 int bytes = (tmp.Width) * (tmp.Height) * 3;
230228:2008/02/14(木) 22:45:30
補足
tmpのPixelFormatはFormat32bppArgb
231デフォルトの名無しさん:2008/02/14(木) 23:02:29
>>229
嘘付きと低脳だったら嘘付きがいいな。
すまん、LockBitsするときにはPixelFormat.Format32bppArgbを
指定するよう書き換えていたことをさっきからずっと忘れていた。
232208:2008/02/14(木) 23:03:53
>228
面白い。 >225は間違って無かったんだな。
Bitmap tmp = new Bitmap(412, 256, PixelFormat.Format32bppRgb);
で作って。
BitmapData bmpdata = tmp.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format32bppRgb);//つまり同じ。
for (int i = 0; i < rect.Width * rect.Height; i++) ((uint*)(void*)bmpdata.Scan0)[i] = 0xfffffff;
tmp.UnlockBits(bmpdata);
した場合は元のもくあみに戻るのな。

念のため
for (int i = 0; i < (rect.Width * rect.Height)+200; i++) ((uint*)(void*)bmpdata.Scan0)[i] = 0xfffffff;
として見たが、むなしくなった。 結果は白線がのびる。 exception無し。
こちらの環境は 2005 .NET 2.0 オンリ


夜も更けて来たので哲学入ります。
 俺がやってることは、世間の奴らが見向きもしないで触らずにいた汚い糞を、
わざわざどけてやってるだけなんだよな。

結果、一番得得してるのは、糞を垂れ流してる張本人って事ないか?
233デフォルトの名無しさん:2008/02/14(木) 23:05:02
>231
わるかった。 君が板から>228なんて案も出たんだ。
234デフォルトの名無しさん:2008/02/14(木) 23:32:16
たぶんLockBitsは指定されたPixelFormatと内部の形式が同じだったら、
コピーしないで中のメモリを直接ロックかける、
違ったら新しくメモリを用意し、そこに指定された領域を指定された形式に変換したものを
書き込んでいるという風になっている予感。

ソース見たら一発でわかるだろうな、誰かExpressではないVS 2008持っている奴いないのか?

デバッグ時は厳密にチェックするルーチンを使用し、
リリースでは速度重視って切替ができたら今より良かったと思う。
235デフォルトの名無しさん:2008/02/14(木) 23:34:46
NetMassDownloader使えばVS持ってなくてもソース落とせるよ
ただ,ネイティブGDI+の関数を呼んでるだけという罠
236デフォルトの名無しさん:2008/02/14(木) 23:59:50
>235
OSの環境に依存か。

 unsafeかつ、フォーマットの変更が有って初めてLockBit()は仕様通り動くのな。 >228

>208がrect=(0,0,1,1)に拘ってたけど、rect=(80,64,1,1)とかは動作に影響があるな。
 ソースにはラマーの意図を明確にする様に書けって話に戻るんじゃない?
 せいぜい他人が>217みたいなソースを書いてきたとき、頭を捻るって感じ。

そんな場面は限りなく少ないから、ググっても仕方ないで、 Q.E.D.


ちなみに、俺が>208って言ったら信じる? グチっぽくならないコメントを考えるよw。
237デフォルトの名無しさん:2008/02/15(金) 00:11:02
(´・ω・`)しらんがな
238デフォルトの名無しさん:2008/02/15(金) 00:39:25
>>236
VistaだとGDI+ 1.1になっているから何か変更があるのかもしれない。

> rect=(80,64,1,1)とか
そういうときのためのBitmapData.Stride。
239デフォルトの名無しさん:2008/02/15(金) 14:11:20
>>236
> unsafeかつ、フォーマットの変更が有って初めてLockBit()は仕様通り動くのな。 >228
その条件を満たさないとき、ドキュメントにあるどの仕様に反してるんだ?
一部だけを切りだして Stride も小さくしてくれるとか、領域外をアクセスすると
違反になるとかは 208の脳内仕様じゃないいのか?

LockBits は指定された領域を指定された様にアクセスできる情報を取得する
ためのメソッドであって、指定領域外へのアクセスがどうなろうが別にバグでも
なんでもない。ちゃんと当該領域は移動されないようロックされ、BitmapDataに
アクセスするための情報も返される。
240デフォルトの名無しさん:2008/02/15(金) 15:29:33
で、結局アホは誰だったの?
俺の他に
241デフォルトの名無しさん:2008/02/15(金) 18:31:14
http://dat.2chan.net/l/src/12029988461823ffe.jpg
やっぱ男はこうじゃないとね
242デフォルトの名無しさん:2008/02/15(金) 18:50:29
コピペ君って馬鹿だな、まで読んだ。
243デフォルトの名無しさん:2008/02/15(金) 19:09:48
コピペ君って馬鹿だな、まで読んだ。
244デフォルトの名無しさん:2008/02/15(金) 20:42:33
Drawing::BitmapからGDI+のCachedBitmapを作成したいのですが、
Drawing::BitmapからGDI+のBitmapを取得するにはどうすればよい?
245デフォルトの名無しさん:2008/02/15(金) 21:57:07
え? 早口言葉?
246デフォルトの名無しさん:2008/02/15(金) 22:36:40
うわぁ・・・
247デフォルトの名無しさん:2008/02/16(土) 00:59:38
bmp.GetHbitmap()ってことじゃなくて?
248デフォルトの名無しさん:2008/02/16(土) 01:10:57
>>242-243
よく見るよね
こういうのコピペって言うの?
249デフォルトの名無しさん:2008/02/16(土) 01:34:08
「コピ」−アンド「ペ」−スト
250デフォルトの名無しさん:2008/02/16(土) 01:51:49
>240
ラマー板に良くいる。プログラミングが出来ないラマーが釣れましたね。
static void Main(string[] args)
{
  Bitmap src = new Bitmap(64, 64, PixelFormat.Format32bppRgb);
  Graphics.FromImage(src).Clear(Color.Black);
  Rectangle rect = new Rectangle(32, 32, 20, 20);     
  unsafe
  {
    BitmapData bmpdata = src.LockBits(rect, ImageLockMode.ReadWrite, src.PixelFormat);//見える?
    for (int i = 0; i < (rect.Width * rect.Height); i++) ((uint*)(void*)bmpdata.Scan0)[i] = 0xfffffff;
    src.UnlockBits(bmpdata);
    src.Save(@"same.Png", ImageFormat.Png);
   
    Graphics.FromImage(src).Clear(Color.Black);
    bmpdata = src.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb); //見える?
    for (int i = 0; i < (rect.Width * rect.Height); i++) ((uint*)(void*)bmpdata.Scan0)[i] = 0xfffffff;
    src.UnlockBits(bmpdata);
    src.Save(@"different.Png", ImageFormat.Png);
  }
}
チマチマソース書くより、ファビョる豚の方が案外気分が良いのかもな。
ラマー板に行けば解るよ。 頭の善し悪しより声の大きさが重要ってさ。
251デフォルトの名無しさん:2008/02/16(土) 02:00:12
>239の言葉を借りれば、
LockBits()と言う変幻自在なMS仕様を >208如きには追えなかったってことさ。

これからも、MSがカラスが白いと言ったら、絶対に黒いっていうなよw。
252デフォルトの名無しさん:2008/02/16(土) 02:50:16
>208が見てきたサイトも解った。

>特別の事情がない限り、このコードのように全領域をロックする。
 この発案者は、きっと毎日 MSを尊敬の目で見てきた善行によって得られたノウハウだと思ったのだろうな。

 だけど書いてる本人か(もしくは彼に教えた人)も「特別の事情」がさっぱり解らない。
そして「どうして?」とか「事情とは何か?」って考えはとても背徳的で、>239の様に酷い罵声を浴びせられるんだ。
253デフォルトの名無しさん:2008/02/16(土) 02:56:38
blogに書くなりMSにフィードバックするなり文句言うなりして終了だろ
何を粘ってるんだよ
254デフォルトの名無しさん:2008/02/16(土) 02:58:48
>239みたいな奴が居なければ、>208はココに書き込まなかった

って案に、個人的に酔ってみたんだ。 ラマー板で適当なスレを探そうかしら。
255デフォルトの名無しさん:2008/02/16(土) 20:26:31
ラマー板って何かと思ったよ。初めて聞いた。
妊婦用の板かと。
256デフォルトの名無しさん:2008/02/16(土) 20:28:46
>>255が初めて触れた事を考えるとお前らなかなか大人だなw
257デフォルトの名無しさん:2008/02/16(土) 21:30:21
>>254
よう、ひっひっふー
258デフォルトの名無しさん:2008/02/16(土) 22:22:18
>>254
日本語でおk、ひっひっふー
259デフォルトの名無しさん:2008/02/16(土) 22:25:27
マ板でやれ。
260デフォルトの名無しさん:2008/02/16(土) 22:44:20
>>259
ラマー板でやれ
261デフォルトの名無しさん:2008/02/16(土) 22:51:37
ここはラム板だっちゃ。
262デフォルトの名無しさん:2008/02/16(土) 22:55:15
混み合う電車の車内、その男は熱く堅いマラを私の後ろから押しつけてきた
263デフォルトの名無しさん:2008/02/17(日) 04:44:40
ラマー板吹いたwwwwww
オレオレ用語キタコレ
やっぱり人間、謙虚じゃないといつどこで恥をかくか分からんねw

http://pc11.2ch.net/test/read.cgi/gamedev/1198312422/329-


http://pc11.2ch.net/test/read.cgi/gamedev/1198312422/339
http://pc11.2ch.net/test/read.cgi/gamedev/1198312422/344
http://pc11.2ch.net/test/read.cgi/gamedev/1198312422/346
http://pc11.2ch.net/test/read.cgi/gamedev/1198312422/348
たぶんこいつ、このスレでファビョってる奴と同一人物だよ
ラマー板も「想定」してあげないといけないらしいw
自作自演で自分の恥をうやむやにして逃げるから笑える
自分の言ってることを理解してもらえないと、ゆとりとかMS信者とか騒ぎ出すから気をつけてね
264デフォルトの名無しさん:2008/02/17(日) 04:50:03
http://pc11.2ch.net/test/read.cgi/gamedev/1198312422/344
たしかに「プログラマじゃないから」とか言ってるし、アンカーの仕方も同じだな。

どう見ても>>250です。本当にありがとうございました。
265デフォルトの名無しさん:2008/02/17(日) 07:09:06
>>208
Lockbits - specifying a rectangle with pixelformat 32bppArGB
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=249805
266デフォルトの名無しさん:2008/02/17(日) 09:15:18
>265 C#だとunsafeじゃないと動かないんだよね。それ。

一年前にVB厨が見つけたけど、(2007/01/04)
Microsoft様は「それは、俺たちが一年前(2006/05/18)にすでに通過した地点だ」と宣ったわけだw。
267デフォルトの名無しさん:2008/02/17(日) 09:28:31
>208がVB厨より一年遅れともとれる。
所詮「MS」フィードバックともとれる。
MSがvistaと言ったら、XPのbugfixだなんて恐れ多くて言えない。
268208:2008/02/17(日) 11:39:39
 ソースを一行も読めない>239は >236までして必死になって人格攻撃をしましたが
毎日 MSを神と崇めるだけの仕事をしてきた彼には、>250のソースからFormat32bppArgbなどの単語を
得てやっとの思いで >265のログを見つけ出すのがやっとでした。

 それに対して、私は>217を new Rectangle(0, 0, tmp.Width, tmp.Height)に改め、フォーマットの
変更や限定無しに、現行xpでもvistaでも正常に動作するソースを手に入れました。
 更に上司にunsafeを使った高速化を提案し、「うちはそこまでしなくてもいいよ。だけど勉強熱心だね。」と褒められました。

アンチ信者は、「アンチ」の信者と言ったのはよく言った物で、正直私は「ご利益w」の様な物を感じました。
269デフォルトの名無しさん:2008/02/17(日) 11:40:26
訂正
>236 => >263
270デフォルトの名無しさん:2008/02/17(日) 11:45:40
誰もMS信者なんて居ないのに独りで正義気取り
カワイソス
271208:2008/02/17(日) 11:50:23
 ソースや文章には多くの目が加わるとより良くなるとは、
多くのプログラマやリファクタの心がける事とおもいます。

>270 ご指摘ありがとうございます。
 正義では無く、私自信もひとつの「信者」と自嘲の意味を込めて書かせて頂きました。
272デフォルトの名無しさん:2008/02/17(日) 11:56:12
C#の質問じゃなくて.Net Frameworkの質問になっちゃうかもしれないけど

PixelFormt.*のフォーマットの定義
(PixelFormat.Format24bppRgbだったらB->G->Rの順で並んでいるbyte[]とか)
ってどこにあるの。

教えてください。

あと、bmp.Dispose()とか必要なん?
ガベコレがよきにはからってくれないの ?

273デフォルトの名無しさん:2008/02/17(日) 11:59:09
うむ
これからも懺悔の心を忘れるなよwww
274デフォルトの名無しさん:2008/02/17(日) 12:16:35
ソースを一行も読めない>239、とか
毎日 MSを神と崇めるだけの仕事をしてきた彼、とか

頭大丈夫か?少し休んだほうがいいぞ
275デフォルトの名無しさん:2008/02/17(日) 12:41:20
>>272
無いんじゃね
WPFにはあるんだけど

放置しててもそのうちファイナライザがGCに呼ばれてそこで解放されるけどあくまでフェイルセーフ
276デフォルトの名無しさん:2008/02/17(日) 13:03:27
>>268
お前の成功物語は239が居なくても成立したように見える。
どこで239から利益を得たのかわからない。
277デフォルトの名無しさん:2008/02/17(日) 13:15:23
265 = 239 だからじゃね?
>265は役に立ってる。 (0,0,1,1)のままだとvistaで転けるからw。

..
...
(0,0,1,1)なんて発想の方がでねーだろw。
278デフォルトの名無しさん:2008/02/17(日) 13:41:13
コピペ君って馬鹿だな、まで読んだ。
279デフォルトの名無しさん:2008/02/17(日) 13:44:04
>>274
空気読めてないようだねw
頭大丈夫?
280デフォルトの名無しさん:2008/02/17(日) 13:45:05
>>278
コピペしてるお前が馬鹿だということが、よくわかった。
281デフォルトの名無しさん:2008/02/17(日) 14:02:57
>>266
>Microsoft様は「それは、俺たちが一年前(2006/05/18)にすでに通過した地点だ」と宣ったわけだw。

宣ってない宣ってない。
2006/05/18のblogに載ってるのは、
「Orcasでは互換性を重視してるよ。そのためにRed and Greenモデルってのを入れたんだ」
って話で、Lockbitsの話はカケラも出ていない。
282デフォルトの名無しさん:2008/02/17(日) 14:18:38
コピペ君って馬鹿だな、まで読んだ。
283デフォルトの名無しさん:2008/02/17(日) 14:19:14
コピペ君って馬鹿だな、まで読んだ。
284デフォルトの名無しさん:2008/02/17(日) 14:26:13
コピペ君って馬鹿だな、まで読んだ。
285デフォルトの名無しさん:2008/02/17(日) 15:13:00
>272 が自分にも入り要な事に気づいたので、2匹目のドジョウを狙うぜ。
 だけど24,32bit系しかカバーできなんだ。orz
static void Main(string[] args)
{
  Rectangle rect = new Rectangle(0, 0, 8, 8);
  PixelFormat[] PFlist = new PixelFormat[] {
    PixelFormat.Format32bppArgb,PixelFormat.Format32bppArgb,PixelFormat.Format32bppPArgb,PixelFormat.Format32bppRgb,
    PixelFormat.Format24bppRgb};//ゴメン 24,32bit系しかカバーできなんだ。
  Color[] colors = new Color[] {
    Color.FromArgb(255, 0, 0),Color.FromArgb(0,255, 0),Color.FromArgb(0,0, 255),
    Color.FromArgb(64, 0, 0, 0)}; //用途に応じてココは増やした方が良いな。
  foreach(PixelFormat pf in PFlist)
  {
    Bitmap src = new Bitmap(rect.Width, rect.Height, pf);
    foreach(Color cl in colors){
      Graphics.FromImage(src).Clear(cl);
      Console.Write("{0}|{1,5}\t",pf.ToString(),cl.ToString());
      unsafe{
        BitmapData bmpdata = src.LockBits(rect, ImageLockMode.ReadOnly, src.PixelFormat);
        int pixwidth = bmpdata.Stride/bmpdata.Width;
        for (int i=0;i<pixwidth;i++)
          Console.Write("[{0,3}]", ((byte*)(void*)bmpdata.Scan0)[i].ToString());
        src.UnlockBits(bmpdata);
      }
      Console.WriteLine("");
    }
    Console.WriteLine("-----------------------------------");
  }
}
更に>275が書いた事が間違ってたら、 真にうけた俺は、更にバカだな。
286285:2008/02/17(日) 15:20:54
あれ? コレじゃ俺がコピペ君みたいじゃないか。


えっと。 すまない。本当にコピペなんだ。orz
287285:2008/02/17(日) 15:26:27
っていうか、コレ全然役にたたね。 実行しなくて良いです。
スレ汚し失礼しました。
288デフォルトの名無しさん:2008/02/17(日) 15:29:06
>>272
.NET Frameworkの仕様というよりほとんどGDI+の仕様だけど、
ここに文章で書いてある。
ttp://msdn2.microsoft.com/en-us/library/ms534412.aspx
289デフォルトの名無しさん:2008/02/17(日) 16:41:34
272じゃないんだけど
Dispose()は単なるメソッドで、GCとは関係なく
GCはいつ回収しにくるかわからないので、明示的に解放処理をしたい場合
IDisposableインターフェイスを実装してDispose()する

という解釈で合ってるのかな?
290デフォルトの名無しさん:2008/02/17(日) 19:28:52
サテライトアセンブリを学んでいるところです。

そこで使われている Assembly Linker の al.exe はどこの場所に
インストールされているものでしょうか。

 C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin
(Resgen.exe、Winres.exe はここにありました) 

を見たり検索したりしてみたのですが見つかりませんでした。
すみませんがこれについて教えてください。
291290:2008/02/17(日) 20:17:21
確かにal.exeは見つからないままでしたが、少なくともVS2005で作成する
場合は、コード内で、現在のスレッドのカルチャ CurrentThread.CurrentUICulture 
にカルチャ情報 CultureInfo() を指定するだけで該当のリソースが使われる
ようでした。al.exe は無くてもVSがやってくれるので問題ないのですね。
292デフォルトの名無しさん:2008/02/17(日) 20:24:53
>>289
うん
直接アンマネージリソースを扱ってたりして特別な解放処理が必要なクラスなら
もしDispose呼び忘れても死亡しないようにファイナライザも実装する
293デフォルトの名無しさん:2008/02/17(日) 21:28:56
ResourceHoge.resx
ResourceHoge.ja.resx
ResourceHoge.en.resx
...
等とするとVSが作ってくれて、実行時に選択してくれるのな
294デフォルトの名無しさん:2008/02/17(日) 21:30:33
>>291
C:\Windows\Microsoft.NET\Framework\v2.0.50727\al.exe
295デフォルトの名無しさん:2008/02/17(日) 22:32:45
なんでC++でなくて、C#を使ってるんですか?
296290:2008/02/17(日) 23:58:52
>>293
どうもそのようです。

>>294
ありがとうございました、そこにあることを確認しました!!
(Program Files の中しか探していませんでした。。。)

またよろしくお願いします。
297デフォルトの名無しさん:2008/02/18(月) 01:14:00
>>272
憶えていないけど、どこかで見た記憶が有る、ヘルプのすごい変なところ
298デフォルトの名無しさん:2008/02/18(月) 01:31:29
>>272
アンマネージドのラッパになっているクラスは大抵付いていてやらないとむやみに長期に渡って残るよ
アプリ落とす段階で適当にコレクトされるみたいですけど。
理由は、Comインターフェイスは手動リファレンスカウンタで管理しているので、ガベコレと直接関連してくれないから。(いずれ死ぬけど)
ファイル周りのDisopseは必ずやっておく事、ファイルが長時間に渡ってロックしっ放しになって
他のアプリからアクセスできなくなる。
それとスレッドを持っていてバックグラウンドで仕事をしているようなタイプのオブジェクトも
これは、アプリのプロセスインスタンスが死ななくなって都合が悪い、
特にデバッグ時に停止してもなかなかIDEに制御が戻らなくなってデバッグに不便になります。
299272:2008/02/18(月) 01:36:04
みなさんありがとう。

Dispose関係は結構複雑なのですね。
忘れないようにしたいと思います。
300デフォルトの名無しさん:2008/02/18(月) 01:40:59
WPFでどうしてDisposeがほとんどいらなくなったのか理解できない
ほとんどのオブジェクトは相変わらずアンマネージリソース持ってるのに
301デフォルトの名無しさん:2008/02/18(月) 05:15:29
コピペ君って馬鹿だな、まで読んだ。
302デフォルトの名無しさん:2008/02/18(月) 05:21:14
ゆりしー(´;ω;`)かわいそうです みなとらじお 君が主で執事が俺で 02
http://www.nicovideo.jp/watch/sm2336941

伊藤静「じゃあ、次もwww」
後藤邑子「斬ったほうがいい?www」
伊藤「次は斬る?www」
後藤「どうするww」
伊藤「ペンネーム『心が綺麗な天使』から頂きましったww(フンッwww) 私はこの日本に住むのにはピュアすぎます。どのようにしたら天使のような私がこの今の日本に馴染めるのでしょうか?」
後藤「.........ウザい」
二人「キャッハハハハハwwwww」
伊藤「ちょほんとさあ、大丈夫?www」
後藤「おい天使、おいおい自称天使ww」
伊藤「自分が天使だと思ってること自体がちょっと間違ってんじゃないの?っていうねwww」
後藤「うん。ね。ちょっと軽く(精神病院に)通院してみたほうがいいんじゃないの?www もしくは、今の日本に馴染めるようにちょっと汚れちゃえよwwww」
伊藤「それかもう日本出て行ったらいいんじゃないの?www」
後藤「天使が住める国にwwwwwww なんかエルフの国とかに行ったらいいんじゃないの?wwww」
伊藤「妄想の中とかに(プフッww)行っちゃえばいいんじゃないのwww」
後藤「コワイヨーwwwコワイヨーwwwww」
二人「クックックックwwww」
303デフォルトの名無しさん:2008/02/18(月) 07:17:14
>>300
>ほとんどのオブジェクトは相変わらずアンマネージリソース持ってるのに
それはXAMLのエレメントを表現したオブジェクトのツリー
アンマネージドリソースは持ってない。
304デフォルトの名無しさん:2008/02/18(月) 08:43:41
ニコ厨氏ね
305デフォルトの名無しさん:2008/02/18(月) 11:19:34
おまえら、木曜日から酷い有様だな。ちょろ過ぎる。
>208、>250なんてさ
>ソースには(プログ)ラマーの意図を明確にする様に書けって話 (引用 ケントベック)

> この発案者は、きっと毎日 MSを尊敬の目で見てきた善行によって得られたノウハウだと思ったのだろうな。
> だけど書いてる本人か(もしくは彼に教えた人)も「特別の事情」がさっぱり解らない。
>そして「どうして?」とか「事情とは何か?」って考えはとても背徳的 (読んだことあるけど失念。トム・デマルコ風?)

> ソースや文章には多くの目が加わるとより良くなるとは、(出典 Refactoring to Patterns)

 これ引用ばかりww。 それどころか、ぜんぜんランクの低いそれらをやたら勧める「アジャイルw」の口伝だろw。
>208はどう見ても真っ赤な信者です。本当にありがとうございました。
 本読んでばかりで人と話しが合わない。信者っぷりが凄くて会社のお荷物系wwwww。

 それなのに、オマエらチャンスボール多すぎ。常識的に>227なんてありえないし。
 >270>271繋がりはなんだ?便利すぐる。
執拗に人格攻撃してるのは、>239に過剰反応したコピペ君の>250なのが事実。
最後に、自分からの信者宣言まで許すし。...もう訳がわからん。
こんなの>208への接待プレーか、>250は>208の素敵な自作自演ですと思われても仕方ねーだろうよ。JK

本当にちょろ過ぎる!!! そりゃ便乗して論破狙いに「C#ってなに?」な奴も湧くよwwww。
NetMassDownloader片手にさww。
そういう本を読んで、頭良いと勘違いする只のガキは五万といるんだからな。 覚悟しとけ。
!!! 俺 も 含 め て 5 万 + 1 wwww !!!
306239:2008/02/18(月) 11:46:43
想像したり実験したりしながら「動けばいいや」とコードを書き、
仕様が想像と異なっていたらAPIのバグだと主張するという素敵な
スタイルを否定した漏れも悪かった。
307デフォルトの名無しさん:2008/02/18(月) 11:48:02
コピペ君って馬鹿だな、まで読んだ。
308デフォルトの名無しさん:2008/02/18(月) 11:55:24
309デフォルトの名無しさん:2008/02/18(月) 12:01:33
>>308
何かお探しですか?
入力したURLが当サイトのページと一致しません
といわれました
310デフォルトの名無しさん:2008/02/18(月) 12:06:50
239が265って線は消えたな。

ttp://www.cbook24.com/bm_detail.asp?sku=4891004428
 URLがどうこう以前に、会社か学校に「テスト駆動開発」の本が無いの?

>想像したり実験したりしながら「動けばいいや」とコードを書き、
>仕様が想像と異なっていたらAPIのバグだと主張するという素敵な
>スタイル
がそのまま載ってるだけなんで、 御社では別によまんくても良いんじゃない?
urlをクリックしてくれただけで十分です。
311デフォルトの名無しさん:2008/02/18(月) 12:07:12
>>309
http://www.amazon.co.jp/dp/4891004428

実は書名の部分は削っても同じページが表示される。
312デフォルトの名無しさん:2008/02/18(月) 12:11:50
主張するっていうか、発見したとした方が嫌みが無いよ。
313305:2008/02/18(月) 12:22:37
MSは、VS2005あたりからユーザーのニーズに応えて「テスト」って機能を付けたけど。
自社製品では「テスト」しないんだね。
みんなでerrorを見つけてbugfixしようよ。 みんな幸せになろう。
って書くと、もうアンチ信者なのか? orz
314305:2008/02/18(月) 12:35:48
ttp://ja.wikipedia.org/wiki/ソフトウェアテスト#.E3.83.96.E3.83.A9.E3.83.83.E3.82.AF.E3.83.9C.E3.83.83.E3.82.AF.E3.82.B9.E3.83.86.E3.82.B9.E3.83.88
ダメだ。 俺センス無いな。 urlクリックでは行けない。
239の後輩が基本情報処理技術者の資格もってれば教えてくれるよ。
315デフォルトの名無しさん:2008/02/18(月) 12:49:37
>>301
お前うざい
316デフォルトの名無しさん:2008/02/18(月) 12:52:07
自校紹介 >305
>本読んでばかりで人と話しが合わない。信者っぷりが凄くて会社のお荷物系wwwww。
317305:2008/02/18(月) 13:17:03
俺の希望を言わせてもらえば、
誰でも良いから。 239を語って
「208はマジで行き当たりバッタリで、TDD風味なのは最悪コピペ野郎の250!!
 なんだよ、どっちも糞じゃねーか!!」
ぐらいの線だったんだけどな。
318デフォルトの名無しさん:2008/02/18(月) 14:24:36
>>313
いやいや、テストしないとかありえないだろ。
MS はテストだけで部署が1つある。
319305:2008/02/18(月) 14:31:04
>265 ループかよ。  俺もうこのクソコテいらねーよ。

気分はアレだ。せっせっと地雷埋めて、味方が乗ってるときに起爆しちゃったぐらい。
俺、208みたいに全レスとかしないから。 テストってなんの事かなさっぱりわからないや。 208にでも言わせろ。
320デフォルトの名無しさん:2008/02/18(月) 17:06:29
おまえらさ・・・本当にC#の質問したい奴ができない雰囲気になってるからやめとけよ
321デフォルトの名無しさん:2008/02/18(月) 18:03:16
>>315
コピペ君って馬鹿だな、まで読んだ。
322デフォルトの名無しさん:2008/02/18(月) 18:11:39
>>303
BitmapSourceとかGeometryとか描画の低レベルなところはアンマネージリソース持ってるよ
323デフォルトの名無しさん:2008/02/18(月) 21:02:07
トータルで見るとGCって不便だし、余計に頭を使う。
324デフォルトの名無しさん:2008/02/18(月) 21:14:08
System.InvalidCastException: 型 'System.DBNull' のオブジェクトを型 'System.String' にキャストできません。

SqlServerからSelectしてきたDataRowを表示したいのですが、上記のエラーが出ます。
下記のように書いても、'System.DBNull' は '型' ですが、'変数' のように使用されています。
ということでビルドできません。typeofとか使っても駄目です。
VBだとIsDBNullってあるようですが、C#ではどうしたら良いのでしょうか?

if (row.Name != DBNull)
  Console.WriteLine("Name: {0}", row.Name);

325デフォルトの名無しさん:2008/02/18(月) 21:18:48
http://msdn2.microsoft.com/ja-jp/library/system.dbnull(VS.80).aspx
>DBNull はシングルトン クラスです。つまり、このクラスのインスタンスは 1 つしか存在できません。
その唯一のインスタンスは DBNull.Value です。
326デフォルトの名無しさん:2008/02/18(月) 21:18:57
知らんけど

if( !(row.Name is DBNull) )
327デフォルトの名無しさん:2008/02/18(月) 21:22:22
rowにIsNameNullみたいなメソッドがあったはず
328デフォルトの名無しさん:2008/02/18(月) 21:28:52
みなさま、どうも有り難うございます。

>>325
その説明がまた難しかったです‥‥。
row.Name != DBNull.Valueでも同じエラーでビルドできませんでした。

>>325
is演算子なんて、初めて使いました‥‥。
結果は同じだったんですけれど。

>>327
なんと、確かに勝手に作られました!!
カラム分のrow.Is○○Nullが生成されるようです。
気付かず、申し訳ありませんでした。

皆様、どうも有り難うございました。
329デフォルトの名無しさん:2008/02/18(月) 21:31:52
>>324
if(row.Name != DBNull.Value)
でどうか。
330デフォルトの名無しさん:2008/02/18(月) 21:36:04
>>329
俺レス遅すぎorz。
つーか、よく考えたらコンパイル通らんな…。
331デフォルトの名無しさん:2008/02/18(月) 21:36:06
ぶっちゃけ、自動生成されるプロパティ public string Name { get { }}
のなかが、if( row.Name.type == DBNull ) throw Exceptionみたいな
インプリになってるから、Nameを触った時点で終冬

StringならプロパティでNULL時に代替する値を設定できるけど、
Nullable型はどこへ行ったの、って感じ。
332デフォルトの名無しさん:2008/02/18(月) 21:39:59
ちゃんとDBのスキーマでNot NullにしたカラムではIs○○Nullが作られないんですね。
333デフォルトの名無しさん:2008/02/19(火) 01:25:34
ある指定されたファイルの先頭と最後に固定データを付加して、別ファイルに保存する方法が分かりません。
先頭の固定データを設定したByte配列に、元ファイルを読み込んだByte配列をコピーするような方法しかないものでしょうか?
334デフォルトの名無しさん:2008/02/19(火) 01:32:29
先頭に固定データを書きこんだ後に続けて
元のファイルの内容を順次書き込めばいいだろ
335デフォルトの名無しさん:2008/02/19(火) 13:09:01
StreamをUriとして扱ういい方法しりませんか?

やりたいのがzipで圧縮されたMP3をメモリ上に解凍したものを
MediaPlayerで扱いたいとか
HTMLが含まれたメールのHTML部をメモリに抽出したものをwebbrowserで開きたいのですが
メモリ=>Uriとして扱うために、一旦ファイルに落とせば出来るのですが、
ファイルに落とさずに行いたいです。
336デフォルトの名無しさん:2008/02/19(火) 13:12:12
ウェブサーバ機能も搭載してしまうとか。
337デフォルトの名無しさん:2008/02/19(火) 13:19:59
>>336
>ウェブサーバ機能も搭載してしまうとか。
すいませんが、知識がありません。
もうちょっと、ヒントを

あんまり、大がかりにはしたくないのですが、
WCFでちょちょいと出来そうなら、
チャンスなので、WCFとかの勉強をしてもいいかなとも思ってますが。
さくっと見てみた限りでは、ちょっと違うかなぁと
(出来るかもしれないし、出来ないかもしれない)
今は、飛び込むのに迷ってはいるのですが。
338デフォルトの名無しさん:2008/02/19(火) 13:47:15
>>337
System.Net.HttpListener で適当なポート Listen しといて、
要求があったら Response にファイルを返す。

ブラウザで http://localhost:ポート番号/ を開く。
339デフォルトの名無しさん:2008/02/19(火) 14:15:07
>>338
回答ありがとうございました。

MSDNにあるサンプルで試したところ、
簡単にできそうですね(さしあたり、HTMLメールの方は出来そうなことを確認)。
ながいこと方法を探していたので、本当に感謝致します。m(_ _)m
340デフォルトの名無しさん:2008/02/19(火) 21:36:35
ReSharperを購入したことのある方いらっしゃいますか?
ReSharperを購入しようと思い、JetBrainのサイトからクレジットカード(Visa)での購入手続きを行ったのですが
数時間後にメールが支払い手続き失敗のメールがきてしまいます。
このカードで他の買い物はできているのでカードが使用不能になっているわけではないと思うのですが・・・
341デフォルトの名無しさん:2008/02/19(火) 21:40:02
ドル決済ができないとか、海外利用に制限かけてあったりとかじゃないの
342デフォルトの名無しさん:2008/02/20(水) 00:47:10
あれ、List<T>にIsReadOnlyは無いの?
343デフォルトの名無しさん:2008/02/20(水) 00:50:01
>>342
ICollection<T>にはある。もちろんList<T>も実装している。
344デフォルトの名無しさん:2008/02/20(水) 00:54:14
なんでList<T>をICollection<T>にキャストか何かしないと使えないの?
List<T>のまま直接IsReadOnlyを参照できればいいのに
345デフォルトの名無しさん:2008/02/20(水) 01:04:55
List<T>は絶対読み取り専用じゃないから無意味
346デフォルトの名無しさん:2008/02/20(水) 01:17:23
んー、インターフェースのメソッドやプロパティを一部隠せる構文ってあったの?
347デフォルトの名無しさん:2008/02/20(水) 01:19:11
明示的な実装
348デフォルトの名無しさん:2008/02/20(水) 01:22:13
なるほど
いろいろとサンクス
349デフォルトの名無しさん:2008/02/20(水) 09:08:53
exe形式のCOMサーバー作るのもやり方がわからず困ってます。
ATLのhoge.exe /regserverのような自己登録型のCOMサーバーのことです。
単にCOMインタフェースを持ったexeを作って、regasmやgacutilでCOM登録はできるけど、
これだと単にDLLサーバーと同じ働きしかしない。
つまり、アプリ側でそのexeを参照してCOMが使えるけど、アプリごとにロードされる。
COMは1つだけロードされて情報を共有したいのですが・・・

こういうのってC#だとCOM+(コンポーネントサービス)で実現すべきですかね?
C#でCOM+作ってregsvcsで登録、複数アプリでの情報共有はできることは確認できたのですが。
350デフォルトの名無しさん:2008/02/20(水) 09:24:40
RegistrationServices.RegisterTypeForComClients でなんとかできるのかもしれない
351349:2008/02/20(水) 11:14:51
んー、これは、プログラムからCOM登録するというだけではないですか?
自分はCOMがマシンでシングルトン的に動く事を期待しているので。
それで複数のアプリがそこへCOMインタフェースを介してアクセス。
352デフォルトの名無しさん:2008/02/20(水) 11:43:57
RegistrationConnectionType 指定できるじゃん?
353340:2008/02/20(水) 12:03:31
>>341
フォームからは日本円も選べるので
日本からの購入も可能なのかと思ったんですが…
354349:2008/02/20(水) 12:03:35
うお、なんかできそうな気配がありますね。
ちなみにこんな記事も見つけた。
ttp://www.codeproject.com/KB/COM/ActiveXEXEWrappers.aspx
ここではEXE COMサーバー(ActiveX EXE)に相当する物は.netにはないから、
一度.netでCOM作って、それをnativeなActiveX EXEアプリで参照して、
メソッドラッピングするという話。
355デフォルトの名無しさん:2008/02/20(水) 12:28:46
>>353
>>341が言ってるのは、カードの設定のことじゃないのか。

まあ、クレカ関連のトラブルはカード会社に電話するのが一番手っ取り早いと思うよ。
356340:2008/02/20(水) 12:38:52
>>355
ありがとうございます。
問い合わせてみます。
357デフォルトの名無しさん:2008/02/20(水) 21:53:15
期限の年月を逆にかいてないか?
358デフォルトの名無しさん:2008/02/21(木) 09:52:37
買い物したことあるみたいだから、それは無いと思うが、、、たまたまあってたのかもしれんしな。
2012年を過ぎればこんな心配も無くなるなw
359デフォルトの名無しさん:2008/02/21(木) 10:18:00
偶然08/08だったので気づかなかったりw
360デフォルトの名無しさん:2008/02/21(木) 18:48:48
>>334
ありがとうございました
361デフォルトの名無しさん:2008/02/21(木) 22:32:37
JAVAとC#どっちがリバースエンジニアリングに強い?
どっちも変わらない?
362デフォルトの名無しさん:2008/02/21(木) 22:58:33
変わらないと思う。
363デフォルトの名無しさん:2008/02/22(金) 00:33:09
実際のところ難読歌どうなんだろうね。
すんごいクラス細かく分けてあって、名前がa1とかだったらそれなりに調べるのに時間かかるとは思うんだけど。
一メソッドの中のロジックはともかく、複数のクラスの相互関係とかは結構追いにくくなりそうだけど。
もちろんバイナリのほうがいいのはいうまでもないが。
364デフォルトの名無しさん:2008/02/22(金) 00:39:16
リフレクションしてたら死ぬからできればやめといた方が無難
365デフォルトの名無しさん:2008/02/22(金) 02:21:01
バイ…ナ…リ…?
366デフォルトの名無しさん:2008/02/22(金) 02:26:19
意図せずリフレクションが使われてることはよくある。
Enum.Parseとかも駄目。
そういう副作用があるので難読化後に全テストし直しが必要なのできついよ。
駄目なクラスなどだけ難読化の対象から外すのはできるけどそれを確認するのも手間がかかる。
難読化してもメソッド内のロジックとかで見ると何も変わらないのであんまり意味がない。
ほんのちょっと読みづらいだけだよ。
367デフォルトの名無しさん:2008/02/22(金) 07:21:38
>>365
そのまま、ネイティブバイナリの意味ですが?普通に読めば.NET ILコードとネィテブバイナリを比較して行ってると思ったんだけど・・・

>>366
>意図せずリフレクションが使われてることはよくある。
>Enum.Parseとかも駄目。
>そういう副作用があるので難読化後に全テストし直しが必要なのできついよ。

それはめんどくさそうですね。


>駄目なクラスなどだけ難読化の対象から外すのはできるけどそれを確認するのも手間がかかる。
>難読化してもメソッド内のロジックとかで見ると何も変わらないのであんまり意味がない。

ので全部のクラスに難読化かけたときは全体の構造追いにくくなるのである程度は意味ないかと思ったんですけどね・・・
じぶんならかなり見る気がうせるし、追ってくのにも時間かかるだろうから、それなりに障壁にはなるかと。

368デフォルトの名無しさん:2008/02/23(土) 13:08:05
369デフォルトの名無しさん:2008/02/23(土) 13:34:00
↑グロ注意
370デフォルトの名無しさん:2008/02/23(土) 21:39:20
Console.ReadKey を使ってそれなりにリッチなコンソール インターフェイスを
構築しようとしているのですが、(Console IME は使えなかったのでテストして
いませんが) 非 ASCII 文字をペーストすると変に分解? されてしまうようなの
ですが、何か対策は無いものでしょうか。どうかご教示願います。

/* コード */
char c;
while (true) Console.WriteLine("{0} ({1})", c = Console.ReadKey(true).KeyChar, Convert.ToInt32(c));
/* 結果: (入力orペースト -> 出力)
a -> a (97)
A -> A (65)
あ -> ? (130)\n? (12448)
い -> ? (130)\nア (12450)
ア -> ? (131)\nぁ (12353)
371デフォルトの名無しさん:2008/02/24(日) 22:12:17
TextBox textBox;

textBox.AppendText("1\n");
textBox.AppendText("2\n");

textBox.AppendText("3\n");

textBox.AppendText("4\n");

textBox.AppendText(textBoxLog.Text);

とすると、

1
2
3
4
1234

ってなるんだけど、最後の行で改行が消えるのは何故?
改行を保存するにはどうすればいいの?
372デフォルトの名無しさん:2008/02/24(日) 22:14:22
正しい改行は\r\nだぜ
373デフォルトの名無しさん:2008/02/24(日) 22:20:04
ちょっと質問の仕方を変える。

TextBox textBox;

textBox.AppendText("1\n");
textBox.AppendText("2\n");
textBox.AppendText("3\n");
textBox.AppendText("4\n");
textBox.AppendText(textBoxLog.Text);

とすると、

1
2
3
4
1234

ってなるんだけど、初めの4文字は改行されて、最後の4文字は改行されないは何故?
374デフォルトの名無しさん:2008/02/24(日) 22:38:18
>>373
Dock=FillとかにしてTextBoxのサイズがウインドウサイズに連動して変わるようにして、
表示した後にサイズを変えてみ。
\nじゃだめなことがわかるから
375デフォルトの名無しさん:2008/02/24(日) 22:40:08
逆に、なぜ\nでも一見改行されているように見えるのかと聞いているのかもしれない。
それなら、俺も聞きたいところだ。
376デフォルトの名無しさん:2008/02/24(日) 22:46:38
>>374
>>375の言う通り、初めの4文字が「\nじゃだめ」じゃない理由を知りたい。
377デフォルトの名無しさん:2008/02/24(日) 23:20:55
x.SelectionStart = x.TextLength
ってやると末尾に\nが来た場合次の行にカーソルが行くから、かね
378デフォルトの名無しさん:2008/02/24(日) 23:24:02
最善策: Environment.NewLine
379デフォルトの名無しさん:2008/02/24(日) 23:41:20
昨日プログラムを始めたばかりなのですが、本にintは数値を入れる箱と書いてあったのですが
どういう箱なのでしょうか?いまいち解らなくて・・・
380デフォルトの名無しさん:2008/02/25(月) 00:01:41
>>373
textBox.AppendText(textBoxLog.Text + "\n");
で解決とか言う問題ではないのよね?
381デフォルトの名無しさん:2008/02/25(月) 00:03:56
>>380
ではないね。
382デフォルトの名無しさん:2008/02/25(月) 00:06:43
>>379
なれるまで使い続けろ
383デフォルトの名無しさん:2008/02/25(月) 00:09:02
  ____
 /......  .. .../
 ||:::   ∧ ∧  / ̄ ̄ ̄ ̄ ̄ ̄ ̄
 | ̄\ ( ゚Д゚)<  こういう箱。
 |   |: ̄U U ̄:|\_______
 |   |: int   :|
  ̄ ̄ ̄ ̄ ̄ ̄
384デフォルトの名無しさん:2008/02/25(月) 00:10:07
intはどっちかというと箱の形だと思う
385デフォルトの名無しさん:2008/02/25(月) 00:17:59
型の話をするとなっがーくなるぞ
386デフォルトの名無しさん:2008/02/25(月) 00:35:41
>>379
ふらっと池
諸先輩方の仰る通り、とりあえず変数は一通りその存在に慣れて、その後に
詳細を理解した方が良い。
387デフォルトの名無しさん:2008/02/25(月) 00:37:02
>>383
それはむしろ object @int = new Giko("こういう箱。"); じゃw
388デフォルトの名無しさん:2008/02/25(月) 00:39:10
>>379
メモリにも、処理可能な量にも限界がある(有限)ため、資源を区切って使う必要がある。
どんな箱かと言われたら、一般的な段ボール箱かな?
389デフォルトの名無しさん:2008/02/25(月) 03:15:45
詳しいことは知らないので適当に書くが、
半導体が帯電しているかしていないかで0,1をあらわす
それを32個組み合わせたものがintで、
intは2の32乗の状態をもつことが出来る。
一つ一つの状態は整数の値に対応し、四則演算などを行うことが出来る
つまり整数を入れるのがint
390デフォルトの名無しさん:2008/02/25(月) 04:00:04
適当すぎてワロタ
391デフォルトの名無しさん:2008/02/25(月) 09:33:29
>>379
英語の文法を意識して話してるうちは英語が話せないのといっしょ。
でも、たとえも良くないな。
数学の変数と同じと思う方がいい。
392デフォルトの名無しさん:2008/02/25(月) 09:40:04
よく使われるけど「箱」って絶対分かりにくいと思う。
数学の x や y と同じで、ただ代入できる数値に制限があるってだけで
中学生以上なら誰でも理解できると思うんだけど…
393デフォルトの名無しさん:2008/02/25(月) 09:43:35
代入演算子が "=" なのがそもそもオカシイ
もう慣れちまって違和感無いけど
394デフォルトの名無しさん:2008/02/25(月) 10:03:33
代入が「演算」かどうかという点からして微妙なんだがな
395デフォルトの名無しさん:2008/02/25(月) 11:11:48
そうですか
396391:2008/02/25(月) 11:39:35
>>392
Cの時代はポインタの理解の布石として箱で理解する必要はあるかもしれないけどね。
今時の開発で初心者が箱で理解する意味なし。
397デフォルトの名無しさん:2008/02/25(月) 12:14:14
Cの場合、ポインタで直接中身をいじる感覚を把握するために、
箱モデルの必要性があった。

現代的な言語、たとえばJavaなら、プリミティブ値かオブジェクトに付ける名前、
あるいは名札、という概念で把握できるから箱モデルいらね。
398デフォルトの名無しさん:2008/02/25(月) 12:15:07
というかC♯スレだっけ、ということで、
s/Java/C♯/
399デフォルトの名無しさん:2008/02/25(月) 12:25:00
保存媒体のケース
カセットテープのケースにはカセットテープが入る
MDのケースにはMDが入る
形が似てるものは互換性があったり(あるように見えたり)する

何でも入れられるケースもあるけどな
400デフォルトの名無しさん:2008/02/25(月) 12:36:02
その文脈で何でも入れられるケースが出てくるのはおかしい
箱で考えるとその辺で悩む奴がいる
401デフォルトの名無しさん:2008/02/25(月) 12:49:27
ヒープとスタックくらいは構造意識してプログラミングしようよ。
402デフォルトの名無しさん:2008/02/25(月) 13:11:27
今ある言語の「型」は性質によって定義されるのであってメモリ構造とかは付随的なものだから
記憶構造とか意味が無いよ
むしろ「自然数」という型を数学的に定義しているペアノの公理とかの方に引っ張っていくべき
403デフォルトの名無しさん:2008/02/25(月) 14:02:11
行き過ぎた抽象化や比喩は弊害になるいい例なんだと思う
自分の指示がコンピュータのどの資源をどのように確保したかを理解せずまともなプログラムが出来るなんて
現実感の足りない偉い学者の夢想物語で未来永劫そんな理想環境が訪れることは無いんじゃないかな

ペアノとやらでメモリの話を避けてintの定義と機能を説明できる?
404デフォルトの名無しさん:2008/02/25(月) 14:32:42
初心者は型の無いシンプルな言語から始めたほうがいいのじゃないだろうか。
405デフォルトの名無しさん:2008/02/25(月) 15:00:55
型があったほうがコンパイル時にエラーで教えてくれて親切だと思うんだけどなぁ
406デフォルトの名無しさん:2008/02/25(月) 15:10:24
型無し言語ほど恐ろしいものはないわ
407デフォルトの名無しさん:2008/02/25(月) 15:10:56
>>403
できる
408デフォルトの名無しさん:2008/02/25(月) 15:29:06
箱とか数学よりも擬人化したほうがいいだろjk
409デフォルトの名無しさん:2008/02/25(月) 15:32:44
C#で多倍長整数を構造体で定義することを考えてみ
メモリ云々よりも性質から攻めていった方が楽だろ?
型っていうのは性質によって定義されるものなんだろjk
410デフォルトの名無しさん:2008/02/25(月) 15:37:14
型宣言省いて上手く動かず
全部intで処理して挙動不審
floatで期待した結果を得られず

ホビープログラムで経験して理解した者が這い上がってくるって事で良いんじゃないだろうか
別の山道ももちろん在るけど
411デフォルトの名無しさん:2008/02/25(月) 15:46:34
implicit operator実装しまくればVariant型を作れるかな
412デフォルトの名無しさん:2008/02/25(月) 17:34:41
C#で、グラフ構造を表示するのに便利なライブラリーってありません?
413デフォルトの名無しさん:2008/02/25(月) 18:58:11
ListViewの詳細表示で、他のコントロールを貼り付けるにはどうしたらいいですか?
414デフォルトの名無しさん:2008/02/25(月) 19:12:15
>>413
ListViewを使うのは諦めた方がいい。
DataGridViewとか使ったら?
WPFなら融通利くかな・・・。
415デフォルトの名無しさん:2008/02/25(月) 20:49:30
>>411
System.Variant
416デフォルトの名無しさん:2008/02/25(月) 20:52:35
>>413
貼り付けるだけなら
control.Parent = listview;

サイズはListViewItem.BoundsとかListViewItem.ListViewSubItem.Boundsとかで拾う
制御するにはイベントだけじゃ無理でWndProcをオーバーライドして適宜メッセージ処理する必要あり
417デフォルトの名無しさん:2008/02/25(月) 23:52:39
ArrayListにString配列をAdd()で格納*n回繰り返す →
それぞれのStringデータに1バイトずつbyte型のデータを
付加して、String配列を一つのStringデータにする。

やり方をどなたか分かる方おりませんか?

StringBuilderでStringをアペンドすることは出来るのですが、
byte型のデータをアペンドするときに0x12が0x3132になってしまいます。。
418デフォルトの名無しさん:2008/02/26(火) 00:00:24
要するに、そのbyte型データ(bとして)がstringになればいいんでそ。

System.Text.ASCIEncoding.GetString( new byte[] { b } )
でも使って変換すれば。
419417:2008/02/26(火) 00:07:35
>>418 さん

ありがとうございます!!!
大変助かりましたし、勉強になりました。

本当にありがとうございます。
420デフォルトの名無しさん:2008/02/26(火) 00:13:01
もち、ASCIIの範囲超えたら例外だかんね。
文字列はUnicodeとして合法な並びにしかならないから。
それが嫌なら、全部バイト配列でやるこったね。
421417:2008/02/26(火) 00:30:42
文字列で処理する方法を諦めかけていたとき、
byte配列で処理することも考えていました。
データ長が可変なこともあってArrayListで
処理していたのですが、

ArrayList = new ArrayList();

arylst.add( b ); //byte型で0x12を格納したデータ
arylst.add(bytes); //文字列をbyte配列に変換したもので0x35363738(5,6,7,8)を格納したデータ

byte[] = (byte[])arylst.ToArray(typeof(byte));

と処理すると、ToArrayの箇所で必ず、『キャストできませんでした』という
例外になってしまっていました。

もしよろしければ、上記のbyte配列で処理する手順で
例外にならないようにbyte配列を生成する方法を
併せてご教授いただけませんでしょうか?
422デフォルトの名無しさん:2008/02/26(火) 00:41:18
その文字列を、どのエンコーディング使ってByte配列にしたいかによって話も変わってくるけど、
List<byte> bytelist = new List<byte>();
bytelist.Add( b );
bytelist.AddRange( System.Text.UTF8.GetBytes( "abcdefgh...") );
みたいにして、最後にbytelist.ToArray();とでもすればいいんじゃないの。
423デフォルトの名無しさん:2008/02/26(火) 00:54:23
417-418を見て思ったんだけど、(char)bってできなかったっけ?
424デフォルトの名無しさん:2008/02/26(火) 01:12:57
出来ますが、文字コードに変換されてしまいますよ
425デフォルトの名無しさん:2008/02/26(火) 01:29:57
>>421
arylstの中身は { b, bytes }
bytesがbyte[]型ならbyte型にキャスト出来ないのは自明

配列をばらして追加したいならAddRange()

>>423>>424
ASCIIの範囲なら問題ないんじゃないか?
0x30を"30"ではなくて'\x30'に変換したいだけだと思ってたんだが違うのか
426デフォルトの名無しさん:2008/02/26(火) 01:37:32
あ、"30"じゃなくて"48"か
>>417につられて間違えた
427デフォルトの名無しさん:2008/02/26(火) 02:15:43
process.start(exe, arg)でargが2056文字だと正常に動作するけど
2057文字だとエラーになります.
なぜだか原因,仕様等知っている人いたら教えてください.
428デフォルトの名無しさん:2008/02/26(火) 07:21:24
コマンドラインのバッファ制限
429デフォルトの名無しさん:2008/02/26(火) 09:06:18
グラフ構造を見やすく表示するようなコントロールって
どこかから発売されているのでしょうか?2Dでも3Dでも
かまいません。.NET で使えるものを探しています。
430391:2008/02/26(火) 10:02:48
>>409
同意。
Marshalとか使い出さない限りは問題ない。
数学Iができてればプログラムは問題ない。
II以降の偏差値50切ってる俺ですらできてるからな。
431デフォルトの名無しさん:2008/02/26(火) 10:06:14
問題ないと思っているのは本人だけ。
そもそも優秀な管理者は部下にぎりぎり問題の無い仕事を与える。
432デフォルトの名無しさん:2008/02/26(火) 11:16:40
ちょっと質問なんですが、

// IE オブジェクトを作る
Type typ = Type.GetTypeFromProgID("InternetExplorer.application");
object ie = Activator.CreateInstance(typ);
これで新しいIeのインスタンスが出来るんですが、
既に起動しているIeのハンドルからobject ie を設定する方法ってのは
ないものでしょうか。よろしくお願いします。
433デフォルトの名無しさん:2008/02/26(火) 11:46:09
ShellオブジェクトのWindowsメソッドで列挙してHWNDプロパティ見てけば
434417:2008/02/26(火) 12:40:48
>>422-426
大変助かりました。
ありがとうございました。
435デフォルトの名無しさん:2008/02/26(火) 13:35:30
ArrayListにAddした複数のbyte配列を、ToArray等で
ひとつのbyte配列にはできないのでしょうか?
436デフォルトの名無しさん:2008/02/26(火) 13:44:34
byte[] array = list.OfType<byte[]>().SelectMany(a=>a).ToArray();
437デフォルトの名無しさん:2008/02/26(火) 14:33:53
説明が足りませんでした。
開発環境はVS2005です。
438デフォルトの名無しさん:2008/02/26(火) 14:36:07
というかまだ ArrayList 利用者っているの?
1.1 に縛られてるなら仕方ないが、そうだと>>436 使えんし
439432:2008/02/26(火) 16:36:13
>433
Shellですか。(^^;
Shell = CreateObject("Shell.Application");
foreach (object Obj in Shell)
こうやってもobject型がGetEnumeratorを含んでいない為
列挙が出来ません。
何か良い方法があるのでしょうか。
440デフォルトの名無しさん:2008/02/26(火) 19:59:06
Shell.Windows
441デフォルトの名無しさん:2008/02/26(火) 21:43:39
>>438
配列に縛られてる奴等はいっぱいいる。
442デフォルトの名無しさん:2008/02/26(火) 22:07:29
リモートデバッグの仕方がわかりません。
プロセスにアタッチはできるのだがブレークポイントが有効にならない。
なんで?
VisualStudio2005 C#
443デフォルトの名無しさん:2008/02/27(水) 01:27:20
目的のプロセスがデバッグ情報ないのでは。
444デフォルトの名無しさん:2008/02/27(水) 06:19:01
どういうプログラムをデバッグをしたいのかとか、
実行した手順を書かないとエスパーでないと答えられん
445デフォルトの名無しさん:2008/02/27(水) 17:46:00
フォームのタイトルってTitleで何度も書き換える事はできないのでしょうか?
446デフォルトの名無しさん:2008/02/27(水) 19:04:02
Form.Text
447445:2008/02/27(水) 19:22:13
>>446
それが反映されないのです。
form2.Show();したものですからかね?
448デフォルトの名無しさん:2008/02/27(水) 19:46:09
form2.Text
449デフォルトの名無しさん:2008/02/27(水) 19:48:49
Application
450デフォルトの名無しさん:2008/02/27(水) 22:14:53
別スレッドから書き換えてたりしないだろうな
451デフォルトの名無しさん:2008/02/28(木) 11:54:13
たぶん違うインスタンスのプロパティいじってるとエスパー
452デフォルトの名無しさん:2008/02/28(木) 20:42:52
C♯[windowsプログラミング]の問題集を買ったんですがどうしてもわからない問題があったので教えてください
問題:以下の説明に該当するイベントを答えなさい
@ボタンをクリックしたときに発生する
Aラジオボタンの選択された時発生する
Bテキストボタンの値が変わった時発生する
Cフォームが閉じる時発生する
Dタイマーが有効になった時に一定時間間隔で発生する
453デフォルトの名無しさん:2008/02/28(木) 21:01:02
VC# 起動してフォームにそれぞれ配置して
プロパティのイベント見れ
親切に説明書いてあるから
454デフォルトの名無しさん:2008/02/28(木) 21:06:11
分からなくても全然OK。IDEが助けてくれるから。
455デフォルトの名無しさん:2008/02/28(木) 21:11:42
そんな名前なんてほとんど役に立たない知識だと思うけど。
糞問題集だな
456デフォルトの名無しさん:2008/02/28(木) 21:13:22
発生することの名前の前に「On」を付けろ。
457デフォルトの名無しさん:2008/02/28(木) 21:29:57
よーし!パパ、役に立たない豆知識を問題集にしちゃうぞー!
458デフォルトの名無しさん:2008/02/28(木) 21:57:23
問題集を見ただけで本全体が糞であると予想できる。
今すぐゴミ箱に捨ててプログラミング.NET Frameworkを買うんだ。
459デフォルトの名無しさん:2008/02/28(木) 22:21:41
数年前、C#をかじった程度で久しぶりに他人の書いたソフトを見ていて
驚愕した。アンマネージDLLの関数をコールする際の話なのだが、
文字列を渡すためにcharポインタを渡すところでいきなりC#からstringを渡している!?
それでちゃんと動いている・・
また、普通に配列を渡したりもしている・・配列の「参照」ってポインタなの?
stackallocとか使ってポインタを使わないとダメだと信じてたのに・・
460デフォルトの名無しさん:2008/02/28(木) 22:23:49
つ 相互運用マーシャリング
つかこの辺参照しないでよくP/Invokeやってたな
461デフォルトの名無しさん:2008/02/28(木) 23:15:10
>>452は釣りだろ?
まさかそんな問題集が存在するとは思えない
462980の続き:2008/02/28(木) 23:58:32
461>学校のほうで販売されていた問題集なんです
463デフォルトの名無しさん:2008/02/29(金) 00:01:09
>>462
先生説教して来い
464デフォルトの名無しさん:2008/02/29(金) 00:11:53
恐らく、問題集が問題なのではなく、>>452の書き方が問題。
465デフォルトの名無しさん:2008/02/29(金) 00:29:42
>>452 が単位を落としますように。
466デフォルトの名無しさん:2008/02/29(金) 03:08:17
DBに登録済みの、あるテーブルのスキーマから空のDataTableを作成したいんですが、
方法ありますか?列をちまちま追加するより簡単に
467デフォルトの名無しさん:2008/02/29(金) 03:43:50
>>466
普通に、空のDataSetをVS上で作って、
(newするのじゃないよ)
Adapterでつなげばいいんじゃね?
468デフォルトの名無しさん:2008/02/29(金) 05:42:16
DataAdapter.FillSchema
469466:2008/02/29(金) 15:17:53
>>468
これでおkみたいです。thx
470デフォルトの名無しさん:2008/02/29(金) 19:12:01
コマンドプロンプトを使って、NetUseコマンドにてドライブを作成したいのですが、
接続対象のパスに空白が含まれている場合はどのように入力したらいいでしょうか?
471デフォルトの名無しさん:2008/02/29(金) 19:16:27
"
472デフォルトの名無しさん:2008/03/01(土) 00:48:11
                "
473デフォルトの名無しさん:2008/03/01(土) 01:00:01
"なぜ ここで聞くんだ?"
474デフォルトの名無しさん:2008/03/01(土) 01:30:14
相談室だから。
475デフォルトの名無しさん:2008/03/01(土) 04:08:31
もし学生さんなら是非、進路指導室に喧嘩の指導をお願いしに行ってみて欲しい
476デフォルトの名無しさん:2008/03/01(土) 13:23:03
子供相談室に包茎の悩みを聞いてもらっておk?
477デフォルトの名無しさん:2008/03/01(土) 19:53:06
DrawEllipseって何でこんなに使いづらいんですか?
中心点、半径を引数に与えれば円を書いてくれるような関数にすればよかったのに。
478デフォルトの名無しさん:2008/03/01(土) 19:55:39
それは楕円の特殊なケースだからなぁ
ラップすればいいんじゃね
479デフォルトの名無しさん:2008/03/01(土) 20:16:51
楕円でも短径と長径を・・・ってのはいいとして、
表示したい範囲がはっきりするので
この仕様の方が便利な事もまああるし、
幅が偶数ピクセルだと 「中心」 が上手く定まらないので、
最も汎用的な関数としてはこうせざるを得なかったんだろう。

ラッパ関数くらい用意して欲しかった所ではあるけど。
480デフォルトの名無しさん:2008/03/01(土) 20:22:16
ラッパラッパってポリモーフィズムくらい使えよ。
481デフォルトの名無しさん:2008/03/01(土) 20:23:48
ポリモーフィズム関係ないだろ
482デフォルトの名無しさん:2008/03/01(土) 20:26:57
間違ったポリモーフィズムの代表例じゃないかw
483デフォルトの名無しさん:2008/03/01(土) 21:23:41
>>479
> 楕円でも短径と長径を・・・
定義通りにするなら、焦点2つと距離の和(=長径)

でも、GDI使うような場面では使い難いと思うが
484デフォルトの名無しさん:2008/03/01(土) 23:42:41
つか拡張メソッド
485デフォルトの名無しさん:2008/03/02(日) 00:02:07
中心の座標と半径でって未だにそんな大昔のMS BASICみたいな発想をする人がいたことにむしろ驚きw
どう考えてもそんなの使いにくいだろう
486デフォルトの名無しさん:2008/03/02(日) 00:02:49
質問です。
static int deg = 90;
const double rad = 0.0174532925;
const int r = 200;
private void button1_Click(object sender, EventArgs e)
{
int r = 200;
int x, y;
Graphics g = pictureBox1.CreateGraphics();
g.FillEllipse(fillbrush, 250, 20, 400, 400);
x = (int)(r * Math.Cos(deg * rad) + 450);
y = (int)(-r * Math.Sin(deg * rad) + 220);
g.DrawLine(mypen, 450, 220, x, y);
timer1.Enabled = true;
}
private void timer1_Tick(object sender, EventArgs e)
{
Graphics g = pictureBox1.CreateGraphics();
deg = deg - 12;
if (deg >= -270){
int x1 = (int)(r * Math.Cos(deg * rad) + 450);
int y1 = (int)(-r * Math.Sin(deg * rad) + 220);
g.DrawLine(mypen, 450, 220, x1, y1);
}
if (deg == -270)
timer1.Enabled = false;
}
のような感じで30秒で一周するタイマーを作ったのですが、
コレを線でなく扇型でぬりつぶしていく良い方法は無いでしょうか?
487デフォルトの名無しさん:2008/03/02(日) 00:08:13
Arc
488デフォルトの名無しさん:2008/03/02(日) 00:14:00
>>486
しかし酷いコードだな。
「プログラム診断室」に出てくる悪いコードの見本みたいだ
489デフォルトの名無しさん:2008/03/02(日) 00:28:47
>>488
ハァ?
じゃぁ、良いコードの見本書いてみろよ。
490デフォルトの名無しさん:2008/03/02(日) 00:39:09
例えば、
>const double rad = 0.0174532925;

const double rad = PI/180;

くらいはしてほしい。。
491デフォルトの名無しさん:2008/03/02(日) 00:41:16
450とか220とかを変数にできないものか。
あと、12じゃなくて、360/30って書いてよ。
492デフォルトの名無しさん:2008/03/02(日) 00:43:14
private void button1_Click(object sender, EventArgs e)

private void timer1_Tick(object sender, EventArgs e)
に共通部分が多いことに違和感を感じないのだろうか。
493デフォルトの名無しさん:2008/03/02(日) 00:43:43
>>487
すいません。
プログラミング初心者なんです。

>>489
ちょ、あなた誰ですか。
やめてください。

>>490
わかりました。Math.PIですね。
>>491
わかりました。
494デフォルトの名無しさん:2008/03/02(日) 00:45:36
>>492
すいません。
オブジェクト指向というか、スコープを良く分かってないんです。
495デフォルトの名無しさん:2008/03/02(日) 00:49:16
if (deg == -270)
も危険な感じがする。12度間隔じゃなかったら270丁度にならないよ。
if (deg <= -270)
にした方が良いかと。
496デフォルトの名無しさん:2008/03/02(日) 00:50:17
質問に対する回答以外のつっこみを排除しようとするなら2ちゃんなんかに書き込まないほうが精神衛生上いい
497デフォルトの名無しさん:2008/03/02(日) 00:50:43
>>486
天才wwwww
498デフォルトの名無しさん:2008/03/02(日) 00:52:24
ちょ、変数rがwwwwwwwwwww
499デフォルトの名無しさん:2008/03/02(日) 03:09:07
で、>486の質問への回答としてはg.FillPie()を使えという事でいいんかいな
500デフォルトの名無しさん:2008/03/02(日) 07:22:27
今までだと WebBrowser にフラッシュを表示させると
クリックしてもフラッシュにクリックが伝わらなかったけれども
いつの間にか正常にクリックできるようになってるじゃん
501デフォルトの名無しさん:2008/03/02(日) 07:32:16
x = (int)(r * Math.Cos(deg * rad) + 450);
y = (int)(-r * Math.Sin(deg * rad) + 220);

はPositionFromDegreeとかにまとめとけ
502デフォルトの名無しさん:2008/03/02(日) 12:40:37
しかしregionでまとめれば大して差は無い
503デフォルトの名無しさん:2008/03/02(日) 15:10:47
CreateGraphicsでつくったGraphicsはDispose推奨
504デフォルトの名無しさん:2008/03/02(日) 16:59:45
自作のアプリケーションの更新があった場合ネットワーク経由で自動的に通知できる様にしようとしています
Jane Doeをイメージしていただけるとありがたいです…

こういった場合の一般的なアプローチの方法を教えていただきたいです。
今のところ、バージョンを管理するテキストファイルをウェブ上にアップしておきそれをDL、読み込みすることで判定する、といった方法を考えているのですが
いまいち遠回りでスマートでないような気がします。

また、確認のついでに使用しているバージョンなどのログが取れたらと思うのですが
こういったものは普通CGI等を利用して実装するのでしょうか?
505デフォルトの名無しさん:2008/03/02(日) 17:19:30
>>504
前者は、逆にそれ以外の方法があるのかと思う。
サーバー側から配信するってことだと思うけど、宛先がわからない。
初回に登録させるのは多分いやがるだろうし、登録したって変わる可能性が高すぎる。
おまけに配信作業がプログラムを書くにしても手作業でやるにしてもめんどくさすぎる。

最新情報を書いておくのはテキストでいいのか、XMLがいいのかって問題はあると思うけど
そのURLをずっと固定で維持する必要があるのが唯一の難点なだけで、
それしかないと思うけど。

後者はUserAgentに書いておけば、アクセス解析させるだけで出来そうな気もする。
ってこれも一応CGIか。
506デフォルトの名無しさん:2008/03/02(日) 17:41:14
>>504
clickonce
507デフォルトの名無しさん:2008/03/02(日) 17:48:55
>>505
なるほど!UserAgentは思いつかなかったです。ありがとうございます。
CGIとかさっぱりだったので困り果ててたのですがさすがにアクセス解析ならなんとかなると思います。

自動更新は苦肉の策のつもりだったのですが
やはり他の方法は考えにくいですよね…。

サーバーダウン等で接続できない時はその旨を出すようにしてましたが
そもそも、サイトが移転した状況を考えていませんでした。
人為的な問題なのでヘルプにサイトを記述したり、移転前に告知することで対策することにします


ところで、テキストで書く以外考慮していなかったのですが
バージョン管理をXMLで記述するメリットというのはどういったものなのでしょうか?
508デフォルトの名無しさん:2008/03/02(日) 18:02:49
>>506
ああ、ClickOnce忘れてました…!
これは限りなく正解に近いです。ありがとうございます。

ただ、まだあまり使われてるところを見かけないのが少し心配ですが
とりあえず>>504の方法と両方試してユーザーと相談してみることにします。
みなさま本当にありがとうございました。
509デフォルトの名無しさん:2008/03/02(日) 22:07:52
>500
IEの仕様変更。
特許の期限切れで以前の動作に戻ったんだよ。
510デフォルトの名無しさん:2008/03/02(日) 22:22:04
>>509
そのパッチってまだ出てないでしょ
サイトによっては
クリックするとこのコントロールをアクティブにして使用します
ってのが出るし
511デフォルトの名無しさん:2008/03/02(日) 22:28:21
確かJavaScriptで逃げてるはず
512デフォルトの名無しさん:2008/03/02(日) 22:38:20
Eolas問題に関してはスクリプトで回避できるけれども
>>500の件はスクリプトを使っていようがいまいが
WebBrowser 内の Flash はまともに動いていなかった
513デフォルトの名無しさん:2008/03/03(月) 03:29:05
ボタンコントロールのImageプロパティに
ビットマップを設定しています。

クリック時やマウスオーバー時の
画像を変更したいのですが、よい方法はありますでしょうか?

現状ではMouseEnter、MouseLeaveイベントを処理して
Imageをその都度入れ替えています
514デフォルトの名無しさん:2008/03/03(月) 03:43:54
良い方法っていうのは効率の良い方法って意味だよね?

EnterとLeaveで2枚しか使わないなら、2枚を一々変えずにメモリ確保とかその程度じゃない?
515デフォルトの名無しさん:2008/03/03(月) 05:39:39
imagelistでも使えば
516デフォルトの名無しさん:2008/03/03(月) 08:52:04
おはうー
517デフォルトの名無しさん:2008/03/03(月) 23:21:01
bmpはでかいからjpgやpngにするとか?
もしくは16色bmp
518デフォルトの名無しさん:2008/03/03(月) 23:38:27
どうしたいのかわからないぞ
処理を軽くしたいとかか?
519デフォルトの名無しさん:2008/03/04(火) 00:22:06
一般的あるいはスマートな方法があるのか知りたいだけじゃないのか?
520デフォルトの名無しさん:2008/03/04(火) 00:22:36
都度入れ替えているが切り替えスピードが遅く困っている、とエスパー予備軍の俺が予想
521デフォルトの名無しさん:2008/03/04(火) 00:59:29
まあ、本人も消えてるしどうでもいいか。
522デフォルトの名無しさん:2008/03/04(火) 04:03:30
以下のコードを実行すると、FileLoadException が発生します。
コード (抜粋):
static void Main(string[] args) {
 var source =
@"using System;
public class Test {
 public static void Main() {
  Console.WriteLine(Console.ReadLine());
 }
}";
 var result = CodeDomProvider.CreateProvider("cs").CompileAssemblyFromSource(
  new CompilerParameters() {
   GenerateExecutable = true,
   GenerateInMemory = true,
  }, source);
 var domain = AppDomain.CreateDomain("test");
 domain.Load(result.CompiledAssembly.GetName());
}
例外:
ファイルまたはアセンブリ 'System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'、
またはその依存関係の 1 つが読み込めませんでした。見つかったアセンブリのマニフェスト定義はアセンブリ
参照に一致しません。 (HRESULT からの例外: 0x80131040)

GenerateInMemory を false にして OutputAssembly を与えてやるとうまく動作するようなの
ですが、メモリ内で生成した上で動作させるためにはどうすればよいのでしょうか。
どなたかご教示いただけませんでしょうか。よろしくお願いいたします。
523デフォルトの名無しさん:2008/03/04(火) 06:12:47
PictureBox自体を回転させる方法は無いでしょうか?
もしくはPictureBoxに書いた画像を回転させる方法は無いでしょうか?
Graphics g = pictureBox1.CreateGraphics();
g.DrawPie(mypen, 20, 20, 400, 400, 0, 18);
pictureBox1.Image.RotateFlip(RotateFlipType.RotateNoneFlipY);
としたのですが、出来ませんでした。
524デフォルトの名無しさん:2008/03/04(火) 06:57:56
CodeDomに参照アセンブリを設定してやる必要があるんじゃなかったかな
525デフォルトの名無しさん:2008/03/04(火) 07:46:40
最初からRotateさせてPieかいたら?
526デフォルトの名無しさん:2008/03/04(火) 08:33:19
>>522
最初から新しいドメイン内でコンパイル
527デフォルトの名無しさん:2008/03/04(火) 08:35:01
だいたいdomain.Loadはあまりやらない方がいいぞ。
528デフォルトの名無しさん:2008/03/04(火) 11:29:46
>>523
DrawPieの前にg.RotateTransform
529デフォルトの名無しさん:2008/03/04(火) 11:33:26
>>523
pictureBox1.CreateGraphics()で取得したGraphicsに描画しても
pictureBox1.Imageの方はなんら変わらないから、どちらか一方に統一しろ

Image使うならpictureBox1.ImageからGraphics作ってそっちに描画
俺はよくバッファ代わりに使ってる
530デフォルトの名無しさん:2008/03/04(火) 11:41:50
メソッド内でNewしたコンボボックスにDataSource設定してもItems.Countが更新されないみたいなんだけどそういうもん?
531デフォルトの名無しさん:2008/03/04(火) 11:45:31
なんのことやら
532デフォルトの名無しさん:2008/03/04(火) 13:36:26
こんな感じ

private void Form1_Load(object sender, EventArgs e)
{
  DataTable dt = new DataTable();
  dt.Columns.Add("Key", typeof(int));
  dt.Columns.Add("Value", typeof(string));

  DataRow r = dt.NewRow();
  dt.Rows.Add(new object[] { 1, "h" });
  dt.Rows.Add(new object[] { 2, "o" });
  dt.Rows.Add(new object[] { 3, "g" });
  dt.Rows.Add(new object[] { 4, "e" });

  //画面に張り付いてるオブジェクト
  comboBox1.DataSource = dt;
  comboBox1.ValueMember = "Key";
  comboBox1.DisplayMember = "Value";
  MessageBox.Show(comboBox1.Items.Count.ToString());

  //メソッド内で宣言したオブジェクト
  ComboBox zzz = new ComboBox();
  zzz.DataSource = dt;
  zzz.ValueMember = "Key";
  zzz.DisplayMember = "Value";
  MessageBox.Show(zzz.Items.Count.ToString());
}
533デフォルトの名無しさん:2008/03/04(火) 14:01:32
Itemsに反映されるのはハンドルが作られてから。
534デフォルトの名無しさん:2008/03/04(火) 15:29:37
Debug.Print(zzz.Handle.ToString());
でハンドル作って?みたけどやっぱりCountは0のままっぽい

やり方が間違ってるのかな・・・orz
535デフォルトの名無しさん:2008/03/04(火) 15:54:16
ウィンドウハンドルだろjk

というか一旦ウィンドウが表示されてからメッセージボックスで出力すればいいんでないか?
536デフォルトの名無しさん:2008/03/04(火) 20:22:03
Handleプロパティにアクセスすると作成されたと思うけど。

RefreshItems();でもしてみれば?
537デフォルトの名無しさん:2008/03/04(火) 22:38:25
長いパスを扱うときのファイル名の頭に\\?\を付けると例外が起きます。
そのまま長いパスをFileStreamとかに渡しても駄目です。
.NETだけだと長いパスは扱えなかったりします?
538デフォルトの名無しさん:2008/03/04(火) 22:45:54
逆に.NET以外だと扱えたりします?
んなことないと思うけど。
539デフォルトの名無しさん:2008/03/04(火) 22:58:07
前に掲示板で見かけたような気がするが見つけられん。
まあ結論として.NETじゃ扱えない、だったはず。
やりたいならCreateFileでハンドル取ってきて、かね。
540デフォルトの名無しさん:2008/03/04(火) 23:42:22
datagridの列幅ではまって早二日・・・・
検索してもうまい解決方法がみつからない、誰か教えてくれ
やりたいのは、csvを読んでdatagridに表示すること。
ttp://www.ailight.jp/Grid_CSV.aspx
ここで紹介されているコードを参考にして、csvファイルをdatagridに読み込ませたのだが、
列幅が設定できない。
各所で紹介・解説されている列幅設定だと、tablestyleを設定して云々とあるが、俺にはそこらへんの処理の仕組みがさっぱりわからない。
上に引用したコードを元に、うまいこと列幅を任意の長さに設定する方法ないかな?
541デフォルトの名無しさん:2008/03/04(火) 23:45:25
DataGridTableStyle でぐぐれ
542デフォルトの名無しさん:2008/03/04(火) 23:49:30
>>541
既に昨日ぐぐった。でもわからん。
各所で解説されている列幅設定のコードを参考にしてdatagridに一回読ませるのはできるが、
その後に別のcsvをdatagridに読ませようとすると、
追加情報 : このデータ グリッドのテーブル スタイル コレクションには 既に同じマップ名のテーブル スタイルが含まれています。
ってエラーでストップする。
543デフォルトの名無しさん:2008/03/05(水) 00:00:40
エラーメッセージ見れば一目瞭然だと思うんだが…
以前のDataGridTableStyleをDataGrid.TableStylesからRemoveするなり
追加済みDataGridTableStyleを直接いじるなり
テーブル名変えるなり
544デフォルトの名無しさん:2008/03/05(水) 00:03:04
ぐぐったのにここ見てないのん?
http://dobon.net/vb/dotnet/datagrid/columnwidth.html
545デフォルトの名無しさん:2008/03/05(水) 00:06:01
>>543
removeか、そんなのがあるのか、しらんかった。試してみる。
>>544
そこは一番最初に見た、理解できんかった。
とりあえずボタンを押すとそこに書いてあるコードを実行するform作ってビルドしたら、
一回目のボタンは正常に動くけど、2回目で追加情報〜含まれていますで止まるんだよね。

removeか・・・なんか行けそうな予感がしてきた。
明日やってみる。
546デフォルトの名無しさん:2008/03/05(水) 00:16:30
>539
やっぱそうですか。無理そうな気はしてました。
なぜかIISから上がるASP.NETのプロセスが\\?\が付いたパスで実行されてることがあるので気になったので。
\\?\から始まるパスでexeを叩いてアプリを起動するとApplication.StartupPathなんかが例外しか返らなくなる。
そうなると他にも危ないプロパティやメソッドが出てきてそれなら正しく扱う手段が知りたくて。本当に深いパスを扱うことはあんまり無いです。
パスっぽい文字列が出てきたら\\?\で始まってたら削る不毛な処理をひたすら入れておきます。

Application.StartupPathみたいに即座に例外が返るものはちょっとどうしようもないので、
.NETのクラスライブラリ内のメソッドとかで危ないものは
自分用にObsolete付けて迂闊に使ったら警告を出せるようにする手段はないかなぁとか思う。
547デフォルトの名無しさん:2008/03/05(水) 10:47:58
FxCopのカスタムルールで検出させるとか?
548デフォルトの名無しさん:2008/03/05(水) 11:37:30
FxCop で vb だけで絞りこんで表示させることってできない?
ちなみに当方 FxCop 1.36 Beta 2。
549デフォルトの名無しさん:2008/03/05(水) 17:43:27
パターン指向リファクタリング入門 P359 「コンストラクタの連鎖」を C# で試してみました。
すると「this」で、「メソッド名が必要です」と怒られます。
C# でコンストラタの連鎖を問題なく行うにはどうしたらよいでしょうか?

class Loan
{
  public Loan(float notional, float outstanding, int rating, DateTime expiry)
  {
    this(new TeamROC(), notional, outstanding, rating, expiry, null);
  }

  public Loan(float notional, float outstanding, int rating, DateTime expiry, DateTime maturity)
  {
    this(new RevolvingTeamROC(), notional, outstanding, rating, expiry, maturity);
  }

  public Loan
    (CapitalStrategy strategy, float notional, float outstanding, int rating, DateTime expiry, DateTime maturity)
  {
    m_strategy = strategy;
    m_notional = notional;
    m_outstanding = outstanding;
    m_rating = rating;
    m_expiry = expiry;
    m_maturity = maturity;
  }
}
550デフォルトの名無しさん:2008/03/05(水) 17:51:39
public Loan(float notional, float outstanding, int rating, DateTime expiry)
 : this(new TeamROC(), notional, outstanding, rating, expiry, null)
{
}
551デフォルトの名無しさん:2008/03/05(水) 17:54:47
552デフォルトの名無しさん:2008/03/05(水) 22:54:31
javaかよ。
553デフォルトの名無しさん:2008/03/06(木) 20:16:50
Silverlight2Beta来たね
554デフォルトの名無しさん:2008/03/07(金) 14:53:00
struct A
{
 ...
}

A[] a = new A[10];

としたとき、a[3]のようにアクセスするときって、C++のメモリのようにa+sizeof(A)*3というようにCPUで乗算処理が発生しているんでしょうか?
だとしたら速度が必要なな部分では配列アクセスにするよりクラス参照のリストのようなかたちにしたほうがいいのでしょうか?
555デフォルトの名無しさん:2008/03/07(金) 15:10:33
ここで聞いていいのかどうか分かりませんが、

3次元が固定、2時限目が動的、1次元が固定の配列を
作るにはどうしたらいいのでしょうか?

float[][,] farray=new [14][,4];

とやってもうまくいきません。
掲示板では見にくいのですが、
4の前には「 ,」カンマが入っています。

556デフォルトの名無しさん:2008/03/07(金) 15:13:53
>>554
プログラミングガイドの配列のところにはこう書いてある。

>配列型は、抽象基本型 Array から派生した参照型です。
>この型は IEnumerable と IEnumerable<(Of <(T>)>) を実装するので、C# のすべての配列で foreach 反復処理を使用できます。

だから気にしていることに限ってはどっちにしても変わらない。
と予想してみる。
557デフォルトの名無しさん:2008/03/07(金) 15:20:19
デリゲートに追加した匿名メソッドを指定して取り除く事って出来るかな?
558デフォルトの名無しさん:2008/03/07(金) 15:20:49
速さが必要ならそんなことよりもっとほかにやるべきことは沢山あるはずだし、
それをやり尽くした上で554のようなことまで気になるというのなら、
C#ではなく、アセンブリ言語とC++でどうにかすることを考えるべき段階。

故に
>>554
そんなこと気にするな。
559デフォルトの名無しさん:2008/03/07(金) 15:21:11
>>554
こういう文もあった。
>C# の配列はオブジェクトそのものであり、C や C++ の場合のように、単なるアドレス指定可能な連続メモリ領域ではありません。

>>555
次元に関係なく、要素を動的に変える配列は作れないよ。
List<>とかと組み合わせたりしないと。
560デフォルトの名無しさん:2008/03/07(金) 15:22:19
×次元に関係なく、要素を動的に変える配列は作れないよ。
○次元に関係なく、要素数を動的に変えられる配列は作れないよ。
561デフォルトの名無しさん:2008/03/07(金) 15:25:56
unsafeとfixedでCみたいな配列としても扱えるよ
562デフォルトの名無しさん:2008/03/07(金) 15:45:47
>>560
動的/静的は配列に対して使い方が難しいので可変長と言うべきだな
563デフォルトの名無しさん:2008/03/07(金) 16:19:34
こんな形で使うのは初めてなので聞いてみたのですが、
思ったより難しいのですね。
C++ならそこまで難しくないと思ったのですが。
564デフォルトの名無しさん:2008/03/07(金) 16:51:24
C++で可変長配列とか、泥沼だろ。
565デフォルトの名無しさん:2008/03/07(金) 16:58:28
float[] oned=new float[4];
oned[] twod;
twod[] threed=new float[14];

自分で考えてここまでやってのですがこれで正しく動作するか
わかりませんし処理効率がどうなるかは分かりません。
<vecto>とかboostみたいに上手いことできないでしょうか?
566デフォルトの名無しさん:2008/03/07(金) 17:04:58
>>565
おまいは自分で考えてここまで何をやってきたんだ
567デフォルトの名無しさん:2008/03/07(金) 17:15:16
めんどくさいので
float[][][] threed=new float[14][][];
だけで後は自動に任せることにしました。
ありがとうございました。
568デフォルトの名無しさん:2008/03/07(金) 18:19:46
と思ったのですが、Listのほうが用途に
合っていそうなので、そちらを使ってみることにします。
569デフォルトの名無しさん:2008/03/07(金) 19:29:55
先ずC#で何ができるか調べたほうがいい
570デフォルトの名無しさん:2008/03/07(金) 20:22:35
>>568
それは最初から「vector 相当のものはありますか?」と聞くべきだった。
571デフォルトの名無しさん:2008/03/07(金) 21:16:35
>570
すいませんでした<(_ _)>
572デフォルトの名無しさん:2008/03/08(土) 13:29:24
ありがとうございます!
573デフォルトの名無しさん:2008/03/08(土) 14:14:48
こうだくみこのおまんこにセロリいれたいな
みんなはなにいれたい?
574デフォルトの名無しさん:2008/03/08(土) 14:23:43
585 名前:デフォルトの名無しさん[sage] 投稿日:2008/03/08(土) 14:20:47
http://yutori.2ch.net/test/read.cgi/news4vip/1204952244/

   1 名前:以下、名無しにかわりましてVIPがお送りします。[] 投稿日:2008/03/08(土) 13:57:24.68 ID:oVsMTN3J0
     次世代言語”D言語”を使ってプログラミングをしてみよう!
     C++で挫折した君も、プログラミング初心者の君も今日からプログラマーだ!

     D言語入門 http://www.geocities.jp/tor_park/Dlang/d2.html
575デフォルトの名無しさん:2008/03/08(土) 14:28:28
コピペ君って馬鹿だな、まで読んだ。
576デフォルトの名無しさん:2008/03/08(土) 14:46:34
コピペ君って馬鹿だな、まで読んだ。
577デフォルトの名無しさん:2008/03/08(土) 14:49:07
>>575-576
コピペしか能のない低脳は消えろ
578デフォルトの名無しさん:2008/03/08(土) 14:52:32
Dってまだ生きてたんだ
C#があればいらないのにね
まったく、無駄なことしてるよな
579デフォルトの名無しさん:2008/03/08(土) 15:03:23
同感
早くバージョンが安定してVSに匹敵するIDEが出たら使ってやってもいいが
何年更新してるんだよ?
580デフォルトの名無しさん:2008/03/08(土) 15:05:06
まあVSのないC#なんか誰も使わないよな
ネイティブコードなんかよりはるかにそっちの方が重要
581デフォルトの名無しさん:2008/03/08(土) 15:27:34
>555です。
しつこいですがリストを使ってもうまくいかなかったので
こうしてみました。

ArrayList data = new ArrayList(14);
data.Add(new ArrayList());
((ArrayList)data[0]).Add(new ArrayList());
((ArrayList)((ArrayList)data[0])[0]).Add(new float[4]);
((ArrayList)((ArrayList)data[0])[0])[0] = 1;

MessageBox.Show(((ArrayList)((ArrayList)data[0])[0])[0].ToString());

後は変数を使ってネストすればいいだけだと思います。
こうすれば何とかなるようです。

しかし、コードが長いのでなんとか短くしたいです。
typedefもないし、usingを使ってもうまくいきませんでした。
ArrayList以外にいい方法があれば教えてください。、
また、もっとコードを短くする方法があれば聞きたいです。


582デフォルトの名無しさん:2008/03/08(土) 15:29:15
ジェネリックのList<float>を使え
583デフォルトの名無しさん:2008/03/08(土) 15:35:52
>>581
var farray = new[] {
 new List<float[]>{new[]{1f,2f}},
 new List<float[]>{new[]{3f},new[]{4f}}
};
584デフォルトの名無しさん:2008/03/08(土) 15:37:34
List<T>
585デフォルトの名無しさん:2008/03/08(土) 16:05:20
>583
くぐってみたのですがvarが使えません。
http://ufcpp.net/study/csharp/ap_ver3.html
ではC#3.0の機能と書いてあるので2005では使えないのかも?
586デフォルトの名無しさん:2008/03/08(土) 17:35:56
List<float[]>[] data = new List<float[]>[14];
for (int i = 0; i < data.Length; i++)
 data[i] = new List<float[]>(new float[][] { new float[4] });
C#2.0でもいけるはず
587デフォルトの名無しさん:2008/03/08(土) 17:41:43
List<float[]>[]とか設計間違ってるとしか思えんw
588デフォルトの名無しさん:2008/03/08(土) 18:02:55
数値計算ならアリ
業務アプリならナシ
589デフォルトの名無しさん:2008/03/08(土) 19:03:35
>586
ありがとうございます。
その通りのことがしたかったんです。
>587
確かに2次元だけ動的って見たことないので
こういう設計でいいのか自信がありません。
590デフォルトの名無しさん:2008/03/08(土) 20:54:24
>585
2005はだめ。型推論してくれるだけなのでまじめに全部型を書けばいいんだよ。
varってコンパイラが何とかしてコンパイル後は対応した型になってるだけだと思ってる。
2008で.NETFramework2.0をターゲットにしてても普通に使えてるし。
591デフォルトの名無しさん:2008/03/08(土) 21:10:07
>590
C#でメモリ管理にいきなりつまずき困っていたところ
助けていただいてありがとうございます。
またお世話になるかも知れませんのでその時は
またお願いします。


592デフォルトの名無しさん:2008/03/08(土) 21:33:25
>>589
計算なら仕方ない所だと思うぞ。
なんかいい形があるなら俺も知りたい。
593デフォルトの名無しさん:2008/03/08(土) 21:43:10
float[]のところはインデクサ付けたフィールド4つの型を定義して使うようにすれば
要素数が4のもの以外入れられなくできるしちょっと見通しも良くなるかな
パフォーマンスは劣るだろうけど
594デフォルトの名無しさん:2008/03/08(土) 22:20:28
>593
人に見せるならそう書くかも知れませんね。
個人でパフォーマンスをちょっと追求してみたかったので
実験で試そうと思いした。
595デフォルトの名無しさん:2008/03/08(土) 22:20:50
>594
思いました。
596デフォルトの名無しさん:2008/03/08(土) 22:32:57
実験で試そうと思いしたと思ったわけだな?
597デフォルトの名無しさん:2008/03/09(日) 12:31:04
ISOイメージファイルの中身をWinRARのように表示するプログラムを作りたいのですが、
中身のフォルダ構造を取得する方法がわかりません。
どのようにしたらフォルダ構造の表示を実現できるのでしょうか?
ご教示よろしくお願いします。
598デフォルトの名無しさん:2008/03/09(日) 12:46:41
iso9660の仕様を探して、それに従ってイメージファイルを解析
599デフォルトの名無しさん:2008/03/09(日) 13:04:14
>596
そう思いした^^
600デフォルトの名無しさん:2008/03/09(日) 13:21:53
>>598
やはり解析するしかありませんか・・・。
ありがとうございました。地道に解析することにします。
601デフォルトの名無しさん:2008/03/09(日) 13:26:21
>>597
souceforge.netとかで調べれば参考になるのもあるんじゃね?
http://sourceforge.net/projects/iso-creator-cs/
↑これなんかはISOイメージの解析じゃなくて、ファイル、フォルダからISOイメージを
つくるもんだけど、開発プラットフォームc#みたいだから、参考になるかもよ。

商用なら
http://www.componentsource.com/products/starburn-sdk/index.html
こういうコンポーネントもあるみたいだ。
602デフォルトの名無しさん:2008/03/09(日) 13:30:34
解析って、仕様どおりに読み込むだけじゃん。
603デフォルトの名無しさん:2008/03/09(日) 13:44:26
>>602

仕様に基づいて読み込むって、それを解析っていうんでねーの?
仕様を独自に解析するとはだれもいっていないと思うが。
604デフォルトの名無しさん:2008/03/09(日) 13:53:06
あまり滅茶苦茶な日本語の使い方するなよ。
605デフォルトの名無しさん:2008/03/09(日) 16:57:13
>仕様に基づいて読み込むって、それを解析っていうんでねーの?
言わないだろ普通
606デフォルトの名無しさん:2008/03/09(日) 17:01:22
解析ってのは仕様書等がない状況でデータやプログラムそのものを調べることを指すんじゃないのか?
607デフォルトの名無しさん:2008/03/09(日) 17:20:36
一定間隔でSS取って保存するキャプチャソフト作ってみたんですが
CPU使用率が99%になるのは無限ループのせいですか?
一応スリープ入れてるんですが
608デフォルトの名無しさん:2008/03/09(日) 17:34:42
一定間隔ならループじゃなくてタイマ使え
609デフォルトの名無しさん:2008/03/09(日) 18:29:40
タイマでもCPU99%になるのは、、
610デフォルトの名無しさん:2008/03/09(日) 18:31:00
何ミリ秒おきのタイマだ?
611デフォルトの名無しさん:2008/03/09(日) 18:31:07
設計が悪いだけだろ屑
612デフォルトの名無しさん:2008/03/09(日) 18:39:39
1000
613デフォルトの名無しさん:2008/03/09(日) 19:03:49
キャプチャとって保存する部分が糞すぎるんじゃね
タイマを10秒おきとか100秒おきでやってもCPU99%になる?
614デフォルトの名無しさん:2008/03/09(日) 19:07:59
10秒とか100秒ならなりません
615598:2008/03/09(日) 19:46:53
>>602-606
まさかこういう流れになるとは思わなかった
特に深い意味は無かった
>>597にはその方が伝わると思った
不用意に誤用したことを、今は反省している
616デフォルトの名無しさん:2008/03/09(日) 20:26:43
sleepの引数にミリ秒単位じゃなくて秒単位のつもりの値渡してるとか?
617デフォルトの名無しさん:2008/03/09(日) 20:28:56
普通にSSとって保存する部分が思いだけだろjk
618デフォルトの名無しさん:2008/03/09(日) 20:35:52
すごい勢いで何百枚もSS保存してそう。同じファイルに
619デフォルトの名無しさん:2008/03/09(日) 20:36:52
自己解決しました
あるアプリケーションのSSを撮ってたんですが
そのアプリに問題があったみたいで
メモ帳なんかのSSで試してみたら普通にほぼ消費なく出来ました
620デフォルトの名無しさん:2008/03/10(月) 01:20:45
>そのアプリに問題があったみたいで

いやいやいや
621デフォルトの名無しさん:2008/03/10(月) 01:59:46
そのアプリがメモリを消費してたってことだろ
622デフォルトの名無しさん:2008/03/10(月) 02:10:50
メモリを消費・・・?
623デフォルトの名無しさん:2008/03/10(月) 14:20:42
いえ、有るゲームのSS撮るプログラムなんですが
プロセスにアクセスしたらなんかCPUを無駄に使うプロテクトみたいなのが有るみたいです
624デフォルトの名無しさん:2008/03/10(月) 15:08:12
wwwwwwwwww
625デフォルトの名無しさん:2008/03/10(月) 15:09:59
草生やしてないで人語で喋れよ。
猿じゃあるまい
626デフォルトの名無しさん:2008/03/10(月) 21:54:41
そんなのねえよw
627デフォルトの名無しさん:2008/03/11(火) 01:33:40
猿は草を生やせないと思うんだ
628デフォルトの名無しさん:2008/03/11(火) 11:51:48
何wwwwをwwwwいwwwwまwwwwさwwwらwwwwwwww
2chに何を求めてるんだか
629デフォルトの名無しさん:2008/03/11(火) 12:12:58
ウキー
630デフォルトの名無しさん:2008/03/11(火) 14:46:45
戦時中の治安維持法みたいなものですね。
賛成派が多数で、この恐ろしい法案が、今まで成立していないのが奇跡の状態です。
法案に賛成しているのは、途中に登場する自民党執行部や古賀派、公明党全員、民主党ほぼ全員です。
自民党・民主党で反対を表明していない議員は、執行部のいいなりになると思われます。
反対しているのは、最後に出てくる自民党系「真の人権擁護を考える懇談会」「伝統と創造の会」調べたつもりですが、議員の現在の考えが、賛成か反対か間違っていたら修正する予定です。
自民党への意見メールフォームhttp://meyasu.jimin.or.jp/cgi-bin/jim...首相官邸メールフォームhttp://www.kantei.go.jp/jp/forms/doku...自民党人権問題等調査会の太田誠一会長宛先 FAX03-3508-3832(U R L :http://www.otaseiichi.jp
631デフォルトの名無しさん:2008/03/11(火) 14:58:43
ウキー
632デフォルトの名無しさん:2008/03/11(火) 14:59:05
ウキー
633デフォルトの名無しさん:2008/03/11(火) 14:59:47
アホかwwwww
634デフォルトの名無しさん:2008/03/12(水) 01:20:55
否!
635デフォルトの名無しさん:2008/03/12(水) 02:59:09
こんなんじあC%#のほうが言い悪いか抜きにして初心者用と相談室のスレ2個あるから発展はあるな。VBなんか終わってるかんじ。
みなで盛り上がろうぜって漢字がまたくない
636デフォルトの名無しさん:2008/03/12(水) 10:27:48
日本語でおk
637デフォルトの名無しさん:2008/03/12(水) 16:38:52
VIPでやれ
ニコ厨氏ね

使い古されたセリフだが、真実である。
638デフォルトの名無しさん:2008/03/13(木) 15:59:48
ふらっとがあればこのスレも不要だな
639デフォルトの名無しさん:2008/03/14(金) 09:54:08
コンボボックスに

見た目 値
01:a 1
02:b 2
03:c 3

と入っているときに、
値が2の時に、02:bを選択状態にするにはどうすればいいでしょうか?
FindStringで02を指定しても見つからず、combobox.itemsをforeachで
回しても、object型から何にキャストすればよいか分からずでした・・・
640デフォルトの名無しさん:2008/03/14(金) 09:59:18
Value とかじゃなかったっけ
641デフォルトの名無しさん:2008/03/14(金) 10:02:59
自分で値入れてるのに何にキャストしていいかわからないってどういうこと?
642639:2008/03/14(金) 10:08:04
コンボボックスへのデータバインドは、VSのウィザードでTableAdapter任せで作って
ロジック部分のデータ操作はコードで書いてました。

型はToStringを試してみて、DataGridViewが入ってるのは分かったんですが・・・
値が取れません><
643デフォルトの名無しさん:2008/03/14(金) 10:09:06
>>639
ヒント

enum testEnum { あああ = 1, ししし = 2, つつつ = 3 }

comboBox1.Items.Add(testEnum.あああ);
comboBox1.Items.Add(testEnum.ししし);
comboBox1.Items.Add(testEnum.つつつ);

任意の値に設定するとき
comboBox1.SelectedItem = (testEnum)2;
644デフォルトの名無しさん:2008/03/14(金) 10:12:03
>>642
デバッガでcomboBox1.Items[0].GetType()を見てみれば?
645デフォルトの名無しさん:2008/03/14(金) 10:13:17
SelectedValueに2を設定すればOK.
646デフォルトの名無しさん:2008/03/14(金) 10:28:39
>>645のやり方でいけました!ありがとうございます

>>643
enum型は一度も使ったことがないので勉強してみます

>>644
GetTypeでは取れませんでしたが、ToStringで取得してみたら
謎ですが>>639の型が入ってました
647デフォルトの名無しさん:2008/03/14(金) 22:58:30
ふらっと池
648デフォルトの名無しさん:2008/03/14(金) 23:51:25
そのうち、フラットで話すべき話題と、このすれですべき話題をテンプレにでも書いといたほうがいいのかもしれない
「ふらっと」
PictureBoxを透過表示することってできますか?
「このすれ」
ExpressionTree、CodeDOM、DLRのASTでできることはどういう風に違うんですか?
649デフォルトの名無しさん:2008/03/15(土) 17:21:46
内容よりC#わかってるかどうかだろ
650デフォルトの名無しさん:2008/03/15(土) 22:02:25
Java上がりでC#やってる人に聞きたいんだけど、
C#やってたら、コード読んで流れ掴むくらいならできそうでしょうか?
651デフォルトの名無しさん:2008/03/15(土) 22:06:10
意味が分からん
652デフォルトの名無しさん:2008/03/15(土) 22:11:50
余程の馬鹿でなければ
653デフォルトの名無しさん:2008/03/15(土) 22:17:30
C#3.0は結構化けるけど
654デフォルトの名無しさん:2008/03/15(土) 22:24:48
javaの文法知らなくても流れくらい分かるだろ
655デフォルトの名無しさん:2008/03/15(土) 22:51:50
C#2005のメニューから
プロジェクト->Windowsフォームの追加で
「MID親」
を選んで、MainでRunしています。
起動時に子フォームを勝手に起動しますがいったい
どこでやっているのでしょうか?
InitializeComponet()で勝手にShowNewFormを
やっているのだとは思いますがどのあたりなのか
さっぱり分かりません。
新しく追加で子フォームを作成したら自動でずらす処理も
邪魔なのでどこでやっているのか知りたいです。
ご存じの方、どうか教えてください。
新しく普通にフォームから作ったほうが早いというのは無しで。

656デフォルトの名無しさん:2008/03/15(土) 22:55:48
すいません、起動時に勝手に子フォームが起動するのは、
こちらのミスでした。
勝手にずらす処理をやめさせる方法だけ教えてもらえない
でしょうか?
657デフォルトの名無しさん:2008/03/15(土) 22:57:04
>>650
わからなければjava上がりとはいえない
658デフォルトの名無しさん:2008/03/15(土) 23:50:35
このスレの住人なら知っていますね、あの糞開発ツールのことを

・自分のプログラムのバグなのかコンパイラのバグなのかわからない
・他の仕事に応用できない糞開発ツールの独自世界を必死に学習している
・テキストエディタで書いたほうが効率的なのに糞UIツールを懸命に使っている

糞だけど、政治的な理由で無理やり使わされているんですよね
もういい加減、我慢するのはやめませんか?

・糞開発ツールを部下に押し付ける上司の命令は無視しましょう。
 上司は糞開発ツールが使われる実績を作ることであの会社のごきげんをとっているのです。
・あの糞開発ツール提供会社には「おたくの糞開発ツールは話にならない」と突き放しましょう。
 バグレポートなどしてはいけません。改善要求などもってのほかです。
 あの会社はあなたたちのことをテスター/モルモットとしか思っていません。
・あの会議で「糞開発ツールを使ったら生産性がxx%アップしました」
 なんて話が出たら力強く机を叩き、会議室を出ましょう。
 あの人たちは糞開発ツールをマンセーすることで立場を確保しているのです。

糞な開発ツールを糞だと言える、そんな当たり前の環境をみんなの力で取り戻しましょう。
659デフォルトの名無しさん:2008/03/15(土) 23:53:18
コピペ君って馬鹿だな、まで読んだ。
660デフォルトの名無しさん:2008/03/15(土) 23:54:53
>>659
死ね
661デフォルトの名無しさん:2008/03/16(日) 15:12:24
オーバーフローチェックコンテキスト(checked/unchecked)の状態で
処理を分岐させる方法を知ってる人いたら教えて

検証するタイミングはコンパイル時、実行時のどちらでもおk
662デフォルトの名無しさん:2008/03/16(日) 15:49:01
例外を捕捉すればいいんじゃないの
663デフォルトの名無しさん:2008/03/16(日) 15:59:05
それだと、例外が発生しない場合、checkedでオーバーフローがおきてないのか、
単にuncheckedなのか判断できなくね
664デフォルトの名無しさん:2008/03/16(日) 16:03:54
bool IsChecked {
  get {
    try {
      Convert.ToByte(0xffff);
      return false;
    }
    catch { return true; }
  }
}
馬鹿プロパティw
665デフォルトの名無しさん:2008/03/16(日) 16:06:32
わざとオーバーフローさせるぐらいしか思いつかんな。
666デフォルトの名無しさん:2008/03/16(日) 16:44:45
自分でchecked{}で括ってしまえばいい
667661:2008/03/16(日) 17:17:46
>>662-665
thx!
やはりオーバーフローさせてみるしかないのか

>>666
ILの生成をコンパイラ任せにするならそれでいいが
動的に生成しようとするとOPコード自体が違うので
668デフォルトの名無しさん:2008/03/16(日) 17:19:42
なんか適切じゃない場所で質問しちゃった気がするのでこっちでも

PerlとかRubyでゆーWWW::MechanizeみたいなスクレイパってC#に存在する?
それとDB使ったツールを作って配布したいんだけど、PerlとかRubyだと一般ユーザに使ってもらえないので…
Rubyで一旦全部書いたんだけどexerbとかrubyscript2exeとか使ってもうまく纏められないのでC#(or その他普通にネイティブコンパイルする言語)で書き直したいんだけど…
669デフォルトの名無しさん:2008/03/16(日) 17:20:41
泥臭いのに変わりはないが、適当な関数のIL覗けばいいんじゃね?
670661:2008/03/16(日) 18:22:19
IL見てみたが、コンパイラがコンパイル時に数値式のOPコードを切り替えてるだけで
checked/uncheckedブロック、演算子内に直接書いた式にのみ適用されるみたい

だから、>>664みたいなプロパティを作るとコンパイルされた時点で出力が確定してしまう

結論としては、checked/uncheckedはコンパイラに指示するためだけのもので
プログラムで利用しようなどと考えてはいけないということか
671デフォルトの名無しさん:2008/03/16(日) 18:36:31
そもそもchecked/uncheckedはコンパイル時に静的に決まるものだろ
672デフォルトの名無しさん:2008/03/16(日) 18:41:50
#if CHECKED
なんとか
#else
ができればいいんだろ
673デフォルトの名無しさん:2008/03/16(日) 19:22:05
コード中で分岐することに意味があるのはコンパイラのオプションで指定した場合のみってことか
checkedのときはプリプロセッサシンボル定義するだけでよくね?
674デフォルトの名無しさん:2008/03/16(日) 19:30:23
プリプロセッサとchecked/uncheckedの処理段階が違うのは気持ちが悪いけどな
675デフォルトの名無しさん:2008/03/16(日) 19:38:38
印刷を監視して、何かのプログラムで印刷実行されたらジョブをプリンタに投げる前に
自分で作った処理を行って、それが終了してから
印刷ジョブを投げるプログラム作成したいんですけど
印刷監視とジョブ投げるのにwaitかけるのってどうすればいいんですか?
676デフォルトの名無しさん:2008/03/16(日) 19:50:03
仮想プリンタを作って間に挟むのが
まっとうじゃないかな。
677デフォルトの名無しさん:2008/03/16(日) 21:07:31
iPhoneのタイマーみたいな慣性で回るドラムを2個まわして
数値を出力させるにはどう考えたらいい?
WM6pro用で教えてください。
678デフォルトの名無しさん:2008/03/16(日) 21:14:32
そういう風に作る
WM6proがどう関係あるんだろう
679デフォルトの名無しさん:2008/03/16(日) 22:25:05
WebBrowserコントロールの設定は、現在のIEと同じ設定になるっぽいけど、
独立して管理することは可能っすか?
680デフォルトの名無しさん:2008/03/16(日) 22:42:17
俺なら可能
681デフォルトの名無しさん:2008/03/16(日) 23:53:49
オマイラってそんなにIL覗いて挙動確認したりしてんの?
俺全然やってないんだが
682デフォルトの名無しさん:2008/03/17(月) 00:00:00
ILの日本語の資料ってネットで見れるの?
683デフォルトの名無しさん:2008/03/17(月) 00:03:01
別に日本語である必要性はないと思うのだが
684デフォルトの名無しさん:2008/03/17(月) 00:04:53
必要性はなくても、日本語の方が望ましい
685デフォルトの名無しさん:2008/03/17(月) 00:08:58
共通言語基盤の規格はJISにもなってるからネットで読めるんじゃね?
調べたことないけど
686デフォルトの名無しさん:2008/03/17(月) 00:48:03
IL見るのになぜ日本語が必要になるのやら
687デフォルトの名無しさん:2008/03/17(月) 00:51:31
日本語を主として使っている民族とっては、ILの説明が日本語でされていた方が他の言語でされているよりも理解しやすいから。
688デフォルトの名無しさん:2008/03/17(月) 01:07:51
ILは流れを読むのだから英語でいいでしょう
689デフォルトの名無しさん:2008/03/17(月) 01:10:03
個々のILのニーモニックの説明は英語より日本語の方が日本人には理解しやすいだろう。
690デフォルトの名無しさん:2008/03/17(月) 01:11:58
ニーモニック(記憶しやすい)を記憶しやすいのは
その命名元となった英語という気もする。
691デフォルトの名無しさん:2008/03/17(月) 01:13:57
記憶する以前に理解するには、日本人にとっては英語よりも日本語の方が理解しやすい。
692デフォルトの名無しさん:2008/03/17(月) 01:21:11
何この流れ・・・
693デフォルトの名無しさん:2008/03/17(月) 07:03:19
ニーモニックの説明で日本語お望みなら

System.Reflection.Emit.OpCodes

あたりでもどうぞ。JIS の CLI は有料でしょ確か
694デフォルトの名無しさん:2008/03/17(月) 09:16:46
JIS規格はjiscのサイトでみれる
695デフォルトの名無しさん:2008/03/17(月) 09:55:46
そいや、ILはVSで対応してないのはいいにしてもMSBuildのタスクも
ないのはどうよと思ったなあ前
696デフォルトの名無しさん:2008/03/17(月) 22:34:40
>>683
英語読めないから、日本語のが必要なんです。
697デフォルトの名無しさん:2008/03/17(月) 23:26:25
ふらっとでレスが付かなかったので、教えてください。
SQLServerからsmallint型のレコードを取得してC#でint型の変数に入れたいのですが
キャストで失敗します。smallint型はshortと同じじゃないのでしょうか?
698デフォルトの名無しさん:2008/03/17(月) 23:32:14
>>697
失敗って?
699デフォルトの名無しさん:2008/03/17(月) 23:33:41
実際shortなんだったら一旦shortにキャストしてからintにキャスト
700デフォルトの名無しさん:2008/03/17(月) 23:42:39
会社にしか環境が無いので、エラーの詳細記録してなかったのですが、
型変換できませんでした。的なエラーでした。
もちろん(short)してから(int)でいけますが、アップキャストでなぜ失敗するのか・・・が知りたいと思いました
701デフォルトの名無しさん:2008/03/17(月) 23:46:30
正確な方は SqlInt16、
short へのキャスト演算子の定義はあるけど、int へのキャストは定義されてない

とかではなかろうか。
702697:2008/03/18(火) 00:02:58
>>701
MSDN参照してもよく分からないのですが、おそらくそのように思えますので、
そういうものだと、納得しておきますf^^
703デフォルトの名無しさん:2008/03/18(火) 00:03:27
PrintDocumentクラスのPrintメソッドで
印刷処理を作っています。

しかし、印刷を実行するとVB6やDelphiで作成した
印刷処理よりも異常に遅いのが気になりました。
描画を一切行わず、白紙を1ページ印刷した場合
VB6では一瞬で印刷を開始しますが、C#では5秒以上待たされます。

100ページ以上の印刷を行いたいので、この速度では
ちょっと使い物にならないので困っております。
速度改善の情報ありましたら教えていただけませんでしょうか。。
704デフォルトの名無しさん:2008/03/18(火) 00:19:22
705デフォルトの名無しさん:2008/03/18(火) 00:21:39
突然怪しいURLを貼るなwww
706デフォルトの名無しさん:2008/03/18(火) 00:23:13
なんじゃこりゃww量すごすぎww
707デフォルトの名無しさん:2008/03/18(火) 00:38:25
>>703
軽く調べたけど、解決策は見つからなかった。そもそも再現性が(ry
とりあえずプロファイルして何が遅いか見極めてくれ。
708703:2008/03/18(火) 00:46:13
>>707
ありがとうございます。

プロファイルのやり方がわからないのですが
調べてやってみようと思います。

今、調べられる範囲でわかったことは
プリンタの解像度を下げることである程度
体感速度が速くなる、逆に解像度を上げるとさらに遅くなることです。
709デフォルトの名無しさん:2008/03/19(水) 00:10:00
ちょっとすみません。mlang.idl を midl しようとしたんですが、途中で

midl\oleaut32.dll : error MIDL2020 : error generating type library : SaveAllChanges Failed : .\mlang.tlb (0x80070005)

と出て終了します。原因わかるかたいらっしゃいますか?
710デフォルトの名無しさん:2008/03/19(水) 00:19:45
しまった UAC だー! 自己解決すみませぬ。
711デフォルトの名無しさん:2008/03/19(水) 01:17:43
すみません。続けてもうひとつ。マーシャリングの質問なのですが、

void DetectInputCodepage(
    uint dwFlag,
    uint dwPrefWinCodePage,
    ref sbyte pSrcStr, // ここと
    ref int pcSrcSize,
    ref tagDetectEncodingInfo lpEncoding, // ここに
    ref int pnScores
);

どうやって short[] と tagDetectEncodingInfo[] を突っ込んだらいいのか、だれか教えてください。
712デフォルトの名無しさん:2008/03/19(水) 01:47:07
713デフォルトの名無しさん:2008/03/19(水) 01:50:00
>>712
それそのままコピペしてるんだけどね、

ref sbyts[0]

ここで引っかかる。
714デフォルトの名無しさん:2008/03/19(水) 01:55:05
ん? 通った。なぜだ。
715デフォルトの名無しさん:2008/03/19(水) 09:14:07
配列そのまま仮引数に定義するのお勧め
716デフォルトの名無しさん:2008/03/24(月) 19:08:03
ListやStackの中身をusingでdisposeさせるにはどうすればいいの?
717デフォルトの名無しさん:2008/03/24(月) 19:14:20
継承してIDisposeableを実装すればいいんじゃねえの
718デフォルトの名無しさん:2008/03/24(月) 19:14:45
ListとIDisposableを継承して、Disposeで要素を全部Disposeするクラスを作る。
719デフォルトの名無しさん:2008/03/24(月) 20:23:08
using使いたいだけならIEnumerable<T> (where T : IDisposable) をラップするクラスを作って
using (DisposableCollection<Bitmap> a = new DisposableCollection<Bitmap>(list))とか
720デフォルトの名無しさん:2008/03/24(月) 20:53:15
static void Using<T>(T collection, Action<T> action) where T : IEnumerable {
 try { action(collection); }
 finally {
  foreach (var item in collection) {
   IDisposable disposable = item as IDisposable;
   if (disposable != null) { disposable.Dispose(); } } } }
usingの代わりにこんなの使えばいいんじゃね
721デフォルトの名無しさん:2008/03/24(月) 21:01:24
どうもやってみます。
722デフォルトの名無しさん:2008/03/24(月) 21:03:46
.net 3.5(たぶん下位でも発生?)

コンソールアプリで sysem.drawing.bitmap をストリームにシリアライズするときに
GDI+の一般エラー(General error?)が発生する

同様の現象にブチあたった経験者はおらぬか?
723デフォルトの名無しさん:2008/03/24(月) 21:20:30
Bitmapはネイティブなオブジェクトがあるからシリアライズ不可能じゃないかな
724デフォルトの名無しさん:2008/03/24(月) 21:31:09
いや,これまでは出来たんだ
きっとこれからも出来ると信じたい

そしてなんとなく原因発見

BinaryFormatter bf = new BinaryFormatter();
FileStream fs = new FileStream(@"C:\WINDOWS\迴育栖繧ォ繝?繝?.bmp", FileMode.Open);
MemoryStream ms1 = new MemoryStream(), ms2 = new MemoryStream();
Image img = Image.FromStream(fs);
bf.Serialize(ms1, img); // 成功(例外なし)
fs.Close();
bf.Serialize(ms2, img); // 失敗(ExternalError: GDI+ で汎用エラーが発生しました。)

どうもImageの元のリソースが,シリアライズするときに利用できなくなっていると失敗するみたい?
なんか非常にモヤっとするなぁ

引き続き情報求む
725デフォルトの名無しさん:2008/03/24(月) 21:53:52
よくみる where T ってのはLINQってやつかい?
726デフォルトの名無しさん:2008/03/24(月) 21:55:52
ただのジェネリック引数の制約だよ。
727デフォルトの名無しさん:2008/03/24(月) 22:10:38
where T つかうと他クラスの継承できなくなる?方法ない?
728デフォルトの名無しさん:2008/03/24(月) 22:13:52
なにゆってんの?
729デフォルトの名無しさん:2008/03/24(月) 22:14:30
よく意味が分からんけど
where T はTに対して特定の型に依存した操作を可能にするために使うんだよ
730デフォルトの名無しさん:2008/03/24(月) 22:20:58
where Tを使ったクラスを継承したいなら
その制約を継承先のクラスにも付ける

class Base<T> where T : string{}

class Derived<T> : Base<T> where T : string{}
731デフォルトの名無しさん:2008/03/24(月) 22:42:02
まったくどうでもいいがstringで制約したらもはやジェネリックの意味なくね?
732デフォルトの名無しさん:2008/03/24(月) 22:45:08
>>724
Bitmapはそのままだとアンマネージドリソースを含むのでシリアライズできない
だがStreamから作ったBitmapならそれを使ってシリアライズすることで目的を達成できる
しかしそのStreamが閉じてればもうシリアライズできない
733デフォルトの名無しさん:2008/03/24(月) 23:27:28
>>724
var stream = new FileStream("foo.jpg", FileMode.Open);
var image = Image.FromStream(stream);
image.Save("bar1.png");
stream.Close();
image.Save("bar2.png"); // die
734デフォルトの名無しさん:2008/03/24(月) 23:55:28
>>732
すごく,わかりました.

>>733
試したためした,そしてその通り

ひとまずbyte[]にシリアル化したものを記憶しておくことにした
735デフォルトの名無しさん:2008/03/25(火) 18:09:24
クラスのメンバ関数のようなスコープがはっきりしないものをusingで解放するにはどうすればいいの?
736デフォルトの名無しさん:2008/03/25(火) 19:21:54
メンバ関数じゃなくてインスタンス変数だと仮定して
自分のクラスにIDisposableを実装する
usingはそのクラスを外から使う人が使うもの
737デフォルトの名無しさん:2008/03/25(火) 22:29:23
DictionaryBaseのGeneric版って何?
738デフォルトの名無しさん:2008/03/25(火) 22:42:14
例外は受け取ったらいけないの?
739デフォルトの名無しさん:2008/03/25(火) 23:05:44
処理できる例外は捕まえて処理する
そうでなければスルー
740デフォルトの名無しさん:2008/03/25(火) 23:11:34
受け取ってメッセージボックス出して終わるくらいなら
標準の例外ダイアログがましだけどねw
741デフォルトの名無しさん:2008/03/25(火) 23:25:01
製品にするならそうもいってられないけどな
742デフォルトの名無しさん:2008/03/26(水) 12:08:44
>>737
無い
KeyedDictionary<TKey, TValue>が使えそうなら使う
使えないなら自分で作る
743デフォルトの名無しさん:2008/03/26(水) 12:11:35
KeyedCollection<TKey, TItem>の間違い
744デフォルトの名無しさん:2008/03/26(水) 19:25:07
ListViewの詳細表示で、棒グラフを表示したくて
直接セルに描画していたんですけど、汎用性を持たせたくて
Panelに描画してそのPanelを表示したいと思ったんですが
ListViewにPanelを挿入する方法が分かりません

SubItems.Addで追加できるのは文字列だけですし
どのようにすればPanelなどのコントロールをListViewに
挿入することができるでしょうか?
745デフォルトの名無しさん:2008/03/26(水) 19:33:28
どのようにしてもできまへん。

っていうか、Panelに描画する(そしてそれをListViewに突っ込む)のが
汎用的って発想がよくわからない。

汎用的にしたいのならListViewの項目を描画する機能をクラス化するか、
またはListView自体を継承して拡張するとか、そっちの方向じゃないの?
746デフォルトの名無しさん:2008/03/26(水) 19:37:34
CodeProjectにそういうのある。
一からListView作ってた。
747デフォルトの名無しさん:2008/03/26(水) 19:44:33
C#のListViewの使えなさはガチ

Swingにも劣るヘボさだからなぁ
項目ごとの文字色を変える程度のことさえ面倒
いったいどういう用途を想定してこんなクソ仕様にしたのか
748デフォルトの名無しさん:2008/03/26(水) 20:15:08
コモンコントロールそのものだもの
749デフォルトの名無しさん:2008/03/26(水) 20:35:18
WPFのListViewは何でもありのアホみたいに柔軟なコントロールになってるよ
750デフォルトの名無しさん:2008/03/26(水) 20:58:42
>>745
やっぱり駄目ですか
でもよく見かけるプログレスバーが表示されたListViewは
どうやって実装してるんでしょう
何か出来る方法がありそうな気もしますが

>>746
一から作るのはちょっと厳しいですね・・・
751デフォルトの名無しさん:2008/03/26(水) 21:41:09
>>742
ありがとう。
自作するよ。
752デフォルトの名無しさん:2008/03/27(木) 00:26:31
>>747
>項目ごとの文字色を変える程度のことさえ面倒

簡単だと思うけど…
どうやってやってるの?
753デフォルトの名無しさん:2008/03/27(木) 06:57:31
>>750
ListViewだとしたらOwnerDrawなんじゃない。

超汎用的なリストコントロール作った。
めんどくさかった(´・ω・`)

でもこれで10万行ぐらいあっても、どんな描画だとしても表示できるようになったお。
754デフォルトの名無しさん:2008/03/27(木) 07:23:43
俺も752と同意見だったけど、MFC知らないからMFCだともっと楽なのかなあと思って何も言わなかった
ListViewItem.UseItemStyleForSubItems
ListViewItem.ForeColor
ListViewItem.SubItems[index].ForeColor

UseItemStyleForSubItems
をtrueにすると、
全てのSubItems.ForeColorを設定する必要があったような気がするから
それが面倒といえば面倒だったけど。
755デフォルトの名無しさん:2008/03/27(木) 07:59:46
C#でSafariみたいにきれいに文字を表示するのってどうしたらいいんだしょ。
アンチエイリアスかければきれいになるとですか?
756デフォルトの名無しさん:2008/03/27(木) 08:10:04
言語とは無関係だと思うけど
WPF使えば良いよ
757デフォルトの名無しさん:2008/03/27(木) 08:13:08
Formでお願いします。
758デフォルトの名無しさん:2008/03/27(木) 08:22:42
>>752
でもListViewって特定環境で色が消えたりする類のバグが満載だから
そのままでは使い物にならないと思った記憶がある。
759デフォルトの名無しさん:2008/03/27(木) 14:35:43
そもそもWPFだろうがFormだろうがクラス名だけ置換して同じコード書けば
内部で使うAPIだけひっそり入れ替わるのがクラスライブラリ設計として当然じゃないのか?
何回も作っては捨て繰り返して作った奴は馬鹿なのか?
760デフォルトの名無しさん:2008/03/27(木) 14:48:59
>>755
フォントをClearTypeが効くものに変えるとか
実際より大きく描画して縮小するとか
761デフォルトの名無しさん:2008/03/27(木) 18:58:44
>>759
日本語書けよ
762デフォルトの名無しさん:2008/03/27(木) 19:04:10
すごーく正論では
763デフォルトの名無しさん:2008/03/27(木) 19:06:23
再利用可能なコードなんか幻想だろw
764デフォルトの名無しさん:2008/03/27(木) 19:50:12
インターフェースがクソだったら書き直すしかないだろ
765デフォルトの名無しさん:2008/03/27(木) 19:52:31
VB SQL
ODBC Direct
OLE DB
DAO
RDO
ADO
ADO+
WindowsDNA
MSDE
ADO.NET 1.0
ADO.NET 1.1
ADO.NET 2.0
LINQ
766デフォルトの名無しさん:2008/03/27(木) 21:16:28
>>750
リストビューの子としてプログレスバー作るとか。
767デフォルトの名無しさん:2008/03/27(木) 23:54:29
英語だと C sharp って読むの?
768デフォルトの名無しさん:2008/03/28(金) 00:32:18
yes
769デフォルトの名無しさん:2008/03/28(金) 14:20:32
>>761
てきざいてきしょ
770デフォルトの名無しさん:2008/03/29(土) 00:20:51
VS9.0インスコした人に確認してもらいたい
↓のファイルのコメントが前衛的なことになってるんだけど、どうなってる?

C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\
ProjectTemplatesCache\CSharp\Reporting\1041\ReportApplication.zip\Form1.Designer.cs

因みに、手元の環境のエディションはPro.
771デフォルトの名無しさん:2008/03/29(土) 00:29:51
見たけど特に何も思わなかったが
772デフォルトの名無しさん:2008/03/29(土) 01:13:30
特にどうということもないな
773デフォルトの名無しさん:2008/03/29(土) 01:14:35
そんなばすはないだろう。
774デフォルトの名無しさん:2008/03/31(月) 20:28:55
ローカルのハードディスクにあるファイルをUSBメモリにコピーしておのおののファイルについてGetLastWriteTimeを見ると2秒ほどずれてるんですが、なぜなんでしょう?
エクスプローラでファイルのプロパティで更新日時を見てもやはり2秒ほどずれています。おそらく同じ値を見ていると思います。
ローカルからローカルにコピーした場合は発生しません。
775デフォルトの名無しさん:2008/03/31(月) 20:30:58
NTFSとFATとかじゃね
776デフォルトの名無しさん:2008/03/31(月) 20:33:34
USBメモリで使ってるFATって更新時間の最小単位が2秒なんだったっけ?
777デフォルトの名無しさん:2008/03/31(月) 20:37:21
そう。2秒。
778774:2008/03/31(月) 20:47:38
ローカルはNTFS、USBはFAT32ですが、上に上がってるのでビンゴくさそうすかね・・・
779デフォルトの名無しさん:2008/04/02(水) 11:29:09
自分で OnPaint メソッドをオーバーライドしたコントロールを作ってるのですが、質問です。
OnPaint メソッドの中で線の太さを指定して引いているのですが、AutoScaleMode でサイズが変わった場合
線の太さはどういう風に決めたら良いと思いますか?
今は決め打ちで 2 にしていますが、線の太さも自動でスケーリングしたいのので
自動スケーリングの倍率を取得する AutoScaleSize みたいなプロパティってないですかね。
780デフォルトの名無しさん:2008/04/02(水) 11:42:13
>>779
自己レス。解決しました。
AutoScaleMode プロパティが変更されると、ScaleControl メソッドが呼ばれる。
ScaleControl メソッドをオーバーライドすると factor が来るので、これが倍率。
781デフォルトの名無しさん:2008/04/03(木) 20:10:38
共有メモリの話題になりますが、
MapViewOfFileで得たIntPtrをStreamにアダプトする方法はありませんか?
byte*にキャストしてよいみたいですが、そこからが分かりません。
782デフォルトの名無しさん:2008/04/03(木) 20:22:47
UnmanagedMemoryStream
783デフォルトの名無しさん:2008/04/03(木) 21:09:24
>>782
これは、これ以外にないといえるようなStreamですね。
明日さっそく試したいと思います。ありがとうございました。
784デフォルトの名無しさん:2008/04/04(金) 10:08:31
質問です。

各テーブルごとにテーブルクラスを作成し、

データの受け渡し受け取りには、テーブルクラス.レコードを定義して使用しています。


各テーブルクラスの違いは、

レコードクラスの違いくらいなので、
(実際には、レコードクラスの違いにより処理内部にも違いは出ているのですが、
ロジックは同じということです。)

同じ処理を書いて、あまりステップ数を膨らませるのは嫌なのですが、

何かよい方法はないでしょうか?
785デフォルトの名無しさん:2008/04/04(金) 10:25:03
データセットデザイナを使う
786デフォルトの名無しさん:2008/04/04(金) 22:10:30
>>770
自分の所も正常に見えます
787デフォルトの名無しさん:2008/04/04(金) 23:30:46
>>784
日本語でおk
788デフォルトの名無しさん:2008/04/06(日) 21:30:19
DB関連のクラス分けについてなんですけど

namespace foo.bar.Data.Modelに
AccountModelなど
テーブル・ビューの1レコードを表すクラスを定義して

namespace foo.bar.Dataに
AccountAccessorなど
テーブル・ビューごとにSelectやUpdateを行うクラスを定義して

namespace foo.bar.Accountに
Accountなど
ビジネスロジックとしての役割のクラスを定義して
この中からAccountAccessorを使用してModelオブジェクトを
取得したり登録したりしています。

このビジネスロジックが「データベースについて知っていなければならない」という
のが違和感があったりしてます。
みなさんなら中間に別の役割のクラスを作ったりしていますか?
と、ここまでかいてC#の質問じゃないことに気付いた・・・よかったら教えてください。
789デフォルトの名無しさん:2008/04/08(火) 06:02:24
railsを発端にして、最近はModelにfindXXXX()とか作って中でDBアクセスがスマートかも。
結局ほとんどの場合Modelとテーブルは一対一だからね。
790デフォルトの名無しさん:2008/04/08(火) 14:25:19
すみません、質問させてください。
C#(3.5)でWindows Mobile向けアプリを作成していて、リフレクションで
自作したクラスのインスタンスを生成しようとしています。
Type.GetType(クラス名)でクラスを取得しようとしたらnullが戻るので、
AppDomain.CurrentDomain.GetAssemblies()で取得したアセンブリから
GetTypeでクラスを取得しようとしたら、.NET Compact Frameworkには
GetAssemblies()がありませんでした。
.NET Compact Frameworkでリフレクションを使って自作クラスをリフレクションで
生成するにはどのようなコードを書いたら良いのでしょうか?
791デフォルトの名無しさん:2008/04/08(火) 14:36:28
GetAssemblies使えるってことはLoad済みなんだろ?
Load時にAssemblyオブジェクトが手に入ってるじゃん。
792790:2008/04/08(火) 17:20:07
>GetAssemblies使えるってことはLoad済みなんだろ?
AppDomain#GetAssemlies()メソッド自体が存在しないんで使えないんですが
(何か勘違いしてたらすみません)、Assemby#Loadで直接アセンブリを
ロードして、そこからGetTypeでクラスを取得するようにしたらうまく行きました。
JavaのClass#forNameみたいにクラスパス全部からクラスを引っ張ってきて
くれる訳じゃないんで難しいですね・・・
793げげ:2008/04/11(金) 18:11:02
皆さんの状況を教えてください。

VS2005 C# を Virtual PC 2007 上の WindowXP
で動かしています。

float f = 426;
int d = (int)f / 63;

以下のコードを実行すると、d が 0 になるんですが、
皆さんはどうなりますか?
会社のマシンでは4台中3台が0なるという奇妙な状況です
794デフォルトの名無しさん:2008/04/11(金) 18:41:20
>>793
426 と間違えて 42.6 になってるとか?
795デフォルトの名無しさん:2008/04/11(金) 18:44:48
再現可能なコードをポストしないのは何をかいわんや、だろw
796げげ:2008/04/11(金) 20:45:53
レスありがとうございます。

>>794
426 です。

>>795
再現するコードが上記のコードなんですよ

私自信が信じられないので、お伺いしたのですが、
一応前ソースコードを以下に書きます。

namespace casttest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();

float f = 426;
int d = ((int)f) / 63;

d = Convert.ToInt32(f) / 63; << こっちはオッケー
}
}
}
797デフォルトの名無しさん:2008/04/11(金) 21:18:01
>>796
using System;

class Hoge{
static void Main(){
float f = 426;
int d = (int)f / 63;

Console.WriteLine(d);
}
}
=> 6
試してみたがちゃんと計算されるぞ
798デフォルトの名無しさん:2008/04/11(金) 21:19:23
アホか。
「再現するコード」といっている。
お前さんそのコードのdの値をどうやって見ろっての。

ひょっとしてデバッガで巣頓狂なところで止めてそういう寝ぼけたこと言ってるんじゃないの?
799げげ:2008/04/11(金) 21:32:29
レスありがとうございます。

>>798
ヒントをありがとうございます。

MessageBox を追加した以下のコードで不思議なことが起こりました

−−−−−

float f = 426;
int d = (int)f / 63;

MessageBox.Show(d.ToString());

−−−−−

MessageBox のところで、Break すると、値が0になり、
メッセージボックスに0と出ます。
一方 Break しないと、6とでました。

デバッグ中の値のチェックの際に発生した事象だったので
ツールチップの値が6なのに、ステップ実行したら0が
格納されて進んでいたので、おかしいなと思って質問
したのでした・・・。

C# でブレークをかけた場合に、このような現象になるのは
仕様なんでしょうかね・・・
800デフォルトの名無しさん:2008/04/11(金) 22:21:07
仮想PCに問題があるように思う。
801デフォルトの名無しさん:2008/04/11(金) 23:14:58
コンパイラかJITが最適化してるんじゃね?
たとえばその変数 d をその行以降使ってない(スコープ内に出てこない)とか?
802デフォルトの名無しさん:2008/04/11(金) 23:31:01
d.ToStringで使ってるだろ
803デフォルトの名無しさん:2008/04/11(金) 23:33:11
box化?
804デフォルトの名無しさん:2008/04/12(土) 00:22:10
ここ2週間ほど地味にさわってるけど、やっとC#に慣れてきたわ。
慣れてくると便利なもんだな。でもキーボードショートカットが
使いにくい。いまだに補完でCtrl-Pとか押しちゃう!
805デフォルトの名無しさん:2008/04/12(土) 00:45:18
好きなように変更すればいいじゃん
806デフォルトの名無しさん:2008/04/12(土) 00:59:11
>>802
Breakの位置で決まる
807デフォルトの名無しさん:2008/04/12(土) 01:09:09
またまたご冗談を
808デフォルトの名無しさん:2008/04/12(土) 02:55:18
俺とお前の脳がbreakしてるだけじゃね?
809デフォルトの名無しさん:2008/04/13(日) 10:45:44
>>759
少しでもダメな仕様だと思うなら、修正すべきだよ
ほっておいたまま拡張を続けるとMFCやらATLみたいになってしまうぞ
負の遺産こそが最大の敵だ
810デフォルトの名無しさん:2008/04/14(月) 03:06:03
コピペ君って馬鹿だな、まで読んだ。
811デフォルトの名無しさん:2008/04/14(月) 03:12:09
Magic dockingって商用もフリー?
812デフォルトの名無しさん:2008/04/14(月) 10:09:13
ライセンス関係はこういうとこで聞かれても困る
813デフォルトの名無しさん:2008/04/15(火) 11:51:32
ファイルの読み込みに関して質問させてください。
C#ってC++みたいに
int n
Stream >> n
って感じでintを読み込めないんですか?
わざわざ↓の様に
string line = r.ReadLine()
int n = System.Convert.ToInt32(line);
自分で型変換を書かないといけないのでしょうか?
814デフォルトの名無しさん:2008/04/15(火) 12:01:56
binaryReaderでできるし。
815デフォルトの名無しさん:2008/04/15(火) 12:35:14
StreamReader 使うってことは数字文字列が書かれてるのか?
816デフォルトの名無しさん:2008/04/15(火) 14:55:21
>>814-815
いえ、ありがとうございます
BinaryReaderを使ってできました。
817デフォルトの名無しさん:2008/04/15(火) 23:21:36
>>813
BinaryReader に加えて補足。

その >> 演算子の使い方は、演算子オーバーロードの乱用・悪用と言われてる。
作った当時は斬新でかっこよく見えたけど、
今となっては read_line の方がよかったと。
なので、C# ではそんなやり方しない。
818デフォルトの名無しさん:2008/04/16(水) 00:24:46
あと、入力書式に凝らないといけないときには、
C++でも結局>>なんて使わず、
1行丸ごと文字列として読んで、正規表現とか自前のパーサとかで解析する罠。

だから、C#で>>813のような場合で
ReadLineくらいしか無いのも、俺は別に不便とは思わない。
819デフォルトの名無しさん:2008/04/16(水) 14:07:00
フォームに実装されているAutoScrollのような事を、自前でやりたいのですが、
フォームのクライアント領域を、同じフォームのクライアント領域にずらして描画するには
どうやったらよいのでしょうか?
DrawImageなどのメソッドは見つかるのですが、Graphics同士を描画するメソッドなどはないのでしょうかね。
820デフォルトの名無しさん:2008/04/16(水) 18:04:29
日記なら余所でどうぞ
821デフォルトの名無しさん:2008/04/16(水) 18:11:21
>>819
何がしたいのかがいまいち分かりにくい
せめて、ゴールとアプローチくらいは分けてくれ
(単に分けて書くのではなく、分けて考える)

よく分からなければ、代替可能かどうか考えてみるといい
ゴール = 代替不可能
アプローチ = 代替可能
822デフォルトの名無しさん:2008/04/16(水) 18:52:06
>>819
言いたいことはだいたい分かるからいいけど。
GDIでやるならPanelを1つかませばいい。
無限ページのスクロールとかはそれでやった。
823819:2008/04/16(水) 19:14:17
説明がわかり難かったみたいですね、すみません。
1からテキストエディタを作っていて、クライアント領域に描画してあるテキストを、
スクロールバーを用いてスクロールする処理を行いたいのですが、
その際に既に描画してある領域をずらいたいんです。

C++なら
hdc = GetDC(hWnd);
BitBlt(hdc, 0, -1, width, height, hdc, 0, 0, SRCCOPY);
ReleaseDC(hdc, hWnd);
こんな感じになると思うのですが、これと同様に、クライアント領域の描画コンテキスト同士で
描画をする方法がわからず、質問した次第です。
824デフォルトの名無しさん:2008/04/16(水) 19:30:16
GDI+には描画コンテキストのビットマップを取得するメソッドが用意されてないんだよねなぜか。
面倒だけどWin32のBitBlt使うしかないと思う。

でもBitBlt使うとなんか画面の色数が16bitになっていると
ちょっと描画が変になる問題が発生するような記憶があるけど。
825デフォルトの名無しさん:2008/04/16(水) 20:08:49
823のやりたいことがサッパリ分らないw
826デフォルトの名無しさん:2008/04/16(水) 20:26:19
C#にはそんなものないが結論では?
蛇足だけど、C++ (Windows API)ではScrollWindowExのほうが普通だと思う。
827デフォルトの名無しさん:2008/04/16(水) 21:00:18
スクロールバーを実装するのってわりと難しいってはなし?
828デフォルトの名無しさん:2008/04/16(水) 21:30:09
まぁその用途なら任意の大きさのクライアント領域を
Panelでホストすれば良いでっしゃろ。
829デフォルトの名無しさん:2008/04/17(木) 00:22:20
>>823
そういう事せずに、毎回テキスト書き直すほうがいい
830823:2008/04/17(木) 05:51:23
>>824
>GDI+には描画コンテキストのビットマップを取得するメソッドが用意されてないんだよねなぜか。
やっぱりそうなんですか。
Formに実装されているAutoScroll(自動でスクロールバーを出し、スクロールのサポートを行う)も、
>>823 と同様な事を行い、スクロールによって現れる新しい行は無効領域に設定して、
ユーザにOnPaintで処理してもらうような感じだと思ったので、比較的簡単に出来ると思ったんですが、
実際のスクロール処理はBitBltなどを呼び出してるのでしょうね。

>>826
>C#にはそんなものないが結論では?
そんな感じですね。Win32APIでの実装を考えてみます。
ScrollWindowExなんてAPIがあったんですね。
参考にさせてもらいます。

>>827
スクロールバーを表示して、クライアント領域を自前でスクロールさせる話です。
831823:2008/04/17(木) 06:01:01
>>828
Panelに描画してもらって、Panel自体を移動するって事ですか?

>>829
全部書き直す方が実装は楽ですけどね・・・。
実際、世に出回ってるテキストエディタが全部書き直してると思えないんですが、
どうなんですかね。
サクラエディタなどのソースを公開しているものを見て検討してみます。
832デフォルトの名無しさん:2008/04/17(木) 10:38:55
Formのクライアント領域より大きいPanel載せるだけ
833デフォルトの名無しさん:2008/04/17(木) 15:57:20
Win32でもそんな実装しないからな。
834デフォルトの名無しさん:2008/04/17(木) 16:00:00
テキストが長くなったら無限にPanelが大きくなるのか?
それはないだろう
835デフォルトの名無しさん:2008/04/17(木) 16:04:12
ダブルバッファかその都度描画だろう。あとは要件次第。
836デフォルトの名無しさん:2008/04/17(木) 16:06:35
その都度描画する以外ないと思うがなあ
無限にでかくなるビットマップなんてぞっとする
837デフォルトの名無しさん:2008/04/17(木) 16:51:58
4年ぐらい前の話だが、
その都度描画では微妙にスクロールの操作性が悪かったので
ScrollWindowExを使って改善させたことがある

今のPC性能なら必要ないかもしれないね
838823:2008/04/17(木) 18:45:00
Panelを使う方法は限られた行数なら簡単でいいと思うんですが、
10万行とか行数が多い場合に、ちょっとぞっとしますね。

ゆくゆくは構文の強調表示や画像なども貼り付けられるようにしたいので、
その都度、全部描画するのはパフォーマンス的に疑問が残ります。

そう考えると、 >>835 氏のダブルバッファを使う方法はなかなかいいかと思いました。
ScrollWindowExでクライアント領域をスクロールする場合と、裏画面からクライアント領域に、
画像を描画するのはコスト的にも同等かなと思うし。
OnPaintで無効領域の描画をする場合でも、裏画面から該当箇所を描画するだけで済みそうです。

839デフォルトの名無しさん:2008/04/17(木) 19:59:15
>>838
パフォーマンスが問題であるなら、今ならWPFがお勧め。
まだ自分も十分に使い込んでいないけれども、ものすごくパフォーマンスが高いうえに
Paintイベント処理といった概念がないのですっきりする。
ドキュメントがろくすっぽ揃っていないのがちょっと辛いけど・・・
自分は、これで巨大なグラフを描画している。
ホストコントロールでビットマップも簡単に作れるので印刷も簡単。
840デフォルトの名無しさん:2008/04/17(木) 20:06:08
ちなみにパフォーマンスは画面の100倍ぐらいの図形要素をセットして、全部描画した状態で平気でなめらかなスクロールをします。
描画要素のセットアップで余計な時間を取られるので、無節操に大きいのは都合悪いですけど、一旦セットアップが終わった後の描画は圧巻です。
841デフォルトの名無しさん:2008/04/17(木) 20:07:42
WPFの移行するときって既存の大量のコードはどうなるの?
移植作業とか必要?
842デフォルトの名無しさん:2008/04/17(木) 20:09:57
移植ならあるていど覚悟しておいたほうがいいです、全然描画のアーキテクチャが違いますので。
ただし移植後のコードは非常にシンプルになります。
843デフォルトの名無しさん:2008/04/17(木) 20:11:01
FormとWPFは全く互換性ないな
844デフォルトの名無しさん:2008/04/17(木) 20:12:55
スクロールどころかグルグル回転とかも平気だしね。
845832:2008/04/17(木) 20:15:03
勘違いしてるやつが多いみたいだから補足。

まず、Panelはビットマップ/バッファを持っていない。
つまり、メモリサイズは、Panelサイズに比例しない。
それどころか、メモリサイズは、Panelサイズに依らない。
(Panelサイズを大きくしてもメモリ増加はほぼ0)

次に、描画は基本的に、
PanelのOnPaintメソッドかPaintイベントで *全部* 再描画する。

e.Graphicsを使えば描画領域は既に設定されているので、
描画しなくてよい部分に対する描画処理は無視される。
(メソッド呼び出しのオーバヘッドは有る)

また、スクロールされたときは、
Form(ScrollableControl)が勝手に転送してくれる。
(多分、内部でBitBlt呼んでるものと思われる)


余談
PanelじゃなくてControlでもいいけどツールボックスに無いので。
描画部分をカスタムコントロールにするのが良い方法だと思う。
846822:2008/04/17(木) 20:58:28
だからオレは無限スクロールをPanelで既にやってると

言おうとして>>845が全部言ってくれた件。
847デフォルトの名無しさん:2008/04/17(木) 21:11:31
>>838
> ScrollWindowExでクライアント領域をスクロールする場合と、裏画面からクライアント領域に、
> 画像を描画するのはコスト的にも同等かなと思うし。

Vistaより前のOSだと
裏画面からウィンドウへの画像転送は
ScrollWindowExやBitBltによるウィンドウからウィンドウへの画像転送に比べ、
非常に遅くなったりするよ。

場合によっては、全画面再描画と変わらないくらいに。
848デフォルトの名無しさん:2008/04/17(木) 21:17:45
これからWPFだよ、GPU内で完結する描画のパフォーマンスにはどんな方法も太刀打ちでいないって
849デフォルトの名無しさん:2008/04/17(木) 21:27:51
それゆえの欠点もあるけどね

・複雑なUIでも重くなりにくいが、シンプルなUIでも軽くならない
・GPUがしょぼいと性能低下
・図形のセットアップにコストがかかる
(ただし、Freezableオブジェクトなら別スレッドで初期化できるので、工夫すれば高層化できる)

ただ、WinFromsと違って、WindowsAPIの制限をそのまま受け継ぎましたって感じの
へんな制限も無いので、慣れると使いやすい事は確か
850819:2008/04/17(木) 21:58:21
みなさん色々なアドバイスありがとうございます。

ところで、今現在リリースされているテキストエディタで、特に描画周りで「重い」と感じる事はありますか?
自分は昔からテキストエディタで重いと感じる事は無かったのですが、
それらのエディタでPanelを使用していたり、WPFを使用している訳ではないですよね。

旧来からの手法で軽く動作させる方法があると思うのですが、
そのような手法を模索しています。

WPFは興味ありますが、機種依存の問題や.net framework 3.0以上が必要と、
テキストエディタにはユーザに要求する仕様が高すぎるかな、と思いました。

やはり、既に描画済みの部分は「ずらすだけ」で新たな部分のみを描画する、
又は、ダブルバッファなどの手法が妥当だと思いますが、どうでしょうか?
851デフォルトの名無しさん:2008/04/17(木) 22:16:28
つかGDI+使ってるテキストエディタってあるのか?
852819:2008/04/17(木) 22:17:32
Paneについてですが、
Panel.Textにテキストを設定すると、テキストのコピーがPanel内に保持されると思うので、
その分のメモリは消費しますよね。
内部で保持しているテキストはPeaceTableなどの形式で保持している(したい)ので、
Panelに設定したテキストは表示専用のメモリとして余分に掛かってしまいます。

また、キャレットや選択範囲の描画などを行う場合、
OnPaintなどのタイミングで自前で描画する必要があるので、
そこらへんも適応するかどうか疑問ではあります。
853819:2008/04/17(木) 22:21:15
>>851
たぶん、あまりないでしょうね・・・。
自分はC++の方が長いので、C++&Win32APIで実装した方が楽かと思いますが、
これからの将来性や移植性をなどを考え、C#で実装したいなと思ってます。
854デフォルトの名無しさん:2008/04/17(木) 22:24:18
GDI+に将来性移植性?
855819:2008/04/17(木) 22:24:46
>>852
×PeaceTable
○PieceTable
856デフォルトの名無しさん:2008/04/17(木) 22:51:56
駄目だこりゃ。予想以上の初心者だったか。

>Panel.Textにテキストを設定すると
誰もPanel自体にテキスト表示させろなんて言ってないよ。
世のテキストエディタはWindowsのエディットコントロールなんて使わずに
頭を悩ませながら自前でテキストバッファを管理しつつ、文字を表示する位置も自分で計算してるの。
ちなみにPanel.Textは無効なプロパティね。反論だけはする癖に一行もコード書いてないでしょ?
857デフォルトの名無しさん:2008/04/17(木) 22:56:41
>>839
この間、WPFでEllipseGepmetoryを一万個ランダムで作ってDrawBrushに渡して描画するのと、FormsでOnPaintで一万個描画するのを試してFormsのほうが二倍ぐらい速かったんだが、Geometory系はあまりGPUの恩恵を受けられないのかね?

WPFだとこういう風にした方がアーキテクチャ上の恩恵を受けやすいというのがあれば是非お願いします。
858819:2008/04/17(木) 23:00:53
>>856
ええ、C#は触り始めたばかりです。

>頭を悩ませながら自前でテキストバッファを管理しつつ、文字を表示する位置も自分で計算してるの。
そういう方向で実装しています。
だからこそ、既に描画済みの領域をずらす方法などを質問している訳です。

Panelに関しては憶測で書いていたので、不適切だったかと思います。
delphiもやるので、Panel.Captionのような所にテキストを設定するのかと思ってました。
859デフォルトの名無しさん:2008/04/17(木) 23:21:09
>>857
WPFのOnRenderはOnPaintとは違って,描画してもらうものを登録する場所だろ
素直にコントロール使って描画した方が速い
Geometryの作成にかかる時間も勘定に入れてるんだったら
Geometryは描画リソースなんだから毎回作ったら遅くなるのは当たり前じゃね
860デフォルトの名無しさん:2008/04/17(木) 23:56:41
>>857
ローレベルがDirectXであるという点について考察を入れてみれば高速な方法は見えるよ。
一般にGPU⇔CPU間の速度が非常に低速、描画リストを作って位置の移動・変型といった使い方が有利。
描画内容を毎回メインメモリーからGPUに送りつけるようなコードをさければいい。
861857:2008/04/18(金) 00:37:52
>>859
Geometryは初期化時に生成してDrawBrushにしてFillに渡して後は勝手に描画してもらうようにしていました。
こうすることは、描画してもらうものを登録することにはならないんですかね?
WPFEssenntialにGeometoryが一番プリミティブで軽いと書かれていたので試してみたんですが・・・
Shapeなどはまだ試してません。

>>860
DirectXはちらっとしかさわってないのですが、そのときはおおざっぱにポリゴンやテクスチャをGPU?に渡して後は任せるぐらいにしか理解していません。
DrawGeometoryなどは描画ツリーにセットしておいて必要に応じて移動・変形するといったものにはあたらないんでしょうか。
862デフォルトの名無しさん:2008/04/18(金) 00:42:29
>描画ツリーにセットしておいて必要に応じて移動・変形するといったものにはあたらないんでしょうか。
それでいいよ、変形情報だけならサイズはしれているから。
頂点を毎回CPUで作って、毎回一万もGPUに送るとそれだけで帯域全部食らいつくしてしまいます。
CPUに対してメモリーやPCIインターフェイスの速度は超低速です、いまやCPUが数ギガヘルツの時代になっても十年前からほとんど速度向上していません。
863857:2008/04/18(金) 00:55:59
EllipseGeometryを最初に一万個生成しての描画で、1000×800ぐらいになるようにサイズ変更した時に全て描画終わるまでに3,4秒ほどかかってますがこんなものでしょうか?

環境はVista、T9300 、オンボードグラフィック(フリップ3Dは楽に動くぐらい)、4Gメモリです。
864デフォルトの名無しさん:2008/04/18(金) 01:29:55
自分も試してみた、最新ミドルレンジクラスのグラボでGeFoce9600GT
ただのEllipseでチョイ書きしてみた
1000×800 一万個で、拡大縮小、0.2フレーム程度
Ellipseは一つ頭でも結構情報量大きいね 100 ポリゴン以上はありそうな感じだ。
しかも2Dのデザイン重視描画だし、アンチエィリアスとかも細かいし。
全部で10000x100 = 100万ポリゴンなら、まぁこんな物かな。
865デフォルトの名無しさん:2008/04/18(金) 01:31:30
間違い 0.2フレーム程度 → 0.2秒間隔程度で更新
866デフォルトの名無しさん:2008/04/18(金) 02:09:52
具ラボ切り替えて GeForce 8400M GS 64MBで試してみた。ちなみに切り替え前はIntel GMA X3100 0MB。
切り替えたら同じように0.2〜3秒で更新するようになったw サーセン。
でも同じようなものをFillEllipse,DrawEllipseでFormで描画してみたら、やはりFormのほうが早そうだ。

ものにもよると思うけれど、コントロールの組み合わせじゃないもの、たとえばエクセルのようなグラフ(それの複雑なもの)を書くとしたら、
GDI+でビットマップに描画してそれをWPFでレンダリングするような形にしたほうが早くなったりもするのだろうか?実装の手間とかエレガントさは除いたとして。
867デフォルトの名無しさん:2008/04/18(金) 02:24:49
>>866
>でも同じようなものをFillEllipse,DrawEllipseでFormで描画してみたら、やはりFormのほうが早そうだ。
そうですか、こっちは、Formで描画したら更新に4秒以上かかってます。
868デフォルトの名無しさん:2008/04/18(金) 02:29:50
あとPaintを使って重い描画すると、その間Windowsが固まって反応しなくなってしまうのが嫌ですね。
869デフォルトの名無しさん:2008/04/18(金) 09:08:04
コードの問題なんじゃね?
870857:2008/04/18(金) 09:19:36
Formのほうは正確にはOnPaintで描画するのではなくBufferedGraphicsに描いてから転送してます。
具ラボ切り替える前、WPFで描画に3,4秒架かってたときはサイズ変更時に固まるような感じでしたね。
自分の書き方だとWPFに余計な負荷かけてるのかもしれません。後でできればコードアップしてみます。
WPFはなにぶん初心者なのでたぶんもっといい書き方ありそうな。
871デフォルトの名無しさん:2008/04/18(金) 10:09:13
StreamGeometry使ったら速くなるかも
872デフォルトの名無しさん:2008/04/18(金) 10:47:16
お尻まで入ると頭に戻る配列はどうするの?
873デフォルトの名無しさん:2008/04/18(金) 10:59:47
自分でIList<T>実装して作りましょう
874デフォルトの名無しさん:2008/04/18(金) 12:16:02
>>872
Queue のこと?
それか、ある配列を与えて、それを永久ループさせるようなものってこと?
前者なら System.Collections.Generic.Queue
後者なら、>>873 あるいは、
IEnumerable<T> Loop(IEnumerable<T> e)
{
for(;;) foreach(var x in e) yield return x;
}
875デフォルトの名無しさん:2008/04/18(金) 12:37:46
リンゴバッファじゃね
876デフォルトの名無しさん:2008/04/18(金) 14:07:11
>>869
マルチスレッド非対応のWin32APIだから、その上に乗っているFormも当然非対応になっている
だから WM_PAINT とその他イベント処理を並列化することは叶わないよ。
APIを直接使うなら動作するけれど、当然その結果は保証されない。
.NET では 2.0 以降やったらアサートがかかるようになった。
このあたりの問題もWPFではいろいろ考えられていて便利になっている。
この問題を解決するとするなら細切れにして描画などというトチ狂ったようなコードが必要になる。
877デフォルトの名無しさん:2008/04/18(金) 15:22:06
一般的なフォームアプリを作っていますが、VISTAでは使えない(使うべきでない)メソッドとかってありますかね?
動かないと報告が出てもVISTA環境がないのでさっぱり原因が分からないのです。
878デフォルトの名無しさん:2008/04/18(金) 15:25:26
ファイルパスとかじゃね。
879デフォルトの名無しさん:2008/04/18(金) 15:37:34
>>874
ちょっ、そのコード、ちょっと衝撃だ(笑)
叶うならラムダで書きたいね
880デフォルトの名無しさん:2008/04/18(金) 15:42:17
[DefaultValue(...)] を使って System.Font 型にデフォルト値を与えるには
どうすればいいかわかる人います?
881デフォルトの名無しさん:2008/04/18(金) 16:07:32
>>879
クロージャ内で yield 書けないのは、MS 的にも失敗だったと思ってるらしいんで、
ひょっとすると将来的に書けるようになるかもね。

あと、個人的には、foreach(var x in e) yield return x; の部分を、
○○ e; だけで同様の結果が得られるような構文糖衣欲しいんだけど。
イテレータをマイクロスレッド的に使うときに、そういう構文がすごく欲しい。
882デフォルトの名無しさん:2008/04/18(金) 16:27:27
>>880
DefaultValueでは無理なのでこっち。
http://msdn2.microsoft.com/ja-jp/library/53b8022e(VS.80).aspx
883デフォルトの名無しさん:2008/04/18(金) 16:29:05
>>880
ShouldSerialize[Property]使う。

>>881
yield foreach e; とか?まあイテレータは何か「中の人」向け機能
なんでシュガーなだけの機能入れるのはどうだろう?
884デフォルトの名無しさん:2008/04/18(金) 16:37:27
>>883
そうそう、そんなの<yield foreach。
俺は yield expand とかを思い浮かべてたけど、
yield foreach ならキーワード増えないのもいいかもね。

881 でも書いてるけど、スクリプト言語の fiber/microthread 的な使い方しようと思うと、
案外、その構文欲しいのよ。
「a, b, c の後に N 個 null を返す」とかを、
yield return a;
yield return b;
yield return c;
yield Repeat(null, N);
みたいに書きたい。
885880:2008/04/18(金) 16:52:53
サンクス、GotDotNetで、もっと手っ取り早い方法も見つけたので紹介しておきます。
[DefaultValue(typeof(Font), "フォントプロパティーの値")]
これでいいみたいです。

>for(;;) foreach(var x in e) yield return x;
yieldを使い元データを作って、LINQでそれを加工して出力というある種のパターンが見えてきます
なんというか、IEnumerable,yield に始まってLINQで終わるというか、強烈に爽快なコードですね。
自分は全然使い込み不足だ、やりこまないといけないです
886デフォルトの名無しさん:2008/04/18(金) 17:00:16
C#に後から追加された機能は、どうも一貫性がないというか、
妙な制限が多い気がするな

クロージャ内でのyieldもそうだが、
インナークラスで拡張メソッドが定義できないのもどうかと思う

拡張メソッドは利用可能範囲を最小限に抑えたい機能の代表格なのに、
インナークラスで使えないが故にそれができない
887デフォルトの名無しさん:2008/04/18(金) 17:05:09
どこかのタイミングでガッツリ整理してメジャーバージョンアップして欲しいですね
Javaコピーだったのが、ここに来てやっとC#らしさというのが出てきたという感じですし。
888デフォルトの名無しさん:2008/04/18(金) 17:08:41
拡張メソッドを使いまくりたいという欲望を抑えるためにやってるんだろ
889デフォルトの名無しさん:2008/04/18(金) 17:13:51
自分も拡張メソッドに関してはちと反対なんだよな
逆にメソッドも namespace が欲しい、インテリセンスが効率よく使えるためには
名前一覧で出てくるメソッドの数は少ないほうがいいので。
もし拡張メソッドをするなら
seq.Sum() ;
ではなく
seq.extensions.Sum() ;
のような感じになってくれた方が有難い、単に便利文法を考えるのではなくてIDEがある前提での高機能化を目指してほしい
890デフォルトの名無しさん:2008/04/18(金) 18:51:19
>>889
それは感じるが、むしろ IDE 側で特定のキーバインドで
拡張メソッドの表示をトグルできたらと思ってる
891デフォルトの名無しさん:2008/04/18(金) 19:02:56
つか、拡張メソッドのツールチップに「拡張子」って出るのは
どういうローカライズチームだよ
892デフォルトの名無しさん:2008/04/18(金) 19:09:15
>>879
ファイルパスって具体的にどの事ですか?
getcurrentdirectory()から下の階層しか使ってないんですけども
893デフォルトの名無しさん:2008/04/18(金) 19:18:26
VISTAはセキュリティー周りが強化されているから、それを調べてみるといい
たとえば、"Program Files" 以下は、ユーザーから操作できない、手抜きをしてここにデータを置いたりすると問題が起こる。
Windows に標準的な作り方をしているなら問題は起こらないはず。
894デフォルトの名無しさん:2008/04/18(金) 19:28:05
XPで作るなら、User権限のアカウントを作って、それで動くかどうか試せば
Vistaでもトラブルは少ないかと思われ
895デフォルトの名無しさん:2008/04/18(金) 22:23:08
static class IntExtention
{
public static int Sum( this int obj , int value )
{
return obj + value;
}
public static int Sum( int val1 , int val2 )
{
return val1 + val2;
}
}

拡張メソッドって、こういうオーバーロードは無理なのな。(全く意味無いけどw)
thisがついていても、普通に呼べると。
896デフォルトの名無しさん:2008/04/18(金) 23:22:27
>>881
それだったら return e;でコンパイル通るだろ。
897デフォルトの名無しさん:2008/04/18(金) 23:33:25
>>886
拡張メソッドの目的は名目上「変更できない既存の型にメソッドを追加すること」だから
その意味では内部クラスに使うのはおかしいんだろう
898デフォルトの名無しさん:2008/04/18(金) 23:38:17
>>897
×内部クラスに使う
○内部クラスで既存の型にメソッドを追加する定義をする
899デフォルトの名無しさん:2008/04/18(金) 23:39:21
>>896
よく見て。

yield return a; return e; (yield return と return の混在)
はできないよ。
やりたいのは、IEnumerable の中身の展開。
yield e1; yield e2; で、return Concatenate(e1, e2); 相当の結果を得たい。
900デフォルトの名無しさん:2008/04/18(金) 23:41:47
シンタックスシュガー的なメソッド、たとえば複数の関連するプロパティをまとめてセットするようなものは、あまりもとのクラスにつけたしたくないため拡張メソッドにすることあるなぁ。
usingでうまく使い分ければいいんだろうけれど、複数人での開発時は規約を決めないと後で困りそう。
でも自分は拡張メソッド大好き。
901デフォルトの名無しさん:2008/04/19(土) 00:40:39
というか色々厳しいにしろインターフェイスに足せるのがやっぱり
拡張メソッドは良かろうみたいな
902デフォルトの名無しさん:2008/04/19(土) 00:47:29
>>901
素直にインターフェイスのアダプタとして設計して欲しいな
使う場所でいろいろ使いたいアダプタは変わるわけで、using とか勘弁って感じ。
それにしても、yield を考えたやつは天才だと思うわ。
903デフォルトの名無しさん:2008/04/19(土) 00:56:18
yield の核心部分は、プログラムによるデータの定義だと思う
データ構造にはシーケンス以外にも、ツリー、双方向リストその他色々あるので考えていけばまだまだ広がりそうな気がするよ。
次の要素を拾うときに引数を利用するだけでも激変すると思う、これだけなら実際には今でもできるんだけどね、やるとちょっとキモイので。
904デフォルトの名無しさん:2008/04/19(土) 07:31:27
やっぱり、delegateのなかでyieldが使えないのが困るなぁ・・・
それ使えればかなりすっきりするのかけるのに。
905デフォルトの名無しさん:2008/04/19(土) 07:43:18
yieldとか多用すんなって
普通に書こうや
906デフォルトの名無しさん:2008/04/19(土) 08:02:29
コード規約でyield禁止とか言われたら会社辞めるわ
907デフォルトの名無しさん:2008/04/19(土) 08:08:43
普通に書いた結果が >>874 だよ
908デフォルトの名無しさん:2008/04/19(土) 08:21:26
普通にプログラムかいててyieldが必要になることなんてほとんどないだろ
普通のプログラムにyieldがしょっちゅう出てくるとしたらなんかの病気だよ
909デフォルトの名無しさん:2008/04/19(土) 08:25:13
そりゃ>>874のコードは頻繁に必要になるものではないけど。
コレクションとかLINQ周りのコード書いてると普通に必要だろ、yield。
910デフォルトの名無しさん:2008/04/19(土) 08:42:33
普通普通ってなんの根拠も示さず喚かれてもねぇ。
例えばyieldの無いC++/CLIでシステム情報のコレクションを書くたびに泣きたくなるぞ俺は。
911デフォルトの名無しさん:2008/04/19(土) 08:48:11
Queueに入る個数を決め打ちして溢れたら一番最初のを消せますか?
912デフォルトの名無しさん:2008/04/19(土) 08:54:57
IEnumerable<T>を自作する時にはyieldはいいものだが
IEnumerable<T>を自作することがほとんどないだろ
yield return a; yield return b;
なんてのは
new[]{ a, b }
で事足りる
913デフォルトの名無しさん:2008/04/19(土) 08:54:59
DrawListViewSubItemEventArgs.DrawTextが激しく使えないんだが。
仮想モードだからかもしれないけどフォントが違うし
描画位置をピクセル単位で微調整せず、無条件で最初に空白を表示するから
DrawDefaultをtrueにした行と同じにならない。
結局自前で全部描画した。
914デフォルトの名無しさん:2008/04/19(土) 09:16:00
そっか。
915デフォルトの名無しさん:2008/04/19(土) 09:26:47
>>912
そうかッ! どんだけの量が返されるかわからないデータベースからのフェッチも
あらかじめ馬鹿デカイ配列として保持しておけばIEnumeratorを実装する必要なんて無いのかッ
お前チョー頭良いなッ
916デフォルトの名無しさん:2008/04/19(土) 09:37:39
お前の頭が悪いだけ
917デフォルトの名無しさん:2008/04/19(土) 09:41:52
LINQのおかげでyieldの出番は減ったが、yieldの有用度は逆に増えたな
918デフォルトの名無しさん:2008/04/19(土) 11:26:56
毎日一回はたぶんyield書いてますが何か?LINQみたいにIEnumerableに対しての制御構造化至りとかいろいろ使い道あろうが。
919デフォルトの名無しさん:2008/04/19(土) 11:46:23
そもそもなんでもLINQで書こうとすること自体が頭悪いな
920デフォルトの名無しさん:2008/04/19(土) 11:58:40
>>902
誰でも考えるけどお固い言語では今まで怖くてやらなかっただけ
921デフォルトの名無しさん:2008/04/19(土) 12:22:19
実装するという決断が評価される
922デフォルトの名無しさん:2008/04/19(土) 12:22:38
最初の考案者が、ということでは
923デフォルトの名無しさん:2008/04/19(土) 12:36:27
処理の流れを根本から変えるからな
ラムダ式やLINQなんかとは比べ物にならないようなとんでもない決断
924デフォルトの名無しさん:2008/04/19(土) 13:30:07
yield 反対者は、たとえばツリー構造の全子要素列挙とかどうするんだろうな、
かなり頭の悪いコードを書くに違いないと容易に予想にできるが・・・
925デフォルトの名無しさん:2008/04/19(土) 13:34:44
>>924
興奮するな
落ち着いて落ち着いて
926デフォルトの名無しさん:2008/04/19(土) 13:40:30
たとえば単純なコンテナであっても読み出し方は前から順以外にもいろいろな読み方が要求される
このときあり物のアルゴリズムが使えない時新規にどうする?
手動で全部実装か?それとも新規配列を馬鹿みたいに作成して新たなコンテナでも作るか?
馬鹿馬鹿しすぎるよ
927デフォルトの名無しさん:2008/04/19(土) 13:55:56
>>920
そんな単純な話じゃないと思うよ、常識的にスタックは一本あればサブルーチン(=メソッド)を実装できるが
yieldをもつと、スタックがツリー構造の様相になるから、わずかな機能追加しかないコード見てくれとは裏腹に内部構造は激変しているハズ
928デフォルトの名無しさん:2008/04/19(土) 13:59:20
C#のyieldは途中の状態を保持したクラスを自動的に作ってくれるだけだぜ
929デフォルトの名無しさん:2008/04/19(土) 14:05:28
>>927
スタックがツリー?
俺とは脳内イメージがかなり違うようだな。

俺にとってはyieldは関数風の書き方でIEnumerableを実装できる糖衣構文に過ぎん。
ローカル変数がメンバフィールドに置き換わるって所は、目から鱗が落ちたがな。
930デフォルトの名無しさん:2008/04/19(土) 14:11:25
>>927
逆コンパイルして見てみたらいいよ
すっごく単純なcscのトリック
931デフォルトの名無しさん:2008/04/19(土) 14:23:45
>>929
ちょっと違う話だが、照りゲートも内部暮らすとして実装されてるせいで、デバッグのときに見れるローカル変数とそうでないのがあるときには何でだろうと思ふ(´・ω・`)
932デフォルトの名無しさん:2008/04/19(土) 14:52:03
別にyieldに反対なわけじゃない
GetEnumeratorを実装したけりゃyieldすればいい
しかしyieldはそうしょっちゅうでてくるもんでもないし
たいして重要な機能でもない

yieldを中心にすえてLINQでなんでもかんでも処理しようというような考え方は
まずいだろうと思っている
933デフォルトの名無しさん:2008/04/19(土) 15:03:53
知っていればすごく便利な時がある。
知らない人はいつまでもどんくさい書き方をする。
別にyieldに限ったことではないではないか。
934デフォルトの名無しさん:2008/04/19(土) 15:06:19
>>931
匿名デリゲート/ラムダ式の話しか?
具体的なコード書けば、誰かに何か教えてもらえるかもしれない
935デフォルトの名無しさん:2008/04/19(土) 15:09:05
LINQ はデータ操作における、ある種のデザインパターンだから、知らないと放置するのは良くない
学校でもちゃんと教えるべき、知らない人は勉強するべきだ。
大事な事は LINQ の書き方ではなくデータ操作におけるコードのパターンだ。
936デフォルトの名無しさん:2008/04/19(土) 15:18:02
>>934
んだ。
あれ確か、ラムダ式の中で使ってるローカル変数は見れたけど使ってない者はウオッチ出来ないよね?
937デフォルトの名無しさん:2008/04/19(土) 15:21:45
LINQのかき方(とか.Whereをつなげてく書き方)のほうがきれいにかけるけれど、実行速度遅そうというか遅いんだよね
938デフォルトの名無しさん:2008/04/19(土) 16:21:19
「インデクサで要素を取得できる」だけのインターフェイスが欲しい
やっぱりデリゲートかなあ
939デフォルトの名無しさん:2008/04/19(土) 16:26:47
配列がデフォルトで書き換え可能である必要なんかないよな
940デフォルトの名無しさん:2008/04/19(土) 16:41:01
>>929
Win32ならファイバ、一般的にはマイクロスレッド、コルーチンあたり
の単語使うものが根底にあるから調べてみれ。中断とスタック保存が基本。

しかしC#のyieldは列挙に特化してるので直接的では確かにない。
そのようにも使えるけど。この辺考慮するとC#のyieldは再帰やツリーの
ならしには確かに向いてる。foreachのDispose機能もあるしな(IEnumerator<T>の
この仕様はスバラシス)。
941デフォルトの名無しさん:2008/04/19(土) 16:48:25
>マイクロスレッド
yield はマイクロスレッドに対応し始めたらパフォーマンス方面についてもかなり期待できる物になるかもしれんね
今後CPU並列化とともに期待できる機能になると思う、ただしその前に少し再検討してほしい内容もちらほらあるけど。
これ以外にも今回のVisualStudio2008で強化された機能には、WPFといいマルチコア時代につながる技術が盛り沢山なので割と楽しい。
942デフォルトの名無しさん:2008/04/19(土) 16:51:09
おっと yield は2.0で実装だったな、でもLINQで初めての本格活用なんで3.0が実質本番だな。
943デフォルトの名無しさん:2008/04/19(土) 16:59:40
>>938
前に俺が書いたIList,IDictionary用のラッパーインデクサ
ふらっとの方に貼ったけど、dat落ちしてるみたいなのでもう一度

public static class Indexer {
public static DictionaryIndexer<TKey, TValue> GetIndexer<TKey, TValue>(this IDictionary<TKey, TValue> dict) { return new DictionaryIndexer<TKey, TValue>(dict); }
public static ListIndexer<T> GetIndexer<T>(this IList<T> list) { return new ListIndexer<T>(list); }
}

public sealed class DictionaryIndexer<TKey, TValue> {
private IDictionary<TKey, TValue> dict;
internal DictionaryIndexer(IDictionary<TKey, TValue> dict) { this.dict = dict; }
public TValue this[TKey key] { get { return dict[key]; } set { dict[key] = value; } }
}

public sealed class ListIndexer<T> {
private IList<T> list;
internal ListIndexer(IList<T> list) { this.list = list; }
public T this[int index] { get { return list[index]; } set { list[index] = value; } }
}
944デフォルトの名無しさん:2008/04/19(土) 17:08:36
普通のインデクサにはsetがあるからイカン
945デフォルトの名無しさん:2008/04/19(土) 17:11:43
制限したいわけじゃなくて,
void Hoge(IIndexer<int, string> a) { Console.WriteLine(a[0]); }
みたいに統一したインターフェイスで扱いたいんだよね
void Hoge(Func<int, string> a) { Console.WriteLine(a(0)); }
//Hoge(i => array[i]);
まあこれからはこういうのが主流になるんだろうけど
946デフォルトの名無しさん:2008/04/19(土) 17:13:06
yield反対な訳じゃない、ただ・・・豚に真珠だと思うんだ。
947デフォルトの名無しさん:2008/04/19(土) 17:18:41
>>941
>CPU並列化とともに期待できる機能
Parallel FX Library は手軽にCPU並列化の恩恵を受けれていいよね。
http://msdn2.microsoft.com/ja-jp/magazine/cc163340.aspx

Core 2 Quad も価格改定で安くなるようだし、これからの展望にwktk
948デフォルトの名無しさん:2008/04/19(土) 17:37:30
>>937
そう思うのは多分スケーラビリティが見えてない。LINQ to SQL が
片鱗を見せているけれど。対象がギガだろうがテラだろうが同じ
構文でクエれるのが LINQ のいいところ。
949デフォルトの名無しさん:2008/04/19(土) 17:43:14
自分が豚だからってそんなに真珠を嫌わなくても。
950デフォルトの名無しさん:2008/04/19(土) 19:43:48
>>948
PallrelLINQ(スペル自信なし)はいいと思うんだけど、普通のオブジェクトLINQとかの話。
951デフォルトの名無しさん:2008/04/19(土) 20:14:53
>>950
マルチスレッドの向上率なんて現状知れてる。

まあそれは別としてパフォーマンスがそこで問題になるほどなら、インメモリな
Queryable つくってみりゃいい。そこでだけ Unsafe コードっつーのもOKやしな。
だれかつくんねーかな
952デフォルトの名無しさん:2008/04/19(土) 21:43:34
>>951
一度マルチスレッド対応したコードを作ってみるといい
それなりに負荷のあるコードで Core 2 Quad あたりで動かすと激変するから。
unsafe とか馬鹿馬鹿しくなるよ
953デフォルトの名無しさん:2008/04/19(土) 22:03:38
興味があるのでサンプルソースうp
954デフォルトの名無しさん:2008/04/19(土) 22:12:50
脳なしは死ね
955デフォルトの名無しさん:2008/04/19(土) 22:17:47
>>952
いやぶっちゃけ4コアでも最大4倍だろ。
一桁二桁変わるような世界じゃない。そしてそういう部分も
普通は多かったりする
956デフォルトの名無しさん:2008/04/19(土) 22:27:47
なら unsafe で作り続けていればいいかと
ネットワーク環境基本の時世にしてセキュリティー設定次第で使えない、設置・配置できない不便なアプリになるといいかと。
957デフォルトの名無しさん:2008/04/19(土) 22:32:12
>>956
んなところにはそれこそunsafeなんて使わんが?
958デフォルトの名無しさん:2008/04/19(土) 22:49:40
とはいえそうだな、確かにまずコード書けだな。

とりあえず IndexAttribute でインデックスを指定すると
Index Search(Dictionayつかって) してくれる Queryable 返す
Table<T> みたいなの作ってみよ
959デフォルトの名無しさん:2008/04/19(土) 22:52:28
ブラックボックス化されたコードよりアルゴリズムの計算量で比較したほうがいいんじゃないか?
O(n^2)とO(logn)ではスレッド化の結果恩恵がどれくらい得られるかが違ってくるし
960デフォルトの名無しさん:2008/04/19(土) 22:58:16
コードうpも実測もせずに速いとか

アホとしか言えない
961デフォルトの名無しさん:2008/04/19(土) 23:31:04
そんなモンすぐできるだろって意味だよ、バカか
962デフォルトの名無しさん:2008/04/19(土) 23:42:04
だからやってみろって
963デフォルトの名無しさん:2008/04/20(日) 00:34:48
質問です。
C#のSystem.IO.BinaryWriter
で Write()して作ったバイナリファイルを
C++のstd::ifstream fin でopen(filename, ios::binary)
して 例えばint n; fin >>n; しても読み込めないですけど、

・・・つまるところC#で作ったバイナリファイルとC++で作ったバイナリファイルは
互換性がないんですか?
964デフォルトの名無しさん:2008/04/20(日) 00:47:45
馬鹿すぎる、あまりに馬鹿すぎる、それでC++なんかヤルナぁぁぁ
965デフォルトの名無しさん:2008/04/20(日) 00:49:14
fin >> n; は数字を数値に変換して読み込むもんで、テキストを対象にするもんだぞ。
966デフォルトの名無しさん:2008/04/20(日) 00:50:22
C++の超初歩的な質問はC++スレでやれと
967デフォルトの名無しさん:2008/04/20(日) 00:52:58
最近ネイティブコード系を超え高々に訴えるが、基本中の基本も分かっていないのは如何なものか、自重しろっつの。
968デフォルトの名無しさん:2008/04/20(日) 00:54:00
>>963
単にC++とC#のバイナリモードの意味が違うだけ。

C++のほうをバイナリモードで開いて、
fin.read(reinterpret_cast<char*>(&i), sizeof i)
とでもすれば、C#でのi = BinaryReader.ReadInt32()に相当する。
969デフォルトの名無しさん:2008/04/20(日) 00:57:43
>単にC++とC#のバイナリモードの意味が違うだけ。
そこまで説明するなら、Cのバイナリーモードの意味を教えてやってくれよ・・・
頭変になりそうだ
970デフォルトの名無しさん:2008/04/20(日) 01:46:55
待て!今、このスレのスル−カが試されてるぞ!
971デフォルトの名無しさん:2008/04/20(日) 02:29:02
スルーカ 
スルー力
カタカナと漢字で書いてみたんだが、どっちが正しいのかわからんw
972デフォルトの名無しさん:2008/04/20(日) 03:39:33
>>971
スルーカ5級失格
973デフォルトの名無しさん:2008/04/20(日) 09:43:07
こうしてまた新たなバグトラックが発生するのであった
974デフォルトの名無しさん:2008/04/20(日) 11:17:11
>>965 >>968
バイナリオープン指定しても
ifstream >> とか ofstream << はあくまでテキスト対象!?
抽象化歌ってえばってるくせに使えねぇなストラウストラップ。

・・・ともかくバイナリファイルは他の関数でキャラとして読んでその都度変換する
しかないということですね? ありがとうございました。
975デフォルトの名無しさん:2008/04/20(日) 11:55:14
sin90°が1.0にならないよドラえも〜ん。
Math.Sin()の引数はラジアンなので、sin90°を求めるために、次のように度からラジアンに変換して渡すのですが、
double s = Math.Sin(90 * Math.PI / 180);
結果は1.0にはなりません。きっと、丸め誤差のせいです。
度を引数にとる三角関数ライブラリでもあればいいんですがね。
976デフォルトの名無しさん:2008/04/20(日) 12:05:18
>>975
なったぞ
977デフォルトの名無しさん:2008/04/20(日) 12:09:49
>>975
寝ぼけたこと言ってるなあw
それは君が実数値の取り扱い方法を知らないだけだろ。
978デフォルトの名無しさん:2008/04/20(日) 12:40:34
というか逆に考えるんだ。
ほとんどの場合正確な値が返って来ないのに90度だけ返って来るほうがキモいだろう
979デフォルトの名無しさん:2008/04/20(日) 14:44:26
>>974 今すぐC++の地獄の特訓一年間やれ
980デフォルトの名無しさん:2008/04/20(日) 15:12:02
>抽象化歌ってえばってるくせに使えねぇなストラウストラップ。
とりあえずとんでもない勘違いをしているから正しておけ。
981デフォルトの名無しさん:2008/04/20(日) 15:32:33
>>975
俺の環境では1.0になっとるよ
982デフォルトの名無しさん:2008/04/20(日) 16:54:25
浮動小数点に関して 「1.0 になってる」 と言われても、
確認の方法が悪い可能性があるから信用ならん。
どう確認したかを書かなきゃ。
983デフォルトの名無しさん:2008/04/20(日) 17:04:56
適当なプロジェクトでステップオーバーだけ押してデバッガ起動して
イミディエイトウインドウで
(Math.Sin(90 * Math.PI / 180) == 1)
ってやるとtrueが返ってくるが?
984デフォルトの名無しさん:2008/04/20(日) 17:43:21
自分で確認もせずいちゃもんばかり人って何なの?
985デフォルトの名無しさん:2008/04/20(日) 17:46:57
最適化まで考慮してチェックしてんのか?
986デフォルトの名無しさん:2008/04/20(日) 17:58:51
こんなんでどうですか。
using System;
using System.Text;
using System.Runtime.InteropServices;

class F
{
    [DllImport("msvcr90.dll", CharSet = CharSet.Unicode,
        CallingConvention = CallingConvention.Cdecl)]
    static extern int swprintf_s(
        [Out] StringBuilder buffer,
        UIntPtr sizeOfBuffer,
        string format,
        double d);

    static void Main()
    {
        double s = Math.Sin(90 * Math.PI / 180);
        Console.WriteLine("{0:r}", s);
        Console.WriteLine("{0:e17}", s);
        var buf = new StringBuilder();
        buf.Length = 32;
        swprintf_s(buf, (UIntPtr)buf.Length, "%.13a", s);
        Console.WriteLine(buf);
    }
}
987デフォルトの名無しさん:2008/04/20(日) 18:03:39
誤差を気にするなら 1.0 と比較すれ。
チェックにおいて一切誤差が入らない。
988デフォルトの名無しさん:2008/04/20(日) 21:01:33
>>974
文字列書式化関数でバイナリ読み書きなんて勘弁してくれ。
989デフォルトの名無しさん:2008/04/21(月) 04:18:52
上のほうで話題になっていたスレッドとLINQの話をみて、
LINQの遅延評価とスレッドの結果が遅れてできるという、どことなく似た性質が興味深くて、ちょっとマルチCPU向けコード作ってみた。
関数型言語の様に、値=関数という概念を持ち込んでみたよ。
LambdaPool.BeginLambda が、結果を得る関数を引数に、結果を得る関数を返す、ただし計算はすぐ開始という仕組みです。
ためしにやってみた計算は二重積分 ∬sin(x)*cos(y)dxdy です。
990デフォルトの名無しさん:2008/04/21(月) 04:19:21
public class LambdaPool : IDisposable {
 List<EventWaitHandle> eventList = new List<EventWaitHandle>();
 List<Thread> threadList = new List<Thread>();
 Queue<ThreadStart> queue = new Queue<ThreadStart>();
 public void Dispose() { foreach (var item in threadList) if (item.IsAlive) item.Abort(); }
 public LambdaPool() {
  for (int i = 0; i < Environment.ProcessorCount; ++i) {
   var index = i;
   eventList.Add(new EventWaitHandle(false, EventResetMode.AutoReset));
   threadList.Add(new Thread(() => {
    while (true) {
     ThreadStart item = null;
     lock (queue) if (queue.Count != 0) item = queue.Dequeue();
     if (item != null) item();
     lock (queue) if (queue.Count != 0) continue;
     eventList[index].WaitOne();
    }
   }));
   threadList[index].Start();
  }
 }
 public Func<T> BeginLambda<T>(Func<T> lambda) {
  object result = null;
  EventWaitHandle eventWait = new EventWaitHandle(false, EventResetMode.ManualReset);
  lock (queue) queue.Enqueue(() => { result = lambda(); eventWait.Set(); });
  foreach (var item in eventList) item.Set();
  return () => { eventWait.WaitOne(); return (T)result; };
 }
}
991デフォルトの名無しさん:2008/04/21(月) 04:20:10
//マルチCPU
LambdaPool lambdaPool = new LambdaPool();
private void button1_Click(object sender, EventArgs e) {
 System.DateTime start = System.DateTime.Now;
 List<Func<double>> result = new List<Func<double>>();
 double delta = 0.0001;
 for (double gy = 0; gy <= Math.PI * 2; gy += delta) {
  var y = gy;
  result.Add(lambdaPool.BeginLambda(() => {
   double sum0 = 0.0;
   for (double x = 0; x <= Math.PI * 2; x += delta) {
    sum0 += Math.Sin(x) * Math.Cos(y) * delta * delta;
   }
   return sum0;
  }));
 }
 var sum1 = lambdaPool.BeginLambda(() => result.Sum((a0) => a0()))();
 System.DateTime end = System.DateTime.Now;
 System.Console.WriteLine("開始={0},終了={1},所要時間={2}", start, end, end - start);
 System.Console.WriteLine(sum1);
}
992デフォルトの名無しさん:2008/04/21(月) 04:20:36
//シングルCPU
private void button1_Click(object sender, EventArgs e) {
 System.DateTime start = System.DateTime.Now;
 double delta = 0.0001;
 double sum1 = 0.0;
 for (double y = 0; y <= Math.PI * 2; y += delta) {
  double sum0 = 0.0;
  for (double x = 0; x <= Math.PI * 2; x += delta) {
   sum0 += Math.Sin(x) * Math.Cos(y) * delta * delta;
  }
  sum1 += sum0;
 }
 System.DateTime end = System.DateTime.Now;
 System.Console.WriteLine("開始={0},終了={1},所要時間={2}", start, end, end - start);
 System.Console.WriteLine(sum1);
}
993デフォルトの名無しさん:2008/04/21(月) 04:23:43
結果です、Core2Quad QX9650 3.0GHz での結果です。

マルチCPU
開始=2008/04/21 3:26:58,終了=2008/04/21 3:28:15,所要時間=00:01:16.4980000
-9.26313842296857E-15

シングルCPU
開始=2008/04/21 3:31:27,終了=2008/04/21 3:35:57,所要時間=00:04:30.6180000
-9.26313842296857E-15

非スレッド270秒
マルチスレッド76秒
速度非 3.55倍

コードが超圧縮なのは、掲示板という事で勘弁してください。
270秒 ⇒ 76秒です、言語サポートがあると結構面白いことになりそうです。
994デフォルトの名無しさん:2008/04/21(月) 18:04:53
"PROLOG Programming for Artificial Intelligence" 邦訳名「AIプログラミング」
レベルのサンプルプログラムがあるC#のサイトがあったら、教えてください。
995デフォルトの名無しさん:2008/04/21(月) 18:31:19
>>990-992
非同期デリゲート呼出でやってみたんだけどどう?
static Func<double> future(Func<double> f)
{
    var r = f.BeginInvoke(null, null);
    return () => f.EndInvoke(r);
}
static void Main()
{
    var start = DateTime.Now;
    var result = new List<Func<double>>();
    double delta = 0.0001;
    for (double gy = 0; gy <= Math.PI * 2; gy += delta)
    {
        var y = gy;
        result.Add(future(() =>
        {
            double sum0 = 0.0;
            for (double x = 0; x <= Math.PI * 2; x += delta)
                sum0 += Math.Sin(x) * Math.Cos(y) * delta * delta;
            return sum0;
        }));
    }
    double sum1 = future(() => result.Sum((a0) => a0()))();
    var end = DateTime.Now;
    Console.WriteLine("開始={0},終了={1},所要時間={2}", start, end, end - start);
    Console.WriteLine(sum1);
}
996デフォルトの名無しさん:2008/04/21(月) 21:39:52
このLambdaPoolは手抜きなんで、デッドロックはするし、CPUの処理を食いつぶして他のアプリを不安定にします。
本気で書いたら、掲示板に収まらないのでこの程度にしてありますが・・・・
マルチコアCPUをもっているなら、このコードとIEと同時に使ってみてください、シングルコアPCなみに反応が悪くなります。
で、非同期デレゲートですが、これはThreadPoolを使います、これはもっとヤバイです、
これは高優先順位でI/Oの同期をとることを目的に作られています、
とりあえず、安易な非同期デレゲートはどういう使い方であれお勧めできないかもしれない。
本当はこういうコードを実行してCPUを占領したらOSが強権発動で優先順位の強制変更をしてくれるといいんですけどね。
997デフォルトの名無しさん:2008/04/21(月) 21:46:46
あっ、上のサンプルのコードではテッドロックはしません、そういう風に作ったので・・・
998デフォルトの名無しさん:2008/04/22(火) 00:30:01
自分もラムダ式というかデリゲートを渡して処理分散させるコード書いてる。
多用するとデバッグ時にいじるたびにやり直しになるのが困りもの(´・ω・`)
999デフォルトの名無しさん:2008/04/22(火) 01:00:06
1000デフォルトの名無しさん:2008/04/22(火) 01:00:13
ハイレベルすぎて何の意味があるのかわかりません
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。