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

Кирилл

Команда форума
Администратор
Сообщения
13,826
Реакции
6,168
Баллы
913
То что нужно!
Спасибо.
Уже собираю проект немного,пока улетел на работу.Форма готова.
Над украшениями позже поработаю.
Кнопки работают,запросы отправляются,юмор в наличии.
http://rghost.ru/57188770

Вопрос: первая меню отработала,как другое вызывать?
Через новую форму?
Еще как то?
 
Последнее редактирование:

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,132
Реакции
5,907
Баллы
648
Кирилл, ты исходник выкладывай. Зачем мне EXE.
Несколько разных по виду и наполнению меню нужно сделать?
Тогда да, лучше создавать новую форму.

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

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

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

Кирилл

Команда форума
Администратор
Сообщения
13,826
Реакции
6,168
Баллы
913
Несколько разных по виду и наполнению меню нужно сделать?
Да.
Получается при этом будет открываться новое окно?
Надо тогда будет делать точное позиционирование,а старое закрывать или делать невидимым.
В целях безопасности формы делаем модальными.
http://rghost.ru/57189549

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

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

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,132
Реакции
5,907
Баллы
648
p.s. пока все не так жутко как я думал)
А жутко и не будет. У тебя ведь конкретная задача.
Многого знать не нужно.
Главное правильно представить в голове алгоритм.
Если предполагается использовать один и тот же участок кода несколько раз,
лучше оформить его как отдельную функцию, в которую передавать нужные параметры.

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

Важное правило.
Первой строкой всегда пиши: Option Explicit
Тогда среда тебя буквально заставит всегда объявлять переменные:
VB.NET:
Dim Title
Это поможет тебе не ошибиться с их написанием, если ты где-то случайно сделаешь опечатку Titlee.
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,132
Реакции
5,907
Баллы
648
Если нужно показать 1-ю форму после закрытия крестиком 2-й,
нужно создать событие "Запрос на закрытие формы" (Query Unload) или событие "После выгрузки из памяти формы" (Unload).

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

Query Unload.png

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

q.png

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

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

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

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

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

Вложения

Последнее редактирование:

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,132
Реакции
5,907
Баллы
648
Замечания по стилю.
Давай сразу учиться правильным общепринятым отступам:

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

VB.NET:
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)
 
Последнее редактирование:

Кирилл

Команда форума
Администратор
Сообщения
13,826
Реакции
6,168
Баллы
913
Dragokas, как сделать так,что бы при нажатии кнопки "Задать имя меню" появлялся textbox,а при повторном нажатии данные передавались бы и textbox скрывался бы опять?
форма frmUstanovka_Menu

http://rghost.ru/57233119
 
Последнее редактирование:

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,132
Реакции
5,907
Баллы
648
Создаешь TextBox на форме и в его свойствах сразу задаешь Visible = False
На кнопку вешаешь такой код:
VB.NET:
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.
 
Последнее редактирование:

Кирилл

Команда форума
Администратор
Сообщения
13,826
Реакции
6,168
Баллы
913
О,получается я параметры могу задавать не только в редакторе или через события,а прямо в коде!
Это многое объясняет.
 

Кирилл

Команда форума
Администратор
Сообщения
13,826
Реакции
6,168
Баллы
913
Смени шрифт на стандартный.
стоит normal text.
Что то не так,я получаю ошибку:
VB.NET:
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 ,может для кнопки нельзя задавать?
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,132
Реакции
5,907
Баллы
648
Ты неправильно создал кнопку.
У тебя все кнопки являются массивом и сейчас имеют такие имена:

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

cb.png

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

Кирилл

Команда форума
Администратор
Сообщения
13,826
Реакции
6,168
Баллы
913
Интерфейс ужасен,я знаю - щас задача собрать код,украшалки я на потом оставлял.


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


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

Давай начнем с кода для получения названий пунктов контекстного меню.
Ага,давай.
Тут или в теме про vbs?
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,132
Реакции
5,907
Баллы
648
Код здесь. А теорию в реестр: http://safezone.cc/threads/glagoly-kontekstnogo-menju-po-umolchaniju.23599/
Сначала напиши все, какие знаешь разделы реестра,
отвечающие за показ контекстного меню:
  • для рабочего стола,
  • для папки,
  • для файла,
  • для панели управления ...
Это так... для практики.

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

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

Код для запроса имен параметров / разделов сейчас черкону.
 

Кирилл

Команда форума
Администратор
Сообщения
13,826
Реакции
6,168
Баллы
913
Кстати у тебя в коде кое чего не хватало:
VB.NET:
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
Но это уже не актуально видимо)
 
Последнее редактирование:

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,132
Реакции
5,907
Баллы
648

Кирилл

Команда форума
Администратор
Сообщения
13,826
Реакции
6,168
Баллы
913
Последнее редактирование:

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,132
Реакции
5,907
Баллы
648

Кирилл

Команда форума
Администратор
Сообщения
13,826
Реакции
6,168
Баллы
913
На форме должно создаваться меню идентичное контекстному.
Менять местами пункты можно будет путем их перетягивания.
Я позже попробую смоделировать.
А я кажется понял.
Делаем аналог меню ,добиваем каждый в объект Visible и drug'n'drop ,не забываем добивать навигацию и опционал и тогда все становится предельно интуитивно просто для пользователя!
Ну если я так все понял - тогда сразу добивать алгоритм на более глобальный.

Да?
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,132
Реакции
5,907
Баллы
648
Можешь помудрить с кодом добавления каскадного меню.
 

Кирилл

Команда форума
Администратор
Сообщения
13,826
Реакции
6,168
Баллы
913
Ок.
Примерно прикинул в уме.
Давай я сначала с формами закончу а потом уже с реестром?
 
Сверху Снизу