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

Компьютерный форум 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

 

Аватара для Creat0R

Must AutoIt


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

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


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

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

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

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

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

Отправлено: 01:54, 10-09-2013 | #2



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

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


Старожил


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

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


Цитата 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) »
При этом коде - в результате пустое окно

Отправлено: 13:20, 10-09-2013 | #3


Аватара для Creat0R

Must AutoIt


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

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


Цитата eus_deus:
При этом коде - в результате пустое окно »
Это и не удивительно, если в буфере обмена нет нужного кода.
Замени ClipGet() на GUICtrlRead($Edit1).

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

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

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:08, 10-09-2013 | #4


Старожил


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

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


С кнопокой такого вида - не работает
Код: Выделить весь код
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:25.


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


Старожил


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

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


и необходимо условие
Код: Выделить весь код
 If StringInStr ( $s_Read[4], "wcmicons.dll") then
    $s_Ico = StringRegExpReplace($s_Read[4], '^.*,', '')
    Else 
    $s_Ico=$s_Read[4]
    Endif
Назначение - если в строке нет wcmicons.dll, то вставлять строку полностью, если содержит, то использовать только номер

Отправлено: 19:21, 10-09-2013 | #6


Новый участник


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

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


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

Отправлено: 02:06, 11-09-2013 | #7


Старожил


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

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


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

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


Аватара для Creat0R

Must AutoIt


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

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


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

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

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

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

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

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


Старожил


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

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


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

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



Компьютерный форум 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




 
Переход