[решено] Работа со строками и циклами

Аватара пользователя
eus_deus

[решено] Работа со строками и циклами

Сообщение eus_deus »

Добрый вечер! Подбросили мне идею, и начало кода, который у меня не заработал. Итак, имеем текст в текстовом поле $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] & "

Строка MsgBox(4096, "Переменная ", "$aC =>" & $aC[$i] & "
Аватара пользователя
eus_deus

Re: [решено] Работа со строками и циклами

Сообщение eus_deus »

Цитата eus_deus:



это все работает только для кода одной кнопки, а если их несколько, то как быть?
[решено] Работа со строками и циклами




Для начала хотя бы показать (код), как оно выглядит где есть несколько кнопок.



Хотя можно попробовать:





Код:

Код: Выделить всё

$vTest = ClipGet() ;Тут содержимое кода
;Get TOTALCMD#... blocks
$aData = StringRegExp($vTest, '(?s)BAR#DATA\s+(.+?)(?:TOTALCMD#|$)', 3)
$sMenuItems = ''
For $i = 0 To UBound($aData)-1
    $aParams = StringRegExp($aData[$i], '(.*)\r\n\r\n.*,(-?\d+)\r\n(.*)\r\n', 3)
    If UBound($aParams) >= 3 Then
        $sMenuItems &= 'MENUITEM ' & $aParams[2] & '#!#' & $aParams[1] & '#!#' & $aParams[0] & @CRLF
    EndIf
Next
MsgBox(64, 'Title', $sMenuItems)
Аватара пользователя
Creat0R

Re: [решено] Работа со строками и циклами

Сообщение Creat0R »

Цитата Creat0R:



Для начала хотя бы показать (код), как оно выглядит где есть несколько кнопок.
[решено] Работа со строками и циклами




Да вот так выглядит



Код:

Код: Выделить всё

TOTALCMD#BAR#DATA
%COMMANDER_PATH%\Programs\Players\AIMP3\AIMP3.exe
%COMMANDER_PATH%\Wcmicons.dll,387
AIMP3
0
-1
TOTALCMD#BAR#DATA
%COMMANDER_PATH%\Programs\Players\AIMP3\AIMP3.exe
%COMMANDER_PATH%\Wcmicons.dll,387
AIMP3
0
-1
TOTALCMD#BAR#DATA
%COMMANDER_PATH%\Programs\Players\AIMP3\AIMP3.exe
%COMMANDER_PATH%\Wcmicons.dll,387
AIMP3
0
-1

Используется один код одной кнопки, просто для наглядности.




Цитата Creat0R:



Хотя можно попробовать:

Код:

$vTest = ClipGet() ;Тут содержимое кода

;Get TOTALCMD#... blocks

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

$sMenuItems = ''

For $i = 0 To UBound($aData)-1

$aParams = StringRegExp($aData[$i], '(.*)\r\n\r\n.*,(-?\d+)\r\n(.*)\r\n', 3)

If UBound($aParams) >= 3 Then

$sMenuItems &= 'MENUITEM ' & $aParams[2] & '#!#' & $aParams[1] & '#!#' & $aParams[0] & @CRLF

EndIf

Next

MsgBox(64, 'Title', $sMenuItems)
[решено] Работа со строками и циклами




При этом коде - в результате пустое окно
Аватара пользователя
eus_deus

Re: [решено] Работа со строками и циклами

Сообщение eus_deus »

Цитата eus_deus:



При этом коде - в результате пустое окно
[решено] Работа со строками и циклами




Это и не удивительно, если в буфере обмена нет нужного кода.

Замени ClipGet() на GUICtrlRead($Edit1).
Аватара пользователя
Creat0R

Re: [решено] Работа со строками и циклами

Сообщение Creat0R »

С кнопокой такого вида - не работает



Код:

Код: Выделить всё

TOTALCMD#BAR#DATA
%COMMANDER_PATH%\Programs\Players\AIMP3\AIMP3.exe
%P%S
Wcmicons.dll,387
Открыть выделенные файлы\папки в AIMP3
0
-1

и menuitem ставиться только в первую строчку. не во все
Аватара пользователя
eus_deus

Re: [решено] Работа со строками и циклами

Сообщение eus_deus »

С кнопокой такого вида - не работает



Код:

Код: Выделить всё

TOTALCMD#BAR#DATA
%COMMANDER_PATH%\Programs\Players\AIMP3\AIMP3.exe
%P%S
Wcmicons.dll,387
Открыть выделенные файлы\папки в AIMP3
0
-1

и menuitem ставиться только в первую строчку. не во все
Аватара пользователя
eus_deus

Re: [решено] Работа со строками и циклами

Сообщение eus_deus »

и необходимо условие



Код:

Код: Выделить всё

 If StringInStr ( $s_Read[4], "wcmicons.dll") then
    $s_Ico = StringRegExpReplace($s_Read[4], '^.*,', '')
    Else 
    $s_Ico=$s_Read[4]
    Endif

Назначение - если в строке нет wcmicons.dll, то вставлять строку полностью, если содержит, то использовать только номер
Аватара пользователя
Dm666

Re: [решено] Работа со строками и циклами

Сообщение Dm666 »

Dm666, сомневаюсь, что тебе пригодится.


Цитата Dm666:



А можно узнать, зачем все это надо?
[решено] Работа со строками и циклами




Ну как сказать - делаю для себя сборку тотала, и мне нужен такой фуннкционал. Еще хочу выучить autoit? для этого нужна реальная задача. Скрипт "Привет мир" я писал только две недели назад, простые функции вроде clipget() и guictrlsetdata() вроде понятны, а вот конструкции такого вида


Цитата Creat0R:



For $i = 0 To UBound($aData)-1

$aParams = StringRegExp($aData[$i], '(.*)\r\n\r\n.*,(-?\d+)\r\n(.*)\r\n', 3)

If UBound($aParams) >= 3 Then

$sMenuItems &= 'MENUITEM ' & $aParams[2] & '#!#' & $aParams[1] & '#!#' & $aParams[0] & @CRLF

EndIf

Next
[решено] Работа со строками и циклами




для меня еще темный лес, равно как и регулярные выражения


Цитата Dm666:



Уважаю и TC и AutoIt, не первый год обоими пользуюсь.
[решено] Работа со строками и циклами




Тоже с тоталом знаком не первый год, но только в этом году решил копнуть поглубже



Итак, теперь дополнение к вопросу. Код кнопки тотала содержит 6-8 строк (в завимости от параметров)



Код:

Код: Выделить всё

TOTALCMD#BAR#DATA
"%COMMANDER_PATH%\Programs\Graphics\Photoshop\App\PhotoshopCS6\Photoshop.exe"
%P%S
%COMMANDER_PATH%\Wcmicons.dll,511
Открыть выбранные файлы в Photoshop
-1

или



Код:

Код: Выделить всё

TOTALCMD#BAR#DATA
%COMMANDER_PATH%\Programs\Players\AIMP3\AIMP3.exe
%P%S
Wcmicons.dll,387
Открыть выделенные файлы\папки в AIMP3
0
-1

Из этих строк нужна такая конструкция:



Код:

Код: Выделить всё

MENUITEM  5 cтрока#!#4 строка(с условием, о котором писал выше)#!#2 строка#!#3 строка

Для случая, когда в поле одна кнопка, я пример писал рабочий. Как сделать это в цикле?
Аватара пользователя
eus_deus

Re: [решено] Работа со строками и циклами

Сообщение eus_deus »

Цитата eus_deus:



теперь дополнение к вопросу
[решено] Работа со строками и циклами




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





Код:

Код: Выделить всё

$vTest = ClipGet() ;Тут содержимое кода
;Get TOTALCMD#... blocks
$aData = StringRegExp($vTest, '(?s)BAR#DATA\s+(.+?)(?:TOTALCMD#|$)', 3)
$sMenuItems = ''
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 &= 'MENUITEM ' & $aParams[4] & '#!#' & $aParams[3] & '#!#' & $aParams[1] & '#!#' & $aParams[2] & @CRLF
    EndIf
Next
MsgBox(64, 'Title', $sMenuItems)
Аватара пользователя
Creat0R

Re: [решено] Работа со строками и циклами

Сообщение Creat0R »

Creat0R, ну прости засранца)) Вроде ставлю задачу, вроде всае расписываю, а всегда чего то не хватает..Я просто не углядел, что коды у кнопок могут иметь разное количество строк...
Ответить

Вернуться в «AutoIt»