Что нового

[Элементы GUI] Обновление всех элементов GUI

cobra2029

Новичок
Сообщения
54
Репутация
0
Здравствуйте, возник такой вопрос как бы вы реализовали функцию полного обновления GUI?

мои варианты:
- удаления и создание GUI снова;
- обновление "поэлементно" через функцию
Код:
GUICtrlSetData
;

других вариантов у меня нет, хотелось бы узнать может есть другие варианты?

P.S. в GUI присутствуют:
Код:
GUICtrlCreateTab
,
Код:
GUICtrlCreateTabItem
,
Код:
GUICtrlCreateListView
также 3 дочерних окна (но обновлять нужно, только первое - главное окно)

Пробовал через удаления и создание GUI - выходит некрасиво, на мелких таблица 100-300 строк все более менее, если значений больше то "заметно притормаживание".
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
cobra2029 [?]
обновление "поэлементно" через функцию
Так и нужно.

Я иногда использую метод через Dummy, типа так:

Код:
#include <GUIConstantsEx.au3>

$hGUI = GUICreate("Test Script", 300, 200)

$iFirst_Ctrl = GUICtrlCreateDummy() + 1

$iLbl1 = GUICtrlCreateLabel("Label 1", 20, 40, 100, 20)
$iLbl2 = GUICtrlCreateLabel("Label 2", 20, 60, 100, 20)
$iLbl3 = GUICtrlCreateLabel("Label 3", 20, 80, 100, 20)

$iLast_Ctrl = GUICtrlCreateDummy() - 1

GUISetState(@SW_SHOW, $hGUI)

Sleep(2000)

For $iCtrlID = $iFirst_Ctrl To $iLast_Ctrl
	GUICtrlSetData($iCtrlID, "Label CtrlID: " & $iCtrlID)
Next

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd
 
Автор
C

cobra2029

Новичок
Сообщения
54
Репутация
0
CreatoR [?]
cobra2029 [?]Цитата
обновление "поэлементно" через функцию
Так и нужно.Я иногда использую метод через Dummy, типа так:Код: AutoIt [Выделить]#include <GUIConstantsEx.au3>$hGUI = GUICreate("Test Script", 300, 200)$iFirst_Ctrl = GUICtrlCreateDummy() + 1$iLbl1 = GUICtrlCreateLabel("Label 1", 20, 40, 100, 20)$iLbl2 = GUICtrlCreateLabel("Label 2", 20, 60, 100, 20)$iLbl3 = GUICtrlCreateLabel("Label 3", 20, 80, 100, 20)$iLast_Ctrl = GUICtrlCreateDummy() - 1GUISetState(@SW_SHOW, $hGUI)Sleep(2000)For $iCtrlID = $iFirst_Ctrl To $iLast_Ctrl GUICtrlSetData($iCtrlID, "Label CtrlID: " & $iCtrlID)Next


почитал справку ... ммм более понятно не стало

не совсем понимаю как прикрутить данный вариант к моему примеру
вот код относящийся к GUI главного окна:

Код:
$hForm = GUICreate("Dialog manager", 577, 435)
$iPageControl = GUICtrlCreateTab(8, 8, 556, 328)

$TabSheet1 = GUICtrlCreateTabItem("Прибытие")
$iListView1 = GUICtrlCreateListView("№|Название объявления|Время",  8, 32, 553, 300)
GUICtrlSendMsg($iListView1, $LVM_SETCOLUMNWIDTH, 0, 80) ; 80 пиксель, если -1, то устанавливает по длине текста
GUICtrlSendMsg($iListView1, $LVM_SETCOLUMNWIDTH, 1, 400)
GUICtrlSendMsg($iListView1, $LVM_SETCOLUMNWIDTH, 2, 60)
_BuildListFromConfig($iListView1, "Прибытие")


$TabSheet2 = GUICtrlCreateTabItem("Отбытие")
$iListView2 = GUICtrlCreateListView("№|Название объявления|Время",  8, 32, 553, 300)
GUICtrlSendMsg($iListView2, $LVM_SETCOLUMNWIDTH, 0, 80) ; 80 пиксель, если -1, то устанавливает по длине текста
GUICtrlSendMsg($iListView2, $LVM_SETCOLUMNWIDTH, 1, 400)
GUICtrlSendMsg($iListView2, $LVM_SETCOLUMNWIDTH, 2, 60)
_BuildListFromConfig($iListView2, "Отбытие")

$TabSheet3 = GUICtrlCreateTabItem("Безопасность")
$iListView3 = GUICtrlCreateListView("№|Название объявления|Время",  8, 32, 553, 300)
GUICtrlSendMsg($iListView3, $LVM_SETCOLUMNWIDTH, 0, 80) ; 80 пиксель, если -1, то устанавливает по длине текста
GUICtrlSendMsg($iListView3, $LVM_SETCOLUMNWIDTH, 1, 400)
GUICtrlSendMsg($iListView3, $LVM_SETCOLUMNWIDTH, 2, 60)
_BuildListFromConfig($iListView3, "Безопасность")

$TabSheet4 = GUICtrlCreateTabItem("Другие")
$iListView4 = GUICtrlCreateListView("№|Название объявления|Время",  8, 32, 553, 300)
GUICtrlSendMsg($iListView4, $LVM_SETCOLUMNWIDTH, 0, 80) ; 80 пиксель, если -1, то устанавливает по длине текста
GUICtrlSendMsg($iListView4, $LVM_SETCOLUMNWIDTH, 1, 400)
GUICtrlSendMsg($iListView4, $LVM_SETCOLUMNWIDTH, 2, 60)
_BuildListFromConfig($iListView4, "Другие")

GUICtrlSetState(-1,$GUI_SHOW)
GUICtrlCreateTabItem("")

$iPlay_Bttn = GUICtrlCreateButton("Воспроизвести", 390, 360, 171, 49)
;$Button2 = GUICtrlCreateButton("Выход", 86, 272, 75, 25)
;$Button3 = GUICtrlCreateButton("&Help", 8, 272, 75, 25)
$iRead_Bttn = GUICtrlCreateButton("Прочитать", 200, 360, 171, 49)

$help = GUICtrlCreateButton("-", 8, 360, 60, 52, $BS_ICON+$BS_FLAT)
GUICtrlSetImage (-1, "shell32.dll",24, 1)

$config = GUICtrlCreateButton("-", 80, 360, 60, 52, $BS_ICON+$BS_FLAT)
GUICtrlSetImage (-1, "shell32.dll",36, 1)



GUICtrlSetState($iPlay_Bttn, $GUI_DISABLE)
GUICtrlSetState($iRead_Bttn, $GUI_DISABLE)

$iActive_ListView = $iListView1

GUISetState(@SW_SHOW, $hForm)
AdlibRegister('_EnableButton', 50)

;AdlibRegister('_Update', 5550)
; end interface

While 1
	$Msg = GUIGetMsg()
	Switch $Msg
		Case $GUI_EVENT_CLOSE
			Exit

		Case $GUI_EVENT_MINIMIZE

		Case $GUI_EVENT_MAXIMIZE

		Case $iPageControl
            $iPage = GUICtrlRead($iPageControl) + 1
            $iActive_ListView = Eval("iListView" & $iPage)

        Case $iPlay_Bttn
            ConsoleWrite('Воспроизведение...' & @LF)
			;_WinAPI_PlaySound("AIRPLANE", BitOR($SND_ASYNC, $SND_LOOP, $SND_RESOURCE), _WinAPI_GetModuleHandle(0))
			GUICtrlSetState($iPlay_Bttn, $GUI_DISABLE)

        Case $iRead_Bttn
            ConsoleWrite('Чтение...' & @LF)

		Case $config
			_Configure_Manager_Dialog()


		Case $help

    EndSwitch
WEnd

я, конечно, попробовал в наглую вставить

Код:
$iFirst_Ctrl = GUICtrlCreateDummy() + 1
$TabSheet1 = GUICtrlCreateTabItem("Прибытие")
$iListView1 = GUICtrlCreateListView("№|Название объявления|Время",  8, 32, 553, 300)
GUICtrlSendMsg($iListView1, $LVM_SETCOLUMNWIDTH, 0, 80) ; 80 пиксель, если -1, то устанавливает по длине текста
GUICtrlSendMsg($iListView1, $LVM_SETCOLUMNWIDTH, 1, 400)
GUICtrlSendMsg($iListView1, $LVM_SETCOLUMNWIDTH, 2, 60)
$iLast_Ctrl = GUICtrlCreateDummy() - 1

но понятно дело что результат получился такой же как и если использовать просто GUICtrlSetData - получается белиберда: старые значения остаются а новые добавляются

в моем конкретном случае нужно обновлять ListView на 4 разных TabItem.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Как вы заполняете ListView?
 
Автор
C

cobra2029

Новичок
Сообщения
54
Репутация
0
Yashied [?]
Как вы заполняете ListView?

вот функция которую написал CreatoR, собственно ею и пользуюсь

Код:
Func _BuildListFromConfig($iLV, $sCheckClass = '')
    Local $aSectNames = IniReadSectionNames($sConfig)
    Local $sItem

    For $i = 1 To UBound($aSectNames)-1
        If $sCheckClass = '' Or ($sCheckClass <> '' And IniRead($sConfig, $aSectNames[$i], "$Class" & $i, "") = $sCheckClass) Then ;используется  для разделения по классам
            $sItem = _
                IniRead($sConfig, $aSectNames[$i], "$Number" & $i, "") & "|" & _
                IniRead($sConfig, $aSectNames[$i], "$Name" & $i, "") & "|" & _
                IniRead($sConfig, $aSectNames[$i], "$Time" & $i, "")

            GUICtrlCreateListViewItem($sItem, $iLV)
        EndIf
    Next
EndFunc


ini файл имеет вид:

Код:
[record1]
$Number1=1
$Name1=Z-4567
$Time1=12:38
$Class1=Прибытие
$Delete1=1
.......
[recordN]
$NumberN=1
$NameN=Z-4567
$TimeN=12:38
$ClassN=Прибытие
$DeleteN=1
 
Автор
C

cobra2029

Новичок
Сообщения
54
Репутация
0
задачу решил все таки через удаление первичного окна и создания его снова....

другого решения не нашел.
 

AZJIO

Меценат
Меценат
Сообщения
2,894
Репутация
1,196
cobra2029
Если речь о всех элементах, то лучше пересоздать окно.

Код:
While 1
	_GUI()
WEnd

Func _GUI()
	$Gui=GUICreate('My Program '&Random(1, 100, 1), 250, 160)
	$Button1=GUICtrlCreateButton('Перезапуск GUI', 10, 10, 120)
	$Label1=GUICtrlCreateLabel('StatusBar', 5, 160-20, 150, 17)
	GUISetState ()
	While 1
		Switch GUIGetMsg()
			Case $Button1
				GUIDelete($Gui)
				ExitLoop
			Case -3
				 Exit
		EndSwitch
	WEnd
EndFunc
 
Автор
C

cobra2029

Новичок
Сообщения
54
Репутация
0
ВСЕ тему можно закрыть нашел:

GuiListView.au3

через эту функцию, а именно:

Код:
_GUICtrlListView_DeleteAllItems(GUICtrlGetHandle ($iListView1 ))
 

AZJIO

Меценат
Меценат
Сообщения
2,894
Репутация
1,196
cobra2029
Вот что значит неправильная постановка задачи. Несколько человек дали примеры совершенно неотносящиеся к проблеме. Лучше задавать вопрос не то как бы вы хотели решить задачу, а то что именно необходимо. А как это будет сделано предложат люди, которые это уже делали много раз.
 
Автор
C

cobra2029

Новичок
Сообщения
54
Репутация
0
AZJIO [?]
cobra2029Вот что значит неправильная постановка задачи. Несколько человек дали примеры совершенно неотносящиеся к проблеме. Лучше задавать вопрос не то как бы вы хотели решить задачу, а то что именно необходимо. А как это будет сделано предложат люди, которые это уже делали много раз.


уже понял, в следующий раз учту.

Положительный результат достигнутый даже через столько времени принес больше пользы если бы меня ткнули носом :smile:
 
Верх