VB 6 [VB6] Какие бывают методы вызова подпрограммы/процедуры из списка?

Тема в разделе "Visual Basic 6 / Сценарии VBScript, JScript", создана пользователем Kиpилл, 7 июл 2015.

  1. Kиpилл
    Оффлайн

    Kиpилл Команда форума Администратор

    Лучший автор месяца

    Сообщения:
    12.199
    Симпатии:
    4.970
    Вопрос состоит в том,что на том же bat очень удобно использовать call,goto

    GoTo не подходит,возможно есть еще какие то методы?
     
  2. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.476
    Симпатии:
    4.305
    Позволь уточнить: у тебя есть отдельно заготовленный список названий процедур
    и тебе нужно вызвать ее по имени, которое тебе, скажем, заранее неизвестно?
     
  3. Kиpилл
    Оффлайн

    Kиpилл Команда форума Администратор

    Лучший автор месяца

    Сообщения:
    12.199
    Симпатии:
    4.970
    У меня есть комбо,который заполняется списком исходя из выбранной категории.
    В списке задачи которые можно выполнить.
    Каждая задача для разных систем выполняется по разному,поэтому конструкция типа if combo1... then старт прога
    не подходит.

    Поэтому например для одной задачи я написал длинный sub отдельно,и как только в списке комбо будет выбрана задача,то должна быть вызвана заранее написанная процедура,которая хранится в теле программы и ждет своего часа.
     
  4. glax24
    Оффлайн

    glax24 Разработчик

    Сообщения:
    2.000
    Симпатии:
    1.450
    Так ты по индексу или тексту комбо можешь понять что выбрано.
     
  5. Kиpилл
    Оффлайн

    Kиpилл Команда форума Администратор

    Лучший автор месяца

    Сообщения:
    12.199
    Симпатии:
    4.970
    да,по тексту - индекс не подходит,потому что в зависимости от выбранной категории и установленной ОС под листиндексом всегда оказывается разный пункт,таким образом под одним листиндексом будет запускаться разные пункты.

    тоже самое по тексту - например проверка целостности файлов происходит на разных системах по разному,поэтому нельзя тупо стартовать sfc если выбран такой пункт,нужно перебрать условия и запустить правильную операцию.
     
  6. glax24
    Оффлайн

    glax24 Разработчик

    Сообщения:
    2.000
    Симпатии:
    1.450
    Так ты проверяй какая ос и категория и получишь уникальный индекс
     
  7. Kиpилл
    Оффлайн

    Kиpилл Команда форума Администратор

    Лучший автор месяца

    Сообщения:
    12.199
    Симпатии:
    4.970
    Не понял тебя.

    Вот пример:
    Код (vb.net):

    If id_rest = 0 Then
            Combo1.AddItem "Выполнить проверку sfc /scannow", 0
            Combo1.ListIndex = 0
            Combo1.AddItem "Восстановление Хранилища Данных", 1
            Combo1.AddItem "Очистка и восстановление Хранилища", 2
            Combo1.AddItem "Записать лог последних проверок", 3
            Combo1.AddItem "Выполнить проверку sfc в WIN PE", 4
            Combo1.AddItem "Откат системы на предыдущую дату", 5
         
        ElseIf id_rest = 1 Then
            Combo1.AddItem "Выполнить проверку sfc /scannow ", 0
            Combo1.ListIndex = 0
            Combo1.AddItem "Записать лог последних проверок", 1
            Combo1.AddItem "Выполнить проверку sfc в WIN PE", 2
            Combo1.AddItem "Откат системы на предыдущую дату", 3
         End If
     
    Если If id_rest = 0 то вин 8,если 1 - то вин 7
     
    Последнее редактирование: 7 июл 2015
  8. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.476
    Симпатии:
    4.305
    Koza Nozdri, так ты еще больше запутаешься. Лучше явно объяви несколько переменных (экономить незачем),
    которые будут указывать, какая это система, например,

    Код (vb.net):
    Dim isWin8 As Boolean
    '.....
    With Combo1
        .AddItem "Выполнить проверку sfc /scannow"
      If isWin8 Then
        .AddItem "Восстановление Хранилища Данных"
        .AddItem "Очистка и восстановление Хранилища"
      End If
        .AddItem "Записать лог последних проверок"
        .AddItem "Выполнить проверку sfc в WIN PE"
        .AddItem "Откат системы на предыдущую дату"
        .ListIndex = 0
    End With
    Тогда код у тебя станет по крайней мере читабельным.
    На счет запуска нужной процедуры по выбору пункта, я бы просто проверял по имени элемента, например:

    Код (vb.net):
    Private Sub Command1_Click()
        If Combo1.List(Combo1.ListIndex) = "Выполнить проверку sfc /scannow" Then Call RunSFC
    End Sub
    Ну и сразу установи у своего комбо свойство Style - DropDown List, чтобы пользователям было меньше мороки / кликов.
     
  9. Kиpилл
    Оффлайн

    Kиpилл Команда форума Администратор

    Лучший автор месяца

    Сообщения:
    12.199
    Симпатии:
    4.970
    это не комфортный вариант...представь под каждую систему отдельно объявлять?

    По теме:
    Я так понимаю это

    Код (vb.net):
    call
    goto
    gotosub
    index
    И просто вызов с аргументами.

    Ничего не пропустил я?
     
  10. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.476
    Симпатии:
    4.305
    Кирилл, когда ты пишешь под высокоуровневый язык, забудь про батники вообще (на время пока составляешь алгоритм, по крайней мере).
    Ты хотя бы разобрался в моем примере выше?
    Там только 1 переменная. Больше тебе и не нужно. Под какие другие системы?
    Будет только 1 - IsWin8OrLater (является ли система Win8 или новее).
    Используя класс, который я тебе давал, ее значение можно получить сравнив с версией Major и Minor ОС:
    Код (Visual Basic):

    IsWin8OrLater = (OSVer.MajorMinor >= 6.2)
     
    Все. Больше ничего не требуется.

    Из нормальных и правильных вариантов просто вызов процедуры (функции), указав ее имя (и если нужно аргументы)
    так как я показал выше в коде (это аналогично команде call в CMD).
     
    Последнее редактирование модератором: 8 июл 2015
    Kиpилл нравится это.
  11. Kиpилл
    Оффлайн

    Kиpилл Команда форума Администратор

    Лучший автор месяца

    Сообщения:
    12.199
    Симпатии:
    4.970
    мне как минимум отдельно под хр,семь и 8
    + я смотрел твой класс,там есть такие моменты как
    Код (Visual Basic):
    Case 6.3
                If osi.wProductType = VER_NT_WORKSTATION Then
                    OSName_ = "Windows 8.1"
                Else
                    OSName_ = "Windows Server 2012 R2"
                End If
    Согласись,это уже немного отличается от того что требуется,хотя очень здорово продумано и мне все нравится - много полезной информации,которую активно использую в коде.
    Впрочем,спорить не возьмусь - пока не почитаю все по новой на свежую голову,сам знаешь,бывает пишешь что то а потом вдруг идея обновилась и все становится яснее и проще))

    Поэтому буду читать пока и переваривать.
     
    Последнее редактирование модератором: 8 июл 2015
  12. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.476
    Симпатии:
    4.305
    Твое дело. Если тебе нужна только версия в виде числа, можешь не использовать класс,
    а написать просто:
    Код (Visual Basic):

    Private Declare Function GetVersionEx Lib "kernel32.dll" Alias "GetVersionExW" (lpVersionInformation As Any) As Long

    sub form_load()
      Dim inf(68)         As Long
      Dim MajorMinor    as single
      inf(0) = 276: GetVersionEx inf(0): MajorMinor = inf(1) + inf(2) \ 10
    end sub
     
     
    Последнее редактирование модератором: 8 июл 2015

Поделиться этой страницей