Что нового

Запись в определенную строку файла при помощи функции _FileWriteToLine

DR_ALF

Новичок
Сообщения
16
Репутация
0
Делаю проект под программу построения графиков Gnuplot, думаю это можно сделать и средствами Autoit,
но интересно разобраться именно с надстройкой в виде скрипта для работы с конфигурационным файлом программы.

Задача: На диске есть папка E:\results, в котрую другая программа пишет файлы такого рода 2018_05_22.csv, 2018_05_23.csv...
Пользователь через меню-календарь выбирает число, программа записывает его как год_месяц_число в 13-ю строчку файла начиная с 18 символа.
При каждом таком действии пользователя, если выбрано иное число нужно перезаписывать эти данные в файле.

Содержание файла:
set yrange [0:150]
set title "Сливки"
set border 3
set xtics nomirror
set ytics nomirror
set :rofl:ata time
set timefmt '%H:%M'
set datafile separator ';'
set xlabel "Время"
set ylabel "Температура"
set grid
unset key
plot 'E:\results\2018_05_22_.csv' using 1:2 smooth bezier linecolor -1 linewidth 2
Расширение файла .plt


Мне пока удалось сделать упрощенный пример через FileWrite, естественно только в 1-ю строку файла, а запись в файл по нажатию горячей клавиши.
Подскажите как это можно реализовать через _FileWriteToLine как описано в задаче.
Код:
#include <GUIConstantsEx.au3>
#include <Date.au3>
#include <File.au3>

Dim $date1, $msg, $dd1, $hGUI, $file
$file = FileOpen("test.txt", 1)
$hGUI = GUICreate ( "Установите дату", 450, 254)
$date1 = GUICtrlCreateDate(@MDAY & '\' & @MON & '\' & @YEAR, 20, 32, 100, 20, 0x00) ;Создает строку 

с выбором даты
GUISetState()
HotKeySet("a", "_func1")

Func _func1()
_FileWriteToLine($file, 3, $dd1, 1)
  ;FileWrite($file, $dd1)
EndFunc

While 1
    Sleep(10)
	$msg = GUIGetMsg()
	If $msg = $GUI_EVENT_CLOSE Then ExitLoop
	
	$dd1 = String(GUICtrlRead($date1, 1))
	
WEnd


Хотел сам написать необходимую программу, но из-за неполного понимания концепции построения программы прошу помощи в разъяснении некоторых нижеописанных ситуаций.

Если выражение
Код:
$dd1 = String(GUICtrlRead($date1, 1))
вытянуть из цикла While в основное тело программы,
- функция GUICtrlRead забирает данные из переменной $dd1 только один раз. т.е. прошла инициализация и дальше нужно снова перезапускать программу.
В то же время GUICtrlCreateDate находится тут же рядом и тоже за пределами цикла, но остается активной, позволяет работать с данными в меню-календаре.
Как я это понимаю для нее достаточно просто инициализации, из-за того что - эта функция входит в состав GUI-библиотеки, и она своим кодом запускает стандартный встроенный в винду системный процесс рисуя окно, чекбокс, и пользователь уже с ним работает.

Выражение
Код:
FileWrite($file, $dd1)
нормально считывает и обновляет данные из переменной $dd1. Это получается из-за того что оно находится в функции Func ... EndFunc?
Но она ведь сама не в цикле...
Получается все что находится внутри функции обновляет свои данные? Но почему тогда не работает на этом же самом месте
Код:
_FileWriteToLine($file, 3, $dd1, 1)?


Во всех вышеописанных случаях компилятор не выдает ошибок и программа работает по разному. Может это конечно фича а не баг, но как мне понять что я правильно установил выражение в нужную позицию программы. Идет ли обновление переменных в теле функции или еще где то такой нюанс может быть.
Есть ли какой-то общепринятый устоявшийся стиль,- система по которой нужно построить программу.
В справке в основном описание функций, их опций и синтаксиса.
На форуме нашел один пример, так же применяется _FileWriteToLine. Но у меня не получается по нему.

Чтобы понять про что я хочу спросить, опишу на примере упрощенного Си-подобного языка Ардуино.
В нем конкретно написан краткий принцип действия программы:
Функция setup() запускается при старте программы. Она инициализирует и устанавливает первоначальные значения, вызывается только один раз.
После вызова setup(), функция loop() крутится в цикле, позволяя программе совершать вычисления и реагировать на них.
Все написанные функции нужно объявить в loop чтобы он их дергал.

Ткните где можно почитать, мне бейсик для написания в Autoit нужно более менее хорошо знать? а то вопросов наслоилось много
 

hedji

Продвинутый
Сообщения
409
Репутация
94
Код:
#include <GUIConstantsEx.au3>
#include <Date.au3>
#include <File.au3>

Dim $date1, $msg, $dd1, $hGUI, $file

$hGUI = GUICreate ( "Установите дату", 450, 254)
$date1 = GUICtrlCreateDate(@MDAY & '\' & @MON & '\' & @YEAR, 20, 32, 100, 20, 0x00) ;Создает строку с выбором даты
GUISetState()
HotKeySet("a", "_func1")

Func _func1()
$dd1 = String(GUICtrlRead($date1, 1)) ;считываем строку при каждом вызове функции, чтобы не перезапускать программу
_FileWriteToLine("test.txt", 3, $dd1, 1) ;указываем не переменную файла, а путь к файлу
EndFunc

While 1
    $msg = GUIGetMsg()
    If $msg = $GUI_EVENT_CLOSE Then ExitLoop
WEnd


Про GUI почитать здесь
В Setup() засунуть вообще все, в loop() (в данном случае это цикл While) оставить только постоянный опрос кнопок, в данном примере интересует только опрос кнопки закрытия программы ("крестик"). Если вместо горячей клавиши "а" сделать кнопку, то её также необходимо будет опрашивать в цикле.
 
Автор
D

DR_ALF

Новичок
Сообщения
16
Репутация
0
hedji спасибо за разъяснения и рабочий пример кода.
Немного допилил функцию обработки строки, все работает как нужно.

Код:
Func _func1()
$dd1 = String(GUICtrlRead($date1, 1)) ;считываем строку при каждом вызове функции, чтобы не перезапускать программу
$dd2 = StringRegExpReplace($dd1, "[.]", "_") ;заменяем точки на символ нижнего подчёркивания
$dd3 = _StringReverse($dd2)
_FileWriteToLine("test.txt", 3, _StringInsert("plot 'E:\results\_.csv' using 1:2 smooth bezier linecolor -1 linewidth 2", $dd3, 17), 1)
EndFunc


Подскажите еще - как перевернуть строку 01_06_2018 и привести ее к такому виду 2018_06_01, т.е чтобы первым шел год?

через
Код:
_StringReverse($dd2)
на выходе получаю: 8102_60_10
 

joiner

Модератор
Локальный модератор
Сообщения
3,557
Репутация
628
Код:
Local $sString = '01_06_2018'
Local $aString = StringSplit($sString, '_', 2)
_ArrayReverse($aString)
$sString = _ArrayToString($aString, '_')
MsgBox(0,'', $sString)
 
Автор
D

DR_ALF

Новичок
Сообщения
16
Репутация
0
InnI спасибо, для расширения кругозора так же возьму этот пример на заметку.

Так реализовал на основе примера joiner
Код:
Func _func1()
$dd1 = String(GUICtrlRead($date1, 1))
$aString = StringSplit($dd1, '.', 2)
_ArrayReverse($aString)
$sString = _ArrayToString($aString, '_')
_FileWriteToLine("test.txt", 3, _StringInsert("plot 'E:\results\_.csv' using 1:2 smooth bezier linecolor -1 linewidth 2", $sString, 17), 1)
EndFunc


Поставил на комп обучалку в виде игры - Human Resource Machine - многое стало понятно.
В ней общие принципы работы программы и взаимодействие узлов компа хорошо показаны.
Просто на словах эти абстракции бывает сложно объяснить или представить.

Благодарю всех за помощь.
 
Верх