Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Работа со строками и циклами

Ответить
Настройки темы
[решено] Работа со строками и циклами

Старожил


Сообщения: 156
Благодарности: 1


Конфигурация

Профиль | Отправить PM | Цитировать


Добрый вечер! Подбросили мне идею, и начало кода, который у меня не заработал. Итак, имеем текст в текстовом поле $Edit1

Код: Выделить весь код
TOTALCMD#BAR#DATA
%COMMANDER_PATH%\Programs\Players\AIMP3\AIMP3.exe

%COMMANDER_PATH%\Wcmicons.dll,387
AIMP3

0
-1
Это код кнопки файлового менеджера Total commander/ Код нужно конвертировать в строку

Код: Выделить весь код
MENUITEM AIMP3#!#387#!#%COMMANDER_PATH%\Programs\Players\AIMP3\AIMP3.exe
С этим прекрасно справляется функция
Код: Выделить весь код
Func _Convert()
    Local $s_Read, $s_Ico,  $s_NewString
    $Config=IniRead ($INICONV, "Setting", "Config", 1) 
    $s_result=GUICtrlRead($Edit2)
    GUICtrlSetData($Edit2,"")
    Switch $Config
Case '1'
$s_NewString="MENUITEM "
Case '0'
$s_NewString="M "
EndSwitch
    $s_Read =StringSplit(GUICtrlRead($Edit1),@CRLF,1)
    If $s_Read[0] < 5 Then Return
    
    If StringInStr ( $s_Read[4], "wcmicons.dll") then
    $s_Ico = StringRegExpReplace($s_Read[4], '^.*,', '')
    Else 
    $s_Ico=$s_Read[4]
    Endif
    
    $s_NewString &=$s_Read[5] & $Delimeters & $s_Ico&$Delimeters & $s_Read[2] & StringRegExpReplace(   $Delimeters & $s_Read[3], $Delimeters & '$|\s+', '')
    GUICtrlSetData($Edit2, $s_result&$s_NewString& @CRLF)
    _GUICtrlEdit_Scroll($Edit2, $SB_SCROLLCARET )
    GUICtrlSetData($Edit1, "")
    EndFunc
Но это все работает только для кода одной кнопки, а если их несколько, то как быть? Чтобы загнать 10 кнопок, нажать на кнопку, и на выходе получить 10 строк вида
Код: Выделить весь код
MENUITEM ..................
Подкинули начало функции
Код: Выделить весь код
Func _Convert2()
$sSect='TOTALCMD#BAR#DATA'
$Edit1=StringReplace($Edit1,$sSect,'['&$sSect&']')
$aC=StringRegExp($Edit1,'(?m)^\[[^]\r\n]+\].*(?:[\r\n]+[^[\r\n][^\r\n]+)*', 3)

For $i=0 To UBound($aC)
MsgBox(4096, "Переменная ", "$aC =>" & $aC[$i] & "<=")
Next
EndFunc
Строка MsgBox(4096, "Переменная ", "$aC =>" & $aC[$i] & "<=") выдает ошибку, хотя она там по сути и не нужна

Отправлено: 21:43, 09-09-2013

 

Старожил


Сообщения: 156
Благодарности: 1

Профиль | Отправить PM | Цитировать


Я опять сюда. Итак, после модернизации функция выглядит так
Код: Выделить весь код
Func _Convert2()
Local $sMenuItems
$Config=IniRead ($INICONV, "Setting", "Config", 1) 
$vTest = GUICtrlRead($Edit1)
$s_result=GUICtrlRead($Edit2)
GUICtrlSetData($Edit2,"")
$aData = StringRegExp($vTest, '(?s)BAR#DATA\s+(.+?)(?:TOTALCMD#|$)', 3)
    Switch $Config
Case '1'
$sMenuItems="MENUITEM "
Case '0'
$sMenuItems="M "
EndSwitch
For $i = 0 To UBound($aData)-1
    $aParams = StringSplit(StringStripCR($aData[$i]), @LF)

    If $aParams[0] >= 4 Then
        If StringInStr($aParams[3], 'wcmicons.dll') Then
            $aParams[3] = StringRegExpReplace($aParams[3], '.*?(-?\d+)', '\1')
        EndIf

        $sMenuItems &=$aParams[4] & $Delimeters & $aParams[3] & $Delimeters & $aParams[1] & $Delimeters & $aParams[2]&@CRLF
    EndIf
    GUICtrlSetData($Edit2, $s_result&$sMenuItems)
    _GUICtrlEdit_Scroll($Edit2, $SB_SCROLLCARET )
    GUICtrlSetData($Edit1, "")
    Next
EndFunc
Не устраивает два пункта:
1. Потеря menuitem после первой строки ( есть только в первой, в остальных нет)
2. В конце строк не должно быть #!# ( записанного в переменную $Delimeters)

1 вопрос решен. остался второй - удаление $Delimeters на конце строки.
Код: Выделить весь код
Func _Convert2()
$sMenuItems=''
$Config=IniRead ($INICONV, "Setting", "Config", 1) 
$vTest = GUICtrlRead($Edit1)
$s_result=GUICtrlRead($Edit2)
GUICtrlSetData($Edit2,"")
$aData = StringRegExp($vTest, '(?s)BAR#DATA\s+(.+?)(?:TOTALCMD#|$)', 3)
For $i = 0 To UBound($aData)-1
   $aParams = StringSplit(StringStripCR($aData[$i]), @LF)

   If $aParams[0] >= 4 Then
        If StringInStr($aParams[3], 'wcmicons.dll') Then
            $aParams[3] = StringRegExpReplace($aParams[3], '.*?(-?\d+)', '\1')
        EndIf
    Switch $Config
Case '1'
        $sMenuItems &="MENUITEM "&$aParams[4] & $Delimeters & $aParams[3] & $Delimeters & $aParams[1] & $Delimeters & $aParams[2]&@CRLF
Case '0'
        $sMenuItems &="M "&$aParams[4] & $Delimeters & $aParams[3] & $Delimeters & $aParams[1] & $Delimeters & $aParams[2]&@CRLF
EndSwitch
    EndIf
    GUICtrlSetData($Edit2, $s_result&$sMenuItems)
    _GUICtrlEdit_Scroll($Edit2, $SB_SCROLLCARET )
    GUICtrlSetData($Edit1, "")
   Next
EndFunc

Отправлено: 15:36, 11-09-2013 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


Код: Выделить весь код
Func _Convert2()
    $sDelimiters = '#!#'
    $sMenuItems = ''

    $iConfig = Int(IniRead($INICONV, 'Setting', 'Config', 1))
    $sData1 = GUICtrlRead($Edit1)
    $sData2 = GUICtrlRead($Edit2)

    GUICtrlSetData($Edit2, '')

    $aData = StringRegExp($sData1, '(?s)BAR#DATA\s+(.+?)(?:TOTALCMD#|$)', 3)

    For $i = 0 To UBound($aData) - 1
        $aParams = StringSplit(StringStripCR($aData[$i]), @LF)

        If $aParams[0] >= 4 Then
            If StringInStr($aParams[3], 'wcmicons.dll') Then
                $aParams[3] = StringRegExpReplace($aParams[3], '.*?(-?\d+)', '\1')
            EndIf

            $sMItem = 'M '

            If $iConfig = 1 Then
                $sMItem = 'MENUITEM '
            EndIf

            $sMItem &= $aParams[4] & $sDelimiters & $aParams[3] & $sDelimiters & $aParams[1] & $sDelimiters & $aParams[2]
            $sMItem = StringRegExpReplace($sMItem, '(\Q' & $sDelimiters & '\E){2,}', $sDelimiters) ;Заменяем два или более присутствующих разделителей на один
            $sMenuItems &= StringRegExpReplace($sMItem, '\Q' & $sDelimiters & '\E\h*$', '') & @CRLF ;Удаляем разделитель на конце строки
        EndIf

        GUICtrlSetData($Edit2, $sData2 & $sMenuItems)
        _GUICtrlEdit_Scroll($Edit2, $SB_SCROLLCARET)
        GUICtrlSetData($Edit1, '')
    Next
EndFunc

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Последний раз редактировалось Creat0R, 11-09-2013 в 18:08.


Отправлено: 16:14, 11-09-2013 | #12


Старожил


Сообщения: 156
Благодарности: 1

Профиль | Отправить PM | Цитировать


Creat0R, нет. Разделитель на конце есть, и все параметры идут одной строкой. цельной

Отправлено: 17:05, 11-09-2013 | #13


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


Поправил.

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

Код: Выделить весь код
#include <GUIConstantsEx.au3>
#include <ScrollbarConstants.au3>
#include <GUIEdit.au3>

$INICONV = @ScriptDir & '\test.ini'
$sCode = ClipGet()

$hGUI = GUICreate('', 400, 600)

$Edit1 = GUICtrlCreateEdit($sCode, 20, 20, 200, 200)
$Edit2 = GUICtrlCreateEdit('', 20, 320, 200, 200)

GUISetState(@SW_SHOW, $hGUI)

_Convert2()

While 1
    $nMsg = GUIGetMsg()

    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

Func _Convert2()
    $sDelimiters = '#!#'
    $sMenuItems = ''

    $iConfig = Int(IniRead($INICONV, 'Setting', 'Config', 1))
    $sData1 = GUICtrlRead($Edit1)
    $sData2 = GUICtrlRead($Edit2)

    GUICtrlSetData($Edit2, '')

    $aData = StringRegExp($sData1, '(?s)BAR#DATA\s+(.+?)(?:TOTALCMD#|$)', 3)

    For $i = 0 To UBound($aData) - 1
        $aParams = StringSplit(StringStripCR($aData[$i]), @LF)

        If $aParams[0] >= 4 Then
            If StringInStr($aParams[3], 'wcmicons.dll') Then
                $aParams[3] = StringRegExpReplace($aParams[3], '.*?(-?\d+)', '\1')
            EndIf

            $sMItem = 'M '

            If $iConfig = 1 Then
                $sMItem = 'MENUITEM '
            EndIf

            $sMItem &= $aParams[4] & $sDelimiters & $aParams[3] & $sDelimiters & $aParams[1] & $sDelimiters & $aParams[2]
            $sMItem = StringRegExpReplace($sMItem, '(\Q' & $sDelimiters & '\E){2,}', $sDelimiters) ;Заменяем два или более присутствующих разделителей на один
            $sMenuItems &= StringRegExpReplace($sMItem, '\Q' & $sDelimiters & '\E\h*$', '') & @CRLF ;Удаляем разделитель на конце строки
        EndIf

        GUICtrlSetData($Edit2, $sData2 & $sMenuItems)
        _GUICtrlEdit_Scroll($Edit2, $SB_SCROLLCARET)
        GUICtrlSetData($Edit1, '')
    Next
EndFunc

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community

Это сообщение посчитали полезным следующие участники:

Отправлено: 18:10, 11-09-2013 | #14


Старожил


Сообщения: 156
Благодарности: 1

Профиль | Отправить PM | Цитировать


Creat0R, понял, пример максимальные пояснения с меня. Объясни еще , как ты с такой расцветкой код вставляешь?

Отправлено: 18:27, 11-09-2013 | #15


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


Цитата eus_deus:
как ты с такой расцветкой код вставляешь? »
Au3ToPost

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community

Это сообщение посчитали полезным следующие участники:

Отправлено: 08:23, 12-09-2013 | #16



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Работа со строками и циклами

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Разное - [решено] Работа со строками txt файла. kirillgoogle Программирование и базы данных 16 26-06-2012 14:00
VBA - Работа со строками zena Программирование и базы данных 5 21-02-2011 09:03
C/C++ - [решено] Работа со строками. Буфер содержит нуль-терминатор Dr.Dark Программирование и базы данных 5 29-08-2010 16:13
C/C++ - [решено] Работа с строками crashtuak Программирование и базы данных 16 26-03-2009 01:21
CMD/BAT - [решено] Работа со строками в cmd-файлах melato Скриптовые языки администрирования Windows 3 30-01-2007 08:52




 
Переход