Добрый день! Мне поступила задача взять существующий установщик ПО и переработать его. есть два скрипта:
скрипт 1:
и найденный мной на форуме скрипт 2, слегка переработанный:
вот я хочу сделать форму как во втором скрипте, только добавить ещё в меню "File" кнопку "Check All", но никак не могу интегрировать эти два скрипта.. ещё загвоздка, что надо сделать всё методом OnEvent, как в первом скрипте... Прошу помощи!
скрипт 1:
Код:
Opt('GUIOnEventMode', 1) ;метод вешанья событий на кнопки
#requireadmin
#include <GUIConstantsEx.au3>
#include <GuiTreeView.au3>
#include <GuiListView.au3>
#include <WindowsConstants.au3>
#include <TreeViewConstants.au3>
#include <StaticConstants.au3>
#Include <File.au3>
#include <Array.au3>
#include <GuiButton.au3>
#include <TreeViewConstants.au3>
#include <ProgressConstants.au3>
;Путь к Program files
if @OSArch="x64" Then
$PF = 'C:\Program Files (x86)\'
Else
$PF = 'C:\Program Files\'
EndIf
$PFx64 = 'C:\Program Files\'
; $PF - используется для автоматической установки 32-битного софта в 64-битной ОС в нужную папку. Например lotus, phone manager и прочее
; $PFx64 - для правильной установки 64-битного софта в 64-битной ОС. Например 7-zip, MS Office
;ищем подпапки
$Folder = _FileListToArray(@ScriptDir,'*', 2) ; эта функция помещает в нулевой элемент количество элементов в массиве! Так что счет идет от единицы
Local $Max = 0
if ($Folder = 0) OR ($Folder = 4) Then ;если функция возвратила ошибку
MsgBox(0,'Ошибка', 'Не обнаружено ниодной подпапки')
Exit
Else
$DimSize = 0 ; выясним размер массива который нам нужен
$Cols = 0 ;выясняем количество колонок
For $i = 1 to $Folder[0]
$SetupIT = @ScriptDir & '\' & $Folder[$i] & '\SetupIT.txt'
If FileExists($SetupIT) Then
$DimSize = $DimSize +1
;считываем из файла номер столбца
if $Cols < (FileReadLine ( $SetupIT, 1 )) Then
$Cols = (FileReadLine ( $SetupIT, 1 ))
EndIf
EndIf
Next
EndIf
if $DimSize = 0 Then ;если не найден ниодин файл параметров
MsgBox(0,'Ошибка', 'Не обнаружено ниодной подпапки')
Exit
EndIf
;-------------------Объявляем переменные--- Начало
Global Const $TxtStrCount = 3 ;количество параметров в SetupIT.txt
Global $Script[$DimSize][$TxtStrCount+2] ;главная матрица
Global $Tree[$Cols], $CheckAll[$Cols], $UnCheckAll[$Cols]
Global $nChildGUI_Close_Bttn = -1 ;Обязательно задавать элементам -1, чтобы небыло ложного срабатывания событий в случае если (ещё) не создан элемент присваиваемый данной переменной
$DimSize = 0 ;обнуляем
;-------------------Объявляем переменные--- Конец
$k=0
For $i = 1 to $Folder[0]
$SetupIT = @ScriptDir & '\' & $Folder[$i] & '\SetupIT.txt'
if FileExists($SetupIT) Then
$Script [$k][0] = $folder[$i]
$k = $k +1
EndIf
Next
;_ArrayDisplay($Folder, "Folder")
;заполняем массив
For $i = 0 to UBound($Script)-1
$SetupIT = @ScriptDir & '\' & $Script[$i][0] & '\SetupIT.txt'
if FileExists($SetupIT) then
for $k =1 to $TxtStrCount
$Script[$i][$k] = StringStripWS(FileReadLine ( $SetupIT, $k ), 3) ;читаем строчку, отсекаем пробелы до и после
Next
EndIf
Next
$SetupIT = 0 ;обнуляем переменную
;_ArrayDisplay($Script, "Final")
;--- Создаем форму --- начало
;Размеры
$h = 10 ;промежутки между элементами по высоте
$HeadHeight = 40 ;высота шапки
$CheckHeight = 18 ;высота чекбоксов
$CommentHeight = 0 ;высота комментов
$ButtonsHeight = 20 ;высота кнопок
$Rows = 10 ;максимальное количество чекбоксов в колонке
$FormHeight = $h*4 + $HeadHeight + $ButtonsHeight*2 + ($CheckHeight + $CommentHeight)*$Rows ;итоговая высота формы
$w = 15 ;промежутки между элементами по ширине
$ColWidth = 225 ;ширина колонок
$ButtonsWidth = 70 ;ширина кнопок
;$Cols = ;количество колонок
$FormWidth = $w*($Cols+1) + $ColWidth*$Cols
$hMain_GUI = GuiCreate("Универсальный установщик VDC ", $FormWidth, $FormHeight, -1, -1, $WS_SIZEBOX, $WS_EX_DLGMODALFRAME) ;вводим переменную главного окна
;Создаем форму
$hMain_GUI
GUISetOnEvent($GUI_EVENT_CLOSE, "MyExit")
GuiSetState(@SW_HIDE) ;прячем форму
GUISetBkColor(0xffffff) ;цвет формы
;кнопки
$OkButton = GUICtrlCreateButton("&Ok", $w, $FormHeight - $ButtonsHeight - $h*3, $ButtonsWidth, $ButtonsHeight)
GUICtrlSetOnEvent(-1, 'Start')
$CancelButton = GUICtrlCreateButton("&Cancel", $FormWidth - $w - $ButtonsWidth, $FormHeight - $ButtonsHeight - $h*3, $ButtonsWidth, $ButtonsHeight)
GUICtrlSetOnEvent(-1, 'MyExit')
$CheckAll = GUICtrlCreateButton("Check All", $w, $HeadHeight + ($CheckHeight + $CommentHeight)*$Rows , $ButtonsWidth, $ButtonsHeight)
GUICtrlSetOnEvent(-1, 'CheckAll')
$UnCheckAll = GUICtrlCreateButton("UnCheck All", $w + $h + $ButtonsWidth, $HeadHeight + ($CheckHeight + $CommentHeight)*$Rows , $ButtonsWidth, $ButtonsHeight)
GUICtrlSetOnEvent(-1, 'UnCheckAll')
$nChild_Button = GUICtrlCreateButton("Дополнительное ПО", $w + $h*9 + $ButtonsWidth, $HeadHeight + ($CheckHeight + $CommentHeight)*$Rows , $ButtonsWidth*2, $ButtonsHeight)
GUICtrlSetOnEvent(-1, 'ChildWindow')
#cs;создаём меню и подменю
$Tab1 = GUICtrlCreateTab(16, 8, 601, 377)
$TabSheet1 = GUICtrlCreateTabItem("Стандартное ПО")
$ListView1 = GUICtrlCreateListView("Software Name|Description", 24, 40, 582, 334)
_GUICtrlListView_SetExtendedListViewStyle($ListView1, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_CHECKBOXES, $LVS_EX_GRIDLINES))
GUICtrlSendMsg(-1, 0x101E, 0, 200)
GUICtrlSendMsg(-1, 0x101E, 1, 375)
$TabSheet2 = GUICtrlCreateTabItem("ПО по требованию")
$ListView2 = GUICtrlCreateListView("Software Name|Description", 24, 40, 578, 334)
_GUICtrlListView_SetExtendedListViewStyle($ListView2, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_CHECKBOXES, $LVS_EX_GRIDLINES))
GUICtrlSendMsg(-1, 0x101E, 0, 200)
GUICtrlSendMsg(-1, 0x101E, 1, 375)
$TabSheet3 = GUICtrlCreateTabItem("Платное ПО")
$ListView3 = GUICtrlCreateListView("Software Name|Description", 24, 40, 578, 334)
_GUICtrlListView_SetExtendedListViewStyle($ListView3, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_CHECKBOXES, $LVS_EX_GRIDLINES))
GUICtrlSendMsg(-1, 0x101E, 0, 200)
GUICtrlSendMsg(-1, 0x101E, 1, 375)
#ce
;прогрессбар
$Bar = GuiCtrlCreateProgress($w*2 + $ButtonsWidth, $FormHeight - $ButtonsHeight - $h*3, $FormWidth - $w*4 - $ButtonsWidth*2, 20)
;колонки и лейблы
For $i = 0 to ($Cols-1)
$Tree[$i] = GuiCtrlCreateTreeView($w*($i+1)+$ColWidth*$i, $HeadHeight, $ColWidth, ($CheckHeight + $CommentHeight)*$Rows - $h, $TVS_CHECKBOXES)
GUICtrlSetBkColor($Tree[$i], 0xffffff) ;цвет подложки
;раскидываем чекбоксы по колонкам
For $j = 0 to UBound($Script, 1) - 1
if $Script[$j][1] = $i+1 Then ;если программа находится в столбце i
$Script[$j][4] = GuiCtrlCreateTreeViewItem($Script[$j][0], $Tree[$i]) ;заносим ссылку на чекбокс в 4ю колонку
;ели не крайняя правая колонка - ставим чек
If Not ($i = ($Cols-1)) Then
GUICtrlSetState($Script[$j][4], $GUI_CHECKED)
EndIf
;если поле проверки установки в тесктовом файле не пустое то
if Not $Script[$j][3] = '' Then
;красим в зеленый, снимаем чек
if FileExists($Script[$j][3]) Then
GUICtrlSetColor($Script[$j][4], 0x009900)
GUICtrlSetState($Script[$j][4], $GUI_UNCHECKED)
Else
;если ось 64-битная ищем файл еще и в Program Files x86
if @OSArch="x64" Then
$temp = StringReplace($Script[$j][3], 'Program Files', 'Program Files (x86)')
if FileExists($temp) Then
GUICtrlSetColor($Script[$j][4], 0x009900)
GUICtrlSetState($Script[$j][4], $GUI_UNCHECKED)
EndIf
EndIf
EndIf
EndIf
EndIf
Next
Next
;_ArrayDisplay($Script, "$avArray as a 2D array, transposed")
GuiSetState(@SW_SHOW, $hMain_GUI) ;Показываем форму
$hChild_GUI = CreateChildWindow($hMain_GUI) ;Создаём дочерний GUI, не отображая его на экране
;--- Создаем форму --- конец
Func ChildWindow()
$nChild_Button
;Показываем дочерний GUI при нажатии на кнопку "Дополнительное ПО"
GUISetState(@SW_SHOW, $hChild_GUI)
If Not WinActive($hChild_GUI) Then WinActivate($hChild_GUI)
;Проверяем если "событие закрытия" поступило с главного-родительского GUI
If $GUI_EVENT_CLOSE = $hMain_GUI Then Exit
;Если "событие закрытия" поступило с дочернего GUI, то просто прячем его
If $GUI_EVENT_CLOSE = $hChild_GUI Then
GUISetState(@SW_HIDE, $hChild_GUI)
EndIf
$nChildGUI_Close_Bttn
;GUISetState(@SW_HIDE, $hChild_GUI)
EndFunc
Func CreateChildWindow($hParent)
Local $hChild_GUI
$hChild_GUI = GUICreate("Список дополнительного ПО", 430, 200, -1, -1, -1, -1, $hParent)
GUISetOnEvent($GUI_EVENT_CLOSE, "ChildMyExit")
GuiSetState(@SW_HIDE) ;прячем форму
GUISetBkColor(0xD0D0D0) ;цвет формы
;Создаём элементы тут
$nChildGUI_Close_Bttn = GUICtrlCreateButton("Cancel", 350, 170, 60, 20)
GUICtrlSetOnEvent(-1, 'ChildMyExit')
Return $hChild_GUI
EndFunc
Func ChildMyExit()
GuiSetState(@SW_HIDE)
Exit
EndFunc
;--- Заглушка --- начало
While 1
sleep(2000)
WEnd
;--- Заглушка --- конец
;--- Функция проверки, отмечены ли галки на установку --- начало
Func Checks()
$NoChecks = 0
For $i=0 to UBound($Script, 1) - 1
If _GUICtrlTreeView_GetChecked($Tree[$Script[$i][1]-1], $Script[$i][4]) = "True" Then
$NoChecks = $NoChecks + 1
EndIf
Next
return $NoChecks
EndFunc
;--- Функция проверки, отмечены ли галки на установку --- конец
;--- Установщик --- начало
Func Start()
Local $Number = Checks()
If $Number = 0 Then
MsgBox(16,"Не выбран ни один пункт","Выберите хотя бы один пункт перед началом установки")
Else
if FileExists (@ScriptDir & '\SecurityPrompt.exe') Then
Run(@ScriptDir & '\SecurityPrompt.exe')
EndIf
Local $Run = ''
Local $x = 100/($Number+1)
$procent = $x
GUICtrlSetData($Bar, $x)
For $i = 0 to UBound($Script, 1) - 1
;MsgBox(0,'Script',$Script[$i][0])
;_ArrayDisplay($Script, "$avArray as a 2D array, transposed")
;если стоит чек
If _GUICtrlTreeView_GetChecked($Tree[$Script[$i][1]-1], $Script[$i][4]) = "True" Then
;путь запуска
$Run = @ScriptDir & '\' & $Script[$i][0] & '\' & $Script[$i][2]
if FileExists($Run) Then
;MsgBox(0,'$Run',$Run)
ShellExecuteWait($Run)
GUICtrlSetColor($Script[$i][4], 0x009900) ;меняем цвет строки на зеленый
GUICtrlSetState($Script[$i][4], $GUI_UNCHECKED) ;отжимаем чек
$procent += $x
GUICtrlSetData($Bar, $procent)
EndIf
EndIf
Next
GUIDelete()
ProcessClose('SecurityPrompt.exe')
MsgBox(0,'Готово','Установка завершена',2)
Exit
EndIf
EndFunc
;--- Установщик --- конец
;--- Поставить чеки --- начало
Func CheckAll()
For $i = 0 to UBound($Script, 1) - 1
;если не крайняя колонка
If $Script[$i][1] < $Cols Then
GUICtrlSetState($Script[$i][4], $GUI_CHECKED)
EndIf
Next
EndFunc
;--- Поставить чеки --- конец
;--- Снять чеки --- начало
Func UnCheckAll()
For $i = 0 to UBound($Script, 1) - 1
GUICtrlSetState($Script[$i][4], $GUI_UNCHECKED)
Next
EndFunc
;--- Снять чеки --- конец
;--- Выход --- начало
Func MyExit()
GUIDelete()
Exit
EndFunc
;--- Выход --- конец
Exit
и найденный мной на форуме скрипт 2, слегка переработанный:
Код:
#include <GUIConstants.au3>
#include <GuiListView.au3>
#include <Array.au3>
#include <File.au3>
Global $ListView7
Global $iniFile = @ScriptDir & ".\Config.ini"
Global $scriptDir = @ScriptDir
; Main GUI
$Form1 = GUICreate("Software Installer", 633, 451)
$Tab1 = GUICtrlCreateTab(16, 8, 601, 377)
$TabSheet1 = GUICtrlCreateTabItem("Стандартное ПО")
$ListView1 = GUICtrlCreateListView("Software Name|Description", 24, 40, 582, 334)
_GUICtrlListView_SetExtendedListViewStyle($ListView1, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_CHECKBOXES, $LVS_EX_GRIDLINES))
GUICtrlSendMsg(-1, 0x101E, 0, 200)
GUICtrlSendMsg(-1, 0x101E, 1, 375)
$TabSheet2 = GUICtrlCreateTabItem("ПО по требованию")
$ListView2 = GUICtrlCreateListView("Software Name|Description", 24, 40, 578, 334)
_GUICtrlListView_SetExtendedListViewStyle($ListView2, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_CHECKBOXES, $LVS_EX_GRIDLINES))
GUICtrlSendMsg(-1, 0x101E, 0, 200)
GUICtrlSendMsg(-1, 0x101E, 1, 375)
$TabSheet3 = GUICtrlCreateTabItem("Платное ПО")
$ListView3 = GUICtrlCreateListView("Software Name|Description", 24, 40, 578, 334)
_GUICtrlListView_SetExtendedListViewStyle($ListView3, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_CHECKBOXES, $LVS_EX_GRIDLINES))
GUICtrlSendMsg(-1, 0x101E, 0, 200)
GUICtrlSendMsg(-1, 0x101E, 1, 375)
GUICtrlCreateTabItem("") ; This ends the tab item creation
$Button1 = GUICtrlCreateButton("Install Selected Software", 398, 395, 219, 25, 0)
$MenuItem1 = GUICtrlCreateMenu("File")
$MenuItem2 = GUICtrlCreateMenuItem("Unselect All", $MenuItem1)
$MenuItem3 = GUICtrlCreateMenuItem("Exit", $MenuItem1)
_Populate()
GUISetState(@SW_SHOW)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
_InstallSelectedSoftware()
Case $MenuItem2
_UnselectAll()
Case $MenuItem3
Exit
EndSwitch
WEnd
Func _Populate()
; Find all files in the Software folder and populate the tabs with the installers.
$f = FileFindFirstFile("Software/*.*")
Dim $array[1]
$i = 0
Do
$s = FileFindNextFile($f)
If Not @error Then
$array[$i] = $s
$i += 1
ReDim $array[$i + 1]
EndIf
Until @error
if $i = 0 Then Return 0
ReDim $array[$i]
For $i = 1 To UBound($array) Step 1
$category = IniRead($iniFile, $array[$i - 1], "Category", "5")
$desc = IniRead($iniFile, $array[$i - 1], "Desc", "")
If $category = 1 Then
GUICtrlCreateListViewItem($array[$i - 1] & "|" & $desc, $ListView1)
ElseIf $category = 2 Then
GUICtrlCreateListViewItem($array[$i - 1] & "|" & $desc, $ListView2)
ElseIf $category = 3 Then
GUICtrlCreateListViewItem($array[$i - 1] & "|" & $desc, $ListView3)
ElseIf $category = 4 Then
GUICtrlCreateListViewItem($array[$i - 1] & "|" & $desc, $ListView4)
ElseIf $category = 6 Then
GUICtrlCreateListViewItem($array[$i - 1] & "|" & $desc, $ListView6)
Else
GUICtrlCreateListViewItem($array[$i - 1] & "|" & $desc, $ListView5)
EndIf
Next
EndFunc ;==>_Populate
Func _InstallSelectedSoftware()
Dim $sArray[1]
; Find which items were selected by user on all six tabs
$count = _GUICtrlListView_GetItemCount($ListView1)
$aCount = 0
For $i = 1 To $count Step 1
If _GUICtrlListView_GetItemChecked($ListView1, $i - 1) = True Then
$sArray[$aCount] = _GUICtrlListView_GetItemText($ListView1, $i - 1)
ReDim $sArray[UBound($sArray) + 1]
$aCount += 1
EndIf
Next
$count = _GUICtrlListView_GetItemCount($ListView2)
For $i = 1 To $count Step 1
If _GUICtrlListView_GetItemChecked($ListView2, $i - 1) = True Then
$sArray[$aCount] = _GUICtrlListView_GetItemText($ListView2, $i - 1)
ReDim $sArray[UBound($sArray) + 1]
$aCount += 1
EndIf
Next
$count = _GUICtrlListView_GetItemCount($ListView3)
For $i = 1 To $count Step 1
If _GUICtrlListView_GetItemChecked($ListView3, $i - 1) = True Then
$sArray[$aCount] = _GUICtrlListView_GetItemText($ListView3, $i - 1)
ReDim $sArray[UBound($sArray) + 1]
$aCount += 1
EndIf
Next
; Begin installing selected software
ProgressOn("Software Installer", "Installing", "", -1, -1, 16)
For $i = 1 To UBound($sArray) - 1 Step 1
$fileName = $sArray[$i - 1]
$switch = IniRead($iniFile, $fileName, "Switch", "")
Local $szDrive, $szDir, $szFName, $szExt
$extension = StringRight($fileName, 3)
If $extension = "msi" Then
Run("msiexec /i " & '"' & $scriptDir & "Software" & $fileName & '" ' & $switch) ; For MSI type installers
Else
RunWait('"' & $scriptDir & "Software" & $fileName & '"' & " " & $switch) ; For EXE installers
EndIf
ProgressSet($i / (UBound($sArray) - 1) * 100, Round($i / (UBound($sArray) - 1) * 100, 0) & "%", "Installing " & $i & " of " & UBound($sArray) - 1)
Next
ProgressOff()
EndFunc ;==>_InstallSelectedSoftware
Func _UnselectAll()
$count = _GUICtrlListView_GetItemCount($ListView1)
For $i = 1 To $count Step 1
_GUICtrlListView_SetItemChecked($ListView1, $i - 1, False)
Next
$count = _GUICtrlListView_GetItemCount($ListView2)
For $i = 1 To $count Step 1
_GUICtrlListView_SetItemChecked($ListView2, $i - 1, False)
Next
$count = _GUICtrlListView_GetItemCount($ListView3)
For $i = 1 To $count Step 1
_GUICtrlListView_SetItemChecked($ListView3, $i - 1, False)
Next
$count = _GUICtrlListView_GetItemCount($ListView4)
For $i = 1 To $count Step 1
_GUICtrlListView_SetItemChecked($ListView4, $i - 1, False)
Next
$count = _GUICtrlListView_GetItemCount($ListView5)
For $i = 1 To $count Step 1
_GUICtrlListView_SetItemChecked($ListView5, $i - 1, False)
Next
$count = _GUICtrlListView_GetItemCount($ListView6)
For $i = 1 To $count Step 1
_GUICtrlListView_SetItemChecked($ListView6, $i - 1, False)
Next
EndFunc ;==>_UnselectAll
вот я хочу сделать форму как во втором скрипте, только добавить ещё в меню "File" кнопку "Check All", но никак не могу интегрировать эти два скрипта.. ещё загвоздка, что надо сделать всё методом OnEvent, как в первом скрипте... Прошу помощи!