Практическое занятие по Visual Basic 6

Кирилл

Команда форума
Администратор
Ассоциация VN
Сообщения
14,069
Реакции
5,784
То что нужно!
Спасибо.
Уже собираю проект немного,пока улетел на работу.Форма готова.
Над украшениями позже поработаю.
Кнопки работают,запросы отправляются,юмор в наличии.


Вопрос: первая меню отработала,как другое вызывать?
Через новую форму?
Еще как то?
 
Последнее редактирование:
Кирилл, ты исходник выкладывай. Зачем мне EXE.
Несколько разных по виду и наполнению меню нужно сделать?
Тогда да, лучше создавать новую форму.

В правой части, где имя формы (Form1) жми правой кнопкой -> Add Form.

Чтобы из кода вызвать другую форму:
VB.NET / VBA:
Form2.Show
Соответственно первую первую форму можно временно спрятать:
VB.NET / VBA:
Form1.Hide
'или
me.Hide
'me - ключевое слово ("меня"). Т.е. код действует на форму, внутри которой этот код написан.

Форма может быть вызвана:
  • модально (нельзя переключаться между формами - пример "Окно служб Windows" и "окно Свойств любой из служб")
  • немодально (можно переключаться - пример любые два окна проводника Windows)

Чтобы отобразить форму модально:
VB.NET / VBA:
Form2.Show 1

Немодально:
VB.NET / VBA:
Form2.Show 0

По умолчанию (если цифру не писать) будет вызвана немодально.
Надеюсь, ничего не препутал :)Вообще, контролы на форме можно создавать программно,
например, если тебе заранее неизвестно, сколько нужно создать флажков или кнопок...Также есть такой компонент, как таймер.
Он позволяет выполнять один и тот же код через N секунд.
Будет полезно, например, для периодического обновления данных на форме (если к примеру значения в реестре поменялись).
Такой способ является плохим тоном в программировании, т.к. существуют события.
Как только что-то изменилось в реестре, твоя программа может получить об этом извещении.
Но это не для новичков. Идем последовательно от простого к сложному.
 
Последнее редактирование:
Несколько разных по виду и наполнению меню нужно сделать?
Да.
Получается при этом будет открываться новое окно?
Надо тогда будет делать точное позиционирование,а старое закрывать или делать невидимым.
В целях безопасности формы делаем модальными.


p.s. пока все не так жутко как я думал)
первую первую форму можно временно спрятать:
Да,выглядит неплохо.
Одно но:
Не забыть при этом активировать его обратно или сразу же закрывать.
Думаю для разных меню по разному.
Пока что вторая форма закрывает первую,привидения нам не к чему.

Вроде разобрался,не хватает только опыта что где и как находится.
Допилю формы,накидаю меню и кнопки - буду снова писать если возникнут проблемы при создании сложных объектов на основе имени переменных...
upload_2014-7-31_23-25-43.png
 
Последнее редактирование:
p.s. пока все не так жутко как я думал)
А жутко и не будет. У тебя ведь конкретная задача.
Многого знать не нужно.
Главное правильно представить в голове алгоритм.
Если предполагается использовать один и тот же участок кода несколько раз,
лучше оформить его как отдельную функцию, в которую передавать нужные параметры.

Не забыть при этом активировать его обратно или сразу же закрывать.
Если нужно выйти из программы (а значит и выгрузить все формы),
можно написать просто оператор End.

Важное правило.
Первой строкой всегда пиши: Option Explicit
Тогда среда тебя буквально заставит всегда объявлять переменные:
VB.NET / VBA:
Dim Title
Это поможет тебе не ошибиться с их написанием, если ты где-то случайно сделаешь опечатку Titlee.
 
Если нужно показать 1-ю форму после закрытия крестиком 2-й,
нужно создать событие "Запрос на закрытие формы" (Query Unload) или событие "После выгрузки из памяти формы" (Unload).

Для этого:
1) переходишь в окно кода 2-й формы.
2) в левом выпадающем списке выбираешь "Form"
3) в правом - QueryUnload

Query Unload.png


Будет создано событие:

q.png


Внутри события пишешь, как обычно:
VB.NET / VBA:
Form1.Show

Кстати, если внутри процедуры написать:
VB.NET / VBA:
Cancel = true
то форму нельзя будет закрыть крестиком.На счет твоего меню:
- проще сделать 3 кнопки, чем OptionButton-ы.

Но это твоя прога, так что я не лезу.

Возьми себе под руки справочник. Там по подгруппам все разбито.
Полезная вещь. Всегда должна быть под руками.

Справочник VBA. Операторы и функции в принципе все те же.
Разница только в событиях формы.

Если хочешь знать, что означают события и параметры как Cancel, UnloadMode
-> берешь справочник VB Крепкий орешек -> Разное полезное -> Описание событий VB -> ищешь например "QueryUnload".
Вроде разобрался,не хватает только опыта что где и как находится.
Ну, тут способов много:
гугл, справочник, книга, спросить, пощелкать...
Я предпочитаю последнее :)
 

Вложения

  • VBA_Help.rar
    1.6 MB · Просмотры: 9
  • VB Крепкий орешек.rar
    380.5 KB · Просмотры: 11
Последнее редактирование:
Замечания по стилю.
Давай сразу учиться правильным общепринятым отступам:

Внутри процедуры все строки пишутся со знака табуляции:

VB.NET / VBA:
Private Sub run_Click()
    If Ustanovka.Value = True Then
        MsgBox "Priva ета кнопка 1)))"
    else
        MsgBox "О_о. Здесь такого не было :)"
    End If
    If Nastroika.Value = True Then
        MsgBox "Priva это ж кнопка 2"
    End If
end sub

3-я строка - еще 1 знак табуляции.

Теперь стандарт на счет названий контролов.
Если даешь им свои имена, не забывай пожалуйста ставить вначало префикс типа контрола.
Например, вместо Ustanovka пиши optUstanovka. (opt - от слова optionButton)
Тогда будет понятно к чему название относится.
Вместо GlavnoeOkno -> frmGlavnoeOkno.

Другие префиксы:
Чекбоксы: chkMyCheckBox
Кнопки: cbMyButton (cb - CommandButton)
 
Последнее редактирование:
Dragokas, как сделать так,что бы при нажатии кнопки "Задать имя меню" появлялся textbox,а при повторном нажатии данные передавались бы и textbox скрывался бы опять?
форма frmUstanovka_Menu
 
Последнее редактирование:
Создаешь TextBox на форме и в его свойствах сразу задаешь Visible = False
На кнопку вешаешь такой код:
VB.NET / VBA:
if cb1.caption = "Задать имя меню" then
    TextBox1.Visible = True
    cb1.caption = "Применить"
else
    s = TextBox1.Text
    TextBox1.Visible = false
    cb1.caption = "Задать имя меню"
end if

В переменной s получаешь введенный текст.
Когда нажимаешь кнопку, название на ней меняется
и это служит индикатором того, какую часть кода в IF нужно выполнять.
cb1 - это имя объекта твоей кнопки. Подправишь сам.GlavnoeOkno - у меня все крякозябликами. Смени шрифт на стандартный.
Архив vba.rar но это язык vb6 а не vba.
 
Последнее редактирование:
О,получается я параметры могу задавать не только в редакторе или через события,а прямо в коде!
Это многое объясняет.
 
Смени шрифт на стандартный.
стоит normal text.
Что то не так,я получаю ошибку:
VB.NET / VBA:
Private Sub cbNameMenu_Click(Index As Integer)
    If cbNameMenu.Caption = "Задать название меню" Then
        txtTypeName.Visible = True
        cbNameMenu.Caption = "Применить"
    Else
         s = txtTypeName.Text
         txtTypeName.Visible = False
         cbNameMenu.Caption = "Задать имя меню"
    End If
   
End Sub
Ошибкой выделяет .Caption в If cbNameMenu.Caption ,может для кнопки нельзя задавать?
 
Ты неправильно создал кнопку.
У тебя все кнопки являются массивом и сейчас имеют такие имена:

cbNameMenu(0)
cbNameMenu(1)
cbNameMenu(2)

cb.png


Нужно создавать кнопки заново.
Если ты создаешь новую кнопку путем "копировать-вставить",
будет задан вопрос "Создать ли массив кнопок" -> нужно отвечать "нет".Давай начнем с кода для получения названий пунктов контекстного меню.
Интерфейс пока что ужасен :) Предлагаю чтобы на форме динамически создавались кнопки, идентичные контекстному меню.
 
Интерфейс ужасен,я знаю - щас задача собрать код,украшалки я на потом оставлял.


Предлагаю чтобы на форме динамически создавались кнопки, идентичные контекстному меню.
Это как?


Ты неправильно создал кнопку.
Прикинь,я уже почти сам догадался)))
Читал много тем про caption и не мог понять почему у меня он недоступен.
Уже хотел на отдельной форме пробовать...

Давай начнем с кода для получения названий пунктов контекстного меню.
Ага,давай.
Тут или в теме про vbs?
 
Код здесь. А теорию в реестр: https://safezone.cc/threads/glagoly-kontekstnogo-menju-po-umolchaniju.23599/
Сначала напиши все, какие знаешь разделы реестра,
отвечающие за показ контекстного меню:
  • для рабочего стола,
  • для папки,
  • для файла,
  • для панели управления ...
Это так... для практики.

Какое из этих меню будешь брать в целях задачи с шаблонами?

На форме должно создаваться меню идентичное контекстному.
Менять местами пункты можно будет путем их перетягивания.
Я позже попробую смоделировать.

Код для запроса имен параметров / разделов сейчас черкону.
 
Кстати у тебя в коде кое чего не хватало:
VB.NET / VBA:
Private Sub cbNameMenu_Click()

    If cbNameMenu.Caption = "Задать название меню" Then
        txtTypeName.Visible = True
        cbNameMenu.Caption = "Применить"
    Else
         Dim s
         s = txtTypeName.Text
         txtTypeName.Visible = False
         cbNameMenu.Caption = "Задать имя меню"
    End If
End Sub
Но это уже не актуально видимо)
 
Последнее редактирование:
Последнее редактирование:
На форме должно создаваться меню идентичное контекстному.
Менять местами пункты можно будет путем их перетягивания.
Я позже попробую смоделировать.
А я кажется понял.
Делаем аналог меню ,добиваем каждый в объект Visible и drug'n'drop ,не забываем добивать навигацию и опционал и тогда все становится предельно интуитивно просто для пользователя!
Ну если я так все понял - тогда сразу добивать алгоритм на более глобальный.

Да?
 
Можешь помудрить с кодом добавления каскадного меню.
 
Назад
Сверху Снизу