Что нового

ОБъеденить несколько функций добавления в список ListView

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
 

vovsla

Осваивающий
Сообщения
607
Репутация
36
Не уверен, что правильно понял вопрос, но думаю, что пример ответит на некоторые вопросы, плюс рекомендую использовать редактор форм

Код:
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
#include <Array.au3>
Opt("GUIOnEventMode", 1)
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 502, 316, 192, 124)
GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close")
$ListView1 = GUICtrlCreateListView("Колонка", 4, 4, 121, 150)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 100)
$ListView2 = GUICtrlCreateListView("Колонка", 128, 4, 121, 150)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 100)
$ListView3 = GUICtrlCreateListView("Колонка", 252, 4, 121, 150)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 100)
$ListView4 = GUICtrlCreateListView("Колонка", 376, 4, 121, 150)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 100)
$ListView5 = GUICtrlCreateListView("Колонка", 4, 160, 121, 150)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 100)
$ListView6 = GUICtrlCreateListView("Колонка", 128, 160, 121, 150)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 100)
$ListView7 = GUICtrlCreateListView("Колонка", 252, 160, 121, 150)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 100)
$ListView8 = GUICtrlCreateListView("Колонка", 376, 160, 121, 150)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 100)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###


Dim $aItems[10][1]
For $iI = 0 To UBound($aItems) - 1
    $aItems[$iI][0] = "Item " & $iI
Next

For $Num = 1 To 8
    AddArr(Eval('ListView'&$Num), $aItems)
Next


While 1
    Sleep(100)
WEnd

Func AddArr($ListView, $Arr)
    _GUICtrlListView_AddArray($ListView, $Arr)
EndFunc

Func Form1Close()
    Exit
EndFunc
 
Верх