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

Кирилл

Команда форума
Администратор
Ассоциация VN
Сообщения
14,069
Реакции
5,784
Вопрос состоит в том,что на том же bat очень удобно использовать call,goto

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

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

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

Вот пример:
VB.NET / VBA:
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
 
Последнее редактирование:
Koza Nozdri, так ты еще больше запутаешься. Лучше явно объяви несколько переменных (экономить незачем),
которые будут указывать, какая это система, например,

VB.NET / VBA:
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 / VBA:
Private Sub Command1_Click()
    If Combo1.List(Combo1.ListIndex) = "Выполнить проверку sfc /scannow" Then Call RunSFC
End Sub

Ну и сразу установи у своего комбо свойство Style - DropDown List, чтобы пользователям было меньше мороки / кликов.
 
Лучше явно объяви несколько переменных (экономить незачем),
это не комфортный вариант...представь под каждую систему отдельно объявлять?

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

VB.NET / VBA:
call
goto
gotosub
index
И просто вызов с аргументами.

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

Из нормальных и правильных вариантов просто вызов процедуры (функции), указав ее имя (и если нужно аргументы)
так как я показал выше в коде (это аналогично команде call в CMD).
 
Последнее редактирование модератором:
Там только 1 переменная
мне как минимум отдельно под хр,семь и 8
+ я смотрел твой класс,там есть такие моменты как
Код:
Case 6.3
            If osi.wProductType = VER_NT_WORKSTATION Then
                OSName_ = "Windows 8.1"
            Else
                OSName_ = "Windows Server 2012 R2"
            End If

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

Поэтому буду читать пока и переваривать.
 
Последнее редактирование модератором:
Твое дело. Если тебе нужна только версия в виде числа, можешь не использовать класс,
а написать просто:
Код:
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
 
Последнее редактирование модератором:
Назад
Сверху Снизу