Что нового

Добавить и убавить час ( интервалы времени в тексте)

StarEdik

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

Описание:
Привет всем. :smile:
За ранее извиняюсь за причиненный вам неудобства :(и прошу помощи при написание следующего. :-[
В ListView загружен текст с интервалами времени. Надо ( в выделенной строке в ListView )
- при нажатие на кнопку « +1» ( F4 ) добавить 1 час в начало и в конец периода
- при нажатие на кнопку «-1» ( F5) убавить 1 час с начало и с конца периода
- и чтоб фокус в ListView перешёл на следующую строку и выделил его

По идее должно быть так.
Выделяем строку в ListView .Выделенное значение отображается в $Label .
По усмотрению нажимаем на кнопку «+1» ( F4 ) или «-1» ( F5 ).
Пример:
Выделено в ListView строка
22.11.2011 20:10 - 24.11.2011 00:40
Нажимае «+1» или F4
В начало периода добавляется час ( 22.11.2011 20:10 ) +1 =( 22.11.2011 21:10 )
В конец периода добавляется час ( 24.11.2011 00:40 ) +1 = ( 24.11.2011 01:40 )

И так, было в строке 22.11.2011 20:10 - 24.11.2011 00:40
Стало 22.11.2011 21:10 - 24.11.2011 01:40
А фокус перешел на следующую строку и выделил его.
29.11.2011 00:40 - 30.11.2011 04:20
И выделенное отображается в $Label .

Нажимаем «-1» или F5
С начало периода отнимается час ( 29.11.2011 00:40 ) -1 = ( 28.11.2011 23:40 )
С конец периода отнимается час ( 30.11.2011 04:20 ) -1 = ( 30.11.2011 03:20 )

И так, было в строке 29.11.2011 00:40 - 30.11.2011 04:20
Стало 28.11.2011 23:40 - 30.11.2011 03:20
А фокус перешел на следующую строку и выделил его.
06.12.2011 19:30 - 07.12.2011 15:40
И выделенное отображается в $Label .

и.т.д

Примечания:
Вот форма скрипта
Код:
#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>
#include <GuiListView.au3>
Opt("WinTitleMatchMode", 2)
Opt("MouseCoordMode", 2)

HotKeySet('+{ESC}', '_Exit')
HotKeySet('{F4}','_Add')
HotKeySet('{F5}','_Subtract')

$Gui = GUICreate("Плюс час - Минус час", 285, 260)

$nListView = GUICtrlCreateListView('', 2, 2, 280, 200, $LVS_REPORT, $LVS_EX_GRIDLINES)
$hListView = GUICtrlGetHandle($nListView)
_GUICtrlListView_AddColumn($hListView, 'Test 1', 250)

$ListItem1 = _GUICtrlListView_AddItem($hListView, "15.10.2011 16:00 - 15.10.2011 19:10",0)
$ListItem2 = _GUICtrlListView_AddItem($hListView, "18.10.2011 03:20 - 19.10.2011 06:30",2)
$ListItem3 = _GUICtrlListView_AddItem($hListView, "20.10.2011 00:40 - 20.10.2011 15:00",1)
$ListItem4 = _GUICtrlListView_AddItem($hListView, "22.10.2011 17:40 - 22.10.2011 19:40",4)
$ListItem4 = _GUICtrlListView_AddItem($hListView, "24.10.2011 23:25 - 26.10.2011 00:40",5) ;
$ListItem6 = _GUICtrlListView_AddItem($hListView, "28.10.2011 16:50 - 28.10.2011 19:40",6)
$ListItem7 = _GUICtrlListView_AddItem($hListView, "30.10.2011 18:40 - 30.10.2011 21:30",7)
$ListItem8 = _GUICtrlListView_AddItem($hListView, "02.11.2011 02:00 - 02.11.2011 03:10",8) ;
$ListItem9 = _GUICtrlListView_AddItem($hListView, "04.11.2011 08:50 - 04.11.2011 12:10",9)
$ListItem10 = _GUICtrlListView_AddItem($hListView, "05.11.2011 13:10 - 07.11.2011 00:00",10)
$ListItem11 = _GUICtrlListView_AddItem($hListView, "09.11.2011 10:50 - 09.11.2011 12:40",11)
$ListItem12= _GUICtrlListView_AddItem($hListView, "11.11.2011 21:30 - 12.11.2011 01:00",12)

$Label=GUICtrlCreateLabel('',5, 220, 200, 30,0x1000)
$Button_Add = GUICtrlCreateButton("+1 ", 210, 220, 33, 33)
$Button_Subtract = GUICtrlCreateButton("-1 ", 250, 220, 33, 33)

GUISetState()

While 1
         $msg = GUIGetMsg()
  Switch $msg
    Case $GUI_EVENT_CLOSE
        ExitLoop
    Case $Button_Add
		  _Add()
	Case $Button_Subtract
          _Subtract()
  EndSwitch
   ; WinSetOnTop($Gui,"",1)
WEnd

Func _Exit()
    Exit
EndFunc

Func _Add()
; MsgBox(16,"+1","Add",1)

EndFunc

Func _Subtract()
; MsgBox(16,"-1","Subtract",1)

EndFunc
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 320
StarEdik,
Формат даты только такой? (15.10.2011 16:00 - 15.10.2011 19:10) Или, возможно, будут секунды?
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
madmasles
:smile:Только такой
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 320
StarEdik,
Попробуйте так:
Код:
#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>
#include <GuiListView.au3>
#include <Date.au3>

Opt('WinTitleMatchMode', 2)
Opt('MouseCoordMode', 2)

Global $iIndexOld = -10, $iCountItem, $sString, $iDiff

$Gui = GUICreate('Плюс час - Минус час', 285, 260)

$nListView = GUICtrlCreateListView('', 2, 2, 280, 200, BitOR($LVS_REPORT, $LVS_SINGLESEL), $LVS_EX_GRIDLINES)
$hListView = GUICtrlGetHandle($nListView)
_GUICtrlListView_AddColumn($hListView, 'Test 1', 250)

_GUICtrlListView_AddItem($hListView, '15.10.2011 16:00 - 15.10.2011 19:10', 0)
_GUICtrlListView_AddItem($hListView, '18.10.2011 03:20 - 19.10.2011 06:30', 2)
_GUICtrlListView_AddItem($hListView, '20.10.2011 00:40 - 20.10.2011 15:00', 1)
_GUICtrlListView_AddItem($hListView, '22.10.2011 17:40 - 22.10.2011 19:40', 4)
_GUICtrlListView_AddItem($hListView, '24.10.2011 23:25 - 26.10.2011 00:40', 5) ;
_GUICtrlListView_AddItem($hListView, '28.10.2011 16:50 - 28.10.2011 19:40', 6)
_GUICtrlListView_AddItem($hListView, '30.10.2011 18:40 - 30.10.2011 21:30', 7)
_GUICtrlListView_AddItem($hListView, '02.11.2011 02:00 - 02.11.2011 03:10', 8) ;
_GUICtrlListView_AddItem($hListView, '04.11.2011 08:50 - 04.11.2011 12:10', 9)
_GUICtrlListView_AddItem($hListView, '05.11.2011 13:10 - 07.11.2011 00:00', 10)
_GUICtrlListView_AddItem($hListView, '09.11.2011 10:50 - 09.11.2011 12:40', 11)
_GUICtrlListView_AddItem($hListView, '11.11.2011 21:30 - 12.11.2011 01:00', 12)

$nLabel = GUICtrlCreateLabel('', 5, 220, 200, 30, 0x1000)
$nButton_Add = GUICtrlCreateButton('+1 ', 210, 220, 33, 33)
$nButton_Subtract = GUICtrlCreateButton('-1 ', 250, 220, 33, 33)
$nButton_Exit = GUICtrlCreateButton('', 0, 0, 1, 1)
GUICtrlSetState(-1, $GUI_HIDE)
GUISetState()
GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')
GUICtrlSetState($nListView, $GUI_FOCUS)
_GUICtrlListView_SetItemSelected($hListView, 0)
Dim $AccelKeys[3][2] = [['+{ESC}', $nButton_Exit],['{F4}', $nButton_Add],['{F5}', $nButton_Subtract]]
GUISetAccelerators($AccelKeys)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE, $nButton_Exit
			_Exit()
		Case $nButton_Add, $nButton_Subtract
			If $nMsg = $nButton_Add Then
				$iDiff = 1
			Else
				$iDiff = -1
			EndIf
			GUICtrlSetState($nButton_Subtract, $GUI_DISABLE)
			GUICtrlSetState($nButton_Add, $GUI_DISABLE)
			If $iIndexOld >= 0 Then
				$sString = _GUICtrlListView_GetItemText($hListView, $iIndexOld)
				$sString = _Plus_Minus($sString, $iDiff)
				If Not @error Then
					_GUICtrlListView_SetItemText($hListView, $iIndexOld, $sString)
					$iCountItem = _GUICtrlListView_GetItemCount($hListView)
					If $iIndexOld = $iCountItem - 1 Then
						_GUICtrlListView_SetItemSelected($hListView, 0)
					Else
						_GUICtrlListView_SetItemSelected($hListView, $iIndexOld + 1)
					EndIf
				EndIf
			EndIf
			GUICtrlSetState($nListView, $GUI_FOCUS)
			GUICtrlSetState($nButton_Subtract, $GUI_ENABLE)
			GUICtrlSetState($nButton_Add, $GUI_ENABLE)
	EndSwitch
WEnd

Func _Plus_Minus($s_String, $i_Diff, $s_Type = 'h')
	Local $s_Date_Start, $s_Date_End, $s_Date_Start_New, $s_Date_End_New, $s_Delim

	$s_Delim = StringRegExpReplace($s_String, '.*\d{2}:\d{2}(.*?)\d{2}\..*', '$1')
	If @extended <> 1 Then $s_Delim = ' - '
	$s_Date_Start = _Format_Valid($s_String, 0)
	If @error Then Return SetError(1)
	$s_Date_End = _Format_Valid($s_String, 1)
	$s_Date_Start_New = _DateAdd($s_Type, $i_Diff, $s_Date_Start)
	If @error Then Return SetError(1)
	$s_Date_End_New = _DateAdd($s_Type, $i_Diff, $s_Date_End)
	If @error Then Return SetError(1)
	$s_Date_Start = _Format_Back($s_Date_Start_New)
	If @error Then Return SetError(1)
	$s_Date_End = _Format_Back($s_Date_End_New)
	If @error Then Return SetError(1)
	Return $s_Date_Start & $s_Delim & $s_Date_End
EndFunc   ;==>_Plus_Minus

Func _Exit()
	Exit
EndFunc   ;==>_Exit

Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
	Local $tNMHDR, $hWndFrom, $iCode, $tInfo, $iIndexNow
	$tNMHDR = DllStructCreate($tagNMHDR, $lParam)
	$hWndFrom = DllStructGetData($tNMHDR, 'hWndFrom')
	$iCode = DllStructGetData($tNMHDR, 'Code')

	Switch $hWndFrom
		Case $hListView
			Switch $iCode
				Case $LVN_ITEMCHANGING;, $NM_CLICK
					$tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
					$iIndexNow = DllStructGetData($tInfo, 'Index')
					If $iIndexOld <> $iIndexNow Then
						$iIndexOld = $iIndexNow
						GUICtrlSetData($nLabel, _GUICtrlListView_GetItemText($hListView, $iIndexOld))
					EndIf
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

Func _Format_Valid($s_String, $i_Flag)
	;$i_Flag = 0 в дата в начале
	;$i_Flag <> 0 в дата в конце
	Local $s_Pattern = '(\d{2})\.(\d{2})\.(\d{4})(\h\d{2}:\d{2}).*', $s_Replace = '$3/$2/$1$4', _
			$s_Return
	If $i_Flag Then
		$s_Pattern = '.+' & $s_Pattern
	Else
		$s_Pattern = '^' & $s_Pattern
	EndIf
	$s_Return = StringRegExpReplace($s_String, $s_Pattern, $s_Replace)
	If _DateIsValid($s_Return) Then
		Return $s_Return
	Else
		Return SetError(1)
	EndIf
EndFunc   ;==>_Format_Valid

Func _Format_Back($s_String)
	Local $s_Pattern = '^(\d{4})/(\d{2})/(\d{2})(.*?)$', $s_Replace = '$3.$2.$1$4', $s_Return
	$s_Return = StringRegExpReplace($s_String, $s_Pattern, $s_Replace)
	If @extended <> 4 Then Return SetError(1)
	Return $s_Return
EndFunc   ;==>_Format_Back
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
madmasles
:smile:Спасибо за исчерпывающий ответ. Благодарствую Вас :smile:
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
madmasles
За дополнительное вторжение извиняюсь. Собираю из 2х скриптов одну .Но в каждым скрипте есть функции с одинаковыми именами. И они различаются некоторыми дополнениями. Убрал 100% совпадающие строки. НО остались не полностью совпадающие.И я не знаю как сними поступить. Прошу ,если есть возможность сделайте из не полностью совпадающих строк 1 строку , которая приемлема для обоих не полностью совпадающих строк. К примеру
$s_Return = StringRegExpReplace(StringStripWS($s_String, 7), $s_Pattern, $s_Replace)
$s_Return = StringRegExpReplace($s_String, $s_Pattern, $s_Replace)
или
Return ''
Return SetError(1)

Функции WM_NOTIFY
Мой рабочий вариант
Код:
Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
Local $LblTextListView
    Local $tNMITEMACTIVATE = DllStructCreate($tagNMITEMACTIVATE, $lParam)
    Local $hFrom = DllStructGetData($tNMITEMACTIVATE, 'hWndFrom')
    Local $Index = DllStructGetData($tNMITEMACTIVATE, 'Index')
    Local $ID = DllStructGetData($tNMITEMACTIVATE, 'Code')

    Switch $hFrom
        Case $hListView
            Switch $ID
				Case $LVN_BEGINDRAG
                    Return 0
                Case $LVN_ITEMCHANGED
                    If (BitAND(DllStructGetData($tNMITEMACTIVATE, 'Changed'), $LVIF_STATE)) And (BitAND(DllStructGetData($tNMITEMACTIVATE, 'NewState'), $LVIS_SELECTED)) And (Not BitAND(DllStructGetData($tNMITEMACTIVATE, 'OldState'), $LVIS_FOCUSED)) Then
                        $sSelected =  StringLeft(_GUICtrlListView_GetItemText($hListView, $Index),16)
				         	 GUICtrlSetData($Label,$sSelected)
							 $LblTextListView = GUICtrlRead($Label)
;...
        ;ControlFocus("Исходные данные", "", "[CLASS:TEdit; INSTANCE:2]")
                            ControlsetText("Исходные данные", "", "[CLASS:TEdit; INSTANCE:2]",$LblTextListView )
			                   ControlSend("Исходные данные", "", "[CLASS:TEdit; INSTANCE:2]","{Enter 2}")
				                  Sleep(10)
                               ControlsetText("Исходные данные", "", "[CLASS:TEdit; INSTANCE:2]",$LblTextListView )
                            ControlSend("Исходные данные", "", "[CLASS:TEdit; INSTANCE:2]","{Enter 2}")
		;ConsoleWrite($sSelected & @CRLF)
;...

                    EndIf
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

Ватиант с этого скрипта
Код:
Func WM_NOTIFY2($hWnd, $iMsg, $wParam, $lParam)
    Local $tNMHDR, $hWndFrom, $iCode, $tInfo, $iIndexNow
    $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
    $hWndFrom = DllStructGetData($tNMHDR, 'hWndFrom')
    $iCode = DllStructGetData($tNMHDR, 'Code')

    Switch $hWndFrom
        Case $hListView
            Switch $iCode
                Case $LVN_ITEMCHANGING;, $NM_CLICK
                    $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
                    $iIndexNow = DllStructGetData($tInfo, 'Index')
                    If $iIndexOld <> $iIndexNow Then
                        $iIndexOld = $iIndexNow
                        GUICtrlSetData($nLabel, _GUICtrlListView_GetItemText($hListView, $iIndexOld))
                    EndIf
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

Функции Format_Back
Мой рабочий вариант
Код:
Func _Format_Back($s_String)
    Local $s_Pattern = '^(\d{4})/(\d{2})/(\d{2})(.*?)$', $s_Replace = '$3.$2.$1$4', _
            $s_Return
    Return StringRegExpReplace($s_String, $s_Pattern, $s_Replace)
EndFunc   ;==>_Format_Back

Ватиант с этого скрипта
Код:
Func _Format_Back2($s_String)
    Local $s_Pattern = '^(\d{4})/(\d{2})/(\d{2})(.*?)$', $s_Replace = '$3.$2.$1$4', $s_Return
    $s_Return = StringRegExpReplace($s_String, $s_Pattern, $s_Replace)
    If @extended <> 4 Then Return SetError(1)
    Return $s_Return
EndFunc   ;==>_Format_Back

Функции Format_Valid
Мой рабочий вариант
Код:
Func _Format_Valid($s_String, $i_Flag)
    ;$i_Flag = 0 в дата в начале
    ;$i_Flag <> 0 в дата в конце
    Local $s_Pattern = '(\d{2})\.(\d{2})\.(\d{4})(\h\d{2}:\d{2}).*', $s_Replace = '$3/$2/$1$4', _
            $s_Return
    If $i_Flag Then
        $s_Pattern = '.+' & $s_Pattern
    Else
        $s_Pattern = '^' & $s_Pattern; & '$'
    EndIf
    $s_Return = StringRegExpReplace(StringStripWS($s_String, 7), $s_Pattern, $s_Replace)
    If _DateIsValid($s_Return) Then
        Return $s_Return
    Else
        Return ''
    EndIf
EndFunc   ;==>_Format_Valid


Ватиант с этого скрипта

Код:
Func _Format_Valid2($s_String, $i_Flag)
    ;$i_Flag = 0 в дата в начале
    ;$i_Flag <> 0 в дата в конце
    Local $s_Pattern = '(\d{2})\.(\d{2})\.(\d{4})(\h\d{2}:\d{2}).*', $s_Replace = '$3/$2/$1$4', _
            $s_Return
    If $i_Flag Then
        $s_Pattern = '.+' & $s_Pattern
    Else
        $s_Pattern = '^' & $s_Pattern
    EndIf
    $s_Return = StringRegExpReplace($s_String, $s_Pattern, $s_Replace)
    If _DateIsValid($s_Return) Then
        Return $s_Return
    Else
        Return SetError(1)
    EndIf
EndFunc   ;==>_Format_Valid
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 320
StarEdik,
Функции _Format_* я немного изменил в этом скрипте, как Вы используете их прошлые варианты, я ведь не знаю, соответственно и поменять не могу. Ваша функция WM_NOTIFY мне не совсем понятна, но, ИМХО, попробуйте просто добавить в нее мой кусок между Case $LVN_ITEMCHANGING и EndSwitch.
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
madmasles
Спасибо :smile: Почему то прога с первого раза не берет данные и по этому пришлось вторично послат ему данные.Сделал как вы посоветовали.Все :ok: Еше раз спасибо вам. :smile:
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
madmasles
Искал но нужную информацию не достал на форуме . Не могу в элементе listview в активной строке изменить значение. :scratch:
Знаю что, достаю много хлопот. :-[ Но если желание и возможность, прощу помочь.
Обычно когда мы желаем что то изменить кликаем по элементу с паузой 2 раза. Тогда этот элемент выделяется и мы вводим нужную запись и нажимаем на ввод.
Это действие у меня с Listview на выделенном строке не получается.
Здесь есть пример от gregaz http://autoit-script.ru/index.php/topic,6856.msg47342.html#msg47342
Там выделяется ,пишешь что хочешь но заменить не удается.

А вот здесь ваши замечание http://autoit-script.ru/index.php/topic,2918.msg21142.html#msg21142
Пробовал так
Код:
While 1
;……………..
Case $nButton_Zamenit
             _GUICtrlListView_SetItemText($hListView, ААА , БББ )
;……………..


Как ни крути у меня не получается .Как получить : :(
ААА – индекс выделенной сроки ,
БББ – заменяемая информация которая вводиться в активную строку listview после двойного клика с паузой.

За ранее благодарен . :smile:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 320
StarEdik,
Код:
#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>
#include <GuiListView.au3>

Global $iIndexOld = -10

$Gui = GUICreate('Test', 284, 244)
$nInput = GUICtrlCreateInput('Двойной клик на строке заменит ее на этот текст', 2, 10, 280, 20)
$nListView = GUICtrlCreateListView('', 2, 42, 280, 200, BitOR($LVS_REPORT, $LVS_SINGLESEL), $LVS_EX_GRIDLINES)
$hListView = GUICtrlGetHandle($nListView)
_GUICtrlListView_AddColumn($hListView, 'Test', 250)
_GUICtrlListView_AddItem($hListView, '15.10.2011 16:00 - 15.10.2011 19:10')
_GUICtrlListView_AddItem($hListView, '18.10.2011 03:20 - 19.10.2011 06:30')
_GUICtrlListView_AddItem($hListView, '20.10.2011 00:40 - 20.10.2011 15:00')
_GUICtrlListView_AddItem($hListView, '22.10.2011 17:40 - 22.10.2011 19:40')
_GUICtrlListView_AddItem($hListView, '24.10.2011 23:25 - 26.10.2011 00:40')
GUISetState()
GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd

Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
	Local $tNMHDR, $hWndFrom, $iCode, $tInfo, $iIndexNow, $sNewText
	$tNMHDR = DllStructCreate($tagNMHDR, $lParam)
	$hWndFrom = DllStructGetData($tNMHDR, 'hWndFrom')
	$iCode = DllStructGetData($tNMHDR, 'Code')

	Switch $hWndFrom
		Case $hListView
			Switch $iCode
				Case $LVN_ITEMCHANGING
					$tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
					$iIndexNow = DllStructGetData($tInfo, 'Index')
					If $iIndexOld <> $iIndexNow Then
						$iIndexOld = $iIndexNow
					EndIf
				Case $NM_DBLCLK
					$sNewText = GUICtrlRead($nInput)
					If $sNewText Then
						_GUICtrlListView_SetItemText($hListView, $iIndexOld, $sNewText)
					EndIf
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
madmasles
Спасибо вам большое и человеческое, Золотой человек. :smile:
 
Верх