ふらっと 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 フォーム間のデータ受け渡しのやり方について教えてください
プログラムを起動して、最初にForm1でパラメータなどを設定、次にForm2で設定した
パラメータを元にデータを編集したいとします
(Form1で編集済みのデータをForm2に表示する、でもいいです)
このときにデータを受け渡すのは、program.cs で Application.Run(new Form1()); と
呼び出す前に
1. Form2 のインスタンスを作っておいて、それを Form1 の引数として与えてやる
2. 必要なデータのインスタンスを Main() 内に用意しておいて、そのインスタンスを
Form1 と Form2 のそれぞれに送る
3. どっちもダメで他の方法がある
のどれが良いのでしょうか。
Form1 の中で Form2 のインスタンスを作成して、Form2 に送るという方法も考えましたが、
そうすると Form1 が不要になったときに Dispose() すると Form2 も落ちてしまいます。 >>240
それは右座標を計算して返しただけであって処理を実行するのとは違う
面倒だからここ読んで
https://msdn.microsoft.com/ja-jp/library/ms229054(v=vs.100).aspx >>241
Form2にプロパティを追加
Form1の該当メソッド内でForm2を宣言&インスタンス化してプロパティにパラメータをセット
Show(Dialog)メソッドで呼び出し メッセージキューを勉強中なんですが、
MSMQとMessageQueueクラスって何が違うんでしょうか? >>244
ありがとうございます
この場合、もう二度と Form1 を使わないという状況であれば、Form2 の ShowDialog を
呼び出す前に this.Hide(); で隠しておいて、戻ってきたら this.Dispose(); でしょうか
Hide() だけで処理を抜けるコードを書き忘れて、いつまでもプログラムが残り続けるバグを
やったので、二度と戻ってこないフォームは Dispose() したいのです 今思ったのですが、そういう使い方だとむしろ Form2 を非表示で実行しておいて、
その中で Form1 を呼び出すべき?
で、Form1 を抜けたら this.Show(); とか >>243
頭悪そうだけど、単にバッキングフィールドの値をそのまま返すのではないケースを
「何らかの処理の結果を返す」と言っている。
処理 = 高価な処理ではない。
重かろうが単なる足し算だろうが処理は処理だ Applicationに共通のパラメータ持って、Form1とForm2で共有しちゃダメなんか 使い方次第じゃないかなとは思う
双方で同時に書き換えたりするならやめたほうがいい
それ以前にタダクソダサイと思う 自作ツールをソースコード付きで公開したいのですが、
パブリックドメインソフトにするのが最善ですか? .netで簡単に実現できる機能(メールや圧縮、画像処理等)をネイティブCのアプリで利用したいです。VC++6.0の(C++ではなく)C言語で作るコンソールアプリでです。
C#で作っでdllを作って、C++のdllでそれをコールする関数を公開すれば実現可能ですが、もっといいやり方ないでしょうか? >>254
今のOSSはMITライセンスでGithubに晒すのが主流 >>255
別プロセスにする
Win10のアプリなら WinRT のコンポーネントにすれば言語をまたがって普通に使える >>255
標準入出力のリダイレクト。
古典的でダサいけどね 皆様ありがとうございました
決まりきった定番の書き方はない、と理解すれば良さそうですね
自分で色々試してみます 今度はインデクサについて教えてください
https://ideone.com/TlRwJS
例として上記のようなコードを書いてみました
これで、インデクサを使って例えば anml["whale"] とすれば1が返ってくるような、
そういうものを作りたいと思います
(classified, lifeの各プロパティはユニークではなく、specificのみユニークとします)
本を紐解きながら書こうとしたのですが、animalsクラスの中ではリストになっていないので
書く場所はなさそうです。でもMainメソッドでは利用したい側なので、ここに実装することも
できない気がします。
多分インデクサの考え方そのものがわかっていません。どなたか教えていただけると
嬉しいです。 ListじゃなくてDictionaryを使えばOK anml.FindIndex(_ => _.specific == "whale")でよくね? インデクサてのは自作のクラスにつけるプロパティみたいなものだから、List<animals>を内蔵するクラス作って
public int this[string p]{
get{ /* ここに検索して結果を返すコード書く */ }
}
でおkなんじゃねか?知らんけど。 >>262
すいません、理解のレベルが低いので、具体的にどう実装すればよいのかわかりませんでした
var anml = new Dictionary<animals, string>;
としてディクショナリは実装できたとして、要素追加の際 Add メソッドをどう書くのか、理解が
追いついていないようです
>>263
この書き方で、求めている操作は実現できそうです
ラムダ式の理解が怪しいのは勉強するとして、毎回これを書くと面倒&間違えそうなのですが、
これは「十分に簡潔な書き方」なのか、それとも「メソッド等でさらに簡潔に書ける」のか、どちら
でしょうか。
>>264
この場合、各プロパティにアクセスする際は anml[i].specific とかではなくて anml(i, specific)等
メソッドを介してアクセスすることになるのでしょうか? >>264は良くないよ
インデクサはループ内で使用されることを想定しておかないといけない
毎回線形検索が走るのは非効率すぎる 番号が欲しいのかanimalsオブジェクトが欲しいのか >>266
今回の用途では速度は重要でなく、またそもそも実現方法がわからなかったので、アルゴリズムはまだまだ先の話ですね
>>267
今回欲しいのは数字です Index番号が欲しいなら>>263で十分じゃないか?
見つからなかったとき例外吐くらしいから気をつけろい まちがえた。例外じゃなくて-1だ。すんまそ。回線で首吊ってくる XAMLファイルからボタンを削除した場合、CSコードの方に呼び出されることのないコールバック関数の宣言が残ってしまます
こういうのを効率よく削除する方法ってないのでしょうか? >>273
Xamarin.Formsで使っています ここでいいのかわかりませんが、質問させてください。
C#でフレームワーク ASP.Net MVCで作っています。
テーブルのフォームをPOSTしたいのですが、
動的に作成した行をどのようにサーバー側で受け取ればよいのかわかりません。
<td>
<input class="form-control" id="no1" name="no2" type="text" value="" />
</td>
<td>
<input class="form-control" id="no2" name="no2" type="text" value="" />
</td>
このように、複数行があって、noの後ろの数値は、行を追加したら増えるように
javascriptで制御しています。
サーバー側の処理として、引数を
(string no1, string no2, ・・・)と列挙してすべて書けば、
POSTデータを受け取れることは確認済みです。
ただ、ユーザーの操作で行を何行追加するかもわからず、あらかじめ想定する
最大数の引数を列挙するのも現実的ではありません。
すべてのフォームデータを一挙に受け取って、
サーバー内部のロジックで処理する方法はないでしょうか。 どうせJavaScript書いてるんならJavaScript側でJSONの配列に纏めてからAJAXでポストするのもアリ [[[ ][ ]]]\[[]] [[[]]]],[[[ [][] ] Entity FrameworkでDBへのselectとかのリトライしたい場合ってどのようにすべきでしょうか
一時的なエラーだったりしたらもう一回トライとかしたいのです
例外全キャッチするのも無駄なのかなぁと思いまして 普通のRDBなら一時的なエラーなんか滅多にないだろ
400でいいよそんなもん >>280
DbExecutionStrategy [[[ []]]]*[[ [][] ][] } } {} [[[ 人間はILコードを覚えてハンドアセンブル出きるようになるべき winformの左辺や上辺をドラッグするとフォームのサイズが変わらずにフォームが移動してしまいますが
サイズを変更するように設定するプロパティなどはありますでしょうか
コードを書く必要がありますか? >>288
古い脳の感覚でいえば、IL なんてハードウェアの裏づけのない、空想上の約束にしか過ぎないので、覚える気が起きない
x86-64 でおなかいっぱい >>291
CASL くらいはやったよ、8080、z80/6809/80x86/z8000/r3000、まだ若かったからどんどん覚えることができたんだ…
でも、もうおなかいっぱいだ… 次元が違うだろ
ILは高級なオブジェクト指向言語
そもそも機械語に似せることを意図されていない >>293
ハードウェアマシン語とプログラム言語との間に、なぜ仮想マシンと仮想的な言語(IL/JVM)が採用されるようになったのか?そこが今でも判然としないのです… >>294
ドライバは何故存在するの?つってる様なもんだぞそれ >>295
いえいえ、階層性を全否定するわけではありません
「仮想マシンと中間コード」の必要性を問うているのです… 仮想マシンに焦点を絞るなら、ハードウェアの差異を吸収する為では
(.netはJavaVMほどあちこちに移植されてないというだけで)
ILに関して言えば、複数の言語(C#、VB.net、F#、他)を共通のフレームワーク上で動かせる様にする為 >>297
それならハードウェアや言語の統一を目指したほうが建設的なのでは? >>298
不可能だろう
収斂進化により表面上似た様な機能を搭載する事はあっても、内部構造は特許なり権利なり絡んで来るから同じに出来ないし
JavaScript+CSS3ですらブラウザベンダ間で足並み揃えられないのに、言語の統一なんて出来る訳が無い 現状、中間言語側でも少なくとも JVM/.net framework にわかれちゃっているからねえ… >>301
LLVM はコンパイラの中で完結しているのではないかな? >>302
コンパイラ開発者はとりあえずLLVM-IRに変換すればいいし最終段で機械語に変換するか直接実行するか他の言語のコードに変換するかは自由
というか最初と最後だけ作ればいいわけだから寧ろLLVM-IRが中心 >>304
うん、それはよくわかる
すべての「構造化」を全否定するわけではないんだよ JITコンパイルはVMとしては認めない派閥が存在することは認める https://www.slideshare.net/ufcpp/ss-34533225
このスライドの67枚目の「良い例」のコードってこれで本当にいいの?
MSDNのParallel.Forの解説には
---
localFinally デリゲートはスレッドごとに 1 回呼び出され、各スレッドのローカル状態に対して最後の操作を行います。 このデリゲートは、同時に複数のスレッドで呼び出される可能性があります。したがって、共有変数へのアクセスを同期する必要があります。
---
と書いてあるから、countはアトミックに操作しないとまずい気がするんだけど
https://msdn.microsoft.com/ja-jp/library/dd783299(v=vs.100).aspx >>312
MSDNの使用例にも
localState => Interlocked.Add(ref result, localState)
とあるしそれで正しいと思うよ >>313
いやだから、MSDNのサンプル通りにするなら、>>312の
localCount => count += localCount
は、
localCount => Interlocked.Add(ref count, localCount)
でないとまずいと思うんですが そうだねだからどうしたの
資料公開してる本人に言えばいいんじゃないの 大して変わんねーよ
そんなに処理分けたきゃ
別exeにしてキックしろよ
後はできるならOSがうまくやるし
OSがうまくできなかったらそりゃできないんだろうよw >>314
いや、>>312の言う通りと言ったつもりなんだが・・・ふらっと怖いな おバカwebを鵜呑みにしない有望な>>312なんやからもう少し優しくレスしてやれよw この例だとForよりAggregate使ったほうがいいな >>318
自分の日本語に疑問を持たない君の方が怖いよ
「これ(A)」でいいのか、Bじゃないのかって質問に「それ」で正しいと答えたら
質問した方は普通は正しいのは「これ」の方だと理解する C♯でJavaScriptで生成されてるチャットサイトからコメントビューアを作りたいのですが、JavaScriptが生成したHTMLを取得するのに適したライブラリってどれでしょうか?
Formアプリで作る予定ですが
webBrowserコントロールが一番手軽でしょうか? >>322
追記
使う.Net frameworkは4.6.1です
Nugetで公開されてるライブラリ等でも問題ありません javascriptで生成といっても生成元になるデータを何処かでリクエストしてる筈
そっちを解析して直接的にHttpClientでgetしたほうがええよ ありがとうございます
単純にセッションが必要っぽそうだったのでHttpClientでもいけそうです
使い方調べ直します おバカ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メソッドを使用します。 >>326
X:webに書いてあることは
○:日本語訳は グラフィックの扱いについて教えてください
panelに複数の画像イメージを貼り付けたいと思います
(トランプのカードを任意の枚数置くような感じです)
WidthとHeightをpanelのサイズに合わせて、Bitmapオブジェクトを
作ってそこに必要な画像を貼り付けて、最後にPaintイベントでその
ビットマップを Graphics.DrawImage で表示すれば良さそうだ、という
認識です
問題はBitmapオブジェクトに画像を貼り付けることで、メソッドを
調べても、Bitmapオブジェクトの任意の場所に任意のイメージを
貼り付けるものはなさそうです
そもそも用意した画像は Image.FromFile で準備しているのですが、
Imageオブジェクトを貼り付けられるのは Graphics.DrawImage
メソッドになるので、そもそも Bitmap オブジェクトを用意すると
いう発想が間違っているような気もします
多分いろいろ間違って認識しているので、どこから考え直せばよいか
教えていただけると嬉しいです >>328
ベースの画像のいくつかの任意の位置に画像を貼り付ける描画ならそれで間違っていないけど
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 オブジェクトのまま >>329
私の認識は、最終的に描画したいビットマップを用意して、それを 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イベントハンドラに描画処理を全部書くのは変な感じがして、
描画したい画像を用意するのと、実際に描画するのは別の処理ではないかと思っている
次第です 描画したい画像を用意するのと、それを描画するのは当然別の処理だ。
でもアニメーションさせたいとか画像の変更を即座に描画に反映させたいとかなら、用意した足で再描画させるしかないだろ? >>330
何でイベントでやるのか知らないけど複数の描画を同時にやるメソッドはなかったと思うよ
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); あ、ごめん
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);
だった >>331
アニメーションさせたいとか、そういう意図はないです
単に、描画したい画像を用意するのに、Bitmapオブジェクトにさらに画像を
貼り付ける方法がわからなくて悩んでいます
>>332
イベントでやってるのは、単に参考にしたサイトで「Paintイベントハンドラで
処理する」と書いてあったので、それを鵜呑みにしただけです
https://dobon.net/vb/dotnet/graphics/drawimage.html
これを見て気づきましたが、そもそもパネルに直接描こうとするのが間違いで、
パネルにPictureBoxを貼り付けた上でそこに置けば良いのかな? >>334
どっちでも同じだと思う
Graphics g = Graphics.FromImage(panel1.BackGroundImage);
でやれば直接パネルに書き込めるし
ただ大きい画像を表示して画像の表示位置をスクロールさせたいのならパネルの上にPictureBoxが基本
とりあえず書いて動かしてみたら >>334
実現したい要件だけを明確に書いた方がいいと思うよw
そこが明確じゃないのに「俺が考えた実装方法」ばっかり詳細に書くから
答える方も何を返答していいのか分からないw >>336
実現したいことは、「任意の画像を任意の場所に配置したイメージを、panelに描画したい」です
これは明確で、それを実装するための方法でどう悩んでいるかが正しく伝わらないと、答える方も
こちらのレベルがわからなくて困るかと思ってました
実現したいことがちゃんと伝わっていませんでしたか
それ以前の問題でしたね。。。 bmp1が配置先のイメージ、
bmp2がbmp1に配置したいイメージだとしたら以下になる
Graphics g = Graphics.FromImage(bmp1);
g.DrawImage(bmp2, x, y); // bmp1の(x, y)にbmp2を書き込む
g.Dispose();
pictureBox1.Image = bmp1;
これだけでパネルにbmp1が表示される ■ このスレッドは過去ログ倉庫に格納されています