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

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Обращение к i-му чекбоксу на форме HTA в VBScript (http://forum.oszone.net/showthread.php?t=199079)

vxor 09-02-2011 23:42 1608922

Обращение к i-му чекбоксу на форме HTA в VBScript
 
Есть HTA - приложение с VBS-скриптом.

Код:

<html>
    <head>
        <title>app</title>
        <hta:application
            id="889988"
            ApplicationName = "GO!"
            Border = "Thick"
            Caption = "yes"
            Scroll = "no"
            SingleInstance = "yes"
            WindowState = "normal"
            Version = "1.1"
            ShowInTaskBar = "Yes"
            MaximizeButton = "No"
            MinimizeButton = "No"
        />
    </head>       
        <script language="VBScript">
      Option Explicit
'======= глобальные переменные ====================================================================================
      Dim chisloStrok 'тест: число строк в профиле
      dim sheduleArray() ' Массив-Задание - глобальный массив, сформированный на основании анализа чекбоксов массив из строк профиля - который записывается в файл c:\currenttask
      dim currenProfileFile ' выбранный файл профиля (строка)
'==================================================================================================================

      sub main 'главный код программы        начало работы программы
        filligProfileList ' заполняем лист профилей
      end Sub

      sub filligProfileList 'Заполняет листбокс списком файлов-профилей в папке profiles
        Dim fso, f, f1, fc, prFolder, objOption
          prFolder = "profiles"
          For Each objOption in listboxProfile.Options  'очистка листбокса
            objOption.RemoveNode
          Next
          Set fso = CreateObject("Scripting.FileSystemObject")
          Set f = fso.GetFolder(prFolder)
          Set fc = f.Files
          For Each f1 in fc
              Set objOption = Document.createElement("OPTION")
              objOption.Text = f1.name
              objOption.Value = f1.name
              listboxProfile.Add(objOption)
          Next
      end Sub

      sub ActivateProfile 'добавляет чекбоксы на форму, строит скрипт-процедуру их инициации (ActSomeCB) и скрипт-процедуру редактирования Массива-Задания в соответсвтии с чекбоксами
        dim ForReading, ProfileFile, objFSO, objFile, stroka, objOption, htmlstr, cnt, strSub, strSubEditSheduleArray, checkFlag
          ForReading = 1
          ProfileFile = "profiles\" & listboxProfile.value
          strSub = strSub & "Sub ActSomeCB" & vbcrlf 'заголовок процедуры Инициализации Чекбоксов
          strSubEditSheduleArray = strSubEditSheduleArray & "Sub EditSheduleArray" & vbcrlf 'заголовок процедуры Редактирования Массива-Задания
          'Msgbox ProfileFile
          Set objFSO = CreateObject("Scripting.FileSystemObject")
          Set objFile = objFSO.OpenTextFile(ProfileFile, ForReading)
            checkFlag=0                                                  'флаг выбора чекбокса
            cnt=0                                                        'счетчик чекбоксов
            CheckBoxArea.InnerHTML = ""                                  'поле для чекбоксов - пока не заполнено
            Do Until objFile.AtEndOfStream                                'для каждой строки файла профиля
                stroka = objFile.ReadLine
                'getTaskInf(stroka)                              'получаем путь, имя и флаг задания и заряжаем чекбокс
                                                                          'и делаем новый код чекбокса
                htmlstr = "<input type=" & chr(34) & "checkbox" & chr(34) & "name=" & chr(34) & "CBox" & cnt & chr(34) & "value=" & chr(34) & "1" & chr(34) & ">" & getTaskName(stroka) 'зарядили именем
                                                                          'и добавляем его на поле
                CheckBoxArea.InnerHTML = CheckBoxArea.InnerHTML & vbcrlf & vbcrlf  + htmlstr
                                                                          'и если флаг равен 1, то в процедурку инициации добавляем еще одну строку
                if getTaskFlag(stroka) = 1 then strSub = strSub & "    CBox"&cnt&".Checked = true" & vbcrlf 'тело процедуры инициализации чекбоксов
                ' создаем массив равный файлу профиля, чтобы потом его изменить и создать из него файл-задания
                redim preserve sheduleArray(cnt)    'увеличиваем массив в соответствии с новым числом строк
                sheduleArray(cnt) = stroka            'и добавляем в него новую строку из профиля
                strSubEditSheduleArray = strSubEditSheduleArray & "    If CBox"&cnt&".Checked Then sheduleArray("&cnt&")=EditCurrentFlagTo1(sheduleArray("&cnt&"))" & VbCrLf
                strSubEditSheduleArray = strSubEditSheduleArray & "    If not CBox"&cnt&".Checked Then sheduleArray("&cnt&")=EditCurrentFlagTo0(sheduleArray("&cnt&"))" & VbCrLf
                cnt = cnt + 1
            Loop
          objFile.Close
          strSub = strSub & "End Sub" 'окончание процедуры инициализации чекбоксов
          strSubEditSheduleArray = strSubEditSheduleArray & "End Sub" 'окончание процедуры Старта инсталляций
          SelSomeCBScript.text = strSub 'строим процедуру инициализации чекбоксов
          scrEditSheduleArray.text = strSubEditSheduleArray 'строим процедуру редактирования Массива-Задания
          ActSomeCB  'вызываем построенную процедуру ActSomeCB в п построенном скрипе SelSomeCBScript
          currenProfileFile = listboxProfile.value ' глобаная переменная currenProfileFile заполнятеся выбранным из списка профилем
          ChisloStrok = cnt 'тест
          ' у CreateWorkFiles
      End Sub

      function EditCurrentFlagTo1(str)'ставит в строчке Массива-Задания флаг = 1
        dim currentstring
        currentstring = getTaskPath(str)&"="&getTaskName(str)&"="&"1"
        EditCurrentFlagTo1 = currentstring
      end Function

      function EditCurrentFlagTo0(str)'ставит в строчке Массива-Задания флаг = 0
        dim currentstring
        currentstring = getTaskPath(str)&"="&getTaskName(str)&"="&"0"
        EditCurrentFlagTo0 = currentstring
      end Function
        </script>
       
    <SCRIPT Language="VBScript" id="SelSomeCBScript"> ' делает чекбокс выбранным если это указано в файле-профиля
    </SCRIPT>
   
    <SCRIPT Language="VBScript" id="scrEditSheduleArray"> 'Редактирует Массив-Задание в соответсвтии с текущими показателями чекбоксов
    </SCRIPT>
   
<body onload="main">
<input id=runbutton  class="button" type="button" value="Заполнить лист профилей" name="fill_profile_button"  onClick="filligProfileList" Disabled=True>
<br>
<br>
<select size="6" name="listboxProfile" onChange="ActivateProfile">
</select>
<br>
<br>
<span id="CheckBoxArea"></span>
<br>
<br>
<input id="GoButton" type="button" value="Start" onclick="StartSub1" />
<br>
<br>
<input type="checkbox"name="BasicCheckbox"value="1" onclick = "onCBChange"> Option 1
<br>
<br>
</body>
</html>


В цикле строится процедура, которая на форму добавляет чекбоксы.
Все отлично. Чекбоксы строятся.

Вопрос: Как после обратиться к i-му чекбоксу на форме??
Иначе: Как обежать в цикле все чекбоксы и проверить выбрат i-й чекбокс или нет?

Конечно, можно написать
If Checkbox1.Checked Then ***
If Checkbox2.Checked Then ***
If Checkbox3.Checked Then ***

Как обратиться в цикле к I-му чекбоксу? Заранее всем благодарен!

lxa85 09-02-2011 23:50 1608927

Попробовать получить список объектов формы и работать с ним?
Это так, мысль вслух. Как это сделать я пока не знаю.

vxor 10-02-2011 10:11 1609106

Есть еще варианты, неужели нет возможностьи написать как-то If Checkbox[i].Checked Then ***??
Если есть возможность поподробнее про обращение ко всем объектам формы?

lxa85 10-02-2011 10:41 1609122

xor++, понимаешь, CheckBox1 - это имя, оно может быть любым. CheckBox[i] - обращение к элементу множества (массива). Т.е. нужна некоторая структура, объединяющая CheckBox'ы . Либо это будет CheckBoxGroup, либо некий собственный список.
Исходя из того, что форма уже является контейнером объектов, то я предложил попробовать работать с ней.

Для наглядности можно привести пример с учениками в классе. Необходим механизм переводящий Ученик[i] в Петю например. Обращение к форме, в данном случае, приравнивается к обращению к классному журналу.

vxor 10-02-2011 13:01 1609240

Понял. Попробую реализовать доступ к форме.


Время: 03:57.

Время: 03:57.
© OSzone.net 2001-