1 名前:デフォルトの名無しさん mailto:sage [2018/04/06(金) 17:40:19.48 ID:oKXVP34zM.net] 「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。 他のスレッドでは書き込めないような低レベルな質問、 質問者自身なんだか意味がよく分からない質問、 ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。 内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。 なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。 C#に関係の無い話題や荒らしの相手や罵倒レスはやめてください >>980 を踏んだ人は新スレを建てて下さい。 >>980 が無理な場合、話し合って新スレを建てる人を決めて下さい。 ■関連スレ C#, C♯, C#相談室 Part95 mevius.5ch.net/test/read.cgi/tech/1508180530/ C#, C♯, C#相談室 Part93 https://mevius.5ch.net/test/read.cgi/tech/1492818720/ ■前スレ ふらっと C#,C♯,C#(初心者用) Part136 mevius.5ch.net/test/read.cgi/tech/1520057345/ ■コードを貼る場合は↓を使いましょう。 ideone.com/ https://dotnetfiddle.net/ ■情報源 https://msdn.microsoft.com/ja-jp/library/gg145045.aspx https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/index https://msdn.microsoft.com/en-us/library/gg145045.aspx referencesource.microsoft.com/ VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
313 名前:デフォルトの名無しさん mailto:sage [2018/05/03(木) 19:42:37.77 ID:hvfEvXXP0.net] >>308 https://ja.wikipedia.org/wiki/%E3%82%A2%E3%82%BB%E3%83%B3%E3%83%96%E3%83%AA_(%E5%85%B1%E9%80%9A%E8%A8%80%E8%AA%9E%E5%9F%BA%E7%9B%A4) 仮想マシン VES は定義されているようだ
314 名前:デフォルトの名無しさん mailto:sage [2018/05/03(木) 19:45:56.40 ID:Vq5AVdhm0.net] おい!初心者の内容じゃねーぞw
315 名前:デフォルトの名無しさん mailto:sage [2018/05/03(木) 20:04:38.77 ID:kS9rU1V5a.net] >>309 VESは最終段階のコンパイラだよ
316 名前:デフォルトの名無しさん mailto:sage [2018/05/03(木) 20:12:05.92 ID:OyWVOyw+0.net] JITコンパイルはVMとしては認めない派閥が存在することは認める
317 名前:デフォルトの名無しさん mailto:sage [2018/05/03(木) 20:31:23.35 ID:GKu15pasa.net] https://www.slideshare.net/ufcpp/ss-34533225 このスライドの67枚目の「良い例」のコードってこれで本当にいいの? MSDNのParallel.Forの解説には ---
318 名前: localFinally デリゲートはスレッドごとに 1 回呼び出され、各スレッドのローカル状態に対して最後の操作を行います。 このデリゲートは、同時に複数のスレッドで呼び出される可能性があります。したがって、共有変数へのアクセスを同期する必要があります。 --- と書いてあるから、countはアトミックに操作しないとまずい気がするんだけど https://msdn.microsoft.com/ja-jp/library/dd783299(v=vs.100).aspx [] [ここ壊れてます]
319 名前:デフォルトの名無しさん mailto:sage [2018/05/03(木) 21:13:05.22 ID:L6Rknns90.net] >>313 MSDNの使用例にも localState => Interlocked.Add(ref result, localState) とあるしそれで正しいと思うよ
320 名前:デフォルトの名無しさん mailto:sage [2018/05/03(木) 21:46:41.74 ID:GKu15pasa.net] >>314 いやだから、MSDNのサンプル通りにするなら、>>313 の localCount => count += localCount は、 localCount => Interlocked.Add(ref count, localCount) でないとまずいと思うんですが
321 名前:デフォルトの名無しさん mailto:sage [2018/05/03(木) 21:48:43.65 ID:ygisZEFQM.net] そうだねだからどうしたの 資料公開してる本人に言えばいいんじゃないの
322 名前:デフォルトの名無しさん mailto:sage [2018/05/03(木) 22:02:53.69 ID:nzAwdXFB0.net] 大して変わんねーよ そんなに処理分けたきゃ 別exeにしてキックしろよ 後はできるならOSがうまくやるし OSがうまくできなかったらそりゃできないんだろうよw
323 名前:デフォルトの名無しさん mailto:sage [2018/05/03(木) 22:05:27.65 ID:WY9OnNQR0.net] どうした発作か
324 名前:デフォルトの名無しさん mailto:sage [2018/05/03(木) 23:06:32.43 ID:L6Rknns90.net] >>315 いや、>>313 の言う通りと言ったつもりなんだが・・・ふらっと怖いな
325 名前:デフォルトの名無しさん [2018/05/03(木) 23:38:41.22 ID:aADwc6210.net] おバカwebを鵜呑みにしない有望な>>313 なんやからもう少し優しくレスしてやれよw
326 名前:デフォルトの名無しさん mailto:sage [2018/05/04(金) 00:16:38.85 ID:Xm9CVOioa.net] この例だとForよりAggregate使ったほうがいいな
327 名前:デフォルトの名無しさん mailto:sage [2018/05/04(金) 00:37:22.14 ID:pvqh60Bra.net] >>319 自分の日本語に疑問を持たない君の方が怖いよ 「これ(A)」でいいのか、Bじゃないのかって質問に「それ」で正しいと答えたら 質問した方は普通は正しいのは「これ」の方だと理解する
328 名前:デフォルトの名無しさん mailto:sage [2018/05/04(金) 02:08:40.41 ID:DbHU5BaK0.net] C♯でJavaScriptで生成されてるチャットサイトからコメントビューアを作りたいのですが、JavaScriptが生成したHTMLを取得するのに適したライブラリってどれでしょうか? Formアプリで作る予定ですが webBrowserコントロールが一番手軽でしょうか?
329 名前:デフォルトの名無しさん mailto:sage [2018/05/04(金) 02:10:39.64 ID:DbHU5BaK0.net] >>323 追記 使う.Net frameworkは4.6.1です Nugetで公開されてるライブラリ等でも問題ありません
330 名前:デフォルトの名無しさん mailto:sage [2018/05/04(金) 02:53:44.45 ID:JYHlDWX6M.net] javascriptで生成といっても生成元になるデータを何処かでリクエストしてる筈 そっちを解析して直接的にHttpClientでgetしたほうがええよ
331 名前:デフォルトの名無しさん mailto:sage [2018/05/04(金) 04:15:13.73 ID:DbHU5BaK0.net] ありがとうございます 単純にセッションが必要っぽそうだったのでHttpClientでもいけそうです 使い方調べ直します
332 名前:デフォルトの名無しさん mailto:sage [2018/05/04(金) 16:58:55.69 ID:wDfbuSiA0.net] おバカwebと言えば↓みたいに日本語と英語で全く逆のことが書いてあったりする 基本的にwebに書いてあることは疑ってかかったほうが良さそうね 日本語 https://docs.microsoft.com/ja-jp/dotnet/standard/base-types/best-practices-strings#recommendations_for_string_usage > 比較のために文字列を正規化する場合は、String.ToUpperInvariant メソッドではなく String.ToLowerInvariant メソッドを使用します。 英語 https://docs.microsoft.com/en-us/dotnet/standard/base-types/best-practices-strings#recommendations_for_string_usage > Use the String.ToUpperInvariant method instead of the String.ToLowerInvariant method when you normalize strings for comparison. (グーグル翻訳) 比較のために文字列を正規化するときは、String.ToLowerInvariantメソッドの代わりにString.ToUpperInvariantメソッドを使用します。
333 名前:デフォルトの名無しさん mailto:sage [2018/05/04(金) 17:22:00.73 ID:0gwAiFk4d.net] >>327 X:webに書いてあることは ○:日本語訳は
334 名前:デフォルトの名無しさん mailto:sage [2018/05/04(金) 19:43:22.77 ID:RYlEGIXb0.net] グラフィックの扱いについて教えてください panelに複数の画像イメージを貼り付けたいと思います (トランプのカードを任意の枚数置くような感じです) WidthとHeightをpanelのサイズに合わせて、Bitmapオブジェクトを 作ってそこに必要な画像を貼り付けて、最後にPaintイベントでその ビットマップを Graphics.DrawImage で表示すれば良さそうだ、という 認識です 問題はBitmapオブジェクトに画像を貼り付けることで、メソッドを 調べても、Bitmapオブジェクトの任意の場所に任意のイメージを 貼り付けるものはなさそうです そもそも用意した画像は Image.FromFile で準備しているのですが、 Imageオブジェクトを貼り付けられるのは Graphics.DrawImage メソッドになるので、そもそも Bitmap オブジェクトを用意すると いう発想が間違っているような気もします 多分いろいろ間違って認識しているので、どこから考え直せばよいか 教えていただけると嬉しいです
335 名前:デフォルトの名無しさん mailto:sage [2018/05/04(金) 19:54:32.04 ID:EvkA5vHv0.net] >>329 ベースの画像のいくつかの任意の位置に画像を貼り付ける描画ならそれで間違っていないけど https://msdn.microsoft.com/ja-jp/library/system.drawing.graphics.drawimage(v=vs.110).aspx https://msdn.microsoft.com/ja-jp/library/558kfzex(v=vs.110).aspx どこを勘違いして悩んでいるのかいまいちわからない とりあえずBitmap オブジェクトはImageオブジェクトの一種 他にMetaFileとかあるから そしてGraphics.DrawImageメソッドを使って貼り付けてもベースのBitmap オブジェクトはBitmap オブジェクトのまま
336 名前:デフォルトの名無しさん mailto:sage [2018/05/04(金) 20:25:52.55 ID:RYlEGIXb0.net] >>330 私の認識は、最終的に描画したいビットマップを用意して、それを Paint イベントで 描画するというものです Panel1_Paint(object sender, PaintEventArgs e) { e.Graphics.DrawImage(canvas, 0, 0); } で、上記の例で Bitmap canvas; とでもして用意したビットマップに、任意の画像を 貼り付ける方法を知りたいのです 例えば256x256ピクセルのサイズで用意したビットマップに、32x32ピクセルの 画像を3個位貼り付けた canvas を用意したいというものです 「そうではなくて、最終的に描画したいものはGraphicsオブジェクトで用意して、 Paintイベントで毎回描画するのだ」というのが正なのかもしれません Panel1_Paint(省略) { e.Graphics.DrawImage(image_1, image_1_x, image_1_y); e.Graphics.DrawImage(image_2, image_2_x, image_2_y); ... } といった感じで でもなんだか、毎回Paintイベントハンドラに描画処理を全部書くのは変な感じがして、 描画したい画像を用意するのと、実際に描画するのは別の処理ではないかと思っている 次第です
337 名前:デフォルトの名無しさん mailto:sage [2018/05/04(金) 20:30:54.11 ID:Ad2tmUBO0.net] 描画したい画像を用意するのと、それを描画するのは当然別の処理だ。 でもアニメーションさせたいとか画像の変更を即座に描画に反映させたいとかなら、用意した足で再描画させるしかないだろ?
338 名前:デフォルトの名無しさん mailto:sage [2018/05/04(金) 20:36:30.50 ID:EvkA5vHv0.net] >>331 何でイベントでやるのか知らないけど複数の描画を同時にやるメソッドはなかったと思うよ https://dobon.net/vb/dotnet/graphics/index.html Bitmap canvas=new Bitmap(x,y); Graphics g = Graphics.FromImage(canvas); Graphics.DrawImage(image_1, image_1_x, image_1_y); Graphics.DrawImage(image_2, image_2_x, image_2_y);
339 名前:デフォルトの名無しさん mailto:sage [2018/05/04(金) 20:38:50.67 ID:EvkA5vHv0.net] あ、ごめん Graphics g = Graphics.FromImage(canvas); g.DrawImage(image_1, image_1_x, image_1_y); g.DrawImage(image_2, image_2_x, image_2_y); だった
340 名前:デフォルトの名無しさん mailto:sage [2018/05/04(金) 20:49:55.24 ID:RYlEGIXb0.net] >>332 アニメーションさせたいとか、そういう意図はないです 単に、描画したい画像を用意するのに、Bitmapオブジェクトにさらに画像を 貼り付ける方法がわからなくて悩んでいます >>333 イベントでやってるのは、単に参考にしたサイトで「Paintイベントハンドラで 処理する」と書いてあったので、それを鵜呑みにしただけです https://dobon.net/vb/dotnet/graphics/drawimage.html これを見て気づきましたが、そもそもパネルに直接描こうとするのが間違いで、 パネルにPictureBoxを貼り付けた上でそこに置けば良いのかな?
341 名前:デフォルトの名無しさん mailto:sage [2018/05/04(金) 20:54:32.05 ID:EvkA5vHv0.net] >>335 どっちでも同じだと思う Graphics g = Graphics.FromImage(panel1.BackGroundImage); でやれば直接パネルに書き込めるし ただ大きい画像を表示して画像の表示位置をスクロールさせたいのならパネルの上にPictureBoxが基本 とりあえず書いて動かしてみたら
342 名前:デフォルトの名無しさん mailto:sage [2018/05/04(金) 21:05:17.61 ID:aP3h8uSia.net] >>335 実現したい要件だけを明確に書いた方がいいと思うよw そこが明確じゃないのに「俺が考えた実装方法」ばっかり詳細に書くから 答える方も何を返答していいのか分からないw
343 名前:デフォルトの名無しさん mailto:sage [2018/05/04(金) 21:11:39.38 ID:RYlEGIXb0.net] >>337 実現したいことは、「任意の画像を任意の場所に配置したイメージを、panelに描画したい」です これは明確で、それを実装するための方法でどう悩んでいるかが正しく伝わらないと、答える方も こちらのレベルがわからなくて困るかと思ってました 実現したいことがちゃんと伝わっていませんでしたか それ以前の問題でしたね。。。
344 名前:デフォルトの名無しさん mailto:sage [2018/05/04(金) 21:43:04.80 ID:pJ6Zbbxdp.net] ファイル読んでバインドするだけちゃうのか?
345 名前:デフォルトの名無しさん mailto:sage [2018/05/04(金) 22:52:54.89 ID:IMcj9GIN0.net] >>338 dobon.netにあるじゃん
346 名前:デフォルトの名無しさん mailto:sage [2018/05/05(土) 01:53:47.84 ID:US1Viqbq0.net] bmp1が配置先のイメージ、 bmp2がbmp1に配置したいイメージだとしたら以下になる Graphics g = Graphics.FromImage(bmp1); g.DrawImage(bmp2, x, y); // bmp1の(x, y)にbmp2を書き込む g.Dispose(); pictureBox1.Image = bmp1; これだけでパネルにbmp1が表示される
347 名前:デフォルトの名無しさん mailto:sage [2018/05/05(土) 01:54:36.93 ID:US1Viqbq0.net] あ、パネルにPictureBox貼ってる前提ね
348 名前:デフォルトの名無しさん mailto:sage [2018/05/05(土) 05:38:36.94 ID:LRJiKh0v0.net] >>341 ありがとうございます 思っていることが問題なく実現できました できるようになってみると、一体何を悩んでいたのか、自分でもわからなくなってしまいました 多分、DrawImage で書き込む先がVRAMだと思い込んでいたのでしょう
349 名前:デフォルトの名無しさん mailto:sage [2018/05/06(日) 01:21:02.23 ID:dl2mQyCb0.net] private void Form1_ResizeBegin(object sender, EventArgs e) { leftEdge = this.Left; rightEdge = this.Right; topEdge = this.Top; bottomEdge = this.Bottom; } private void Form1_ResizeEnd(object sender, EventArgs e) { if ((rightEdge < this.Right) && (topEdge > this.Top)) { // 処理に入らない } } このコードでフォームを右上にドラッグして拡大した場合に処理に入らないのですがどこがおかしいでしょうか
350 名前:デフォルトの名無しさん mailto:sage [2018/05/06(日) 01:31:51.93 ID:HfMj07lt0.net] 右上にってことは事後の方が top の値が小さくなってるからじゃないの?
351 名前:デフォルトの名無しさん mailto:sage [2018/05/06(日) 01:32:20.44 ID:HfMj07lt0.net] ああ、そう書いてあるのか。失礼。
352 名前:デフォルトの名無しさん mailto:sage [2018/05/06(日) 01:40:54.74 ID:LGFxrhOP0.net] >>344 イベント有効になっている? Form1_ResizeEndのメソッドに処理が入っているかそこから確認 int leftEdge, rightEdge,topEdge ,bottomEdge; public Form1() { InitializeComponent(); this.ResizeBegin += Form1_ResizeBegin; this.ResizeEnd += Form1_ResizeEnd; } private void Form1_ResizeBegin(object sender, EventArgs e) { this.Text = "start"; leftEdge = this.Left; rightEdge = this.Right; topEdge = this.Top; bottomEdge = this.Bottom; } private void Form1_ResizeEnd(object sender, EventArgs e) { this.Text = String.Format("{0}:{1}", (rightEdge < this.Right), (topEdge > this.Top)); if ((rightEdge < this.Right) && (topEdge > this.Top)) { this.Text = "OK"; } } これで動いた
353 名前:デフォルトの名無しさん mailto:sage [2018/05/06(日) 01:45:28.35 ID:mBsERy4z0.net] private void DataGridViewFilter() { BindingSource objBind; DataTable objData; string strFilter; objData = (DataTable)DataGridView1.DataSource; if (IsNothing(objData) == false) { objBind = new BindingSource(); objBind.DataSource = objData; strFilter = "Color like '%" + txt_Condition.Text + "%'"; objBind.Filter = strFilter; } }
354 名前:デフォルトの名無しさん mailto:sage [2018/05/06(日) 02:05:39.13 ID:dl2mQyCb0.net] >>347 ご回答ありがとうございます イベントは有効です 左や上や左上への拡大縮小ドラッグは正常なのですが左下や右上がおかしいです 提供していただいたコードを試したのですが、何故かは分からないのですが rightEdge < this.Right がfalseになっています もう少し調べてみます
355 名前:デフォルトの名無しさん mailto:sage [2018/05/06(日) 02:22:41.56 ID:xovvhFEya.net] 申し訳ないけど、問題を再現できるそのまんまのコードを提示していない時点で 確実に原因はあなたの勘違いにあると断言できる
356 名前:デフォルトの名無しさん [2018/05/06(日) 05:58:39.10 ID:CBGkbUql0.net] Listを値渡しすべき所が参照渡しになってたせいで くっそハマったんだけど こういうのって、C#の解説本1冊読めば 注意しろって書いてあるもんなの? 参照渡し云々って単語はかろうじて知ってて ↓のサイトをたまたま見つけて、偶然解決出来たけど https://webbibouroku.com/Blog/Article/list-copy エラーや例外にならないバグが怖すぎる・・・
357 名前:デフォルトの名無しさん mailto:sage [2018/05/06(日) 06:08:47.32 ID:994JP5I00.net] そんなものここで聞けば3秒で解決するし
358 名前:デフォルトの名無しさん mailto:sage [2018/05/06(日) 08:39:03.59 ID:j24ysXtO0.net] c#って物体X(?)は全部参照渡しになるよね
359 名前:デフォルトの名無しさん mailto:sage [2018/05/06(日) 08:48:15.69 ID:6gN3mvyQ0.net] >>351 それ値渡しじゃない
360 名前:デフォルトの名無しさん mailto:sage [2018/05/06(日) 09:09:18.32 ID:9GXSG5IC0.net] イメージの配置はできるようになりましたが、いろいろ触っていると、チラツキが 気になるようになってきました テストしてみたところ、下記のレベルでもチラツキが発生します private void timer1_Tick(object sender, EventArgs e) { Graphics g = Graphics.FromImage(canvas); g.FillEllipse(bg_brush, x, y, radius, radius); x += 5; g.FillEllipse(fg_brush, x, y, radius, radius); count++; g.Dispose(); pictureBox1.Image = canvas; if (count == 10) { count = 0; timer1.Stop(); } } timer1.Intervalは100msにしてあります チラつきを押さえるには、フォームの DoubleBufferd を true にすると良いと見ましたが、 true にしても false にしても変わりないようです そもそも PictureBox は内部処理でダブルバッファリングを行っているとも見ました まだなにかできることはあるのでしょうか
361 名前:デフォルトの名無しさん mailto:sage [2018/05/06(日) 09:36:21.79 ID:9GXSG5IC0.net] 書いてませんでしたが、bg_brushは背景色の、fg_brushは前景色のブラシです Brush bg_brush = new SolidBrush(SystemColors.Control); Brush fg_brush = new SolidBrush(Color.Black); で定義しています
362 名前:デフォルトの名無しさん mailto:sage [2018/05/06(日) 09:54:38.21 ID:RTzVBomo0.net] canvasはどんな風に設定しているの?
363 名前:デフォルトの名無しさん mailto:sage [2018/05/06(日) 10:06:54.11 ID:9GXSG5IC0.net] canvas = new Bitmap(pictureBox1.Width, pictureBox1.Height); として定義しています
364 名前:デフォルトの名無しさん mailto:sage [2018/05/06(日) 10:36:38.03 ID:RTzVBomo0.net] DoubleBufferdとか触らずともこっちではちらつかないけどなあ ちらつくってのはどういうふうに見えることを言ってるの? panelやpictureBoxのサイズやradiusの値もさらしてみては?
365 名前:デフォルトの名無しさん mailto:sage [2018/05/06(日) 10:50:11.40 ID:IbwjU9Qn0.net] どこで何やってんの不明瞭だから当てずっぽうだが 下手に自前描画してるチラつくなら大体OnPaintBackgroundのせい
366 名前:デフォルトの名無しさん mailto:sage [2018/05/06(日) 10:55:03.54 ID:9GXSG5IC0.net] https://ideone.com/s4ddqO これが全コードです 空のWindowsフォームアプリケーションで生成されたフォームに、ボタンとパネル、 PictureBoxを配置しただけの状態です パネルとPictureBoxは、DockをFillにしてウィンドウサイズに合わせてあります
367 名前:デフォルトの名無しさん mailto:sage [2018/05/06(日) 10:56:51.16 ID:9GXSG5IC0.net] これで、timer1のIntervalを50msにすると、はっきり分かる程度にちらつきます
368 名前:デフォルトの名無しさん mailto:sage [2018/05/06(日) 13:14:55.43 ID:gzoDeGmX0.net] 垂直同期しろ。
369 名前:デフォルトの名無しさん mailto:sage [2018/05/06(日) 13:31:21.62 ID:o/aLqSU5a.net] >>362 やってみたけとちらついたりはしないねw ただフレームレートが低いから滑らかに見えないだけ [] [ここ壊れてます]
371 名前:デフォルトの名無しさん mailto:sage [2018/05/06(日) 15:35:36.42 ID:MOQB+J+Ha.net] 解決のヒントにはならないだろうけど ちらつきって何かということについて すでに表示されてるものが一瞬透明に見えるから表示がおかしく見えること たとえば半径100の円が横に5ドット動くとする 普通に考えたらほとんどの円に背景は隠れたままだけど何も考えないで適当にやると 背景が一瞬見えてしまう 一度円を消してなにもない状態を表示して 次に円を書いてるから問題がある 何もない状態を表示しなければいい
372 名前:デフォルトの名無しさん mailto:sage [2018/05/06(日) 18:19:28.93 ID:9GXSG5IC0.net] >>364 環境の問題ですか・・・ 一応ディスプレイのリフレッシュレートは60Hz、タイマー設定が50msだと20Hzあれば 十分ですので、あまり関係ない気がするのですが でも私の環境でしか出ないのであれば、環境依存かもしれません >>365 これを避けるためにダブルバッファリングをするわけですし、書き換えた後のビットマップを PictureBoxに貼り付けるようにして、描画途中では貼っていません
373 名前:デフォルトの名無しさん mailto:sage [2018/05/06(日) 18:22:22.08 ID:gzoDeGmX0.net] だからハードの違いだって言ってんだろw
374 名前:デフォルトの名無しさん mailto:sage [2018/05/06(日) 18:25:15.44 ID:w10wIaHya.net] >>366 いやいや何でそういう話になるのw たぶん環境の問題なんかじゃなく、あなたが低フレームレートに起因する カクカクした動きをちらつきだと誤認してるだけだと思うよw
375 名前:デフォルトの名無しさん mailto:sage [2018/05/06(日) 18:30:35.56 ID:gzoDeGmX0.net] アホばっかり。
376 名前:デフォルトの名無しさん mailto:sage [2018/05/06(日) 18:55:10.27 ID:9GXSG5IC0.net] >>368 カクカクした動きとチラつきを同一視しているわけではありません >>365 が書いたように、今回の例だと黒い円が一瞬消えているような感じがします 移動量の x += 10; をもっと少なくすれば目立たなくなりますが、それでも なんとなく嫌な感じがします でも言葉で説明するのは難しいですね 低フレームレートの認識を誤解していたようですが、インターバルを100msとか 50msとかだとディスプレイのリフレッシュレート(あるいは人間の認識力)に比べて 低すぎるので、かえって目立ってしまうということでしょうか? 確かに、インターバルを思い切って5msとかにしてみると、チラつきは軽減されてきた 気がします
377 名前:デフォルトの名無しさん mailto:sage [2018/05/06(日) 19:33:59.43 ID:7/UIZFPx0.net] ちょっと改変して逆にチラツキをわかるようにしてみた https://ideone.com/3X8oJh WinFormプロジェクトを新規で作って元のソースを全部消したうえで、このソースを既存の項目として追加 上がPictureBoxで下がPanel >>370 PictureBoxのダブルバッファがデフォルトで有効なのは知っているのを確認したので その上でPanelはデフォルトでダブルバッファが有効だというのを念頭に入れてコードを実行してほしい 同じオブジェクトの動きだが、うちで確認する限りは下はあきらかにチラツキがあって上は目立たない >>365 >何もない状態を表示しなければいい というわけで先に描画して動いた部分だけを消すという動作を実現してみたつもり だったんだけど、移動量を大きくするとカクツキがどうしても目立ってしまってうまくいかない。ギブアップw >>370 もっとGDI+の動作を把握するとかゲームなどでの実装方法を探すかした方がいいと思う 残念ながら俺の知識ではここまで
378 名前:>>370 mailto:sage [2018/05/06(日) 19:37:36.72 ID:7/UIZFPx0.net] ごめん >Panelはデフォルトでダブルバッファが有効だというのを念頭に入れて Panelはデフォルトでダブルバッファが無効だというのを念頭に入れて の間違い
379 名前:デフォルトの名無しさん mailto:sage [2018/05/06(日) 20:17:55.74 ID:LW3/RgRJa.net] うーんw >>361 のコード自体がダブルバッファリングの実装なので、 少なくともGDI+を使う限り、これで本当にちらつくなら何をやってもちらつき回避は不可能。 何度も言うけど、少なくとも俺の環境では低フレームレート特有の不自然さはあっても フリッカーは確認できない しつこいようだけど、俺は質問者がちらつき(フリッカー)がどういう現象か 理解してないだけのように思う
380 名前:デフォルトの名無しさん mailto:sage [2018/05/06(日) 20:20:58.90 ID:j24ysXtO0.net] まあ、unity使ってもDirectX使ってもスクロールとかなめらかにならないしね グラボも汚いってのも考慮に入れる 市販のゲームでもスクロールしてるときはカクカクグシャグシャはデフォ
381 名前:デフォルトの名無しさん mailto:sage [2018/05/06(日) 20:21:41.45 ID:9GXSG5IC0.net] >>371 ありがとうございます 私が確認しても、確かに上下で明らかにチラつきが違い、下ははっきりとわかります 上はほとんどわからないレベルですね PictureBoxもPanelも、どちらも出来上がったビットマップを貼り付けているのですから 同じ表示になりそうな気がしますが違いますね これをちゃんと理解できれば解決できそうです
382 名前:デフォルトの名無しさん mailto:sage [2018/05/06(日) 20:36:30.01 ID:LW3/RgRJa.net] >>371 のコートだとたしかにフリッカーが確認できるねw >>373 は撤回します
383 名前:デフォルトの名無しさん mailto:sage [2018/05/06(日) 20:39:37.09 ID:9GXSG5IC0.net] >>373 私が「チラツキ」と表現しているのは、>>371 が上げてくれたプログラムの 下側、panelで発生している現象です 私の理解では、>>371 でなぜ表示に違いが生じるのかがわかりません どちらも、加工後のcanvasを貼り付けているはずなのに >>371 でやっていることは、ダブルバッファリングではないのでしょうか? >>371 のプログラムを実行してみて、違いはPictureBoxをウィンドウに直接 貼り付けているか、panelを置いてその上に貼り付けているか、です 私のテストプログラムでは、panelを置いてその上にpictureBox1を置いてます これが影響するのでしょうか
384 名前:デフォルトの名無しさん mailto:sage [2018/05/06(日) 20:49:20.18 ID:7/UIZFPx0.net] https://ideone.com/PNPIlj 蛇足だろうけどnew BitmapじゃなくPictureBox.Imageを直接描き変えるもの >>377 370で何をしたかったかというと「ダブルバッファリングではこれ以上改善できない」事の証明 >panelを置いてその上にpictureBox1を置いてます それは多分関係ない。panelに背景を設定すると話が変わると思うけど 実際に改善するには移動量を少なくして滑らかに見せるくらいしかおもいつかない 消える側の方でなく進行方向側でカクついているんだよなあ・・・
385 名前:デフォルトの名無しさん mailto:sage [2018/05/06(日) 21:02:31.57 ID:9GXSG5IC0.net] >>378 試してみました >>371 と変わらない感じですね これまで質問してきた趣旨とは変わってしまいますが、 Graphics g = Graphics.FromImage(pictureBox1.Image); これでビットマップを書き換えた後に pictureBox1.Image を書き換えていないと いうことは、いちいち canvas ビットマップを用意して細工しなくてもよかったと いうことでしょうか で、本質ですが、ご提供いただいたテストプログラムでは明らかにチラつきの 改善が見られるということはダブルバッファリングは機能している、これ以上 気になるのであれば、それは滑らかさの問題であってチラつきの問題ではない、 と認識するのが良さそうですね
386 名前:デフォルトの名無しさん mailto:sage [2018/05/06(日) 21:19:50.71 ID:IbwjU9Qn0.net] 下PanelはBackgroundImage使ってるのが悪いんじゃねえかなあ canvasはPanelのPaintで描画するようにして PanelのDoubleBufferedをtrueにするかOnPaintBackgroundの無効化でチラ付かなくなったよ あとチラつきとは関係ないけどお行儀的には再描画はTickで Invalidate(true)呼び出してPaintのタイミングはフレームワークに任せるべし Tick毎に無駄にImage/BackgroundImageに突っ込んでるから結果的に自分で再描画してるけど
387 名前:デフォルトの名無しさん mailto:sage [2018/05/06(日) 21:52:55.18 ID:LW3/RgRJa.net] ああ、やっぱり俺の認識で合ってるねw 何だかおかしいと思ったが >>377 フリッカーを誤解してないのは分かったけど、>>361 のコードでフリッカーなんか 発生しないってだから
388 名前:デフォルトの名無しさん mailto:sage [2018/05/06(日) 23:08:48.35 ID:s/HjZ7Qd0.net] >>351 それは参照渡しになってたわけじゃない C#の参照渡しはhoge(ref list)のようにrefがつく あなたがハマったのは参照の値渡しでインスタンスは複製されないということ ぺらぺらの入門書とかだとわからんが、ジェネリックやクラスをちゃんと学べる程度の本なら載ってるはず
389 名前:デフォルトの名無しさん mailto:sage [2018/05/06(日) 23:23:27.04 ID:gzoDeGmX0.net] グラボの性能差だから、ちらつき。
390 名前:デフォルトの名無しさん [2018/05/06(日) 23:49:17.66 ID:5astaXB20.net] >>351 List固有の問題ではなく、classは全て参照型だからだ。 だから、=で代入しても同じオブジェクトを指すだけ。 ちなみにstructは値型。こっちなら=で代入したらオブジェクトが複製される。
391 名前:デフォルトの名無しさん mailto:sage [2018/05/07(月) 01:29:04.63 ID:inVQGvpaa.net] >>361 をFPSと速度を変えられるようにしてみたけど 思ったより面白くもないし動作も滑らかじゃないなw どっちにしろやっぱりフリッカーは発生しない https://ideone.com/E3V57h ところで、タイトルバーをドラッグしたりすると画面の更新が止まる問題を 回避する方法ってなかったっけ?
392 名前:デフォルトの名無しさん mailto:sage [2018/05/07(月) 01:32:11.28 ID:inVQGvpaa.net] ああ、今思ったけど、FPSは本当は実測した値を表示すべきだねw >>385 はタイマーのインターバルから計算した理論値で実測値じゃない
393 名前:デフォルトの名無しさん mailto:sage [2018/05/07(月) 01:32:57.05 ID:3karsGmmp.net] グラボやドライバーの違いで発生する問題を自分のところじゃ発生しないからって頭ごなしに否定する奴はどうして生きてるんだろうな?
394 名前:デフォルトの名無しさん mailto:sage [2018/05/07(月) 01:42:18.83 ID:inVQGvpaa.net] >>387 それは君が勝手にそう思ってるだけw そんな問題はWin9xの時代だって存在しなかったよ っていうか、言っちゃわるいけどフリッカーが発生する原因を理解していればそんな間抜けな台詞は 出てこない
395 名前:デフォルトの名無しさん mailto:sage [2018/05/07(月) 01:43:57.94 ID:inVQGvpaa.net] なんか垂直同期(笑)とか書いてるのもいたけど、 頭の中80年代で止まってるんじゃなかろうかw
396 名前:デフォルトの名無しさん [2018/05/07(月) 04:32:44.15 ID:S2Y5gzQd0.net] DataGridViewで、複数のカラムを基準にソートするにはどうしたらいいでしょうか。 以下のようなイメージです。 元データ ------ 4 2 1 4 2 1 5 4 6 7 1 3 1 6 これを、カラムのヘッダーセルのクリック操作だけで、以下のように出来るようにしたいです。 ------ 1 3 1 4 1 6 2 1 4 2 5 4 6 7
397 名前:デフォルトの名無しさん mailto:sage [2018/05/07(月) 06:24:03.69 ID:SlIACPlK0.net] プロパティだけでは無理 各列のSortModeはAutomatic以外にして ColumnHeaderClickイベントで自分でソートする必要がある 実際にどうやってソートするかはDataGridViewに表示してるデータをどうやっているか次第 ところで下の状態で1番目の方のカラムヘッダをクリックしたらどうなるの? とか色々場合があってUIというかUX?を決定するのが結構面倒
398 名前:デフォルトの名無しさん mailto:sage [2018/05/07(月) 06:43:05.39 ID:UbBhnDZYM.net] さすがに垂直同期はネタだろ 釣られる奴がいるとは思わなかったけど w
399 名前:デフォルトの名無しさん mailto:sage [2018/05/07(月) 07:18:03.31 ID:3karsGmmp.net] ググって事実を知ったんだな。そんなに悔しいのか?
400 名前:デフォルトの名無しさん mailto:sage [2018/05/07(月) 08:25:49.50 ID:H7YotaIo0.net] >>390-391 複数列でのソートは、Kotlin なら、 配列.sortedWith(compareBy({ 列1 }, { 列2 })) C# は、よく知らないけど、こういう感じ? 配列.OrderBy(列1).ThenBy(列2)
401 名前:デフォルトの名無しさん mailto:sage [2018/05/07(月) 14:38:50.30 ID:iApxgodj0.net] 教えてください キャストが上手くできずに困っています 具体的には、VisualStudioでデバッグのウォッチウィンドウに Enumerable.Empty<int>() is IEnumerable<object> と入力するとtrueと表示されるので少なくとも条件が整えば IEnumerable<int> は IEnumerable<object> に キャストできるとおもうのですが、プログラム上で安直に Console.WriteLine(Enumerable.Empty<int>() is IEnumerable<object>); を実行すると画面にFalseと表示されてしまいます ウォッチウィンドウ
402 名前:上とプログラム上で何か条件の違いがあって このようなことが起こっているのだとは思いますが、理解が不十分で解決方法が分かりません そもそもIEnumerable<T>のTは共変なのでintがobjectにアップキャストできる以上 IEnumerable<int>も無条件でIEnumerable<object>にキャストできると 思っていたのですが、この部分に何か誤解があるのでしょうか VisualStudio15.6.7、コンソールアプリ、ターゲットフレームワーク4.7.1でテストしています よろしくお願いします [] [ここ壊れてます]
403 名前:デフォルトの名無しさん mailto:sage [2018/05/07(月) 18:57:27.81 ID:cAXvX5WKa.net] >>395 値型は不変だったような ufcpp.net/study/csharp/sp4_variance.html#value イミディエイトだとs演算子がtrueを返す理由は分かりませんw 何でしょうね
404 名前:デフォルトの名無しさん mailto:sage [2018/05/07(月) 21:52:56.92 ID:iApxgodj0.net] >>396 レスどうもありがとうございます。その後色々と試してみると、プログラムで Console.WriteLine((Enumerable.Repeat(4649, 1) as IEnumerable<object>)?.First() ?? 184); を実行すると画面には184と表示され、教えていただいとことと辻褄が合うように思います また、これまでの結果から考えてウォッチウィンドウで (Enumerable.Repeat(4649, 1) as IEnumerable<object>)?.First() ?? 184 の値を調べれば4649と表示されるのかなと思いきや「メモリを読み取ることができません」と表示されたので、 こちらの挙動はおっしゃる通り分からない(バグ?)と考えるしかなさそうです ジェネリックでないIEnumerableはLINQが使えないのでこれまで if (x is IEnumerable<object> enumerableObject) { ... } と書く場面があったのですが、これではIEnumerable<値型>が拾えなさそうなので if (x is IEnumerable enumerable) { var enumerableObject = enumerable as IEnumerable<object> ?? enumerable.Cast<object>(); ... } とでも書いておこうかと思います(今のプログラムではxがジェネリックでないIEnumerableになることはないのですが) もっと良い方法があれば教えてもらえると嬉しいです
405 名前:デフォルトの名無しさん [2018/05/09(水) 00:08:06.32 ID:98vw71AM0.net] 名前空間A と名前空間A.B がある場合に、A.B内からAのクラスを扱うにはどうすればいいのですか?
406 名前:デフォルトの名無しさん mailto:sage [2018/05/09(水) 01:14:34.94 ID:KTiGjU5t0.net] >>322 Aをusingすればよい
407 名前:デフォルトの名無しさん mailto:sage [2018/05/09(水) 01:15:21.71 ID:KTiGjU5t0.net] なんかすげーレス間違えたけど >>398 宛
408 名前:デフォルトの名無しさん mailto:sage [2018/05/09(水) 01:47:53.29 ID:lSrhXmV/0.net] そもそも名前空間ってどうやって扱うのが正しいの?
409 名前:デフォルトの名無しさん [2018/05/09(水) 02:09:09.87 ID:98vw71AM0.net] >>400 クラスとは違って、やはりそうやって使うものなのですか
410 名前:デフォルトの名無しさん mailto:sage [2018/05/09(水) 02:25:39.99 ID:PD0iDBLsp.net] 完全表記しても良いんだよ?
411 名前:デフォルトの名無しさん mailto:sage [2018/05/09(水) 17:57:38.22 ID:8iDq54Sd0.net] 嫌なら全部同じ名前空間内に入れ込んでしまえ 悩まなくて済むぞ
412 名前:デフォルトの名無しさん mailto:sage [2018/05/09(水) 18:15:06.67 ID:GFIhYWfG0.net] 別に名前空間分ける意味ないよな。
413 名前:デフォルトの名無しさん mailto:sage [2018/05/09(水) 18:19:36.14 ID:nbiQ9nbF0.net] 分業の為の仕組み