ふらっと C#,C♯,C#(初心者用) Part137
■ このスレッドは過去ログ倉庫に格納されています
「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。
他のスレッドでは書き込めないような低レベルな質問、
質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。
内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。
なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。
C#に関係の無い話題や荒らしの相手や罵倒レスはやめてください
>>980を踏んだ人は新スレを建てて下さい。
>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。
■関連スレ
C#, C♯, C#相談室 Part95
http://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
http://mevius.5ch.net/test/read.cgi/tech/1520057345/
■コードを貼る場合は↓を使いましょう。
http://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
http://referencesource.microsoft.com/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured >>365
いやいや何でそういう話になるのw
たぶん環境の問題なんかじゃなく、あなたが低フレームレートに起因する
カクカクした動きをちらつきだと誤認してるだけだと思うよw >>367
カクカクした動きとチラつきを同一視しているわけではありません
>>364
が書いたように、今回の例だと黒い円が一瞬消えているような感じがします
移動量の x += 10; をもっと少なくすれば目立たなくなりますが、それでも
なんとなく嫌な感じがします
でも言葉で説明するのは難しいですね
低フレームレートの認識を誤解していたようですが、インターバルを100msとか
50msとかだとディスプレイのリフレッシュレート(あるいは人間の認識力)に比べて
低すぎるので、かえって目立ってしまうということでしょうか?
確かに、インターバルを思い切って5msとかにしてみると、チラつきは軽減されてきた
気がします ちょっと改変して逆にチラツキをわかるようにしてみた
https://ideone.com/3X8oJh
WinFormプロジェクトを新規で作って元のソースを全部消したうえで、このソースを既存の項目として追加
上がPictureBoxで下がPanel
>>369
PictureBoxのダブルバッファがデフォルトで有効なのは知っているのを確認したので
その上でPanelはデフォルトでダブルバッファが有効だというのを念頭に入れてコードを実行してほしい
同じオブジェクトの動きだが、うちで確認する限りは下はあきらかにチラツキがあって上は目立たない
>>364
>何もない状態を表示しなければいい
というわけで先に描画して動いた部分だけを消すという動作を実現してみたつもり
だったんだけど、移動量を大きくするとカクツキがどうしても目立ってしまってうまくいかない。ギブアップw
>>369
もっとGDI+の動作を把握するとかゲームなどでの実装方法を探すかした方がいいと思う
残念ながら俺の知識ではここまで ごめん
>Panelはデフォルトでダブルバッファが有効だというのを念頭に入れて
Panelはデフォルトでダブルバッファが無効だというのを念頭に入れて
の間違い うーんw
>>360のコード自体がダブルバッファリングの実装なので、
少なくともGDI+を使う限り、これで本当にちらつくなら何をやってもちらつき回避は不可能。
何度も言うけど、少なくとも俺の環境では低フレームレート特有の不自然さはあっても
フリッカーは確認できない
しつこいようだけど、俺は質問者がちらつき(フリッカー)がどういう現象か
理解してないだけのように思う まあ、unity使ってもDirectX使ってもスクロールとかなめらかにならないしね
グラボも汚いってのも考慮に入れる
市販のゲームでもスクロールしてるときはカクカクグシャグシャはデフォ >>370
ありがとうございます
私が確認しても、確かに上下で明らかにチラつきが違い、下ははっきりとわかります
上はほとんどわからないレベルですね
PictureBoxもPanelも、どちらも出来上がったビットマップを貼り付けているのですから
同じ表示になりそうな気がしますが違いますね
これをちゃんと理解できれば解決できそうです >>370のコートだとたしかにフリッカーが確認できるねw
>>372は撤回します >>372
私が「チラツキ」と表現しているのは、>>370が上げてくれたプログラムの
下側、panelで発生している現象です
私の理解では、>>370でなぜ表示に違いが生じるのかがわかりません
どちらも、加工後のcanvasを貼り付けているはずなのに
>>370でやっていることは、ダブルバッファリングではないのでしょうか?
>>370のプログラムを実行してみて、違いはPictureBoxをウィンドウに直接
貼り付けているか、panelを置いてその上に貼り付けているか、です
私のテストプログラムでは、panelを置いてその上にpictureBox1を置いてます
これが影響するのでしょうか https://ideone.com/PNPIlj
蛇足だろうけどnew BitmapじゃなくPictureBox.Imageを直接描き変えるもの
>>376
370で何をしたかったかというと「ダブルバッファリングではこれ以上改善できない」事の証明
>panelを置いてその上にpictureBox1を置いてます
それは多分関係ない。panelに背景を設定すると話が変わると思うけど
実際に改善するには移動量を少なくして滑らかに見せるくらいしかおもいつかない
消える側の方でなく進行方向側でカクついているんだよなあ・・・ >>377
試してみました
>>370と変わらない感じですね
これまで質問してきた趣旨とは変わってしまいますが、
Graphics g = Graphics.FromImage(pictureBox1.Image);
これでビットマップを書き換えた後に pictureBox1.Image を書き換えていないと
いうことは、いちいち canvas ビットマップを用意して細工しなくてもよかったと
いうことでしょうか
で、本質ですが、ご提供いただいたテストプログラムでは明らかにチラつきの
改善が見られるということはダブルバッファリングは機能している、これ以上
気になるのであれば、それは滑らかさの問題であってチラつきの問題ではない、
と認識するのが良さそうですね 下PanelはBackgroundImage使ってるのが悪いんじゃねえかなあ
canvasはPanelのPaintで描画するようにして
PanelのDoubleBufferedをtrueにするかOnPaintBackgroundの無効化でチラ付かなくなったよ
あとチラつきとは関係ないけどお行儀的には再描画はTickで
Invalidate(true)呼び出してPaintのタイミングはフレームワークに任せるべし
Tick毎に無駄にImage/BackgroundImageに突っ込んでるから結果的に自分で再描画してるけど ああ、やっぱり俺の認識で合ってるねw
何だかおかしいと思ったが
>>376
フリッカーを誤解してないのは分かったけど、>>360のコードでフリッカーなんか
発生しないってだから >>350
それは参照渡しになってたわけじゃない
C#の参照渡しはhoge(ref list)のようにrefがつく
あなたがハマったのは参照の値渡しでインスタンスは複製されないということ
ぺらぺらの入門書とかだとわからんが、ジェネリックやクラスをちゃんと学べる程度の本なら載ってるはず >>350
List固有の問題ではなく、classは全て参照型だからだ。
だから、=で代入しても同じオブジェクトを指すだけ。
ちなみにstructは値型。こっちなら=で代入したらオブジェクトが複製される。 >>360をFPSと速度を変えられるようにしてみたけど
思ったより面白くもないし動作も滑らかじゃないなw
どっちにしろやっぱりフリッカーは発生しない
https://ideone.com/E3V57h
ところで、タイトルバーをドラッグしたりすると画面の更新が止まる問題を
回避する方法ってなかったっけ? ああ、今思ったけど、FPSは本当は実測した値を表示すべきだねw
>>384はタイマーのインターバルから計算した理論値で実測値じゃない グラボやドライバーの違いで発生する問題を自分のところじゃ発生しないからって頭ごなしに否定する奴はどうして生きてるんだろうな? >>386
それは君が勝手にそう思ってるだけw
そんな問題はWin9xの時代だって存在しなかったよ
っていうか、言っちゃわるいけどフリッカーが発生する原因を理解していればそんな間抜けな台詞は
出てこない なんか垂直同期(笑)とか書いてるのもいたけど、
頭の中80年代で止まってるんじゃなかろうかw 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 プロパティだけでは無理
各列のSortModeはAutomatic以外にして
ColumnHeaderClickイベントで自分でソートする必要がある
実際にどうやってソートするかはDataGridViewに表示してるデータをどうやっているか次第
ところで下の状態で1番目の方のカラムヘッダをクリックしたらどうなるの?
とか色々場合があってUIというかUX?を決定するのが結構面倒 さすがに垂直同期はネタだろ
釣られる奴がいるとは思わなかったけど w >>389-390
複数列でのソートは、Kotlin なら、
配列.sortedWith(compareBy({ 列1 }, { 列2 }))
C# は、よく知らないけど、こういう感じ?
配列.OrderBy(列1).ThenBy(列2) 教えてください
キャストが上手くできずに困っています
具体的には、VisualStudioでデバッグのウォッチウィンドウに
Enumerable.Empty<int>() is IEnumerable<object>
と入力するとtrueと表示されるので少なくとも条件が整えば
IEnumerable<int> は IEnumerable<object> に
キャストできるとおもうのですが、プログラム上で安直に
Console.WriteLine(Enumerable.Empty<int>() is IEnumerable<object>);
を実行すると画面にFalseと表示されてしまいます
ウォッチウィンドウ上とプログラム上で何か条件の違いがあって
このようなことが起こっているのだとは思いますが、理解が不十分で解決方法が分かりません
そもそもIEnumerable<T>のTは共変なのでintがobjectにアップキャストできる以上
IEnumerable<int>も無条件でIEnumerable<object>にキャストできると
思っていたのですが、この部分に何か誤解があるのでしょうか
VisualStudio15.6.7、コンソールアプリ、ターゲットフレームワーク4.7.1でテストしています
よろしくお願いします >>395
レスどうもありがとうございます。その後色々と試してみると、プログラムで
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になることはないのですが)
もっと良い方法があれば教えてもらえると嬉しいです 名前空間A と名前空間A.B がある場合に、A.B内からAのクラスを扱うにはどうすればいいのですか? >>399
クラスとは違って、やはりそうやって使うものなのですか 嫌なら全部同じ名前空間内に入れ込んでしまえ
悩まなくて済むぞ >>405
逆に無駄な混乱が起きない?
同じ名前のクラスとかあるとちょっと面倒じゃない? C#好きだけどnamespaceでネスト一つ深くなるのはあかんわ >>406
全て自分で書くコードならいいんだけどね。サードパーティのライブラリのクラスと衝突する可能性なんていくらでもあるから。 >>406
書き分けのために命名が歪むのは良くない
NM1.Class/NM2.Class
NM1Class/NM2Class
単にプリフィクス付けるだけなら
名前空間があろうとなかろうとやってる事は同じ >>406
むしろ同じ名前でも被らないようにする仕組みなんだが... やたら長い名前付けて重複を避けるのさ。
ダイビングがかったるいって?
最初のusingに書くだけだから大丈夫。 >>406
自分(同じチーム)で同じ名前の違うクラスが必要になるケースは
少ないが(ないことはない)他人が書いたライブラリで既に使われているのと
同じ名前が必要になるケースなんかいくらでもあるよw
例えばSystem.Drawing.Point以外のPointが使えなかったら困るでしょ
あと、名前空間の目的は名前のバッティングの回避だけじゃない。
むしろ一番の目的は分類と整理でしょ。
名前空間が使えないライブラリは全部のファイルをデスクトップに置くできない人と同じ
適切に命名され適切な階層構造をもった名前空間は索引の機能を持つし、
コードのコンテキストを明確にする。
System.Drawing.PointがPointだけで2Dグラフィックの座標だと分かるのは、
プログラマはそれがSystem.Drawing内の型だと知っているから >>412
普通にdrawingのcolorとmediaのcolorがバッティングしてるじゃん
それと自作のcolorとこれまた別の奴の作ったcolorがバッティングするだけでもう面倒臭くて死にそうになる もっというとwpfでも別のcolor作ってんじゃん
バッティングうぜぇんだよ
こんな簡単なクラスでもう再利用効かないんだから名前空間まで作って管理するなよバカっタレかよ
当のMSからもうまともなことやってねぇっていうかできないんだから
いい加減ファンタジー設計はやめるべき
いや、もうファンタジーじゃないな
メルヘンの領域まで入ってる >>414-415
何を言ってるのか意味がわからねいよ。 この程度で死ぬほど面倒臭がってたら、プログラミング自体が向いてないな。 >>416
バカじゃん
何でwinformにcolorあるのにwpfでも作ったの?
再利用できてないじゃん
役に立たないじゃん
名前空間分けてそれで?
新しいもの作ったら元気一杯に捨ててるじゃん
ってとこに集約する >>421
反論できないならcolorクラスはもう作らせないぞ 全く話題になってないけどC#7.3も正式リリースされたぞ
念願の where T : Enum >>422
> それと自作のcolorとこれまた別の奴の作ったcolor
> バカじゃん
> 何でwinformにcolorあるのにwpfでも作ったの?
え、なんで自分でcolor作ったの? >>424
触るなって言ってんだろテメーマッチポンプか?
それとも別種の頭かわいそうな生ゴミか? つか、同じ名前で違う用途に割り当てる方が難儀だろ普通は名前変える。 >>426
だから世の中にどんだけクラスが存在すると思ってんの? 普通の初心者だったらSystem.IOのPathとWPFのPathが競合することが気になると思う >>427
自前クラスを組み込むクラスの組み合わせだけ考えりゃよかんべよ。 >>424
WPF「WinFormなんて爺さんのクラスなんて使えるかよ」 >>433
WinFormsが定年間近の爺さんだとしたらWPFは35歳無職童貞だな drawimageって自分でクリッピングしないとはみ出たら遅い? formとwpfで、似て非なる部品ってどうにかならんの?
ネットで使い方調べる時、紛らわしいんだよな。 >>433
UWP「そろそろWPFさんにはご退場願おうか」 >>437
メーカー「そろそろUWP用のコントロールつくっか?」 親フォームからnewした子フォームは親とは非同期ですか?それとも同期処理となりますか? 正しい言葉の使い方では非同期だけど、たぶん君が言ってるのは同期か非同期かではなくて同じスレッドかどうかだろう
それでいえば同じスレッド つか、聞きたいのは、モーダルかモードレスかじゃね? ここで質問するときは自分が何をやりたいかを書いてもらった方がいいな
>>439
>>441の意味なら
方法 : Windows フォームをモーダルおよびモードレスで表示する
https://msdn.microsoft.com/ja-jp/library/39wcs2dh(v=vs.110).aspx >>440
同じスレッドなら同期ではないのですか?
>>441
モーダルとはなんぞやレベルなので出直してきます
>>442
参考サイトありがとうございます ポータブルアプリの設定ファイルを扱うなら何がスタンダードですか?
XmlSerializer使ってxmlファイルにするか
Win32API経由でレガシーなiniファイルにするか。
やっぱ前者ですかね? >>444
セオリー通りappsettings.jsonやろ普通 >>444
人の手で編集するかどうか
するならcsvファイルかxlsがええで
Excel使えるから
xmlもiniもjsonも編集ツールが無くてゴミ >>448
ほう
じゃあ、編集ツール出して見ろよ
そんな誰も編集できないフォーマットで設定とか言ってたって全く説得力ないよ
はい、論破 yamlとかtomlもまぁアリだな
jsonはtailing commaがちょっと煩い >>450
C#ならappsettings.jsonで良くね?IOptionとの相性いいし >>452
JSONが標準だとは思うし, まぁJSONにする
が, リスト末尾のカンマは許して欲しい なるほど、今時はJSONですか。
ただ、少し調べて見たところweb系の構成ファイルとして使う?みたいで自分の思ってるのとは違うのかなと感じました。
後出しになってしまって申し訳ないんですが、自分のイメージしてるのはFormアプリで例えば「最前面に表示する/しない」だとか「昇順/降順で並べる」みたいな、チェックボックスやラジオボタンの選択内容を起動時に読み込み、終了時に書き込みする想定です。
appsettings.jsonは読み込みしかなさそうだったのですが、書き込みってありますか?自分でjson形式にコンバートしてベタに書き込みしろってことですかね? >>454
その用途ならアプリ外からエディタで編集させることなんて無いだろうから、正直なんでも良いと思う jsonならNewtonSoftがあるけどyamlシリアライザだとどれがデファクトなんだ? jsonならNewtonSoftがあるけどyamlシリアライザだとどれがデファクトなんだ? >>454
JSONで読んだり書いたりするなんてどうとでも出来る
まぁXML以外ならなんでもいいと思うけどね 前も書いたけど騙されたらダメwww
.NETには標準のシリアライザがいくつも存在するんだから、特に理由がないかぎり
あえて外様を使うとか頭の悪い中学生じみてる var exts = {".jpeg", ".jpg", ".png", ".gif"};
var f = Directory.GetFiles(dir, "*.*", SearchOption.AllDirectories)
.Where(c => exts.All(extension => !c.EndsWith(extension)))
.ToArray();
extsの拡張子以外のファイルを抽出したいんだけど
大文字小文字区別せずに拡張子だけを比較する方法ないですか?
もっと効率いい方法ある気が・・・ !c.ToLower().EndsWith(extension)
で対応します >.NETには標準のシリアライザがいくつも存在するんだから、特に理由がないかぎり
>あえて外様を使うとか頭の悪い中学生じみてる
いくつもあるの? どんなのがあるのか三つくらい教えてください。
ビルドするごとに消えるのでは使いにくいというか何度もビルドするのは普通だとおもうので
それでは使い物にならないので、ビルドしても消えないものがいい。 >>459
今時その認識は正直ヤバい
今の.NETの標準のシリアライザはJSON.NET
Core系では完全に標準シリアライザとしてフレームワークで使われてるし、MSDNにもJSONならJSON.NET使えと書いてる >>463
DataContractJsonSerializer でなくJson.net のソースは? ■ このスレッドは過去ログ倉庫に格納されています