В рамках последнего обсуждения множественного вызова функции с двумя переменными ранее вертелась мысль избавления от сущностей, когда значением (или его частью) переменной может выступать имя самой переменной. Делается это простым присвоением через Execute:
Что это даёт? Ну, во-первых, в ряде случаев избавление от необходимости задействовать коллекцию или опять же вызывать процедуру/функцию для динамического присвоения (пример c GetRef см. ниже в одном и кодов).
Т.е. вместо того, чтобы придумывать переменные с присвоением им значений можно в цикле имплантировать значения в имена и там же обработать:
Вот простой пример экономии. Привычное представление
' Запись в 139 символов:
C = " класс"
C1 = "1" & C
C2 = "2" & C
C3 = "3" & C
C4 = "4" & C
C5 = "5" & C
C6 = "6" & C
C7 = "7" & C
C8 = "8" & C
C9 = "9" & C
переводим в
' Запись в 59 символов (полный аналог предыдущего):
For i = 1 To 9: Execute "C" & i & " = i & "" класс""" :Next
' Теперь у нас на руках все переменные C1-9 c данными. Т.е. их можно
' сравнивать, обрабатывать, вставлять в текст, перетасовывать и т.п.
' Пример:
MsgBox "Маша пошла в " & C5 & "." & vbCr & _
"Миша из " & C9 & "а решил сложную задачу по алгебре."
Или, предположим, мы располагаем списком значений, входящих в группу некого свойства объекта.
Примеры:
Set FSO = CreateObject("Scripting.FileSystemObject")
With CreateObject("WScript.Shell")
For i = 0 To .SpecialFolders.Count - 1
Path = .SpecialFolders(i)
Execute Replace(FSO.GetFileName(Path), " ", "") & " = Path"
Next
End With
WScript.Echo "делаем дела с папкой " & Fonts
WScript.Echo "делаем дела с папкой " & SendTo
Set Shell = CreateObject("Shell.Application")
GetVar("DirectoryServiceAvailable")("DoubleClickTime")("ProcessorLevel")_
("ProcessorSpeed")("ProcessorArchitecture")("PhysicalMemoryInstalled")
MsgBox "Частота процессора: " & vbTab & ProcessorSpeed & " MHz" & vbCr &_
"Физическая память: " & vbTab & PhysicalMemoryInstalled & " байт(а)"
Function GetVar(Var)
Execute Var & "= Shell.GetSystemInformation(Var)"
Set GetVar = GetRef("GetVar")
End Function
Set Track = CreateObject("WMPlayer.OCX")._
NewMedia("C:\Windows\winsxs\X80C99~1.163\SLEEPA~1.MP3")
For i = 0 To Track.AttributeCount - 1
Attr = Track.GetAttributeName(i)
Execute "i" & Replace(Attr, "WM/", "") & "= Track.GetItemInfo(Attr)"
Next
MsgBox "Номер: " & vbTab & iTrackNumber & vbCr & _
"Имя: " & vbTab & iTitle & vbCr & _
"Альбом: " & vbTab & iAlbumTitle & vbCr & _
"Автор: " & vbTab & iAuthor & vbCr & _
"Жанр: " & vbTab & iGenre & vbCr & _
"Год: " & vbTab & iYear, 4160, " MP3-теги"
File = "C:\Windows\winsxs\X828C9~1.163\RU-wp5.jpg"
Set Img = WScript.CreateObject("WIA.ImageFile")
Img.LoadFile File
With Img.Properties
For i = 1 To .Count
FN = .Item(i).Name : If Not .Item(i).IsVector _
And Not IsNumeric(FN) Then Execute FN & " = .Item(i).Value"
Next
End With
Sr = InStrRev(File, "\") : FN = Mid(File, Sr + 1) : T = vbTab
Set Folder = CreateObject("Shell.Application").NameSpace(Left(File, Sr))
For Each P In Split("Name Directory DocTitle Owner Attributes " &_
"Copyright Dimensions Type Create Write Access")
Execute "i" & P & " = Folder.ParseName(FN).ExtendedProperty(P)"
Next
MsgBox "Имя файла:" & T & iName & vbCr & _
"Тип файла:" & T & iType & vbCr & _
"Название:" & T & iDocTitle & vbCr & _
"Разрешение:" & T & XResolution & " x " & YResolution & " dpi" & vbCr & _
"Размер кадра:" & T & iDimensions & " пкс" & vbCr & _
"Ширина кадра:" & T & ExifPixXDim & " пкс" & vbCr & _
"Высота кадра:" & T & ExifPixYDim & " пкс" & vbCr & _
"Дата съёмки:" & T & DateTime & vbCr & _
"Дата создания:" & T & iAccess & vbCr & _
"Дата изменения:" & T & iCreate & vbCr & _
"Автор съёмки:" & T & Artist & vbCr & _
"Владелец:" & T & iOwner & vbCr & _
"Автор. права:" & T & Copyright
Приверженцу мелкомягкого эстетизма подобный подход в оптимизации может показаться радикальным и режущим глаз, но, полагаю, не я первый, кто горел желанием проделывать на VBS вещь, которая нативно вплетена в JS.
Буду рад, если кто оценит.