ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2017年11月21日(火) 13:17

All times are UTC+09:00




新しいトピックを投稿する  トピックへ返信する  [ 5 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 2011年3月02日(水) 14:13 
オフライン

登録日時: 2009年3月29日(日) 15:45
記事: 106
最近必要になったので、調べまわって書いてみました。

BytePtr型がいまいち理解できていないので、とりあえず戻り値はString型でやってます。
BytePtrってmalloc関数使わないと文字入れられないのか思ってたけど、そうでもないのね。

一応動きますが、直せる方がいらっしゃいましたら直してください。

[hide]
コード:
関数名は適当です。
hWnd→オーナーウインドウのハンドル
DialogName→ダイアログに表示するタイトル的な奴
Flags→オプションフラグ。0を指定すると、とりあえず動作するフラグが入ります。
Root→ルートフォルダの指定。ここで指定したフォルダー以下が表示されます。0でマイコン
戻り値→取得したフォルダーパスが返ります
Flagsのオプション的なのを拾ってきました。
[hide]
0x0001
ファイルシステムディレクトリのみを返します。それ以外のアイテムが選択されているときには、[OK]ボタンは灰色表示になります。

0x0002
ダイアログボックスのツリービューコントロールにドメインレベルのネットワークフォルダを含めないようにします。

0x0004
ダイアログボックスにステータス領域を表示します。表示テキストを設定するには、コールバック関数からダイアログボックスにメッセージを送信します。

0x0008
シェルネームスペース階層構造の中でルートフォルダの下にあるファイルシステムサブフォルダのみを返します。それ以外のアイテムが選択されているときには、[OK]ボタンは灰色表示になります。

0x4000
フォルダとファイルを表示します。
[/hide]
コード:
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
[/hide]

とりあえず、これだけあれば使えるかなぁ・・・って感じです。
後は適当に調べてください~

蛇足ですが、
SHBrowseForFolder関数で返って来る数値でファイルパスが決まるとは思ってもいなかった。
SHGetPathFromIDList関数はどうやって識別しているのか謎。
まあ、今の自分には理解できない事でしょうが・・・

良かったら使ってみてください~
重複あったらすいません。

_________________
↓個人的ソフト置き場
http://www.software.jpn.org/
↓萌えゲー製作とかしていたい
http://www.holygate.jpn.org/


通報する
ページトップ
 記事の件名: 確認ですが
投稿記事Posted: 2011年3月03日(木) 15:46 
オフライン

登録日時: 2006年2月05日(日) 17:10
記事: 189
住所: 東京都
ウインドー系のプログラムでないので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を指定するので生かしたほうがよいと思います。
いかがでしょうか?


最後に編集したユーザー たかせ on 2011年3月17日(木) 20:23 [ 編集 1 回目 ]

通報する
ページトップ
投稿記事Posted: 2011年3月04日(金) 00:55 
オフライン

登録日時: 2009年3月29日(日) 15:45
記事: 106
引用:
確認ですが
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を指定するので生かしたほうがよいと思います。
いかがでしょうか?
おぶしっ。
はい、思いっきりミスです。

もともとは、まず自分で使う用に参考にしながら組んで、それから適当に関数にしてここに書きましたので、
そのときのミスですね・・・

↓修正版です

[hide]
コード:
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
[/hide]

しなくても分かるかな?w

ちなみに何で関数の形にしてここに置くかと言うと、
自分がまだプログラミングのぷの字も知らない頃、とにかく慣れようと手当たり次第ここのコードをコピペしてました。
そのときに関数の形で置いてくれている方の物はものすごく助かったので、
自分も(多少ですが)公開できるようになった今、そんな人に向けて関数の形で書いてます。

はい、どーでもいいですね 笑

また修正点などありましたら、遠慮なく突っ込んであげてください~

_________________
↓個人的ソフト置き場
http://www.software.jpn.org/
↓萌えゲー製作とかしていたい
http://www.holygate.jpn.org/


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2011年3月04日(金) 02:06 
DialogNameはBytePtrなので、
文字列と直接ひかくするのは良くない。
コード:
   If DialogName[0]=0 Then
        lstrcpy(DialogName,"フォルダーの選択")
    End If
引数をDialogName As Stringにして
.lpszTitle=StrPtr(DialogName)
とでもすべき。


通報する
ページトップ
   
投稿記事Posted: 2011年3月05日(土) 14:20 
オフライン

登録日時: 2009年3月29日(日) 15:45
記事: 106
引用:
DialogNameはBytePtrなので、
文字列と直接ひかくするのは良くない。
ぬ・・・そうなのですか・・・
やはりまだまだ自分は分かってない事が多いですね・・・
引用:
コード:
If DialogName[0]=0 Then
        lstrcpy(DialogName,"フォルダーの選択")
    End If 
こちらに書き換えてご使用ください~

_________________
↓個人的ソフト置き場
http://www.software.jpn.org/
↓萌えゲー製作とかしていたい
http://www.holygate.jpn.org/


通報する
ページトップ
期間内表示:  ソート  
新しいトピックを投稿する  トピックへ返信する  [ 5 件の記事 ] 

All times are UTC+09:00


オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[1人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

検索:
ページ移動:  
cron
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by KONISHI Yohsuke