PDA

View Full Version : سوال: قرار دادن دکمه New Folder در پنجره Browse Folder



mmssoft
سه شنبه 19 شهریور 1392, 14:17 عصر
سلام، من با استفاده از کد زیر پنجره Browse folder ویندوز رو باز میکنم و ازش یه آدرس میخونم. ولی هر کاری کردم نتونستم پنجره رو به شکلی که داخلش یه دکمه New Folder هست، فراخوانی کنم.
ممنون میشم راهنمایی کنید

Option Explicit

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function SHBrowseForFolder Lib "shell32.dll" Alias "SHBrowseForFolderA" (lpbi As BrowseInfo) As Long
Private Declare Function SHGetPathFromIDList Lib "shell32.dll" Alias "SHGetPathFromIDListA" (ByVal pidl As Long, ByVal pszPath As String) As Long
Private Declare Sub CoTaskMemFree Lib "ole32.dll" (ByVal hMem As Long)

Private Const MAX_PATH = 260
Private Const BIF_RETURNONLYFSDIRS = 1
Private Const BIF_STATUSTEXT = 4
Private Const WM_USER = &H400
Private Const BFFM_INITIALIZED = 1
Private Const BFFM_SELCHANGED = 2
Private Const BFFM_SETSTATUSTEXTA = (WM_USER + 100)
Private Const BFFM_SETSELECTIONA = (WM_USER + 102)

Private Type BrowseInfo
hwndOwner As Long
pIDLRoot As Long
pszDisplayName As String
lpszTitle As String
ulFlags As Long
lpfn As Long
lParam As Long
iImage As Long
End Type

Private m_sDefaultFolder As String

Public Function BrowseForFolder(DefaultFolder As String, Optional Parent As Long = 0, Optional Caption As String = "") As String
On Error Resume Next

Dim bi As BrowseInfo
Dim sResult As String, nResult As Long
bi.hwndOwner = Parent
bi.pIDLRoot = 0
bi.pszDisplayName = String$(MAX_PATH, Chr$(0))

If Len(Caption) > 0 Then bi.lpszTitle = Caption

bi.ulFlags = BIF_RETURNONLYFSDIRS
bi.lpfn = GetAddress(AddressOf BrowseCallbackProc)
bi.lParam = 0
bi.iImage = 0
m_sDefaultFolder = DefaultFolder
nResult = SHBrowseForFolder(bi)

If nResult <> 0 Then

sResult = String(MAX_PATH, 0)
If SHGetPathFromIDList(nResult, sResult) Then BrowseForFolder = Left$(sResult, InStr(sResult, Chr$(0)) - 1)
CoTaskMemFree nResult
End If

End Function

Private Function BrowseCallbackProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal lParam As Long, ByVal lpData As Long) As Long
On Error Resume Next

Select Case uMsg
Case BFFM_INITIALIZED
'--------------------------------------------------------------------------
If Len(m_sDefaultFolder) > 0 Then SendMessage hwnd, BFFM_SETSELECTIONA, True, ByVal m_sDefaultFolder
'--------------------------------------------------------------------------
End Select

End Function

Private Function GetAddress(nAddress As Long) As Long
GetAddress = nAddress
End Function

alirezabahrami
سه شنبه 19 شهریور 1392, 20:53 عصر
سلام
لطفاً تصویر پنجره فوق را در اینجا قرار بده
ضمناً نمونه ضمیمه را ملاحظه نمائید!
یا علی

mmssoft
چهارشنبه 20 شهریور 1392, 05:47 صبح
عملکردش دقیقا شبیه عملکرد کد شما هست و هیچکدوم دکمه New Folder رو نشون نمیدن!!

mmssoft
پنج شنبه 21 شهریور 1392, 23:30 عصر
دوستان کسی نظری نداره؟؟

alirezabahrami
جمعه 22 شهریور 1392, 10:29 صبح
دوستان کسی نظری نداره؟؟


سلام
لطفاً تصویر پنجره فوق را در اینجا قرار بده
یا علی
سلام
فکر کنم دوستان هنوز متوجه منظور دقیق شما نشده اند که تاکنون نظری نداده اند ؛ بخاطرهمین هم بنده در پست قبلی درخواست کردم تصویر پنجره ای که مد نظر شماست ارائه فرمائید .
همانطور که در نمونه قبل هم ملاحظه فرمودید پنجره Browse Folder در حالت پیش فرض فاقد دکمه New Folder می باشد
آیامنظورشما این است که پنجره Browse Folder همانند پنجره Open دارای یک باتن جهت ایجاد فولدر جدید باشد ؟
یا علی

mmssoft
جمعه 22 شهریور 1392, 12:48 عصر
سلام
فکر کنم دوستان هنوز متوجه منظور دقیق شما نشده اند که تاکنون نظری نداده اند ؛ بخاطرهمین هم بنده در پست قبلی درخواست کردم تصویر پنجره ای که مد نظر شماست ارائه فرمائید .
همانطور که در نمونه قبل هم ملاحظه فرمودید پنجره Browse Folder در حالت پیش فرض فاقد دکمه New Folder می باشد
آیامنظورشما این است که پنجره Browse Folder همانند پنجره Open دارای یک باتن جهت ایجاد فولدر جدید باشد ؟
یا علی

بله دوست عزیز، اگه دقت کرده باشید بعضی از برنامه های ویندوز که توشون نیاز به فراخوانی Browse for Folder هست، توی پنجره Browse سمت چپ دکمه OK یه دکمه New Folder هم هست، مثل تصویر زیر :

110599

alirezabahrami
جمعه 22 شهریور 1392, 14:06 عصر
بله دوست عزیز، اگه دقت کرده باشید بعضی از برنامه های ویندوز که توشون نیاز به فراخوانی Browse for Folder هست، توی پنجره Browse سمت چپ دکمه OK یه دکمه New Folder هم هست، مثل تصویر زیر :

110599
سلام
به لینک های زیر نگاهی بکن
لینک اول:
باکدهای سی شارپ


http://www.functionx.com/vcsharp/controls/bff.htm

لینک دوم :
با کد وبی
http://vbcity.com/forums/t/156162.aspx
یاعلی

mmssoft
جمعه 22 شهریور 1392, 14:29 عصر
سلام
به لینک زیر نگاهی بکن
البته بایدکدها به زبان وی بی تغییر پیدا کند

http://www.functionx.com/vcsharp/controls/bff.htm
یاعلی

مرسی دوست عزیز؛ ولی من سر رشته ای تو C# ندارم... ممنون میشم یه نمونه واسه Vb6 بذارید

m.4.r.m
جمعه 22 شهریور 1392, 14:31 عصر
از رفرنس ها گزینه Microsoft Shell Controls And Automation رو فعال کنید و از این کد استفاده کنید مشکلتون حل خواهد شد .

Private Sub Form_Load()
Dim Shell As New Shell, Path As String

Set Shell = New Shell32.Shell

Path$ = Shell.BrowseForFolder(Me.hWnd, "Title Here", 0, "C:\")

MsgBox Path$

Set Shell = Nothing
End Sub

mmssoft
جمعه 22 شهریور 1392, 17:17 عصر
از رفرنس ها گزینه Microsoft Shell Controls And Automation رو فعال کنید و از این کد استفاده کنید مشکلتون حل خواهد شد .

Private Sub Form_Load()
Dim Shell As New Shell, Path As String

Set Shell = New Shell32.Shell

Path$ = Shell.BrowseForFolder(Me.hWnd, "Title Here", 0, "C:\")

MsgBox Path$

Set Shell = Nothing
End Sub


مرسی؛ ولی این کد دو تا مشکل داره : 1- مثلا وقتی مینویسیم
Path$ = Shell.BrowseForFolder(Me.hWnd, "Title Here", 0, "C:\")

فقط خود درایو C و پوشه های داخلش رو نشون میده و امکان دیدن بقیه درایو ها و فولدرها نیست

2- فقط اسم آخرین پوشه رو ذخیره میکنه و مسیر کامل ذخیره نمیشه، مثلن وقتی شما پوشه Salam رو از مسیر C:\Windows\System32\Drivers\Salam انتخاب میکنی، فقط Salam رو بر میگردونه...

alirezabahrami
جمعه 22 شهریور 1392, 19:59 عصر
مرسی؛ ولی این کد دو تا مشکل داره : 1- مثلا وقتی مینویسیم
Path$ = Shell.BrowseForFolder(Me.hWnd, "Title Here", 0, "C:\")

فقط خود درایو C و پوشه های داخلش رو نشون میده و امکان دیدن بقیه درایو ها و فولدرها نیست

2- فقط اسم آخرین پوشه رو ذخیره میکنه و مسیر کامل ذخیره نمیشه، مثلن وقتی شما پوشه Salam رو از مسیر C:\Windows\System32\Drivers\Salam انتخاب میکنی، فقط Salam رو بر میگردونه...

سلام
از کد زیر استفاده کن!
ضمناً یک تکست باکس ایجاد کن و آدرس شاخه انتخاب شده را مساوی آن قرار بده !
یا علی



Dim objShell As Shell
Dim objFolder As Folder
Dim Shell As New Shell

Set objShell = New Shell
Set objFolder = Shell.BrowseForFolder(Me.hWnd, "Title Here", 0, 0)
If (Not objFolder Is Nothing) Then
Dim objFolderItem As FolderItem

Set objFolderItem = objFolder.Self
If (Not objFolderItem Is Nothing) Then

newpath = objFolderItem.Path
Text1 = newpath

End If

End If
Set objFolder = Nothing
Set objShell = Nothing

mmssoft
جمعه 22 شهریور 1392, 20:20 عصر
سلام
از کد زیر استفاده کن!
ضمناً یک تکست باکس ایجاد کن و آدرس شاخه انتخاب شده را مساوی آن قرار بده !
یا علی



Dim objShell As Shell
Dim objFolder As Folder
Dim Shell As New Shell

Set objShell = New Shell
Set objFolder = Shell.BrowseForFolder(Me.hWnd, "Title Here", 0, 0)
If (Not objFolder Is Nothing) Then
Dim objFolderItem As FolderItem

Set objFolderItem = objFolder.Self
If (Not objFolderItem Is Nothing) Then

newpath = objFolderItem.Path
Text1 = newpath

End If

End If
Set objFolder = Nothing
Set objShell = Nothing



مرسی دوست عزیز، این کد تقریبا کامله؛ ولی چیزی که من میخوام اینه که وقتی پنجره باز بشه، اگر توی TextBox مسیری از قبل بود (که همیشه هست؛ یعنی TextBox هیچوقت خالی نیست یا مسیر الکی توش نیست چون Locked = True هست) اون مسیر رو تو پنجره باز کنه که باز همون مشکل هست؛ یعنی فقط همون مسیر رو نشون میده و بخش های دیگه رو نشون نمیده. مثلن با این خط تست کنید منظورم رو متوجه میشید :

Set objFolder = Shell.BrowseForFolder(Me.hWnd, "Select Folder", 0, "C:\Windows")

alirezabahrami
جمعه 22 شهریور 1392, 23:40 عصر
مرسی دوست عزیز، این کد تقریبا کامله؛ ولی چیزی که من میخوام اینه که وقتی پنجره باز بشه، اگر توی TextBox مسیری از قبل بود (که همیشه هست؛ یعنی TextBox هیچوقت خالی نیست یا مسیر الکی توش نیست چون Locked = True هست) اون مسیر رو تو پنجره باز کنه که باز همون مشکل هست؛ یعنی فقط همون مسیر رو نشون میده و بخش های دیگه رو نشون نمیده. مثلن با این خط تست کنید منظورم رو متوجه میشید :

Set objFolder = Shell.BrowseForFolder(Me.hWnd, "Select Folder", 0, "C:\Windows")

سلام
برای رفع این مشکل میتوان در هر دفعه ای که یک آدرس انتخاب میشود آن آدرس در رجیستری ذخیره نمود بعدهم به هنگام اجرای فرمی که از طریق آن میخواهیم پنجره فوق را فراخوانی کنیم آن آدرس را در تکست باکس مربوطه فرخوانی نمائیم.و در واقع این آدرس را بجای "C:\Windows" قرار میدهیم .

ضمناً اگربخواهید شاخه بالاتر هرمسیر درپنجره فوق به نمایش در آید قسمت آخر آدرس باید حذف شود .
نمونه را ملاحظه بفرما!
یا علی