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

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

記事リスト ( )内の数字はレス数
Nomalシステム時計の設定(3) | NomalSeleniumで開いているページのTableを編集したい(5) | Nomalソケット通信入門 ひらがな(4) | NomalVisual Basicでエラーが出る(3) | Nomalインストーラにて、ローミングフォルダにファイルを配置したい(0) | NomalRGB値の所得(2) | Nomal時間変数(文字列)の扱い(4) | NomalVB.net からAccessDBへの接続(2) | Nomal画像のスクロール(6) | Nomalタイマーの一括処理(6) | NomalTreeViewとDataGridViewのスクロールを同期(シンクロ)させたい(4) | NomalTreeViewの現在位置とDataGridViewの現在位置を合わせたい(7) | NomalPictureBoxの画像を連続保存(11) | NomalDataGridViewの特定セルにボタンを配置する方法(5) | Nomalフォームのリサイズ時にDataGridViewが再描画されない(4) | NomalテキストボックスのValidatingイベントよりも先に発生するボタン発生イベントは何でしょう?(2) | NomalPDFをフォーム上で表示させる方法につきまして(4) | NomalDataGridViewの行ヘッダーに行番号を表示した時のエラー(4) | Nomal継承元フォームで各フォームのボタン動作を検知したい(3) | Nomalラジオボタンの一括設定(7) | NomalWindowsエクスプローラからのドラッグ&ドロップ(2) | NomalRichTextBoxのテキストをpictureBOXへ(12) | Nomalクリックイベントでexeを作成できるか(2) | Nomal作成した白黒画像をWordに貼り付けてから「図として保存」(8) | Nomalアセンブリ情報が載らない(1) | Nomal先頭に空白(スペース)があるファイルを読み込んでRichTextBoxへ書き出すとスペースが削除える(6) | Nomalc#で日付型の定義の仕方で質問があります。(2) | NomalExcel Com オブジェクトの増殖(13) | Nomal二次元マップから値の取得(1) | NomalアプリでHDMIへ出す解像度を変えたい(4) | Nomal列車の時間ごとの位置情報を表示したいです。(2) | Nomal画像の中心を基点に回転(4) | NomalDataGridViewのドロップダウンリストの表示と選択後の値を分けたい(1) | NomalVB.NetでVB6.0と同じFontを指定しても同様に印刷されない(9) | NomalタッチキーボードでIMEを自動で切替えたい(6) | NomalVSTOによるエクセルアドインのインストーラーでのアップデート(1) | NomalMP4動画を再生する方法について(5) | NomalUrlにアクセスするとダウンロードされるファイルを捕まえる(2) | NomalLableのカラー色を文字変数から変更したい(5) | NomalLabelで文字単位の背景色(7) | NomalTEXTBOXのプロパティを文字列に(7) | Nomalタブレット等でスワイプによるスクロールを実装(2) | NomalPDFをフォーム上で表示させる方法につきまして(6) | NomalChart X軸上の描画を切り替えたい(0) | NomalRichTextBoxへのドラッグ&ドロップしたExcelファイルの扱い(3) | Nomal特定のPCだけ発生する「パディングは無効なので削除できません」のエラーの原因(6) | NomalASP.NET WebApi内でXmlReader.Create(url)がタイムアウトする(4) | NomalDatagridViewでファンクションキーを止めたい(5) | Nomal表示動作が重くなる(3) | Nomalbitmapを複数スレッドで処理したい(2) | NomalLoadOptionのパラメータの意味(3) | Nomalフォーム背景のみを半透明にしたい(5) | Nomal読み出し元フォームの位置取得方法(2) | Nomalコンストラクターに続く{}の意味(2) | Nomal1行で書くことできますか?(3) | NomalCommandBuilderによって作られるCommandTextの内容(5) | Nomalvb.netで7zの圧縮・解凍をしたい。(2) | NomalC# NASでのプログレスバー有りのコピー(0) | Nomal正規表現で文字の繰り返しパターン(4) | NomalDataViewのFindRowsde(7) | NomalNPOIでのエクセル編集で期待通りに書き込めません(2) | NomalDataGridのSetDataBindingに代わるもの?(3) | NomalFormのサイズ変更で掴める辺を制限したい(2) | NomalVSTOとWebView2の共存って可能?(3) | Nomalビデオ圧縮のコーデック(2) | NomalWindowsMediaPlayerで次のURLを指定しても反映されない。(3) | Nomal"−"を縦書きにしたい(9) | Nomal.NET6.0 のWinFormにWPFのユーザーコントロールを配置したい(4) | NomalDataGridViewの列にコンボボックスを表示する(2) | Nomalデータグリッドビューの特定の列ヘッダの色(2) | NomalVB-Report10→11への移行(4) | Nomal入力値を元に描画させたい(2) | Nomalデフォルトプリンタの用紙向き変更(0) | NomalpictureBoxとlabelの重ね合わせ(2) | NomalASP.net デバッグ時の .js ファイルの変更が反映されない(1) | NomalVBで開いたExcelでのイベントを取得するには(4) | NomalWindowsエクスプローラへのドロップ先フォルダの取得(4) | NomalデザイナでSystemColorsのような色一覧から選択できるようにしたい(0) | NomalVisualStudio2019 以降の検索ダイアログが正常に動作しない(2) | NomalTaskの入れ子の待ち方2(4) | NomalTaskの入れ子の待ち方(5) | NomalUsingの使い方が間違っている?(4) | Nomal//./の意味は?(2) | Nomalバイナリーファイルの結合と分解(2) | Nomal表の最後の行の下にDropできない(1) | NomalCookieの勉強を始めました。(2) | Nomal複数のPageに分かれる場合のスクレ―ピング(6) | NomalDataGridViewのセル結合部分にボタンを表示する方法(2) | NomalTask.Runの使い方(4) | Nomalランダムファイルを高速化させたい(5) | NomalPictureBox のサイズを設定する(2) | NomalProcessクラスMainModuleプロパティでアクセス拒否(3) | NomalLINQでControlsをEnable=Falseに設定(3) | Nomalプロセス間の通信(相互)(2) | NomalC#をVBに変換する方法が分かりません(1) | NomalPictureBoxに動的に画像を表示する(1) | NomalYahooのHPで、検索文字の入力ができない(3) | NomalWebView2のEncodeの問題?(5) | NomalWinFormでChromeをSeleriumで操作しているが、Closeの仕方(2) |



■記事リスト / ▼下のスレッド
■35004 / 親記事)  VBで開いたExcelでのイベントを取得するには
□投稿者/ ぶぶ 一般人(1回)-(2022/02/07(Mon) 17:40:36)
  • アイコン環境/言語:[Windows10 vb.net Excel 2007 ] 
    分類:[.NET] 

    VB.netでExcelを起動し、VBでの操作により、Excelを編集するプログラムを
    作成しています。

    この場合、Excelでのイベント(クリックや右クリック、ダブルクリックなど)を

    VB側で取得する方法はありますか?

    Excelは毎回新規で作成して編集するので、Excel側に組み込むことは考えていません。

    よろしくお願いいたします。
違反を報告
引用返信

▽[全レス4件(ResNo.1-4 表示)]
■35005 / ResNo.1)  Re[1]: VBで開いたExcelでのイベントを取得するには
□投稿者/ 魔界の仮面弁士 大御所(1415回)-(2022/02/07(Mon) 18:31:11)
  • アイコンNo35004に返信(ぶぶさんの記事)
    > この場合、Excelでのイベント(クリックや右クリック、ダブルクリックなど)を
    > VB側で取得する方法はありますか?
    > Excelは毎回新規で作成して編集するので、
    > Excel側に組み込むことは考えていません。

    出来るかもしれませんが、かなり面倒だとは思います。

    RelaxTools などのように、Excel 側のアドインとして
    実装する方向についても、併せて検討してみては如何でしょうか。
    https://software.opensquare.net/relaxtools/


    技術的には OLE オートメーションによって、Excel 側で発生したイベントを
    VB 側で捕らえる事もできるのですが、Excel.Application オブジェクトで
    Excel のイベントで使えそうなマウス絡みのイベントといっても、直接的には
     SheetBeforeDoubleClick イベント
     SheetBeforeRightClick イベント
     SheetSelectionChange イベント
    ぐらいしか無いと思います。

    また、Excel がセル編集モードになったり、ダイアログの表示中などは、
    Excel 側で行った操作を、VB 側で受け取ることができません。


    Excel.Application オブジェクトのイベントを捕らえる以外の方法としては、
    RawInput あるいは DirectInput を用いて、マウスボタンの押下を
    捕らえるという手法があります。

    http://bbs.wankuma.com/index.cgi?mode=al2&namber=97964&KLOG=170
    http://bbs.wankuma.com/index.cgi?mode=al2&namber=92410&KLOG=159

    とはいえこれも、ボタンが押されたという事を知ることができる程度で、
    その時のマウス座標が、Excel 上のどの場所を指しているのかについては
    別途判断せねばなりません。要件を満たすまでに昇華するのは難しいかと。
違反を報告
引用返信
■35006 / ResNo.2)  Re[2]: VBで開いたExcelでのイベントを取得するには
□投稿者/ ぶぶ 一般人(2回)-(2022/02/08(Tue) 10:38:01)
  • アイコン魔界の仮面弁士様

    返信ありがとうございます。

    やりたいイベントとしても、セルをクリックまたは右クリック等がされたときに、
    そのセルの内容から、処理をしたい。位のものなので、教えていただいたリンクを
    基に試行してみたいと思います。

    > 技術的には OLE オートメーションによって、Excel 側で発生したイベントを
    > VB 側で捕らえる事もできるのですが、Excel.Application オブジェクトで
    > Excel のイベントで使えそうなマウス絡みのイベントといっても、直接的には
    >  SheetBeforeDoubleClick イベント
    >  SheetBeforeRightClick イベント
    >  SheetSelectionChange イベント
    > ぐらいしか無いと思います。

    これで、十分なのではないかとも思うのでやってみます。


    >
    > また、Excel がセル編集モードになったり、ダイアログの表示中などは、
    > Excel 側で行った操作を、VB 側で受け取ることができません。

    この場合は、処理の必要はないので、大丈夫ではないかと思っています。
    >
    > Excel.Application オブジェクトのイベントを捕らえる以外の方法としては、
    > RawInput あるいは DirectInput を用いて、マウスボタンの押下を
    > 捕らえるという手法があります。
    >
    > http://bbs.wankuma.com/index.cgi?mode=al2&namber=97964&KLOG=170
    > http://bbs.wankuma.com/index.cgi?mode=al2&namber=92410&KLOG=159
    >
    > とはいえこれも、ボタンが押されたという事を知ることができる程度で、
    > その時のマウス座標が、Excel 上のどの場所を指しているのかについては
    > 別途判断せねばなりません。要件を満たすまでに昇華するのは難しいかと。

    検索してもなかなかいい情報に巡り合えなかったので、少し糸口が見えました。
    いつもありがとうございます。

違反を報告
引用返信
■35007 / ResNo.3)  Re[3]: VBで開いたExcelでのイベントを取得するには
□投稿者/ 魔界の仮面弁士 大御所(1416回)-(2022/02/08(Tue) 18:05:17)
  • アイコンNo35006に返信(ぶぶさんの記事)
    > やりたいイベントとしても、セルをクリックまたは右クリック等がされたときに、
    > そのセルの内容から、処理をしたい。位のものなので、教えていただいたリンクを
    > 基に試行してみたいと思います。

    それであれば、
     Private WithEvents app As Excel.Application
    な変数に、Excel.Application のインスタンスをセットすることで
    イベントを受け取ることができるはずです。
    ワークブックが明確な場合は
     Private WithEvents book As Excel.Workbook
    を使うこともできます。


    Excel の操作方法は既にご存知かもしれませんが、
    とりあえずこのあたりを紹介しておきます。
    "Microsoft Excel x.x Object Library" への参照設定が必要です。
    http://hanatyan.sakura.ne.jp/vb2005/vb2013excel01.htm


    一応、参照設定なしでイベントを捉える方法も貼っておきます。
    参照設定する方法に比べると手間がかかるので、お奨めはしませんけど。
    https://www.petitmonte.com/bbs/answers?question_id=28859


    今回は VB で開いた Excel とのことですが、もし、すでに起動済みの
    Excel を拾う場合は、ROT(Running Object Table)から辿って取得できます。
違反を報告
引用返信
■35017 / ResNo.4)  Re[4]: VBで開いたExcelでのイベントを取得するには
□投稿者/ ぶぶ 一般人(3回)-(2022/03/09(Wed) 15:39:26)
  • アイコン魔界の仮面弁士様

    追加の情報までありがとうございました

    なんとかイベントも拾えました。


    抜粋ですが、
    <===================Form
    Option Explicit On
    Public Class frm_test
    Private Sub mnu_AAA_Click(sender As System.Object, e As System.EventArgs) Handles mnu_AAA.Click

    途中略


    ' ----- Excelのイベントを拾えるようにする
    ExObject.appevent = xlApp

    End Sub
    End Class
    <===================Module
    Imports Microsoft.Office.Interop
    Imports Microsoft.Office.Core
    Imports System.Runtime.InteropServices

    Module Bas_Excel
    Public xlApp As Excel.Application
    Public xlClose As Boolean
    Public xlChart As Excel.Chart

    Public xlBooks As Excel.Workbooks
    Public xlBook As Excel.Workbook
    Public xlSheets As Excel.Sheets
    Public xlSheet As Excel.Worksheet

    Public ExObject As New Cls_ExcelClick

    End Module



    <===================Class
    Public Class Cls_ExcelClick

    Public WithEvents appevent As Excel.Application

    Private Sub appevent_SheetBeforeDoubleClick(Sh As Excel.Worksheet, Target As Microsoft.Office.Interop.Excel.Range, _
    ByRef Cancel As Boolean) Handles appevent.SheetBeforeDoubleClick
    ' ' ----- Excelがダブルクリックされた時の処理
    xlSheet = xlApp.ActiveSheet
    If Sh.Name = xlSheet.Name Then

    ' ----- ダブルクリックが対象物の時処理をする
    Shell("c:\test\Bin\Sampletest.exe", AppWinStyle.NormalFocus)
    Else
    ' ----- 対象ではないので、何もしない
    End If
    End Sub
    End Class

    切り取っているので、わかりにくいかもしれません。

    解決をつけさせていただきます。

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

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

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



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35010 / 親記事)  Windowsエクスプローラへのドロップ先フォルダの取得
□投稿者/ よっし〜 一般人(5回)-(2022/03/07(Mon) 09:29:38)
  • アイコン環境/言語:[VB2013] 
    分類:[.NET] 

    いつもお世話になっております。

    現在DOBON様の「エクスプローラへファイルをDrag&Dropする」(https://dobon.net/vb/dotnet/control/droptoexplore.html)を参考に
    アプリケーションを作成しております。
    同「エクスプローラへファイルをDrag&Dropする」のコメントにも記載があるのですが、コントロールからWindowsエクスプローラへ
    ドラッグ&ドロップした際にドロップされたフォルダ名を取得する事は可能でしょうか?
    現在は処理として、Windowsエクスプローラに「架空のファイル」をドロップし、そのフォルダ名を取得して処理を行いたいと思って
    います。

    以上、宜しくご教示のほどお願いいたします。
違反を報告
引用返信

▽[全レス4件(ResNo.1-4 表示)]
■35012 / ResNo.1)  Re[1]: Windowsエクスプローラへのドロップ先フォルダの取得
□投稿者/ 魔界の仮面弁士 大御所(1418回)-(2022/03/07(Mon) 15:41:43)
  • アイコンNo35010に返信(よっし〜さんの記事)
    > 現在は処理として、Windowsエクスプローラに「架空のファイル」をドロップし、そのフォルダ名を取得して処理を行いたいと思って
    > います。

    自作アプリに対してドラッグ&ドロップするなら簡単ですが、
    対 Explorer に対してパスを得ようとすると、難しいと思います。


    まず大前提として、"FileDrop" 形式のドラッグ & ドロップを
    受け付けるアプリケーションというのは、
    Windows Explorer だけではありませんよね。

    もしも Explorer 以外にはドロップできないようにしたいのであれば、
    専用のシェルエクステンションを自作し、ドラッグするデータ形式を
    FileDrop ではなく独自形式にしてやり取りするなどの手間がかかると思います。
    https://docs.microsoft.com/ja-jp/windows/win32/shell/reg-shell-exts

    一方、Explorer 以外にもドロップ可能であるという点は許容した上で、
    相手が Explorer の時だけドロップ先のフォルダーを得ようとするとなると…
    ドロップ直後のマウスカーソル位置から、配下のウィンドウを辿って
    調べるといった手順が必要になるかと予想します。( Codeer.Friendly など )
    実際に可能であるかどうかは未検証ですが。


    Public Class Form1
      Private dragStart As System.Drawing.Point? = Nothing

      Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Label1.Text = "ドラッグしてください"
      End Sub

      Private Sub Label1_MouseDown(sender As Object, e As MouseEventArgs) Handles Label1.MouseDown
        dragStart = If(e.Button.HasFlag(MouseButtons.Left), e.Location, Nothing)
      End Sub
      Private Sub Label1_MouseUp(sender As Object, e As MouseEventArgs) Handles Label1.MouseUp
        dragStart = Nothing
      End Sub
      Private Sub Label1_MouseMove(sender As Object, e As MouseEventArgs) Handles Label1.MouseMove
        If dragStart.HasValue Then
          Dim moveRect As New Rectangle(
            dragStart.Value.X - SystemInformation.DragSize.Width \ 2,
            dragStart.Value.Y - SystemInformation.DragSize.Height \ 2,
            SystemInformation.DragSize.Width,
            SystemInformation.DragSize.Height)
          If moveRect.Contains(e.Location) Then
            Return 'まだドラッグを開始していない
          End If

          Dim dragData As New DataObject(DataFormats.FileDrop, New String() {"C:\NUL"})
          Dim de As DragDropEffects = Label1.DoDragDrop(dragData, DragDropEffects.Copy)
          If de = DragDropEffects.None Then
            Return 'ドラッグがキャンセルされた
          End If

          'ドロップ先のマウス座標は得られたが、
          'ここから対象フォルダーを調査できるか…?
          Dim pos = Cursor.Position


        End If
      End Sub

    End Class


    以下、思い付きでつらつらと。(試していません)

    (案1) AccessibleObjectFromPoint API を使って、
     IAccessible インターフェイスからドロップ先を調査できないか?

    (案2) System.Windows.Automation.AutomationElement.FromPoint メソッドで
     UIAutomation からドロップ先を調査できないか?

    (案3) WindowFromPoint API から得たドロップ先の HWND と、
     ShellWindows オブジェクトを列挙したオブジェクト階層から
     FolderItem プロパティと突き合わせて、Path プロパティを拾えないか?
違反を報告
引用返信
■35014 / ResNo.2)  Re[2]: Windowsエクスプローラへのドロップ先フォルダの取得
□投稿者/ よっし〜 一般人(7回)-(2022/03/07(Mon) 16:11:16)
  • アイコン魔界の仮面弁士様、早々のご教示、有り難うございます。

    > まず大前提として、"FileDrop" 形式のドラッグ & ドロップを受け付けるアプリケーションというのは、
    > Windows Explorer だけではありませんよね。
    そうなんですよね・・・周りにファイルをドロップ出来るアプリって沢山あると思います。
    例えばエクセルファイルを起動済みExcelにドロップするとそのファイルが開かれます。
    私の案の「ドロップ先のフォルダ名を知る」と言う話しは、この場合、全然違うものになってしまいますね。
    (ドロップ先フォルダってありませんものね)
    ユーザが必ずWindowsエクスプローラにドロップするかは分かりませんし、魔界の仮面弁士様のおっしゃっている通りですね。

    サンプルや腹案も投稿して頂いたのに申し訳ございませんが、もっと根本的な所から出直してきます。

    本当に有り難うございました。(大変勉強になりました)



解決み!
違反を報告
引用返信
■35015 / ResNo.3)  Re[3]: Windowsエクスプローラへのドロップ先フォルダの取得
□投稿者/ 魔界の仮面弁士 大御所(1419回)-(2022/03/08(Tue) 12:50:18)
  • アイコン2022/03/08(Tue) 13:09:19 編集(投稿者)

    No35014に返信(よっし〜さんの記事)
    > (ドロップ先フォルダってありませんものね)
    > ユーザが必ずWindowsエクスプローラにドロップするかは分かりませんし、

    仮に Explorer だとしても、ドロップ先は様々ですね。

    TreeView のフォルダーノードにドロップされることもあるでしょう。
    ドロップ先は物理フォルダーではなく、論理フォルダーかも知れません。

    タイトルバーにドロップされることもあれば、
    ListView の余白領域にドロップされることもあります。

    ListView 上の exeファイルやショートカットファイル上に
    ドロップされることもあれば、サブフォルダーにドロップされることも。

    そこまで追跡するとなると、ドロップ先の追跡は現実的では無いように思えます。


    >> Windowsエクスプローラに「架空のファイル」をドロップし、
    >> そのフォルダ名を取得して処理を行いたい

    操作を逆にしては駄目なのでしょうか。

    エクスプローラーから、ファイルまたはフォルダーを
    自アプリにドロップしてもらう形にすれば、
    そのフォルダー名を取得することも容易になりそうですが。
解決み!
違反を報告
引用返信
■35016 / ResNo.4)  Re[4]: Windowsエクスプローラへのドロップ先フォルダの取得
□投稿者/ よっし〜 一般人(8回)-(2022/03/08(Tue) 13:59:37)
  • アイコンNo35015に返信(魔界の仮面弁士さんの記事)
    > 操作を逆にしては駄目なのでしょうか。

    現在「ファイル管理アプリ(もどき)」を作成しております。
    Windowsエクスプローラからファイルをドロップしてもらって、ファイルとPDFファイルを作成し内部に保存します。
    処理したファイルはFlowLayoutPanelで表示し、それをWindowsエクスプローラにドラッグするとドラッグ先に
    ファイルを戻すのですが、この時ドラッグされた元ファイルなのか、作成したPDFファイルなのか選択したいので、
    一旦ドラッグ先のフォルダ名を取得後、ユーザに選択してもらって、後でゴリゴリとファイルコピーで
    処理したいと考えております。

    今も根本の方法(操作方法)を試行錯誤しながら行っており、一旦設定画面でファイル種類を設定し、その設定
    に従ってファイルを戻す処理にしようかと考えております。

    お忙しい中、どうも有り難うございました。


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

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



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35003 / 親記事)  デザイナでSystemColorsのような色一覧から選択できるようにしたい
□投稿者/ masa 一般人(1回)-(2022/02/02(Wed) 18:58:50)
  • アイコン環境/言語:[C# WindowsForms .NET Framework 4.5 VisualStudio2019 Windows10 64bit] 
    分類:[.NET] 

    お世話になっております。
    WindowsFormsアプリケーションのコントロールにおいて、
    デザイナでColor型プロパティをSystemColorsのような色一覧から選択できるようにし、
    自動生成されるコードにも反映されるようにしたいと考えています。

    具体的には下記のようなクラスを作成し、適当なフォームにTestControlを貼り付けた際に、
    プロパティウィンドウではBackColor/ForeColorをBackground/Foregroundの選択肢から選択、
    自動生成されるコードではForeColor = ThemeColors.Background;のようにしたいですが、
    ForeColor = Color.Whiteが自動生成されてしまいます。

    どなたかご助言いただけますでしょうか。
    よろしくお願いいたします。

    enum Themes
    {
    Dark,
    Light
    }

    class ThemeColors
    {
    public static Themes Theme { get; set; } = Themes.Light;

    public static Color Background => (Theme == Themes.Light ? Color.White : Color.Black);
    public static Color Foreground => (Theme == Themes.Light ? Color.Black : Color.White);
    }

    class ThemeColorConverter : TypeConverter
    {
    public override bool GetStandardValuesSupported(ITypeDescriptorContext context) => true;

    public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context) => new StandardValuesCollection(typeof(ThemeColors).GetProperties().Where(p => p.PropertyType == typeof(Color)).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) return typeof(ThemeColors).GetProperty(value.ToString())?.GetValue(null);
    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(ThemeColors).GetProperty(value.ToString()), null);
    return base.ConvertTo(context, culture, value, destinationType);
    }
    }

    class TestControl : Control
    {
    [Editor(typeof(UITypeEditor), typeof(UITypeEditor))]
    [TypeConverter(typeof(ThemeColorConverter))]
    public override Color BackColor { get => base.BackColor ; set => base.BackColor = value; }

    [Editor(typeof(UITypeEditor), typeof(UITypeEditor))]
    [TypeConverter(typeof(ThemeColorConverter))]
    public override Color ForeColor { get => base.ForeColor ; set => base.ForeColor = value; }
    }
違反を報告
引用返信



■記事リスト / ▼下のスレッド / ▲上のスレッド
■34988 / 親記事)  VisualStudio2019 以降の検索ダイアログが正常に動作しない
□投稿者/ kane132 一般人(1回)-(2021/12/25(Sat) 10:24:56)
  • アイコン環境/言語:[VB.net ] 
    分類:[.NET] 

    VisualStudio2019 以降の検索ダイアログが正常に動作しません。
    有償のProfessional版、無償版ともにです。


    具体的には Ctrl+ F も、 Ctrl + Shift + F の両方で発生します。
    ソース量が膨大な場合に顕著ですが、検索範囲:「プロジェクト内」で全文検索をしても「検索が最後まで来ました」との表示がされ、意図しているファイル内まで
    見に行ってくれません。

    意図しているファイルを開き、検索範囲:「現在のドキュメント」
    で検索をすると、当該単語でヒットします。


    かなりのストレスを感じるのですが、同様の事象を経験されている方、
    解決法の分かる方、いらっしゃいませんでしょうか?

違反を報告
引用返信

▽[全レス2件(ResNo.1-2 表示)]
■34989 / ResNo.1)  Re[1]: VisualStudio2019 以降の検索ダイアログが正常に動作しない
□投稿者/ shu 大御所(495回)-(2022/01/05(Wed) 08:08:20)
  • アイコンプロジェクトにファイルが含まれていないということはありませんか?
    ソリューション全体とかフォルダとかではどうでしょうか?

違反を報告
引用返信
■35002 / ResNo.2)  Re[2]: VisualStudio2019 以降の検索ダイアログが正常に動作しない
□投稿者/ kane123 一般人(4回)-(2022/01/23(Sun) 13:01:59)
  • アイコンNo34989に返信(shuさんの記事)
    > プロジェクトにファイルが含まれていないということはありませんか?
    > ソリューション全体とかフォルダとかではどうでしょうか?

    確認しましたが、そういったことはないと思われます。

    その後、自分なりに比較検証したので報告いたします。

    検証方法:プロジェクト内にある、「MemoryStream」 という文字列を対象に検索をかける。
         ( プロジェクト内には「MemoryStream」という文字列が各ファイルに10個存在する。 )

     @ Ctrl + Shift + F で「次を検索」で検索すると初回は全ての「MemoryStream」10個所でヒットする。が、最後に
       「ドキュメントの最後まで検索しました」まで行くと、2周目以降を見に行かない  ← これが当該事象。
     
     A @が起こった場合はVS に再起動すると解消することはすでに分かっているので別の解消方法を試みる、
         → 試しに Ctrl + Shift + F  の画面内で 「大文字小文字を区別する」 を ONにしてOFFにする 
         → すると おそらく@での「ドキュメントの最後まで検索しました」の状態が内部的にリセットされるようで
        検索はヒットするようになる。しかし、同様に 「ドキュメントの最後まで検索しました」まで行くと2周目以降
        は見に行かない。


     B  @Aの検証はあくまでステップ数が数万行のプロジェクトで発生したため、比較用に数10ステップしかないWindowsForm
       プロジェクトを作成し、 @を実施。 すると、
         → 2周目以降も問題なく検索がかかる (正常)
        Bから推論するとトータルのステップ数やファイル数が影響か?

    といったところです。

    以上を踏まえたうえで、何か根本的な解決策があればいいのですが・・。


    なお、初回の投稿者名:kane132 は誤りでした。すみません。
違反を報告
引用返信

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



■記事リスト / ▲上のスレッド
■34997 / 親記事)  Taskの入れ子の待ち方2
□投稿者/ Wan 付き人(56回)-(2022/01/06(Thu) 17:05:10)
  • アイコン環境/言語:[VisualBasic2019 Windows10 Basic Framework4.7.2] 
    分類:[.NET] 

    「Taskの入れ子の待ち方」の続きです。
    子Taskをラムダ式からメソッドへのデリゲートに変え、Task.Runにキャンセルトークンを渡すように変更したコードが次の通りです。
    Dim tokenSource As New CancellationTokenSource
    Private Async Sub Button6_Click(sender As Object, e As EventArgs)
    tokenSource = New CancellationTokenSource
        Debug.Print($"StartTask ID:{CurrentId} スレッド:{CurrentThread.ManagedThreadId}")
        Try
          Await Task.Run(AddressOf Test, tokenSource.Token)
        Finally
          tokenSource.Dispose()
        End Try
        Debug.Print($"FinishTask ID:{CurrentId} スレッド:{CurrentThread.ManagedThreadId}")
    End Sub
    
    Async Function Test() As Task
    Dim i As Integer = 0
        Debug.Print($"子Task ID:{CurrentId} スレッド:{CurrentThread.ManagedThreadId}")
        Dim 孫Task As Task = Task.Run(
          Sub()
              Dim j As Integer = 0
                Debug.Print($"孫子Task ID:{CurrentId} スレッド:{CurrentThread.ManagedThreadId}")
                While j < 7
                  If token.IsCancellationRequested Then
                      Debug.Print("孫Taskは、停止しました。")
                        Exit While
                    End If
                    Thread.Sleep(500) '0.5秒待つ
                    Debug.Print($"孫TaskCount:{j}")
                    j += 1
                End While
            End Sub)
        While i < 5
          If token.IsCancellationRequested Then
              Debug.Print("子Taskは、停止しました。")
                Exit While
            End If
          Thread.Sleep(500) '0.5秒待つ
            Debug.Print($"子TaskCount:{i}")
            i += 1
        End While
        Await 孫Task
    End Function
    すると、当然、Testメソッドにtokenの引数が無いので、Testメソッド側でtokenが認識できません。当然のように思えます。
    ネットでググっても、Testメソッドの引数にキャンセルトークンを渡しているものばかりが見つかります。
    ってことは、Task.Runで、キャンセルトークンを渡す必要性がそもそも無いということになるように思いますが、間違っていますでしょうか?何のためにキャンセルトークンをTask.Runで渡すのでしょうか?
    「Taskの入れ子の待ち方」では、ラムダ式で渡していたので、Task.Runでtokenを渡さなくてもメインスレッドのtokenの状態を確認することができました。
    Task.Runで、キャンセルトークンを渡しているので、孫タスク側で何か?うまい方法でtokenを認識する方法は?無いものでしょうか?
    質問の意図が通じますでしょうか?
    宜しくお願い致します。
    

違反を報告
引用返信

▽[全レス4件(ResNo.1-4 表示)]
■34998 / ResNo.1)  Re[1]: Taskの入れ子の待ち方2
□投稿者/ Wan 付き人(57回)-(2022/01/06(Thu) 17:57:32)
  • アイコン
    因みに、Task.Runにキャンセルトークンを渡さないで、ラムダ式で引数としてtokenを渡す場合は、次のようにすると上手くいきました。
    Private Async Sub Button7_Click(sender As Object, e As EventArgs) Handles Button7.Click
            tokenSource = New CancellationTokenSource
            Debug.Print($"StartTask ID:{CurrentId} スレッド:{CurrentThread.ManagedThreadId}")
            Try
                Await Task.Run(Function()
                                   Return Test2(tokenSource.Token)
                               End Function)
            Finally
                tokenSource.Dispose()
            End Try
            Debug.Print($"FinishTask ID:{CurrentId} スレッド:{CurrentThread.ManagedThreadId}")
        End Sub
    
        Async Function Test2(ByVal token As CancellationToken) As Task
            Dim i As Integer = 0
            Debug.Print($"子Task ID:{CurrentId} スレッド:{CurrentThread.ManagedThreadId}")
            Dim 孫Task As Task = Task.Run(
                            Sub()
                                Dim j As Integer = 0
                                Debug.Print($"孫子Task ID:{CurrentId} スレッド:{CurrentThread.ManagedThreadId}")
                                While j < 7
                                    If token.IsCancellationRequested Then
                                        Debug.Print("孫Taskは、停止しました。")
                                        Exit While
                                    End If
                                    Thread.Sleep(500) '0.5秒待つ
                                    Debug.Print($"孫TaskCount:{j}")
                                    j += 1
                                End While
                            End Sub)
            While i < 5
                If token.IsCancellationRequested Then
                    Debug.Print("子Taskは、停止しました。")
                    Exit While
                End If
                Thread.Sleep(500) '0.5秒待つ
                Debug.Print($"子TaskCount:{i}")
                i += 1
            End While
            Await 孫Task
        End Function

違反を報告
引用返信
■34999 / ResNo.2)  Re[1]: Taskの入れ子の待ち方2
□投稿者/ Hongliang 大御所(618回)-(2022/01/06(Thu) 17:59:07)
  • アイコン// Taskを返すメソッドは基本的にAsyncサフィクスをつけてTestAsyncのようにすると見通しがいいです。

    提示されたソースによればTest自体tokenを使っているので、そもそもそのコードではコンパイルエラーになりますよね。
    孫TaskにCancellationTokenを渡したいのであれば、Testがそれを提供する必要があるでしょう(まあCancellationTokenSourceから直接取るというケースもありますが)。
    なので、TestもCancellationTokenを引数に取る必要があるでしょう。

    引数を取るメソッド、例えばFunction Test(CancellationToken)に対してTask.Runするのであれば、ラムダ式を1つ挟むようにすればいいです。
    Task.Run(Function() Test(token), ...)
違反を報告
引用返信
■35000 / ResNo.3)  Re[2]: Taskの入れ子の待ち方2
□投稿者/ Hongliang 大御所(619回)-(2022/01/06(Thu) 18:01:10)
  • アイコンつまり質問内容としては、Task.Run(..., token)のこのCancellationTokenの必要性ということですか。
    このCancellationTokenについては以下のページなどを参考にしてください。
    https://ricka.co.jp/?p=16922
違反を報告
引用返信
■35001 / ResNo.4)  Re[3]: Taskの入れ子の待ち方2
□投稿者/ Wan 付き人(58回)-(2022/01/06(Thu) 18:30:00)
  • アイコンHongliangさん
    初歩的な質問に対して、丁寧な御指南有難うございます。
    教えて頂いた、HPを含め、教えていたた内容について、熟慮したいと思います。
    また、疑問が出た場合は、お手数ですが、御指南の程よろしくお願い致します。
    有難う御座いました。
解決み!
違反を報告
引用返信

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






Mode/  Pass/


- Child Tree -

2023/03/31(Fri) 17:43:09 に作成されたキャッシュを表示しています。
生のデータを表示する | キャッシュを最新にする