- •Form2.Show
- •Integer ‘целое число со знаком от –32 768 до 32767
- •Interval – 1000 (время, в миллисекундах, через которое таймер срабатывает, если конечно включен). Таймер будет срабатывать каждые 1000 мск, т.Е. Каждую секунду, как в нормальных часах.
- •InputBox("сообщение", "заголовок окна", "данные по умолчанию", расстояние между левой границей экрана и левым краем экрана,то же для верхней границы, "имя Help-файла" , номер раздела Help-файла)
- •Input #номерФайла, списокПеременных
- •15,"Пятнадцать" #true#,#2004-07-20#
- •Shell ("путь до файла программы", "вид окна, в котором откроется программа")
- •Private Sub Command1_Click() Combo1.AddItem Combo1.Text End Sub
- •Массив - это сколько угодно значений, объединенных одним именем.
- •Объект.PopupMenu имяменю, флаг, позицияX, позицияY, выделеннаястрока
- •Form1.PrintForm
- •CommonDialog1.ShowOpen
- •Dim Name As String Dim Kolichestvo As Long Dim Cost As Single
Shell ("путь до файла программы", "вид окна, в котором откроется программа")
Путь - это понятно, а второй аргумент - константа, которая может принимать следующие значения:
Имя константы |
Числовое значение константы |
Вид окна, в котором откроется программа |
vbHide |
0 |
скрытое окно, фокус |
vbNormalFocus |
1 |
свой размер, фокус |
vbMinimizedFocus |
2 |
в виде значка в контрольной панели, фокус |
vbMaximizedFocus |
3 |
в полный экран с фокусом |
vbNormalNoFocus |
4 |
свой размер без фокуса |
vbMinimizedNoFocus |
6 |
в виде значка в контрольной панель, без фокуса |
Пример использования:ProgGO = Shell("C:\Program Files\BANDIT.EXE", 1) запускает программу "Однорукий бандит" с тем размером экрана, которая она имеет. Фокус будет на окне программы. В переменную, которую я назвал, например, ProgGO (ее надо объявить Dim ProgGo) возвращается идентификационный номер запущеной программы. А если программу запустить не удалось, возникает ошибка.
Извини за долгое оступление, но я посчитал своим долгом вывалить все это на тебя. Хоть и не сложно, но это понадобиться. Теперь, наконец, вернемся к нашей программе-тесту. Мы уже объявили все переменные, теперь сделаем собственную процедуру, которая будет грузить вопросы, ответы и баллы в форму. Назовем ее Loading().
Private Sub Loading()
Первым делом, конечно зададим имя формы, чтоб красиво было.
Form1.Caption = "Запись теста - только для администратора теста"
Поскольку мы к этой процедуре будем обращаться неоднократно и переменные могут хранить старые значения, мы очистим их:
Vopros = "" Otvet1 = "" Otvet2 = "" Otvet3 = "" Ball1 = 0 Ball2 = 0 Ball3 = 0
Теперь нам надо загрузить данные из файла вопросника. Для этого нам надо открыть файл с именем "номер вопроса.txt". Номер вопроса должен храниться в переменной NomVopros. Мы при загрузке формы присвоим ей значение "1", чтобы сначала попробовать загрузить файл с первым вопросом. Прежде, чем открывать файл, надо проверить, существует ли он. Возможно это начало работы с тестом, и никаких вопросов просто не существует. Делаем это с помощью функции Dir, о которой мы так много говорили (причем ищем все в текущем каталоге - App.Path )
If Dir(App.Path & "\" & NomVopros & ".txt") <> "" Then
и если у нас файл существует (Dir - не пустая строка), тогда определяем свободный номер файла и открываем его
F = FreeFile Open App.Path & "\" & NomVopros & ".txt" For Input As #F
Теперь с помощью оператора Input# считываем данные (я использовал три оператора только ради удобства чтения кода) и не забываем закрыть файл.
Input #F, Vopros Input #F, Otvet1, Otvet2, Otvet3 Input #F, Ball1, Ball2, Ball3 Close #F
В другой ветви оператора If (когда файла не существует) мы присваиваем булевой переменной Flag значение True
Else Flag = True End If
Переменная Flag служит нам индикатором, существует ли текущий файл (Flag=False), или еще нет (Flag=True). Больше мы в этой ветви цикла If ничего не делаем, потому. что открывать нечего. Но, после цикла, чтобы наши данные отобразились в форме, мы Текстбоксам присваиваем соответствующие значения переменных, независимо от того, пусты они или нет. Пользователь должен видеть реальную картину.
Text1.Text = Vopros Text2.Text = Otvet1 Text3.Text = Otvet2 Text4.Text = Otvet3 Text5.Text = Ball1 Text6.Text = Ball2 Text7.Text = Ball3
Конец процедуры
End Sub
Теперь переходим к процедуре Form_Load. Что ж мы делаем при загрузке нашей формы Form1?
Private Sub Form_Load()
Присваиваем значение переменной NomVopros единицу (мы же хотим начинать с первого вопроса) и устанавливаем значение нашего флага в значение False. Изначально мы предполагаем, что файл с номером вопроса 1 существует:
NomVopros = "1" Flag = False
Выводим в Label1 для пользователя номер обрабатываемого вопроса
Label1.Caption = "Вопрос № " & NomVopros
запускаем нашу процедуру загрузки файла Loading и конец процедуре Form_Load
Loading End Sub
Теперь создаем процедуру для кнопки Command1 - это просто запись в файл с помощью оператора Write#. Только перед записью мы нашим переменным присвоим текущие значения Текстбоксов
Private Sub Command1_Click() Vopros = Text1.Text Otvet1 = Text2.Text Otvet2 = Text3.Text Otvet3 = Text4.Text Ball1 = Text5.Text Ball2 = Text6.Text Ball3 = Text7.Text
ну и открываем и записываем файл под именем "номер текущего вопроса.txt"
F = FreeFile Open App.Path & "\" & NomVopros & ".txt" For Output As #F Write #F, Vopros Write #F, Otvet1, Otvet2, Otvet3 Write #F, Ball1, Ball2, Ball3 Close #F
Поскольку мы файл записали, значит он существует, устанавливаем наш флаг в положение False и конец процедуре.
Flag = False End Sub
Остаются две кнопки Command2 и Command3, которые служат для передвижения по файлам (то бишь вопросам). Здесь я использую такой принцип: при нажатии кнопки вверх (Command2) имя файла, он же вопрос, уменьшается на единицу, а при нажатии кнопки вниз (Command3)- увеличивается на единицу. После этого происходит переход к процедуре Loading, которая загружает новый файл (вопрос). Однако здесь надо поставить определенные ограничения. Для Command2: Здесь все просто - мы проверяем, не меньше ли единицы наш номер билета. Если не меньше, то пожалуйста, уменьшаем номер на единицу и переходим к нашей процедуре Loading, а в противном случае ничего не делаем.
Private Sub Command2_Click() If NomVopros > 1 Then NomVopros = NomVopros - 1 Label1.Caption = "Вопрос № " & NomVopros Loading End If End Sub
А вот с другой кнопкой Command3 дело обстоит несколько сложнее. Нам нужно, чтоб мы двигались вперед до тех пор, пока не дойдем до первого несуществующего файла (нам же нужно создавать новые впросы для тестирования) и на нем стоп! Для этого мы проверяем выполнение двух условий: первое - хотим ли мы перейти к существующему файлу, или этот файл еще не создан? Это просто проверяется функцией Dir. Если мы просто переходим с последнего файла на несуществующий - это пожалуйста, а вот если мы уже на несуществующем и пытаемся двигаться дальше, то этого допустить никак нельзя, поэтому второе - вот настал час переменной Flag. Так вот ее состояние таково, что показывает, на каком файле мы находимся перед переходом. Если Flag=False, значит мы стоим на нормальном файле и к несуществующему перейти вполне можно и мы увиличиваем на единицу номер файла. А вот если Flag=True, то значит мы уже достигли предела и двигаться дальше нельзя. Вот это код:
Private Sub Command3_Click() If Dir(App.Path & "\" & NomVopros & ".txt") = "" And Flag = True Then Exit Sub Else NomVopros = NomVopros + 1 Loading End If Label1.Caption = "Вопрос № " & NomVopros End Sub
Здесь мы используем оператор Exit Sub, который позволит нам выйти из процедуры, не выполняя ее до конца. Хочу обратить твое внимание, что в коде программы в трех местах встречается одна и та же строка Label1.Caption = "Вопрос № " & NomVopros. Это недопустимая халатность. На работоспособности программы это, конечно не скажется, но с точки зрения программирования, каждая лишняя строчка (особенно если их тысячи) - это смерть разрабатчикам, т.е. нам. Попробуйте убрать ее и поставить в одном месте, где бы она "работала за троих". В исходнике это сделано. Далее для красоты ты можешь надписи на кнопках Command2 и Command3 заменить стрелочками. Я вот нарисовал их просто в Paint'e. Получилось два маленьких bmp-файла Up.bmp и Down.bmp. Чтобы поставит их в кнопку нужно свойство кнопки Style в состояние 1 - Graphical, очистить свойство Caption и в свойстве Picture нажать на кнопочку с тремя точечками. У тебя появиться окно "загрузить рисунок", где можно благополучно выбрать графический файлик. Это файлик сохранится в твоей программе и таскать его за собой больше не надо, но у меня в исходнике они лежат, как бы для примера.
Ну вот, с первой частью программы мы закончили. А теперь неплохо-бы сделать форму собственно для тестирования. Для этого в нашу программу надо добавить еще одну форму. Вверху общего окна VB надо нажать на кнопку со словом Проект и в выпавшем меню кликнуть по первой строке "Добавить форму". Тут же откроется окно "Добавить форму" и первая картинка называется "Форма". Выдели ее, если она не выделена и нажми кнопку в этом же окне "Открыть" (или там Open). И хрясть, перед вами новая форма Form2, ну точно такая же как и старая.
Сделаем все почти по аналогии с первой формой.
Кладем на Form2, Label1, Text1, Command1 и Frame1. После этого, сразу во Frame1, а не на форму кладем три радиокнопки Option1, Option2 и Option3. Вот и готово. Кнопка Command1 будет называться " Ответить". Теперь объявляем переменные, аналогичные первой форме
Option Explicit Dim NomVopros As Variant Dim Vopros As String Dim Otvet1 As String Dim Otvet2 As String Dim Otvet3 As String Dim Ball1 As Long Dim Ball2 As Long Dim Ball3 As Long Dim F As Long
плюс еще SumAns для суммирования баллов
Dim SumAns As Long
Создаем процедуру Loading, почти такую же, как и в первой форме, только ответы выводим в названия радиокнопок, а баллы нам вообше выводить не надо. И устанавливаем первую радиокнопку в положение "включено", иначе, если все кнопки будут выключены, пользователь может нажать кнопку "Ответить" , не выбрав варианта ответа.
Private Sub Loading() Option1.Value = True ' первая радиокнопка включена Vopros = "" Otvet1 = "" Otvet2 = "" Otvet3 = "" Ball1 = 0 Ball2 = 0 Ball3 = 0 If Dir(App.Path & "\" & NomVopros & ".txt") <> "" Then F = FreeFile Open App.Path & "\" & NomVopros & ".txt" For Input As #F Input #F, Vopros Input #F, Otvet1, Otvet2, Otvet3 Input #F, Ball1, Ball2, Ball3 Close #F Else End If
Option1.Caption = Otvet1 Option2.Caption = Otvet2 Option3.Caption = Otvet3 Text1.Text = Vopros Label1.Caption = "Вопрос № " & NomVopros End Sub
В процедуре загрузки формы задаем название формы
Private Sub Form_Load() Form2.Caption = "Тестирование"
обнуляем на всякий случай сумматор ответов
SumAns = 0
и далее как в первой форме
NomVopros = "1" Loading End Sub
Теперь код кнопки "Ответить"
Private Sub Command1_Click()
Проверяем, какая радиокнопка нажата, и в зависимости от этого увеличиваем сумматор на количество баллов ответа
If Option1.Value = True Then SumAns = SumAns + Ball1 If Option2.Value = True Then SumAns = SumAns + Ball2 If Option3.Value = True Then SumAns = SumAns + Ball3
увеличиваем номер вопроса на один и проверяем, существует ли такой файл
NomVopros = NomVopros + 1 If Dir(App.Path & "\" & NomVopros & ".txt") = "" Then
если не существует, заканчиваем тест, находим среднее арифметическое и в зависимости от него выдаем сообщение в Text1 с помощью вложенного условия
Text1.Text = "Тест окончен" If SumAns / (NomVopros - 1) <= 1 Then Text1.Text = Text1.Text & " Вы злой как собака" ElseIf SumAns / (NomVopros - 1) > 1 And SumAns / (NomVopros - 1) <= 2 Then Text1.Text = Text1.Text & " Бывают и добрее" Else Text1.Text = Text1.Text & " Вы сама доброта, таких не бывает" End If
Если есть файл, переходим к процедуре загрузки Loading и конец процедуре
Else Loading End If End Sub
Вот, практически и все. Только для редактирования вопросов надо иметь возможность тайно заходить на первую форму. Для этого я использовал два клика по TextBox'у
Private Sub Text1_DblClick() Form1.Show End Sub
И последнее. Поскольку первой (по умолчанию) должна грузиться Form2, войдем в меню Проект вверху окна VB и в выпавшем списке кликнем по последней строке "Проект1 Свойства". У нас откроется окно "Свойства проекта". На вкладке "Главное" в поле "Объект запуска" выберем Form2. Готово. Сохраняем проект. Исходник можно скачать вверху страницы.
Объекты ComboBox и ListBox. |
Ну и в конце главы поговорим еще об объектах. Два объекта ComboBox и ListBox очень похожи. Основные различия их в следующем: ComboBox выполнен в виде выпадающего списка и пользователь может добавлять в него строки, а ListBox похож на TextBox, если все строки не вмещаются, включаются полосы прокрутки. Основные методы у них следующие: .AddItem - позволяет добавлять пункты (строки) .RemoveItem - позволяет удалять строки А основные свойства это: .List(n) - позволяет ввести или вывести содержимое n-ой строки (пункта) .ListCount - позволяет узнать количество строк (пунктов в объекте) .ListIndex - позволяет вывести номер строки пункта, или перейти к строке с эти номером. Для ComboBox'a пустая строка имеет номер -1 (минус 1), а строки списка нумеруются от 0 и далее, поэтому количество строк всегда на 1 больше, чем номер последней строки. В ListBox'e нет строки -1 (минус 1). .Text - позволяет вывести содержимое стоки, например в TextBox
Исходя из этого, и преполагая, что в нашем проекте на форме Form1 лежат Text1, Command1, Combo1, List1, то вот пример кое-каких действий, которые мы можем совершить с ComboBox или ListBox
- добавить строку (пункт) Combo1.AddItem "Нулевая строка" ' добавляет строку номером (ListIndex) 0 (потому-что первая) Combo1.AddItem "Вася" ' добавляет строку номером (ListIndex) 1 (потому-что вторая) List1.AddItem "Нулевая строка" Другой путь - это войти в свойство .List в окне свойств, щелкнуть по свойству и выпавшем окне и дописывать строки в ручную, но мне представляется это не решением вопроса.
- удалить строку (пункт) Combo1.RemoveItem 0 или ' удаляет строку под номером (ListIndex) 0 List1.RemoveItem 0
- узнать (например вывести в TextBox) количество строк Text1.Text = Combo1.ListCount Text1.Text = List1.ListCount
- перейти к третьей строке Combo1.ListIndex = 2 List1.ListIndex = 2
- вывести строку в TextBox Text1.Text = Combo1.Text 'выводит строку, по которой щелкнули мыщью Text1.Text = List1.Text Text1.Text = Combo1.List(3) 'выводит четвертую строку Text1.Text = List1.List(3)
- позволить пользователю дописать новую строку (только в ComboBox) Это можно реализовать следующим образом. При загрузке пустая строка (ее индекс -1) пустая. В нее пользователь и пишет содержимое строки. Но оно не сохраниться. Поэтому, для сохранения новой строки можно использовать например, командную кнопку Command1. Тогда ее процедура будет выглядеть так
