Что нового

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

DyadyaGenya

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

joiner

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

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

DyadyaGenya

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

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 471
Репутация
2 401
при изменении данных в 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

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

С остальным буду пробовать разобраться
Я тоже пробовал какие-то циклы на проверку писать, но пока безуспешно. И циклы пугают нагрузкой на проц
Ещё иду и вторым, параллельным путем, но как одна из проблем - не могу обновлять инфу во всех 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 471
Репутация
2 401
иду и вторым, параллельным путем, но как одна из проблем - не могу обновлять инфу во всех GUICtrlCreateLabel
Вопрос заключался в том, чтобы обновлять данные из файла по мере их изменения в нём, в данном же примере совершенно иная ситуация.
Можно ли доточить мой вариант и какой вариант будет правильней, в том числе и в плане нагрузки на проц с опертивой?
Вариант будет правильный лишь тогда, когда сможешь боле точно описать задачу.
Нагрузка на процессор не грозит в данном случае, тут нет постоянных циклов, просто одноразовая обработка при нажатии на кнопку.
 
Автор
D

DyadyaGenya

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

CreatoR

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

DyadyaGenya

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

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

joiner

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