Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


Написал давно желанную функцию, но она работает как бы наполовину - она должна заменять стандартную функцию FileSelectFolder, но проблема в том, что у меня не получается - А) либо создать все вкладки (в TreeView) для всех существующих папок (это также займёт кучу времени на их генерацию), Б) либо создавать их “находу” (т.е в момент вызова/раскрытия той или иной вкладки) - в принципе, проблема со вторым вариантом такая - нужно узнать как очистить одну выделенную вкладку от её подвкладок (не удаляя её саму).
Для чего нужна такая функция? во-первых для того чтобы можно было прикреплять это окно к другому приложению (или к родительскому гуи) - эта одна из основных причин (даже самая) - далее можно также используя подобную функцию, просто создавать это окно с разными размерами, с разными кнопками и возвращаемой информацией, также будет возможность задать этому окну атрибут “поверх всех окон” и т.д и т.п...

Вот в принципе сам скрипт с примером:

Код: Выделить весь код
#include <GUIConstants.au3>
#include <GUITreeView.au3>
#include <File.au3>

$Parent = GUICreate("test", 200, 200)
$Select = GUICtrlCreateButton("Select", 50, 50)

GUISetState()

While 1
	$Msg = GUIGetMsg()
	If $Msg = -3 Then ExitLoop
	If $Msg = $Select Then
		GUISetState(@SW_DISABLE)
		$Path = _FileSelectFolder("Select Folder", "Choose needed Path:", 300, 300, 1, $Parent)
		If Not @error Then MsgBox(64, "Path", "The selected path is: <" & $Path & ">")
		GUISetState(@SW_RESTORE)
		GUISetState(@SW_ENABLE)
	EndIf
WEnd

GUIDelete()

Func _FileSelectFolder($Title, $Dialog_Text, $Width=300, $Heght=300, $OnTop=0, $Hwnd="")
	Opt("GuiOnEventMode", 1)
	Global $IsExit = 0, $IsCancel = 0, $PathInput, $MainTreeViewID, $TOPMOST
	If $OnTop = 1 Then $OnTop = 8
	GUICreate($Title, $Width, $Heght, -1, -1, $WS_SYSMENU+$WS_CAPTION+$WS_SIZEBOX, $WS_EX_CONTEXTHELP+$OnTop, $Hwnd)
	GUISetOnEvent(-3, "Cancel")
	
	GUICtrlCreateLabel($Dialog_Text, 10, 5)

	$ButtonOK = GUICtrlCreateButton("OK", $Width-180, $Heght-25, 70, 20)
	GUICtrlSetOnEvent(-1, "OK")
	
	$ButtonCancel = GUICtrlCreateButton("Cancel", $Width-80, $Heght-25, 70, 20)
	GUICtrlSetOnEvent(-1, "Cancel")
	
	$PathInput = GUICtrlCreateInput("", 10, $Heght-50, $Width-20)

	$MainTreeViewID = GUICtrlCreateTreeView(10, 30, $Width-20, $Heght-90, BitOr($TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS), $WS_EX_CLIENTEDGE)

	GUISetState()

	$DrivesArr = _DrivesListToArray("all")
	If IsArray($DrivesArr) Then
		Dim $MainDriveID[$DrivesArr[0]+1], $CurrentIcon, $CurrentIcID
		For $i = 1 To $DrivesArr[0]
			$CurrentDrive = $DrivesArr[$i]
			If $CurrentDrive <> "a:" And $CurrentDrive <> "b:" Then
				$CurrentIcon = $CurrentDrive & "\" & IniRead($CurrentDrive & "\Autorun.inf", "Autorun", "Icon", "")
				$CurrentIcID = 0
			EndIf
			If Not FileExists($CurrentIcon) Then
				$CurrentIcon = "shell32.dll"
				$CurrentIcID = 8
			EndIf
			$MainDriveID[$i] = GUICtrlCreateTreeViewItem(StringUpper($CurrentDrive) & "\", $MainTreeViewID)
			GUICtrlSetOnEvent(-1, "GetText")
			
			If $CurrentDrive = "a:" Or $CurrentDrive = "b:" Then
				GUICtrlSetImage(-1, "shell32.dll", 6, 0)
			ElseIf DriveGetType($CurrentDrive) = "CDROM" Then
				GUICtrlSetImage(-1, "shell32.dll", 11, -1)
			Else
				GUICtrlSetImage(-1, StringStripWS($CurrentIcon, 3), $CurrentIcID, -1)
			EndIf
			
			If $CurrentDrive <> "a:" And $CurrentDrive <> "b:" Then
				$DirsArr = _FileListToArray($CurrentDrive, "*", 2)
				If IsArray($DirsArr) Then
					For $j = 1 To $DirsArr[0]
						$CurrentDir = $DirsArr[$j]
						GUICtrlCreateTreeViewItem($CurrentDir, $MainDriveID[$i])
						GUICtrlSetOnEvent(-1, "GetText")
						_GUICtrlTreeViewSetIcon($MainTreeViewID, -1, "shell32.dll", 4)
					Next
				EndIf
			EndIf
		Next
	EndIf

	While $IsExit = 0
		Sleep(10)
	WEnd
	$Path = StringReplace(_GUICtrlTreeViewGetTree($MainTreeViewID, "\"), "\\", "\")
	GUIDelete()
	Opt("GuiOnEventMode", 0)
	If $IsCancel = 1 Then
		SetError(1)
		Return ""
	Else
		Return $Path
	EndIf
EndFunc

Func GetText()
	GUICtrlSetData($PathInput, GUICtrlRead(@GUI_CtrlId, 1))
EndFunc

Func OK()
	Global $IsExit = 1
EndFunc

Func Cancel()
	Global $IsExit = 1, $IsCancel = 1
EndFunc

Func Quit()
	Exit
EndFunc

Func _DrivesListToArray($Type)
	$DrivesArr = DriveGetDrive($Type)
	If IsArray($DrivesArr) Then
		Dim $DrivesListArr[$DrivesArr[0]+1]
		$DrivesListArr[0] = $DrivesArr[0]
		For $iDrive = 1 To $DrivesArr[0]
			$CurrentDrive = $DrivesArr[$iDrive]
			$DrivesListArr[$iDrive] = $CurrentDrive
		Next
	EndIf
	Return $DrivesListArr
EndFunc
И ещё хотелось бы сделать чтобы можно было задать при вызове функции исходную папку (Init Dir) - но увы я только сегодня начал разбирать основы TreeView, и поэтому не знаю как заставить раскрыться вкладкам на том месте где находится указанное имя (т.е имя вкладки).

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 10:59, 12-02-2007 | #187