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

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] HTA + VBS | Чем отлаживать VBS в теле HTA (http://forum.oszone.net/showthread.php?t=200537)

vxor 26-02-2011 13:14 1622232

HTA + VBS | Чем отлаживать VBS в теле HTA
 
Чем можно отладить текст VBS-скрипта, в теле HTA приложения?? Вообще для HTA существуют какие нибудь отладчики?? Отдельно отлаживать VBS и прикручивать его к HTA для меня не вариант. Спасибо за внимание:)

пример HTA:
Код:

<html>
    <head><title>Настройка Среды</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" Icon = "tools\ico\Icon2.ico"/></head>
       
       
       
        <SCRIPT Language="VBScript" id="SelSomeCBScript"> ' делает чекбокс выбранным если это указано в файле-профиля
        </SCRIPT>
       
       
        <SCRIPT Language="VBScript" id="scrEditSheduleArray"> ' Редактирует Массив-Задание в соответсвтии с текущими показателями чекбоксов
        </SCRIPT>
       
       
        <SCRIPT Language="VBScript" id="scrEditControlArray"> ' Редактирует Чекбоксы в соответсвтии с текущими значениями Массива задания
        </SCRIPT>
       
       
       
        <script language="VBScript">
                Option Explicit

'======= глобальные переменные ====================================================================================
      Dim chisloStrok 'тест: число строк в профиле
      dim sheduleArray() ' Массив-Задание - глобальный массив, сформированный на основании анализа чекбоксов массив из строк профиля - который записывается в файл c:\currenttask
      dim SelectedProfileFile ' выбранный файл профиля (строка)
      dim LoadedProfileFile ' загруженный файл профиля - продолжение работы (строка)
      Dim SettingsArray() ' Массив настроека программы, первая строка - имя текущего Профиля
'==================================================================================================================

        sub main 'главный код программы начало работы программы
                LoadedProfileFile = "no define"
                startBotton.Disabled = True
                If TaskExist Then
                        LoadedProfileFile = GetProfile
                        MsgBox "TaskExist. LoadedProfileFile: "&LoadedProfileFile &Chr(13)& "Старт выполнения задач"
                        ActivateProfile
                        StartTaskProcess
                        MsgBox "Все задачи выполнены"
                Else
                        MsgBox "TNE"
                        filligProfileList ' заполняем лист профилей
                End If
        end Sub


        Sub StartSub1 ' действия по кнопке СТАРТ
                startBotton.Disabled = True
                listboxProfile.Disabled = True
                MsgBox sheduleArray(0) &Chr(13)& sheduleArray(1) &Chr(13)& sheduleArray(2)
                EditSheduleArray                        ' формируем массив задания
                ReWriteCurentTask                        ' записываем его в файл
                WriteCurrentProfile                        ' и создаем на диске C: файл настроек
                StartTaskProcess                        ' стартуем выполнение заданий
'                MsgBox "StartTaskProcess"
'                MsgBox sheduleArray(0) &Chr(13)& sheduleArray(1) &Chr(13)& sheduleArray(2)
                MsgBox "Все задачи выполнены. (без перезагрузки)"
        End Sub


        sub ActivateProfile ' добавляет чекбоксы на форму, строит скрипт-процедуру их инициации (ActSomeCB) и скрипт-процедуру редактирования Массива-Задания в соответсвтии с чекбоксами
                dim ForReading, ProfileFile, objFSO, objFile, stroka, objOption, htmlstr, cnt, strSub, strSubEditSheduleArray, strSubEditControlArray, checkFlag
                ForReading = 1
                If LoadedProfileFile = "no define" Then
                        MsgBox "Выбран профиль " & listboxProfile.value
                          ProfileFile = "profiles\" & listboxProfile.value
            Else
                    MsgBox "Продолжение работы над профилем"
                          ProfileFile = "c:\currenttask"
                          SelectedProfileFile = LoadedProfileFile
                  End If

                  '====================================== ЗАГОЛОВКИ ПРОЦЕДУР ==========================================================================
                strSub = strSub & "Sub ActSomeCB" & vbcrlf 'заголовок процедуры Инициализации Чекбоксов
                strSubEditSheduleArray = strSubEditSheduleArray & "Sub EditSheduleArray" & vbcrlf 'заголовок процедуры Редактирования Массива-Задания
                strSubEditControlArray = strSubEditControlArray & "Sub EditControlArray" & vbcrlf 'заголовок процедуры Редактирования Массива-Чекбоксов
                'КОНЕЦ================================= ЗАГОЛОВКИ ПРОЦЕДУР ==========================================================================

                Set objFSO = CreateObject("Scripting.FileSystemObject")
                Set objFile = objFSO.OpenTextFile(ProfileFile, ForReading)
                checkFlag=0                                                                                                  'флаг выбора чекбокса
                cnt=0                                                                                                                  'счетчик чекбоксов
                CheckBoxArea.InnerHTML = ""                                                                  'поле для чекбоксов - пока не заполнено
                Do Until objFile.AtEndOfStream                                                                  'для каждой строки файла профиля
                        stroka = objFile.ReadLine
                        'получаем имя задания и делаем новый код чекбокса
                        htmlstr = "<input type=" & chr(34) & "checkbox" & chr(34) & "name=" & chr(34) & "CBox" & cnt & chr(34) & "value=" & chr(34) & "1" & chr(34) & "onclick=" & chr(34) & "onCBChange" & chr(34) &  ">" & getTaskName(stroka) 'зарядили именем
                        'и добавляем его на поле
                        CheckBoxArea.InnerHTML = CheckBoxArea.InnerHTML & vbcrlf & vbcrlf  + htmlstr

                        '====================================== ТЕЛА ПРОЦЕДУР ==========================================================================
                        'и если флаг равен 1, то в процедурку инициации добавляем еще одну строку
                        If getTaskFlag(stroka) = 1 Then strSub = strSub & "    CBox"&cnt&".Checked = true" & VbCrLf 'тело процедуры инициализации чекбоксов
                        If getTaskCFlag(stroka) = 1 Then strSub = strSub & "    CBox"&cnt&".Disabled  = 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
                        strSubEditControlArray = strSubEditControlArray & "    If getTaskCFlag(sheduleArray("&cnt&"))=1 Then CBox"&cnt&".Disabled = true" & VbCrLf '
                       
                        'КОНЕЦ================================= ТЕЛА ПРОЦЕДУР ==========================================================================

                        cnt = cnt + 1
                Loop
                objFile.Close

                '====================================== ОКОНЧАНИЯ ПРОЦЕДУР ==========================================================================
'                  strSub = strSub & "onCBChange()"
                strSub = strSub & "End Sub" 'окончание процедуры инициализации чекбоксов
                strSubEditSheduleArray = strSubEditSheduleArray & "End Sub" 'окончание процедуры Старта инсталляций
                strSubEditControlArray = strSubEditControlArray & "End Sub" 'окончание процедуры Редактирования массива Чекбоксов
                '====================================== ОКОНЧАНИЯ ПРОЦЕДУР ==========================================================================

                '====================================== ПОСТРОЕНИЯ ПРОЦЕДУР В СКРИПТАХ ==========================================================================
                SelSomeCBScript.text = strSub 'строим процедуру инициализации чекбоксов в скрипте
                scrEditSheduleArray.text = strSubEditSheduleArray 'строим процедуру редактирования Массива-Задания в скрипте
                scrEditControlArray.text = strSubEditControlArray ' строим процедуру редактирования массива Чекбоксов в скрипте
                '====================================== ПОСТРОЕНИЯ ПРОЦЕДУР В СКРИПТАХ ==========================================================================

                ActSomeCB  'вызываем построенную процедуру ActSomeCB в п построенном скрипе SelSomeCBScript
                SelectedProfileFile = listboxProfile.value ' глобальная переменная SelectedProfileFile заполнятеся выбранным из списка профилем
                startBotton.Disabled = False
        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
                MsgBox "FPL"
        end Sub

        Function getTaskPath(str) ' возвращает значение ПУТИ_ЗАДАЧИ
                Dim parts
                parts = Split(str,"=",-1,1)
                getTaskPath = parts(0)
        end Function

        function getTaskName(str) ' возвращает значение ИМЕНИ_ЗАДАЧИ
                Dim parts
                parts = Split(str,"=",-1,1)
                getTaskName = parts(1)
        End Function

        function getTaskFlag(str) ' возвращает значение ФЛАГА_ЗАДАЧИ
                Dim parts
                parts = Split(str,"=",-1,1)
                getTaskFlag = parts(2)
        end Function


        function EditCurrentCFlag(str,CFlag) ' ставит в строчке Массива-Задания CFlag
                Dim currentstring
                currentstring = getTaskPath(str)&"="&getTaskName(str)&"="&getTaskFlag(str)&"="&CFlag
                EditCurrentCFlag = currentstring
        end Function

        Sub ReWriteCurentTask ' ПереПисывает текущий файл задания из текущего массива-задания
                Dim fso, cnt, MyFile
                Set fso = CreateObject("Scripting.FileSystemObject")
                Set MyFile = fso.OpenTextFile("c:\currenttask", 2, True)
                For cnt = 0 To UBound(sheduleArray)
                        MyFile.WriteLine(sheduleArray(cnt))
                Next
                MyFile.Close
        End Sub

        Sub ReReadCurentTask ' ПереЧитывает текущий файл задания в текущий массив-задания
                Dim fso, MyFile, cnt, stroka
                Set fso = CreateObject("Scripting.FileSystemObject")
                Set MyFile = fso.OpenTextFile("c:\currenttask", 1, False)
                cnt = 0
                Erase sheduleArray ' очищаем массив задания и заполняем его снова уже из файла задания
                Do Until MyFile.AtEndOfStream
                        stroka = MyFile.ReadLine
                        ReDim Preserve sheduleArray(cnt)
                        sheduleArray(cnt) = stroka
                        cnt = cnt + 1
                Loop
                MyFile.Close
        End Sub

        Function GetProfile()
                ReadCurrentSettings
                GetProfile = sheduleArray(0)
        End Function

        Function Continue()
                ReadCurrentSettings
                If sheduleArray(1) = "continue" Then
                        Continue = True
                Else
                        Continue = False
                End If
        End Function

        Sub ReadCurrentSettings ' получает имя текущего профиля, в файле настроек, заодно заполняет массив настроек
                Dim fso, MyFile, cnt, stroka
                Set fso = CreateObject("Scripting.FileSystemObject")
                Set MyFile = fso.OpenTextFile("c:\CurrentSettings", 1, False)
                cnt = 0
                Erase SettingsArray ' очищаем массив Настроек программы и заполняем его снова уже из файла Настроек
                Do Until MyFile.AtEndOfStream
                        stroka = MyFile.ReadLine
                        ReDim Preserve SettingsArray(cnt)
                        SettingsArray(cnt) = stroka
                        cnt = cnt + 1
                Loop
                MyFile.Close
        End Sub

        Sub WriteCurrentSettings ' Записываем массив Настроек программы в файл
                Dim fso, MyFile, cnt
                Set fso = CreateObject("Scripting.FileSystemObject")
                Set MyFile = fso.CreateTextFile("c:\CurrentSettings", True)        ' создали файл настроек
                For cnt = 0 To UBound(SettingsArray)
                        MyFile.WriteLine(SettingsArray(cnt))
                Next
                MyFile.Close
        end Sub

' КОНЕЦ вспомогательные процедуры и функции
'==============================================================
        </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" name="startBotton" value="Start" onclick="StartSub1" />
<br>
<br>
<input type="checkbox"name="BasicCheckbox"value="1" onclick = "onCBChange"> Option 1
<br>
<br>
</body>
</html>


Busla 26-02-2011 14:49 1622315

http://lmgtfy.com/?q=hta+debug

почему vbs? - на js можно написать всё то же самое, но это более полезный опыт, по js больше документации, код js можно повторно использовать в гораздо большем количестве случаев

vxor 26-02-2011 21:57 1622627

Цитата:

Цитата Busla
http://lmgtfy.com/?q=hta+debug »

Это ссылка на гугл? В случайном порядке выбрал VBS, (ибо кроме pascal ничего не знаю) и начал решение задачи. Надо заканчивать.. В след. раз выберу что-нибудь более сильное. Спасибо за ответ!

KnRSU 03-03-2011 08:40 1626041

Цитата:

Цитата xor++
Чем можно отладить текст VBS-скрипта, в теле HTA приложения? »

наверное MsgBox, Debug.Assert и Debug.Print, на крайняк с помощью лог-файлов (ИМХО самое удобное Debug.Assert)

Iska 03-03-2011 13:02 1626226

KnRSU, разве объект «Debug» доступен в контексте «mshta.exe»?

KnRSU 04-03-2011 07:02 1626907

Iska, прошу прощения Вы правы, подсознательно просто провел аналогию с VB
xor++, самое простое использование лог файла для отладки (можно даже некий аналог back-trace состряпать)

vxor 05-03-2011 16:03 1627919

Понял. Спасибо за ответы!! Использую msgbox:)

Понял. Спасибо за ответы!! Использую Primal Script для редактирования и HTAEdit для отладки. Также использую msgbox.

KnRSU 09-03-2011 10:18 1630497

xor++, кстати в HTAEdit есть встроенный отладчик, что само собой снимает поставленный вопрос, просто укажите в коде точку останова и запускайте по кнопке Start

vxor 10-03-2011 11:17 1631376

KnRSU, спасибо за ответ!! Просто когда я задавал этот вопрос я еще не знал про HTAEdit.


Время: 23:23.

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