C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

全過去ログを検索

<< 0 >>
■11082  Re[1]: VB.NET)四次元配列を用いての2点間距離計測
□投稿者/ PATIO -(2007/12/06(Thu) 16:19:44)
    No11081 (Flowen さん) に返信
    > 今回お尋ねしたいのは、4次元配列の宣言時にオーバーフローすることです。
    >
    > Dim maxX = Edgebmp.Width - 1 'X座標の最大値
    > Dim maxY = Edgebmp.Height - 1 'Y座標の最大値
    >       Dim D(maxX,maxY,maxX,maxY) As Double '----ここでオーバーフローエラーが発生----'


    > エラーメッセージは
    > 「'System.OutOfMemoryException'のハンドルされていない例外が.exeで発生しました」
    > となります。
    >
    > 四次元の配列領域がでかすぎるのかと思い、条件わけをするなどして減らしたりしましたがうまくいきません。
    > エラーを出さずに処理を行う方法、または四次元に代わる方法をご教授いただけないでしょうか?

    えーと、実際に扱っている数値を使って試算してみましたか?
    例えば、32×32ピクセルの画像を考えたとして単純に計算すると32×32×32×32×8となって8388608なんて数値に
    これって8MBになっちゃいます。たった32ピクセル四方の画像で8MBです。
    後は推して知るべしで画像が大きくなれば、途方も無い数値になるのは当たり前です。

    で、本当に全ての計算結果を最後まで取っておく必要があるんでしょうか?
    部分毎にやるとかできませんか?
    もしくはファイルに書き出すとかもありえるでしょうけれど。
    最近のPCがいくらメモリをたくさん載せているからと言っても一つのプロセスが使えるメモリの上限は決まってますし、
    それでなくてもリソースと言うのは上限と言うのが存在します。
    全部メモリに展開できれば楽なのは間違いない話ですが、現実には限られた範囲内でしか無理です。
    少なくとも全てをメモリ上に展開するのは無理だと思うので処理方法を再検討された方が良いと思います。
記事No.11081 のレス /過去ログ25より / 関連記事表示
削除チェック/

■11117  Re[3]: VB.NET)四次元配列を用いての2点間距離計測
□投稿者/ Flowen -(2007/12/07(Fri) 10:21:05)
    2007/12/07(Fri) 10:24:18 編集(投稿者)

    みなさん迅速な回答ありがとうございます

    No11082 (PATIO さん) に返信
    > えーと、実際に扱っている数値を使って試算してみましたか?
    > 例えば、32×32ピクセルの画像を考えたとして単純に計算すると32×32×32×32×8となって8388608なんて数値に
    > これって8MBになっちゃいます。たった32ピクセル四方の画像で8MBです。
    > 後は推して知るべしで画像が大きくなれば、途方も無い数値になるのは当たり前です。
    >
    > で、本当に全ての計算結果を最後まで取っておく必要があるんでしょうか?
    > 部分毎にやるとかできませんか?
    部分ごととは、その計算した数値が必要になったとき、ということでよろしいでしょうか?
    その計算結果を基にした配列を使って処理を行いたいため、です。
    その計算結果を使えないので再検討が急務、ですね・・・

    > 少なくとも全てをメモリ上に展開するのは無理だと思うので処理方法を再検討された方が良いと思います。
    はい、ご指摘のとおりこのままの処理では実現ができないようなので再検討いたします。


    No11085 (Tom Yama さん) に返信
    > ■No11081 (Flowen さん) に返信
    > >「'System.OutOfMemoryException'のハンドルされていない例外が.exeで発生しました」
    > は、メモリ不足エラーです。オーバーフローエラーではありません。
    すみません、勉強不足でした^^;
    ご指摘ありがとうございます。

    >> で、何でわざわざ、2点間の距離を配列に記憶するわけ?
    > 必要になったら、その場で、計算すればいいじゃん。
    この処理の後、2点間の距離をIndexとした配列を使って処理を行う必要があるからです。
    配列に距離を記録しておくことで、1つのループの間に数回、二次式の計算を行うのを避けたかったためです。

    No11095 (れい さん) に返信
    > 距離と位置の相関関数を求める手法ですね。
    > 他の方も言ってますが、距離をすべて配列に保存するのは容量が圧倒的に足りません。
    > 速度的にも無駄ですし、情報量的にも無駄ですので、その都度求めるべきです。
    はい、処理を随時計算する仕様に変更したいと思います。

    > ただでさえ、ハフ変換はメモリを大量に消費します。
    > 今回は半径と座標x,yの3つのパラメータがありますので、
    > 、パラメータ数の多い(3つ以上)ハフ変換を使う場合、
    > メモリ消費を緩和するため、
    > 部分的に変換したり、漸近的手法を用いたりといった手法を使います。
    > どの手法を用いるかはメモリ消費量の見積もりがなければ判断できません。
    > もう一度見積もりからはじめるべきだと思います。
    はい、開発環境の見直しからやりたいと思います。


    迅速な回答、皆様ありがとうございます、
    まとめさせていただきますと、

    ・メモリ不足エラーであり、配列に数値を保存しておくのは非現実的。再検討の余地あり。
    ・開発環境から見直し、メモリ消費量を見積もる。
    ・というか処理方法ダメダメ。もっかいガンガレ。

    ということですね・・・がんばります。

    また、ご指摘ありがとうございます。
記事No.11081 のレス /過去ログ25より / 関連記事表示
削除チェック/

■42422  DataGridからエクセル出力でエラー
□投稿者/ ダメッス -(2009/10/15(Thu) 15:36:48)

    分類:[.NET 全般] 

    開発環境:WinXP SP3
    開発言語:VB2003

    クライアント:Win2000 SP4

    DataGridのデータをエクセルに出力したいのですが、開発環境(WinXP)では問題なく
    処理できるのですが、クライアント(Win2K)ではエラー「HRESULT からの例外です : 0x800A03EC」
    が発生します。
    いろんなサイトを探していじってみましたが、いまだ解決しません。。。

    皆さんのお助けお願いします。
    ↓↓↓ソース

    Dim objExcel As Object
    Dim objExcelBooks As Object
    Dim objExcelBook As Object
    Dim objExcelSheets As Object
    Dim objExcelSheet As Object
    Dim intRowCnt, intColCnt As Integer
    Dim Range As Object
    Dim i, j As Integer

    objExcel = CreateObject("Excel.Application")
    objExcelBooks = objExcel.workbooks
    objExcelBook = objExcelBooks.add
    objExcelSheets = objExcelBook.worksheets
    objExcelSheet = objExcelSheets.item(1)

    Me.dgdWillDelay.Select()
    Dim dt As DataTable = CType(dgdWillDelay.DataSource, DataTable)
    Dim dtRow As DataRow
    Dim dtColumn As DataColumn
    'DataArray定義
    Dim DtArCol, DtArRow As Double
    DtArCol = 0
    For Each dtColumn In dt.Columns
    DtArCol = DtArCol + 1
    Next
    DtArRow = 0
    For Each dtRow In dt.Rows
    For i = 0 To dt.Columns.Count - 1
    DtArRow = DtArRow + 1
    Next
    Next
    Dim DataArray(DtArRow, DtArCol) As Object

    '列名を格納
    j = 0
    For Each dtColumn In dt.Columns
    DataArray(0, j) = dtColumn.ColumnName
    j = j + 1
    Next

    '明細を格納
    j = 0
    For Each dtRow In dt.Rows
    j = j + 1
    For i = 0 To dt.Columns.Count - 1
    DataArray(j, i) = dtRow(i)
    Next
    Next
    'タイトル
    objExcelSheet.range("A1") = Me.lblTitle.Text
    objExcelSheet.range("C1") = Me.cboClass.Text
    objExcelSheet.range("E1") = "出荷日:" & Me.DateTimePicker1.Text

    'DataArrayをExcelSheetに貼り付け
    Range = objExcelSheet.range("A2", Reflection.Missing.Value)
    Range = Range.resize(DtArRow, DtArCol)
    Range.value = DataArray

    'Excelを可視状態にする
    objExcel.Application.Visible = True
    objExcel.UserControl = True
親記事 /過去ログ72より / 関連記事表示
削除チェック/

■46067  Re[13]: Enterキーによるボタン連打制御
□投稿者/ Jitta on the way -(2010/01/25(Mon) 12:03:28)
    No46066 (alvin さん) に返信
    >> もしかして、すべてのボタンで Preview... と KeyUp をハンドルしている?
    >
    > そうですが・・、なんかまずいでしょうかね?


    (-_-;)(-_-;)(-_-;)

    こっちで再現できなければ、調べようがないんですよ。
    こっちが作ったものなら、「これとあれとその情報を下さい」と言えるのですが、そうではないので、足りないところは勝手に補っています。
    そりゃ、再現しないはずだ。

    情報を出さない方が悪いのか。勝手に補う方が悪いのか。
    どっちが悪いとは言いませんが、私は「こんなに情報を隠すなら、もう付き合ってらんない」と、匙を投げることにします。少なくとも、私は困らないので。次回からは、現象が再現させられる最低限のコードを提示するように勧めます。
記事No.45883 のレス /過去ログ78より / 関連記事表示
削除チェック/

■54771  Re[1]: sqlserverからphpmyadminのmysqlへ移行
□投稿者/ PATIO -(2010/11/01(Mon) 19:42:42)
    No54769 (シータ さん) に返信
    > Sqlserverの文字コードをBCPツールを使いunicodeで出力してます。
    > そのunicodeのデータをphpmyadminで取り込もうとするとエラーがでます。
    > インポートするファイルの文字セットにunicodeという記述もなく困っております。
    > こういった場合、どうすればよいのでしょうか。
    > Sqlserverのデータをphpmyadminにインポートしたいだけなのですが。

    文字コードについてきっちり調べてみる事をお勧めします。
    Microsoftがunicodeと言っている物が一般的な表現だとどうなるのかとか。
    Windows上で話をしているとSJISとUnicodeくらいしか出てきませんけれど、
    実際にはもっといろいろな表現方法があると言うのがわかると思います。
記事No.54769 のレス /過去ログ92より / 関連記事表示
削除チェック/

■61785  Re[4]: カラー型のデータをストリングに変換する方法
□投稿者/ 佐藤 正弘 -(2011/09/05(Mon) 15:48:42)
    No61782 (ズビズバ さん) に返信
    > ■No61775 (佐藤 正弘 さん) に返信
    >
    > 質問に対する最初のレスに
    >
    >>まずはどんな文字列を期待しているのか例示してください。
    >
    > とあるのに、どうしてこれが答えられないのでしょう?
    > 本当に問題を解決したいと思っているのでしょうか?
    > それさえ示せば、すぐに回答をもらえますよ。

    vb5no
      vb5で使ったQBColorの例えば、黒の場合は 0、青の場合は8388608、緑の場合は32768、シアンの場合は8921376、赤の場合は128という具合の文字列を想定
      していたものですから。
記事No.61766 のレス /過去ログ103より / 関連記事表示
削除チェック/

■61790  Re[5]: カラー型のデータをストリングに変換する方法
□投稿者/ 魔界の仮面弁士 -(2011/09/05(Mon) 22:03:53)
    No61785 (佐藤 正弘 さん) に返信
    > vb5no

    VB5 の色は OLE カラーとも呼ばれるもので、16進数値では &H00BBGGRR で表されます。
    また、OLE カラーは &H80000000〜&H80000018 の範囲を取ることもあり、これはシステムカラーを意味します。

    たとえば VB5 では、vbBlack は &H00000000 になりますし、vbDesktop は &H80000001 です。

    >   vb5で使ったQBColorの例えば、黒の場合は 0、

    VB5 の vbBlack は数値としては &H0 で表されましたが、.NET の Color.Black は
    &HFF000000 になります。この場合の先頭 FF は Alpha 値であり、完全不透明を意味します。

    VB5 の色は BGR 順の &H00BBGGRR (または &H800000xx )の形式でしたが、
    .NET の ARGB 表現では RGB 順の &HAARRGGBB であることに注意が必要です。


    > 青の場合は8388608、緑の場合は32768、シアンの場合は8921376、赤の場合は128という具合の文字列を想定
    > していたものですから。

    VB5 の QBColor 関数も VB2010 の QBColor メソッドも、戻り値はいずれも
    「32bit 整数型」であって、「文字列型」では無いことに注意してください。

    ・VB5 の VBA.Information.QBColor は、As Long(あるいは As OLE_COLOR)。
    ・VB2010 の Microsoft.VisualBasic.Information.QBColor は As Integer(あるいは As Int32)。


    単純に Integer から String にするという場合においても、10進数だったり 16進数だったり、
    先頭ゼロ埋めだったりと、いろいろな形式があります。端折らずにきちんと説明しましょう。


    なお、QBColor メソッドの戻り値である整数を Color 構造体に変換する場合は、
    先述した ColorTranslator.FromOle メソッドを使えば OK です。たとえば
    QBColor(0) は &H0(0)、QBColor(1) は &H800000(8388608)、QBColor(2) は &H8000(32768) ですが、

     Dim c0 As Color = ColorTranslator.FromOle(QBColor(0))
     Dim c1 As Color = ColorTranslator.FromOle(QBColor(1))
     Dim c2 As Color = ColorTranslator.FromOle(QBColor(2))

    とした場合、c0 は Black、c1 は Navy、c2 は Green に変換されます。
    (QBColor 以外の色についても、同様に変換できます)


    逆に、Navy な色を
    > 青の場合は8388608
    に戻したい場合には、
     Dim i As Integer = ColorTranslator.ToOle(c1)
    のようになります。あるいは、ARGB 値から BGR 値に変換するために
     Dim j As Integer = c1.B * &H10000 + c1.G * &H100 + c1.R
    のようにすることもできますし、16進数文字列がお望みなら
     Dim s As String = String.Format("{2:X2}{1:X2}{0:X2}", c1.R, c1.G, c1.B)
    と記述できます。
記事No.61766 のレス /過去ログ103より / 関連記事表示
削除チェック/

■61802  Re[6]: カラー型のデータをストリングに変換する方法
□投稿者/ 佐藤 正弘 -(2011/09/06(Tue) 14:25:45)
    No61790 (魔界の仮面弁士 さん) に返信
    > ■No61785 (佐藤 正弘 さん) に返信
    >> vb5no
    >
    > VB5 の色は OLE カラーとも呼ばれるもので、16進数値では &H00BBGGRR で表されます。
    > また、OLE カラーは &H80000000〜&H80000018 の範囲を取ることもあり、これはシステムカラーを意味します。
    >
    > たとえば VB5 では、vbBlack は &H00000000 になりますし、vbDesktop は &H80000001 です。
    >
    >>  vb5で使ったQBColorの例えば、黒の場合は 0、
    >
    > VB5 の vbBlack は数値としては &H0 で表されましたが、.NET の Color.Black は
    > &HFF000000 になります。この場合の先頭 FF は Alpha 値であり、完全不透明を意味します。
    >
    > VB5 の色は BGR 順の &H00BBGGRR (または &H800000xx )の形式でしたが、
    > .NET の ARGB 表現では RGB 順の &HAARRGGBB であることに注意が必要です。
    >
    >
    >>青の場合は8388608、緑の場合は32768、シアンの場合は8921376、赤の場合は128という具合の文字列を想定
    >>していたものですから。
    >
    > VB5 の QBColor 関数も VB2010 の QBColor メソッドも、戻り値はいずれも
    > 「32bit 整数型」であって、「文字列型」では無いことに注意してください。
    >
    > ・VB5 の VBA.Information.QBColor は、As Long(あるいは As OLE_COLOR)。
    > ・VB2010 の Microsoft.VisualBasic.Information.QBColor は As Integer(あるいは As Int32)。
    >
    >
    > 単純に Integer から String にするという場合においても、10進数だったり 16進数だったり、
    > 先頭ゼロ埋めだったりと、いろいろな形式があります。端折らずにきちんと説明しましょう。
    >
    >
    > なお、QBColor メソッドの戻り値である整数を Color 構造体に変換する場合は、
    > 先述した ColorTranslator.FromOle メソッドを使えば OK です。たとえば
    > QBColor(0) は &H0(0)、QBColor(1) は &H800000(8388608)、QBColor(2) は &H8000(32768) ですが、
    >
    >  Dim c0 As Color = ColorTranslator.FromOle(QBColor(0))
    >  Dim c1 As Color = ColorTranslator.FromOle(QBColor(1))
    >  Dim c2 As Color = ColorTranslator.FromOle(QBColor(2))
    >
    > とした場合、c0 は Black、c1 は Navy、c2 は Green に変換されます。
    > (QBColor 以外の色についても、同様に変換できます)
    >
    >
    > 逆に、Navy な色を
    >>青の場合は8388608
    > に戻したい場合には、
    >  Dim i As Integer = ColorTranslator.ToOle(c1)
    > のようになります。あるいは、ARGB 値から BGR 値に変換するために
    >  Dim j As Integer = c1.B * &H10000 + c1.G * &H100 + c1.R
    > のようにすることもできますし、16進数文字列がお望みなら
    >  Dim s As String = String.Format("{2:X2}{1:X2}{0:X2}", c1.R, c1.G, c1.B)
    > と記述できます。

    魔界の仮面弁士様

    有難うございました。解決しました。


記事No.61766 のレス / END /過去ログ103より / 関連記事表示
削除チェック/

■75891  Re[7]: オリジナルTextBoxにカスタムコントロール
□投稿者/ ni -(2015/05/14(Thu) 16:30:08)
    No75887 (魔界の仮面弁士 さん) に返信

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

    最近わかったことをお伝えします。
    コードを修正しながら載せる.exeを起動し、『プロセスにアタッチ』させ、
    コードの動きを確認しているのですが、
    時々VSE2013の『エラー一覧』にカスタムコントロールのMyTextBoxが見当たらない、と言ったようながメッセージが出たり、
    検証のために、一部コードを省略したにもかかわらず、そこにあるかのように動作する事があるのですが、
    もしかすると、『偶然回ったり』、『時々エラーしたり』するのはそういう事なのでしょうか。

    フォーム自体ではそんなに複雑な事はしていないのですが、元の.exeの呼び出し階層が複雑だからでしょうか、
    VSE2013自体を再起動すると、そういう動きはしないのですが、そういう可能性はあるのでしょうか。

    もう少し教えて頂いたことに基づいて、書いてみます。
記事No.75841 のレス /過去ログ128より / 関連記事表示
削除チェック/

■81162  Re[1]: Graphics.DrawLineでのオーバーフローについて
□投稿者/ 魔界の仮面弁士 -(2016/08/31(Wed) 11:10:25)
    No81145 (みくさわ さん) に返信
    > Graphics.DrawLine(Pens.Red, Integer.MaxValue, 100, 1, 1)のコードを実行すると
    > オーバーフローエラーが発生します。

    内部的には、gdiplus.dll の GdipDrawLineI API を呼び出しているだけなので、
    GDI+ 側の制限ということになりますね。実行環境によっても左右されそうです。


    > (Graphics.ClipBoundsが可能領域かと思いましたが、MSDNに"クリッピング領域が無限の場合、
    > ClipBoundsプロパティは巨大な四角形の情報を返します"とあり、不安になって質問させて
    > もらいました。)

    e.Graphics.Clip あるいは Graphics.SetClip に対して、無限な領域
    ―――たとえば Region.MakeInfinite() なリージョン―――が指定されて
    いたとしても、ClipBounds は無限値ではなく、有限値を返すということですよね。

    ClipBounds が返す「巨大な四角形」のサイズはまちまちなようで、
    その時々で、たとえば以下のような範囲が返されてきました。
    明確な上限値があるというわけではなさそうです。

    {X=-4194304,Y=-4194304,Width=8388608,Height=8388608}
    {X=-4194292,Y=-4194336,Width=8388608,Height=8388608}
    {X=-4194292,Y=-4194329,Width=8388608,Height=8388608}
    {X=-4194292,Y=-4194326,Width=8388608,Height=8388608}
    {X=-4194292,Y=-4194319,Width=8388608,Height=8388608}
    {X=-4194292,Y=-4194281,Width=8388608,Height=8388608}

    ちなみに上記のいずれでも、
     Dim b = g.ClipBounds
     g.DrawLine(Pens.Red, b.Left, b.Top, b.Right, b.Bottom)
    はエラーになりませんでした。少なくとも当方環境では。
記事No.81145 のレス /過去ログ138より / 関連記事表示
削除チェック/

■88608  Re[7]: フォルダ名とその更新日時を一緒に収得
□投稿者/ なつ -(2018/09/10(Mon) 19:50:43)
    No88600 (魔界の仮面弁士 さん) に返信
    
    ありがとうございます。
    既に頭の中は混乱状態、思ってたよりは随分とややっこしいのですね。
    
     Dim x As IEnumerable(Of String) = System.IO.Directory.EnumerateDirectories("C:\Users\○○○\○○○\SONY NNC\SNNC30", "*", System.IO.SearchOption.AllDirectories)
     Dim y = New System.IO.DirectoryInfo("C:\Users\○○○\○○○\SONY NNC\SNNC30").EnumerateDirectories("*", System.IO.SearchOption.AllDirectories)
    
    合ってるかどうかは分かりませんが作ってはみました。
    ただ疑問なのは、x は 同じString でありながらも、何故か ListBox1.Items.AddRange(x) とは出来ないのかです。
    
    NET Framework は4.0のようです。
記事No.88574 のレス /過去ログ152より / 関連記事表示
削除チェック/

■88610  Re[8]: フォルダ名とその更新日時を一緒に収得
□投稿者/ Jitta -(2018/09/10(Mon) 22:12:29)
    No88608 (なつ さん) に返信
    > NET Framework は4.0のようです。

    4.0 のサポートは終了しています。今後、セキュリティインシデントが見つかっても修正されません。
    VS2017 なら、アップデートすることを勧めます。
記事No.88574 のレス /過去ログ152より / 関連記事表示
削除チェック/

■88613  Re[8]: フォルダ名とその更新日時を一緒に収得
□投稿者/ 魔界の仮面弁士 -(2018/09/10(Mon) 23:42:40)
    No88608 (なつ さん) に返信
    > 既に頭の中は混乱状態、思ってたよりは随分とややっこしいのですね。

    No88585 の時点で、DirectoryInfo にどういうメンバーが含まれているかは調査済みで、
    それでも調査しきれなかったという点についても、追加質問に対して、短いコード例を
    つけて回答したので、それで分かってもらえるものと思い込んでいました。反省。


    DirectoryInfo にどんなメンバーがあるかは、DataGridView に渡すことで一覧できます。
    DirectoryInfo のプロパティに、日付情報も同時に記録されていることが一望できるかと。

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
      Dim sDir As String = "C:\Users\○○○\○○○\SONY NNC\SNNC30"
      DataGridView1.DataSource = New DirectoryInfo(sDir).GetDirectories("*", SearchOption.AllDirectories)
    End Sub


    上記では、コントロールに表示するために GetDirectories を使いましたが、
    No88598 でも述べたように、 EnumerateDirectories を使って LINQ や For Each での
    順次列挙を行うこともできます。


    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
     Dim sDir As String = "C:\Users\○○○\○○○\SONY NNC\SNNC30"
     For Each di In New DirectoryInfo("C:\TEST").EnumerateDirectories("*", SearchOption.AllDirectories)
       Debug.WriteLine($"作成={di.CreationTime}, 更新={di.LastWriteTime}, パス={di.FullName}")
     Next
    End Sub

    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
     Dim sDir As String = "C:\Users\○○○\○○○\SONY NNC\SNNC30"
     For Each di In New DirectoryInfo("C:\TEST").GetDirectories("*", SearchOption.AllDirectories)
       Debug.WriteLine($"作成={di.CreationTime}, 更新={di.LastWriteTime}, パス={di.FullName}")
     Next
    End Sub

    Button2 は EnumerateDirectories による列挙、
    Button3 は GetDirectories による列挙にしてあります。

    いずれも Debug.WriteLine により、「イミディエイト」ウィンドウもしくは「出力」ウィンドウに
    作成日時、更新日時、ディレクトリ名を列挙するだけの処理です。


    sDir に、フォルダ数が多いパスを与えてみてください。
    EnumerateDirectories ではすぐに列挙が始まるのに、
    GetDirectories では列挙開始まで時間がかかってしまいます。


    また、sDir に "C:\Windows" などを与えると、アクセス権の問題から
    例外で停止してしまうことになります。これが No88598 で述べていた注意点です。
    >> UnauthorizedAccessException 例外等により、処理が中断されてしまうことになります。



    > Dim x As IEnumerable(Of String) = System.IO.Directory.EnumerateDirectories("C:\Users\○○○\○○○\SONY NNC\SNNC30", "*", System.IO.SearchOption.AllDirectories)
    > ただ疑問なのは、x は 同じString でありながらも、
    同じ…では無いですよね?
    x の型は「String」でも「String()」でもなく、「IEnumerable(Of String)」なのですから。



    > 何故か ListBox1.Items.AddRange(x) とは出来ないのかです。
    AddRange メソッドの引数に渡せる型は「Object()」だからですね。
    (Hongliang さんの回答にあるとおり、もう一つのオーバーロードもありますが)

    でもって、IEnumerable(Of String) は一次元配列ではありませんから、
    Object() に変換することができません。ゆえに、AddRange には渡せないということです。


    配列化するために『ListBox1.Items.AddRange(x.ToArray())』のように呼べば渡せますが、
    それなら最初から、EnumerateDirectories ではなく GetDirectories を使えば済みますね。


    ただし LINQ で再加工するような処理においては、EnumerateDirectories の方が良いでしょう。


    Dim q = From di In New DirectoryInfo(sDir).EnumerateDirectories("*", SearchOption.AllDirectories)
        Select $"作成={di.CreationTime}, 更新={di.LastWriteTime}, パス={di.FullName}"

    ListBox1.Items.AddRange(q.ToArray())



    > NET Framework は4.0のようです。
    NET ではなく .NET (ドットネット) ですね。

    Jitta さんの回答に補足して、.NET Framework のライフサイクルの表を載せておきます。
    (.NET Framework 4 / 4.5 / 4.5.1 のサポートは、2016 年 1 月 12 日で終了しています)


    4.7.2 → 2018/02/05 ライフサイクル開始、サポート中(OS のサポート期限まで)★現在の最新版★
    4.7.1 → 2017/10/17 ライフサイクル開始、サポート中(OS のサポート期限まで)
    4.7  → 2017/04/05 ライフサイクル開始、サポート中(OS のサポート期限まで)
    4.6.2 → 2016/08/02 ライフサイクル開始、サポート中(OS のサポート期限まで)
    4.6.1 → 2015/11/30 ライフサイクル開始、サポート中(OS のサポート期限まで)
    4.6  → 2015/07/20 ライフサイクル開始、サポート中(OS のサポート期限まで)
    4.5.2 → 2014/05/05 ライフサイクル開始、サポート中(OS のサポート期限まで)
    4.5.1 → 2013/09/07 ライフサイクル開始、2016/01/12 で既にサポート切れ
    4.5  → 2012/08/05 ライフサイクル開始、2016/01/12 で既にサポート切れ
    4.0  → 2010/03/31 ライフサイクル開始、2012/03/04 Update 3(4.0.3)、2016/01/12 で既にサポート切れ
    3.5  → 2007/11/19 ライフサイクル開始、2008/11/18 Service Pack 1(3.5.1)、サポート中(OS のサポート期限まで)
    3.0  → 2006/11/19 ライフサイクル開始、2008/08/12 Service Pack 2、2011/07/12 で既にサポート切れ
    2.0  → 2005/11/07 ライフサイクル開始、2009/01/16 Service Pack 2、2011/07/12 で既にサポート切れ
    1.1  → 2003/04/01 ライフサイクル開始、2004/09/09 Service Pack 1、2013/10/08 で既にサポート切れ
    1.0  → 2002/01/05 ライフサイクル開始、2004/09/09 Service Pack 3、2009/07/14 で既にサポート切れ

    ※ライフサイクルの開始日は、リリース日とは異なります。


    4.7.2 を同梱している OS → Windows 10 ver1803
    4.7.1 を同梱している OS → Windows 10 ver1709
    4.7  を同梱している OS → Windows 10 ver1703
    4.6.2 を同梱している OS → Windows 10 ver1607
    4.6.1 を同梱している OS → Windows 10 ver1511
    4.6  を同梱している OS → Windows 10 ver1507
    4.5.2 を同梱している OS → なし
    4.5.1 を同梱している OS → Windows 8.1
    4.5  を同梱している OS → Windows 8
    4.0  を同梱している OS → なし
    3.5.x を同梱している OS → Vista 〜 Windows 10
    3.0  を同梱している OS → Vista 〜 Windows 10
    2.0  を同梱している OS → Vista 〜 Windows 10
    1.1  を同梱している OS → なし
    1.0  を同梱している OS → なし
記事No.88574 のレス /過去ログ152より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -