Что нового

[Элементы GUI] Помогите сделать меню из чекбоксов, выбранные чекбоксы должны устанавливать софт

HaeMHuK

Новичок
Сообщения
43
Репутация
0

Я выбираю софт и он должен установиться. Все должно сопровождаться прогресбаром и надписью что в данный момент устанавливается.
Ключи к тихой установке софта имеются.
Помогите пожалуйста, набросайте примерчик, остальное все сам.
Заранее спасибо.
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
369
Код:
#include <GUIConstants.au3>

$hGUI = GUICreate('111', 200, 200)
$h_1 = GUICtrlCreateCheckbox('Soft 1', 10, 20, 100, 17)
$h_2 = GUICtrlCreateCheckbox('Soft 2', 10, 40, 100, 17)
$h_3 = GUICtrlCreateCheckbox('Soft 3', 10, 60, 100, 17)
$hProgress = GUICtrlCreateProgress(10, 80, 120, 17)
$hLabel = GUICtrlCreateLabel('Выберите софт и нажмите GO!', 10, 110, 180, 17)
$hButtonGo = GUICtrlCreateButton('go', 10, 140, 80, 25)
$hButtonQuit = GUICtrlCreateButton('quit', 100, 140, 80, 25)
GUISetState()

While 1
	$msg = GUIGetMsg()
	Select
		Case $msg = $GUI_EVENT_CLOSE Or $msg = $hButtonQuit
			Exit
		Case $msg = $hButtonGo
			GUISetState(@SW_DISABLE)
			GUICtrlSetData($hProgress, 0)
			If GUICtrlRead($h_1) = $GUI_UNCHECKED And GUICtrlRead($h_2) =  $GUI_UNCHECKED And GUICtrlRead($h_3) = $GUI_UNCHECKED Then
				MsgBox(0, 'Error', 'Ни одного пункта не выбрано!')
			Else
				If GUICtrlRead($h_1) =  $GUI_CHECKED Then
					GUICtrlSetData($hLabel, 'Устанавливаем софт №1')
					; устанавливаем софт №1
					If GUICtrlRead($h_2) = $GUI_CHECKED And GUICtrlRead($h_3) = $GUI_CHECKED Then
						GUICtrlSetData($hProgress, 33)
					ElseIf GUICtrlRead($h_2) = $GUI_CHECKED Or GUICtrlRead($h_3) = $GUI_CHECKED Then
						GUICtrlSetData($hProgress, 50)
					Else
						GUICtrlSetData($hProgress, 100)
					EndIf
					GUICtrlSetData($hLabel, 'Софт №1 установлен')
				EndIf
				If GUICtrlRead($h_2) = $GUI_CHECKED Then
					GUICtrlSetData($hLabel, 'Устанавливаем софт №2')
					; устанавливаем софт №2
					If GUICtrlRead($h_1) = $GUI_CHECKED And GUICtrlRead($h_3) = $GUI_CHECKED Then
						GUICtrlSetData($hProgress, GUICtrlRead($hProgress) + 33)
					ElseIf GUICtrlRead($h_1) = $GUI_CHECKED Or GUICtrlRead($h_3) = $GUI_CHECKED Then
						GUICtrlSetData($hProgress, GUICtrlRead($hProgress) + 50)
					Else
						GUICtrlSetData($hProgress, 100)
					EndIf
					GUICtrlSetData($hLabel, 'Софт №2 установлен')
				EndIf
				If GUICtrlRead($h_3) = $GUI_CHECKED Then
					GUICtrlSetData($hLabel, 'Устанавливаем софт №3')
					; устанавливаем софт №3
					If GUICtrlRead($h_1) = $GUI_CHECKED And GUICtrlRead($h_2) = $GUI_CHECKED Then
						GUICtrlSetData($hProgress, GUICtrlRead($hProgress) + 33)
					ElseIf GUICtrlRead($h_1) = $GUI_CHECKED Or GUICtrlRead($h_2) = $GUI_CHECKED Then
						GUICtrlSetData($hProgress, GUICtrlRead($hProgress) + 50)
					Else
						GUICtrlSetData($hProgress, 100)
					EndIf
					GUICtrlSetData($hLabel, 'Софт №3 установлен')
				EndIf
				MsgBox(0, 'Done!', 'Весь выбранный софт установлен')
				GUICtrlSetData($hProgress, 0)
				GUICtrlSetData($hLabel, 'Выберите софт и нажмите GO!')
			EndIf
			GUISetState(@SW_ENABLE)
	EndSelect
WEnd
 
Автор
H

HaeMHuK

Новичок
Сообщения
43
Репутация
0
Спасибо. Все работает, но есть одно но. При установке пакета msi выскакиевает окно о заершении установки, хотя в процессах еще висит и заканчивается позже. Если применить RunWait, то прогрессбара нет и скрипт всисит пока пакет не установится. Что посоветуете в данной ситуации?
 
Автор
H

HaeMHuK

Новичок
Сообщения
43
Репутация
0
Run("msiexec /i install.msi /quiet")
ProcessWaitClose("msiexec.exe")

Установка проходит, но прогресбар не работет. Скрипт висит во время установки
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
369
HaeMHuK [?]
Установка проходит, но прогресбар не работет. Скрипт висит во время установки
Ну это понятно - откуда прогресс возьмет данные для своего прогрессирования :D в момент установки софта, в моем примере он привязан только к факту старта процесса установки и все.
Можно конечно помучиться, например, узнать сколько примерно весит папка с уже установленным софтом, и в процессе установки проверять ее размер - если изменился - двигаем ползунок. Но тогда появляются сложности с распределение процентов между программами(придется учитывать сколько программ выбрал пользователь и во время установки одной программы двигать прогресс в пределах выделенной ему квоты 33 50 или 100 процентов). Хотя можно добавить дополнительный прогресс - который будет регистрировать установку каждой программы по очереди.
Вот примерный набросок кода
Код:
$hSizeSoft = 40000000
; размер папки установленного софта в килобайтах (для каждой программы нужно будет сначала задать этот размер, иначе прогресс будет отображать неверную информацию)
$hProgress = GUICtrlCreateProgress()
Run('запуск тихой установки софта')
While ProcessExists('процесс установки софта')
	$hTempSize = DirGetSize('путь к папке куда ставим софт')
	GUICtrlSetData($hProgress, Round(100*($hTempSize/$hSizeSoft), 0)) ; если есть дополнительный прогресс или выбрана только одна программа
;~ 	GUICtrlSetData($hProgress, Round(33*($hTempSize/$hSizeSoft), 0)) ; для установки первой из трех программ
;~ 	GUICtrlSetData($hProgress, GUICtrlRead($hProgress) + Round(33*($hTempSize/$hSizeSoft), 0)) ; для установки второй и третьей из трех программ
	Sleep(1000)
WEnd

Но кроме непосредственного копирования файлов инсталлер делает еще много чего(заносит данные в реестр, регистрирует расширения файлов, создает папки в Пуске и т.п.) и это отследить гораздо сложнее ;), так что плюнь и оставь все как есть - ведь работает!
 
Автор
H

HaeMHuK

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

Redline

AutoIT Гуру
Сообщения
506
Репутация
369
HaeMHuK
Все разом чекбоксы прочитать нельзя, так что только так:
Код:
If GUICtrlRead($h_1) = $GUI_UNCHECKED And GUICtrlRead($h_2) =  $GUI_UNCHECKED And GUICtrlRead($h_3) = $GUI_UNCHECKED Then
              MsgBox(0, 'Error', 'Ни одного пункта не выбрано!')


HaeMHuK [?]
И как сделать, чтобы окно не уходило на второй план, когда заканчивается установка?
Можно сделать чтобы окно было всегда поверх всех окон:
Код:
#include <GUIConstants.au3>
#include <WindowsConstants.au3>
$hGUI = GUICreate('1', 100, 100, 100, 100, -1, $WS_EX_TOPMOST)

или после окончания установки сделать так:
Код:
WinSetState($hGUI, '', @SW_RESTORE)
 
Автор
H

HaeMHuK

Новичок
Сообщения
43
Репутация
0
Все равно уходит на второй план после установки ((
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 320
HaeMHuK
Попробуйте в конце установки добавить
Код:
WinActivate($hGUI)
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
369
HaeMHuK
или так:
Код:
WinSetOnTop($hGUI, '', 1)
 
Верх