Что нового

Как правильно организовать обновление данных в GUICtrlCreateLabel?

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
Доброго времени суток. Для вывода некторых данных в своем GUI окошке использую несколько переменных, которым назначается
Код:
GUICtrlCreateLabel(IniRead())
. Данные получаю из ini-файла, куда они периодически добавляются или стираются. Не могу придумать, как обновлять выводимые данные после того, как данные в ini-файле поменялись. Могу выведенные данные удалить с помощью
Код:
GUICtrlDelete
. Но как заново их вывести? Пробовал читать про
Код:
GUICtrlCreateListView
и обновление в нем, но слабо понимаю, как можно привязать к моим нуждам.
Теоретически можно зациклить проверку и вывод, но тоже пока не получается
 
Последнее редактирование:

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Код:
GuiCtrlSetData

не подходит?
 
Автор
D

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
Так пробовал, только обновляется при новом запуске окна или не запускается окно изначально. А нужно при работающем. По крайней мере у меня не получилось его использовать так, чтобы при изменении данных в ini-файле сразу отображались изменения в окошке
 
Последнее редактирование:

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
при изменении данных в ini-файле сразу отображались изменения в окошке
Код:
#include <GUIConstantsEx.au3>

Global $sIniFile = @ScriptDir & '\Data.ini'

Global $hGUI = GUICreate('Test Script', 300, 200)
Global $iLbl = GUICtrlCreateLabel('', 20, 40, 60, 20)

GUISetState(@SW_SHOW, $hGUI)

_CheckIniData() ;Check once on start
AdlibRegister('_CheckIniData', 1000) ;Check every 1 second

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

Func _CheckIniData()
    Local Static $sLastRead = ''
    Local $sRead = IniRead($sIniFile, 'Main', 'Label', '')
   
    If $sRead <> $sLastRead Then
        $sLastRead = $sRead
        GUICtrlSetData($iLbl, $sRead)
    EndIf
EndFunc


Хотя было бы корректнее устроить мониторинг за файлом (проверка на изменения).
Вот так:
Код:
#include <GUIConstantsEx.au3>
#include <Date.au3>

Global $sIniFile = @ScriptDir & '\Data.ini'

Global $hGUI = GUICreate('Test Script', 300, 200)
Global $iLbl = GUICtrlCreateLabel('', 20, 40, 60, 20)

GUISetState(@SW_SHOW, $hGUI)

_CheckIniData() ;Check once on start
AdlibRegister('_CheckIniData', 1000) ;Check every 1 second

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

Func _CheckIniData()
    Local Static $sLastModified = ''
    Local $aModified = FileGetTime($sIniFile)
    
    If @error Then
        Return
    EndIf
    
    Local $sModified = $aModified[0] & '/' & $aModified[1] & '/' & $aModified[2] & ' ' & $aModified[3] & ':' & $aModified[4] & ':' & $aModified[5]
    
    If $sLastModified = '' Or _DateDiff('s', $sLastModified, $sModified) > 0 Then
        $sLastModified = $sModified
        GUICtrlSetData($iLbl, IniRead($sIniFile, 'Main', 'Label', ''))
    EndIf
EndFunc
 
Последнее редактирование:
Автор
D

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
Хотя было бы корректнее устроить мониторинг за файлом (проверка на изменения).
Визуально это то, что хотелось, но не могу придумать как вывести всю инфу. Пока только первый ключ получается

С остальным буду пробовать разобраться
Я тоже пробовал какие-то циклы на проверку писать, но пока безуспешно. И циклы пугают нагрузкой на проц
Ещё иду и вторым, параллельным путем, но как одна из проблем - не могу обновлять инфу во всех GUICtrlCreateLabel. Получается только в первом
Пробовал так
Код:
#RequireAdmin
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <GDIPlus.au3>

Global $timer, $Secs, $Mins, $Hour, $Time, $sTime, $TimeInf, $sPS, $sPD
Global $iPid, $iTM

$hGui = GUICreate('Секундомер', 700, 680, -1, -1, -1, $WS_EX_TOPMOST)
Local $btStart = GUICtrlCreateButton('Старт', 392, 8, 75, 25)
Local $sPathSS = GUICtrlCreateInput('', 8, 96, 325, 21)
Local $sPathDD = GUICtrlCreateInput('', 8, 128, 325, 21)
Local $sPathS = GUICtrlCreateButton('Откуда', 392, 96, 75, 25)
Local $sPathD = GUICtrlCreateButton('Куда', 392, 128, 75, 25)
Local $btClear = GUICtrlCreateButton('Очистить', 392, 630, 75, 25)
$LabelPic1 = GUICtrlCreateLabel('', 8, 370, 330, 25, $SS_CENTERIMAGE + $SS_CENTER, $WS_EX_STATICEDGE)
$LabelPic2 = GUICtrlCreateLabel('', 338, 370, 330, 25, $SS_CENTERIMAGE + $SS_CENTER, $WS_EX_STATICEDGE)
$LabelPic3 = GUICtrlCreateLabel('', 8, 600, 330, 25, $SS_CENTERIMAGE + $SS_CENTER, $WS_EX_STATICEDGE)
$LabelPic4 = GUICtrlCreateLabel('', 338, 600, 330, 25, $SS_CENTERIMAGE + $SS_CENTER, $WS_EX_STATICEDGE)

GUISetState()
While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE

            ProcessClose($iPid)
            Exit
        Case $sPathS
            GUICtrlSetData($sPathSS, '')
            $sPS = FileSelectFolder('Выбор копируемой папки', '', 0, '', $hGui)
            If Not @error Then GUICtrlSetData($sPathSS, $sPS)
        Case $sPathD
            GUICtrlSetData($sPathDD, '')
            $sPD = FileSelectFolder('Выбор папки назначения', '', 0, '', $hGui)
            If Not @error Then GUICtrlSetData($sPathDD, $sPD)
        Case $btStart
            _GetPath()
        Case $btClear
            GUICtrlSetData($sPathSS, '')
            GUICtrlSetData($sPathDD, '')
            ;GUICtrlDelete($LabelPic1)
            ;GUICtrlDelete($LabelPic2)
            _Clear()
EndSwitch
WEnd

Func _GetPath()
    $Path = 'Копировали из ' & GUICtrlRead($sPathSS) & ' в ' & GUICtrlRead($sPathDD)
    $AllPath = IniReadSection("Setting.ini", "Путь")
    For $i = 1 To $AllPath[0][0]
        If $AllPath[$i][1] = '' Then ;Переменная не занесена
            For $j = 1 To $i - 1 ; Проверка на уникальность пути
                If $AllPath[$j][1]  = $Path Then ; Такой путь уже есть
                    MsgBox(16, 'Внимание !', 'Путь к папке:' & @CR & $Path & 'уже существует !', 0, $hGui)
                    Return
                EndIf
            Next
            IniWrite("Setting.ini", "Путь", $AllPath[$i][0], $Path)
            ;$LabelPic = $LabelPic+$i
            GUICtrlSetData($LabelPic1, IniRead("Setting.ini","Путь",  $AllPath[$i][0], "Пока пусто"))
            If $i < $AllPath[0][0] Then Return
        EndIf
    Next
    ;MsgBox(64, 'Внимание !', 'Все переменные занесены !', 0, $hGui)
    MsgBox(64, 'ahtung', $AllPath[2][1], 0, $hGui)
EndFunc

  Func _Clear()
Local $aRS = IniReadSection("Setting.ini", "Путь")
If Not @error Then
    For $i = 1 To $aRS[0][0]
        $aRS[$i][1] = ''
    Next
    IniWriteSection("Setting.ini", "Путь", $aRS)
EndIf
EndFunc
Сообщение автоматически объединено:


Хотя все проще оказалось ) Вроде работает. Но остается вопрос. Можно ли доточить мой вариант и какой вариант будет правильней, в том числе и в плане нагрузки на проц с опертивой?
 
Последнее редактирование:

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
иду и вторым, параллельным путем, но как одна из проблем - не могу обновлять инфу во всех GUICtrlCreateLabel
Вопрос заключался в том, чтобы обновлять данные из файла по мере их изменения в нём, в данном же примере совершенно иная ситуация.
Можно ли доточить мой вариант и какой вариант будет правильней, в том числе и в плане нагрузки на проц с опертивой?
Вариант будет правильный лишь тогда, когда сможешь боле точно описать задачу.
Нагрузка на процессор не грозит в данном случае, тут нет постоянных циклов, просто одноразовая обработка при нажатии на кнопку.
 
Автор
D

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
Вариант будет правильный лишь тогда, когда сможешь боле точно описать задачу
Да уж, с постановкой задачи у меня тяжеловато...
Нагрузка на процессор не грозит в данном случае, тут нет постоянных циклов, просто одноразовая обработка при нажатии на кнопку.
Имеется ввиду в моем варианте? А в вашем, в подобных циклах?
Вопрос заключался в том, чтобы обновлять данные из файла по мере их изменения в нём
Да, дело в том, что источников изменений несколько, а точнее - три кнопки, в том числе и кнопка очистки. Она у меня вообще все чистить будет. Возможно и четвертая появиться, но пока не решил. И секций с инфой несколько. В секциях инфа меняется по-разному, независимо друг от друга. Тоесть в одной секции может поменяться, а в остальных нет. А может меняться сразу в нескольких. Или допустим, в двух начинает меняться одновременно, а через промежуток времени в одной инфа замирает, а во второй продолжает меняться. Кнопки запускают разные процессы. Из процессов берется различная инфа.
в данном же примере совершенно иная ситуация.
А для данного примера, где моя ошибка? Можете подсказать?
 
Последнее редактирование:

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
где моя ошибка? Можете подсказать?
Не могу, т.к не до конца понимаю задачу.
Что должно получиться в итоге, что ожидается, как должна работать программа?
"Умение поставить задачу - это и есть часть её решения!"
 
Автор
D

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
Что должно получиться в итоге, что ожидается, как должна работать программа?
Вообще программа должна мониторить-тестировать диск. Скорость копирования, чтения, размер буфера и скорость работы с ним, температуру и ещё несколько параметров, сравнение результатов между собой. Некторые из них визуализировать в виде графиков и прочего. На данный момент реализовано отслеживание скорости копирования, фиксирование пути копирования, некоторая визуализация процесса. Данный кусок выводит пути копирования. Что-то типа подписи под графиком скорости копирования. Выбрали что и откуда, нажали на "старт". Путь скопировался в ini-файл. Оттуда вывелся в графическое окошко в первую ячейку (Label). Второй раз выводиться уже во вторую ячейку. В первой при этом инфа остается. И так 4-6 раз. Потом по нажатию кнопки все чиститься в ini-файле и соответственно в ячейках.
Если не развивать функционал дальше, то достаточно двух действий.
1. По нажатию кнопки "старт" копировать пути и выводить их в соответствующие ячейки (Label)
2. По нажатию кнопки "Очистить" очистить значения в ini-файле и в соответствующих ячейках окошка.

Пы.Сы. График скорости по-идее чистится аналогичным образом. Только он пока визуализирован с помощью скрина. А в будущем вероятно напишу свой график. А пока у меня аналогичная проблема с выводом соответствующих скринов. Один скрин получается вывести. Остальные только после перезагрузки окошка. Поэтому надеюсь, что способ, который я пробую реализовать, помог бы и в выводе скрина в соответствующую ячейку.
 
Последнее редактирование:

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
принцип такой: изменяешь запись - отображаешь в гуи. и это нужно прописать в каждой функции, которая пишет или удаляет в файле.
 
Верх