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

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

記事リスト ( )内の数字はレス数
NomalWindowsMediaPlayerで次のURLを指定しても反映されない。(2) | Nomal"−"を縦書きにしたい(9) | Nomal.NET6.0 のWinFormにWPFのユーザーコントロールを配置したい(4) | NomalDataGridViewの列にコンボボックスを表示する(2) | Nomalデータグリッドビューの特定の列ヘッダの色(2) | NomalVB-Report10→11への移行(4) | Nomalデフォルトプリンタの用紙向き変更(0) | NomalASP.net デバッグ時の .js ファイルの変更が反映されない(1) | NomalpictureBoxとlabelの重ね合わせ(2) | NomalWindowsエクスプローラへのドロップ先フォルダの取得(4) | Nomal入力値を元に描画させたい(2) | NomalVBで開いたExcelでのイベントを取得するには(4) | NomalデザイナでSystemColorsのような色一覧から選択できるようにしたい(0) | NomalTaskの入れ子の待ち方2(4) | NomalTaskの入れ子の待ち方(5) | NomalVisualStudio2019 以降の検索ダイアログが正常に動作しない(2) | NomalUsingの使い方が間違っている?(4) | Nomal//./の意味は?(2) | Nomalバイナリーファイルの結合と分解(2) | NomalVSTOとWebView2の共存って可能?(2) | Nomal表の最後の行の下にDropできない(1) | NomalCookieの勉強を始めました。(2) | NomalDataGridViewの特定セルにボタンを配置する方法(3) | NomalDataGridViewのセル結合部分にボタンを表示する方法(3) | Nomal複数のPageに分かれる場合のスクレ―ピング(6) | NomalTask.Runの使い方(4) | NomalPictureBox のサイズを設定する(2) | NomalProcessクラスMainModuleプロパティでアクセス拒否(3) | NomalLINQでControlsをEnable=Falseに設定(3) | Nomalランダムファイルを高速化させたい(5) | Nomalプロセス間の通信(相互)(2) | NomalC#をVBに変換する方法が分かりません(1) | NomalPictureBoxに動的に画像を表示する(1) | NomalYahooのHPで、検索文字の入力ができない(3) | NomalWebView2のEncodeの問題?(5) | NomalWinFormでChromeをSeleriumで操作しているが、Closeの仕方(2) | Nomal印刷部数の固定(1) | NomalWinformでのDataGridView Comboboxのデータ追加削除が出来ない(3) | Nomalプログラムについて。(2) | Nomal拡張子関連付けのサンプルで削除時 例外発生(1) | Nomalユーザーコントロールをフォームで使用した時のエラー(6) | NomalマルチページTIFFをSelectActiveFrameでページ指定するとエラーが発生する(12) | Nomal画像の大きさを取得するには(4) | Nomalファイルがドライブ内で占有する容量(3) | NomalC#FormのXボタンイベントで、e.Cancel が使えない(2) | NomalAxWindowsMediaPlayerでプレイリストの途中から再生するには(2) | NomalWebView2でJavaScriptの実行の終了イベント(4) | NomalDataTableのDataRowVersion毎のInt型値の比較がうまくいかない(5) | NomalGPTかMBRを判断したい(2) | Nomalアセンブリ言語について。(1) | Nomalマクロについて。(3) | NomalDLL内のスレッドからイベントを発行すると、受信したフォームでラベルが更新できない(3) | Nomalアセンブリ言語について。(20) | Nomalシステムコールについて。(2) | Nomal Parallel.Forで思ったより早くならない(5) | NomalAngleSharp.Scripting.JavaScriptの使い方(2) | NomalDataAdapterで2回目のUpDateが出来ない(6) | NomalForm1イベントの選択が出来なくなりました。(9) | Nomalデザーナー時の継承先formのサイズ(0) | Nomalコンソールではなくテキストボックスに文字列を出力したい(7) | NomalAngleSharpのクエリー文2(4) | Nomalコーディングについて。(3) | Nomaldll修正時、それを参照しているexeのリビルド要否(2) | NomalAngleSharpのクエリー文(2) | Nomalデフォルトプロパティを使いたい(6) | Nomalテキストボックスでの制御(7) | NomalUSBカメラをピクチャボックスに表示(3) | Nomal二次元配列内の文字の置き換え(3) | Nomalcolor型を引数にする方法(2) | NomalVSプロジェクト作成方法の違いによる、プラグイン機能を持つアプリケーションへの影響について(6) | NomalInputボタンが押せない(4) | NomalWebBrowserのDocumentCompletedイベントの切り替え(3) | NomalEndConnectでのエラー(2) | Nomalボタンクリック時のLeaveイベントについて(1) | Nomalエクセルのデータを配列に読込んだ時の配列要素番号について(2) | Nomalorder by で抽出したデータをDataTableに入れてForEachでDataRow取得した際の順番(2) | Nomal非同期プログラミング時のConsole.WriteLineの動作(4) | NomalC#からストアドにDecimalを渡すと値が丸められる(4) | Nomalインスタンスの型を文字列で指定したい(2) | NomalSendKeys.Sendが効いていない(2) | Nomal他のプロジェクトのコントロールがツールボックスに表示されない(3) | Nomal複数のテキストボックス間のTextChangedイベントが相互干渉しないようにしたい(9) | Nomal呼び出し元によってWebApi側の処理速度に差が出る(1) | NomalPanelのDock=Topだとうまくいかない。代替案。(2) | Nomal.NetでのIPv6の比較(5) | Nomal.Net 5.0 におけるDLL参照問題?(7) | Nomal追加コントロールのtabindex値を既存の間に設定する方法(1) | NomalVB.net非同期処理でtextboxに出力したい(2) | NomalToolStripStatusLabelの空白部分を埋めたい(2) | NomalOracle への OleDb 接続に失敗する(3) | Nomal正規表現で株価を取得したい(1) | NomalVB.NETで作成したDLLをVB6.0から呼び出す(3) | Nomalデザイナで編集・チェックアウトキャンセルすると(3) | Nomal親スレッドへ処理の移譲(7) | NomalクラスによるGetBytes関数のエンディアンの違い(2) | Nomal[VB.NET]Excelのプロセスが終了しない(2) | NomalC#をVBに変換した際の強制的な参照渡し(2) | Nomal.Net 5.0 におけるServiceControllerの代替クラス(3) | Nomal新たにshowしたフォームでのボタンのクリック(5) | NomalVB.NETからRDゲートウェイを利用したリモートデスクトップ接続(4) |



■記事リスト / ▼下のスレッド
■34892 / 親記事)  ユーザーコントロールをフォームで使用した時のエラー
□投稿者/ たこ 一般人(1回)-(2021/08/24(Tue) 08:45:15)
  • アイコン環境/言語:[VB.NET、.NET Framework 4.7.2] 
    分類:[.NET] 

    いつもお世話になります。いつも参考にさせて頂いており、お世話になっています。

    ユーザーコントロールを作成し、いざFormに張り付けて使用しようとするとエラーが出てしまいます。
    解決方法が判らず、ヒントだけでも頂ければと思い、投稿しました。



    <現状>
    ・ユーザーコントロールテストコンテナーで、単体では正常に動作する。
    ・フォームに張り付け、実行すると「System.ArgumentOutOfRengeException」が発生し、以後Form1[デザイン]を表示しようとしても以下のエラーが表示され、フォームのデザイン画面が表示されない。
    ・エラーが出る場所は判っているが、VisualStudioで自動生成されるコードの為、削除してもまた自動生成されてエラーが出る。



    <エラー内容>
    -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    このエラーのインスタンス (2)

    1。 コール スタックの非表示

    場所 System.ComponentModel.ReflectPropertyDescriptor.SetValue(Object component, Object value)
    場所 Microsoft.VisualStudio.Shell.Design.VsTargetFrameworkPropertyDescriptor.SetValue(Object component, Object value)
    場所 System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializePropertyAssignStatement(IDesignerSerializationManager manager, CodeAssignStatement statement, CodePropertyReferenceExpression propertyReferenceEx, Boolean reportError)
    場所 System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeAssignStatement(IDesignerSerializationManager manager, CodeAssignStatement statement)
    場所 System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeStatement(IDesignerSerializationManager manager, CodeStatement statement)

    2。 コール スタックの非表示

    場所 System.ComponentModel.ReflectPropertyDescriptor.SetValue(Object component, Object value)
    場所 Microsoft.VisualStudio.Shell.Design.VsTargetFrameworkPropertyDescriptor.SetValue(Object component, Object value)
    場所 System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializePropertyAssignStatement(IDesignerSerializationManager manager, CodeAssignStatement statement, CodePropertyReferenceExpression propertyReferenceEx, Boolean reportError)
    場所 System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeAssignStatement(IDesignerSerializationManager manager, CodeAssignStatement statement)
    場所 System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeStatement(IDesignerSerializationManager manager, CodeStatement statement)
    -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------



    <エラーが出るソース>
    Form1.Designer.vb内
    -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    '
    'EK_Icon1
    '
    Me.EK_Icon1.IconFileCollection = CType(resources.GetObject("EK_Icon1.IconFileCollection"), System.Collections.Generic.List(Of String))
    -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    => 上記1行を削除して実行すると正常に実行されFormが表示されて、Form1[デザイン]も正常に表示される。




    <関連しているユーザーフォームのプロパティ>
    -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
      ''' <summary>
      ''' 状態表示に使用する状態ファイル名リスト。
      ''' </summary>
      ''' <returns>各状態のファイル名リスト</returns>
      <Category("設定"), Bindable(False), Description("状態表示のアイコンファイル名リスト。")>
      Public Property IconFileCollection As List(Of String)
        Get
          Return _IconFileCollection
        End Get
        Set(value As List(Of String))
          If value Is Nothing Then Exit Property

          DefaultIconUse = False
          If value.Count > StateCount Then
            Throw New Exception("状態アイコンは" & StateCount & "個です")
            Exit Property
          End If
          _IconFileCollection = value
          For x As Integer = 1 To _IconFileCollection.Count - 1
            _IconCollection(x - 1) = Image.FromFile(_IconFileCollection(x - 1))
          Next
          Status = Status
          PictureBox1.Invalidate()
        End Set
      End Property
    -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    => Set(value As List(Of String))直下に「If value Is Nothing Then Exit Property」を入れてみたのですが、変わりませんでした。




    <ユーザーアイコン EK-Icon概要>
    -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    ・プライベートフィールド _IconCollectionにイメージリストを持っており、パブリックプロパティ「Statsu」に番号を指定すると指定されたイメージを表示する。
    ・パブリックプロパティ DefaultIconUse As BooleanプロパティにTrueを設定するとデフォルトで設定されているイメージになる。(_IconCollectionにデフォルトアイコンを読み込む)
    ・パブリックプロパティ IconFileCollection As List(Of String)にファイル名を設定すると該当ファイルのイメージを_IconCollectionに読み込む。(上記ソース参照)
    ・DefaultIconUseとIconFileCollectionは排他処理。
    -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------





    関連している箇所はこんなところだと思っているのですが…
    以上よろしくお願い致します。

違反を報告
引用返信

▽[全レス6件(ResNo.2-6 表示)]
■34894 / ResNo.2)  Re[1]: ユーザーコントロールをフォームで使用した時のエラー
□投稿者/ 魔界の仮面弁士 大御所(1395回)-(2021/08/24(Tue) 10:16:40)
  • アイコンNo34892に返信(たこさんの記事)
    > Me.EK_Icon1.IconFileCollection = CType(resources.GetObject("EK_Icon1.IconFileCollection"), System.Collections.Generic.List(Of String))
    .resx ファイルには EK_Icon1.IconFileCollection のエントリーがある状態ですか?
    名前空間のズレがないかも確認を。

    今回、デザイナコード内に永続化したいのは、List(Of ) 内の個々のアイテムですか?
    それとも、それらのアイテムを保持している List(Of ) のインスタンスそのものですか?
    それによって、デザイン時に指定すべき属性値が異なってきます。
    http://www.comrade.co.jp/component/dotnetroom/kt_vsdn/kt_vs5c.htm


    > If value.Count > StateCount Then
    >  Throw New Exception("状態アイコンは" & StateCount & "個です")
    StateCount は固定値ですか。それとも変動値ですか?

    たとえば StateCount が、読み書き可能なプロパティによって変化する値だとしたら、
     ・IconFileCollection がセットされた後で、StateCount の値が小さくなることはないのか?
     ・デザイナコードで永続化されたときに、StateCount と IconFileCollection の永続化順が
      どちらが先に行われても問題が無いような設計になっているか?
    という点が気にかかります。

    プロパティの設定順を考慮する必要がある場合には、UserControl に対して
    ISupportInitialize インターフェイスを Implements するようにします。
    たとえば NumericUpDown の Minimum / Maximum / Value プロパティなどがこの設計です。


    > パブリックプロパティ「Statsu」に番号を指定すると
    スタツ…? Stat数?


    >   Public Property IconFileCollection As List(Of String)
    ところで、ReadOnly Property にはしないのでしょうか。

    たとえば ListView や ListBox の Items プロパティは ReadOnly ですが、
    その中身はデザイン時に保持できる設計になっていますよね。
     ListBox1.Items.Clear() 'OK
     ListBox1.Items.Add("TEST") 'OK
     ListBox1.Items = Nothing 'NG
     ListBox1.Items = ListBox2.Items 'NG

    この場合、DesignerSerializationVisibility 属性で Content を指定しておけば、
    コレクションそのものではなく、コレクションの中身を永続化することができます。


    また、プロパティに List(Of ) を設定しているということで、後から
     Me.EK_Icon1.IconFileCollection(3) = "New Item"
    のような部分差し替えが許可されるのか否か、という疑問もあります。

    許可しないなら、IReadOnlyList(Of ) などの出力専用型を使う選択肢もありますし、
    許可するのなら、変更通知付きコレクション、たとえば ObservableCollection(Of ) などを使えるかと思います。


    > Set(value As List(Of String))
    >   If value Is Nothing Then Exit Property
    >   DefaultIconUse = False
    >   If value.Count > StateCount Then
    >     Throw New Exception("状態アイコンは" & StateCount & "個です")
    >     Exit Property
    >   End If

    Throw の後の Exit Property って意味がないような。

    素の Exception が使われると、後で対処しにくくなるので、自分なら、
     If value Is Nothing Then
      Throw new ArgumentNullException(NameOf(IconFileCollection))
     ElseIf value.Count > StateCount Then
      Throw New ArgumentOutOfRangeException(NameOf(IconFileCollection), "状態アイコンは" & StateCount & "個以下でなければなりません"))
     End If
    のようにするかな。
違反を報告
引用返信
■34895 / ResNo.3)  Re[2]: ユーザーコントロールをフォームで使用した時のエラー
□投稿者/ たこ 一般人(4回)-(2021/08/24(Tue) 11:39:20)
  • アイコンNo34894に返信(魔界の仮面弁士さんの記事)


    早速のご回答ありがとうございます。

    > ■No34892に返信(たこさんの記事)
    >>Me.EK_Icon1.IconFileCollection = CType(resources.GetObject("EK_Icon1.IconFileCollection"), System.Collections.Generic.List(Of String))
    > .resx ファイルには EK_Icon1.IconFileCollection のエントリーがある状態ですか?
    > 名前空間のズレがないかも確認を。


    そう言えばリソースにStringリスト作っていません。そこが問題でしょうか…^^;




    > 今回、デザイナコード内に永続化したいのは、List(Of ) 内の個々のアイテムですか?
    > それとも、それらのアイテムを保持している List(Of ) のインスタンスそのものですか?
    > それによって、デザイン時に指定すべき属性値が異なってきます。
    > http://www.comrade.co.jp/component/dotnetroom/kt_vsdn/kt_vs5c.htm


    パッと見た限りでは意味が解りませんでした^^;
    関連していそうな情報なのでじっくり読んでみます。
    情報ありがとうございます。




    >>If value.Count > StateCount Then
    >> Throw New Exception("状態アイコンは" & StateCount & "個です")
    > StateCount は固定値ですか。それとも変動値ですか?
    >
    > たとえば StateCount が、読み書き可能なプロパティによって変化する値だとしたら、
    >  ・IconFileCollection がセットされた後で、StateCount の値が小さくなることはないのか?
    >  ・デザイナコードで永続化されたときに、StateCount と IconFileCollection の永続化順が
    >   どちらが先に行われても問題が無いような設計になっているか?
    > という点が気にかかります。
    >
    > プロパティの設定順を考慮する必要がある場合には、UserControl に対して
    > ISupportInitialize インターフェイスを Implements するようにします。
    > たとえば NumericUpDown の Minimum / Maximum / Value プロパティなどがこの設計です。


    > StateCount は固定値ですか。それとも変動値ですか?


    固定値です。
      Private Const StateCount = 5 * 2
    5つの状態の画像+マウスエンター時の状態画像5枚です。
    状態を増やす事があるかも知れないと考え、定数定義してあります。

    ISupportInitialize 調べました!
    これはこのメソッドが付いている上から順番に実行されると言う認識で良いのでしょうか^^?




    >>パブリックプロパティ「Statsu」に番号を指定すると
    > スタツ…? Stat数?


    Statusのタイプミスです^^;;;;;;;;;;




    >>  Public Property IconFileCollection As List(Of String)
    > ところで、ReadOnly Property にはしないのでしょうか。
    >
    > たとえば ListView や ListBox の Items プロパティは ReadOnly ですが、
    > その中身はデザイン時に保持できる設計になっていますよね。
    >  ListBox1.Items.Clear() 'OK
    >  ListBox1.Items.Add("TEST") 'OK
    >  ListBox1.Items = Nothing 'NG
    >  ListBox1.Items = ListBox2.Items 'NG
    >
    > この場合、DesignerSerializationVisibility 属性で Content を指定しておけば、
    > コレクションそのものではなく、コレクションの中身を永続化することができます。


    外部からファイル名リストをIconFileCollectionプロパティにセットして、画像を変更したいのです…
    デザイン時はコレクションの中身は「無し」と考えており、別に「DefaultIconUse As Boolean = True」と言うプロパティがあり、
    リソースからデフォルトアイコンをコレクションに読み込みます。
    IconFileCollectionにファイル名リストが入力された場合のみイメージを変更したいです。
    上記ListBoxの使い方と同じ使い方をイメージしていますので、属性についても調べてみたいと思います。




    > また、プロパティに List(Of ) を設定しているということで、後から
    >  Me.EK_Icon1.IconFileCollection(3) = "New Item"
    > のような部分差し替えが許可されるのか否か、という疑問もあります。
    >
    > 許可しないなら、IReadOnlyList(Of ) などの出力専用型を使う選択肢もありますし、
    > 許可するのなら、変更通知付きコレクション、たとえば ObservableCollection(Of ) などを使えるかと思います。


    私には難しい領域です^^;
    日々検索して、こうやったらどうか…と研究はしているのですが、知識が追いつきません^^;

    IReadOnlyList …サンプルコードも無く、意味や使い方が解りませんでした…(;^_^A
    変更出来ないコレクション???
    => https://docs.microsoft.com/ja-jp/dotnet/api/system.collections.generic.ireadonlylist-1?view=net-5.0

    ObservableCollection …こちらは使い勝手が良くなりそうですね。場合によっては検討します。




    >>Set(value As List(Of String))
    >>  If value Is Nothing Then Exit Property
    >>  DefaultIconUse = False
    >>  If value.Count > StateCount Then
    >>    Throw New Exception("状態アイコンは" & StateCount & "個です")
    >>    Exit Property
    >>  End If
    >
    > Throw の後の Exit Property って意味がないような。


    やっぱりそうなのですね(;^_^A
    そうじゃないかなとも思ったのですが、自信が無かったもので^^;




    > 素の Exception が使われると、後で対処しにくくなるので、自分なら、
    >  If value Is Nothing Then
    >   Throw new ArgumentNullException(NameOf(IconFileCollection))
    >  ElseIf value.Count > StateCount Then
    >   Throw New ArgumentOutOfRangeException(NameOf(IconFileCollection), "状態アイコンは" & StateCount & "個以下でなければなりません"))
    >  End If
    > のようにするかな。


    例外処理も苦手でして…
    そう言う使い方も出来るのですね。


    いつもいろいろと勉強させて頂いてます。
    ありがとうございます。
違反を報告
引用返信
■34896 / ResNo.4)  Re[3]: ユーザーコントロールをフォームで使用した時のエラー
□投稿者/ 魔界の仮面弁士 大御所(1396回)-(2021/08/24(Tue) 13:40:02)
  • アイコンNo34895に返信(たこさんの記事)
    > そう言えばリソースにStringリスト作っていません。そこが問題でしょうか…^^;
    たとえば、ToolStrip をフォームに貼って右クリックすると、
    [標準項目の挿入]メニューが現れますね。

    この場合、Form1.resx 内に各ボタンのアイコン画像記録されるわけですが、
    まず、このような resx が自動生成されていて、その中身が想定通りで
    あるかどうかという点を確認したものです。

    これは、resources.GetObject 自体が失敗しているのか、それとも、
    その値を受け取る側に問題があるのかの切り分けです。


    >> 今回、デザイナコード内に永続化したいのは、List(Of ) 内の個々のアイテムですか?
    >> それとも、それらのアイテムを保持している List(Of ) のインスタンスそのものですか?
    > パッと見た限りでは意味が解りませんでした^^;

    たとえば、ListBox を貼って、デザイン時に Items プロパティに複数行の文字列を書き込んでみてください。

    その場合、Form1.designer.vb に記述される内容は、
    ListBox1.Items = … ではなく、
    ListBox1.Items.AddRange(…) となるはずです。

    これは、Items プロパティが ReadOnly であり、かつ、そのプロパティに
    <DesignerSerializationVisibility(DesignerSerializationVisibility.Content)>
    という属性が指定されているためです。


    > Private Const StateCount = 5 * 2
    Private Const StateCount As Integer = 5 * 2
    の方が、より望ましいかと思います。

    もっとも、現行の VB バージョンであれば、
     Option Infer Off
     Option Strict On
    に設定されない限りは、自動的に As Integer として解釈されるのですけれどね。


    > ISupportInitialize 調べました!
    > これはこのメソッドが付いている上から順番に実行されると言う認識で良いのでしょうか^^?
    いいえ。「初期化中かどうか」を定義するものです。

    今回の場合、StateCount が固定値であるとのことなので、ISupportInitialize の実装は
    無くても大丈夫そうですが、一応説明しておくと。

    たとえば NumericUpDown の場合、プロパティの最小値≦現在値≦最大値 の関係を
    維持する必要がありますが、Form1.Designer.vb の時点ではその設定順序を制御できません。

    「If value.Count > StateCount Then」も同様で、StateCount が定数ではなく変数だった場合、
    StateCount が確定する前に value が渡されてくることがあり得るわけです。

    このように、各変数間で依存関係があり、設定順序が問題になるようなケースでは、
    そのコントロールやコンポーネントに対して ISupportInitialize を実装しておくと、
    ・InitializeComponent() の冒頭で ISupportInitialize.BeginInit が呼ばれる
    ・InitializeComponent() の最後に ISupportInitialize.EndInit が呼ばれる
    という形で呼び出されるようになります。

    この機構を用いて、BeginInit が呼ばれてから EndInit までのの間は
    『初期化中』として扱うための仕組みを、フラグ等を用いて自力実装します。

    そして初期化中はプロパティの依存関係チェックを行わないようにしておき、
    「初期化中以外でプロパティの setter が呼ばれたとき」や
    「EndInit が呼ばれたとき」には、通常の範囲チェックを行うようにします。



    > 外部からファイル名リストをIconFileCollectionプロパティにセットして、画像を変更したいのです…
    コレクションのインスタンスそのものを受け渡す場合、
     Me.EK_Icon1.IconFileCollection = list1
     Me.EK_Icon2.IconFileCollection = list1
    のような記述も許可されます。この場合、
     Me.EK_Icon1.IconFileCollection(0) = "zero.jpg"
    と書き換えた場合、 EK_Icon2 側の内容も同時に書き換わります。

    また、setter にて .Count をチェックしてはいますが、実際には
     Me.EK_Icon1.IconFileCollection.Add(f)
    のように、後から件数を増減することもできてしまいます。

    これらの操作では、プロパティの setter を通過することなく内容が書き換わるため、
     「If value.Count > StateCount Then」
    のチェックをすり抜けることになりますが、問題ないのでしょうか?
    (たとえば ListBox の場合、Items プロパティと DataSource プロパティは区別していますよね)


    > デザイン時はコレクションの中身は「無し」と考えており、別に「DefaultIconUse As Boolean = True」と言うプロパティがあり、
    > リソースからデフォルトアイコンをコレクションに読み込みます。
    その場合、デフォルトアイコンを必要とする場合は、
    IconFileCollection を永続化しない方が都合が良いかも知れませんね。

    プロパティ値の保存を行うかどうかを制御したい場合には、
     Private Function ShouldSerializeIconFileCollection() As Boolean
      Return Not DefaultIconUse
     End Function
     Private Sub ResetIconFileCollection()
      '_IconCollection と _IconFileCollection のリセット処理
     End Sub
    というメソッドを用意しておけば OK です。詳細は下記参照。
    https://docs.microsoft.com/ja-jp/dotnet/desktop/winforms/controls/defining-default-values-with-the-shouldserialize-and-reset-methods?WT.mc_id=DT-MVP-8907&view=netframeworkdesktop-4.8


    > IReadOnlyList …サンプルコードも無く、意味や使い方が解りませんでした…(;^_^A
    文字通り、読み取り専用版のリストですね。

    読み取り専用版のコレクションを生成するのは簡単です。
     x = Array.AsReadOnly(一次元配列) '「配列」の場合
     x = リスト.AsReadOnly() '「リスト」の場合
    これで、System.Collections.ObjectModel.ReadOnlyCollection のインスタンスが生成されます。

    あるいは AsReadOnly を呼び出す代わりに、下記のようにすることもできます。
     x = New ReadOnlyCollection(Of 型)( リスト )


    >> Throw の後の Exit Property って意味がないような。
    > そうじゃないかなとも思ったのですが、自信が無かったもので^^;
    Throw の直後の行が実行されることがあるとすれば、
    「On Error Resume Next」を併用していた場合ぐらいですね。
違反を報告
引用返信
■34897 / ResNo.5)  Re[4]: ユーザーコントロールをフォームで使用した時のエラー
□投稿者/ たこ 一般人(5回)-(2021/08/24(Tue) 17:29:16)
  • アイコンNo34896に返信(魔界の仮面弁士さんの記事)

    回答ありがとうございます。


    > ■No34895に返信(たこさんの記事)
    >>そう言えばリソースにStringリスト作っていません。そこが問題でしょうか…^^;
    > たとえば、ToolStrip をフォームに貼って右クリックすると、
    > [標準項目の挿入]メニューが現れますね。

    〜(略)〜

    > これは、resources.GetObject 自体が失敗しているのか、それとも、
    > その値を受け取る側に問題があるのかの切り分けです。


    私の雑な頭では理解が出来ませんでした^^;




    > >> 今回、デザイナコード内に永続化したいのは、List(Of ) 内の個々のアイテムですか?
    > >> それとも、それらのアイテムを保持している List(Of ) のインスタンスそのものですか?
    >>パッと見た限りでは意味が解りませんでした^^;
    >
    > たとえば、ListBox を貼って、デザイン時に Items プロパティに複数行の文字列を書き込んでみてください。

    〜(略)〜


    > これは、Items プロパティが ReadOnly であり、かつ、そのプロパティに
    > <DesignerSerializationVisibility(DesignerSerializationVisibility.Content)>
    > という属性が指定されているためです。


    ちょっとListBoxについて調べてみました。
    ItemsプロパティはListBox.ObjectCollectionの参照なのですね…
    で、その参照がReadOnlyになっていると…
    最近ReadOnlyが値だけではなく、参照にも使用出来ると言う事を覚えたばかりです(笑)
    まだまだ勉強が足りません…苦笑


    たった今疑問が生じました。。。
    Public Property IconFileCollection As List(Of String)

    Public ReadOnly Property IconFileCollection As List(Of String)
    …としたとして、別のIconFileCollectionにコレクションを入力するプロパティを作ったとして、
    またそのプロパティに同じエラーが発生しないものでしょうか…
    あ、メソッドで作ってしまえば良いんでしょうかね…
    デザイン時のプロパティで設定出来るのが望ましいですが、
    私の知識が追いつかない為、最悪はメソッドで作ってメソッドでファイル名リストコレクションを渡す事にします。。。



    >>Private Const StateCount = 5 * 2
    > Private Const StateCount As Integer = 5 * 2
    > の方が、より望ましいかと思います。

    〜(略)〜


    たまに型宣言、書き忘れます^^;;;
    ご指摘ありがとうございます。




    >>ISupportInitialize 調べました!
    >>これはこのメソッドが付いている上から順番に実行されると言う認識で良いのでしょうか^^?
    > いいえ。「初期化中かどうか」を定義するものです。

    〜(略)〜

    > この機構を用いて、BeginInit が呼ばれてから EndInit までのの間は
    > 『初期化中』として扱うための仕組みを、フラグ等を用いて自力実装します。


    自力実装するならわざわざIsupportInitializeを使用しなくても良い様な…^^:
    …と思ってしまったダメな子です><




    >>外部からファイル名リストをIconFileCollectionプロパティにセットして、画像を変更したいのです…
    > コレクションのインスタンスそのものを受け渡す場合、
    >  Me.EK_Icon1.IconFileCollection = list1
    >  Me.EK_Icon2.IconFileCollection = list1
    > のような記述も許可されます。この場合、
    >  Me.EK_Icon1.IconFileCollection(0) = "zero.jpg"
    > と書き換えた場合、 EK_Icon2 側の内容も同時に書き換わります。


    そこは思わぬ副産物(笑)
    それはその方が良いです(笑)




    > また、setter にて .Count をチェックしてはいますが、実際には
    >  Me.EK_Icon1.IconFileCollection.Add(f)
    > のように、後から件数を増減することもできてしまいます。
    >
    > これらの操作では、プロパティの setter を通過することなく内容が書き換わるため、
    >  「If value.Count > StateCount Then」
    > のチェックをすり抜けることになりますが、問題ないのでしょうか?
    > (たとえば ListBox の場合、Items プロパティと DataSource プロパティは区別していますよね)


    問題大ありです(笑)
    一応ほとんどはプライベートフィールドになっており、直接は書き換えられない様にはなっています。

      Private _IconFileCollection As New List(Of String)




    >>デザイン時はコレクションの中身は「無し」と考えており、別に「DefaultIconUse As Boolean = True」と言うプロパティがあり、
    >>リソースからデフォルトアイコンをコレクションに読み込みます。
    > その場合、デフォルトアイコンを必要とする場合は、
    > IconFileCollection を永続化しない方が都合が良いかも知れませんね。


    そこは考えました!

      Private _DefalutIconUse As Boolean = True

    -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
      ''' <summary>
      ''' デフォルトのアイコンを使用する時にTrueにします。
      ''' </summary>
      ''' <returns></returns>
      <Category("設定"), Bindable(True), Description("デフォルトのアイコンを使用する時にTrueにします。")>
      Public Property DefaultIconUse As Boolean
        Get
          Return _DefalutIconUse
        End Get
        Set(value As Boolean)
          DefalutIconUse = value
          If _DefalutIconUse Then
            Dim asm As System.Reflection.Assembly = System.Reflection.Assembly.GetExecutingAssembly()
            Dim rm As New System.Resources.ResourceManager(asm.GetName().Name + ".Resources", asm)
            Dim bmp As Bitmap = Nothing

            _IconFileCollection.Clear()
            For x As Integer = 1 To StateCount
              bmp = CType(rm.GetObject(x), Bitmap)
              Me._IconCollection.Add(bmp)
            Next
          Else
            _IconCollection.Clear()
            PictureBox1.Image = Nothing
          End If
        End Set
      End Property
    -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------




    > プロパティ値の保存を行うかどうかを制御したい場合には、
    >  Private Function ShouldSerializeIconFileCollection() As Boolean
    >   Return Not DefaultIconUse
    >  End Function
    >  Private Sub ResetIconFileCollection()
    >   '_IconCollection と _IconFileCollection のリセット処理
    >  End Sub
    > というメソッドを用意しておけば OK です。詳細は下記参照。
    > https://docs.microsoft.com/ja-jp/dotnet/desktop/winforms/controls/defining-default-values-with-the-shouldserialize-and-reset-methods?WT.mc_id=DT-MVP-8907&view=netframeworkdesktop-4.8


    これは…
    リセット出来るプロパティを作る…と言う認識でよろしいのでしょうか^^?
    上記ホームページ内、下の方の「関連項目」の少し上…
    ------------------------------------------------------------------------------------------------------
    代わりに、ShouldSerialize および Reset メソッドを MyFont プロパティに対して実装する必要があります。
    ------------------------------------------------------------------------------------------------------
    …と書かれていますが、プロパティにメソッドを作成する事が出来るのですか?




    >>IReadOnlyList …サンプルコードも無く、意味や使い方が解りませんでした…(;^_^A
    > 文字通り、読み取り専用版のリストですね。
    >
    > 読み取り専用版のコレクションを生成するのは簡単です。


    これはどうやって初期化するのかなと思ってしまいました。
    ReadOnly Propertyと同じ様にコンストラクタだけで初期化出来るのでしょうか?




    > >> Throw の後の Exit Property って意味がないような。
    >>そうじゃないかなとも思ったのですが、自信が無かったもので^^;
    > Throw の直後の行が実行されることがあるとすれば、
    > 「On Error Resume Next」を併用していた場合ぐらいですね。


    ご教授ありがとうございます。
    …と言うか…
    On Error Resume Nextと併用が出来るのですね…

    まだまだ初心者の域を脱しません…^^;
違反を報告
引用返信
■34898 / ResNo.6)  Re[5]: ユーザーコントロールをフォームで使用した時のエラー
□投稿者/ たこ 一般人(6回)-(2021/08/26(Thu) 21:58:39)
  • アイコンNo34897に返信(たこさんの記事)


    いろいろとご指導頂きありがとうございました。

    とりあえず今回は、
      Public Property IconFileCollection As List(Of String)



      Public WriteOnly Property IconFileCollection As List(Of String)
    と、WriteOnlyにする事でエラーが出なくなりましたので、
    今回はこれで行きたいと思います。
    本当ならばデザイン時にも設定をしたいところではありますが、
    勉強が追いつきません…

    また進展があればご報告致します。
    ありがとうございました。
解決み!
違反を報告
引用返信

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



■記事リスト / ▼下のスレッド / ▲上のスレッド
■34879 / 親記事)  マルチページTIFFをSelectActiveFrameでページ指定するとエラーが発生する
□投稿者/ tomy 一般人(11回)-(2021/08/23(Mon) 15:07:37)
  • アイコン環境/言語:[Windows7/C#/VisualStudio2015/.Net Framework4.5] 
    分類:[.NET] 

    2021/08/23(Mon) 19:05:30 編集(投稿者)
    2021/08/23(Mon) 19:05:18 編集(投稿者)

    現在、マルチページTIFFを読み込んで、個別のイメージにバラしたり、各ページを指定して取り出したりできるようなアプリを作成中です。

    サイズが小さいファイルなら問題ないのですが、モノクロ、カラー、グレースケールが混在した9ページのファイル(41MB程度)を読み込むと、4ページ目を表示したときにエラーが発生します。

    読み込み時は単純にImage

    img = System.Drawing.Bitmap.FromFile(filename);
    dimension = new System.Drawing.Imaging.FrameDimension(img.FrameDimensionsList[0]);
    pictureBox1.Image = img;

    としており、ボタンを押すとページを+1して画面に表示しています。

    dispPageNo++;
    img.SelectActiveFrame(dimension, dispPageNo);
    pictureBox1.Image = img;

    最初の3ページは正常に表示できますが、4ページ目になると
    「GDI+ で汎用エラーが発生しました。」
    というエラーが発生してしまいます。

    試しに、サイズの小さなマルチページTIFF(カラー、9ページ、82KB)を作って試してみたらエラーになりませんでした。

    なんとか回避する方法はないものでしょうか・・・。


違反を報告
引用返信

▽[全レス12件(ResNo.8-12 表示)]
■34887 / ResNo.8)  Re[6]: マルチページTIFFをSelectActiveFrameでページ指定するとエラーが発生する
□投稿者/ 魔界の仮面弁士 大御所(1393回)-(2021/08/23(Mon) 18:00:19)
  • アイコンNo34886に返信(tomyさんの記事)
    > ファイルを添付します。

    下記のコードで実験しましたが、特に問題は発生しませんでした。

    private System.IO.MemoryStream ms = null;
    private Bitmap bmp = null;
    private int maxPage = 0;
    private int currentPage = 0;
    private void Form1_Load(object sender, EventArgs e)
    {
      string filePath = @"C:\test\MultiTiff_グレー2値混在.tif";
      this.bmp = new Bitmap(this.ms = new System.IO.MemoryStream(System.IO.File.ReadAllBytes(filePath)));
      this.maxPage = bmp.GetFrameCount(FrameDimension.Page);
      this.pictureBox1.Image = this.bmp;
      this.currentPage = 1;
      this.button1.Text = currentPage + "/" + this.maxPage;
    }

    private void button1_Click(object sender, EventArgs e)
    {
      if (this.currentPage == this.maxPage)
      {
        this.currentPage = 1;
      }
      else
      {
        this.currentPage++;
      }
      this.bmp.SelectActiveFrame(FrameDimension.Page, currentPage - 1);
      this.button1.Text = this.currentPage + "/" + this.maxPage;
      this.pictureBox1.Invalidate();
    }
違反を報告
引用返信
■34888 / ResNo.9)  Re[7]: マルチページTIFFをSelectActiveFrameでページ指定するとエラーが発生する
□投稿者/ tomy 一般人(16回)-(2021/08/23(Mon) 19:02:13)
  • アイコンソースをコピペのうえ、
    using System.Drawing.Imaging;
    を追加して、ファイルの場所だけ変更して実行しましたが、やはりおかしくなってしまいます。
    環境の差でしょうか・・・。

    ちょっと気になったのでVisual Studio 2017、Visual Studio 2019で同じソースにて実験してみたら正常に動きました。
    Visual Studio 2015ではダメなのかもしれません。

673×526 => 250×195
イメージ
MultiTiffError.png
/9KB
違反を報告
引用返信
■34889 / ResNo.10)  Re[7]: マルチページTIFFをSelectActiveFrameでページ指定するとエラーが発生する
□投稿者/ tomy 一般人(17回)-(2021/08/23(Mon) 19:08:42)
  • アイコン申し訳ありません。
    最初に書いたOSが間違っていました。
    Windows7でした。
    最初Windows10と書いておりました。

    Windows 10上のVisualStudio2017で作成し、正常に動くことを確認したEXEをWindows7にもっていって実行するとおかしくなりました。

    逆に、Windows7 VisualStudio2015で作成し、正常に動かないEXEをWindows10上で実行すると正常に動きます。

    このことから、Windows7が問題ではないかと思われます。

違反を報告
引用返信
■34890 / ResNo.11)  Re[8]: マルチページTIFFをSelectActiveFrameでページ指定するとエラーが発生する
□投稿者/ 魔界の仮面弁士 大御所(1394回)-(2021/08/23(Mon) 19:56:47)
  • アイコンNo34889に返信(tomyさんの記事)
    > このことから、Windows7が問題ではないかと思われます。

    .NET Framework の問題ではなく、
    Windows 7 の Windows Imaging Component に問題があるのかもしれませんね。

    https://social.msdn.microsoft.com/Forums/en-US/6cfab893-467d-4116-aba0-31eb98c0c899/imagefromfile-strange-side-effect-with-tif-images-in-win7?forum=netfxbcl


    現行 OS では無いので(Win7 は 2020/01/14 でサポート期限切れ)、
    今となっては、もはや気にしなくても良いのかも。
違反を報告
引用返信
■34891 / ResNo.12)  Re[9]: マルチページTIFFをSelectActiveFrameでページ指定するとエラーが発生する
□投稿者/ tomy 一般人(18回)-(2021/08/23(Mon) 20:11:00)
  • アイコン> .NET Framework の問題ではなく、
    > Windows 7 の Windows Imaging Component に問題があるのかもしれませんね。
    >
    > https://social.msdn.microsoft.com/Forums/en-US/6cfab893-467d-4116-aba0-31eb98c0c899/imagefromfile-strange-side-effect-with-tif-images-in-win7?forum=netfxbcl

    やっぱり、そうなんでしょうね・・・
    ご提示いただいたリンクはあとで確認します。


    > 現行 OS では無いので(Win7 は 2020/01/14 でサポート期限切れ)、
    > 今となっては、もはや気にしなくても良いのかも。

    本来はそうなんですが・・・
    まだ過去に納品したお客さんのところでWindows7が残っているかもしれず、もしかすると対応を要求されるかも・・・。

    ただ、まあ、今回に限って言えばWindows7上で動かすことはなさそうなので、必要が生じたときになんとかしますという事で勘弁していただけないか相談してみます。

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

    最新OSでは動く、という事がわかりましたので、ひとまず解決とさせていただきます。




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

■記事リスト / レス記事表示 → [親記事-9] [10-12]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■34874 / 親記事)  画像の大きさを取得するには
□投稿者/ ペースターズ 一般人(1回)-(2021/08/21(Sat) 16:56:35)
  • アイコン環境/言語:[Windows10 VB.NET2017] 
    分類:[.NET] 

    お世話になります。
    
    VB.NETで画像処理を連続して行うアプリを作成しました。
    これ自体は出来ているのですが、どうにも処理が遅い。
    数枚ならともかく、1000枚単位になると、なかなかバカに出来ない時間がかかっています。
    そこで高速化に着手しようとおもい、まずは画像情報の取得からいこうと思いました。
    現在、画像の縦横サイズを取得するのに、ファイルを開いてヘッダ情報を読み込み、縦横を得ています。
    ↓こんな感じです。
    ----------------------------------
    Dim imagew, imageh As Integer
    Dim fs As System.IO.FileStream
    
    fs = New System.IO.FileStream(ファイル名, IO.FileMode.Open, IO.FileAccess.Read)
    imagew = System.Drawing.Image.FromStream(fs).Width
    imageh = System.Drawing.Image.FromStream(fs).Height
    fs.Close()
    ----------------------------------
    いちいちファイルを開いて読んで閉じる。というのは結構遅いんじゃないかと思います。
    これをもっと手軽に高速に出来る方法はないでしょうか。
    

違反を報告
引用返信

▽[全レス4件(ResNo.1-4 表示)]
■34875 / ResNo.1)  Re[1]: 画像の大きさを取得するには
□投稿者/ Hongliang 大御所(606回)-(2021/08/21(Sat) 20:09:56)
  • アイコンファイルのオープンクローズの時間を気にするレベルだと、ExplorerがThumbs.dbでやってるような「あらかじめ情報を取得しておく」ぐらいしか方法はない気がします。しかしこれはお作りのアプリとは方向性が違うのではないかと思います。

    System.Drawing.Bitmapオブジェクトはインスタンス生成時に画像へのデコードまでやってしまうので、画像の縦横のサイズといったメタデータを読みたいだけなら無駄が多いです。
    // もちろん、画像処理本体には結局画像デコードが必要でしょうが…。
    .NET Framework標準ライブラリの中では、PresentationCore.dllに含まれるSystem.Windows.Media.Imaging.BitmapDecodeクラスを中心としたクラスを使えば、不要な画像デコードを行わなずにすむように記述できます。
    Dim decoder As BitmapDeocder = BitmapDecoder.Create(fs, BitmapCreateOptions.DelayCreation, BitmapCacheOption.None)
    Dim width As Integer = decoder.Frames(0).PixelWidth
    Dim height As Integer = decoder.Frames(0).PixelHeight
違反を報告
引用返信
■34876 / ResNo.2)  Re[1]: 画像の大きさを取得するには
□投稿者/ 魔界の仮面弁士 大御所(1389回)-(2021/08/21(Sat) 20:11:43)
  • アイコンNo34874に返信(ペースターズさんの記事)
    > fs = New System.IO.FileStream(ファイル名, IO.FileMode.Open, IO.FileAccess.Read)
    > imagew = System.Drawing.Image.FromStream(fs).Width
    > imageh = System.Drawing.Image.FromStream(fs).Height
    > fs.Close()

    Image オブジェクトのロードを 2 回行っているのは何故でしょうか?
    しかも Dispose もしていないようで…。

    Using img = System.Drawing.Image.FromStream(fs)
     w = img.Width
     h = img.Height
    End Using

    のようにして、かつ、複数ファイルを操作するために
    Parallels.For を併用してみるのはいかがでしょう。
違反を報告
引用返信
■34877 / ResNo.3)  Re[2]: 画像の大きさを取得するには
□投稿者/ ペースターズ 一般人(3回)-(2021/08/21(Sat) 23:33:01)
  • アイコン
    Hongliangさん、魔界の仮面弁士さん、アドバイスありがとうございます。
    
    >System.Drawing.Bitmapオブジェクトはインスタンス生成時に画像へのデコードまでやってしまうので、画像の縦横のサイズといったメタデータを読みたいだけなら無駄が多いです。
    
    やっぱりそうですよね。
    とういうわけで、↓のように直してみました。
    ----------------------------------
    Dim imagew, imageh As Integer
    Dim fs As System.IO.FileStream
    
    fs = New System.IO.FileStream(ファイル名, IO.FileMode.Open, IO.FileAccess.Read)
    Using img = System.Drawing.Image.FromStream(fs)
     imagew = img.Width
     imageh = img.Height
    End Using
    fs.Close()
    ----------------------------------
    体感的に速度は変わらないようでした。残念!
    
    >Parallels.For を併用してみるのはいかがでしょう。
     えっ?なにそれ?と思って検索してみたら、並列処理ができるんですね!
    
    単純に
    For i = 0 To files.Length - 1
    ↓
    Parallel.For(0, files.Length,
             Sub(i)
    みたいに変えてみましたが、プログレスバーへの設定とかで
    ProgressBar.Value = i
    なんか挙動不審になっちゃうようです。
    複数のスレッドから操作しようとすれば、そりゃ当然でしょうね。
    でも、これは高速化に効きそうなので、もう少し調べてみます。
    
    ありがとうございました!
    
    

違反を報告
引用返信
■34878 / ResNo.4)  Re[3]: 画像の大きさを取得するには
□投稿者/ ペースターズ 一般人(4回)-(2021/08/22(Sun) 09:45:39)
  • アイコン解決済み
解決み!
違反を報告
引用返信

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



■記事リスト / ▼下のスレッド / ▲上のスレッド
■34866 / 親記事)  ファイルがドライブ内で占有する容量
□投稿者/ Iraquser 一般人(1回)-(2021/08/12(Thu) 06:55:16)
  • アイコン環境/言語:[Win10 VB.NET] 
    分類:[.NET] 

    詳細は省略しますが、特定フォルダ内の特定の条件に当てはまる複数ファイルを削除するプログラムを作成しようとしています。ファイル削除後のドライブ空き容量を削除処理実行前に表示したいです。個々のファイルがドライブ内で占有する容量を見積もる方法についてアドバイス下さい。多少の誤差は仕方ないと考えています。
違反を報告
引用返信

▽[全レス3件(ResNo.1-3 表示)]
■34870 / ResNo.1)  Re[1]: ファイルがドライブ内で占有する容量
□投稿者/ 魔界の仮面弁士 大御所(1386回)-(2021/08/12(Thu) 09:23:20)
  • アイコンNo34866に返信(Iraquserさんの記事)
    > 個々のファイルがドライブ内で占有する容量を見積もる方法について
    > アドバイス下さい。多少の誤差は仕方ないと考えています。

    高速化が目的なら、低レベル処理とはなりますが、
    WizTree のように MFT を直接読み取るという選択肢がありそうです。
    とはいえ、こちらは当方に知識が無いので何とも言えないところ。
    https://forest.watch.impress.co.jp/library/software/wiztree/
    https://www.vector.co.jp/soft/dl/winnt/prog/se508167.html


    簡易的な処理となれば、単純にはファイルサイズを合計することになるでしょう。
    列挙については、.NET Framework よりも .NET 6/.NET 5 の方が効率が良いですが、
    今回は列挙については問題視しておらず、個々のファイルサイズの求め方が
    必要ということなのですね?
    https://gist.github.com/Benshi/af8d0bb4bc1ae28768567f72f0b87120

    厳密には、ファイルサイズだけを見ても判断できないのが厄介な点ですね。
    懸念材料としては下記などが思い当たりますが、これらにどこまで対応するかで
    「多少の誤差」の精度が変わってきそうです。


    (1)消費量を求めるには、ファイルサイズだけでなく、
     ストレージのセクタ・クラスタの単位まで考慮する必要がある。
    http://tooljp.com/windows/doc/cluster-sector-difference/cluster-sector-difference.html
    https://oshiete.goo.ne.jp/qa/4343309.html
    →ファイル数が多くなるほど(そして個々のファイルが小さいほど)、誤差が累積する。

    (2)小容量のファイルの場合、MFT 内に記録されることで(resident)、
     見た目上の容量消費が 0 になりえる。
    http://tooljp.com/qa/size-0byte-on-disk-E846.html
    https://milestone-of-se.nesuke.com/sv-basic/windows-basic/ntfs-filesystem-structure/

    (3)ディスクは「ドライブ」だけでなく「フォルダー」にも割り当てできるため、
     上位のフォルダーと下位のフォルダーで空き容量が変化することがある。
    https://docs.microsoft.com/ja-jp/windows-server/storage/disk-management/assign-a-mount-point-folder-path-to-a-drive

    そのほか、データ重複削除、圧縮ファイル、代替データストリーム、スパースファイル、
    シンボリックリンク、ハードリンク、ジャンクションなど…。
    https://ascii.jp/elem/000/001/550/1550399/
    https://so-da.tech/tech/infra/winsv-data-deduplication-1/
違反を報告
引用返信
■34871 / ResNo.2)  Re[2]: ファイルがドライブ内で占有する容量
□投稿者/ Iraquser 一般人(2回)-(2021/08/12(Thu) 13:17:07)
  • アイコンNo34870に返信(魔界の仮面弁士さんの記事)
    魔界の仮面弁士さん、丁寧なアドバイス有難うございます。
    ファイルがクラスターサイズ単位で切り上げられて容量を消費する事については何となく想像していました。
    「多少の誤差」についてですが、不要ファイル削除後のディスク容量を推測したいって程度ですので、(1)でご説明頂いた方式のみで対応しようと思っています。
    本当にありがとうございました。今後もよろしくお願いします。

解決み!
違反を報告
引用返信
■34873 / ResNo.3)  Re[3]: ファイルがドライブ内で占有する容量
□投稿者/ 魔界の仮面弁士 大御所(1388回)-(2021/08/12(Thu) 15:44:25)
  • アイコンNo34871に返信(Iraquserさんの記事)
    > 「多少の誤差」についてですが、不要ファイル削除後のディスク容量を推測したいって程度ですので、(1)でご説明頂いた方式のみで対応しようと思っています。

    クラスターを考慮した取得コードを書いてみました。
    拡張メソッドにしてあります。

    (2) の resident なファイルには対応できていませんが、
    圧縮属性やオフライン属性の付いたファイルの占有サイズなら拾えます。
    https://gist.github.com/Benshi/d115f057b81aa61e257186dbea49f9db


    さて、(2) はどうやって判定すればよいのだろう…。
    https://qiita.com/kusano_k/items/45b0a86649aabb8040ff
    https://github.com/search?q=PowerForensics+resident&type=code
解決み!
違反を報告
引用返信

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



■記事リスト / ▲上のスレッド
■34863 / 親記事)  C#FormのXボタンイベントで、e.Cancel が使えない
□投稿者/ grayowl 一般人(1回)-(2021/08/09(Mon) 09:38:30)
  • アイコン環境/言語:[VIsualStudio2019、.NET Framework 4.6] 
    分類:[.NET] 

     初心者ですみません、
     FormにXボタンイベントFormClosed(object sender,FormClosedEventArgs e)
     を追加して、クローズドの中止、e.Cancel = false; を追加したいのですが、
     FormClosedEventArgsにCancelがありません。
     using System.Windows.Forms;は、あります。

     どなたか、原因をご存知の方、教えてください。

     当方は、VIsualStudio2019、.NET Framework 4.6です。
違反を報告
引用返信

▽[全レス2件(ResNo.1-2 表示)]
■34864 / ResNo.1)  Re[1]: C#FormのXボタンイベントで、e.Cancel が使えない
□投稿者/ 魔界の仮面弁士 大御所(1382回)-(2021/08/09(Mon) 09:52:35)
  • アイコン2021/08/10(Tue) 09:54:30 編集(投稿者)

    # 解決済みのスレッドだけど、一応訂正。
    # なんで現在完了とか書いたんだろう…。orz

    No34863に返信(grayowlさんの記事)
    >  FormClosedEventArgsにCancelがありません。

    <del datetime="2021-08-10">イベント名が 現在完了進行形の「Closing」ではなく、</del>
    <ins datetime="2021-08-10">イベント名が 進行形の「Closing」ではなく、</ins>
    過去形である「Closed」であることはお気づきでしょうか?
    既に閉じられた後なので、Cancel はもうできません。

    FormClosing や Closing や InputLanguageChanging のように、
    -ing 系のイベントであれば、CancelEventArgs 系統の引数を持ちます。
    FormClosed や Closed や InputLanguageChanged などの
    -ed 系のイベントと比べてみてください。
違反を報告
引用返信
■34865 / ResNo.2)  Re[2]: C#FormのXボタンイベントで、e.Cancel が使えない
□投稿者/ grayowl 一般人(2回)-(2021/08/09(Mon) 10:14:20)
  • アイコンNo34864に返信(魔界の仮面弁士さんの記事)
    > ■No34863に返信(grayowlさんの記事)
    >> FormClosedEventArgsにCancelがありません。
    >
    > イベント名が 現在完了進行形の「Closing」ではなく、
    > 過去形である「Closed」であることはお気づきでしょうか?
    > 既に閉じられた後なので、Cancel はもうできません。
    >
     ありがとうございます!
     Formプロパティのイナズマアイコンに、Closing、Closedとありました。
     Closingで、e.Cancel = ture; できました。
解決み!
違反を報告
引用返信

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






Mode/  Pass/


- Child Tree -