ab.com コミュニティ https://www.activebasic.com/forum/ |
|
フォルダーの選択ダイアログ https://www.activebasic.com/forum/viewtopic.php?t=2661 |
ページ 1 / 1 |
作成者: | 水波形 [ 2011年3月02日(水) 14:13 ] |
記事の件名: | フォルダーの選択ダイアログ |
最近必要になったので、調べまわって書いてみました。 BytePtr型がいまいち理解できていないので、とりあえず戻り値はString型でやってます。 BytePtrってmalloc関数使わないと文字入れられないのか思ってたけど、そうでもないのね。 一応動きますが、直せる方がいらっしゃいましたら直してください。 [ここをクリックすると内容が表示されます]
とりあえず、これだけあれば使えるかなぁ・・・って感じです。コード: 関数名は適当です。 hWnd→オーナーウインドウのハンドル DialogName→ダイアログに表示するタイトル的な奴 Flags→オプションフラグ。0を指定すると、とりあえず動作するフラグが入ります。 Root→ルートフォルダの指定。ここで指定したフォルダー以下が表示されます。0でマイコン 戻り値→取得したフォルダーパスが返りますFlagsのオプション的なのを拾ってきました。 [ここをクリックすると内容が表示されます]
0x0001 ファイルシステムディレクトリのみを返します。それ以外のアイテムが選択されているときには、[OK]ボタンは灰色表示になります。 0x0002 ダイアログボックスのツリービューコントロールにドメインレベルのネットワークフォルダを含めないようにします。 0x0004 ダイアログボックスにステータス領域を表示します。表示テキストを設定するには、コールバック関数からダイアログボックスにメッセージを送信します。 0x0008 シェルネームスペース階層構造の中でルートフォルダの下にあるファイルシステムサブフォルダのみを返します。それ以外のアイテムが選択されているときには、[OK]ボタンは灰色表示になります。 0x4000 フォルダとファイルを表示します。 コード: Function SelectFolderPath(hWnd As HWND,DialogName As BytePtr,Flags As Long,Root As Long) As String Dim bor As BROWSEINFO Dim path[1025] As Byte Dim id As Long Dim str As String Dim text As String If DialogName="" Then DialogName="フォルダーの選択" End If If Flags=0 Then Flags=BIF_DONTGOBELOWDOMAIN or &H1 End If If Root=0 Then Root=&H0 End If With bor .hwndOwner=hMainWnd .lpszTitle=DialogName .ulFlags=Flags .pidlRoot=Root End With id=SHBrowseForFolder(bor) If id=FALSE Then Exit Function End If SHGetPathFromIDList(id,path) text=MakeStr(path) free(path) str=Right$(text,1) If str<>"\" Then text=text+"\" End If SelectFolderPath=text End Function 後は適当に調べてください~ 蛇足ですが、 SHBrowseForFolder関数で返って来る数値でファイルパスが決まるとは思ってもいなかった。 SHGetPathFromIDList関数はどうやって識別しているのか謎。 まあ、今の自分には理解できない事でしょうが・・・ 良かったら使ってみてください~ 重複あったらすいません。 |
作成者: | たかせ [ 2011年3月03日(木) 15:46 ] |
記事の件名: | 確認ですが |
ウインドー系のプログラムでないのでhMainWndを使用していなくて、そのためコンパイルエラーが出て気が付きました。 確認ですが With bor .hwndOwner=hMainWnd .lpszTitle=DialogName .ulFlags=Flags .pidlRoot=Root End With は With bor .hwndOwner=hWnd .lpszTitle=DialogName .ulFlags=Flags .pidlRoot=Root End With が正解ですね。 せっかくhWndを指定するので生かしたほうがよいと思います。 いかがでしょうか? |
作成者: | 水波形 [ 2011年3月04日(金) 00:55 ] |
記事の件名: | フォルダーの選択ダイアログ |
引用:
確認ですが
おぶしっ。With bor .hwndOwner=hMainWnd .lpszTitle=DialogName .ulFlags=Flags .pidlRoot=Root End With は With bor .hwndOwner=hWnd .lpszTitle=DialogName .ulFlags=Flags .pidlRoot=Root End With が正解ですね。 せっかくhWndを指定するので生かしたほうがよいと思います。 いかがでしょうか? はい、思いっきりミスです。 もともとは、まず自分で使う用に参考にしながら組んで、それから適当に関数にしてここに書きましたので、 そのときのミスですね・・・ ↓修正版です [ここをクリックすると内容が表示されます]
しなくても分かるかな?wコード: Function SelectFolderPath(hWnd As HWND,DialogName As BytePtr,Flags As Long,Root As Long) As String Dim bor As BROWSEINFO Dim path[1025] As Byte Dim id As Long Dim str As String Dim text As String If DialogName="" Then DialogName="フォルダーの選択" End If If Flags=0 Then Flags=BIF_DONTGOBELOWDOMAIN or &H1 End If If Root=0 Then Root=&H0 End If With bor .hwndOwner=hWnd .lpszTitle=DialogName .ulFlags=Flags .pidlRoot=Root End With id=SHBrowseForFolder(bor) If id=FALSE Then Exit Function End If SHGetPathFromIDList(id,path) text=MakeStr(path) free(path) str=Right$(text,1) If str<>"\" Then text=text+"\" End If SelectFolderPath=text End Function ちなみに何で関数の形にしてここに置くかと言うと、 自分がまだプログラミングのぷの字も知らない頃、とにかく慣れようと手当たり次第ここのコードをコピペしてました。 そのときに関数の形で置いてくれている方の物はものすごく助かったので、 自分も(多少ですが)公開できるようになった今、そんな人に向けて関数の形で書いてます。 はい、どーでもいいですね 笑 また修正点などありましたら、遠慮なく突っ込んであげてください~ |
作成者: | HSABP [ 2011年3月04日(金) 02:06 ] |
記事の件名: | |
DialogNameはBytePtrなので、 文字列と直接ひかくするのは良くない。 コード: If DialogName[0]=0 Then lstrcpy(DialogName,"フォルダーの選択") End If引数をDialogName As Stringにして .lpszTitle=StrPtr(DialogName) とでもすべき。 |
作成者: | 水波形 [ 2011年3月05日(土) 14:20 ] |
記事の件名: | フォルダーの選択ダイアログ |
引用: DialogNameはBytePtrなので、
ぬ・・・そうなのですか・・・文字列と直接ひかくするのは良くない。 やはりまだまだ自分は分かってない事が多いですね・・・ 引用: コード: If DialogName[0]=0 Then lstrcpy(DialogName,"フォルダーの選択") End If |
ページ 1 / 1 | 全ての表示時間は UTC+09:00 です |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |