Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Работа со строками и циклами (http://forum.oszone.net/showthread.php?t=267794)

eus_deus 09-09-2013 21:43 2215265

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

Creat0R 10-09-2013 01:54 2215373

Цитата:

Цитата 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)


eus_deus 10-09-2013 13:20 2215577

Цитата:

Цитата 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) »

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

Creat0R 10-09-2013 18:08 2215739

Цитата:

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

Это и не удивительно, если в буфере обмена нет нужного кода.
Замени ClipGet() на GUICtrlRead($Edit1).

eus_deus 10-09-2013 18:43 2215756

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

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

0
-1

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

eus_deus 10-09-2013 19:21 2215776

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

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

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

Dm666 11-09-2013 02:06 2215909

eus_deus,
А можно узнать, зачем все это надо?
Уважаю и TC и AutoIt, не первый год обоими пользуюсь. Но зачем надо делать подобные преобразования - ума не приложу. Вдруг мне тоже надо? :)

eus_deus 11-09-2013 11:16 2216015

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 строка
Для случая, когда в поле одна кнопка, я пример писал рабочий. Как сделать это в цикле?

Creat0R 11-09-2013 12:46 2216060

Цитата:

Цитата 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)


eus_deus 11-09-2013 14:46 2216096

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

eus_deus 11-09-2013 15:36 2216124

Я опять сюда. Итак, после модернизации функция выглядит так
Код:

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


Creat0R 11-09-2013 16:14 2216154

Код:

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


eus_deus 11-09-2013 17:05 2216185

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

Creat0R 11-09-2013 18:10 2216231

Поправил.

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

Код:

#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


eus_deus 11-09-2013 18:27 2216244

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

Creat0R 12-09-2013 08:23 2216484

Цитата:

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

Au3ToPost


Время: 07:31.

Время: 07:31.
© OSzone.net 2001-