2016年5月20日金曜日

VB OS に左右される関数 Environment.SpecialFolder (CODE)

前回の VB OS に左右される関数 Environment.SpecialFolder で書いた Windows 10 での MyComputer の問題。
じゃぁどうすんの? と言う事で ... 、 書いて見ました。
本格的に書いてらっしゃる方の 対応策 とは違い、 暫定的な対処方法ですが ... 。
まぁ、簡単にお茶を濁らせると、 こんな逃げ道は如何でしょうか? と言ったレベルです。
[2017/05/25 追記]  OS v1703 b15063.296 に於いては MyComuter は従前通りに戻っていますが ... 。.


本来なら、もっと、お詳しい方なら、 基本クラスを Overload して拡張なさるのでしょうが、
私は、そんな知識は持ち合わせていません !!! 。

ですから、 笑っちゃう様な コード ですが ... 。
と、 前置きした上で。


FolderBrowserDialog を使って、 基底となるフォルダを使い分けるのですが、
Windows 10 においては、 MyComputer の値が設定されていない為、 Desktop と同等の挙動となります。

お願い! MyComputer を返して !!! と叫びたい処ですが、 それでは、 天に唾 状況ですね。
無いものはしょうがない ので、 無い知恵を絞って考えます。

注: [2017/05/25 追記]  OS v1703 b15063.296 に於いては MyComuter は従前通りに戻っていますが ... 。.

Windows 10 においても、 MyComputer と似た This PC と言うものが実は設定されています。
CLSID で言う処の {20D04FE0-3AEA-1069-A2D8-08002B30309D} です。
ご存知の様に、これは、以前とは異なり、 冒頭に 特殊フォルダ を列挙してから ドライブ が並びます。
そのグループの名称は This PC ではなく、 単純に PC と Explorer 等では表示されますね。

以前の様に、ローカルに接続されたドライブのみを列挙した もの は存在しません。

ですから、 Desktop を使ってよ! と言う事なのでしょうが ... 。
と言うのも、 Desktop に PC の項目が存在するからなのでしょうね。
でも、前述の様な ... 。  くどいね。.

そこで考えたのが、 PC のドライブで必ずある筈の %SystemDrive% を選択状態にしてしまう 方法 です。
大抵のケースでは、 C: ドライブで ローカルドライブの先頭に位置する 筈なので ... 。
また、環境に左右されず、必ず存在する筈の環境変数から引いて来ていますし、 先ずは安全だろうと ... 。

FolderBrowserDialog.RootFolder と異なり、
FolderBrowserDialog.SelectedPath は何か選択した状態だと、 値が変動して行きますから、 そこがネックです。
保持させたいか、新たに選び直させるか、 ケースバイケースになると思っています。
一応、今回の例では、 未選択の場合のみ、 通常は C: ドライブ になる様に書いています。  一番簡単な方法ですね。

こんな画面設計の場合のコードです。
TextBox( TextBoxPath ) ひとつ、 ComboBox( ComboBoxRoot ) ひとつ、 Button( Button1 ) ひとつ と、
表示用の Label です。  FolderBrowserDialog1 も。
ComboBox で選択した値に応じた フォルダ選択ダイアログ を Button で開き、結果を TextBox に代入します。.



コードがこれ。
Public Class Form1

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        With Me.ComboBoxRoot.Items
            .Add("Pictures")
            .Add("Documents")
            .Add("Computer_My")
            .Add("Computer_1st")
            .Add("Desktop")
        End With
        Me.ComboBoxRoot.SelectedIndex = 2
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        Select Case Me.ComboBoxRoot.Text
            Case "Pictures"
                Me.FolderBrowserDialog1.RootFolder = Environment.SpecialFolder.MyPictures
            Case "Documents"
                Me.FolderBrowserDialog1.RootFolder = Environment.SpecialFolder.MyDocuments
            Case "Computer_My"
                Me.FolderBrowserDialog1.RootFolder = Environment.SpecialFolder.MyComputer
            Case "Computer_1st"
                'Me.FolderBrowserDialog1.RootFolder = "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}"    'Not, Because Enum!
                Me.FolderBrowserDialog1.RootFolder = Environment.SpecialFolder.MyComputer           '= Desktop (Win10/Default)
                'Me.FolderBrowserDialog1.SelectedPath = "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}"   '"PC" Selected (Win10) (Win7=Computer)
                If Me.FolderBrowserDialog1.SelectedPath = "" Then
                    Me.FolderBrowserDialog1.SelectedPath = Environment.GetEnvironmentVariable("SystemDrive")    '"C:" Drive Selected Mostly
                End If
            Case "Desktop"
                Me.FolderBrowserDialog1.RootFolder = Environment.SpecialFolder.Desktop

            Case Else
                Me.FolderBrowserDialog1.RootFolder = Environment.SpecialFolder.MyComputer
        End Select
        Me.FolderBrowserDialog1.Description = "Select Directory  on " & Me.ComboBoxRoot.Text
        Me.FolderBrowserDialog1.ShowDialog()
        Me.TextBoxPath.Text = IIf(Me.FolderBrowserDialog1.SelectedPath.Length = 3, _
                                  Me.FolderBrowserDialog1.SelectedPath, _
                                  Me.FolderBrowserDialog1.SelectedPath & "\")
    End Sub

End Class

この手のコードは使って見ると、何を Default にして、継続時のデータ引継ぎをどうするか に悩んでしまいますね。
問題は、何か選んだ後に、もう一度実行する時の FolderBrowserDialog.SelectedPath の値をどうするか ですね。
どうぞ、上のサンプルコードを弄繰り廻して、実行(継続)時に表示される初期値を変えて下さい。
あ~、こうして書いて見れば見る程、 MyComputer に帰って来て欲しい ! ものです。.



[2017/05/25 追記]  OS v1703 b15063.296 に於いては MyComuter は従前通りに戻っていますが ... 。.
最近、気付いたのですが、 MyComputer は以前の形に戻り Desktop とは異なる形になっています。
ああっ、良かったぁ~、 なのですが ... 。
別の問題が発覚!。
MyDocuments や MyPictures や MyMusic 等の My 系 のもので挙動が可笑しくなっています。
配下のフォルダを取得しない状況です。
OS の更新状態で、 こうも、状況が目まぐるしく変わると嫌になりますね。



0 件のコメント:

コメントを投稿