PDA

Показать полную графическую версию : [решено] Как загнать в массив содержание текстового поля


eus_deus
04-09-2013, 12:01
Привет! Снова я! Говорю сразу - по этому вопросу у меня нет ни строчки кода, это может быть и не массив. Постараюсь задачу обрисовать поподробнее. Итак, имеем текстовое поле с секциями и параметрами, наподобие файла ini.
Нужно - массовое изменение начала строк, вне зависимости от их количества.
Пример поля
[Section]
Разделитель=!!!
S
А my_icons.dll!!!Image1
А my_icons.dll!!!Image2
А my_icons.dll!!!Image3
E
1.Разделитель во второй строке меняется отдельно, но как его сразу сменить во всем содержимом поля?
2.Буквы A ,E, S должны тоже меняться во всем поле на Action, end, и Sepup cсоответствнно.
Мне в двух словах сказали, что надо все поле загонять в массив, и по циклу делать замену. Может, сказали неправильно

Creat0R
04-09-2013, 17:47
Как то так:

#include (http://autoit-script.ru/autoit3_docs/keywords.htm##include) <GUIConstantsEx.au3>

$hGUI = GUICreate (http://autoit-script.ru/autoit3_docs/functions/GUICreate.htm)('Test Script', 300, 200)

$iReplace_Bttn = GUICtrlCreateButton (http://autoit-script.ru/autoit3_docs/functions/GUICtrlCreateButton.htm)('Replace', 20, 10, 70, 20)
$iEdit = GUICtrlCreateEdit (http://autoit-script.ru/autoit3_docs/functions/GUICtrlCreateEdit.htm)(ClipGet (http://autoit-script.ru/autoit3_docs/functions/ClipGet.htm)(), 20, 40, 260, 140)

GUISetState (http://autoit-script.ru/autoit3_docs/functions/GUISetState.htm)(@SW_SHOW (http://autoit-script.ru/autoit3_docs/macros.htm#@sw_show), $hGUI)

While (http://www.autoitscript.com/autoit3/docs/keywords.htm#While) 1
Switch (http://www.autoitscript.com/autoit3/docs/keywords.htm#Switch) GUIGetMsg (http://autoit-script.ru/autoit3_docs/functions/GUIGetMsg.htm)()
Case (http://www.autoitscript.com/autoit3/docs/keywords.htm#Case) $GUI_EVENT_CLOSE
Exit (http://www.autoitscript.com/autoit3/docs/keywords.htm#Exit)
Case (http://www.autoitscript.com/autoit3/docs/keywords.htm#Case) $iReplace_Bttn
$sData = GUICtrlRead (http://autoit-script.ru/autoit3_docs/functions/GUICtrlRead.htm)($iEdit)

$sData = StringRegExpReplace (http://autoit-script.ru/autoit3_docs/functions/StringRegExpReplace.htm)($sData, '(?m)^A\b', 'Action')
$sData = StringRegExpReplace (http://autoit-script.ru/autoit3_docs/functions/StringRegExpReplace.htm)($sData, '(?m)^E\b', 'End')
$sData = StringRegExpReplace (http://autoit-script.ru/autoit3_docs/functions/StringRegExpReplace.htm)($sData, '(?m)^S\b', 'Setup')
$sData = StringRegExpReplace (http://autoit-script.ru/autoit3_docs/functions/StringRegExpReplace.htm)($sData, '(?<!=)!!!', '=') ;Не понятно на что, и где менять

GUICtrlSetData (http://autoit-script.ru/autoit3_docs/functions/GUICtrlSetData.htm)($iEdit, $sData)
EndSwitch (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndSwitch)
WEnd (http://www.autoitscript.com/autoit3/docs/keywords.htm#WEnd)

eus_deus
05-09-2013, 08:32
Creat0R, спасибо, попробую вечером у себя

eus_deus
05-09-2013, 14:25
А кто подскажет доступный и понятный для чайников мануал по регулярным выражениям? Читал в справке - наверное, я тупой и не понял... Как их правильно строить? С чего начинать? Прошу прощения за оффтоп...

madmasles
05-09-2013, 16:11
eus_deus,
Почитайте эту тему Уроки по работе с Регулярными Выражениями (RegExp) (http://autoit-script.ru/index.php/topic,4901.0.html)

eus_deus
05-09-2013, 17:56
madmasles, хорошо, спасибо, посмотрю

eus_deus
05-09-2013, 18:13
Creat0R, код помог почти во всем, кроме одного вопроса. Описываю насколько могу точно.
$sData = StringRegExpReplace($sData, '(?<!=)!!!', '=') ;Не понятно на что, и где менять »
Касательно этой строки - !!!, которые требуется менять, содержаться в настройках в ини файле. Считывается функцией
$Delimeters=IniRead($INICONV, "Setting", "Delimeters", 1)
Проблема в том, что там могут быть любые три символа, и в stringexpraplace надо передать именно переменную

eus_deus
05-09-2013, 19:31
Радовался, думал помогло. Итак, по воспросу, который я писал сообщением выше.Есть функция
Func _delim()
$new_name=InputBox("Переименовать разделитель","Введите разделитель команды",""," M3",200,130)
If @error Then Return
IniWrite ($INICONV, "Setting", "Delimeters", $new_name)
GUICtrlSetData($Input1,$new_name)
$sData = GUICtrlRead($Edit2)
$sData = StringRegExpReplace($sData, $Delimeters,$new_name )
GUICtrlSetData($Edit2,$sData)
EndFunc

В итоге переменная $Delimeters меняется во всем тексте, но только один раз. В чем может быть проблема?

Creat0R
06-09-2013, 00:25
Проблема в том, что там могут быть любые три символа, и в stringexpraplace надо передать именно переменную »
Не вижу проблему:

$vTest = 'А my_icons.dll!!!Image1' & @CRLF (http://autoit-script.ru/autoit3_docs/macros.htm#@crlf) & 'А my_icons.dll!!!Image2'

$sDelimiters = '!!!'
$sReplace = InputBox (http://autoit-script.ru/autoit3_docs/functions/InputBox.htm)("Переименовать разделитель", "Введите разделитель команды", "", " M3", 200, 130)
$sRet = StringReplace (http://autoit-script.ru/autoit3_docs/functions/StringReplace.htm)($vTest, $sDelimiters, $sReplace)

ConsoleWrite (http://autoit-script.ru/autoit3_docs/functions/ConsoleWrite.htm)($sRet & @LF (http://autoit-script.ru/autoit3_docs/macros.htm#@lf))

eus_deus
06-09-2013, 12:37
Creat0R, при первом нажатии кнопки работает, как и мой код выше. Но при последующих нажатиях результата нет. Подозреваю, что mtrcn надо как то обновлять

eus_deus
06-09-2013, 12:55
Вот код. При смене разделителя он должен менятся во всем тексте ($Edit2), в текстовом поле ($Input1) и должно перезаписываться значение параметра в ini файле ($Delimeters) - подозреваю, что запись в ini идет неправильно, но не знаю, где именно
Func _delim()
$new_name=InputBox("Переименовать разделитель","Введите разделитель команды",""," M3",200,130)
If @error Then Return
IniWrite ($INICONV, "Setting", "Delimeters", $new_name)
GUICtrlSetData($Input1,$new_name)
$sData = GUICtrlRead($Edit2)
$sData = StringReplace($sData, $Delimeters,$new_name )
ConsoleWrite($sData & @LF)
GUICtrlSetData($Edit2,$sData)
EndFunc

Все, отбой. Учусь же все таки. Итак, работает в моем случае такая функция
Func _delim()
$new_name=InputBox("Переименовать разделитель","Введите разделитель команды",""," M3",200,130)
If @error Then Return
IniWrite ($INICONV, "Setting", "Delimeters", $new_name)
GUICtrlSetData($Input1,$new_name)
$sData = GUICtrlRead($Edit2)
$sData = StringReplace($sData, $Delimeters,$new_name )
ConsoleWrite($sData & @LF)
$Delimeters=IniRead($INICONV,"Setting","Delimeters",1)
GUICtrlSetData($Edit2,"")
GUICtrlSetData($Edit2,$sData)
EndFunc

Вопрос считаю решенным!




© OSzone.net 2001-2012