ふらっと C#,C♯,C#(初心者用) Part134
■ このスレッドは過去ログ倉庫に格納されています
「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。 他のスレッドでは書き込めないような低レベルな質問、 質問者自身なんだか意味がよく分からない質問、 ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。 内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。 なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。 C#に関係の無い話題や荒らしの相手や罵倒レスはやめてください >>980 を踏んだ人は新スレを建てて下さい。 >>980 が無理な場合、話し合って新スレを建てる人を決めて下さい。 ■前スレ ふらっと C#,C♯,C#(初心者用) Part133 http://mevius.5ch.net/test/read.cgi/tech/1510056685/ ■関連スレ 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/ ■コードを貼る場合は↓を使いましょう。 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 C#アプリからCTRL+V以外のホットキーでSendMessageでWM_PASTEを送っても ペーストできるアプリとできないアプリがあるのですが ペーストできない原因とどうすればペーストできるのか 分かる方がおられましたらお教えいただけないでしょうか 自作C#アプリ ○ FireFox ○ ThunderBird ○ IE11 ○ Mery ○ 秀丸ファイラ ○ MDIE ○ 等 V2C × Chrome × Vivaldi × Everything × 等 いやいや、原因は普通に当該アプリがWM_PASTEを処理しないからでしょうw 泥臭いけど素直にSendKeysを使ったらよいのでは? シリアル通信のプログラムで問い合わせ付のコマンドを送信する場合に、送信結果(bool)とレスポンス結果(string)を取得したいのですが、返り値boolでレスポンス結果をoutで返すといった感じにすればいいでしょうか WM_PASTEじゃなくて直接キーをハンドリングしてるんだろ 最近のメジャーなアプリは開発者がMacをメインで使ってるケースが多かったりして、 ファッキンドザのために必要以上の特殊な対応はしないというスタンスのものが増えてるよ >>650 成否だけ分かればいいなら、失敗した時はnullを返せば十分じゃない? enum Acknowledgement {ACK,, NAK, NoResply, Offline}; みたいなのを返したいなら、 Class Response { public string Received{get; private set;} public Acknowledgement Acknowledgement{get; private set;} } みたいなのを返すとか メインメニューにコピーの項目ないなら 直接ペーストするウインドウに送らんと >>652-654 ありがとうございます 試してみます classをforeachで回したいのですがGetEnumeratorの書き方はこういう形が一般的なのでしょうか? プロパティが増える度にGetEnumeratorのyield return追加しないといけないですが うっかり追加し忘れてバグの元になるから別の書き方があるのかも?と少し気になったので https://ideone.com/etKQWk >>657 普通はそんなことはしない まともな作り方をしていれば、次元の異なるものを列挙することはない >>658 すっごい単純なものだと int id string name みたいなものでクラス保持してて、そこに他にも付属品が付いてるイメージです たまにforeach使えないと不便な時があるのでその為に継承させてるのですが DBから読み出したデータをそのままforeachで出力させたいって時とかに使います わざわざ全部の項目を関数で読み出して表示ってのも大変な時があるので >>659 Typeの使い方色々調べましたけど、指定方法がイマイチわからなかったのでもうちょい調べておきます >>660 質問してるんだから人の言うこと素直に聞いた方がいいと思うよw 少なくとも>>658 は正しい。 一般的なのでしょうか? 一般的どころかそんなこと誰もしないよw どうやったらそんなアホなことをせずに目的の仕様を実激できるかを考えた方がいい >>662 すいません、目的の事をしたいのにそうではないと提示してもらったのはありがたいのですが 他の実現方法が分からなかったのでとりあえず現状何をしてるかを更に明確に伝えた方がいいと思ったで その回答がただ否定してるだけに見えたのなら少し発言が悪かったでしょうか? >>659 で更に回答いただけたのでTypeの使い方を調べています とりあえず動くものだけ>>657 で暫定で動かしておいて、使い方を理解したら置きかえて行く予定です 個人的に作ってるものなのでとりあえずは手の届く範囲で扱えるので >>664 ビルドして動作確認しました この通りの動きです、ありがとうございます Linqの渡してるところ調べながら読み直して何してるか理解します >>662 質問されてるんだから屁理屈いってないで素直に答えろよw低能らしいなw { //描画先とするImageオブジェクトを作成する Bitmap canvas = new Bitmap(PictureBox1.Width, PictureBox1.Height); //ImageオブジェクトのGraphicsオブジェクトを作成する Graphics g = Graphics.FromImage(canvas); //画像ファイルを読み込んで、Imageオブジェクトとして取得する Image img = Image.FromFile(@"C:\test\1.bmp"); //画像のサイズを2倍にしてcanvasに描画する g.DrawImage(img, 0, 0, img.Width * 2, img.Height * 2); //Imageオブジェクトのリソースを解放する img.Dispose(); //Graphicsオブジェクトのリソースを解放する g.Dispose(); //PictureBox1に表示する PictureBox1.Image = canvas; } g,imgはNEWしてないのに何でdispose()する必要があるの? >>668 Graphics.FromImageもImage.FromFileも直接コンストラクタ呼んでないだけのこと。 中で非公開のコンストラクタが呼ばれてインスタンスが作られてることに変わりないじゃん お片付けしていいタイミングが分かるのは作った人だけ。 だから作った人がお片付けする責任を負うのが合理的 そういうことなの。 Graphics g = Graphics.FromImage(canvas); こいつが内部のコンストラクタでNewしてるかどうかなんてどうしたらわかるの? 分からんよな。 マニュアルをみると確かにこいつだけ「Creates a new Graphics from the specified Image.」と なってるな。わかり難く紛れ込んでるんだね。 しかも g.dispose() PictureBox1.Image = canvas; と御片付けした後に表示するとはまた不思議な気がする。なんで片づけてから表示するん? どのみちNEWしたCanvasはDisposeしないといけないでしょ。それならそのときに自動的に全部Dispose()する とかできないのか? これはGraphicsクラスの説明にあるMSのサンプルだけどImageもulCornerもDispose()していないのは何故。 private void DrawImagePointF(PaintEventArgs e) { // Create image. Image newImage = Image.FromFile("SampImag.jpg"); // Create point for upper-left corner of image. PointF ulCorner = new PointF(100.0F, 100.0F); // Draw image to screen. e.Graphics.DrawImage(newImage, ulCorner); } 別に使い終わってもリソース気にしないなら放置でいいよ 実害は普通の使い方してる限りでない 一個二個リソースが握られただけでは問題ないけど 数千数万とかレベルだと問題がでる でもわざわざ勘定したり場合わけしながらコード書いているのか? だったら正しいコードを書こう newしてるかどうかわからなくても使ってることはわかるだろ? いつかは自動で解放されるけどタイミングが不明 コード書いてる途中にg,imagを使い終わったと判断できるのは自分だけだから 片づけた後に使うのは当たり前だな 基本的にgなどはつかみっぱなしが良くないので短い範囲で手放してるだけ これは基本的にwindowsのGDIという仕組みに乗ってるだけなので 他でも使ってる c#に文句を言うのは筋違い でもc++スレに行くのも筋違い 30年近くさかのぼってMSの設計者に文句を言ってくればいい どうしても嫌ならwindowsの仕組みに乗ってないものを使えばいい こういう自分とこでインスタンス作成しといて始末しない設計ってクソだね って話で終わりだな もう少し説明 >と御片付けした後に表示するとはまた不思議な気がする。なんで片づけてから表示するん? 仮にgをファイル操作に置き換えたとしよう ファイル開く ファイル読み書き処理 ファイル閉じる 表示 これを 表示 ファイル閉じる にした場合、表示がもし5年かかった場合、ファイルは意味もなく5年間開かれっぱなしで他から操作できない さらに言えば自動でファイルを閉じる仕組みを作ったにせよ 表示が終わるまで5年間ファイルは閉じられる機会がない これでもすべて自動でやれという意見は変わらないかな? そういう話ではなくて意味が解らないという話だね。 例えばこれは何故当たり前なのかが不明。 >片づけた後に使うのは当たり前だな >基本的にgなどはつかみっぱなしが良くないので短い範囲で手放してるだけ 折角グラフィック表示するためにgを作ったのに、表示する前に解放するというのが意味不明だ。 Msのサンプルコードではまさにこのgに対してDRAWしている。これで表示が機能しているのに この例では、PictureにCanvasを代入して表示が完了することになっている。表示する前にg をdisposeしているから、gの役割が二つの例で意味が不明だ。 gは数が限られている 鉛筆みたいなもの 鉛筆が5本あってみなで共有している 使い終わったらすぐ放棄しないと絵が描けない人がでて困る 必要なくなったのに5年鉛筆を持ちっぱなしが望ましい状態だろうか? 鉛筆5本をそれぞれが持ちっぱなしで 6個目のアプリが起動したらどうなるか? 鉛筆がないのでまともに動かない 一つ勘違いがあるけど、newやコンストラクタとDispose()は直接関係ないよ C#にdeleteは無いし、それに相当するものでもないので、インスタンスを解放する訳じゃない Dispose()は主にガベージコレクション管理外となるアンマネージリソース等を解放するためのメソッド そしてGraphicsはBitmapというキャンバスを弄るために用意したに過ぎない、表示するのはBitmapの中身 モノによってはDispose()すると内部バッファとかの書き出しとかもやるし、using等も使いつつ明示的にやりましょう ちゃんとしたIDispose実装クラスならデストラクタ(ファイナライザ)でもDispose()を呼び出すコードが入ってるけど タイミングがガベコレ次第になるし高コストなので明示的に呼ばれるとファイナライズキューから外すように設計されてる >>670 だから、「Disposeする必要があるのは自分がnewしたもの」という勝手な思い込みが間違ってる。 Disposeは作成したオブジェクトが必要なくなった時に呼ぶ。 オブジェクトを作成する方法はコンストラクタ呼び出しだけじゃない。 MSDNの説明にある通り、Graphics.FromImageもImage.FromFileも新しく作成されたオブジェクトを 返す。使いまわしされる共有オブジェクトを返すわけじゃない。 > どのみちNEWしたCanvasはDisposeしないといけないでしょ。それならそのときに自動的に全部Dispose()する > とかできないのか? usingステートメントを使う https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/using-statement C#でたころにGDIの限界までオブジェクト作ったことがあったな 画面がおかしくなって黒いところがあちこちにできる リソースがないと怒られる それともc++だったかないずれにせよ20年ぐらい前かな 要するに Canvas(これはBItmapと同じ?) Image (これは、Bitmap以外にも多種多様な表示を扱う?) Graphics (これは描画するための、関数群のようなもの?) の違いが不明ってことかな。 上の例(DOBON)では Picture.Image=Canvas これでImageにビットマップを代入して描画が完了することになっている。 g.DrawImage(img, 0, 0, img.Width * 2, img.Height * 2); ここでgを使ってimgに描画したのでもうgはいらない。だからgはdisposeした。 ならわかるが、ここでimgをDsiposeするからわけがわからない。 あっ、コメントにちゃんと書いてあった。 //画像のサイズを2倍にしてcanvasに描画する g.DrawImage(img, 0, 0, img.Width * 2, img.Height * 2); ここですでにCanvasに書いているんだな。 はい 解決したね良かったね 写真(img)を見て画用紙(canvs)に鉛筆(g)で絵を描いた 終わったので写真と鉛筆を片付けた 画用紙を額(picturebox1)に入れて飾りました DOBONの例の機序 PictureBox1のサイズで空のBITMAPを作成する。 そのビットマップから描画オブジェクトのGraphics gを作成する。 ファイルからBitmapのImageを作成する。 gでそのImageをBITMAPに描画する。(BITMAPに描画したのでg、imgはいらない) 描画したBITMAPをPictureBOxにコピーする。 こういうことか。わかった。お騒がせしました。ペコリ やっぱりuingとか言ってた奴はガイジだっただろ? >gは数が限られている それはおかしい。そんなことはどこにも書いてない。 もしそうだとしたら Graphics g = Graphics.FromImage(canvas); このコードが間違いってことになる。ここで数量をチェックしないといけない。 ガイジって言葉を使う奴のほうがどうかしてると思いますよ >C#でたころにGDIの限界までオブジェクト作ったことがあったな >画面がおかしくなって黒いところがあちこちにできる 。リソースがないと怒られる これはどういう意味? メモリーの限界ではなくて、GDI(ハードウエア)がもつレジスタの限界ってこと? Graphicsって要するにGDIのリソースを確保するという意味なの? ユーザフレンドリーと見せかけてウンコの代表みたいなクラスなので 真面目に考えないほうがいい 結局仕組みを理解するにはwin32の描画文化から知る必要がある >>689 しょうもないことに突っかかるなあw 数が限られてるって言い方が気に入らないなら高価な共有リソースって言えば分かる? 例えば巨大な配列とか、通信ポートとか、 そういった類のものを「一人」がずっと占有したら他の人が使いたい時に使えないよね? >>694 そんなくだらない例え話じゃなくてちゃんと現象を説明してあげればいいじゃない >>691 GDIはハードウェアっつーより…Windowsでの実装が気になるならReference Sourceでも読んで メソッド内部では色々チェック入ってるし、しくじったら例外ぶん投げるようになってるから MSの説明はたったのこれだけw ■Graphics クラス Encapsulates a GDI+ drawing surface. This class cannot be inherited. GDI+って要するに、グラフィックコントローラを使うってことでしょ。でも鉛筆5本ってほどしょぼいことはないだろ。 結局リソースリリースタイミングを制御しないといけなくなるわけで、ほんとGCって糞だよな。 最近のMSのドキュメントはほんと不親切だよな。 幸運なことGDI+は不親切になる前に開発されたものだから、ググればMSも含めて大量にドキュメントが残ってる。 ググってみた。 Application.SetCompatibleTextRenderingDefault(false); というのが設定されるようになっていて、GDI+は糞だからGDIを使いなさいってことらしい。w よく鉛筆5本とか言うけど、Win16ではDCは同時に使用できるのは5つまでだった。 だからDC取得したらその関数内ですぐ開放するのが当たり前だった。 c#の{ }って中身が1文の場合、省略できるものとできないものってどうやって決まってるんでしょうか? namespace、class、 for、switch、while、try、checked、fixed、unsafeなど PictureBoxのMouseMoveイベントハンドラ内にInvalidate()を入れるとTimerのTickが止まります。何故ですか? https://ideone.com/fWNMPP コード見てないけど そんな暴れん坊見たいことはしないほうがいいと思う マウスの位置をフィールドに入れて間隔の短いタイマーで描画しますか? すみません質問です。 C#でエクセルを複数起動させるプログラムを書いているのですが、解決できない問題があります。 例えば既にa.xlsxが開かれていて、追加で3つのエクセルファイル(b.xlsx, c.xlsx, d.xltm)を立ち上げるとします。 その場合、process.start("excel", "b.xlsx c.xlsx d.xltm"); とすると、a~dまでが一つのプロセスにまとまるのはいいのですが、テンプレートが編集モードで開いてしまいます。 仕方ないので、 process.start("excel", "b.xlsx c.xlsx"); process.start("d.xltm"); とテンプレートだけ"excel"を抜いて起動すると、ちゃんとテンプレートは新規ファイルで開かれますが、プロセスが3つに分かれてしまいます・・[a.xlsx], [b.xlsx, c.xlsx], [d1] (何故かa.xlsxまで孤立しちゃうんですよね・・・) 色々試したところ、 process.start("excel", "b.xlsx c.xlsx");を実行して一度処理を終了させた後(この時点ではa~cが一つのプロセスになっている)、 また起動し直しでprocess.start("d.xltm");を単独実行させると、a~cと同じプロセスにdが加わってくれました。 であれば、全部起動完了待ちすればうまくいくか?と思って、 Process p = new Process(); p.StartInfo.FileName = "excel"; p.StartInfo.Arguments = "b.xlsx c.xlsx"; p.Start(); p.WaitForInputIdle(); p.StartInfo.FileName = "d.xltm"; p.Start(); と、インスタンスを作ってからp.WaitForInputIdle();を加えたうえで実行させると、 プロセスは3つじゃなく今度は2つにまとまりましたが、一つになってくれませんでした・・。 [a.xlsx, b.xlsx, c.xlsx], [d1] という具合で、何れにせよテンプレートだけプロセスが分かれちゃいます。 色々試しましたが、テンプレートファイル含む複数のエクセルファイルを、テンプレートファイルは新規ファイルとして開きつつ、全て一つのプロセスとして起動させる方法が分かりませんでした・・ 方法があれば教えてくださいお願いいたします(m_m) 712です。 p.WaitForInputIdle(); の後に、System.Threading.Thread.Sleep(1000); を強引に追加したら上手くいきました・・。 (うまくいったというのはつまり、 a.xlsxだけが最初に開いてあって、 b.xlsx, c.xlsx, d.xltmをC#で開いた時、a~dまで一つのプロセスにまとまり、 d.xltmも新規ファイルで開いてくれたという事です) でもこれ、絶対正規の解決方法じゃないですよね? きっともっといい方法ありますよね?・・ ご教授下さい。お願いいたします。 >>713 システムハングアウトなめんな。 スリープは大事。 >>715 オートメーションってつまり、コムオブジェクト使うって事ですかね? ちょっと調べてみます。 >>716 スリープも効果的に使えば立派なコードですかね! ミリ秒時間の調整行って、確実に上手くいく範囲で秒数縮めてみようかと思います。 もっといい方法見つかればそれで実装しますが、それまでスリープで対応しようかと思います。 有難うございました。 Form1のデータから、Form2を呼び起こして、 Form2のPrintDocument1_PrintPageを印刷しています。 Form2を閉じて、2回目にForm1から別のデータを印刷すると、 DrawStringで印刷したデータが重複してしまいます。 PrintDocument1_PrintPageを初期化するような方法はないでしょうか? getcommandlineargs()で引数を渡すと スペースとダブルクォーテーションが消えてしまいますがどうすればいいですか? 大文字にしても消えます >>719 ダブルクォーテーションは""に置き換える スペースの入った文はダブルクォーテーションで囲む >>708 ありがとう 自分でやってみた結果 埋め込みステートメントができるのは do,if,else,fixed,for,foreach,lock,using,while だった pictureBoxに線を引いたり色々描画した後に指定位置のピクセルの値を取得する方法はありますか? CopyFromScreen?を使うしかないですか? (12345).ToString("D8") = "00012345" だけど、” 12345"にする方法はないのか? >>726 0を半角スペースにしたいならPadLeft(桁数)でいいんじゃね なるほど " 123" " 123.0" " 123.00" ~ みたいなのをformat登録しておいて一括処理したいんだが,,,, PadLeftをつかうには、独自フォーマットを作って解析して分解するひつようがあるな。 "8,D","12,F1","10,F2","10,F3","8,D" これをSplitで分解して桁と表示にわけるとできる。みんなこんなことをやってるんだろうか? 設計ミスだな 出力の幅なんて最終的な出力の段階で自ずと決まるもんだろ 普通そんなもん必要ない 文字列は空白埋めできたような Formatを2回する あるいはカスタムフォーマッタを作成 String.Format("{0,8:d}", 12345); >設計ミスだな ToStringとString.Formatでいちいち仕様を変えるなんざ設計ミスもいいとこだ。 $"{12345,8} 6.0になってからString.Formatを使わなくなったな >>734 残念。VS2013ではそのスタイルは動かんな。 最新のVSって毎週バージョンが上がってて、アップデートしたら突然ビルドが通らなくなったりとか時々あるんだよね 自社開発でパパっと対応できる体制の開発が前提になってて、もうジャパニーズドカタには手を出せない代物 質問者が何言ってるのか俺にはさっぱりわからんけどみんなよく分かるなw 俺も正しい意味はわからないけど憶測で判断してる 文章も書けないくらい幼稚だけど偉そうなレスしてるとだけわかる >>728 これが特に意味不明だけど考えてわかるレベル >>735 これが偉そう List<string> a = new List<string> { "x3" , "x4" , "x5" , "x6" , "x7" , "x8" , }; foreach (string el in a) { combox1.Items.Add(el); } combox1の初期化ってこんな方法しかないのか? 直接は初期化できんのか? >>236 ちゃうちゃう、$” { valuえ} ”の記述はVs2017しかサポートしとらん。 int w = (int)((double)pic.Width / (double)(1 + x ) / 1.3); doubleとintを混在するときにdoubleに自動的に型推論する機構ってないの? いちいちキャストするのはメンドクサイよな。 ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる