Что нового

написание установщика ПО

HispCrazy

Новичок
Сообщения
4
Репутация
0
Добрый день! Мне поступила задача взять существующий установщик ПО и переработать его. есть два скрипта:

скрипт 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, как в первом скрипте... Прошу помощи!
 
Автор
H

HispCrazy

Новичок
Сообщения
4
Репутация
0
разобрался и с формой и с размерами... вопрос, как заставить программы раскладываться по определённым вкладкам?

Код:
;**************************************************************************************************************
;build 2012.02.29
;Скрипт для автоматической установки Софта в сети VDC
;
;
;**************************************************************************************************************

Opt('GUIOnEventMode',       1) ;метод вешанья событий на кнопки

#requireadmin
#include <GUIConstantsEx.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*3 + $HeadHeight + $ButtonsHeight*2 + ($CheckHeight + $CommentHeight)*$Rows	;итоговая высота формы

$w =  15					;промежутки между элементами по ширине
$ColWidth = 225				;ширина колонок
$ButtonsWidth = 70			;ширина кнопок
$Cols =  2	;количество колонок
$FormWidth = $w*($Cols+1) + $ColWidth*$Cols
$Form1 = GuiCreate("Универсальный установщик VDC ", $FormWidth, $FormHeight, -1, -1, $WS_SIZEBOX, $WS_EX_DLGMODALFRAME) ;вводим переменную главного окна
;Создаем форму
$Form1

$Tab1 = GUICtrlCreateTab(0, 0, 500, 500)
$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)
GUISetOnEvent($GUI_EVENT_CLOSE, "MyExit")
GuiSetState(@SW_HIDE)	;прячем форму
GUISetBkColor(0xffffff)	;цвет формы
;кнопки
$OkButton = GUICtrlCreateButton("&Ok", $w, $FormHeight - $ButtonsHeight - $h*5, $ButtonsWidth, $ButtonsHeight)
   GUICtrlSetOnEvent(-1, 'Start')
$MenuItem1 = GUICtrlCreateMenu("File")
$MenuItem2 = GUICtrlCreateMenuItem("Select All", $MenuItem1)
   GUICtrlSetOnEvent(-1, 'Check All')
$MenuItem3 = GUICtrlCreateMenuItem("Unselect All", $MenuItem1)
   GUICtrlSetOnEvent(-1, 'Uncheck All')
$MenuItem4 = GUICtrlCreateMenuItem("Exit", $MenuItem1)
   GUICtrlSetOnEvent(-1, 'MyExit')
;$nChild_Button = GUICtrlCreateButton("Дополнительное ПО", $w + $h*9 + $ButtonsWidth, $HeadHeight + ($CheckHeight + $CommentHeight)*$Rows , $ButtonsWidth*2, $ButtonsHeight)
   ;GUICtrlSetOnEvent(-1, 'ChildWindow')
;прогрессбар
$Bar = GuiCtrlCreateProgress($w*2 + $ButtonsWidth, $FormHeight - $ButtonsHeight - $h*5, $FormWidth - $w*4 - $ButtonsWidth*2, 20)
_Populate()


#cs
;колонки и лейблы
For $i = 0 to ($Cols-1)
   $List[$i] = GUICtrlCreateListView($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] = GUICtrlCreateListViewItem($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
#ce




;_ArrayDisplay($Script, "$avArray as a 2D array, transposed")

GuiSetState(@SW_SHOW, $Form1)	;Показываем форму

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


;$hChild_GUI = CreateChildWindow($hMain_GUI) ;Создаём дочерний GUI, не отображая его на экране

;--- Создаем форму --- конец



#cs
    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
#ce

;--- Заглушка --- начало

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
 
Верх