C#, C♯, C#相談室 Part95

■ このスレッドは過去ログ倉庫に格納されています
2017/10/17(火) 00:41:22.60ID:JxIRdCj70
■Visual Studio 2017 Community(無償の統合開発環境)等はこちら
http://www.visualstudio.com/downloads/

■コードを貼る場合はこちら
http://ideone.com/

■前スレ
C#, C♯, C#相談室 Part94
http://mevius.2ch.net/test/read.cgi/tech/1492843013/

■次スレは>>970が建てる事。
建てられない場合は他を指定する事。
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
738デフォルトの名無しさん (ワッチョイ 7fad-wbog)
垢版 |
2020/01/08(水) 00:38:18.01ID:HFuLNThA0
Java8的な感じで残りそうな気もする
4.8で打ち止めなら枯れて安定してるし
2020/01/08(水) 17:07:05.84ID:Jh9kZvPt0
WinFormのTextboxやRichTextBoxを使用して、
エスケープシーケンスの様に文字単位で色を変えることは可能でしょうか?

String str = "例文:\red赤\r\n \green緑\r\n \black黒\r\n"; // \red \green \blackは仮想のエスケープシーケンス
TextBox.Text = str;

例えば上記で、赤・緑・黒の色がそれぞれ変えるのは可能でしょうか?
それともエスケープシーケンスは改行やTABにだけ対応していて、
色までは対応していなくて不可能でしょうか?
2020/01/08(水) 17:42:23.45ID:S7vQ7ZowM
\redって赤と復帰文字+edの区別つかないじゃん

それはともかくRichTextBoxとRTFを使えばまあ似たようなことはできる
RTFを一から書くのは拷問だけど
741デフォルトの名無しさん (アウアウウー Saa3-7oRq)
垢版 |
2020/01/08(水) 18:32:11.60ID:6iphn5xQa
>>739
ちょっと何言ってるのかよく分からないけど、
C#のコードでエスケープシーケンスを含む文字列リテラルを書いた時、
それがそのままバイナリになると勘違いしてない?

あれ、コンパイラが対応する文字に置き換えてるんだよw
2020/01/11(土) 10:46:33.04ID:IVNUyUW+0
C#でできることってすべてF#で(多少複雑になったとしても)実現できますか?
同じ共通言語基盤上にあってもC#だけで可能なことってあるんでしょうか。
(もちろん、どちらも計算完備なのでC#でできることは
それこそBASICでもできるでしょうが、そういう意味ではなくて
.NET上での共通性の話です)
2020/01/11(土) 12:49:57.55ID:Uc6AtsCZM
>>742
もちろん
チーム全員が関数型言語に習熟しているならあえてC#を選択する理由はないよ
2020/01/11(土) 16:36:56.68ID:IVNUyUW+0
>>743
ありがとうございます。

(ちなみにですが、関数型っていうか対話的に実行できる仕組みが欲しかったんですよね)
2020/01/14(火) 09:13:37.09ID:/tPlPF6x0
https://www.atmarkit.co.jp/ait/articles/1710/03/news018.html
一応C#も対話的に実行できる
2020/01/14(火) 09:19:18.61ID:HiotJy5MM
>>745
へーこれってどんな仕組み?コンパイル必要としてないの?
2020/01/15(水) 18:27:50.06ID:YlxQUfnE0
>>745
知りませんでした!
折角教えてくださった>>743様には申し訳ないのですが
C#インタラクティブを使ったほうが私めの望みを満してくれるので
そちらにします。
2020/01/15(水) 21:17:39.40ID:jOuGOKj7M
なんだと…ゴゴゴゴ
2020/01/15(水) 23:02:14.43ID:k9iUnicj0
C# Interactive, 64bitで実行できるようになるのはいつなのかねえ。便利なんだけどたまに困る。
xamarin workbookとかも代替であるんだろうけど。
750デフォルトの名無しさん (ワッチョイ cd90-JESV)
垢版 |
2020/01/16(木) 00:16:18.83ID:CC5bpFwG0
誰だってわかりやすくて書きやすい言語でプログラミングしたいに決まってんじゃん

C#はまだわかるけど難解ぶってるオナニー言語は滅んだ方がいいね
2020/01/17(金) 01:22:15.96ID:atTN5w3j0
まあ、たしかに defun(((((( なんか嫌だもんな。
2020/01/24(金) 22:14:55.39ID:k9osu5pp0
forおじさんなるキーワードを知ったんだけど今forは使っちゃいかんの?
c#には直接関係ないけどさ
2020/01/24(金) 22:23:17.00ID:ckgx8D9Z0
他にbetterな方法がある場合でも、とにかくforをつかえってのを揶揄してるだけでしょ
2020/01/24(金) 22:59:35.08ID:1f1Z8E2rM
マーティンも今どきforは臭いからパイプライン使えみたいなこと言ってたな
2020/02/04(火) 07:23:29.54ID:2P9jYwzY0
ifとforで何重にもネストさせるやつ未だにいるからな
レビューで暴言吐きそうになって困るからやめてほしい
2020/02/04(火) 08:13:40.65ID:oN9vo+PdH
>>755
for回さなくていいって記事読んだとき「なんじゃこりゃ〜」って叫んだわ
あ、おわかりのとおりわたし爺ですw
2020/02/04(火) 12:44:04.58ID:M0ahQJ780
見た目だけじゃなくて処理効率も変わるのかな?
C#みたいな言語だとforだろうがmapだろうがコンパイラがよしなに最適化してくれそう(適当)
2020/02/04(火) 19:03:41.12ID:XAK/YcTOr
実際意味は違うので用途次第ということ
2020/02/04(火) 22:00:23.17ID:kfb5o96m0
期待通りの順番で処理してもらえるのか?
不安なんでfor使ったりすることあるね。
2020/02/04(火) 22:07:47.88ID:Z8KA+tSJM
順番が気になる処理はなるべく書かない
2020/02/04(火) 22:56:53.13ID:ozqUNPd80
馬鹿の一つ覚え
762デフォルトの名無しさん (ワッチョイ 9f6a-56gX)
垢版 |
2020/02/05(水) 00:50:35.93ID:+dC8QpOa0
>>754
すまん、ジジイなんで勉強したいからソース教えてほしい
2020/02/05(水) 13:31:41.51ID:OSDzuje90
>>757
linqとforeach、forだと処理効率かなり違う
だからといってlinqで書けるものをforで書く程ではないが
2020/02/05(水) 14:05:00.81ID:AaNsO0iwM
可読性より性能重視でfor使いまくることあるです
2020/02/05(水) 14:14:25.44ID:N1rQ6Y7rM
性能が必要なら言語かえますし
2020/02/05(水) 18:36:26.77ID:NPiSCXLeH
アセンブラ最速(要最適化)
2020/02/05(水) 21:42:19.79ID:qmME163kr
レベル高いのはlinqやforをちゃんと使い分けれる人
レベルが低い人はどちらかしか使わない人
2020/02/05(水) 23:51:29.21ID:JHMrCxaG0
Linqってnullがあった時面倒な印象がある
実装当時はselectみたいな予約語を中途半端に実装したってどっかで見た記憶があるけど増えたのかね?
769デフォルトの名無しさん (ワッチョイ 5797-IOUD)
垢版 |
2020/02/06(木) 11:04:45.02ID:y+neP3Z40
もちろんLINQでもforでも書けるけど、LINQで遅そうな処理で、それが作っている
ソフトの決定的なパフォーマンス問題につながりそうなら、forで書いてみて
ベンチマークしてどっちを採用するか決めるかな。
forの方がありとあらゆる言語で書ける書き方だから当然書けるけど、
LINQの方はPythonの内包表記やmap/filter/reduceの書き方に近くいから
こっちも当然書けるし、短いし一時変数用意しなくていいから基本LINQ使っちゃうよね。
2020/02/06(木) 12:27:26.13ID:BIpKXfQOM
forでないと書けないってコードが汚いだけの場合が殆どだからまずそっちをリファクタリングする
すると自然とLINQで書けるようになる
LINQで遅いのは件数が多すぎるかキャッシュを使ってない場合なので実はforに変えただけじゃたかが知れてる
2020/02/06(木) 18:42:57.79ID:ePr9F6TEr
あまり大したことに使ってなさそう
2020/02/06(木) 18:45:07.13ID:ePr9F6TEr
> forでないと書けないってコードが汚いだけの場合が殆ど

そうは思わないけどw
2020/02/06(木) 18:54:05.90ID:ePr9F6TEr
>>769
これも一見もっともそうなことを書いてるけどよく見ると変だよね
forでも書いてるならベンチ取る必要ない
2020/02/06(木) 18:55:11.26ID:ePr9F6TEr
linqでしか書けない人は最下層
forでしか書けない人はそのやや上
2020/02/06(木) 19:33:48.33ID:BIpKXfQOM
forでしか書かない人は使い物にならないおじいさん
無理してでもLINQでしか書かないのはまだまだ研鑽が足りない
意識しなくても自然とLINQになってるのが達人プログラマ
2020/02/06(木) 20:55:07.31ID:WBT6cCNm0
POSTとかGETのレスポンス速度って、自分の回線速度と相手側のサーバー速度依存ですか?
プログラムの処理でコンマ数秒でも早くする方法ってあったりします?
2020/02/06(木) 21:12:13.83ID:ePr9F6TEr
普通はないよ
アメリカとかにPOSTして帰って来てるんだとしたらそもそも物理的な距離も問題になる
2020/02/06(木) 21:16:32.05ID:ePr9F6TEr
どうでもいいけど回線速度と言うのも変な表現だな
帯域依存だな

最初のレスポンス自体が帰ってくる速度は同じだけど取れる帯域が広いと早くダウンロードが終わる
2020/02/06(木) 22:57:37.84ID:O+zcmlkO0
ダウンロードの時間じゃなくてレスポンスの話だろ
帯域よりレイテンシのほうが問題だと思うが
2020/02/07(金) 08:11:56.59ID:EMrYQo7/H
相手側のサーバーまで全部依存ですよね
ちなみに、普通にwebとかで見えてるサーバーは、必ずping返してくれるの?
2020/02/07(金) 12:33:07.85ID:etaMDs5Yr
ping返さないサーバはいくらでもある
782デフォルトの名無しさん (アウウィフ FF9b-VM48)
垢版 |
2020/02/07(金) 17:30:10.02ID:PWhN+bN7F
>>776
htmlに埋め込まれてるアンカーを
バックグラウンドで先読みするタイプのブラウザがあった
評判は悪いみたいだが
2020/02/07(金) 20:27:13.28ID:q5ptBTCZa
フォームデータなのに?
784デフォルトの名無しさん (ワッチョイ 571d-uqPE)
垢版 |
2020/02/07(金) 23:07:36.53ID:GxNDg+Fe0
【与沢翼】労働収入を高くしても無駄!税金でほとんど持っていかれますよ。
金持ちになるにはたった2つしか方法がない
https://www.youtube.com/watch?v=A-5lQ2rDmc0
【与沢翼】サラリーマンとして生きるのはリスクでしかない。従業員は創業者に
利用されているだけだということに気づきなさい
https://www.youtube.com/watch?v=uPoTvbr5VDk&;t=78s
【与沢翼】「世の中は罠だらけ。これに気づかない人はカモにされ続ける。」【思考の革命】
https://www.youtube.com/watch?v=qUk7HFabMeQ&;t=70s
【与沢翼】現状に対する疑問を持てない人はずっと辛い労働をして生きてください。
今自分達が不自由であるということに気づかない人はどうぞご勝手に
https://www.youtube.com/watch?v=YGykF9IHv-w&;t=41s
【与沢翼】時間を売るような働き方をしてはいけない。自分の24時間をどれだけ
増やせるかという発想で仕事しなさい。最終決定権がない仕事はビジネスとは呼べませんよ
https://www.youtube.com/watch?v=g0WXpcqg4oA&;t=51s
785デフォルトの名無しさん (ワッチョイ d735-oJhu)
垢版 |
2020/02/08(土) 18:20:20.80ID:0YppiA+B0
OS:Rasbian Stretch
ランタイム:Mono JIT compiler version 4.6.2 (Debian 4.6.2.7+dfsg-1)
ソース:https://i.imgur.com/cFLOcYN.png
パッケージ:https://i.imgur.com/bWRI0Zg.png
エラー:Method 'System.Net.ServicePointManager.CloseConnectionGroups' not found.

Windowsでは正常に動作します。
エラーの原因と解決策を教えてください。
786デフォルトの名無しさん (ワッチョイ d735-oJhu)
垢版 |
2020/02/08(土) 18:23:37.92ID:0YppiA+B0
AngleSharpを入れるとこのエラーがでます。
AngleSharpを入れるとバイナリのフォルダにSystem.***という大量のDLLができます。
787デフォルトの名無しさん (ワッチョイ d735-oJhu)
垢版 |
2020/02/08(土) 18:24:23.44ID:0YppiA+B0
ターゲットは.NET Framework4.6.1です
2020/02/08(土) 19:17:58.13ID:1TiVu9qyr
>>787
Linux用には.Net Framework 4.6.1はないんじゃない?

.net coreと.net frameworkは別物
789デフォルトの名無しさん (ワッチョイ d735-oJhu)
垢版 |
2020/02/08(土) 19:25:53.91ID:0YppiA+B0
>>788
回答ありがとうございます。
Mono4.6.2と.NET Framework4.6.1は互換性ありませんか
790デフォルトの名無しさん (ワッチョイ d735-oJhu)
垢版 |
2020/02/08(土) 19:31:11.67ID:0YppiA+B0
AngleSharpを入れるとそれを使用しなくても関係ないところでエラーが出る理由がわかりませんね
 
2020/02/08(土) 19:41:46.38ID:1TiVu9qyr
バージョンがあってないからだろ
初心者向けのふらっとスレに行け

まず
.Netにはいろいろ種類があると言うことをしり特性を知れ
次に.net standardが何か調べろ
そして使いたいフレームワークが.net standardで何に当たるか調べろ

次にServicePointManager クラスが自分の使いたいフレームワークで使えるかどうかMSのサイトをみて調べろ
792デフォルトの名無しさん (ワッチョイ d735-oJhu)
垢版 |
2020/02/08(土) 19:54:30.33ID:0YppiA+B0
こちらの質問は却下します
2020/02/08(土) 19:59:03.78ID:1TiVu9qyr
standardというパワー綴り
2020/02/13(木) 11:12:59.64ID:cLFC91tC0
startupでデフォルトのDB接続先でapp.CreatePerOwinContextを登録してるのだが
途中でDB接続先を変更出来たりしないですか?
コントローラーのOnActionExecutingでfilterContext.HttpContext.GetOwinContext().Set(wkUserManager);
で変更したんだが、他画面にいくとリセットされてるというか元が変わってないというか
2020/02/13(木) 19:44:16.71ID:o7NRbkWy0
ライブラリの話が出ているので自分も質問させて頂きたいんですが、SevenZipSharp(by squid-box)使ってる方いないでしょうか?
分割されたRAR5.0を解凍する際にファイルが壊れてる的なエラーが出て解凍できないことがあるのはバグでしょうか?(純正7Zipアプリでなら正常に解凍できるため実際には壊れていない)
どうやら1GB程以上の大きい分割ファイルだとそうなることが多いようで、数百MB程度の分割ファイルなら問題なく解凍は出来ます
単体のRARであれば1GB以上の巨大圧縮も解凍できるためメモリ周りのエラーと言う事でもなさそうなのですが
2020/02/15(土) 13:09:48.07ID:M9LrwgB50
TabControl上の『選択されていないTabPage上の』ボタンをプログラムからクリックしたいんだが、どうすればいいのだ?

試したことは以下。
((Button^)ctrl)->PerformClick(); // ボタンが見えてないと(ボタンのあるTabPageが選択されていないと)ClickEventが発生しない(以下※1)
((Button^)ctrl)->OnClick(gcnew EventArgs()); // protected なメソッドなので呼べない
((Button^)ctrl)->Click->DynamicInvoke(gcnew array<Object^>(2){ctrl,gcnew EventArgs()}); // C3918、データメンバではないため、マルチキャストデリゲートに直接アクセス出来ない
((Button^)ctrl)->Click(ctrl, gcnew EventArgs()); // C3718, Clickにraiseメソッドがないから駄目

環境
.NET Framework3.5(Form), VC++/CLI, VS2008EE

目的
GUIの画面をバッチ処理しようとしていて、
ボタンの名前をスクリプトに書いておけば順にクリックしてくれる、みたいなものを作っている。
見えていればPerformClickは動作するので、今はその都度SelectedTabを切り替えて逃げているが、
バッチ中に一々画面が変わるので出来ればそのままで処理したい。
2020/02/15(土) 13:10:05.98ID:M9LrwgB50
※1
書いてあることとはこちらの状況と合致しているわけでもないが、とにかく見えてないとPerformClickは動作しない。
> TabControl.TabPages コレクションに少なくとも1つの TabPage が含まれている場合
> (Click、DoubleClick、MouseDown、MouseUp、MouseHover、MouseEnter、MouseLeave、MouseMove)、
> TabControl クラスでは、次のイベントは発生しません。 コレクションに少なくとも1つの TabPage が存在し、
> ユーザーがタブコントロールのヘッダー (TabPage 名が表示される) と対話する場合、
> TabControl は適切なイベントを発生させます。
> ただし、ユーザーの操作がタブページのクライアント領域内にある場合、TabPage は適切なイベントを発生させます。
> https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.forms.control.click?view=netframework-4.8
自動翻訳がイマイチなので英語も。
> The following events are not raised for the TabControl class unless there is at least one TabPage in the TabControl.
> TabPages collection: Click, DoubleClick, MouseDown, MouseUp, MouseHover, MouseEnter, MouseLeave and MouseMove.
> If there is at least one TabPage in the collection, and the user interacts with the tab control's header (where the TabPage names appear), the TabControl raises the appropriate event.
> However, if the user interaction is within the client area of the tab page, the TabPage raises the appropriate event.
> https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.control.click?view=netframework-4.8
798デフォルトの名無しさん (アウアウウー Sac3-+wK4)
垢版 |
2020/02/15(土) 14:11:22.37ID:D6Qol+wpa
>>796
表示されているかどうかの問題ではないと思う。

TabPageのコンテナ(およびその上のコントロール)はそのページが初めて
表示されるまで「作成」(CreateControl)されない仕様だった気が。

知らんけど
2020/02/15(土) 14:34:26.54ID:M9LrwgB50
>>798
過去一度でも表示されたことがあるか、なら、確実に一度は表示されている。(初期画面のタブなので)
そして一応、直前に表示した状況でも試してみたが、やはりPerformClickは反応しない。
(「スクリプト実行ボタン」と「スクリプトから押したいボタン」が同一TabControlの別ページにあるので、
タブを切り替えた直後に実行ボタンを押してみたが、駄目だった)

ただしその挙動は少し覚えがあるというか、
大量にコントロールを並べていて描画がもたつく場合、タブを切り替える毎に再描画している雰囲気はあるから、
それに近い可能性(見えてないタブのコントロールを剥がすとか)もありえるとは思う。
2020/02/15(土) 15:26:28.37ID:cTwFsuY/0
リファレンスには書いてないっぽいけど
ControlのCanSelectがtrueじゃないとPerformClick()はイベントを発生させない
https://referencesource.microsoft.com/#system.windows.forms/winforms/managed/system/winforms/Button.cs,346

ボタン側を拡張したりボタンが呼び出してるメソッドを直接呼べない状況なら
素直にTabをSelectする以外にないんじゃないかな
2020/02/15(土) 15:33:35.56ID:cTwFsuY/0
InvokeOnClick()呼べる?
こっちなら何もチェックしてないっぽいけど
2020/02/15(土) 15:39:09.67ID:px7CuDIEM
別にボタン押すとこまで律儀に再現しなくても良いよ
イベントハンドラかその中で呼んでるサービスを直接呼び出せばいい
803デフォルトの名無しさん (アウアウウー Sac3-+wK4)
垢版 |
2020/02/15(土) 15:48:29.89ID:D6Qol+wpa
>>799
なるほど確かに初回表示済みかどうかにかかわらず表示されてない時はダネだねw
これなら問題なかった
static class Extensions
{
  public static void RaiseClick(this Control control)
  {
    var t = control.GetType();
    var m = t.GetMethod("OnClick", BindingFlags.NonPublic | BindingFlags.Instance);
    m.Invoke(control, new[] { EventArgs.Empty });
  }
}
2020/02/15(土) 15:58:13.85ID:M9LrwgB50
>>800
おお、ありがとう。
ググりまくりはしたが、ソースコードをチェックするという発想はなかった。

> このプロパティは、System.Windows.Forms.ControlStyles の Selectable 値が trueに設定されていて、
> 別のコントロールに含まれていて、コントロール自体が表示され、
> 有効になっていて、すべての親コントロールが表示され、有効になっている場合に true を返します。
> https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.forms.control.canselect?view=netframework-4.8#System_Windows_Forms_Control_CanSelect
なんだかよく分からんが、かなり条件が深いのは分かった。
CanSelectはリードオンリーだから、素直に表示させるのが一番マシなようだ。

>>801
InvokeOnClickもprotectedなので駄目のようだ。(C3767)

ただ、なんでCanSelectなんだよ?とは思ったので、なるほどInvokeOnClickか!とも一瞬思ったが。
何がしたいんだよこの仕様(CanSelect必須)は。
GUIが有効か見ているわけだが、それをプログラムからの操作に噛ませる意味はないはず。
2020/02/15(土) 16:08:02.82ID:M9LrwgB50
>>803
ありがとう。

ただ、リフレクションは嵌る原因になるので出来る限り回避している。理由は以下。
・C#ならさておき、VC++だとググッてもヒットしない。
・ならば勿論C#を参考にするわけだが、本来同じCLRでMSILなので全く同一の筈なのだが、
 何故か一部異なっていたりして、そこで嵌る。(というか嵌ったことがある)
勿論使ってはいるが。
ただ、確かに今回はリフレクションでも対応出来る状況なので、最終的には使うかもしれないけど。
2020/02/15(土) 16:16:32.88ID:ZLgOs4gBa
バッチ処理なのになんでFormsなんだ?
2020/02/15(土) 16:45:32.12ID:9gQJd/YW0
IEコンポーネントの代替品って何? ChromiumベースEdge のものは既に用意されてるの?
808デフォルトの名無しさん (アウアウウー Sac3-+wK4)
垢版 |
2020/02/15(土) 17:23:14.18ID:D6Qol+wpa
>>805
ならこれでも出来た。
何か気づいてない弊害があったらごめんね
public static void RaiseClick(this Button button)
{
  var parent = button.Parent;
  if(parent is TabPage)
  {
    button.Parent = null;
    button.PerformClick();
    button.Parent = parent;
  }
}

個人的にはこういうバットノウハウ感全開のコードは嫌いw
2020/02/15(土) 17:54:52.64ID:M9LrwgB50
>>808
さすがに動的に剥がすのは色々副作用が発生しそうで怖い。
今のところ以下のコードでやっている。このままか、>>803にするかのどちらかだと思う。

if (ctrl->Parent->GetType()->Name=="TabPage") ((TabControl^)ctrl->Parent->Parent)->SelectedTab = (TabPage^)ctrl->Parent;
((Button^)ctrl)->PerformClick();

キャストが入ってうざくなっているが、要はボタンの親のタブページをその都度選択(表示)させている。
これで動いている。ただしタブが勝手に切り替わるので知らなければギョッとする。
直後に戻せばいいだけかもしれないが、それはそれで無駄にイベントが発生するし、とりあえず放置だ。
仕様だと分かったので諦めはつく。

しばらくこれで試して、問題がなければこのまま、といったところ。
現状TabControl内のTabControlなんて無いから、おそらくこの方法で問題ないと思っている。
(TabControlが入れ子になっている場合、おそらくリフレクションしかない)
2020/02/15(土) 17:56:21.16ID:KAWVCWpT0
ボタンのコードを呼び出すのは駄目なの?
2020/02/15(土) 18:28:50.09ID:M9LrwgB50
>>809訂正
× TabControlが入れ子になっている場合
○ TabControl内にGroupBox等があり、そこにボタンがある場合

809のコードだと直接の親しか見てないので、
TabControl内のボタンは階層的に直接TabPageに貼られている必要がある。
そうでなければ親を再帰で辿るか、リフレクションするか、だろう。
2020/02/15(土) 19:38:08.16ID:VwQX+D5fr
馬鹿がこんがらがってるイメージ

ボタンクリックのイベントハンドラを表示
private void button1_Click(object sender, EventArgs e)
{
//
}
始めの{と終わりの}の間をすべて選択する
右クリック クイックアクションとリファクタリングを選択
メソッドの抽出を選択
適用をクリック
2020/02/15(土) 19:45:46.32ID:nU62WrWUM
>>812
だよなあ
おそらく「ボタンを押すこと」が目的化してしまってる
クライアントの要件は多分そういうことじゃない
814デフォルトの名無しさん (アウアウウー Sac3-+wK4)
垢版 |
2020/02/15(土) 20:31:48.09ID:D6Qol+wpa
>>812
その程度の話なら既に指摘されてるよw

イベントハンドラは動的に変更されるかもしれないし、
ラムダ式や引数で与えられるデリゲートかもしれない。

だから普通質問者さんの問題意識は理解できると思うよw
イキってる君以外の人にはw
2020/02/15(土) 22:59:55.86ID:ZLgOs4gBa
>>814
その動的に変わるかもしれない処理とやらを抽出するだけだろ?

Form: btnFoo.Click += this.Model.Foo;

Model: void Foo() => _foo?.Invoke(); // _fooは動的に変化するかもしれない

スクリプト(オレオレマクロの文法がわからんから例としてpowershell)
$form = $AppHost.Container.Resolve("MyForm")
$form.Model.Foo()
画面を見なくていいならより直接的に
$model = $AppHost.Container.Resolve("MyFormModel")
$model.Foo()
816デフォルトの名無しさん (アウアウウー Sac3-+wK4)
垢版 |
2020/02/16(日) 00:18:48.74ID:s243OsDZa
なんかもうバカの壁だねw

ボタンのクリックをシミュレートしたいというのは十分理解できる話だし、
それをなるべくそのまま表現できるようなコードを書きたい、という動機も
普通に理解できる話だと思うんだけど。

>>815的な発想の問題点は、

(1) プログラマの意図と実際のコードに乖離がある

(2) だから呼び出しているメソッドが今本当にButtonのイベントハンドラに登録されているものと
同一であるか、という検証の必要性が発生する。

(3) ButtonのPerformClickの「仕様バグ」を回避するため、
という非本質的な目的のためにコードの設計に手を入れるのは本末転倒

なにが「だろ?」なんだろうね
スギちゃんかよだっせーwww
817デフォルトの名無しさん (アウアウウー Sac3-+wK4)
垢版 |
2020/02/16(日) 00:20:18.56ID:s243OsDZa
>>813の人も思いっきり倒錯してるねw
2020/02/16(日) 00:28:16.86ID:lYNu13iwM
>>816
それより前の問題としてプログラマの意図がまず間違ってんだよ
魚をさばくのにノコギリでやろうとしてる状態
そこを正してからじゃないと話にならない
正さずにむりやり進めようとしてるからボタンクリックエミュレートなどという頭の悪い発想に固執する
挙げ句の果に画面上で見えてないと処理が走らない(涙)なんてバカバカしい罠にどハマリしちゃってるわけだ
はっきり言ってリフレクションはハマりやすいからダメだなんて言ってる場合じゃないよ
2020/02/16(日) 00:38:37.35ID:lYNu13iwM
だいたいクライアントのやりたいことは自社アプケーションのオートメーションサポートだろうよ
それを素人の思いつきレベルの発想でUIのオートメーションに目的をすり替えたのが運の尽きだわな
レイヤの考え方が全くわかってないアマチュアの設計だからすんなりうまく行くはずがないんだ
見えてないと発火しないこと以外にいったいどんな罠が潜んでるかわかったもんじゃない
俺が提案した方法ならUIインフラに依存しなくなるから実行時の安定性と罠が少ないぶん高い生産性が期待できる
2020/02/16(日) 01:57:42.29ID:iNVxJNOu0
アセンブリが自分や所属チーム/組織のコントロール下にないんじゃないのかな
違う理由かもしれないがそれと同じような制約下での話だと思われる
2020/02/16(日) 03:27:20.73ID:QSu9wuIh0
>>796

>GUIの画面をバッチ処理しようとしていて
UiPathとかAutoIt使いな。
2020/02/16(日) 09:58:00.38ID:as0AlWv60
>>820
そういうときはUIAutomationかWinAppDriverを使うといいよ
どうせこのあと要求がどんどん増えてボタンクリックだけじゃ済まなくなるんでしょ
あとで苦労するハックはやめてマイクロソフトが整備してる道具を使おう
2020/02/16(日) 11:26:32.12ID:j/dbz9ZG0
>>819
まあその「俺のプログラムが一番だ」という姿勢は俺は嫌いではないし、
むしろプログラマは全員持つべきだとも思うけども、
動的結合の価値(意味)が分からないのなら、まずはそこを理解した方がいい。

現在、Clickイベントをエミュレーション出来ないGUIフレームワークなんて、存在してない。
リフレクションも割と一般的になりつつある。(常用するのはどうかとも思うが)
だから、使いどころはあるんだよ。
静的結合だけでやれ、みたいなのは言ってしまえばC++がそうだが、それでもRTTIは検討されている。

動的結合の価値は>>816も書いてくれているが、同様に以下でも触れられている。(これらだけでもないが)
https://www.atmarkit.co.jp/fdotnet/dotnettips/270performclick/performclick.html
言ってしまえば「実行速度を捨てて保守性を採る」わけであり、これが適切かどうかは状況によるので、
PerformClickやリフレクション等を使うこと自体が間違いだ、というのはさすがに行きすぎてる。
(なお既に言ったが、速度至上主義のC++は割とそういう思想だし、これも間違いでもないが)


ただそれはさておき、PowerShellは使ったこと無いから調べてみたが、確かに面白いものではある。
ポイントは、.NETオブジェクトをインスタンス化出来ることと、それらをパイプで流せる点か。
>>815を見る限り、C#等CLRな物ならリフレクションで内部の関数をぶち抜いて、自在に呼べるのか!
(名前があやふやだが確か)COMでも似たようなことをしていたMSならあり得るか!とも思ったが、
そうではなくて、自分で.NETクラスをインスタンス化して呼べるだけか?
まあそれでもリフレクションを使えば何でもありにはなるし、
.NETを使うだけで本式のバッチスクリプト環境が自動的に提供されてしまう、というのは画期的ではある。
ここら辺はMSの上手いところだとは思う。
2020/02/16(日) 11:28:34.74ID:j/dbz9ZG0
>>816
俺も「仕様バグ」に近いものだとは思うが、おそらくMSはそう認識してないと思う。
理由は、.NETは比較的「仕様バグ」は少ない環境であり、これは、
・MSがガッツリ保守している
・バイナリ側がランタイムのバージョンを指定出来るので、改訂しやすい
為、「仕様バグ」を後方互換性の為に残す必然性がほぼ無いからだ。
少なくともobsolete(非推奨)にすることは簡単に出来るのだが、してない。
多分何か理由があるのだろうけど、俺には分からない。

なお後知恵だがDobonには書いてある。
> ただし、コントロールのCanSelectプロパティがfalseの時は、PerformClickメソッドは何もしません。
> 例えば、コントロールのVisibleプロパティがfalseの時、CanSelectプロパティはfalseとなります。
> https://dobon.net/vb/dotnet/control/performclick.html
Dobonは、というよりMSDN以外は基本的に見ないことにしていたのだが、妙な嵌り方をした場合は役に立つのかも。
なお他にも
> クリックの動作と同じ動きをするため、EnabledプロパティやVisubleプロパティが"False"の場合、
> PerformClickメソッドを呼び出しても何も実行されません。
> https://www.ipentec.com/document/csharp-simulate-click-event
2020/02/16(日) 11:51:40.15ID:4ZDOKfwJ0
>>823
なにこの
メソッドにすりゃいーじゃん
以上の意味を見いだせない機能
2020/02/16(日) 12:09:21.49ID:qmeSH89zM
>>823
そのリンクの先はかなりクソコードだから鵜呑みにしないほうがいいぞ
まあ2005年の錆びついたものだしもともと低スキル向けの記事だからしょうがないけど
この記事の悪しき前提はViewに処理をベタ書きしちゃってることな
本来ならViewとModelを分離してView上のメニューとボタンからModelの同じメソッドをコールするのが正しい設計な

ViewとModelを分離してModelがViewに依存しなくなればModelをUIインフラから切り離して独立させることができる
そうすればオレオレスクリプトでオートメーションをサポートするといった要求にも容易に応えることができるようになる
UI操作をエミュレートするなどという泥臭いハックに頼らなくて済むのだ
2020/02/16(日) 13:03:06.69ID:j/dbz9ZG0
>>826
このページのコードと用例が糞なのは事実として、エミュレーションが適切な場合もあるってことだよ。
だから現在の全てのGUIフレームワークはエミュレーション出来るようになってるし、
リフレクションも装備しつつある。

MとVを厳密に分離してVはMのラッパ扱いに留めろ、というのは現在の思想としては正しいとして、
2005頃には今ほど言われていなかった、というより、そのころの失敗を経て現在の思想があるわけだから、
このページに対してそれを言ってもしょうがない。
ただそれにしても、現在もまだエミュレーションの価値はあると思うよ。

今回の点に関しての不満なら、俺は
MS:「OnClickがprotectedで呼べないからPerformClickを用意しました」
俺:「なら最初からOnClickをpublicにしとけよ」
であって、private至上主義という勘違いオブジェクト指向の面影を.NETもまた引きずっている点についてだね。
2020/02/16(日) 13:23:09.50ID:If0Pwz/d0
>>827
ウンコをいじる正当性を探すな
2020/02/16(日) 14:00:28.26ID:j/dbz9ZG0
エミュレーションの有用性が分からないのは根本的に経験が足りない。
何故現在の全てのGUIフレームワークがその機能を持っているのか、その意味をよく考えた方がいい。
そしてそのレベルの奴がコードの善し悪しを議論するのは5年早い。

ただ、このレベルの初心者と話をしても意味がないから俺はやる気無い。
お前らが正しいのなら、MSは数年以内に.NETからエミュレーション機能、
つまりPerformClick/OnClick/リフレクション等を全削除することになるが、
俺はこれはあり得ないとしか思えない。
正否は結果で判断でいい。
ここで低レベルな水掛け論をやる意味はない。
2020/02/16(日) 14:16:23.77ID:If0Pwz/d0
こんなクダンネーモン作ってる暇があるならメッセージボックスが後ろに回らないように修正しろ
2020/02/16(日) 14:20:38.32ID:WhOeRDRvd
>>807
nugetにあるよ。
2020/02/16(日) 14:36:14.03ID:t/nUwzcTM
>>827>>829
UI操作をエミュレートする需要があることは間違いではない
がしかしそれはUIコンポーネント実装のためだったりテストフレームワークのためだったりソースにアクセスできないGUIアプリケーションのオートメーションのためだったりであって
自社アプリにオートメーションサポートを実装するための基盤ではない
それをサポートを実現するまっとうな設計はUI層に依存しないAPIやCLIの提供であってUI操作とは全く逆の考え方だ

お前はノコギリにだって役目と需要があると言ってる
しかしノコギリは魚をさばくのには適さない
無論無理をすればノコギリで魚をさばくことはできるがそれはバカのやることだ
2020/02/16(日) 15:56:01.41ID:4YtH0n6X0
年末年始年始に非同期処理で騒いでた人かな
834デフォルトの名無しさん (アウアウウー Sac3-+wK4)
垢版 |
2020/02/16(日) 18:17:51.00ID:vSVyAtifa
>>832
あんたも相当しつこいねw

俺は質問者さんと別人だけど、ボタンやメニューのクリックをシミュレートしたい
場面というのは実際問題しばしば存在するよ

例えばクリックすると何か処理が走るボタンが複数あるとする。
この時、これを全部クリックしたのと同じ機能を果たすボタンが欲しい、
なんていうのは割とありがちな話。

あと、クリックで同じ機能を果たすボタンとメニューが存在する、なんてしょっちゅうある。
この場合はメニューの方のクリックをシミュレートするのが普通だと思うから
件の話を正当化する材料にはならないけどね。
2020/02/16(日) 18:27:35.97ID:Oyf7AnZI0
>>834
えー、それにこれ使っちゃうのはキチガイだろ

チェック関連全部走ってから
本処理行くだろ
2020/02/16(日) 18:32:01.24ID:j/dbz9ZG0
>>832
「UIに依存する」のではなく、「UIの代替を提供する」のであって、
UIが変更された場合にはUIと同じく変更されるのが正しいんだよ。この点が違う。
そしてソース変更無しで自動追従させる手法がエミュレーションになる。
「UIに依存する」というのは、UIとは本来関係ない事をUIを通してやってしまっていることにより、
UIが変更された場合に動かなくなって困る(動作が変わってしまう)ことを言ってるだろ。
そうじゃない。今回はそこは動作が変わるのが正しいんだよ。


それはさておき、PowerShellって流行ってるのか?
思想が面白いのは認めるが、これはつまり「.NETアプリをライブラリとして公開する」訳であり、
ガチのプログラマに対してソース公開して、後はお前が頑張れ、と言っているに近い。
勿論これで行ける奴はいいが、実際のところ、使う側はアプリを使いたいのであって、
ソースを読みたいわけでもなく、プログラミングしたいわけでもない。
そしてアプリと完全に密結合してしまうから、そもそも同レベルのプログラマじゃないとソースは読めない。
だから現実的に、アプリ+PowerShellで何とかしろ、と言われても、プログラマでも困ると思うが。

ただし再三言っているが、思想が面白いのは認める。
これにより、全ての.NETアプリはPowerShellライブラリとして動作し、
また、ガチのスクリプト環境が手に入るわけだ。これ自体は(有用性はともかく)面白い。
2020/02/16(日) 19:25:18.98ID:tfQsIfqsM
>>834
どちらもボタンクリックをエミュレートする必要はない
上の例はクリックで実行される処理を順に実行するだけ
下の例はメニューとボタンから同じ処理を呼ぶだけ
2020/02/16(日) 19:46:27.53ID:tfQsIfqsM
>>836
つまりお前が言いたいのは
スクリプティング機能の定石に反する糞仕様こそを求めているので今回に限り馬鹿なことをするのが正しい
ということか

PowerShellは流行ってるというかWindowsのシステム管理ではほぼ必須
OSにプレインストールされてるから開発環境用意するまでもないちょっとしたツールを作るのにも便利
今まさに話してるDSLを手軽に実装するための基盤としてもしばしば使われる
LinuxやMacで仕事してるなら触る機会ないだろうけどWindowsで開発してるなら触る機会は無数にあるはず
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況