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

Кирилл

Команда форума
Администратор
Сообщения
13,747
Реакции
6,132
Баллы
913
Вопрос состоит в том,что на том же bat очень удобно использовать call,goto

GoTo не подходит,возможно есть еще какие то методы?
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,101
Реакции
5,882
Баллы
648
Позволь уточнить: у тебя есть отдельно заготовленный список названий процедур
и тебе нужно вызвать ее по имени, которое тебе, скажем, заранее неизвестно?
 

Кирилл

Команда форума
Администратор
Сообщения
13,747
Реакции
6,132
Баллы
913
у тебя есть отдельно заготовленный список названий процедур
и тебе нужно вызвать ее по имени, которое тебе, скажем, заранее неизвестно?
У меня есть комбо,который заполняется списком исходя из выбранной категории.
В списке задачи которые можно выполнить.
Каждая задача для разных систем выполняется по разному,поэтому конструкция типа if combo1... then старт прога
не подходит.

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

glax24

Разработчик
Сообщения
2,001
Реакции
1,491
Баллы
558
Так ты по индексу или тексту комбо можешь понять что выбрано.
 

Кирилл

Команда форума
Администратор
Сообщения
13,747
Реакции
6,132
Баллы
913
да,по тексту - индекс не подходит,потому что в зависимости от выбранной категории и установленной ОС под листиндексом всегда оказывается разный пункт,таким образом под одним листиндексом будет запускаться разные пункты.

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

glax24

Разработчик
Сообщения
2,001
Реакции
1,491
Баллы
558
Так ты проверяй какая ос и категория и получишь уникальный индекс
 

Кирилл

Команда форума
Администратор
Сообщения
13,747
Реакции
6,132
Баллы
913
Не понял тебя.

Вот пример:
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
 
Последнее редактирование:

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,101
Реакции
5,882
Баллы
648
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, чтобы пользователям было меньше мороки / кликов.
 

Кирилл

Команда форума
Администратор
Сообщения
13,747
Реакции
6,132
Баллы
913
Лучше явно объяви несколько переменных (экономить незачем),
это не комфортный вариант...представь под каждую систему отдельно объявлять?

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

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

Ничего не пропустил я?
 

Dragokas

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

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

Кирилл

Команда форума
Администратор
Сообщения
13,747
Реакции
6,132
Баллы
913
Там только 1 переменная
мне как минимум отдельно под хр,семь и 8
+ я смотрел твой класс,там есть такие моменты как
Код:
Case 6.3
            If osi.wProductType = VER_NT_WORKSTATION Then
                OSName_ = "Windows 8.1"
            Else
                OSName_ = "Windows Server 2012 R2"
            End If
Согласись,это уже немного отличается от того что требуется,хотя очень здорово продумано и мне все нравится - много полезной информации,которую активно использую в коде.
Впрочем,спорить не возьмусь - пока не почитаю все по новой на свежую голову,сам знаешь,бывает пишешь что то а потом вдруг идея обновилась и все становится яснее и проще))

Поэтому буду читать пока и переваривать.
 
Последнее редактирование модератором:

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,101
Реакции
5,882
Баллы
648
Твое дело. Если тебе нужна только версия в виде числа, можешь не использовать класс,
а написать просто:
Код:
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
 
Последнее редактирование модератором:
Сверху Снизу