1

Тема: HTA: Передача массива в процедуру через Button

Нашел пример как можно передать массив в процедуру через call

Dim arrTemp
arrTemp = Array("a", "b", "c")
Call MySub(arrTemp)
WScript.Quit 0

Sub MySub(arrTest())
For Each s In arrTest
    WScript.Echo s
Next
End Sub

Но не могу понять как можно передать массив в процедуру при нажатии на кнопку. Например "Проверка выбранных файлов"

    Case "OUT"    
                            Set objFolder = CreateObject("Shell.Application").BrowseForFolder(0, "Выберите каталог размещения файлов:", &H1 Or &H10 Or &H200, &H11) 
                            If objFolder Is Nothing Then
                                MsgBox "Не выбран каталог размещения файлов"
                                DynamicContent_Div.InnerHTML = "Не выбран каталог размещения файлов"
                                    Else
                                    asdf = objFolder.Items.Item.path
                    
                                    '<!--#######################[ Checkbox создание меню#########-->
                                    sDinamicContent = sDinamicContent & "<Form Name=ChkBoxFrm>"
                                    Set FSO = CreateObject("Scripting.FileSystemObject")
                                    Set Folder = FSO.GetFolder(asdf)
                                    Dim MyArray1
                                    
                                    For Each File In Folder.Files
                                        sDinamicContent = sDinamicContent & "<input style=""background-color:#00ff00"" name=""File.Name"" value=""File.Name"" type=""checkbox""/>" & File.Name & "<br>"
                                        MyArray1 = File.Name
                                        'MsgBox MyArray1
                                    Next
                                    'Call CheckChkBx(arrTemp)
                                        sDinamicContent = sDinamicContent & "<input style=""background-color:#00ff00"" name=""ChkBx1"" Checked value=""Box1"" type=""checkbox""/>" & "<br>"
                                        sDinamicContent = sDinamicContent & "<input style=""background-color:#ffff00"" name=""ChkBx2"" value=""Box2"" type=""checkbox""/>" & "<br>"
                                        sDinamicContent = sDinamicContent & "<input style=""background-color:#ff0000"" name=""ChkBx3"" value=""Box3"" type=""checkbox""/>" & "<br>"
                                        sDinamicContent = sDinamicContent & "<input type=""Button"" Value=""Проверка выбранных файлов""  onclick=""CheckChkBx"" />" & "<br>"   
                                        sDinamicContent = sDinamicContent & "</Form>"
                                        DynamicContent_Div.InnerHTML = sDinamicContent
                                
                                End If
                                Set objFolder = Nothing    

Обработка процедуры, но в ней не доступен массив  MsgBox выводит пустое сообщение вместо значения которое было заложено в массиве ранее:

              '<!--#######################[ Checkbox Вот здесь нужно определить выбор файлов с путями и поместить в массив ]#######################-->
                  Sub CheckChkBx
            MsgBox (MyArray1)
                        Set FSO = CreateObject("Scripting.FileSystemObject")
                        Set Folder = FSO.GetFolder("C:\")
                        Dim MyArray1
                    
                        For Each File In Folder.Files
                        MyArray1 = File.Name

                    Next
                    'MsgBox MyArray1
                    Set CBForm = Document.ChkBoxFrm
                     If CBForm.ChkBx1.Checked Then ChkBx1 = CBForm.ChkBx1.Value & VBCRLF
                     If CBForm.ChkBx2.Checked Then ChkBx2 = CBForm.ChkBx2.Value & VBCRLF
                     If CBForm.ChkBx3.Checked Then ChkBx3 = CBForm.ChkBx3.Value & VBCRLF
                     

                         WhatsChecked = ChkBx1 & ChkBx2 & ChkBx3 & MyArray1
                     If WhatsChecked = "" Then
                         MsgBox "You Didn't Select Anything", 64,"Checkbox Selections"
                         Else
                      MsgBox "You Selected:" & vbcrlf & WhatsChecked, 64,"Checkbox Selections"
                     End If
                  
                  ChkBx1 = ""
                  ChkBx2 = ""
                  ChkBx3 = ""
                  MyArray1 = ""
                  End Sub 'CheckChkBx

Например (прикрепил файл HTA)  и при нажатии на кнопку "Отправка файлов" выбираем директорию, далее выбираем файлы и при нажатии кнопки "Проверка выбранных файлов" в сообщении должно показаться перечисленные имена файлов. (В процедуре нужно перебрать массив и сравнить значения)

Post's attachments

ОСР.hta 13.66 kb, 7 downloads since 2014-01-08 

You don't have the permssions to download the attachments of this post.

2

Re: HTA: Передача массива в процедуру через Button

Нашел пример как можно передать массив в процедуру через call

Sub MySub(arrTest())

А зачем скобки после arrTest? Я даже удивляюсь, почему это не вызывает ошибку компиляции.

Но не могу понять как можно передать массив в процедуру при нажатии на кнопку. Например "Проверка выбранных файлов"

Вероятно так

<input type=button
    value="Проверка выбранных файлов"
    onclick="Call MySub(arrTemp)"
>
Забыл пароль и потерял e-mail.

3 (изменено: wildwolf007, 2014-01-09 23:07:34)

Re: HTA: Передача массива в процедуру через Button

1) Чето не могу понять как в массив загнать имена файлов, которые считываются циклом?
2) И для чего в процедуре указывается "arrTest"  "Sub CheckChkBx (arrTest)"?
3) И как вывести значение обычной переменной в процедуре MsgBox Proverka, которое было присвоено в Case "Dim Proverka Proverka = 12345"????



Dim Proverka
Proverka = 12345

Dim MyArray1() 
Dim i
i=1
For Each File In Folder.Files
sDinamicContent = sDinamicContent & "<input style=""background-color:#00ff00"" name=""File.Name"" value=""File.Name"" type=""checkbox""/>" & File.Name & "<br>"
MyArray1(i) = File.Name
'MsgBox MyArray1
i=i+1
Next
                                                                 
sDinamicContent = sDinamicContent & "<input type=""Button"" Value=""Проверка выбранных файлов""  onclick=""Call CheckChkBx(MyArray1)"" />" & "<br>"   
sDinamicContent = sDinamicContent & "</Form>"
DynamicContent_Div.InnerHTML = sDinamicContent

Sub CheckChkBx (arrTest)
                  
MsgBox Proverka
                For Each s In arrTest
                    MsgBox s
                Next
End Sub 'CheckChkBx

4

Re: HTA: Передача массива в процедуру через Button

1) Объявить переменную-счётчик. Присваивать значение элементу массива с индексом, равной этой переменной, после чего увеличивать её на 1.

Если можно, объявить размер массива заранее (подсчитать чекбоксы). Если нет -- перед добавлением нового элемента увеличивать размер массива с помощью Redim (насколько я помню VBScript).

2) Очевидно, чтобы передать массив процедуре в качестве аргумента. А с какой целью -- вам лучше знать.

3) Вопрос не понял. Если можно, приведите минимальный код без излишеств.
А так -- самым обычным образом.

Забыл пароль и потерял e-mail.

5

Re: HTA: Передача массива в процедуру через Button

Чето не могу понять как создать динамический многомерный массив, массив из наименований файлой:

ReDim MyArray1(i) 
Dim i
i=0
For Each File In Folder.Files
sDinamicContent = sDinamicContent & "<input style=""background-color:#00ff00"" name=""File.Name"" value=""File.Name"" type=""checkbox""/>" & File.Name & "<br>"
MyArray1(i) = File.Name
i=i+1
Next
                                    
MsgBox i
For Each s In MyArray1
MsgBox s
Next

6

Re: HTA: Передача массива в процедуру через Button

Какие были идеи кажется иссякли. Нужно Вывести чек боксы потом произвести обработку каждый чекбокс будет генерироваться в зависимости от количества файлов, соответственно имен.
Мы выбираем каталог обработки выпадает список всех файлов, пользователь выбирает какие необходимы файлы и нажимает кнопку например "копировать" и файлы копируются в определенную директорию.

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


                                    Publiс Dim MyArray1()
                                    Dim i,j
                                                                    
                                    For Each File In Folder.Files
                                        sDinamicContent = sDinamicContent & "<input style=""background-color:#00ff00"" name=""File.Name"" value=""File.Name"" type=""checkbox""/>" & File.Name & "<br>"
                                        MyArray1(i) = asdf
                                        MyArray1(j) = File.Name
                                        i=i+1
                                        j=j+1
                                    Next

                                    MsgBox "Размер переменной i= " &i
                                    MsgBox "Размер переменной j= " &j
                                    
                                    For Each s In MyArray1
                                        MsgBox s
                                    Next

7

Re: HTA: Передача массива в процедуру через Button

думал вот еще вот так:

                                    Dim i,j
                                    i=1
                                    j=1    
                                    ReDim MyArray1(i,j)
                                                                    
                                    For Each File In Folder.Files
                                        sDinamicContent = sDinamicContent & "<input style=""background-color:#00ff00"" name=""File.Name"" value=""File.Name"" type=""checkbox""/>" & File.Name & "<br>"
                                        MyArray1(i) = asdf
                                        MyArray1(j) = File.Name
                                        i=i+1
                                        j=j+1
                                        ReDim Preserve MyArray1(i,j)
                                    Next

                                    MsgBox "Размер переменной i= " &i
                                    MsgBox "Размер переменной j= " &j
                                    
                                    For Each s In MyArray1
                                        MsgBox s
                                    Next

Но опять таки не получилось...

8

Re: HTA: Передача массива в процедуру через Button

При составлении страницы — не надо. Поскольку нет никаких условий отбора, просто объявляйте обычный массив посредством «Dim MyArray(Folder.Files.Count - 1)» и пользуйте.

9

Re: HTA: Передача массива в процедуру через Button

Перебрал все варианты кучу времени потратил, не могу понять как использовать Вашу строку:

For Count = 0 To Folder.Files.Count -1 

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

10

Re: HTA: Передача массива в процедуру через Button

<html>
    <head>
        <title>My HTML application</title>
        <HTA:APPLICATION
            APPLICATIONNAME="My HTML application"
            ID="MyHTMLapplication"
            VERSION="1.0"/>
    </head>
    
    <body bgcolor="ButtonFace">
        <select multiple size="10" id="oHTMLSelectElement" style="width:300px"></select>
        <br><br>
        <input type="button" name="OK" id="OK" value="Display Selected options">
    </body>
    
    <script language="VBScript">
        Option Explicit
        
        Sub Window_OnLoad
            Dim objFSO
            Dim objFile
            
            Dim objHTMLOptionElement
            
            
            Set objFSO = CreateObject("Scripting.FileSystemObject")
            
            For Each objFile In objFSO.GetFolder("c:\Windows\System32").Files
                If LCase(objFSO.GetExtensionName(objFile.Name)) = "cpl" Then
                    Set objHTMLOptionElement = window.document.createElement("OPTION")
                    
                    objHTMLOptionElement.Text  = objFile.Name
                    objHTMLOptionElement.Value = objFile.Path
                    
                    oHTMLSelectElement.Add objHTMLOptionElement
                End If
            Next
            
            Set objFSO = Nothing
        End Sub
        
        Sub OK_OnClick()
            Dim objHTMLOptionElement
            
            For Each objHTMLOptionElement In oHTMLSelectElement.options
                If objHTMLOptionElement.selected Then
                    MsgBox "value: " & objHTMLOptionElement.Value & vbCrLf & "text: " & objHTMLOptionElement.Text
                End If
            Next
        End Sub
    </script>
</html>

11 (изменено: wildwolf007, 2014-01-21 18:50:04)

Re: HTA: Передача массива в процедуру через Button

К сожалению предлагаемые Вами вариант не подходит, так как предполагает выбор всего лишь одного варианта и объект совсем другой.
У меня же  алгоритм следующий:
1) Пользователь нажимает кнопку отправить файл.
2) Появляется окно выбора директории.
3) Пользователь выбирает директорию.
4) Выводится список всех файлов с чекбоксами, которые находятся в данной директории и помещается информация о файлах в массив.
5) Пользователь выбирает необходимые чек боксы с именами файлов.
6) Пользователь нажимает кнопку "Проверка выбранных файлов"
7) И здесь появляются проблемы. По хорошему должна запустится процедура и в данной процедуре необходимо определить какие выбраны были чекбоксы пользователем и эта информация и должна поместится в новый массив для дальнейшей обработки, но я не могу даже вызвать занесенный ранее массив с необходимыми параметрами в данную процедуру.

Я нашел пример по работе с чекбоксами, но здесь статические элементы:

<HTML>
  <HEAD>
  <TITLE>Input Types</TITLE>
  
      <HTA:APPLICATION
      Application ID = "InputTypes"
      APPLICATIONNAME = "InputTypes"
      BORDER = "Thick"
      BORDERSTYLE = "Complex"
      CAPTION = "Yes"
      CONTEXTMENU = "no"
      ICON = ""
      INNERBORDER = "yes"
      MAXIMIZEBUTTON = "no"
      MINIMIZEBUTTON = "no"
      NAVIGABLE = "Yes"
      SCROLL = "No"
      SCROLLFLAT = "Yes"
      SELECTION = "No"
      SHOWINTASKBAR = "Yes"
      SINGLEINSTANCE = "Yes"
      SYSMENU = "yes"
      VERSION = "1.0"
      WINDOWSTATE = "Normal"
      />
  </HEAD>

  <BODY>
   



   <SCRIPT LANGUAGE="VBScript">
   
  '<!--#######################[ Checkbox ]#######################-->
      Sub CheckChkBx
        Set CBForm = Document.ChkBoxFrm
         If CBForm.ChkBx1.Checked Then ChkBx1 = CBForm.ChkBx1.Value & VBCRLF
         If CBForm.ChkBx2.Checked Then ChkBx2 = CBForm.ChkBx2.Value & VBCRLF
         If CBForm.ChkBx3.Checked Then ChkBx3 = CBForm.ChkBx3.Value
             WhatsChecked = ChkBx1 & ChkBx2 & ChkBx3
         If WhatsChecked = "" Then
             MsgBox "You Didn't Select Anything", 64,"Checkbox Selections"
             Else
          MsgBox "You Selected:" & vbcrlf & WhatsChecked, 64,"Checkbox Selections"
         End If
      
      ChkBx1 = ""
      ChkBx2 = ""
      ChkBx3 = ""
      End Sub 'CheckChkBx
  
 
  
   </SCRIPT>
  

 
  <!--==--==--==--==--==--==--==--==-- Checkbox --==--==--==--==--==--==--==-->

      <Form Name=ChkBoxFrm>

      <input style="background-color:#00ff00" name="ChkBx1" Checked value="Box1" type="checkbox">CheckBox
      <input style="background-color:#ffff00" name="ChkBx2" value="Box2" type="checkbox">CheckBox
      <input style="background-color:#ff0000" name="ChkBx3" value="Box3" type="checkbox">CheckBox
  
      <INPUT type="Button" Value="Check"  onclick="CheckChkBx"/>

      </Form>
</BODY>
</HTML>

вот что сейчас есть у меня убрал все лишнее для комфортного чтения кода:

<html>
  <head>
        <title>Обработчик сетевого ресурса</title>
        <hta:application
            id = "oHTA"
            ApplicationName = "AUTOTEKOS"
            Border = "Dialog"
            BorderStyle = "Complex"
            Caption = "Yes"
            ContextMenu = "No"
            Icon = "C:\Windows\write.exe"
            InnerBorder = "No"
            MaximizeButton = "Yes"
            MinimizeButton = "Yes"
            Navigable = "No"
            Scroll = "No"
            ScrollFlat = "No"
            Selection = "No"
            ShowInTaskBar = "No"
            SingleInstance = "Yes"
            SysMenu = "Yes"
            Version = "1.0"
            WindowState = "Normal"
        />

        <script language="vbscript">
    
            'Обработка нажатия кнопки
            Sub RunApplication(sApplication)
                sCommandLine =""
                Set oShell = CreateObject("Wscript.Shell")
                Select Case sApplication
                        
                    Case "OUT"    
                            Set objFolder = CreateObject("Shell.Application").BrowseForFolder(0, "Выберите каталог размещения файлов:", &H1 Or &H10 Or &H200, &H11) 
                            If objFolder Is Nothing Then
                                MsgBox "Не выбран каталог размещения файлов"
                                DynamicContent_Div.InnerHTML = "Не выбран каталог размещения файлов"
                                    Else
                                    'Полученный путь используем для считывания файлов
                                    Put = objFolder.Items.Item.path
                                    Set FSO = CreateObject("Scripting.FileSystemObject")
                                    Set Folder = FSO.GetFolder(Put)
                                    MsgBox "Выбранный путь " &Put
                                    Dim a(),i
                                    i=0                        
                                    reDim a(1)
                                    For Each File In Folder.Files
                                        sDinamicContent = sDinamicContent & "<input style=""background-color:#00ff00"" name=""File.Name"" value=""File.Name"" type=""checkbox""/>" & File.Name & "<br>"
                                        a(i)=File.Name
                                        i=i+1
                                        reDim preserve a(i)
                                    Next
                                    MsgBox "Размерность массива составляет: " &i
                                    sDinamicContent = sDinamicContent & "<input type=""Button"" Value=""Проверка выбранных файлов""  onclick=""Call CheckChkBx"" />" & "<br>"   
                                    DynamicContent_Div.InnerHTML = sDinamicContent
                                
                            End If
                            Set objFolder = Nothing    
                    Case Else
                        sCommandLine =""
                End Select
                If Len(sCommandLine) > 0 Then oShell.Run sCommandLine,1,0
            End Sub

            Sub CheckChkBx ()
                MsgBox value
                'А вот здесь должно быть проверка нажатых чекбоксов и занесеные нажатых чекбоксов в другой массив. И как раз-таки ничего не получается. Здесь не отображается массив "a" ни переменная "i",  и поэтому я не могу сдвинутся дальше.
                
                    Set CBForm = Document.ChkBoxFrm
                     If CBForm.ChkBx1.Checked Then ChkBx1 = CBForm.ChkBx1.Value & VBCRLF
                     If CBForm.ChkBx2.Checked Then ChkBx2 = CBForm.ChkBx2.Value & VBCRLF
                     If CBForm.ChkBx3.Checked Then ChkBx3 = CBForm.ChkBx3.Value & VBCRLF
                     

                         WhatsChecked = ChkBx1 & ChkBx2 & ChkBx3 & MyArray1
                     If WhatsChecked = "" Then
                         MsgBox "You Didn't Select Anything", 64,"Checkbox Selections"
                         Else
                      MsgBox "You Selected:" & vbcrlf & WhatsChecked, 64,"Checkbox Selections"
                     End If
                  
                  ChkBx1 = ""
                  ChkBx2 = ""
                  ChkBx3 = ""
                  MyArray1 = ""
                  End Sub 'CheckChkBx

        </script>
            
  </head>
    
  <body>

 <table>
          
      <tr class="Content_Row">
      
      
        <td id="StaticMenu_Cell">
          <input id="OUT" type="button" value="Отправка файлов" onclick="RunApplication(me.id)" />
        </td>
                
        <td id="DynamicContent_Cell">
          <div id="DynamicContent_Div">
            Добро пожаловать!!!
          </div>
        </td>
        
        
      </tr>
     

    </table>
  </body>

  </html>
        

Так же вопрос по заполнению динамического массива решил так:

                          Dim a(),i
                                    i=0                        
                                    reDim a(1)
                                    For Each File In Folder.Files
                                        sDinamicContent = sDinamicContent & "<input style=""background-color:#00ff00"" name=""File.Name"" value=""File.Name"" type=""checkbox""/>" & File.Name & "<br>"
                                        a(i)=File.Name
                                        i=i+1
                                        reDim preserve a(i)
                                    Next

У кого еще есть какие идеи? И почему в процедуре не отображается значение массива и переменной?

12

Re: HTA: Передача массива в процедуру через Button

К сожалению предлагаемые Вами вариант не подходит, так как предполагает выбор всего лишь одного варианта

Неверное утверждение:

<select multiple …

Предложенный мною вариант предполагает выбор нескольких вариантов. Удерживайте Shift для выделения смежного интервала или Ctrl — для выделения не смежных.

У меня же  алгоритм следующий:

1) Пользователь нажимает кнопку отправить файл.

2) Появляется окно выбора директории.

3) Пользователь выбирает директорию.

4) Выводится список всех файлов с чекбоксами, которые находятся в данной директории и помещается информация о файлах в массив.

5) Пользователь выбирает необходимые чек боксы с именами файлов.

Флаг, как говорится, в руки: не вижу ни малейшего преимущества в 4)+5) по сравнению с предложенным мною выше.

13

Re: HTA: Передача массива в процедуру через Button

Просто для понимая пользователя будет проще с флашками в чекбоксах чем зажимать еще клавишу Shift или ctrl вот и все, это не моя пререгатива. Бьюсь уже не первый день перебирая все возможные варианты, недавно корректно получилось с массивом динамическим, если у Вас есть решение попрошу Вашего мнения как можно реализовать именно с чекбоксами.

14

Re: HTA: Передача массива в процедуру через Button

Или подскажите  как в процедуре открыть массив "а" который был сформирован?

15

Re: HTA: Передача массива в процедуру через Button

Просто для понимая пользователя будет проще с флашками в чекбоксах чем зажимать еще клавишу Shift или ctrl вот и все, это не моя пререгатива.

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

Есть только два разумных варианта для использования CheckBox'ов:

  • отсутствие Shift/Ctrl как таковых;

  • необходимость в «пометке» файлов, находящихся в разных местах.

если у Вас есть решение попрошу Вашего мнения как можно реализовать именно с чекбоксами.

wildwolf007, говорю Вам честно — не испытываю такого желания, поскольку душа к этому способу никак не лежит. Не хочу её насиловать.

16

Re: HTA: Передача массива в процедуру через Button

Ок, спасибо буду пробывать разбираться дальше. Я думаю Вы мало сопровождали и вели пользователей по системам и объяснить Shift/Ctrl это очень сложно. Буду дальше что-то думать, спасибо за то, что выделили свое время на мою тему.

17

Re: HTA: Передача массива в процедуру через Button

Я думаю Вы мало сопровождали и вели пользователей по системам

Порядка двадцати лет. Мне сложно сказать — много это или мало.

и объяснить Shift/Ctrl это очень сложно.

В моей практике обычно хватало одного объяснения, как использовать Ctrl и Shift для выбора.

18 (изменено: wildwolf007, 2014-01-22 10:41:42)

Re: HTA: Передача массива в процедуру через Button

alexii пишет:

Я думаю Вы мало сопровождали и вели пользователей по системам

Порядка двадцати лет. Мне сложно сказать — много это или мало.

Хороший срок прошу прощения. У меня 4 года.

alexii пишет:

и объяснить Shift/Ctrl это очень сложно.

В моей практике обычно хватало одного объяснения, как использовать Ctrl и Shift для выбора.

Просто одно объяснения для пользователя, а их будет порядка 200-300 и будут постоянно меняться. И вот думай толи сейчас голову поломать толи потом с телефона не слазить потому, что каждому если так объяснять будешь только на телефоне сидеть.

19

Re: HTA: Передача массива в процедуру через Button

…а их будет порядка 200-300 и будут постоянно меняться.

Сочувствую, но остаюсь при своём мнении.

20 (изменено: wildwolf007, 2014-01-22 14:19:38)

Re: HTA: Передача массива в процедуру через Button

А скажите чисто риторический вопрос почему нельзя через button достучаться в процедуру с массивом, который был сформирован ранее вне процедуры??

21

Re: HTA: Передача массива в процедуру через Button

в процедуру с массивом, который был сформирован ранее вне процедуры??

В другой процедуре/функции? Если так — то потому, что он локален для этой самой другой процедуры/функции и вовне её не виден.

22

Re: HTA: Передача массива в процедуру через Button

Тогда можно использовать внешний файл для хранения всех необходимых дынных и все получится. Правда не очень хорошее решение, но наверное единственное. Единственное необходимо определить место хранения таких файлов скорее всего системная директория TEMP.

23

Re: HTA: Передача массива в процедуру через Button

alexii пишет:

в процедуру с массивом, который был сформирован ранее вне процедуры??

В другой процедуре/функции? Если так — то потому, что он локален для этой самой другой процедуры/функции и вовне её не виден.

А почему локален? нельзя ли как-то установить может какой-нибудь Public режим что б доступ был везде ?

24

Re: HTA: Передача массива в процедуру через Button

Достаточно просто передавать массив параметром:

<html>
    <head>
        <title>My HTML application</title>
        <HTA:APPLICATION
            APPLICATIONNAME="My HTML application"
            ID="MyHTMLapplication"
            VERSION="1.0"/>
    </head>
    
    <body bgcolor="ButtonFace">
        <select multiple size="10" id="oHTMLSelectElement" style="width:300px"></select>
        <br><br>
        <input type="button" name="OK" id="OK" value="Display Selected options">
    </body>
    
    <script language="VBScript">
        Option Explicit
        
        Sub Window_OnLoad
            Dim objFSO
            Dim objFile
            
            Dim objHTMLOptionElement
            
            
            Set objFSO = CreateObject("Scripting.FileSystemObject")
            
            For Each objFile In objFSO.GetFolder("c:\Windows\System32").Files
                If LCase(objFSO.GetExtensionName(objFile.Name)) = "cpl" Then
                    Set objHTMLOptionElement = window.document.createElement("OPTION")
                    
                    objHTMLOptionElement.Text  = objFile.Name
                    objHTMLOptionElement.Value = objFile.Path
                    
                    oHTMLSelectElement.Add objHTMLOptionElement
                End If
            Next
            
            Set objFSO = Nothing
        End Sub
        
        Sub OK_OnClick()
            Dim objHTMLOptionElement
            Dim iCount
            
            iCount = 0
            
            For Each objHTMLOptionElement In oHTMLSelectElement.options
                If objHTMLOptionElement.selected Then
                    iCount = iCount + 1
                End If
            Next
            
            ReDim arrSelection(iCount - 1, 1)
            
            iCount = 0
            
            For Each objHTMLOptionElement In oHTMLSelectElement.options
                If objHTMLOptionElement.selected Then
                    arrSelection(iCount, 0) = objHTMLOptionElement.Value
                    arrSelection(iCount, 1) = objHTMLOptionElement.Text
                    
                    iCount = iCount + 1
                End If
            Next
            
            Sample arrSelection
        End Sub
        
        Sub Sample(arrSampleArray)
            Dim i
            
            For i = LBound(arrSampleArray, 1) To UBound(arrSampleArray, 1)
                MsgBox arrSampleArray(i, 0) & ": " & arrSampleArray(i, 1)
            Next
        End Sub
    </script>
</html>

Но я бы предпочёл использовать ассоциативный массив — «Scripting.Dictionary» — меньше возни, нежели с обычным массивом:

<html>
    <head>
        <title>My HTML application</title>
        <HTA:APPLICATION
            APPLICATIONNAME="My HTML application"
            ID="MyHTMLapplication"
            VERSION="1.0"/>
    </head>
    
    <body bgcolor="ButtonFace">
        <select multiple size="10" id="oHTMLSelectElement" style="width:300px"></select>
        <br><br>
        <input type="button" name="OK" id="OK" value="Display Selected options">
    </body>
    
    <script language="VBScript">
        Option Explicit
        
        Sub Window_OnLoad
            Dim objFSO
            Dim objFile
            
            Dim objHTMLOptionElement
            
            
            Set objFSO = CreateObject("Scripting.FileSystemObject")
            
            For Each objFile In objFSO.GetFolder("c:\Windows\System32").Files
                If LCase(objFSO.GetExtensionName(objFile.Name)) = "cpl" Then
                    Set objHTMLOptionElement = window.document.createElement("OPTION")
                    
                    objHTMLOptionElement.Text  = objFile.Name
                    objHTMLOptionElement.Value = objFile.Path
                    
                    oHTMLSelectElement.Add objHTMLOptionElement
                End If
            Next
            
            Set objFSO = Nothing
        End Sub
        
        Sub OK_OnClick()
            Dim objHTMLOptionElement
            Dim objDictionary
            
            Set objDictionary = CreateObject("Scripting.Dictionary")
            
            For Each objHTMLOptionElement In oHTMLSelectElement.options
                If objHTMLOptionElement.selected Then
                    objDictionary.Add objHTMLOptionElement.Value, objHTMLOptionElement.Text
                End If
            Next
            
            Sample objDictionary
            
            objDictionary.RemoveAll
            Set objDictionary = Nothing
        End Sub
        
        Sub Sample(objSampleDictionary)
            Dim elem
            
            For Each elem In objSampleDictionary.Keys
                MsgBox elem & ": " & objSampleDictionary.Item(elem)
            Next
        End Sub
    </script>
</html>

25

Re: HTA: Передача массива в процедуру через Button

Скажите, а почему в процедуре доступен параметр oHTMLSelectElement.options ?
Ну насколько я читал массив работает быстрей и в нем можно установить любую практически размерность, а в Scripting.Dictionary только "имя" и "параметр" и на этом все, если нужно использовать больший размер, то придется использовать Array() в виде параметра.
Размерность Array() можно задать явно один раз, изменитьразмерность динамически менять я не видел такого.

26

Re: HTA: Передача массива в процедуру через Button

wildwolf007 пишет:

Скажите, а почему в процедуре доступен параметр oHTMLSelectElement.options ?

Это не параметр.

«oHTMLSelectElement» — это объект, ссылающийся по id на «<select multiple size="10" id="oHTMLSelectElement" style="width:300px"></select>». После определения его браузером (после рендера) он доступен в любой процедуре, поскольку считается описанным на глобальном уровне [сейчас меня более опытные коллеги тапками закидают ].

«.options» — коллекция элементов HTMLOptionElement, добавленных ранее в «select» посредством команд «Set objHTMLOptionElement = window.document.createElement("OPTION")» в цикле.

wildwolf007 пишет:

Ну насколько я читал массив работает быстрей

Да.

wildwolf007 пишет:

и в нем можно установить любую практически размерность

Отнюдь, всё определённо:

… up to 60 multiple dimensions may be declared.

wildwolf007 пишет:

а в Scripting.Dictionary только "имя" и "параметр" и на этом все, если нужно использовать больший размер, то придется использовать Array() в виде параметра.

Или вложенный ассоциативный массив . Это нормально.

Ассоциативному массиву, в отличие от обычного массива, не требуется предварительно задавать размер. Поэтому не происходит замедления при добавлении нового элемента в массив при его росте, в то время как скорость выполнения ReDim Preserve напрямую зависит от величины массива. Второе преимущество — доступ не по индексу, а по ключу. Потому и удаление заданного элемента из ассоциативного массива проходит ещё быстрее, чем в обычном массиве, где вначале требуется перебрать все элементы (N/2 в среднем) и определить индекс искомого элемента, затем скопировать остаток массива «вверх»/«влево», замещая значение искомого элемента и последующих, и только затем исполнить весьма небыстрый «ReDim Preserve».

wildwolf007 пишет:

Размерность Array() можно задать явно один раз, изменитьразмерность динамически менять я не видел такого.

Размерность массива, возвращаемого функцией Array() вроде бы всегда равна единице.

27 (изменено: wildwolf007, 2014-01-24 00:37:21)

Re: HTA: Передача массива в процедуру через Button

Все сдаюсь перепробывал всевозможные варианты с CheckBox убил кучу времени склоняюсь к Вашему решению.

Код понятен можно теперь лепить что угодно.

Не понятно только вот эта строка "Sample objDictionary"

И теперь буду разбираться с Case и с формированием динамического меню innerHTML.

28

Re: HTA: Передача массива в процедуру через Button

alexii пишет:
wildwolf007 пишет:

а в Scripting.Dictionary только "имя" и "параметр" и на этом все, если нужно использовать больший размер, то придется использовать Array() в виде параметра.

Или вложенный ассоциативный массив . Это нормально.

Ассоциативному массиву, в отличие от обычного массива, не требуется предварительно задавать размер. Поэтому не происходит замедления при добавлении нового элемента в массив при его росте, в то время как скорость выполнения ReDim Preserve напрямую зависит от величины массива. Второе преимущество — доступ не по индексу, а по ключу. Потому и удаление заданного элемента из ассоциативного массива проходит ещё быстрее, чем в обычном массиве, где вначале требуется перебрать все элементы (N/2 в среднем) и определить индекс искомого элемента, затем скопировать остаток массива «вверх»/«влево», замещая значение искомого элемента и последующих, и только затем исполнить весьма небыстрый «ReDim Preserve».

wildwolf007 пишет:

Размерность Array() можно задать явно один раз, изменитьразмерность динамически менять я не видел такого.

Размерность массива, возвращаемого функцией Array() вроде бы всегда равна единице.

Array ("12","23","34","56") Соответственно то, что в кавычках это размерность (или я неправильно определение говорю?) И разве нет ограничения у массива ассоциативного как у обычного?

Как выглядит ассоциативный массив чето на VBS ничего найти не могу.

И где можно посмотреть полное описание по объектам функциям? MSDN?


Не по теме:
Чето я чувствую хотел получить быстрый ответ, а тема разрослась... С такими темпами я весь VBS выучу.

29 (изменено: wildwolf007, 2014-01-24 01:27:07)

Re: HTA: Передача массива в процедуру через Button

Чето ошибка повторяется теперь элемент "id="oHTMLSelectElement""
Ругается вот на эту строку  "oHTMLSelectElement.Add objHTMLOptionElement"

Я уже склоняюсь может переключится на модальные окна и забросить этот InnerHTML ??

<html>
  <head>
        <title>Обработчик сетевого ресурса</title>
        <hta:application
            id = "oHTA"
            ApplicationName = "AUTOTEKOS"
            Border = "Dialog"
            BorderStyle = "Complex"
            Caption = "Yes"
            ContextMenu = "No"
            Icon = "C:\Windows\write.exe"
            InnerBorder = "No"
            MaximizeButton = "Yes"
            MinimizeButton = "Yes"
            Navigable = "No"
            Scroll = "No"
            ScrollFlat = "No"
            Selection = "No"
            ShowInTaskBar = "No"
            SingleInstance = "Yes"
            SysMenu = "Yes"
            Version = "1.0"
            WindowState = "Normal"
        />

        <script language="vbscript">



Sub RunApplication(sApplication)
    sCommandLine =""
    Set oShell = CreateObject("Wscript.Shell")
    Select Case sApplication
       
                    Case "OUT"    

                            'Option Explicit
                    
                            Dim objFSO
                            Dim objFile
                            
                            Dim objHTMLOptionElement
                            
                            
                            Set objFSO = CreateObject("Scripting.FileSystemObject")
                            For Each objFile In objFSO.GetFolder("c:\Windows\System32").Files
                                If LCase(objFSO.GetExtensionName(objFile.Name)) = "cpl" Then
                                    Set objHTMLOptionElement = window.document.createElement("OPTION")
                                    
                                    objHTMLOptionElement.Text  = "Дополнительная переменная" &objFile.Name & VBCRLF
                                    objHTMLOptionElement.Value = objFile.Path & VBCRLF
                                    
                                    oHTMLSelectElement.Add objHTMLOptionElement
                                End If
                            Next
                            
                            Set objFSO = Nothing

                            sDinamicContent = sDinamicContent &"<select multiple size=""10"" id=""oHTMLSelectElement"" style=""width:300px""></select>"
                            sDinamicContent = sDinamicContent &"<br><br>"
                            sDinamicContent = sDinamicContent &"<input type=""button"" name=""OK"" id=""OK"" value=""Display Selected options"">"

                            DynamicContent_Div.InnerHTML = sDinamicContent
        
        Case Else
            sCommandLine =""
    End Select
    If Len(sCommandLine) > 0 Then oShell.Run sCommandLine,1,0
End Sub        
    
    
    
           Function OK_OnClick()
            Dim objHTMLOptionElement
            Dim iCount
            
            iCount = 0
            
            For Each objHTMLOptionElement In oHTMLSelectElement.options
                If objHTMLOptionElement.selected Then
                    iCount = iCount + 1
                End If
            Next
            
            ReDim arrSelection(iCount - 1, 1)
            
            iCount = 0
            
            For Each objHTMLOptionElement In oHTMLSelectElement.options
                If objHTMLOptionElement.selected Then
                    arrSelection(iCount, 0) = objHTMLOptionElement.Value
                    arrSelection(iCount, 1) = objHTMLOptionElement.Text
                    
                    iCount = iCount + 1
                End If
            Next
            
            Sample arrSelection
        End Function
        
        Function Sample(arrSampleArray)
            Dim i
            
            For i = LBound(arrSampleArray, 1) To UBound(arrSampleArray, 1)
                MsgBox arrSampleArray(i, 0) & ": " & arrSampleArray(i, 1)
            Next
        End Function
        
        </script>
            
  </head>
    
  <body>

 <table>
          
      <tr class="Content_Row">
      
      
        <td id="StaticMenu_Cell">
          <input id="OUT" type="button" value="Отправка файлов" onclick="RunApplication(me.id)" />
        </td>
                
        <td id="DynamicContent_Cell">
          <div id="DynamicContent_Div">
            Добро пожаловать!!!
          </div>
        </td>
        
      </tr>
     

    </table>
  </body>

  </html>
        

30

Re: HTA: Передача массива в процедуру через Button

wildwolf007 пишет:

Не понятно только вот эта строка "Sample objDictionary"

Вызов процедуры «Sample» с передачей ей параметром «objDictionary». Это аналогично такой команде:

call Sample(objDictionary)
wildwolf007 пишет:

Array ("12","23","34","56") Соответственно то, что в кавычках это размерность (или я неправильно определение говорю?)

Размерность — 1. Количество элементов по первой размерности — 4.

wildwolf007 пишет:

И разве нет ограничения у массива ассоциативного как у обычного?

У него отсутствует такое понятие, как размерность — он всегда одномерный (в данной реализации, понятно).

wildwolf007 пишет:

Как выглядит ассоциативный массив чето на VBS ничего найти не могу. И где можно посмотреть полное описание по объектам функциям? MSDN?

Dictionary Object

wildwolf007 пишет:

Чето ошибка повторяется теперь элемент "id="oHTMLSelectElement""

Ругается вот на эту строку  "oHTMLSelectElement.Add objHTMLOptionElement"

Потому что у Вас ещё нет никакого «oHTMLSelectElement» в природе, Вы его добавляете ниже по коду путём:

sDinamicContent = sDinamicContent &"<select multiple size=""10"" id=""oHTMLSelectElement"" style=""width:300px""></select>"
…
DynamicContent_Div.InnerHTML = sDinamicContent

Так что, ничего удивительного.

31 (изменено: alexii, 2014-01-24 11:47:38)

Re: HTA: Передача массива в процедуру через Button

Спасибо за ответы.
Скажите а может можно будет использовать чекбоксы примерно:

Dim strHTML
                            Set objFSO = CreateObject("Scripting.FileSystemObject")
                            For Each objFile In objFSO.GetFolder("c:\Windows\System32").Files
                                If LCase(objFSO.GetExtensionName(objFile.Name)) = "cpl" Then
                                    Set objHTMLOptionElement = window.document.createElement("OPTION")
                                    strHTML.InnerHTML = "<input name=""objFile.Name"" id=""objFile.Name"" type=""checkbox"">"     
                                    MsgBox strHTML
                                    objHTMLOptionElement.Text  = strHTML &objFile.Name  & VBCRLF
                                    objHTMLOptionElement.Value = objFile.Path & VBCRLF
                                    
                                    oHTMLSelectElement.Add objHTMLOptionElement
                                End If
                            Next

32

Re: HTA: Передача массива в процедуру через Button

Приведите весь код *.hta.

33 (изменено: wildwolf007, 2014-01-24 14:39:20)

Re: HTA: Передача массива в процедуру через Button

Включил пару примеров, которые нашел в сети закоментировал.
Теретически все должно получится:

<html>
  <head>
        <title>Обработчик сетевого ресурса</title>
        <hta:application
            id = "oHTA"
            ApplicationName = "AUTOTEKOS"
            Border = "Dialog"
            BorderStyle = "Complex"
            Caption = "Yes"
            ContextMenu = "No"
            Icon = "C:\Windows\write.exe"
            InnerBorder = "No"
            MaximizeButton = "Yes"
            MinimizeButton = "Yes"
            Navigable = "No"
            Scroll = "No"
            ScrollFlat = "No"
            Selection = "No"
            ShowInTaskBar = "No"
            SingleInstance = "Yes"
            SysMenu = "Yes"
            Version = "1.0"
            WindowState = "Normal"
        />

        <script language="vbscript">



Sub RunApplication(sApplication)
    sCommandLine =""
    Set oShell = CreateObject("Wscript.Shell")
    Select Case sApplication
       
                    Case "OUT"    

                            'Option Explicit
                    
                            Dim objFSO
                            Dim objFile
                            
                            Dim objHTMLOptionElement

                            sDinamicContent = sDinamicContent &"<select multiple size=""10"" id=""oHTMLSelectElement"" style=""width:300px""></select>"
                            sDinamicContent = sDinamicContent &"<br><br>"
                            sDinamicContent = sDinamicContent &"<input type=""button"" name=""OK"" id=""OK"" value=""Display Selected options"">"

                            sDinamicContent = sDinamicContent &"<INPUT type='Button' Value='Check'  onclick='Call OK_OnClick()'/>"& "<br>"                            
                            DynamicContent_Div.InnerHTML = sDinamicContent

                               
                            Dim strHTML
                            Set objFSO = CreateObject("Scripting.FileSystemObject")
                            For Each objFile In objFSO.GetFolder("c:\Windows\System32").Files
                                If LCase(objFSO.GetExtensionName(objFile.Name)) = "cpl" Then
                                    Set objHTMLOptionElement = window.document.createElement("OPTION")
                                    'strHTML.InnerHTML = "<input name=""objFile.Name"" id=""objFile.Name"" type=""checkbox"">"     
                                    'MsgBox strHTML
                                    objHTMLOptionElement.Text  = strHTML &objFile.Name  & VBCRLF
                                    objHTMLOptionElement.Value = objFile.Path & VBCRLF
                                    
                                    oHTMLSelectElement.Add objHTMLOptionElement
                                End If
                            Next
                            
                            Set objFSO = Nothing
        
        Case Else
            sCommandLine =""
    End Select
    If Len(sCommandLine) > 0 Then oShell.Run sCommandLine,1,0
End Sub        
        
           Function OK_OnClick()
            Dim objHTMLOptionElement
            Dim iCount
            
            iCount = 0
            
            For Each objHTMLOptionElement In oHTMLSelectElement.options
                If objHTMLOptionElement.selected Then
                    iCount = iCount + 1
                End If
            Next
            
            ReDim arrSelection(iCount - 1, 1)
            
            iCount = 0
            
            For Each objHTMLOptionElement In oHTMLSelectElement.options
                
    ' Вот здесь кусочек нашел из каких-то примеров но здесь используются значения из словарей
    'strHTML = "<BR>"
    'For i = 0 To UBound(objDict.Item("ControlValues0"))
    '    MsgBox strHTML & "<input type=""checkbox"" name=""checkbox" & CStr(i) &""" id=""checkbox" & CStr(i) & """>" & objDict.Item("ControlValues0")(i) & "<BR>" & vbCr
    '    strHTML = strHTML & "<input type=""checkbox"" name=""checkbox" & CStr(i) &""" id=""checkbox" & CStr(i) & """>" & objDict.Item("ControlValues0")(i) & "<BR>" & vbCr
    'Next
    'ControlValues.InnerHTML = strHTML

    
    ' Здесь еще один пример как можно обработать но здесь статические данные
      '<!--#######################[ Checkbox ]#######################-->
      'Sub CheckChkBx
       ' Set CBForm = Document.ChkBoxFrm
        ' If CBForm.ChkBx1.Checked Then ChkBx1 = CBForm.ChkBx1.Value & VBCRLF
         'If CBForm.ChkBx2.Checked Then ChkBx2 = CBForm.ChkBx2.Value & VBCRLF
         'If CBForm.ChkBx3.Checked Then ChkBx3 = CBForm.ChkBx3.Value
          '   WhatsChecked = ChkBx1 & ChkBx2 & ChkBx3
         'If WhatsChecked = "" Then
          '   MsgBox "You Didn't Select Anything", 64,"Checkbox Selections"
           '  Else
          'MsgBox "You Selected:" & vbcrlf & WhatsChecked, 64,"Checkbox Selections"
         'End If
      
      'ChkBx1 = ""
      'ChkBx2 = ""
      'ChkBx3 = ""
      'End Sub 'CheckChkBx

                
                
                
                
                
                
                
                If objHTMLOptionElement.selected Then
                    arrSelection(iCount, 0) = objHTMLOptionElement.Value
                    arrSelection(iCount, 1) = objHTMLOptionElement.Text
                    
                    iCount = iCount + 1
                End If
            Next
            
            Sample arrSelection
        End Function
        
        Function Sample(arrSampleArray)
            Dim i
            
            For i = LBound(arrSampleArray, 1) To UBound(arrSampleArray, 1)
                MsgBox arrSampleArray(i, 0) & ": " & arrSampleArray(i, 1)
            Next
        End Function
        
        </script>
            
  </head>
    
  <body>

 <table>
          
      <tr class="Content_Row">
      
      
        <td id="StaticMenu_Cell">
          <input id="OUT" type="button" value="Отправка файлов" onclick="RunApplication(me.id)" />
        </td>
                
        <td id="DynamicContent_Cell">
          <div id="DynamicContent_Div">
            Добро пожаловать!!!
          </div>
        </td>
        
      </tr>
     

    </table>
  </body>

  </html>
        

34

Re: HTA: Передача массива в процедуру через Button

Так же пример использования статического чекбокса обработка идет не по ID, а по процедуре ChkBoxFrm (как бы правильно выразится):

<HTML>
  <HEAD>
  <TITLE>Input Types</TITLE>
  
      <HTA:APPLICATION
      Application ID = "InputTypes"
      APPLICATIONNAME = "InputTypes"
      BORDER = "Thick"
      BORDERSTYLE = "Complex"
      CAPTION = "Yes"
      CONTEXTMENU = "no"
      ICON = ""
      INNERBORDER = "yes"
      MAXIMIZEBUTTON = "no"
      MINIMIZEBUTTON = "no"
      NAVIGABLE = "Yes"
      SCROLL = "No"
      SCROLLFLAT = "Yes"
      SELECTION = "No"
      SHOWINTASKBAR = "Yes"
      SINGLEINSTANCE = "Yes"
      SYSMENU = "yes"
      VERSION = "1.0"
      WINDOWSTATE = "Normal"
      />
  </HEAD>

  <BODY>




   <SCRIPT LANGUAGE="VBScript">
   
  '<!--#######################[ Checkbox ]#######################-->
      Sub CheckChkBx
        Set CBForm = Document.ChkBoxFrm
         If CBForm.ChkBx1.Checked Then ChkBx1 = CBForm.ChkBx1.Value & VBCRLF
         If CBForm.ChkBx2.Checked Then ChkBx2 = CBForm.ChkBx2.Value & VBCRLF
         If CBForm.ChkBx3.Checked Then ChkBx3 = CBForm.ChkBx3.Value
             WhatsChecked = ChkBx1 & ChkBx2 & ChkBx3
         If WhatsChecked = "" Then
             MsgBox "You Didn't Select Anything", 64,"Checkbox Selections"
             Else
          MsgBox "You Selected:" & vbcrlf & WhatsChecked, 64,"Checkbox Selections"
         End If
      
      ChkBx1 = ""
      ChkBx2 = ""
      ChkBx3 = ""
      End Sub 'CheckChkBx
  
 
  
   </SCRIPT>
  

 
  <!--==--==--==--==--==--==--==--==-- Checkbox --==--==--==--==--==--==--==-->

      <Form Name=ChkBoxFrm>

      <input style="background-color:#00ff00" name="ChkBx1" Checked value="Box1" type="checkbox">CheckBox
      <input style="background-color:#ffff00" name="ChkBx2" value="Box2" type="checkbox">CheckBox
      <input style="background-color:#ff0000" name="ChkBx3" value="Box3" type="checkbox">CheckBox
  
      <INPUT type="Button" Value="Check"  onclick="CheckChkBx"/>

      </Form>
</BODY>
</HTML>

35

Re: HTA: Передача массива в процедуру через Button

Так же нашел еще пример статического чекбокса, но с использованием array и передачей параметра в другое окно с использованием словарей.
2 файла:

Первый файл называется "Start.hta" он же и запускается первым:

<html>
<head>
<title>Caller</title>
<HTA:APPLICATION
  APPLICATIONNAME="Caller"
  ID="Caller"
  VERSION="1.0"/>
</head>

<script language="VBScript">

Sub Window_OnLoad
End Sub

Function Fill_Dict_CheckBox()
    dim objDic
    Set objDic = CreateObject("Scripting.Dictionary")
    objDic.Add "Header", "Верхний заголовок"
    objDic.Add "ControlHeader", "Заголовок контрола"
    objDic.Add "Description", "Подробное описание, того что требуется от пользователя в этом окне"
    objDic.Add "ControlValues", Array("One", "Two", "Three", "Four")
    objDic.Add "BtnPrev", True
    objDic.Add "BtnNext", True
    objDic.Add "BtnFinish", True
    Set Fill_Dict_CheckBox = objDic
    Set objDic = Nothing
End Function

Sub OnClickButtonbtnChB
    varReturn = window.ShowModalDialog("checkbox.hta", Fill_Dict_CheckBox, "dialogHeight:200px;dialogWidth:300px") 
    MsgBox varReturn
End Sub

</script>

<body>

<input type="button" name="btnRB" id="btnChB" value="CheckBox" onclick="OnClickButtonbtnChB">

</body>
</html>

Второй файл называется "CheckBox.hta"

<html>
<head>
<title>911</title>
<HTA:APPLICATION
  APPLICATIONNAME="CHECKBOX"
  ID="CHB"
  VERSION="1.0"
  SYSMENU="no"
  MAXIMIZEBUTTON="no"
  MINIMIZEBUTTON="no"
  SCROLL="no"
  CONTEXTMENU="no"
  SELECTION="no"/>
</head>

<script language="VBScript">

  Dim objDict
    Set objDict = window.dialogArguments

Sub Window_OnLoad
    Header.InnerHTML = "<B>" & objDict.Item("Header") & "</B>"
    ControlHeader.InnerHTML =  "<BR>" & objDict.Item("ControlHeader")
    Description.InnerHTML = "<BR> <font size=2>" & objDict.Item("Description") & "</font>"
    
    
    
    If objDict.Item("BtnPrev") Then 
        ButtonPrev.innerHTML     = "<input type=""button"" name=""btnPrev"" id=""btnPrev"" value=""Назад"" onclick=""OnClickButtonbtnPrev"">"
    Else 
        ButtonPrev.innerHTML     = ""
    End If    
    
    If objDict.Item("BtnNext") Then 
        ButtonNext.InnerHTML      = "<input type=""button"" name=""btnNext"" id=""btnNext"" value=""Дальше"" onclick=""OnClickButtonbtnNext"">"
    Else 
        ButtonNext.InnerHTML      = ""
    End If    
    
    If objDict.Item("BtnFinish") Then 
        ButtonFinish.InnerHTML = "<input type=""button"" name=""btnFinish"" id=""btnFinish"" value=""Закончить"" onclick=""OnClickButtonbtnFinish"">"
    Else 
        ButtonFinish.InnerHTML = ""
    End If    
    
    
    
    
    
    strHTML = "<BR>"
    For i = 0 To UBound(objDict.Item("ControlValues"))
        strHTML = strHTML & "<input type=""checkbox"" name=""checkbox" & CStr(i) &""" id=""checkbox" & CStr(i) & """>" & objDict.Item("ControlValues")(i) & "<BR>" & vbCr
    Next
    ControlValues.InnerHTML = strHTML
    
    window.returnValue = "Value=;Button=;"
End Sub





Function GetCheckBoxValues()
    GetCheckBoxValues = ""
    For i = 0 To UBound(objDict.Item("ControlValues"))
        If window.document.getElementById("checkbox" & CStr(i)).Checked Then 
            GetCheckBoxValues = GetCheckBoxValues & "1,"
        Else
            GetCheckBoxValues = GetCheckBoxValues & "0,"
        End If    
    Next
    GetCheckBoxValues = Left(GetCheckBoxValues,Len(GetCheckBoxValues)-1)
End Function

Sub OnClickButtonbtnPrev()
    window.returnValue = "Value=" & GetCheckBoxValues() & ";Button=Prev;"
    window.close
End Sub

Sub OnClickButtonbtnNext()
    window.returnValue = "Value=" & GetCheckBoxValues() & ";Button=Next;"
    window.close
End Sub

Sub OnClickButtonbtnFinish()
    window.returnValue = "Value=" & GetCheckBoxValues() & ";Button=Finish;"
    window.close
End Sub

</script>

<body>

<span id=Header></span>
<span id=ControlHeader></span> &nbsp; 
<span id=ControlValues></span>
<span id=Description></span>
<BR>
<span id=ButtonPrev></span>
<span id=ButtonNext></span>
<span id=ButtonFinish></span>
</body>
</html>

36

Re: HTA: Передача массива в процедуру через Button

Так же вот еще маленький пример нашел на англоязычных сайтах с использованием статического чекбокса достаточно простой можно попробовать на этой основе сделать:


<html><head><title>GetExifConfig.hta</title>
<HTA:APPLICATION SINGLEINSTANCE="yes"
APPLICATIONNAME="GetExifConfig"></head>

<script language="vbScript">


Sub SaveConfig() 
Dim s,
If C1.Checked Then s= "Exif from files" & vbCrLf
If C2.Checked Then s= s & "Write text file" & vbCrLf
MsgBox s
End Sub


</script>

<body>

<INPUT class="btn" type="button" value="Use &amp; Exit" onClick="SaveConfig"><p>

<input type="checkbox" id="C1"> Exif from other photos<br>
<input type="checkbox" id="C2"> Write text file<HR>


</body>


</html>

37

Re: HTA: Передача массива в процедуру через Button

alexii пишет:
wildwolf007 пишет:

Скажите, а почему в процедуре доступен параметр oHTMLSelectElement.options ?

Это не параметр.

«oHTMLSelectElement» — это объект, ссылающийся по id на «<select multiple size="10" id="oHTMLSelectElement" style="width:300px"></select>». После определения его браузером (после рендера) он доступен в любой процедуре, поскольку считается описанным на глобальном уровне [сейчас меня более опытные коллеги тапками закидают ].

«.options» — коллекция элементов HTMLOptionElement, добавленных ранее в «select» посредством команд «Set objHTMLOptiomennElet = window.document.createElement("OPTION")» в цикле.


                    objHTMLOptionElement.Text  = "22222 " &objFile.Name & VBCRLF
                    objHTMLOptionElement.Value = objFile.Path & VBCRLF
                   
                    oHTMLSelectElement.Add objHTMLOptionElement

данной командой заносим записи в таблицу
А как очистить занесенные записи ранее ? Что б новые записи записать?

38

Re: HTA: Передача массива в процедуру через Button

данной командой заносим записи в таблицу

Не «записи», и не в «таблицу».

А как очистить

Например, так:

<html>
    <head>
        <title>My HTML application</title>
        <HTA:APPLICATION
            APPLICATIONNAME="My HTML application"
            ID="MyHTMLapplication"
            VERSION="1.0"/>
    </head>
    
    <body bgcolor="ButtonFace">
        <select multiple size="10" id="oHTMLSelectElement" style="width:300px"></select>
        <br><br>
        <input type="button" name="ClearItems" id="ClearItems" value="Clear items">
    </body>
    
    <script language="VBScript">
        Option Explicit
        
        Sub Window_OnLoad
            Dim objFSO
            Dim objFile
            
            Dim objHTMLOptionElement
            
            
            Set objFSO = CreateObject("Scripting.FileSystemObject")
            
            For Each objFile In objFSO.GetFolder("c:\Windows\System32").Files
                If LCase(objFSO.GetExtensionName(objFile.Name)) = "cpl" Then
                    Set objHTMLOptionElement = window.document.createElement("OPTION")
                    
                    objHTMLOptionElement.Text  = objFile.Name
                    objHTMLOptionElement.Value = objFile.Path
                    
                    oHTMLSelectElement.Add objHTMLOptionElement
                End If
            Next
            
            Set objFSO = Nothing
        End Sub
        
        Sub ClearItems_OnClick()
            Dim objChildNode
            
            If oHTMLSelectElement.hasChildNodes() Then
                For Each objChildNode In oHTMLSelectElement.ChildNodes
                    oHTMLSelectElement.removeChild objChildNode
                Next
            End If
        End Sub
    </script>
</html>

39

Re: HTA: Передача массива в процедуру через Button

У меня заполнение данного объекта производится при нажатии на кнопку, а возможно ли что б происходила сначала очистка, а потом занесение новых данных при нажатии на данную кнопку? Я попробовал занесение в переменную значения 1, но почему-то при повторном нажатии данное значение не считывается. Или же придется делать еще одну кнопку?

Function OutButton_OnClick()
    Set objFolder = CreateObject("Shell.Application").BrowseForFolder(0, "Выберите каталог размещения файлов:", &H1 Or &H10 Or &H200, &H11) 
        If objFolder Is Nothing Then
            MsgBox "Не выбран каталог размещения файлов"
            'DynamicContent_Div.InnerHTML = "Не выбран каталог размещения файлов"
        Else
            Dim UserChooseFolder
            UserChooseFolder = objFolder.Items.Item.path
            Set FSO = CreateObject("Scripting.FileSystemObject")
            Set Folder = FSO.GetFolder(UserChooseFolder)
            
            
            Show OutChooseTable
            Show OutBtnTable

            
            Dim FilesSelectElement
            Dim FilesSelectElementHave
            'FilesSelectElementHave = 1
            if FilesSelectElementHave = "1" Then 
                MsgBox "В массиве есть данные" &FilesSelectElementHave
            End If
            For Each File In Folder.Files
            Set FilesSelectElement = window.document.createElement("OPTION")

            FilesSelectElement.Text  = File.Name & VBCRLF
            FilesSelectElement.Value = File.Path & VBCRLF 
            HtmlFilesSelectElement.Add FilesSelectElement
            FilesSelectElementHave = 1
            'MsgBox FilesSelectElementHave
            Next
            
            
            
        End If
    Set FSO = Nothing    
    Set objFolder = Nothing        
    
End Function

40

Re: HTA: Передача массива в процедуру через Button

А с чего оно будет «считываться»? Переменная локальная. После выхода из процедуры она исчезает. После очередного входа в процедуру появляется новая с тем же именем и пустым значением.

41

Re: HTA: Передача массива в процедуру через Button

А сделать что б она не исчезала?

42

Re: HTA: Передача массива в процедуру через Button

Никак. Локальная переменная потому и зовётся локальной.

43

Re: HTA: Передача массива в процедуру через Button

Почему никак? К примеру, заменить на первый элемент коллекции и перезаписывать/считывать его значение. Вероятно, есть ещё варианты.

44

Re: HTA: Передача массива в процедуру через Button

Flasher пишет:

Почему никак?

Потому что никак нельзя:

wildwolf007 пишет:

сделать что б она не исчезала

Flasher пишет:

К примеру, заменить на первый элемент коллекции и перезаписывать/считывать его значение. Вероятно, есть ещё варианты.

Делайте. Только не говорите, что это сделает локальную переменную «неисчезающей».

45

Re: HTA: Передача массива в процедуру через Button

alexii
Не придирайтесь, речь о решении, а не конкретном термине.

46

Re: HTA: Передача массива в процедуру через Button

Flasher, я не придираюсь. Я говорю о корректной терминологии. Сделать «неисчезающую» локальную переменную нельзя.

47

Re: HTA: Передача массива в процедуру через Button

alexii
Придирка была к моему "почему никак". В данном вопросе я касался "не исчезала", а не "она". Т.е. меня, полагаю, как и автора вопроса, сама задача трогает, а не то, как это можно соотнести с конкретным термином.

48

Re: HTA: Передача массива в процедуру через Button

Я ж говорю — делайте. Трогает — делайте.

49 (изменено: Flasher, 2014-02-01 16:21:34)

Re: HTA: Передача массива в процедуру через Button

alexii
Я давно так и делаю, никаких проблем. Может, кто-то предложит свой аналог.

50 (изменено: wildwolf007, 2014-02-01 18:41:34)

Re: HTA: Передача массива в процедуру через Button

Flasher
Вы не могли б просто показать пример как Вы это делаете?

51

Re: HTA: Передача массива в процедуру через Button

Все правильно говорит  Flasher за пределами объявляем глобальную переменную и после этого меняем ее в функции.

alexii Спасибо Вам так же за возможность очистки.

Совместно разобрались спасибо ребят.

52

Re: HTA: Передача массива в процедуру через Button

Все правильно говорит  Flasher за пределами объявляем глобальную переменную и после этого меняем ее в функции.

Это не то, что предлагал коллега Flasher. А Вы пошли по правильному пути.

53 (изменено: Flasher, 2014-02-01 19:50:56)

Re: HTA: Передача массива в процедуру через Button

В общем, да. Касаемо одного взятого значения достаточно объявить переменную вне функции. Я же писал про запоминания в процедуре/функции новых значений в сопоставлении с текущими.

54

Re: HTA: Передача массива в процедуру через Button

Внутри процедуры/функции этого можно было бы достичь, используя статические переменные. Но, увы, это привилегия «больших» языков — VB, С и т.п.