DyadyaGenya
Знающий
- Сообщения
- 300
- Репутация
- 10
Доброго времени суток. Есть несколько списков ListView, которые можно выводить парой дублирующих функций по нажатию кнопки, типа: функцияА1 + функцияВ1, функцияА2 + функцияВ2, функцияА3 + функцияВ3. Но тогда получается большой код. Никак не могу объеденить, чтоб было типа: функцияА + функцияВ. То выдает пустые списки, то первый открытый список по всем кнопкам вызывающим составление списка, то ещё как-то. Вот как бы исходный работающий код:
Вот вариант, который рисует в последнем списке (под третьей кнопкой) тот, который был вызван первым:
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <RGBHumanConstants.au3>
#include <WinAPI.au3>
#include <Array.au3>
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
;#include <TreeViewConstants.au3>
HotKeySet("{ESC}", "Terminate")
;Обязательно задавать элементам -1, чтобы небыло ложного срабатывания событий в случае если (ещё) не создан элемент присваеваемый данной переменной
Global $nChildGUI_Close_Bttn = -1, $k = 0, $ShowChild
Global $NameColumn, $aColumn, $CheckAll = "Выбрать всё", $UncheckAll = "Убрать всё"
Global $iniFile = @ScriptDir & '\SettingsODS103.ini'
Global $SektionName ; название секции в ини файле
$hMain_GUI = GUICreate("Main GUI", 400, 400)
$nChild_Button1 = GUICtrlCreateButton("Выбрать из списка1", 20, 20, 180, 20)
$nChild_Button2 = GUICtrlCreateButton("Выбрать из списка2", 20, 120, 180, 20)
$nChild_Button3 = GUICtrlCreateButton("Выбрать из списка3", 20, 220, 180, 20)
GUISetState(@SW_SHOW, $hMain_GUI)
;Создаём дочерний GUI, не отображая его на экране
$hChild_GUI1 = _ChildGUI_Create1($hMain_GUI, '40')
$hChild_GUI2 = _ChildGUI_Create2($hMain_GUI, '140')
$hChild_GUI3 = _ChildGUI_Create3($hMain_GUI, '240')
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
While 1
;Обработка событий в расширенном режиме
$aMsg = GUIGetMsg(1)
Switch $aMsg[0]
Case $GUI_EVENT_CLOSE
;Проверяем если "событие закрытия" поступило с главного-родительского GUI
If $aMsg[1] = $hMain_GUI Then Exit
;Если "событие закрытия" поступило с дочернего GUI, то просто прячем его
If $aMsg[1] = $hChild_GUI Then
GUISetState(@SW_HIDE, $hChild_GUI)
EndIf
Case $nChild_Button1
ConsoleWrite('нажата первая кнопка' & @CR)
$SektionName = 'Секция1'
_Hide($hChild_GUI1)
_AddLVItems1($SektionName)
Case $nChild_Button2
ConsoleWrite('нажата вторая кнопка' & @CR)
$SektionName = 'Секция2'
_Hide($hChild_GUI2)
_AddLVItems2($SektionName)
Case $nChild_Button3
ConsoleWrite('нажата третья кнопка' & @CR)
$SektionName = 'Секция3'
_Hide($hChild_GUI3)
_AddLVItems3($SektionName)
EndSwitch
WEnd
Func _ChildGUI_Create1($hParent, $h)
;Local $hChild_GUI
$ParentWin_Pos = WinGetPos($hMain_GUI, "")
;_ArrayDisplay($ParentWin_Pos)
ConsoleWrite($ParentWin_Pos[0] & '|' & $ParentWin_Pos[1] & '|' & $ParentWin_Pos[2] & '|' & $ParentWin_Pos[3] & @CR)
; РИСУЕМ ДОЧЕРНЕЕ ОКНО БЕЗ ШАПКИ/ЗАГОЛОВКА
Global $hChild_GUI1 = GUICreate("Child GUI", 400, 200, 20 ,$h, $WS_POPUP, $WS_EX_MDICHILD, $hMain_GUI) ; так дочернее окно открывается прямо над выбранным элементом/кнопкой окна и приклеено и без заголовка
GUISetState(@SW_HIDE, $hChild_GUI1)
GUISetBkColor($_Red)
Global $ListView1 = GUICtrlCreateListView($CheckAll & '|' & $CheckAll, 1, 0, 400, 200, BitOR($LVS_REPORT, $LVS_SHOWSELALWAYS), BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_FLATSB))
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 178) ; задает размер первой колонки
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, -2) ; задает ширину второй колонки
_GUICtrlListView_SetExtendedListViewStyle($ListView1, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_CHECKBOXES))
Return $hChild_GUI1
EndFunc
Func _AddLVItems1($SektionName)
ConsoleWrite('имя секции, которое поступило в функцию = ' & $SektionName & @CR)
If Not IsDeclared('aText1') Then ; Проверка, чтобы не добавлялись пункты повторно
Global $aText1 = IniReadSection($iniFile, $SektionName)
;_ArrayDisplay($aText)
For $n = 1 To $aText1[0][0]
GUICtrlCreateListViewItem($aText1[$n][0] & '|' & $aText1[$n][1], $ListView1)
Next
EndIf
; GUICtrlSendMsg($ListView1, $LVM_DELETEALLITEMS, 0, 0) ; очищает предыдущий список, и тогда все галочки снимаются
EndFunc ;==>_AddLVItems
Func _ChildGUI_Create2($hParent, $h)
;Local $hChild_GUI
$ParentWin_Pos = WinGetPos($hMain_GUI, "")
;_ArrayDisplay($ParentWin_Pos)
ConsoleWrite($ParentWin_Pos[0] & '|' & $ParentWin_Pos[1] & '|' & $ParentWin_Pos[2] & '|' & $ParentWin_Pos[3] & @CR)
; РИСУЕМ ДОЧЕРНЕЕ ОКНО БЕЗ ШАПКИ/ЗАГОЛОВКА
Global $hChild_GUI2 = GUICreate("Child GUI", 400, 200, 20 ,$h, $WS_POPUP, $WS_EX_MDICHILD, $hMain_GUI) ; так дочернее окно открывается прямо над выбранным элементом/кнопкой окна и приклеено и без заголовка
GUISetState(@SW_HIDE, $hChild_GUI2)
GUISetBkColor($_Red)
Global $ListView2 = GUICtrlCreateListView($CheckAll & '|' & $CheckAll, 1, 0, 400, 200, BitOR($LVS_REPORT, $LVS_SHOWSELALWAYS), BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_FLATSB))
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 178) ; задает размер первой колонки
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, -2) ; задает ширину второй колонки
_GUICtrlListView_SetExtendedListViewStyle($ListView2, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_CHECKBOXES))
Return $hChild_GUI2
EndFunc
Func _AddLVItems2($SektionName)
ConsoleWrite('имя секции, которое поступило в функцию = ' & $SektionName & @CR)
If Not IsDeclared('aText2') Then ; Проверка, чтобы не добавлялись пункты повторно
Global $aText2 = IniReadSection($iniFile, $SektionName)
;_ArrayDisplay($aText)
For $n = 1 To $aText2[0][0]
GUICtrlCreateListViewItem($aText2[$n][0] & '|' & $aText2[$n][1], $ListView2)
Next
EndIf
; GUICtrlSendMsg($ListView1, $LVM_DELETEALLITEMS, 0, 0) ; очищает предыдущий список, и тогда все галочки снимаются
EndFunc ;==>_AddLVItems
Func _ChildGUI_Create3($hParent, $h)
;Local $hChild_GUI
$ParentWin_Pos = WinGetPos($hMain_GUI, "")
;_ArrayDisplay($ParentWin_Pos)
ConsoleWrite($ParentWin_Pos[0] & '|' & $ParentWin_Pos[1] & '|' & $ParentWin_Pos[2] & '|' & $ParentWin_Pos[3] & @CR)
; РИСУЕМ ДОЧЕРНЕЕ ОКНО БЕЗ ШАПКИ/ЗАГОЛОВКА
Global $hChild_GUI3 = GUICreate("Child GUI", 400, 200, 20 ,$h, $WS_POPUP, $WS_EX_MDICHILD, $hMain_GUI) ; так дочернее окно открывается прямо над выбранным элементом/кнопкой окна и приклеено и без заголовка
GUISetState(@SW_HIDE, $hChild_GUI3)
GUISetBkColor($_Red)
Global $ListView3 = GUICtrlCreateListView($CheckAll & '|' & $CheckAll, 1, 0, 400, 200, BitOR($LVS_REPORT, $LVS_SHOWSELALWAYS), BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_FLATSB))
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 178) ; задает размер первой колонки
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, -2) ; задает ширину второй колонки
_GUICtrlListView_SetExtendedListViewStyle($ListView3, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_CHECKBOXES))
Return $hChild_GUI3
EndFunc
Func _AddLVItems3($SektionName)
ConsoleWrite('имя секции, которое поступило в функцию = ' & $SektionName & @CR)
If Not IsDeclared('aText3') Then ; Проверка, чтобы не добавлялись пункты повторно
Global $aText3 = IniReadSection($iniFile, $SektionName)
;_ArrayDisplay($aText)
For $n = 1 To $aText3[0][0]
GUICtrlCreateListViewItem($aText3[$n][0] & '|' & $aText3[$n][1], $ListView3)
Next
EndIf
; GUICtrlSendMsg($ListView1, $LVM_DELETEALLITEMS, 0, 0) ; очищает предыдущий список, и тогда все галочки снимаются
EndFunc ;==>_AddLVItems
Func _Hide($hChild_GUI)
$ShowChild = Not $ShowChild
If $ShowChild Then
GUISetState(@SW_SHOW, $hChild_GUI)
Else
GUISetState(@SW_HIDE, $hChild_GUI)
EndIf
EndFunc
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <RGBHumanConstants.au3>
#include <WinAPI.au3>
#include <Array.au3>
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
;#include <TreeViewConstants.au3>
HotKeySet("{ESC}", "Terminate")
;Обязательно задавать элементам -1, чтобы небыло ложного срабатывания событий в случае если (ещё) не создан элемент присваеваемый данной переменной
Global $nChildGUI_Close_Bttn = -1, $k = 0, $ShowChild
Global $NameColumn, $aColumn, $CheckAll = "Выбрать всё", $UncheckAll = "Убрать всё"
Global $iniFile = @ScriptDir & '\SettingsODS103.ini'
Global $SektionName ; название секции в ини файле
$hMain_GUI = GUICreate("Main GUI", 400, 400)
$nChild_Button1 = GUICtrlCreateButton("Выбрать из списка1", 20, 20, 180, 20)
$nChild_Button2 = GUICtrlCreateButton("Выбрать из списка2", 20, 120, 180, 20)
$nChild_Button3 = GUICtrlCreateButton("Выбрать из списка3", 20, 220, 180, 20)
GUISetState(@SW_SHOW, $hMain_GUI)
;Создаём дочерний GUI, не отображая его на экране
$hChild_GUI1 = _ChildGUI_Create($hMain_GUI, '40')
$hChild_GUI2 = _ChildGUI_Create($hMain_GUI, '140')
$hChild_GUI3 = _ChildGUI_Create($hMain_GUI, '240')
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
While 1
;Обработка событий в расширенном режиме
$aMsg = GUIGetMsg(1)
Switch $aMsg[0]
Case $GUI_EVENT_CLOSE
;Проверяем если "событие закрытия" поступило с главного-родительского GUI
If $aMsg[1] = $hMain_GUI Then Exit
;Если "событие закрытия" поступило с дочернего GUI, то просто прячем его
If $aMsg[1] = $hChild_GUI Then
GUISetState(@SW_HIDE, $hChild_GUI)
EndIf
Case $nChild_Button1
ConsoleWrite('нажата первая кнопка' & @CR)
$SektionName = 'Секция1'
_Hide($hChild_GUI1)
_AddLVItems($SektionName)
Case $nChild_Button2
ConsoleWrite('нажата вторая кнопка' & @CR)
$SektionName = 'Секция2'
_Hide($hChild_GUI2)
_AddLVItems($SektionName)
Case $nChild_Button3
ConsoleWrite('нажата третья кнопка' & @CR)
$SektionName = 'Секция3'
_Hide($hChild_GUI3)
_AddLVItems($SektionName)
EndSwitch
WEnd
Func _ChildGUI_Create($hParent, $h)
;Local $hChild_GUI
$ParentWin_Pos = WinGetPos($hMain_GUI, "")
;_ArrayDisplay($ParentWin_Pos)
ConsoleWrite($ParentWin_Pos[0] & '|' & $ParentWin_Pos[1] & '|' & $ParentWin_Pos[2] & '|' & $ParentWin_Pos[3] & @CR)
; РИСУЕМ ДОЧЕРНЕЕ ОКНО БЕЗ ШАПКИ/ЗАГОЛОВКА
Global $hChild_GUI = GUICreate("Child GUI", 400, 200, 20 ,$h, $WS_POPUP, $WS_EX_MDICHILD, $hMain_GUI) ; так дочернее окно открывается прямо над выбранным элементом/кнопкой окна и приклеено и без заголовка
GUISetState(@SW_HIDE, $hChild_GUI)
GUISetBkColor($_Red)
Global $ListView = GUICtrlCreateListView($CheckAll & '|' & $CheckAll, 1, 0, 400, 200, BitOR($LVS_REPORT, $LVS_SHOWSELALWAYS), BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_FLATSB))
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 178) ; задает размер первой колонки
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, -2) ; задает ширину второй колонки
_GUICtrlListView_SetExtendedListViewStyle($ListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_CHECKBOXES))
Return $hChild_GUI
EndFunc
Func _AddLVItems($SektionName)
ConsoleWrite('имя секции, которое поступило в функцию = ' & $SektionName & @CR)
If Not IsDeclared('aText') Then ; Проверка, чтобы не добавлялись пункты повторно
Global $aText = IniReadSection($iniFile, $SektionName)
;_ArrayDisplay($aText)
For $n = 1 To $aText[0][0]
GUICtrlCreateListViewItem($aText[$n][0] & '|' & $aText[$n][1], $ListView)
;_GUICtrlListView_AddItem($ListView1, $aText[$n])
;_GUICtrlListView_AddSubItem($ListView1, $n-1, 'ssss', 1, 1)
Next
EndIf
; GUICtrlSendMsg($ListView1, $LVM_DELETEALLITEMS, 0, 0) ; очищает предыдущий список, и тогда все галочки снимаются
EndFunc ;==>_AddLVItems
Func _Hide($hChild_GUI)
$ShowChild = Not $ShowChild
If $ShowChild Then
GUISetState(@SW_SHOW, $hChild_GUI)
Else
GUISetState(@SW_HIDE, $hChild_GUI)
EndIf
EndFunc