Страница 16 из 27

Добавлено: Ср ноя 24, 2010 12:02
Flasher
Batya
А дальше, если ключ найден, то используем его в следующем методе.

Я в принципе вчера разобрался, что делать со значением переменной, чтобы выдёргивать нужный кусок. Конструкция Left("блабла", Len("блабла"-x). Но хотелось бы узнать именно, как работать с найденным ключём.

Добавлено: Ср ноя 24, 2010 13:17
Batya
Flasher писал(а):А дальше, если ключ найден, то используем его в следующем методе.
И в чём здесь проблема?
Flasher писал(а):Но хотелось бы узнать именно, как работать с найденным ключём.
Как угодно.
Можно, например, вывести его на экран ;)
Flasher писал(а):Left("блабла", Len("блабла")-x)
Здесь пропустил скобку.

Добавлено: Ср ноя 24, 2010 13:21
Flasher
Batya писал(а):И в чём здесь проблема?
Можно, например, вывести его на экран
Ну и как его вывести? Как вообще указывать найденное в дальнейших методах?

Добавлено: Ср ноя 24, 2010 13:35
Batya
Погоди, ты ничего не путаешь?
Элемент массива существует только при точном соответствии по ключу.
Т.е. здесь

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

A = "C:" 
B = "C:\1\1" 
C = "C:" 
D = "C:\1" 
E = "C:\2" 
Set List = CreateObject("Scripting.Dictionary") 
List.Add  A, "" 
List.Add  B, "" 
MsgBox List.Exists(C)
MsgBox List.Exists(D)
MsgBox List.Exists(E)
"Истина" будет выведена только в первом случае, в остальных двух - "Ложь".
Flasher писал(а):Как вообще указывать найденное в дальнейших методах?
В итоге, если найден элемент по переменной, используемой как ключ, то тебе и нужно дальше обрабатывать эту переменную.

Добавлено: Ср ноя 24, 2010 13:52
Flasher
Batya писал(а):Погоди, ты ничего не путаешь?
Элемент массива существует только при точном соответствии по ключу.
Ну это логично. А что я путаю?
Batya писал(а):В итоге, если найден элемент по переменной, используемой как ключ, то тебе и нужно дальше обрабатывать эту переменную.
Это я ещё вчера понял отсюда и реализовал. Просто я думал, что найденный элемент массива тоже можно как-то обрабатывать, а не только значение переменной, с которых совпал элемент массива.

Добавлено: Ср ноя 24, 2010 15:00
Batya
Flasher писал(а):Просто я думал, что найденный элемент массива тоже можно как-то обрабатывать, а не только значение переменной, с которых совпал элемент массива.
Не сваливай понятия в одну кучу.
Элемент массива - это сущность, которая обусловлена ключом и значением.
У элемента массива можно поменять как значение, так и ключ.
Если ты нашёл элемент массива по ключу, хранящемуся в переменной, то ты можешь обратиться к найденному элементу именно по этому ключу.

Короче, не надо абстракций.
Опиши конкретную задачу.

Добавлено: Пт ноя 26, 2010 05:33
Flasher
Batya
Упрёк понятен. Как ты уже, наверно, понял, скрипт с реализацией тут.
Вот поясни конкретно, что имеется в виду под "ты можешь обратиться к найденному элементу именно по этому ключу"? Т.е. ровно как было предписано изначально?
Тогда у меня другой вопрос: можно ли задавать значения в массиве в виде объектов/методов, а не текста, а потом обращаться к найденным значениям по соответствующим им ключам? Если да, то как это будет выглядеть?

Добавлено: Пт ноя 26, 2010 10:29
Batya
Flasher
Честно говоря, пока нет времени понять твою логику с кучей If-ов. Позже разберусь.
Пока только немного упростил твой скрипт:

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

' Reload TC with return to different directories types 
' and open archives 
' Requirements: Script Helper ActiveX for TC by Volniy 
' Parameters: "%X%P%Z" "%T" 
' Flasher (c) 
'================================= 
LP = WScript.Arguments(0) 
RP = WScript.Arguments(1) 

With CreateObject("TCScript.Helper") 
  .SendCommand "cm_ConfigSaveDirHistory" 
  L = Replace(.INIRead(.MainINI,  "LeftHistory",  "0",  ""), "/", "") 
  R = Replace(.INIRead(.MainINI,  "RightHistory",  "0",  ""), "/", "") 
  .SendCommand "cm_Exit", True 
End With 

LM = Left(L, Len(L)-(Len(LP)-1)) 
RM = Left(R, Len(R)-(Len(RP)-1)) 

Dim ListL, ListR, NameArr, N, Param, TCexe
Set ListL = CreateObject("Scripting.Dictionary") 
Set ListR = CreateObject("Scripting.Dictionary")
NameArr   = Array(&Ha, &H3, &H4, &H11, &H12)

With CreateObject("Shell.Application")
  For Each N In NameArr
    ListL.Add .NameSpace(N).Self.Path & "|" & LP , "" 
    ListR.Add .NameSpace(N).Self.Path & "|" & RP , "" 
  Next 
End With

If L="::|"&LP And ListR.Exists(R) Then 
  Param = "/L=""" & L  & """ /R=""" & RM & """"
ElseIf ListL.Exists(L) And R="::|"&RP Then 
  Param = "/L=""" & LM & """ /R=""" & R  & """"
ElseIf ListL.Exists(L) And ListR.Exists(R) Then 
  Param = "/L=""" & LM & """ /R=""" & RM & """"
ElseIf ListL.Exists(L) Then 
  Param = "/R=""" & R  & """ /L=""" & LM & """"
ElseIf ListR.Exists(R) Then 
  Param = "/L=""" & L  & """ /R=""" & RM & """"
Else 
  Param = "/L=""" & L  & """ /R=""" & R  & """"
End If 

TCexe = "%Commander_Path%\totalcmd.exe"
With CreateObject("WScript.Shell") 
  .Run """" & .ExpandEnvironmentStrings(TCexe) & """ " & Param, 0 
End With

WScript.Quit
Flasher писал(а):можно ли задавать значения в массиве в виде объектов/методов, а не текста, а потом обращаться к найденным значениям по соответствующим им ключам?
Значения ассоциированного массива могут быть любыми - и объектами, и другими массивами. Ключи же - не знаю, не пробовал.

Добавлено: Пт ноя 26, 2010 10:43
Flasher
Batya
А я ведь Arrow никогда не пользовался. Удобная функция. Спасибо! Теперь почаще буду смотреть в "Прочие функции". Про то, чтобы впихнуть всё в одну переменную сразу что-то не подумал. Логично ведь. :)
Не против, если я там свой скрипт заменю на переделанный?
Добавлено: ладно, я там просто ссылку на твой пост добавлю.
Batya писал(а):Ключи же - не знаю, не пробовал.
Про ключи-то я и не спрашиваю, как ты мог заметить, они в данном скрипте являются объектами. :wink:

Добавлено: Пт ноя 26, 2010 11:27
Volniy
The key is used to retrieve an individual item and is usually a integer or a string, but can be anything except an array.
Ключ (обычно это целочисленная переменная или строка) может быть чем угодно, кроме массива.

Добавлено: Пт ноя 26, 2010 11:53
Batya
Flasher писал(а):Про ключи-то я и не спрашиваю, как ты мог заметить, они в данном скрипте являются объектами.
Ты не прав. У тебя это строка, а не объект.
Flasher писал(а):А я ведь Arrow никогда не пользовался.
Не Arrow, а Array.
Flasher писал(а):Не против, если я там свой скрипт заменю на переделанный?
Не против.

Volniy
Спасибо за информацию.

Добавлено: Пт ноя 26, 2010 11:57
Flasher
Batya писал(а):У тебя это строка, а не объект.
Строка, использующая метод NameSpace объекта Shell. Что не так?
Batya писал(а):Не Arrow, а Array.
Ну описался. Прям обязательно было поправлять? :)

Добавлено: Пт ноя 26, 2010 12:02
Batya
Flasher писал(а):Строка, использующая метод NameSpace объекта Shell. Что не так?
Метод NameSpace объекта Shell возвращает строку. Соответственно, ключём массива является строка (а не объект). Не надо сваливать всё в кучу.
Flasher писал(а):Ну описался. Прям обязательно было поправлять?
На всякий случай.
Flasher писал(а):Про ключи-то я и не спрашиваю...
А значения в массивах у тебя пока пустые. (Это я тоже, на всякий случай.)

Добавлено: Пт ноя 26, 2010 12:14
Flasher
Batya писал(а):Соответственно, ключём массива является строка (а не объект). Не надо сваливать всё в кучу.
Да я специально не сваливаю. Я по понятным причинам только вникаю в нюансы терминологии. Ну что'ж, будем знать.
Напиши тогда, как будет выглядеть использование объектов в подобном массиве. Интересно стало.
Batya писал(а):А значения в массивах у тебя пока пустые.
Ну да. А они мне в данном случае и не нужны. Если бы я использовал ListL/R.Items(L/R), то другое дело.

Добавлено: Сб фев 12, 2011 19:26
Rodny
Альтернативой метода SetSrcPath (установить путь в панели-источнике TC) из Хелпера является только запуск через командную строку типа

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

.Run .ExpandEnvironmentStrings("%COMMANDER_PATH%\totalcmd.exe") & " /O /S /L=" & NewSrcPath
или есть ещё варианты?