Что нового

Подсчет значений, устанавливаемых в ProgressBar при копировании файлов

k790

Новичок
Сообщения
239
Репутация
1
Как правильно настроить прогресс бар:
1. Если копирую сразу 3-ий файл, то уже 30%, а хотелось бы поменьше, если учесть, что может быть больше 10 файлов, то есть не тупо прибавление по заданным процентам, а вычислением, по выбранным файлам.(по объёму думаю очень сложно будет сделать)
2. Хотелось бы сделать, чтобы после завершения прогресс был снова равен 0(после завершения копирования будет msgbox , а после нажатия ОК, прогресс бар должен быть равен 0)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
Re: [Элементы GUI] Прогресс бар

Предупреждение За нарушение правил форума (пункт Б.5):
Имя темы должно нести смысловую нагрузку (отражать суть вопроса/проблемы)
Правильно сформулированное название темы привлекает больше внимания, и шансы получить конкретный ответ увеличиваются.


Как правильно называть темы

"Прогресс бар" - это неприемлемое название темы, переименуйте тему иначе она будет закрыта, а вам возможно будет выдан бан на несколько дней.

С уважением, Модератор форума.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
Уже лучше.

:smile:
 
Автор
K

k790

Новичок
Сообщения
239
Репутация
1
Yashied сказал(а):
Я только учусь!
book.gif
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
k790 сказал(а):
...по объёму думаю очень сложно будет сделать...

Почему же? Сначала подсчитываешь суммарный размер всех файлов, которые предстоит копировать. Затем вычисляешь соответствующий процент скопированных данных.

Код:
$Percentage = $CurrentSize / $TotalSize * 100


$CurrentSize будет увеличиваться по мере копирования файлов, пока не дойдет до $TotalSize.
 
Автор
K

k790

Новичок
Сообщения
239
Репутация
1
Yashied
А по-подробнее, я ещё очень плохо знаю этот язык.
Что делает каждое слово из этой строчки и примерно как это закинуть в скрипт?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
k790 сказал(а):
Что делает каждое слово из этой строчки и примерно как это закинуть в скрипт?

Все три слова в этой строчке, это просто переменные, и они ничего не делают. Это просто математика.

% = Текущее значение / Максимальное значение * 100

Для более продуктивного разговора покажи свой скрипт или набросок. OK?
 
Автор
K

k790

Новичок
Сообщения
239
Репутация
1
Код:
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_icon=..\..\..\Мои документы\интернет\Icon_228.ico
#AutoIt3Wrapper_Res_Language=1049
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <ProgressConstants.au3>
#include <WindowsConstants.au3>

#Region ### START Koda GUI section ### Form=C:\Documents and Settings\Admin\Рабочий стол\AutoIt\opera_ac_backup\backup_opera_AC_0.4.kxf


Global $Opera_Dir = FileSelectFolder("Укажите путь к папке оперы ас", "")
Global $Backup_Dir = $Opera_Dir & "\Op_Backup"
;$initial_dir = 


$backup_opera_AC = GUICreate("backup_opera_AC", 546, 366, 212, 90)
GUISetIcon($Opera_Dir & "\OperaAC.exe")
GUISetCursor(2)
$Checkbox1 = GUICtrlCreateCheckbox("Почта", 40, 40, 81, 25)
$Checkbox2 = GUICtrlCreateCheckbox("Сессии", 40, 70, 81, 25)
$Checkbox3 = GUICtrlCreateCheckbox("Контакты", 40, 100, 81, 25)
$Checkbox4 = GUICtrlCreateCheckbox("Пароли", 40, 130, 81, 25)
$Checkbox5 = GUICtrlCreateCheckbox("Список загрузок", 40, 160, 121, 25)
$Checkbox6 = GUICtrlCreateCheckbox("Глобальная история", 40, 190, 129, 25)
$Checkbox7 = GUICtrlCreateCheckbox("Набранные адреса в адресной строчке", 40, 220, 241, 25)
$Checkbox8 = GUICtrlCreateCheckbox("Поиск", 40, 250, 73, 25)
$Progress1 = GUICtrlCreateProgress(32, 304, 329, 40)
GUICtrlSetColor(-1, 0x008000)
$Button1 = GUICtrlCreateButton("backup", 384, 304, 139, 40, $WS_GROUP)
$Label1 = GUICtrlCreateLabel($Opera_Dir, 40, 20, 492, 17)

GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
    
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Button1
            DirCreate($Backup_Dir)
            
            If GUICtrlRead($Checkbox1) = $GUI_CHECKED Then
                GUICtrlSetData($Progress1, 10)
                DirCopy($Opera_Dir & "\profile\mail", $Backup_Dir & "\mail")
            EndIf
            
            If GUICtrlRead($Checkbox2) = $GUI_CHECKED Then
                GUICtrlSetData($Progress1, 20)
                DirCopy($Opera_Dir & "\profile\sessions", $Backup_Dir & "\sessions")
			 EndIf
			             If GUICtrlRead($Checkbox4) = $GUI_CHECKED Then
                GUICtrlSetData($Progress1, 30)
                DirCopy($Opera_Dir & "\profile\wand.dat", $Backup_Dir & "\mail")
            EndIf
            
            ;и т.д.
    EndSwitch
WEnd
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,659
Репутация
2,457
k790
Какой смысл всё это подсчитывать? Ну так не выбрал пользователь несколько птичек, прогресс автоматом перейдёт к тому пункту который выполняется, с точки зрения пользователя это почти не заметно.

Но если сильно нужно, тогда вот:

Код:
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_icon=..\..\..\Мои документы\интернет\Icon_228.ico
#AutoIt3Wrapper_Res_Language=1049
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <ProgressConstants.au3>
#include <WindowsConstants.au3>

#Region ### START Koda GUI section ### Form=C:\Documents and Settings\Admin\Рабочий стол\AutoIt\opera_ac_backup\backup_opera_AC_0.4.kxf


Global $Opera_Dir = FileSelectFolder("Укажите путь к папке оперы ас", "")
Global $Backup_Dir = $Opera_Dir & "\Op_Backup"
;$initial_dir = 


$hMain_GUI = GUICreate("backup_opera_AC", 546, 366, 212, 90)
GUISetIcon($Opera_Dir & "\OperaAC.exe")
GUISetCursor(2)

$First_Checkbox = GUICtrlCreateDummy() + 1 ;Метка первого пункта
$Checkbox1 = GUICtrlCreateCheckbox("Почта", 40, 40, 81, 25)
$Checkbox2 = GUICtrlCreateCheckbox("Сессии", 40, 70, 81, 25)
$Checkbox3 = GUICtrlCreateCheckbox("Контакты", 40, 100, 81, 25)
$Checkbox4 = GUICtrlCreateCheckbox("Пароли", 40, 130, 81, 25)
$Checkbox5 = GUICtrlCreateCheckbox("Список загрузок", 40, 160, 121, 25)
$Checkbox6 = GUICtrlCreateCheckbox("Глобальная история", 40, 190, 129, 25)
$Checkbox7 = GUICtrlCreateCheckbox("Набранные адреса в адресной строчке", 40, 220, 241, 25)
$Checkbox8 = GUICtrlCreateCheckbox("Поиск", 40, 250, 73, 25)
$Last_Checkbox = GUICtrlCreateDummy() - 1 ;Метка последнего пункта (для определения количества пунктов)

$Progress1 = GUICtrlCreateProgress(32, 304, 329, 40)
GUICtrlSetColor(-1, 0x008000)
$Button1 = GUICtrlCreateButton("backup", 384, 304, 139, 40, $WS_GROUP)
$Label1 = GUICtrlCreateLabel($Opera_Dir, 40, 20, 492, 17)

GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
    
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Button1
            DirCreate($Backup_Dir)
            
            $iProgress = 10 ;Задаём начальный прогресс
            $iPrgrs_Step = 100 / (($Last_Checkbox - $First_Checkbox) + 1) ;Вычисляем степень прогресса (100 делим на общее число птичек)
            
            If GUICtrlRead($Checkbox1) = $GUI_CHECKED Then
                GUICtrlSetData($Progress1, $iProgress) ;Задаём прогресс
                $iProgress += $iPrgrs_Step ;Прибавляем к прогрессу вычесленную степень прогресса
                
				Sleep(3000) ;Пауза для отладки, вместо копирования
                ;DirCopy($Opera_Dir & "\profile\mail", $Backup_Dir & "\mail")
            EndIf
            
            If GUICtrlRead($Checkbox2) = $GUI_CHECKED Then
                GUICtrlSetData($Progress1, $iProgress) ;Тут уже используется уровень прогресса в зависимости от предыдущего пункта (если тут отмечен, прогресс увеличился)
                $iProgress += $iPrgrs_Step ;Прибавляем к прогрессу вычесленную степень прогресса
                
				Sleep(3000) ;Пауза для отладки, вместо копирования
                ;DirCopy($Opera_Dir & "\profile\sessions", $Backup_Dir & "\sessions")
            EndIf
            
            If GUICtrlRead($Checkbox3) = $GUI_CHECKED Then
                GUICtrlSetData($Progress1, $iProgress) ;Тут уже используется уровень прогресса в зависимости от предыдущего пункта (если тут отмечен, прогресс увеличился)
                $iProgress += $iPrgrs_Step ;Прибавляем к прогрессу вычесленную степень прогресса
                
				Sleep(3000) ;Пауза для отладки, вместо копирования
                ;DirCopy($Opera_Dir & "\profile\", $Backup_Dir & "\")
            EndIf
            
            ;и т.д.
            
            GUICtrlSetData($Progress1, 100) ;Задаём прогресс на 100, в знак завершения резервирования
            MsgBox(64, 'Title', 'Done.', 0, $hMain_GUI) ;Выводим сообщение
            GUICtrlSetData($Progress1, 0) ;Задаём прогресс на 0, как заказывал :)
    EndSwitch
WEnd
 
Автор
K

k790

Новичок
Сообщения
239
Репутация
1
CreatoR
Это важно!
Мне не нравится, когда 1 полоска в одном случае бежит через 5 сек, а другая через 5 минут, а тут всё чётко.
Вот например у меня почта много весит и она дольше всех будет копироваться. в будущем думаю сделать ещё и бегущую строку
Объясни что ты добавил, как этим пользоваться, ну вообщем всё что можещь написать по добавленному. А то я так ни чему не научусь :(, хотелось бы научиться, понять и знать, а потом помогать новичкам типа себя но это в далёком будущем, мечты :whistle: :whistle: :whistle:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,659
Репутация
2,457
k790 [?]
Объясни что ты добавил, как этим пользоваться, ну вообщем всё что можещь написать по добавленному.
Добавил комментарий.
А вообще тебе нужно изучать справку, открывай раздел для каждой функций которую не понимаешь (F1 при установленном курсоре на функций в SciTE).
 
Автор
K

k790

Новичок
Сообщения
239
Репутация
1
CreatoR [?]
Посмотрел твой код(экспериментально) и не понравился, прогресс зависит от птички, а мне надо, чтоб зависел от объёма.
Буду пытаться понимать сообщение, madmasles [?]
 

Guezt

Продвинутый
Сообщения
335
Репутация
81
k790
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>

Global $i,$file,$SizeFiles,$Dir
Opt("GUIOnEventMode", 1)
GUICreate('Копировать...',400,70,-1,-1)
$Progress = GUICtrlCreateProgress(10,10,380,20)
$b= GUICtrlCreateButton('Что?',10,35,100,20)
GUICtrlSetOnEvent(-1,"_open")
$b2=GUICtrlCreateButton('Куда?',120,35,100,20)
GUICtrlSetOnEvent(-1,'_selectDir')
$b3=GUICtrlCreateButton('Копировать',290,35,100,20)
GUICtrlSetOnEvent(-1,"_copy")
GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
GUISetState(@SW_SHOW)


Func _copy()
	$data = 0
	if $file[0] > 1 And $file[0] <> 0 Then
	For $i=2 to $file[0]
	FileCopy($file[1]&'\'&$file[$i],$Dir)
	$data = $data + FileGetSize($file[1]&'\'&$file[$i])/$SizeFiles*100
	GUICtrlSetData($Progress,String($data))
Next
	GUICtrlSetData($Progress,'')
ElseIf $file[0] = 1 Then
	FileCopy($file[1],$Dir)
	EndIf
	MsgBox(0,'','скопировали')
EndFunc

Func _open()
	$file = FileOpenDialog("Выбрать файлы",@ScriptDir,'(*.*)',4)
	$file = StringSplit($file,'|')
	if $file[0] > 1 And $file[0] <> 0 Then
	$SizeFiles=0
	For $i=2 to $file[0]
	$SizeFiles = $SizeFiles + FileGetSize($file[1]&'\'&$file[$i])
Next
ElseIf $file[0] = 1 Then
	$SizeFiles = FileGetSize($file[1])
	EndIf
	MsgBox(0,'',Round($SizeFiles))
EndFunc


Func _selectDir()
	$Dir = FileSelectFolder("куда",@ScriptDir,2)
	MsgBox(0,'',$Dir)
EndFunc


Func _Exit()
	Exit
EndFunc

While 1
	Sleep(10)
WEnd
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,659
Репутация
2,457
k790 [?]
прогресс зависит от птички, а мне надо, чтоб зависел от объёма.
Какого объёма? Ты будешь подсчитывать все файлы которые нужно копировать?
Тебе в любом случае нужно будет полагаться на отмеченных птичках, иначе прогресс не будет отражать реальность.

Мой тебе совет, начинай с простого, не пытайся всё усложнять, иначе потом будешь мучаться.
 
Автор
K

k790

Новичок
Сообщения
239
Репутация
1
CreatoR сказал(а):
Какого объёма? Ты будешь подсчитывать все файлы которые нужно копировать?
Я хочу чтобы прогресс бар был точным, то есть запустил на копирование и смотришь, сколько осталось по полоске, а в моём случае несколько минут копировалась почта, а потом меньше минуты всё остальное, а это то что мне НИКОГДА не нравилось во многих инстоляторах, а ты мне предлагаешь, чтобы то что мне не нравится я сделал в "своей" программе?

Тебе в любом случае нужно будет полагаться на отмеченных птичках, иначе прогресс не будет отражать реальность.
Это почему? Если получить объём по отмеченным чекбоксам, а потом математически посчитать, то всё должно быть правильно.

Мой тебе совет, начинай с простого, не пытайся всё усложнять, иначе потом будешь мучаться.
Я начинал с простого-VBScript, а вот теперь решил делать более правильно с помощью AutoIt, как раз потому, что мне не хватало многих ф-ий.
Я не усложняю - я улучшаю
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,659
Репутация
2,457
k790 [?]
ты мне предлагаешь, чтобы то что мне не нравится я сделал в "своей" программе?
Нужно сначала научиться писать программы ;)

Если получить объём по отмеченным чекбоксам, а потом математически посчитать, то всё должно быть правильно.
Ещё раз спрашиваю, что подсчитать? Ты хочешь определить по размеру файлов, по их количеству?
 
Автор
K

k790

Новичок
Сообщения
239
Репутация
1
CreatoR [?]
Нужно сначала научиться писать программы ;)
Согласен ;)
Ещё раз спрашиваю, что подсчитать? Ты хочешь определить по размеру файлов, по их количеству?
Я хочу подсчитать объём всех копируемых файлов и папок, а потом высчитать проценты для прогресс бара.
Вроде бы нашёл как узнать объём.
Если, что то код изменился:
Код:
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_icon=..\..\..\Мои документы\Web\_Images\AutoIt Black Avatar.ico
#AutoIt3Wrapper_Res_Language=1049
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <ProgressConstants.au3>
#include <WindowsConstants.au3>

#Region ### START Koda GUI section ### Form=C:\Documents and Settings\Admin\Рабочий стол\AutoIt\opera_ac_backup\backup_opera_AC_0.4.kxf


Global $Opera_Dir = FileSelectFolder("Укажите путь к папке оперы ас", "")
Global $Backup_Dir = $Opera_Dir & "\Op_Backup"
;$initial_dir = 


$hMain_GUI = GUICreate("backup_opera_AC", 546, 366, 212, 90)
GUISetIcon($Opera_Dir & "\OperaAC.exe")
GUISetCursor(2)

$First_Checkbox = GUICtrlCreateDummy() + 1 ;Метка первого пункта
$Checkbox1 = GUICtrlCreateCheckbox("Почта", 40, 40, 81, 25)
$Checkbox2 = GUICtrlCreateCheckbox("Сессии", 40, 70, 81, 25)
$Checkbox3 = GUICtrlCreateCheckbox("Контакты", 40, 100, 81, 25)
$Checkbox4 = GUICtrlCreateCheckbox("Пароли", 40, 130, 81, 25)
$Checkbox5 = GUICtrlCreateCheckbox("Список загрузок", 40, 160, 121, 25)
$Checkbox6 = GUICtrlCreateCheckbox("Глобальная история", 40, 190, 129, 25)
$Checkbox7 = GUICtrlCreateCheckbox("Набранные адреса в адресной строчке", 40, 220, 241, 25)
$Checkbox8 = GUICtrlCreateCheckbox("Поиск", 40, 250, 73, 25)
$Last_Checkbox = GUICtrlCreateDummy() - 1 ;Метка последнего пункта (для определения количества пунктов)

$Progress1 = GUICtrlCreateProgress(32, 304, 329, 16)
GUICtrlSetColor(-1, 0x008000)
$Button1 = GUICtrlCreateButton("backup", 384, 304, 139, 21, $WS_GROUP)
$Label1 = GUICtrlCreateLabel($Opera_Dir, 40, 20, 492, 17)
$size1 = DirGetSize($Opera_Dir & "\profile\mail")
$size2 = DirGetSize($Opera_Dir & "\profile\sessions")
$size3 = FileGetSize($Opera_Dir & "\profile\contacts.adr")
$size4 = FileGetSize($Opera_Dir & "\profile\wand.dat")
$size5 = FileGetSize($Opera_Dir & "\profile\download.dat")
$size6 = FileGetSize($Opera_Dir & "\profile\mail\global_history.dat")
$size7 = FileGetSize($Opera_Dir & "\profile\mail\typed_history.xml")
$size8 = FileGetSize($Opera_Dir & "\defaults\search.ini")
;$size_percent=
GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
    
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Button1
            DirCreate($Backup_Dir)
            
            $iProgress = 10 ;Задаём начальный прогресс
            $iPrgrs_Step = 100 / (($Last_Checkbox - $First_Checkbox) + 1) ;Вычисляем степень прогресса (100 делим на общее число птичек)
            
            If GUICtrlRead($Checkbox1) = $GUI_CHECKED Then
                GUICtrlSetData($Progress1, $iProgress) ;Задаём прогресс
                $iProgress += $iPrgrs_Step ;Прибавляем к прогрессу вычесленную степень прогресса
                
                Sleep(3000) ;Пауза для отладки, вместо копирования
                DirCopy($Opera_Dir & "\profile\mail", $Backup_Dir & "\profile\mail")
            EndIf
            ;почта
            
            If GUICtrlRead($Checkbox2) = $GUI_CHECKED Then
                GUICtrlSetData($Progress1, $iProgress) ;Тут уже используется уровень прогресса в зависимости от предыдущего пункта (если тут отмечен, прогресс увеличился)
                $iProgress += $iPrgrs_Step ;Прибавляем к прогрессу вычесленную степень прогресса
                
                Sleep(3000) ;Пауза для отладки, вместо копирования
                DirCopy($Opera_Dir & "\profile\sessions", $Backup_Dir & "\profile\sessions")
            EndIf
            ;сессии
            
            If GUICtrlRead($Checkbox3) = $GUI_CHECKED Then
                GUICtrlSetData($Progress1, $iProgress) ;Тут уже используется уровень прогресса в зависимости от предыдущего пункта (если тут отмечен, прогресс увеличился)
                $iProgress += $iPrgrs_Step ;Прибавляем к прогрессу вычесленную степень прогресса
                
                Sleep(3000) ;Пауза для отладки, вместо копирования
                FileCopy($Opera_Dir & "\profile\contacts.adr", $Backup_Dir & "\profile\")
            EndIf
            ;контакты
            
            If GUICtrlRead($Checkbox4) = $GUI_CHECKED Then
                GUICtrlSetData($Progress1, $iProgress)
                $iProgress += $iPrgrs_Step
                Sleep(3000)
                FileCopy($Opera_Dir & "\profile\wand.dat", $Backup_Dir & "\profile\")
            EndIf
            ;пароли
            
            If GUICtrlRead($Checkbox5) = $GUI_CHECKED Then
                GUICtrlSetData($Progress1, $iProgress)
                $iProgress += $iPrgrs_Step
                Sleep(3000)
                FileCopy($Opera_Dir & "\profile\download.dat", $Backup_Dir & "\profile\")
            EndIf
            ;список загрузок
            
            If GUICtrlRead($Checkbox6) = $GUI_CHECKED Then
                GUICtrlSetData($Progress1, $iProgress)
                $iProgress += $iPrgrs_Step
                Sleep(3000)
                FileCopy($Opera_Dir & "\profile\global_history.dat", $Backup_Dir & "\profile\")
            EndIf
            ;глобальная история
            
            If GUICtrlRead($Checkbox7) = $GUI_CHECKED Then
                GUICtrlSetData($Progress1, $iProgress)
                $iProgress += $iPrgrs_Step
                Sleep(3000)
                FileCopy($Opera_Dir & "\profile\typed_history.xml", $Backup_Dir & "\profile\")
            EndIf
            ;Набранные адреса в адресной строчке
            
            If GUICtrlRead($Checkbox8) = $GUI_CHECKED Then
                GUICtrlSetData($Progress1, $iProgress)
                $iProgress += $iPrgrs_Step
                Sleep(3000)
                FileCopy($Opera_Dir & "\defaults\search.ini", $Backup_Dir & "\profile\")
            EndIf
            ;поиск
        
            ;и т.д.
            
            GUICtrlSetData($Progress1, 100) ;Задаём прогресс на 100, в знак завершения резервирования
            MsgBox(64, 'Title', 'Копирование успешно завершено.', 0, $hMain_GUI) ;Выводим сообщение
            GUICtrlSetData($Progress1, 0) ;Задаём прогресс на 0, как заказывал :)
    EndSwitch
WEnd

И как подсчитать
Код:
$size_percent=
-объём выбранных файлов/папок?
 

Guezt

Продвинутый
Сообщения
335
Репутация
81
k790
мой пример смотри там по размеру и разбирай
 
Автор
K

k790

Новичок
Сообщения
239
Репутация
1
Guezt Gutsy
А чему равны:
Код:
$i,$file,$SizeFiles,$Dir
 
Верх