Что нового

[Элементы GUI] Обновление данных в окне?

Fazatron

veni...vidi...vici...
Сообщения
18
Репутация
0
добрый день!

неполучается закончить скрипт.
мне нужно в определенные ячейки (GUICtrlCreateInput) программы выводить данные определенных строк из *.ini файла.
вот окно программы:
feetviewer.jpg

часть кода из *.ini файла(нужные строки):
Код:
HeadOffsetY12=259
HeadOffsetY13=0
HeadOffsetY14=0
HeadOffsetY15=259
HeadOffsetY16=259
StepOffset1=19
StepOffset2=16
StepOffset3=15
StepOffset4=30
StepOffset5=6
StepOffset6=0
StepOffset7=0
StepOffset8=0
BiDifference1=2
BiDifference2=0
BiDifference3=-11

всё работает, вот только не могу заставить обновляться данные в этих ячейках автоматически, обновляются тока после перезапуска. например, если в файле значение строчки "StepOffset6=0" меняется на "StepOffset6=4", то через временной интервал (1сек.) значение в ячейке обновилось с "0" на "4" автоматически. пожалуйста подскажите как это реализовать?

Код:
#include <GUIConstants.au3>

GUICreate("Feet Viewer", 210,58);, @DesktopWidth/2-160, @DesktopHeight/2-45, -1, 0x00000018); WS_EX_ACCEPTFILES

GUICtrlCreateLabel ("2 pass",  10, 8, 50)
GUICtrlCreateLabel ("3 pass",  50, 8, 50)
GUICtrlCreateLabel ("4 pass",  90, 8, 50)
GUICtrlCreateLabel ("6 pass",  130, 8, 50)
GUICtrlCreateLabel ("8 pass",  170, 8, 50)

$sFile = @ScriptDir & '\setup-A3308F    KM512-42PL-PCI08.ini'

$hFile = FileOpen($sFile, 0)
$sText = FileRead($hFile)
FileClose($hFile)

$sVar_1 = StringRegExpReplace($sText, '(?s).*?\QStepOffset2\E=(\d+)\r\n?.*', '\1')
$sVar_2 = StringRegExpReplace($sText, '(?s).*?\QStepOffset3\E=(\d+)\r\n?.*', '\1')
$sVar_3 = StringRegExpReplace($sText, '(?s).*?\QStepOffset4\E=(\d+)\r\n?.*', '\1')
$sVar_4 = StringRegExpReplace($sText, '(?s).*?\QStepOffset5\E=(\d+)\r\n?.*', '\1')
$sVar_5 = StringRegExpReplace($sText, '(?s).*?\QStepOffset6\E=(\d+)\r\n?.*', '\1')

GUICtrlCreateInput ( $sVar_1, 10,  25, 30, 20)
GUICtrlCreateInput ( $sVar_2, 50,  25, 30, 20)
GUICtrlCreateInput ( $sVar_3, 90,  25, 30, 20)
GUICtrlCreateInput ( $sVar_4, 130,  25, 30, 20)
GUICtrlCreateInput ( $sVar_5, 170,  25, 30, 20)
GUISetState ()

While 1

 $msg = GUIGetMsg()
   If $msg = $GUI_EVENT_CLOSE Then ExitLoop
			
Wend


заранее благодарен.
 

SECTOR

Продвинутый
Сообщения
399
Репутация
59
Я бы сделал так (у меня работает) :smile:

Код:
#include <GUIConstants.au3>

GUICreate("Feet Viewer", 210, 58);, @DesktopWidth/2-160, @DesktopHeight/2-45, -1, 0x00000018); WS_EX_ACCEPTFILES

GUICtrlCreateLabel("2 pass", 10, 8, 50)
GUICtrlCreateLabel("3 pass", 50, 8, 50)
GUICtrlCreateLabel("4 pass", 90, 8, 50)
GUICtrlCreateLabel("6 pass", 130, 8, 50)
GUICtrlCreateLabel("8 pass", 170, 8, 50)

Global $sFile = @ScriptDir & '\setup-A3308F    KM512-42PL-PCI08.ini'

Global $hInp_1 = GUICtrlCreateInput("", 10, 25, 30, 20)
Global $hInp_2 = GUICtrlCreateInput("", 50, 25, 30, 20)
Global $hInp_3 = GUICtrlCreateInput("", 90, 25, 30, 20)
Global $hInp_4 = GUICtrlCreateInput("", 130, 25, 30, 20)
Global $hInp_5 = GUICtrlCreateInput("", 170, 25, 30, 20)

_Update()

GUISetState()

$hTimer = TimerInit()

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch

	If TimerDiff($hTimer) > 1000 Then
		_Update()
		$hTimer = TimerInit()
	EndIf
WEnd

Func _Update()

;~ 	$hFile = FileOpen($sFile, 0)
;~ 	$sText = FileRead($hFile)
;~ 	FileClose($hFile)

	Local $sText = FileRead($sFile)

	Local $sVar_1 = StringRegExpReplace($sText, '(?s).*?\QStepOffset2\E=(\d+)\r\n?.*', '\1')
	Local $sVar_2 = StringRegExpReplace($sText, '(?s).*?\QStepOffset3\E=(\d+)\r\n?.*', '\1')
	Local $sVar_3 = StringRegExpReplace($sText, '(?s).*?\QStepOffset4\E=(\d+)\r\n?.*', '\1')
	Local $sVar_4 = StringRegExpReplace($sText, '(?s).*?\QStepOffset5\E=(\d+)\r\n?.*', '\1')
	Local $sVar_5 = StringRegExpReplace($sText, '(?s).*?\QStepOffset6\E=(\d+)\r\n?.*', '\1')
	GUICtrlSetData($hInp_1, $sVar_1)
	GUICtrlSetData($hInp_2, $sVar_2)
	GUICtrlSetData($hInp_3, $sVar_3)
	GUICtrlSetData($hInp_4, $sVar_4)
	GUICtrlSetData($hInp_5, $sVar_5)

EndFunc   ;==>_Update


OffTopic:
Кстати, не очень понятно какая у вас версия AutoIt, если не сложно, напишите её в формате 3.x.x.x - как её обычно пишут ;)


"StepOffset6=0" меняется на "StepOffset6=4", то через временной интервал (1сек.) значение в ячейке обновилось с "0" на "8" автоматически
Если 0 изменился на 4 то в окне 0 менять на 8? :wacko:
 
Автор
Fazatron

Fazatron

veni...vidi...vici...
Сообщения
18
Репутация
0
SECTOR, заранее спасибо, сейчас проверю ваш вариант.

Цитата
"StepOffset6=0" меняется на "StepOffset6=4", то через временной интервал (1сек.) значение в ячейке обновилось с "0" на "8" автоматически
Если 0 изменился на 4 то в окне 0 менять на 8?

оу, сори ошибся, канешно же "4"))


Добавлено:
Сообщение автоматически объединено:

Да, всё отлично работает.) Спасибо за помощь SECTOR.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
а зачем из ini файла считывать обычным образом? ведь есть функции для этого
 

SECTOR

Продвинутый
Сообщения
399
Репутация
59
а зачем из ini файла считывать обычным образом? ведь есть функции для этого
Мне кажется, что над этотим файлом работает ещё какой то процесс, раз значения в нем меняются ;)

А читать его функциями Ini* не получится, так как нет секций :smile:
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
SECTOR [?]
Мне кажется, что над этотим файлом работает ещё какой то процесс, раз значения в нем меняются
и что? читать столько раз, сколько надо
А читать его функциями Ini* не получится, так как нет секций
тут два варианта
1. добавить секции, пусть хоть всего один, это рояли не играет
2. либо это не ini, т.к. у ini есть минимальный набор требований к структуре
 
Автор
Fazatron

Fazatron

veni...vidi...vici...
Сообщения
18
Репутация
0
Мне кажется, что над этотим файлом работает ещё какой то процесс, раз значения в нем меняются
Да, это так файл, лежит в корне директории программы (она в неё и записывает данные), управляющей 4-х метровым принтером(для широкоформатной печати), но софтина написана китайцами и не очень удобная. Для того чтобы увидеть эти данные (которые я вывел в окно своей утилиты) нужно открыть настройки и выбрать нужную закладку(не оперативно), при этом теряется контроль над принтером(остановить или запустить печать невозможно).

2. либо это не ini, т.к. у ini есть минимальный набор требований к структуре
вот полное имя файла: setup-A3308F KM512-42PL-PCI08.ini, я возможно понел какие ini, ты имеешь в виду, типа бинарные, которые содержат важные символы и редактировать их можно только с помощью специальных редакторов с подсветкой синтаксиса (Notepad2 или Notepad++)

ps// Вообще Autoit я знаю пока очень плохо и эту прогу я методом тыка собрал. Очень хочу в ней разбираться. Спасибо за помощь, хотя некоторые вещи я и не понел(наприм про секции).

Теперь думаю как реализовать лог для этой программы, тоже очень нужен…
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Fazatron
файл который ты прикрепил полноценный ini, с секциями и прочим. поэтому пользуйся
Код:
INIRead



Добавлено:
Сообщение автоматически объединено:

Fazatron [?]
я возможно понел какие ini, ты имеешь в виду, типа бинарные, которые содержат важные символы и редактировать их можно только с помощью специальных редакторов с подсветкой синтаксиса (Notepad2 или Notepad++)
нет, я имел в виду вовсе не это. ini-файл имеет структуру
Код:
[section1]
key1 = value1
key2 = value2
[section2]
key3 = value3
key4 = value4
# и т.д.
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Fazatron
Немного сократил код

Код:
Opt("GUICoordMode", 2)
AdlibRegister('_Update', 1000)
Global $k=5, $aInp[$k+1], $sFile = @ScriptDir & '\setup-A3308F    KM512-42PL-PCI08.ini'
Global $txt[$k+1]=[$k, _
'2 pass', _
'3 pass', _
'4 pass', _
'6 pass', _
'8 pass']

GUICreate("Feet Viewer", 210, 58)
GUISetCoord(10, 8)
For $i = 1 to $k
	GUICtrlCreateLabel($txt[$i], 0, -1, 40)
Next
GUISetCoord(-40, 25)
For $i = 1 to $k
	$aInp[$i]=GUICtrlCreateInput('', 10, -1, 30, 20)
Next
_Update()
GUISetState()
Do
Until GUIGetMsg()=-3

Func _Update()
    Local $sText = FileRead($sFile)
	For $i = 1 to $k
		GUICtrlSetData($aInp[$i], StringRegExpReplace($sText, '(?s).*?\QStepOffset'&$i+1&'\E=(\d+)\r\n?.*', '\1'))
	Next
EndFunc
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
AZJIO
OffTopic:
и ты читаешь ini файл парсингом каждой строки? ;D
вот уж не подумал бы :smile:
 
Автор
Fazatron

Fazatron

veni...vidi...vici...
Сообщения
18
Репутация
0
Kaster, спасибо за функцию, как раз то что нужно, потренеруюсь), перерыл кучу постов, ниразу не встретил(

AZJIO, спасибо за код, на вид хорошая оптимизация), мне бы нубу ещё понять твоё решение...

ps//...существует ли серьёзный учебник(на русском)? как все учатся вообще?
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Fazatron
На код с логом

Код:
#Include <File.au3>
Opt("GUICoordMode", 2)
AdlibRegister('_Update', 1000)
Global $k=5, $aInp[$k+1], $sIni = @ScriptDir & '\setup-A3308F    KM512-42PL-PCI08.ini', $sLogPath=@ScriptDir & '\printer.log'
Global $txt[$k+1]=[$k, _
'2 pass', _
'3 pass', _
'4 pass', _
'6 pass', _
'8 pass']

GUICreate("Feet Viewer", 210, 58)
GUISetCoord(10, 8)
For $i = 1 to $k
	GUICtrlCreateLabel($txt[$i], 0, -1, 40)
Next
GUISetCoord(-40, 25)
For $i = 1 to $k
	$aInp[$i]=GUICtrlCreateInput('', 10, -1, 30, 20)
Next
_Update()
GUISetState()
Do
Until GUIGetMsg()=-3

Func _Update()
    Local $tmp, $sLogMsg
	For $i = 1 to $k
		$tmp=IniRead($sIni, 'HEADALIGNMENT', 'StepOffset'&$i+1, 'NotFound')
		GUICtrlSetData($aInp[$i], $tmp)
		$sLogMsg&=$tmp&' - '
	Next
	_FileWriteLog($sLogPath, $sLogMsg, 1)
EndFunc

Kaster
когда я читал сообщение о ini не было толком известно, да и в качестве фичи я хотел показать цикл и GUICoordMode
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Fazatron [?]
ps//...существует ли серьёзный учебник(на русском)? как все учатся вообще?
нет, серьезного нету, ни на русском, ни на каком-либо другом языке. справка – главный учебник. причем на английском. по поводу перевода тебе подскажет AZJIO, т.к. он активно занимается ею
 
Автор
Fazatron

Fazatron

veni...vidi...vici...
Сообщения
18
Репутация
0
AZJIO, канешно класно что ты прикрутил ещё и лог. Но я имел ввиду лог для программы управления принтером. Я заметил что во время печати файла, в другом уже *.ini файле он прописывается(в формате key2 = value2(имя файла)). Вот я и думаю как реализовать это.


Добавлено:
Сообщение автоматически объединено:

... по поводу перевода тебе подскажет AZJIO, т.к. он активно занимается ею

а что русский хелп AutoIt3_2_5_4_ru.chm разве плох? я пытался с ним разбиратся...
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
AZJIO [?]
если активно использовать этот ini то за каждым параметром нужно открывать файл. Если прочитать 60 параметров, то 60 раз нужно прочитать файл, да ещё каждую секунду. Проще один раз открыть и всё остальное сделать в памяти.
Посмотри на IniString UDF.
 
Верх