DOBON.NETプログラミング道掲示板

■ 「新規作成」から投稿できます。
■ マルチポストされた投稿を見つけたときは、その投稿に返信することによりご報告ください。その際は匿名で投稿し、マルチポストされている場所を併記してください。
■ スパム対策のため、メールアドレスの先頭に"_"という文字が付加されています。
RSS 2.0 RSS 2.0 | RSS 0.91 | 携帯電話用 | 自分専用のアイコンを使用するには | 掲示板への要望 | 管理人に連絡 | お気楽掲示板
■ 24時間以内に作成されたスレッドは New で表示されます。
■ 24時間以内に更新されたスレッドは UpDate で表示されます。

記事リスト ( )内の数字はレス数
Nomal.NetでのIPv6の比較(5) | Nomal追加コントロールのtabindex値を既存の間に設定する方法(1) | Nomal.Net 5.0 におけるDLL参照問題?(7) | NomalVB.net非同期処理でtextboxに出力したい(2) | NomalToolStripStatusLabelの空白部分を埋めたい(2) | NomalOracle への OleDb 接続に失敗する(3) | Nomal正規表現で株価を取得したい(1) | Nomal親スレッドへ処理の移譲(7) | Nomalデザイナで編集・チェックアウトキャンセルすると(3) | NomalVB.NETで作成したDLLをVB6.0から呼び出す(3) | NomalVB.NETからRDゲートウェイを利用したリモートデスクトップ接続(4) | NomalクラスによるGetBytes関数のエンディアンの違い(2) | Nomal.Net 5.0 におけるServiceControllerの代替クラス(3) | Nomal[VB.NET]Excelのプロセスが終了しない(2) | NomalC#をVBに変換した際の強制的な参照渡し(2) | Nomal新たにshowしたフォームでのボタンのクリック(5) | Nomalリッチテキストボックスの文字を太文字にしたい(2) | NomalVB.netにおける固定長出力方法(3) | NomalDataObjectの使いまわし(5) | NomalLIstview のDataSource(2) | NomalClassの作り方(2) | NomalOpenFileDialogの初期ファイル名の表示が変(1) | NomalVB.NETのVBA化(2) | Nomal改行のコード(7) | NomalGoogle翻訳の結果の取得(2) | NomalStopwatchクラスのElapsedMillisecondsの挙動(2) | Nomal.net Chartで二重ドーナツグラフの作り方(3) | Nomalexeをショートカットから起動した場合のエラー(2) | Nomalデスクトップ と Desktop(6) | Nomalデザイナのプロパティウィンドウで静的プロパティを選択したい(3) | NomalPHPでシリアライズした、データをデシリアライズしたい(4) | Nomal二次元配列 インデックスが配列の境界外(2) | NomalVB.netで作成したexeのNgenによる弊害(1) | NomalDrawBezierの使い方について(7) | Nomalメジャーバージョンの異なるLog4netライブラリを参照したい(4) | NomalVB6→2005変換時のDeclare宣言のマーシャリング属性(8) | NomalGROUPBOXの複製について(vb.net)(1) | NomalActiveReports 3.0からActiveReports 7.0へのァイルコンバータについて(4) | NomalAccess OLEでExecuteNonQuery(3) | NomalKeyDownでの右コントロールキーイベント(2) | NomalExcel複数シートの印刷順序(3) | NomalWMPへno(3) | NomalDataGridViewの行番号(7) | Nomalapp.config定義によるネットワークトレースログの世代管理(2) | Nomalrelease/debugのどちらで作成されたものかを判断する方法(2) | NomalC#コンソールアプリでタイピング練習ソフト作成(3) | Nomal自分自身を呼び出すのはOKですか(1) | NomalWebBrowser Control foreachで値が消える(2) | NomalDeclare宣言するdllと参照追加をするdllの区別(4) | NomalTaskクラスを.NET Framework 2.0で実現させる方法(2) | NomalVS2017で作成されたDLLをVS2005で作成されたAPで使用する方法(4) | NomalWebBrowser Controlを使って、任意の値を取得(5) | NomalEditボックスに簡体字をセットする方法(2) | NomalList型でエラーが起きてしまい・・・(1) | Nomalフォルダ内の全ての容量を取得したい(4) | NomalWebClientが上手く動かない(2) | Nomal共変性と反変性ってこういうこと?(4) | Nomalモードレスフォーム Warning IDE0067を回避したい(7) | NomalLINQの拡張メソッドの定義(1) | Nomalこんな演算子初めて見ました。(5) | Nomalプロセスからウインドウを取得(4) | Nomalフォーム外のカーソルの変更(2) | NomalLINQのメソッド構文の書き方(3) | NomalVB.NETでCSVを読み込む際にSQL文を使いたい(3) | NomalRichTextBoxで入力文字の自動折り返しを止めたい(2) | NomalRichTextBoxで入力文字の自動折り返しを止めたい(5) | Nomalラムダ式の勉強中(2) | NomalWebClientで、短期間にDownloadStringAsyncを実行したい(2) | Nomalvb.net+SQLiteで複数データベースファイルへのトランザクション方法(3) | NomalNewの使い方間違ってますか?(4) | Nomalジェネリック型インターフェースを使った変数を扱いたい(3) | NomalC#をVBに変換(2) | NomalProcess.WaitForExitで正常に動作しない?(3) | NomalCatch時のex.StackTraceの情報(3) | Nomalユーザーコントロール内のテキストボックスのmodifiedプロパティ(4) | NomalPictureBox.Locationのキャンセル(3) | NomalJOIN操作の構文エラー(4) | NomalVisualStudioでマクロ(3) | NomalVisualStudioでExcelのVSTO開発(3) | NomalOracleDataAccess を参照したプログラムでデバッグモードが機能しなくなる(3) | NomalIE11では表示されるが、.netのWebBrowserでは、表示されないHPを表示する方法(7) | NomalマウスのないOSでマウスカーソルの表示(2) | NomalRDP接続でのネットワーク帯域制限(0) | NomalFILE.COPYでIOExceptionエラーが出る(11) | NomalToolStripMenuItemにShortcutKeysを指定した際の、元のコントロールを取得する方法(2) | Nomal動的にプロパティや変数の値の取得(4) | NomalVB6 ほかのアプリケーションを起動し そのアプリケーションは終了させる方法(4) | NomalMouseEventArgsのカレント座標(2) | Nomalリッチテキストボックスでの字間の調整(2) | NomalDrawImage でメモリ不足エラー(3) | Nomal必須コンポーネントの一覧に追加したい(0) | NomalCode128でバーコードが読み取れない(8) | NomalあるWindows10PCでビルドしたEXEがW8.1以下で実行エラー(5) | NomalApp.configのMy.Application.Log設定で使用できない属性が出る(0) | NomalVC++ → VB.Netに変換時に文法エラー(2) | Nomalvb2010を使用したmicrosoft Wordの任意の行の削除(0) | NomalVb.netからAccessへの接続について(3) | NomalSQL-Server Compact 4.0が表示されない(2) | Nomalバーコードの数字を非表示にしたい(2) | Nomal令和の日付への対応(3) |



■記事リスト / ▼下のスレッド
■34560 / 親記事)  StopwatchクラスのElapsedMillisecondsの挙動
□投稿者/ あばば無人君 一般人(9回)-(2020/10/14(Wed) 14:30:27)
  • アイコン環境/言語:[Windows10(1909) 64bit、.Net Core 3.1、C#] 
    分類:[.NET] 

    いつもDOBON.NETの記事や掲示板を見て勉強させて貰っています。

    さて、掲題の件ですが、StopwatchクラスのElapsedMillisecondsは
    Stopwatch.Start()で計測を開始してからずっと放置していると
    どうなるのでしょうか?

    ElapsedMillisecondsはlong型で返るので9223372036854775807ミリ秒
    (約2億9千万年)まで計測可能かと思われるのですが、たとえば
    Stopwatch.Start()で計測を開始してから1年ほど経ったとすると
    経過時間の蓄積?によってアプリの動作が重くなるといったことが
    起きたりするのでしょうか?

    年レベルの放置結果を自分で確かめることはさすがに厳しいので
    どなたかご存知の方がいらっしゃいましたら教えて頂きたいです。

違反を報告
引用返信

▽[全レス2件(ResNo.1-2 表示)]
■34561 / ResNo.1)  Re[1]: StopwatchクラスのElapsedMillisecondsの挙動
□投稿者/ Hongliang 大御所(589回)-(2020/10/14(Wed) 14:41:57)
  • アイコンソースを確認してみるといいかと。
    .NET Frameworkのソース
    https://referencesource.microsoft.com/#System/services/monitoring/system/diagnosticts/Stopwatch.cs,ceb0ba9cc88de82e
    .NET Coreのソース
    https://github.com/dotnet/runtime/blob/master/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Stopwatch.cs

    結論をいうと、開始時のタイムスタンプと現在/終了時のタイムスタンプから計算してるだけなので重くなるとかそういうのはないです。
違反を報告
引用返信
■34562 / ResNo.2)  Re[2]: StopwatchクラスのElapsedMillisecondsの挙動
□投稿者/ あばば無人君 一般人(10回)-(2020/10/14(Wed) 15:19:27)
  • アイコンHongliangさん、ご返信ありがとうございます。

    > 結論をいうと、開始時のタイムスタンプと現在/終了時のタイムスタンプから計算してるだけなので重くなるとかそういうのはないです。

    ソースを見るとGetRawElapsedTicks()で「現時点−開始時点」していました。
    安心してStopwatchクラスを使用できそうです。

    非常に早い返信をして頂き本当に助かりました。
    これで本件は解決済みとさせて頂きます。
    本当にありがとうございました。

解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-2]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■34555 / 親記事)  .net Chartで二重ドーナツグラフの作り方
□投稿者/ わん 一般人(1回)-(2020/10/13(Tue) 13:22:32)
  • アイコン環境/言語:[VisualStudio2017 VB.net,C#] 
    分類:[.NET] 

    エクセルでは、簡単に作成することができる。二重ドーナツグラフをChartオブジェクトで作る方法が知りたいです。

    色々なキーワードでググってみたのですが、よく解りません。
    (グラフ自体は作れるようになりました)

    詳しい方イラッシャイましたら、ご指南の程宜しくお願い致します。


361×307 => 250×212
イメージ
doughnut-chart02-01.gif
/11KB
違反を報告
引用返信

▽[全レス3件(ResNo.1-3 表示)]
■34556 / ResNo.1)  Re[1]: .net Chartで二重ドーナツグラフの作り方
□投稿者/ 魔界の仮面弁士 大御所(1304回)-(2020/10/13(Tue) 14:29:44)
  • アイコンNo34555に返信(わんさんの記事)
    > 二重ドーナツグラフをChartオブジェクトで作る方法が知りたいです。
    > 色々なキーワードでググってみたのですが、よく解りません。

    ググっただけで試していませんが、このような投稿を見つけました。
    https://stackoverflow.com/questions/18176569/creating-2d-grouped-donut-chart-in-c-sharp

違反を報告
引用返信
■34557 / ResNo.2)  Re[1]: .net Chartで二重ドーナツグラフの作り方
□投稿者/ Hongliang 大御所(588回)-(2020/10/13(Tue) 14:31:57)
  • アイコンhttps://stackoverflow.com/questions/30051010/pie-chart-transparency-multiple-pies
    ChartAreaを2つ用意してやってそれを重ねる形で実現できるようですね。

    // ただ描画順番の都合上どっちか片方のラベルがもう片方の裏に回ってしまうケースが出てくるのは避けられなさそう…。
違反を報告
引用返信
■34558 / ResNo.3)  Re[2]: .net Chartで二重ドーナツグラフの作り方
□投稿者/ わん 一般人(2回)-(2020/10/14(Wed) 11:13:30)
  • アイコンご指南有難う御座います。

    直接的には、できないが、工夫をすれば疑似的に表現は可能であると理解しました。

    原則、二重にしないで、どうしても、必要な場合は、Execlのエンジンを使うことにしました。
    大変助かりました。

    有難う御座います。



解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-3]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■34545 / 親記事)  exeをショートカットから起動した場合のエラー
□投稿者/ Wassy 一般人(1回)-(2020/10/04(Sun) 03:09:43)
  • アイコン環境/言語:[Windows10, VB.NET Framework 4.6] 
    分類:[.NET] 

    お知恵をお貸しください。

    状況を時系列に記載させていただいます。

    @Setupプロジェクトにてデスクトップへショートカットが
     作成されるようにインストーラーを作成
    APCへインストール、デスクトップへショートカットができる
    Bデスクトップのショートカットアイコンよりexeを起動
     問題なく起動する
    CPCを再起動
    Dデスクトップのショートカットアイコンよりexeを起動
     「Windowsにexe名を設定しています。しばらくお待ちください。」
     のメッセージが出現し、約10秒後にexeが起動
    Eexeを閉じて、再度デスクトップのショートカットアイコンより
     exeを起動しても同様の事象が発生
    Fショートカットではなく、Cドライブ内のexeを直接起動させると
     メッセージは出ず、通常通り起動

    PCの再起動後にデスクトップのショートカットアイコンから
    exeを起動させるとこのようなメッセージが発生する原因は何でしょうか?

    情報が不足しておりましたら、恐れ入りますがご指摘ください。

    どうぞよろしくお願いいたします。






     
     
459×145 => 250×78
イメージ
1601748583.png
/3KB
違反を報告
引用返信

▽[全レス2件(ResNo.1-2 表示)]
■34547 / ResNo.1)  Re[1]: exeをショートカットから起動した場合のエラー
□投稿者/ Azulean 大御所(517回)-(2020/10/04(Sun) 08:31:19)
  • アイコンNo34545に返信(Wassyさんの記事)
    > Dデスクトップのショートカットアイコンよりexeを起動
    >  「Windowsにexe名を設定しています。しばらくお待ちください。」
    >  のメッセージが出現し、約10秒後にexeが起動

    これはエラーメッセージではなく、Windows Installer による修復機能が動いていることを示しています。
    セットアッププロジェクトで作成したインストーラーは、デフォルトで「アドバタイズショートカット」となっており、Windows Installer によるチェックが働くようになっています。

    アドバタイズショートカットを無効にしたい場合については以下のページを確認してみてください。
    https://dobon.net/vb/dotnet/deployment/disableadvtshortcuts.html


    > PCの再起動後にデスクトップのショートカットアイコンから
    > exeを起動させるとこのようなメッセージが発生する原因は何でしょうか?

    インストールした後からファイル・フォルダーの状態が変わってしまっているなど、そのチェック・修復が呼び出される何か?が起きているのだと思います。
    インストール後にご自身で何かファイル・フォルダーに関する操作をされているか、アプリケーション自体にフォルダーの中身を書き換えるものがありませんか?
違反を報告
引用返信
■34554 / ResNo.2)  Re[2]: exeをショートカットから起動した場合のエラー
□投稿者/ Wassy 一般人(2回)-(2020/10/04(Sun) 19:57:58)
  • アイコンNo34547に返信(Azuleanさんの記事)

    Azuleanさん、ご回答ありがとうございます。
    頂いたアドバイスにより無事に解決することができました。

    > アドバタイズショートカットを無効にしたい場合については以下のページを確認してみてください。
    > https://dobon.net/vb/dotnet/deployment/disableadvtshortcuts.html
    →こちらを試したところ無事に解決することができました。

    > インストールした後からファイル・フォルダーの状態が変わってしまっているなど、そのチェック・修復が呼び出される何か?が起きているのだと思います。
    > インストール後にご自身で何かファイル・フォルダーに関する操作をされているか、アプリケーション自体にフォルダーの中身を書き換えるものがありませんか?
    →まさにご指摘の通りで、初回の起動時に古いバージョンでの不要なファイルの削除や設定ファイルの更新を行うようにさせていました。

    本当にありがとうございました。

    Wassy
     


解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-2]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■34538 / 親記事)  デスクトップ と Desktop
□投稿者/ Vetty 一般人(1回)-(2020/09/25(Fri) 11:03:39)
  • アイコン環境/言語:[Windows10,VB2017,VB2019] 
    分類:[.NET] 

    Windows10 Home/Pro 両方
    VisualStudio 2017/2019両方
    すべて開発環境におけるDebug状態での実行

    MsgBox(System.Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory))

    で得られる文字列に

    デスクトップ と Desktop の二種類があります
    上記の混在環境においては常にそういう事態を予測しておくべきなのでしょうか?


違反を報告
引用返信

▽[全レス6件(ResNo.2-6 表示)]
■34540 / ResNo.2)  Re[2]: デスクトップ と Desktop
□投稿者/ Vetty 一般人(2回)-(2020/09/27(Sun) 16:30:54)
  • アイコン回答ありがとうございます。

    > SpecialFolder で示されるパス内容は、実行環境によって異なります。

    最初の質問にあった msgbox(・・・ の本当の目的は、
    Microsoftのサービスであり、 魔界の仮面弁士さんの回答にもある「OneDrive」に
    存在するフォルダのPathの取得です。つまり

    Environment.SpecialFolder.OneDriveDirectory

    のようなものが欲しいわけです。
    しかしMicrosoftの仕様ではそんなものはなさそうなので、エクスプローラから
    手動で得られる

    C:\Users\username\OneDrive\目的フォルダ

    から想像して

    System.Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)

    の文字列内の "\Desktop" を "\OneDrive\目的フォルダ" に置き換えればいい、
    と考えそのようなコーディングをしてそのPCで動作OKを確認しました。
    (そのソフト自体もOneDriveに保存してあります)
    で、別の場所で別のPCから同じソフトをDebug状態で実行して今回の質問になったわけです。

    今の段階では 
     デスクトップ
     Desktop
     半角カナの "テ゛スクトッフ゜"
    の3種類をIf文で判断して置き換えるのが現実的な方法でしょうか?
違反を報告
引用返信
■34541 / ResNo.3)  Re[3]: デスクトップ と Desktop
□投稿者/ Hongliang 大御所(587回)-(2020/09/27(Sun) 17:03:00)
  • アイコン親フォルダのパスを取得するなら、System.IO名前空間PathクラスのGetDirectoryName静的メソッドを使えます。
    パスの結合は同じくPathクラスのCombine静的メソッドでできます。

    一般に C:\Users\ユーザ名 となっているフォルダのパスは、わざわざデスクトップフォルダ経由ではなくても SpecialFolder.UserProfile を使えば直接取得できます。

    ただ限られた環境ならそれでもいいかもしれませんが、汎用的にはダメそうですね。
    https://nj-clucker.com/move-onedrive-directory/
違反を報告
引用返信
■34542 / ResNo.4)  Re[3]: デスクトップ と Desktop
□投稿者/ 魔界の仮面弁士 大御所(1299回)-(2020/09/28(Mon) 10:02:09)
  • アイコンNo34540に返信(Vettyさんの記事)
    > Environment.SpecialFolder.OneDriveDirectory

    古い環境(SkyDrive やそれ以前も含む)を除外して良いのなら、

     MsgBox(Environ("OneDriveConsumer"))
     MsgBox(Environ("OneDrive"))

    でどうでしょう。
違反を報告
引用返信
■34543 / ResNo.5)  Re[4]: デスクトップ と Desktop
□投稿者/ 魔界の仮面弁士 大御所(1300回)-(2020/09/28(Mon) 10:11:42)
  • アイコンNo34542に追記(魔界の仮面弁士の記事)
    >  MsgBox(Environ("OneDriveConsumer"))
    >  MsgBox(Environ("OneDrive"))

    Windows 10 のバージョンが古い場合や、Windows 10 未満のバージョンでは、
    上記の OneDrive for Business や OneDrive の環境変数が存在しない事もあります。

    環境変数からパスが選らなかった場合には、さらに追加で
     HKEY_CURRENT_USER\SOFTWARE\Microsoft\OneDrive\UserFolder
    のレジストリエントリを探し、それも見当たらなければ、
     HKEY_CURRENT_USER\SOFTWARE\Microsoft\SkyDrive\UserFolder
    を探せばよいのでは無いでしょうか。
違反を報告
引用返信
■34544 / ResNo.6)  Re[5]: デスクトップ と Desktop
□投稿者/ Vetty 一般人(3回)-(2020/09/28(Mon) 21:58:22)
  • アイコン Hongliang 大御所 さま ありがとうございます

    >SpecialFolder.UserProfile を使えば直接取得できます。

    これが今回の私の目的を実現する本来の方法だったんですね。

    魔界の仮面弁士 さま ありがとうございます
     
    >  MsgBox(Environ("OneDriveConsumer"))
    >  MsgBox(Environ("OneDrive"))

    DOS窓の Setコマンドで見えるやつですね。
    思い出しました。
    こんなところもUpdateされているとは・・・

    >Windows 10 のバージョンが古い場合や、Windows 10 未満のバージョンでは、
    >上記の OneDrive for Business や OneDrive の環境変数が存在しない事もあります。

    今回の対象ユーザは少人数身近なメンバーですのでその辺の心配はないはず。

    ありがとうございました。


解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-6]



■記事リスト / ▲上のスレッド
■34533 / 親記事)  デザイナのプロパティウィンドウで静的プロパティを選択したい
□投稿者/ masa 一般人(1回)-(2020/09/15(Tue) 22:14:50)
  • アイコン環境/言語:[Windows 10 64bit, C# WinForms, .NET Framework 4.7.2] 
    分類:[.NET] 

    2020/09/15(Tue) 22:16:46 編集(投稿者)

    久しぶりに投稿させていただきます。

    C#のWinFormsアプリケーションでカスタムコントロールを作成しています。
    デザイナのプロパティウィンドウにおいて、クラス型プロパティの設定値を
    自作クラスの静的プロパティの中から選択・ソースに反映させたいです。

    イメージとしてはColorプロパティでシステムのControlを選択すると、
    ソースにSystem.Drawing.SystemColors.Control;と反映されるのを実現させたいです。

    以下は例として、カスタムコントロールのForeColorを自作クラスの静的プロパティから選択させるサンプルです。
    このままだと、ソースにはSystem.Drawing.Color.FromArgb(((int)(((byte)(254)))), ((int)(((byte)(254)))), ((int)(((byte)(254)))));のように反映されてしまうため、
    MyLabelColors.MyWhite;のように反映されるようにしたいです。
    上手く言葉で説明できず恐縮ですが、どなたか解決策をご教示いただけますと幸いです。

    public class MyLabel : Label
    {
    [Editor(typeof(MyLabelTypeEditor), typeof(UITypeEditor))]
    public override Color ForeColor { get => base.ForeColor; set => base.ForeColor = value; }
    }

    public class MyLabelTypeEditor : UITypeEditor
    {
    public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context) => UITypeEditorEditStyle.DropDown;

    public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
    {
    IWindowsFormsEditorService editorService = null;
    if (provider != null) editorService = provider.GetService(typeof(IWindowsFormsEditorService)) as IWindowsFormsEditorService;
    if (editorService == null) return value;

    var listBox = new ListBox();
    listBox.Click += (sender, e) => editorService.CloseDropDown();
    foreach (var propertiy in typeof(MyLabelColors).GetProperties())
    {
    listBox.Items.Add(propertiy.Name);
    }
    editorService.DropDownControl(listBox);

    return (listBox.SelectedItem != null ? typeof(MyLabelColors).GetProperty(listBox.SelectedItem.ToString()).GetValue(null) : value);
    }
    }

    public class MyLabelColors
    {
    public static Color MyBlack { get => Color.FromArgb(1, 1, 1); }
    public static Color MyWhite { get => Color.FromArgb(254, 254, 254); }
    }
違反を報告
引用返信

▽[全レス3件(ResNo.1-3 表示)]
■34534 / ResNo.1)  Re[1]: デザイナのプロパティウィンドウで静的プロパティを選択したい
□投稿者/ Hongliang 大御所(586回)-(2020/09/16(Wed) 09:43:37)
  • アイコン試してはいないですが、以下のページが参考にならないでしょうか。
    http://www.comrade.co.jp/component/dotnetroom/kt_vsdn/kt_vs5b.htm
違反を報告
引用返信
■34536 / ResNo.2)  Re[2]: デザイナのプロパティウィンドウで静的プロパティを選択したい
□投稿者/ masa 一般人(2回)-(2020/09/17(Thu) 22:51:54)
  • アイコンNo34534に返信(Hongliangさんの記事)
    > 試してはいないですが、以下のページが参考にならないでしょうか。
    > http://www.comrade.co.jp/component/dotnetroom/kt_vsdn/kt_vs5b.htm
    回答頂きありがとうございます。

    ページに記載されていたInstanceDescriptorについて調べてみたところ、SystemColorsもColorConverter内でInstanceDescriptorによって実現されていることが分かりました。
    しかしColorConverterを継承してもColor構造体からMyLabelColorsの特定ができなかったため、
    自作のクラスを作成して以下のソースのようにすることで目的は達成できました。ありがとうございます。

    ただ、基本的には問題ないのですが、プロパティウィンドウで値を変更すると稀にDesigner.csのソースが「this.myLabel1.ForeColor = ((PropertyTest.MyLabelColor)(PropertyTest.MyLabelColor.MyWhite));」のようにキャストがついてしまうことがあります。
    VisualStudioを立ち上げた直後にプロパティウィンドウで値を変更すると「this.myLabel1.ForeColor = PropertyTest.MyLabelColor.MyWhite;」のようにキャストはつかず期待通りになります。
    常にキャストがつかないようにしたいのですが、引き続きお知恵を拝借できますでしょうか。よろしくお願い致します。

    public class MyLabel : Label
    {
    public new MyLabelColor ForeColor
    {
    get => _ForeColor;
    set
    {
    _ForeColor = value;
    base.ForeColor = _ForeColor.Color;
    }
    }
    private MyLabelColor _ForeColor;
    }

    public class MyLabelTypeConverter : TypeConverter
    {
    public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
    {
    return true;
    }

    public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
    {
    return new StandardValuesCollection(typeof(MyLabelColor).GetProperties().Select(p => p.Name).ToList());
    }

    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
    {
    if (sourceType == typeof(string))
    {
    return true;
    }
    return base.CanConvertFrom(context, sourceType);
    }

    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
    {
    if (value is string)
    {
    var myLabelColor = typeof(MyLabelColor).GetProperty(value.ToString())?.GetValue(null);
    if (myLabelColor != null)
    {
    return myLabelColor;
    }
    else
    {
    return new MyLabelColor("UnknownColor", Color.Transparent);
    }
    }
    return base.ConvertFrom(context, culture, value);
    }

    public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
    {
    if (destinationType == typeof(InstanceDescriptor))
    {
    return true;
    }
    return base.CanConvertTo(context, destinationType);
    }

    public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
    {
    if (destinationType == typeof(InstanceDescriptor))
    {
    return new InstanceDescriptor(typeof(MyLabelColor).GetProperty(value.ToString()), null);
    }
    return base.ConvertTo(context, culture, value, destinationType);
    }
    }

    [TypeConverter(typeof(MyLabelTypeConverter))]
    public class MyLabelColor
    {
    public static MyLabelColor MyBlack => new MyLabelColor(nameof(MyBlack), Color.FromArgb(1, 1, 1));
    public static MyLabelColor MyWhite => new MyLabelColor(nameof(MyWhite), Color.FromArgb(254, 254, 254));

    public string Name;
    public Color Color;

    public MyLabelColor(string name, Color color)
    {
    this.Name = name;
    this.Color = color;
    }

    public override string ToString()
    {
    return this.Name;
    }
    }
違反を報告
引用返信
■34537 / ResNo.3)  Re[3]: デザイナのプロパティウィンドウで静的プロパティを選択したい
□投稿者/ masa 一般人(3回)-(2020/09/19(Sat) 23:41:10)
  • アイコンNo34536に返信
    上記サンプルでは何故かキャストがつくことがありましたが、実際に使用するソリューションでは特に問題ありませんでしたので、解決済みとさせていただきます。
    ありがとうございました。
解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-3]






Mode/  Pass/


- Child Tree -

2021/02/28(Sun) 17:52:19 に作成されたキャッシュを表示しています。
生のデータを表示する | キャッシュを最新にする