Как связать OptionButtom c select case ?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Dmi3i4
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 06.07.2006 (Чт) 9:59

Как связать OptionButtom c select case ?

Сообщение Dmi3i4 » 10.07.2006 (Пн) 14:52

Всем доброго времени суток !
Народ помогите начинающему, где я ошибся ?
Задача, необходимо набор переключателей (OptionButtom) связать с
select case.
Мои действия
1. Создаю массив из трех элементов Option1(0), Option1(1), Option1(2)
2. непосредственно сам код
Select Case Option1.Item.Index
Case Option1.Item.Index = 0
sql = "select TabPrj.Номер_проекта, TabPrj.Название_проекта, " & _
"TabPrj.Название_объекта, TabIng.Номер_чертежа, TabIng.Фамилия_инженера, " & _
"TabIng.Количество_форматов, TabIng.Проверил_работу " & _
"from TabPrj,TabIng where TabPrj.Номер_проекта=" & Text1.Text & _
" and TabPrj.Номер_проекта=TabIng.Номер_проекта"
Case Option1.Item.Index = 1
sql = "select TabPrj.Номер_проекта, TabPrj.Название_проекта, " & _
"TabPrj.Название_объекта, TabIng.Номер_чертежа, TabIng.Фамилия_инженера, " & _
"TabIng.Количество_форматов, TabIng.Проверил_работу " & _
"from TabPrj,TabIng Where TabIng.Фамилия_инженера = " & " '" & Text2.Text & _
"'" & " and TabPrj.Номер_проекта=TabIng.Номер_проекта"
End Select
3. В результате выдает "Compile error. Argument not optional"
Подскажите как можно это исправить.. или же какие есть альтернативы
решения подобной задачи?
Заранее благодарен.
Код: Выделить всё

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Re: Как связать OptionButtom c select case ?

Сообщение vvs_adm » 10.07.2006 (Пн) 15:16

Для начала
Код: Выделить всё
Select Case Option1.Item.Index
    Case 0:
        <code> (sql=...)
    Case 1:
        <code> (sql=...)
    Case 2:
        <code> (sql=...)
End Select
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

Dmi3i4
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 06.07.2006 (Чт) 9:59

Сообщение Dmi3i4 » 10.07.2006 (Пн) 15:33

vvs_adm
поправил структуру, но ошибка осталась прежняя "Compile error. Argument not optional"

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Re: Как связать OptionButtom c select case ?

Сообщение vvs_adm » 10.07.2006 (Пн) 15:41

потому что я тебе неправильно написал, не проверив :)
Код: Выделить всё
Select Case Index
    Case 0:
        <code> (sql=...)
    Case 1:
        <code> (sql=...)
    Case 2:
        <code> (sql=...)
End Select
Либо для извращенцев
Код: Выделить всё
Select Case Option1.Item(Index).Index
    Case 0:
        <code> (sql=...)
    Case 1:
        <code> (sql=...)
    Case 2:
        <code> (sql=...)
End Select
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

Dmi3i4
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 06.07.2006 (Чт) 9:59

Сообщение Dmi3i4 » 10.07.2006 (Пн) 17:08

При использовании структуры "для извращенцев" не ругается, но работает некорректно, а именно реально работает только первый case. При выборе других пунктов отрабатывает условие case 0:. С чем это может быть связано ?

Dmi3i4
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 06.07.2006 (Чт) 9:59

Сообщение Dmi3i4 » 10.07.2006 (Пн) 17:19

В предыдушем сообщении я допустил ошибку не case 0: , а case 1: отрабатывает корректно

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 10.07.2006 (Пн) 17:27

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

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 11.07.2006 (Вт) 8:08

Я так понял, что надо узнать какой выбран ОтпионБокс. Я конечно мог неправильно понять... Но если я понял правильно, но есть метод для мегаизвращенцев.
Код: Выделить всё

Select Case True
  Case Option1.Value

  Case Option2.Value

End Select


ну в данном случае Option1 Option2 поменяй на Option1(0), Option1(1)
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Сообщение Nicky » 11.07.2006 (Вт) 8:09

ИМХО ругается на то, что после Option1 не находит индекса в парентесах :)

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 11.07.2006 (Вт) 9:02

Код: Выделить всё
Private Sub Option1_Click(Index As Integer)
    Debug.Print Index
End Sub
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 11.07.2006 (Вт) 10:02

vvs_adm писал(а):
Код: Выделить всё
Private Sub Option1_Click(Index As Integer)
    Debug.Print Index
End Sub


This method is invalid.

Допустим мне нужно по нажатию ОК что то делать. Т.е. нужно ещё и объявлять переменную ловить клил и запоминать куда он в последний раз был сделан.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Dmi3i4
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 06.07.2006 (Чт) 9:59

Сообщение Dmi3i4 » 11.07.2006 (Вт) 10:08

Nicky
А как сделать так чтоб не ругался, а работал с ними ?

VVS_ADM
При переборе пунктовв режиме отладки в immediate индексы отображаются верно, но при нажатии command1 независимо от выбора выдает "case 0"

Код: Выделить всё
Option Explicit

Private Sub Command1_Click()
Dim zx, qw As String
Dim Index As Integer

Select Case Option1.Item(Index).Index
    Case 0:
        qw = "case 0"
    Case 1:
        qw = "case 1"
    Case 2:
        qw = "case 2"
End Select

zx = MsgBox(qw, vbOKOnly, "!!!!!")
End Sub

Private Sub option1_Click(Index As Integer)
Debug.Print Index

End Sub

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Сообщение Nicky » 11.07.2006 (Вт) 10:11

Пример. Накидать на форму опшинбатонов, назвать их obTest, добавить кнопку Command1, перемешать, нажать F5
Код: Выделить всё
Option Explicit

Private Sub Command1_Click()
  MsgBox obTest(GetIndex(obTest)).Caption & " is selected"
End Sub

Function GetIndex(ob As Object) As Long
  Dim o As OptionButton
 
  For Each o In ob
    If o.Value Then GetIndex = o.Index
  Next
End Function


Dmi3i4 писал(а):Select Case Option1.Item(Index).Index
Сильно...

Dmi3i4
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 06.07.2006 (Чт) 9:59

Сообщение Dmi3i4 » 11.07.2006 (Вт) 11:02

NIcky
Спасибо. Всё получилось - работает.

Всем спасибо за помощь.

Но если кто то знает альтернативу предложеным методам (непосредственная работа с индексами (index) optionbutton и пр.) плиз напишите здесь..

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Сообщение Nicky » 11.07.2006 (Вт) 11:17

Ну нету у массива контролов этого, нету!
Самое правильное - нарисовать самому

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 11.07.2006 (Вт) 11:31

Чем мой способ не понравился не знаю... Видимо просто так стало принято...
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Сообщение Nicky » 11.07.2006 (Вт) 11:42

Хакер писал(а):Чем мой способ не понравился не знаю... Видимо просто так стало принято...

А если батонов 100 штук? И...это...бесчеловечный он какой-то, способ твой... В том плане, что машине пофиг, а вот человеку в нем непросто разобраться

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 11.07.2006 (Вт) 11:59

ну так ему в комманд1_клик всё равно придётся мутить Select Case для всех 100 индексов.

А мой способ очень даже рульных и хитрый и во многих случаях единственный возможный...
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Сообщение Nicky » 11.07.2006 (Вт) 12:10

Хакер писал(а):ну так ему в комманд1_клик всё равно придётся мутить Select Case для всех 100 индексов.

Ты это видел?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 11.07.2006 (Вт) 12:15

угу... и типа автору вопроса нужно только показать MsgBox да?

Может быть ему надо всё таки так (используя твой метод):
Код: Выделить всё
Option Explicit

Private Sub Command1_Click()
  Select Case GetIndex(obTest)
     Case 0
       'Что то делаем
     Case 1
       'Что то делаем
     Case 2
       'Что то делаем
     Case 3
       'Что то делаем
  End Select
End Sub

Function GetIndex(ob As Object) As Long
  Dim o As OptionButton
 
  For Each o In ob
    If o.Value Then GetIndex = o.Index
  Next
End Function


?

А теперь сравним по размеру с моим методом:


Option Explicit

Код: Выделить всё
Private Sub Command1_Click()
  Select Case True
     obTest(0).Value
       'Что то делаем
     obTest(1).Value
       'Что то делаем
     obTest(2).Value
       'Что то делаем
     obTest(3).Value
       'Что то делаем
  End Select
End Sub


Ну и ... что?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 11.07.2006 (Вт) 12:18

Тем более что:
1) Твой метод использует перебор, что не приветсвуется.
2) Он работает только с массивом.
С Option1, Option2 он работать не будет.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Сообщение Nicky » 11.07.2006 (Вт) 12:36

1. Что есть select case, как не перебор if then elseif then...
2. автор писал: "Создаю массив из трех элементов Option1(0), Option1(1), Option1(2)"

А вот по Command_Click'у с тобой согласен, поторопился :)
Но ведь "что-то делаем" - понятие растяжимое. Опять же, у автора было что-то типа
"sql = "select TabPrj.Номер_проекта, TabPrj.Название_проекта, " & _
"TabPrj.Название_объекта, TabIng.Номер_чертежа, TabIng.Фамилия_инженера, " & _
"TabIng.Количество_форматов, TabIng.Проверил_работу " & _
"from TabPrj,TabIng where TabPrj.Номер_проекта=" & Text1.Text & _
" and TabPrj.Номер_проекта=TabIng.Номер_проекта"

А теперь предположим, что нужные строки уже содержатся в массиве по индексу опшинбатона?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 11.07.2006 (Вт) 12:43

Nicky писал(а):1. Что есть select case, как не перебор if then elseif then...

В случае, когда у Case-ов константы, это jmp по таблице; выполняется мгновенно.
Изображение

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Сообщение Nicky » 11.07.2006 (Вт) 12:50

tyomitch писал(а):В случае, когда у Case-ов константы, это jmp по таблице; выполняется мгновенно.
Уфф!... У Хакер'а не константы :)

GB826
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 312
Зарегистрирован: 04.08.2005 (Чт) 0:58
Откуда: Планета #3

Сообщение GB826 » 11.07.2006 (Вт) 15:23

А еще можно при клике по опшену запоминать индекс в глобальную переменную.
При нажатии кнопки юзать ее...

И не надо будет по циклу пробегаться каждый раз...
Пора уже всем хорошим людям собраться и убить всех плохих людей.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 11.07.2006 (Вт) 15:33

Ну что за народ, а ?

Сравним мой способ и предложеный:
Код: Выделить всё
Dim slIndex as Byte

Private SUb Command1_Click
Select Case slIndex
Case 1
+++++
Case 2
+++++
Case 3
+++++
Case 4
+++++
Case 5
+++++
End Select
End Sub

Private Sub Option1_Click()
slIndex = 1
End Sub

Private Sub Option2_Click()
slIndex = 2
End Sub

Private Sub Option3_Click()
slIndex = 3
End Sub

Private Sub Option4_Click()
slIndex = 4
End Sub


Мой:

Код: Выделить всё
Private Sub Command1_Click()
{
Select Case True
Case Option1

Case Option2

Case Option3

Case Option4

Case Option5

End Select

}


Неужели кто то ещё пытается оспорить то что этот способ самым быстым и удобным. :evil:
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

GB826
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 312
Зарегистрирован: 04.08.2005 (Чт) 0:58
Откуда: Планета #3

Сообщение GB826 » 11.07.2006 (Вт) 15:42

Прикольный синтаксис СиподобныйВБ ;о)
Код: Выделить всё

Private stIndex As Long

Private Sub Command1_Click()
  Select Case stIndex
    Case 1
   
    Case 2

    Case 3
   
  End Select
End Sub

Private Sub Option1_Click(Index As Integer)
  stIndex = Index
End Sub
Пора уже всем хорошим людям собраться и убить всех плохих людей.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 11.07.2006 (Вт) 18:06

Насчёт сиподобноговб: переборщил с PHP

На счёт кода сравним:

Возьмём недорогой обычный порошок:
Код: Выделить всё
Private stIndex As Long

Private Sub Command1_Click()
  Select Case stIndex
    Case 1
   
    Case 2

    Case 3
   
  End Select
End Sub

Private Sub Option1_Click(Index As Integer)
  stIndex = Index
End Sub


А теперь возьмём Хакеросю (тм), которая делает тоже самое:

Код: Выделить всё
Private Sub Command1_Click()
  Select Case True
    Case Option1(1).Value
   
    Case Option1(2).Value

    Case Option1(3).Value
   
  End Select
End Sub


А если нет разницы зачем платить больше?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

GB826
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 312
Зарегистрирован: 04.08.2005 (Чт) 0:58
Откуда: Планета #3

Сообщение GB826 » 12.07.2006 (Ср) 1:21

Смотри ширше. Я могу stIndex использовать как маску, для каких либо операций, и воздействовать на него другими контролами...
А Тебе придется сидеть на опшенбуттонах и прочих булевских контролах :оР
Пора уже всем хорошим людям собраться и убить всех плохих людей.

MeMBus
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 450
Зарегистрирован: 23.02.2005 (Ср) 7:03
Откуда: Из леса...

Сообщение MeMBus » 12.07.2006 (Ср) 3:48

GB826 писал(а):А Тебе придется сидеть на опшенбуттонах и прочих булевских контролах :оР

Если в разрезе "OptionButtom c select case" метод Хакера подходит более чем... А при ширине действий можно применить различные комбинации, он же не пишет – «Люди истина во мне» (тобишь в том коде).
Бороться и искать, найти и перепрятать!

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 98

    TopList  
cron