Что нового

Как период времени разделить на n равных промежутков и ...

StarEdik

Новичок
Сообщения
365
Репутация
4
Версия AutoIt: 3.3.6.1

Описание:
Привет всем. Надо период времени разделит на n равных промежутков
Имеется на форме 2 Listbox-a. В 1-ом периоды времени, а во 2-ом пусто. Файл 1.txt загружаем по строчно в Listbox1.При выделении строк в Listbox1 скрипт должен ;
- показать выделенный текст из Listbox1 на Label1
- выделенный период разделить на n (5 равных) равных промежутков и построчно занести их в Listbox2
- выделить 1-ю строку в Listbox2 и каждые 2 секунды переходить на следующую строку до последнего
- показать выделенный текст из Listbox2 на Label2
Например
Выделенный период времени в Listbox1
01.12.2011 03:43 - 01.12.2011 15:41
Этот период 11часов 58 минут по 2 час 23 мин (при делении на 5 )
Результат занесенный в Listbox2
01.12.2011 03:43
01.12.2011 06:06
01.12.2011 08:30
01.12.2011 10:53
01.12.2011 13:17
01.12.2011 15:41
Пример формы
Код:
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
#include <GUIListBox.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

$Form1 = GUICreate("", 320, 398)
$Label1 = GUICtrlCreateLabel("00.00.0000  00:00 - 00.00.0000  00:00", 6, 8, 194, 17, -1, $WS_EX_STATICEDGE)
$Label2 = GUICtrlCreateLabel("00.00.0000  00:00", 209, 8, 103, 17, -1, $WS_EX_STATICEDGE)
$List1 = GUICtrlCreateList("", 207, 29, 107, 136)
$List2 = GUICtrlCreateList("", 4, 31, 197, 331)
$Button1 = GUICtrlCreateButton("Start", 210, 175, 103, 25)
$Button2 = GUICtrlCreateButton("Stop", 210, 206, 103, 25)
$Button3 = GUICtrlCreateButton("Save", 210, 238, 103, 25)
$Checkbox1 = GUICtrlCreateCheckbox("Avto", 210, 269, 46, 17)
$Combo1 = GUICtrlCreateCombo("2", 251, 290, 40, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
$Label3 = GUICtrlCreateLabel("сек", 294, 295, 22, 17)
$Button4 = GUICtrlCreateButton("Open", 7, 367, 56, 23)
$Button5 = GUICtrlCreateButton("Delete", 74, 367, 56, 23)
$Button6 = GUICtrlCreateButton("Save", 140, 368, 59, 23)
$Button7 = GUICtrlCreateButton("Exit", 211, 367, 102, 25)
$Combo2 = GUICtrlCreateCombo("5", 265, 316, 40, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
$Label5 = GUICtrlCreateLabel("Пауза", 208, 296, 35, 17)
$Label6 = GUICtrlCreateLabel("Делитель", 208, 320, 54, 17)
$Checkbox2 = GUICtrlCreateCheckbox("Повтор", 212, 342, 60, 17)
GUISetState(@SW_SHOW)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE, $Button7
			Exit

	EndSwitch
WEnd

Примечания:
При выделении чекбокса "Avto" цикл не заканчивается а переходить на следующую строку в Listbox1 и.т.д до последнего.
Файл 1.txt для тестирования во вложен
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
Люди добрые и благародные,помогите,а ... :-[ :stars: :beer: :IL_AutoIt_1: :-[
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Re: Как период времени разделить на n равных промежутков

StarEdik [?]
Люди добрые и благародные,помогите
Терпение только терпение. :smile:
Поможем ;)
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
Re: Как период времени разделить на n равных промежутков

Garrett
Спасибо за слова которые не оценимы :-[ :beer:
 

asdf8

Скриптер
Сообщения
564
Репутация
152
Re: Как период времени разделить на n равных промежутков

OffTopic:

StarEdik
Разделить время на промежутки не сложно, но запросы выходят за рамки названия темы:

StarEdik [?]
- показать выделенный текст из Listbox1 на Label1
...
- выделить 1-ю строку в Listbox2 и каждые 2 секунды переходить на следующую строку до последнего- показать выделенный текст из Listbox2 на Label2
...
При выделении чекбокса "Avto" цикл не заканчивается а переходить на следующую строку в Listbox1 и.т.д до последнего.

Так, что, полюбому придется ждать, пока не найдется кто-то, кому интересно будет это сделать.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Re: Как период времени разделить на n равных промежутков

StarEdik [?]
Надо период времени разделит на n равных промежутков
Попробуйте разделить так.
Код:
#include <Date.au3>
#include <Array.au3>

$sPeriod = '01.12.2011 03:43 - 01.12.2011 15:41'
$aPeriod = _Div_Period($sPeriod, 5)
If @error Then Exit -55
_ArrayDisplay($aPeriod, '$i_Flag = 0')

$aPeriod = _Div_Period($sPeriod, 5, 1)
If @error Then Exit -55
_ArrayDisplay($aPeriod, '$i_Flag <> 0')

Func _Div_Period($s_Period, $i_Part, $i_Flag = 0)
	Local $a_Temp, $i_Sec
	$a_Temp = StringSplit($s_Period, '-')
	If $a_Temp[0] <> 2 Then Return SetError(1, 0, '')
	For $i = 1 To $a_Temp[0]
		$a_Temp[$i] = _ConvertDate($a_Temp[$i], 0)
		If @error Then Return SetError(1, 0, '')
	Next
	$i_Sec = _DateDiff('s', $a_Temp[1], $a_Temp[2])
	If @error Then Return SetError(1, 0, '')
	$i_Part = Abs(Int($i_Part))
	If Not $i_Part Then Return SetError(1, 0, '')
	Local $a_Return[$i_Part + 1]
	$i_Sec = Round($i_Sec / $i_Part)
	$a_Return[0] = $a_Temp[1]
	$a_Return[$i_Part] = $a_Temp[2]
	For $i = 1 To $i_Part - 1
		$a_Return[$i] = _DateAdd('s', $i_Sec, $a_Return[$i - 1])
		If @error Then Return SetError(1, 0, '')
	Next
	For $i = 0 To $i_Part
		If $i_Flag Then __RoundDateToMin($a_Return[$i])
		$a_Return[$i] = _ConvertDate($a_Return[$i], 1)
		If @error Then Return SetError(1, 0, '')
	Next
	Return $a_Return
EndFunc   ;==>_Div_Period

;$i_Flag = 0 dd.mm.yyyy hh:min --> yyyy/mm/dd  hh:min:ss
;$i_Flag <> 0 yyyy/mm/dd  hh:min:ss --> dd.mm.yyyy hh:min:ss
Func _ConvertDate($s_Date, $i_Flag)
	Local $s_ConvertDate
	$s_Date = StringStripWS($s_Date, 7)
	If $i_Flag Then
		$s_ConvertDate = StringRegExpReplace($s_Date, '^(\d{4})/(\d{2})/(\d{2})(.*)$', '$3.$2.$1$4')
	Else
		$s_ConvertDate = StringRegExpReplace($s_Date, '^(\d{2})\.(\d{2})\.(\d{4})(.*)$', '$3/$2/$1$4:00')
	EndIf
	If @extended <> 4 Then Return SetError(1, 0, $s_Date)
	Return $s_ConvertDate
EndFunc   ;==>_ConvertDate

Func __RoundDateToMin(ByRef $s_Date)
	Local $s_Sec
	$s_Sec = StringRight($s_Date, 2)
	If $s_Sec < 30 Then
		$s_Date = StringTrimRight($s_Date, 3)
	Else
		$s_Date = _DateAdd('n', 1, StringTrimRight($s_Date, 3))
	EndIf
EndFunc   ;==>__RoundDateToMin

Имеется на форме 2 Listbox-a
Справка ==> User Defined Function Reference ==> GuiListBox Management. Там все есть.
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
madmasles
Спасибо вам.Вы мне очень помогли. :-[ :smile:
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Re: Как период времени разделить на n равных промежутков

Ну, как-то так. :smile:
Конечно, нужно ещё "напильником" доработать, но это уже под конкретные задачи.

Код:
; [topic,10438]

#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
#include <GUIListBox.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Array.au3>
#include <Misc.au3>
#include <Date.au3>

Global $iStep = 5 ; шаг
Global $iCurSel = 0 ; в процессе выполнения содержит индекс выделенной строки в $List2

$Form1 = GUICreate("", 320, 398)
$Label1 = GUICtrlCreateLabel("00.00.0000  00:00 - 00.00.0000  00:00", 6, 8, 194, 17, -1, $WS_EX_STATICEDGE)
$Label2 = GUICtrlCreateLabel("00.00.0000  00:00", 209, 8, 103, 17, -1, $WS_EX_STATICEDGE)
$List1 = GUICtrlCreateList("", 4, 31, 197, 331, BitOR($LBS_STANDARD, $WS_VSCROLL, $LBS_EXTENDEDSEL))
$List2 = GUICtrlCreateList("", 207, 29, 107, 136, BitOR($LBS_STANDARD, $WS_VSCROLL, $LBS_EXTENDEDSEL))
$Button1 = GUICtrlCreateButton("Start", 210, 175, 103, 25)
$Button2 = GUICtrlCreateButton("Stop", 210, 206, 103, 25)
$Button3 = GUICtrlCreateButton("Save", 210, 238, 103, 25)
$Checkbox1 = GUICtrlCreateCheckbox("Avto", 210, 269, 46, 17)
$Combo1 = GUICtrlCreateCombo("2", 251, 290, 40, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
$Label3 = GUICtrlCreateLabel("сек", 294, 295, 22, 17)
$Button4 = GUICtrlCreateButton("Open", 7, 367, 56, 23)
$Button5 = GUICtrlCreateButton("Delete", 74, 367, 56, 23)
$Button6 = GUICtrlCreateButton("Save", 140, 368, 59, 23)
$Button7 = GUICtrlCreateButton("Exit", 211, 367, 102, 25)
$Combo2 = GUICtrlCreateCombo("5", 265, 316, 40, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
$Label5 = GUICtrlCreateLabel("Пауза", 208, 296, 35, 17)
$Label6 = GUICtrlCreateLabel("Делитель", 208, 320, 54, 17)
$Checkbox2 = GUICtrlCreateCheckbox("Повтор", 212, 342, 60, 17)
GUISetState(@SW_SHOW)

$aTime = _FileParse(@ScriptDir & '\1.txt')
; показать выделенный текст из Listbox2 на Label2
GUICtrlSetData($Label1, _GUICtrlListBox_GetText($List1, 0))

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
		Case $GUI_EVENT_CLOSE, $Button7
			AdlibUnRegister('_Time')
            Exit
		Case $List2
			; показать выделенный текст из Listbox2 на Label2
			GUICtrlSetData($Label2, _GUICtrlListBox_GetText($List2, _GUICtrlListBox_GetCurSel($List2)))
		Case $List1
			Global $iIndex = 0
			; каждые  2 секунды переходить на следующую строку
			AdlibRegister('_Time', 2000)
			; показать выделенный текст из Listbox1 на Label1
			GUICtrlSetData($Label1, _GUICtrlListBox_GetText($List1, _GUICtrlListBox_GetCurSel($List1)))
			_SetPeriod(_GUICtrlListBox_GetText($List1, _GUICtrlListBox_GetCurSel($List1)))
    EndSwitch
WEnd

Func _FileParse($s_Path)
	
	Local $i = 0, $h_File, $s_Line
	
	$h_File = FileOpen($s_Path, 0)
	If $h_File = -1 Then
		Return SetError(1, 0, 0)
	EndIf
	_GUICtrlListBox_BeginUpdate($List1)
	While 1
		$s_Line = FileReadLine($h_File)
		If @error = -1 Then ExitLoop
			_GUICtrlListBox_AddString($List1, $s_Line)
		$i += 1
	WEnd

	If Not $i Then 
		Return SetError(2, 0, 0)
	EndIf
	
	FileClose($h_File)
	
	_GUICtrlListBox_EndUpdate($List1)
	_GUICtrlListBox_SetSel($List1, 0, 1)	
	
	Return SetError(0, 0, _GUICtrlListBox_GetCurSel($List1))
EndFunc ;==>_FileParse

Func _SetPeriod($s_Text)
	
	; выделенный период разделить на $n  (5 равных)  равных промежутков и построчно занести их  в Listbox2
	Local $a_Period = StringRegExp(StringRegExpReplace($s_Text, '(\d+)\.(\d+)\.(\d+)\s(\d+):(\d+)', '$3/$2/$1 $4:$5:00'), '(.*)\s-\s(.*)', 3)
	Local $i_St = _DateDiff( 's', "1970/01/01 00:00:00", $a_Period[0])
	Local $i_Ed = _DateDiff( 's', "1970/01/01 00:00:00", $a_Period[1])
	Local $i_Period = ($i_Ed - $i_St) / ($iStep -1)
	Local $i_New = $i_St
	_GUICtrlListBox_ResetContent($List2)
	_GUICtrlListBox_BeginUpdate($List2)
	While $a_Period[1] <> $i_St
		$i_St = _DateAdd("s", Int($i_New), "1970/01/01 00:00:00")
		_GUICtrlListBox_AddString($List2, StringTrimRight($i_St, 3))
		$i_New = _DateDiff( 's', "1970/01/01 00:00:00", $i_St)
		$i_New = $i_New + $i_Period
	WEnd
	_GUICtrlListBox_EndUpdate($List2)
	GUICtrlSetData($Label2, _GUICtrlListBox_GetText($List2, 0))
	_GUICtrlListBox_SetSel($List2, $iIndex, 1)
	$iCurSel = _GUICtrlListBox_GetCurSel($List2)
EndFunc ;==>_SetPeriod
	
Func _Time()
	
	; выделить 1-ю строку  в Listbox2
	$iIndex += 1
	_GUICtrlListBox_SetSel($List2, $iIndex, 1)
	$iCurSel = _GUICtrlListBox_GetCurSel($List2)
	If $iCurSel <> 0 Then _GUICtrlListBox_SetSel($List2, $iCurSel - 1, 0)
	; показать выделенный текст из Listbox2 на Label2
	GUICtrlSetData($Label2, _GUICtrlListBox_GetText($List2, $iCurSel))
	If $iCurSel = $iStep - 1 Then 
		AdlibUnRegister('_Time')
	EndIf
EndFunc ;==>_Time
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
Garrett
:shok: Весьма признателен за помощь.Даже не знаю как сказать. У меня нет слов. . :ok: :beer:А с "напильником" доработаю.Благодарью - Добрым и Благародным :smile:
 
Верх