Остап Бендер знал, в шахматах, только один ход. Но сумел
получить звание гроссмейстера, временно, да. Но, я как и он, не
претендую на вечность. Согласен и на меньшее, если пообе-
щают по шее не надавать, напишу и дальше. Конечно, кто купит
книжку, ожидают прочитав, что после снисходительного про-
листывания, попадут прямиком в Микрософт. Таким, я честно
скажу, за пару монет можно купить много, а за 2 пары, еще
больше. Большая Американская мечта ждет не только амери-
канцев. Если, она вас не полюбит, обращаться со всеми претен-
зиями к себе! Но, попытаться, соблазнить ее, стоит. Что первое
на уме? Вызвать первую улыбку у дамы, подарив презент или
цветы, а может спеть мадригал? Попробую...
Компьютерное счастье поет строчками компьютерных же,
кодов. Предположительно.
1-ый заход:
Компа хлебом не корми, а дай что-нибудь посчитать..
Хочу знать, скажем, величину факториала и не раз!
Вызываю Бейсик на связь. Он, как хороший официант,
предлагает несколько блюд, пока что я не стал бароном,
скромничаю, жму сразу ”ОК”. И имею простейший вариант.
Только простая форма, без изысков кода.
Рисую кнопку, переименовываю в cmdFactor. Дважды быстро
щелкнув на ней, вызываю редактор кодов, в дальнейшем, буду
звать его просто редактором. Вижу событие кнопки. Что писать?
Во-первых, надо получить собственно, число, по которому и
вычислю факториал.
Сначала заявим переменную, как бойца, для боя в кругу. Dim
SearshF, какой боец без ассистентов? Добавляем еще Dim x и
Dim i.
х и i, это так, шестерки, х задает стартовое значение для цикла
подсчета. А, i, для собственно, запуска цикла, что секундант на
ринге, толкающий бойца навстречу злой судьбе.
Получим ее значение, через окошко запроса, оно создается по
команде InputBox. Окошко сообщения вызывается через дирек-
тиву MsgBox.
SearshF=InputBox(“size factorial&”,”Get ?”)
If SearshF<>“” Then
x=1
For i=1 to SearshF
x=x*i
Next i
Form1.Caption=“size factorial=” & x & “For” & SearshF
Else
MsgBox (“Not date!”)
End
End If
*, это знак умножения, &, это в принципе, аналог “+”. Я для
простоты, вывожу результаты в заголовок формы, для эстетики
окружил голый результат поясняющими словами.. Когда набе-
рете сей код, поставьте курсор в все новые слова и ткните в F1.
Справка расскажет вам все и с примерами! Сама программа,
мыслит просто. Имеем, через окошко запроса, число, по
которому считаем, оно стало ограничителем в цикле. Факториал
это подсчет всех чисел до заданного, в каждом проходе цикла
умножая каждое число на предыдущее. Запустив программу,
увидите как чудовищно растет результат подсчета, не увлекай-
тесь при вводе, большими числами.
Знаете шутку математиков? Сколько раз нужно разорвать
лист тетрадочной бумаги, чтоб получить кусочек с атом? При
условии, что каждый раз, разорванные пополам, кусочки рвутся
опять пополам и так далее. Считайте это факториалом в
обратную сторону. Успехов!
Фортуна на меня только поморщилась, ну, простак, поду-
маешь удивил..
Ладно. Новый заход:
Социализм это учет, бизнес тоже.
Пора учиться быть полезным, таких любят.
Сначала научусь получать в списки информацию из файла, а
потом сортировать ее по надобности.
Открываю новый проект, для этого или по кнопке “Open
Project” или в меню “File”, нажму на “New Project”. Будет запрос
об сохранении проекта, о факториале, то есть. Тут, как хотите,
лучше сохранить. После чего, как обычно сразу на “Ок” при
запросе выбора типа проекта. Про эти типы потом, обязательно,
расскажу.
Рисуем 3 кнопки, в панели свойств, им дадим в поле “Name”
имена, а в “Caption”, надписи на них. Соответственно, cmdExit и
Exit, cmdOpen и Open file, cmdAdd и Add tasks. Форму
переименуем в frmStart, а в “Caption”, ее заголовок перепишем
на “Loading text file”. Но, если у вас Windows не английская, а
русской версии, то можно все называть и по-русски. Дело
хозяйское.
Добавим еще 2 объекта, ListBox и Label. Их найдем в панели
инструментов, медленно пошарить мышкой по картинкам и
всплывающая подсказка выдаст их вам, не волнуйтесь сведения
не от Сусанина. Рисуете в форме по вкусу, также, как кнопки.
Я, например, сотворил так:
Обьект List1 - это то, что вы ви-дели в бейсик - редакторе и в
Worde и в прочих программах. И мы будем уметь это создавать,
разные списочки. Label1 - это почти, что TextBox, но ввод
текста, с клавиатуры, не допус-кает, только программно, а я и
хочу вывести туда имя и путь файла, который загрузим в объект
List1, без возможности редакции текста, пользователем. То,
что нужно, а то нежела-тельно, чтоб кто-нибудь, сдуру, стер эту,
стратегической важ-ности, информацию. Из текстового блока
же, раз плюнуть! А, теперь, доба-вим еще одну форму в проект,
чтоб уметь что-нибудь еще. Для этого или тюкнем мышкой по
кнопке ”Add Form” или в меню Бейсика, в “Project”, выберем
”Add Form”. Будет запрос, какой тип формы добавить, не
мудрствуя лукаво, пока, выбираем иконку “Form”.. После
нарисуем... Эй, а я ее не вижу! Не беда, в панели “список форм и
прочего в проекте” (См. рис.1), щелкните на папке “Form”, в вы-
павшем “древе” найдите форму 2. По ней или двжды щелкнуть
или выделив, щелкнуть на кнопке ”View Object”, что в заголовке
этой же панели. Кстати, если нажать на соседнюю “View Code”
откроется редактор с кодом выделенной формы. Переименую ее
в frmSelect, а заголовок.. Э, картинку глядите. Рисую тоже 3
кнопки, добавляю 3 ListBox’a и 4 новых объекта, Opti-
onButton’ов. Они для выбора режима выборки данных. Дело в
том, что одновременно активировать можно и нужно, только
одну из них, что исключает возможность накладки разных
событий, друг на друга, что чревато.. А сей процесс начинается
при нажатии кнопки Copy.
Рутинно сею имена, для кнопок, одну в cmdRefresh, другую в
cmdExit, третью в cmdCopy, а надписи на них, копии с имен,
только без первых 3-х букв(cmd). Остальное, шестерки, не буду
на них тратить свою драгоценную нервную энергию, оставлю
как есть, с изначально данными свойствами. Ух, кайф худож-
ника кончился, начинаются будни программеров, пишем код... С
чего начать? С чего попроще, для разгона гиганта мысли, моих
мозгов. Раз, счас, пред нами форма frmSelect, с нее и начну,
frmStart не убежит (а вы уже сохранили проект на харде? Если
нет, то давайте, так, на всякий пожарный случай, вот моя жена,
если захочет играть, то обязательно, сию же минуту или
катастрофа, а моей Windows, уж точно грозит, катастрофа-то.
Рухнуть ей, с ней, не проблема. Не знаю, как у вас, а мне жаль
каждую строчку, добытую аж кровавыми мальчиками в глазах.
\:) В общем, атакую кнопку cmdExit, в редакторе, в ее событие
ввожу End и все! Теперь, эта кнопка выгружает, закрывает
программу, всю программу, то есть обе формы, в отличие от
кнопки закрытия, что в заголовке, вверху справа, у форм. Она
отвечает только за формы, в которых сама находятся. Пустив
программу, для проверки, я убеждаюсь, что проверять-то
нечего! Видна только 1 форма, та, первая. Оказывается, мало
иметь, надо еще и увидеть! Жаль, что позволено Юпитеру,
нельзя быку.. Нет, чтобы: Пришел, увидел, победил. Не
прикладая рук. Надо слегка махнуть кистью творца, у кнопки
cmdAdd, на форме frmStart. В редакторе, в ее событии (щелкните
на кнопке дважды, только тогда редактор сам предложит
нужное нам событие, об других потом расскажу) ввожу туда
код: frmSelect.Show, конец волнениям. Я чего? Я обязал объект
стать видимым, в данном случае форму. Обратное действие
произ-водит команда Hide. Есть также, команды Load и Unload,
внеш-не действуют одинаково, как и Show и Hide, однако не для
компьютера!
Show и Hide для нас как лампочка, видим - не видим, но сам
объект в памяти сидит, не глядя, дух он, или нет. Для ресурсов
памяти, всегда материален!
Load и Unload, они же, выгружают объект из памяти.
Поэтому, они предпочтительней для мощных, объемистых
программ, экономит ресурсы здорово, если объект отработал
свое и не нужен, лучше его удалить, однако, загрузка не так
быстра как ”проявка”. Выбирайте по ситуации. Моя програм-
мка, учебная, в весе “пера”, вот и выбрал... Ну, вернемся к моим
баранам, Поглядев, как программа в работе показывает по
нашему желанию, разные формы и покорно исчезает, сразу или
частями, (я, вообще-то, люблю брать все сразу, не отходя от
кассы..) приступим снова к форме frmSelect, если она не видна,
вытащите ее на белый свет, позакрывав все лишние окна,
например, для каждой формы открывается свое окно редактора,
закройте их или сложите, нажав на кнопку минимизации, как и у
любой обычной программы или просто отыщите в списке форм
(рис.1) и дважды пощелкайте на ней. Как ее увидите, вызовите
редактор, пощелкав по кнопкам cmdRefresh и cmdCopy, чтоб он
сам добавил события этих кнопок в код. Код cmdRefresh тоже
прост, всего 2 строчки:
Unload frmSelect
frmSelect.Show
Эта кнопка для того, чтоб сбросить все, что наработано, без
нужды в перезапуске всего. При выгрузке объекта все
изменения в нем, если не записаны в файл теряются. Я попросту
этим и воспользовался.
Но простота на этом кончается...
Код кнопки cmdCopy посложней, т.к. нужно пособлюдать
условия. Такой код или алгоритм, называют ветвистым. Ибо,
если его рисовать, то и впрямь, ветвистое деревце вырастает.
Ну, чем не рождественская елка? Это еще примитив. В примере
на рис.9 (код кнопки cmdCopy ) определенные коды
выполняются, если условие верно. То есть, в “дырочке”
переключателя, видна точка. Это нам, а комп об этом узнает,
когда свойство Value=True.
В коде, линиями точек, я выделил каждое условие - цикл, для
выполнения действий, для облегчения восприятия. В зависимос-
ти какой переключатель выбран, программа при нажатии на
кнопку cmdCopy, сработает, а именно:
Если пользователь выбрал...
OptionButton1
То :
Выделенные позиции в List1 и List2 копируются в List3
OptionButton2
То:
Выделенные позиции в List1 и НЕ выделенные позиции List2
копируются в List3
OptionButton3
То:
Выделенные позиции в List1 копируются в List2
OptionButton4
То:
НЕ выделенные позиции List1 посылаются в List2, отправ-
ляются обратно в List1 вместе с НЕ выделенными позициями в
List2.
Типичное дело для бизнес - ситуаций. скажем, Гейтсу по-
надобится узнать, кто, когда купил его корпорацию, без вас ему
не обойтись, только вы принесете боссу сводку по его проблеме.
Пара слов по новым словам в коде:
On Error GoTo Errorhandler, что-то знакомое, верно?
Однако это не пропускает место ошибки, а переходит в случае
возникновения ошибки, на место в программе, указанное меткой
Errorhandler и выполняет код, указанный за ней.
У обьекта, List, куча свойств, некоторые из них, я использую.
List.Clear - очищает от всех записей, для формы, аналогична
команда Cls. ListCount - это свойство, возвращающее нам кол-
во позиций, строк в List.
Я использую эту величину для ограничения цикла прос-
мотра всех записей в конкретных списках.
Visible - это свойство, имеется почти у всех объектов, имеет 2
значения, True и False, соответственно, объект виден или нет.
Эта строка в программе для того, чтоб не используемый List3,
не мозолил глаза, почем зря. У этого объекта, также есть
свойство Selected, оно возвращает номер записи(ей),
которую(ых) мы выделили в List, AddItem же, добавляет запись
в List и всегда в конец, увеличивая ListCount на 1. Кстати, оно
изначально равно 0. При появлении 1-ой записи, ListCount=0, 2-
ой=1. Работа простая, цикл работает, пока не кончились записи,
начиная от-считывать с последней. Когда, находит, выделенные
поля в од-ном List, именно его и посылает в другой List.. Если,
хотим переслать НЕ выделенные поля - записи, то добавляем
слово Not в условие отбора. Это слово - логическое НЕ, то есть
инверсия, негатив, того перед, чем стоит, в данном случае,
заставляет выбирать не выделенное поле(я). Так как, в цикле, i
меняется, каждый раз проверяется новая запись и так до конца
всех записей. Вот и весь костяк алгоритма. Надеюсь, теперь
длина кода вас не напугает?
Я не объяснил, а записи откуда возьмутся? А я их сгенерировал
при загрузке формы. Взгляните на событие, Private Sub
Form_Load(), ее код.
Поймете сами, если поняли уже прочитанное.
Вот весь код этой формы (frmSelect) :
Dim i As Integer
Private Sub CmdCopy_Click()
On Error GoTo Errorhandler
List3.Clear
‘..................запятая, что в начале строки, вырубает ее из кода, как ‘
говорится "зарэмирует". REM (remark - комментарий) Комп ее ‘
игнорирует при работе. Старайтесь писать свои комментарии ’ к
программам, пригодится потом.
IF Option1.Value = True Then
List3.Visible = True
For i = 0 To List1.ListCount - 1
If List1.Selected(i) Then
List3.AddItem List1.List(i)
End If
Next i
For i = 0 To List2.ListCount - 1
If List2.Selected(i) Then
List3.AddItem List2.List(i)
End If
Next i
End If
'......................................
If Option2.Value = True Then
List3.Clear
List3.Visible = True
For i = 0 To List1.ListCount - 1
If List1.Selected(i) Then
List3.AddItem List1.List(i)
End If
Next i
For i = 0 To List2.ListCount - 1
If Not List2.Selected(i) Then
List3.AddItem List2.List(i)
End If
Next i
End If
'..............................
If Option3.Value = True Then
List3.Clear
List3.Visible = False
List2.Clear
For i = 0 To List1.ListCount - 1
If List1.Selected(i) Then
List2.AddItem List1.List(i)
List1.RemoveItem (i)
End If
Next i
End If
‘..........................................
If Option4.Value = True Then
List3.Clear
List3.Visible = False
For i = 0 To List1.ListCount - 1
If Not List1.Selected(i) Then
List2.AddItem List1.List(i)
End If
Next i
List1.Clear
For i = 0 To List2.ListCount - 1
If Not List2.Selected(i) Then
List1.AddItem List2.List(i)
End If
Next i
End If
Exit Sub
Errorhandler:
MsgBox ("Error!Number:" & Err.Number)
End Sub
Private Sub cmdRefresh_Click()
Unload frmSelect
frmSelect.Show
End Sub
Private Sub сmdExit_Click()
End
End Sub
Private Sub Form_Load()
For i = 1 To 10
List1.AddItem "Test1 " & Str(i)
Next i
For i = 1 To 5
List2.AddItem "Test2 " & Str(i)
Next i
End Sub
Ай, яй забыл, про 1-ую форму! Счас поправлю дело.
frmStart должна при нажатии на кнопку cmdOpen, загружать
каждую строку из текста в отдельную запись, в List, пока не
кон-чатся строки в текстовом файле. Это немногим сложнее,
чем уже виденные процедуры. Однако, там, нечто новое, вы на
рис.7, уже видели новый значок, а я про него ни слова не сказал,
что же, пора, поехали. Это объект CommonDialog. Вы небось,
его все время видели, пользуясь Windows95. Оно имеет много
обличий, окна диалога, настройки печати, цвета, фонтов, откры-
тия - записи файлов. Все это, делает этот объект, но этот ком-
понент, почему-то, отсутствует в панели инструментов, его
надо туда вставить, чтоб могли воспользоваться его услугами.
Для этого, щелкните правой кнопкой мыши, на любом
свободном от картинок, месте, на панели инструментов и в
появив-шейся панельке, выберите пункт “Components..”. Так
же, в меню Бейсика можно двинуться в ”Project”, там внизу
“Components..”
Поставьте галочку у Microsoft CommonDialog Control 5.0, ну
цифры меня-ются, от Љ версии VB. Жмите на “ОК”, в панели
инструментов должен появиться новый значок. Нам надо найти
и открыть файл. Он и сделает все за нас. Перво - наперво, объ-
ясним ему какой вид диалога нам требуется.. Надеюсь, он уже
на форме?
ShowOpen и есть нужное. если же написать, ShowSave или
ShowPrint или ShowColor, ShowFont, появятся соответст-
вующие, именам, окна. О них потом, когда понадобятся. Сами
по себе, они ничего не делают, они помощники, но не добрые
волшебники, а мы не Золушки, а программеры, черт побери, или
будем ими, не беспокойтесь. Для открытия файла использую ту
же процедуру, что в проекте ”Мои часы”. Но, имя файла и путь
к нему, нам поставляет CommonDialog Control. Как только мы
выбираем файл, его имя с путем попадают в свойство FileName
и я предлагаю использовать, этот факт, себе во благо.
Новенькое, так это свойство ToolTipText, оно обеспечивает
любому видимому объекту, при наводке на него мыши,
показывать всплывающую подсказку, то самое, что так нам
помогло в розысках нужного, в панелях. Do ..Loop это тоже
цикл, но требующий условие - признак, для основания начать
работать. While это тип условия. Он требует крутиться циклу,
пока указанное условие не станет ошибкой. EOF (1), это маркер,
объявляющий об конце файла, в скобках, его Љ, файла. Для
справки, Until тоже тип условия, но противоположный по
действию. Так, что строку Do While Not EOF(1) можно заменить
на Do Until EOF(1) что, эквивалентно. Line Input это програм-
мное выражение, понуждающее циклу за каждый проход читать
строку, то есть пока не встретится символ перевода на новую
строку. Эта штука всегда имеется, когда вы, скажем, в Word,
писали и сделали несколько строчек. Это в файле и без нас
будет, гарантирую.. linee - это просто слово - переменная, ее я
придумал, ради дурацкого синтаксиса этого программного вы-
ражения. Внимание! line - это слово Бейсика! Поэтому я до-
бавил еще одно “е”! Можете заменить его любым другим
словом. А, что As String, это я сообщил программе, что эта пере-
менная не из чисел, а из букв. Об этом советую почитать в
хелпе, выделив мышкой и нажав F1. List1.ListIndex =
List1.ListCount - 1 это, необязательно, для удобства, чтоб в List
гарантированно увидеть последнее поле, файл-то может быть
большим! Не все поля будут видны. полосой прокрутки,
воспользуйтесь тогда.
Вот весь код первой формы (frmStart)
Dim linee As String
Private Sub cmdExit_Click()
End
End Sub
Private Sub cmdAdd_Click()
frmSelect.Show
End Sub
Private Sub cmdOpen_Click()
On Error Resume Next
CommonDialog1.ShowOpen
Label1.Caption = CommonDialog1.filename
List1.ToolTipText = CommonDialog1.filename
Open CommonDialog1.filename For Input As #1
Do While Not EOF(1)
Line Input #1, linee
List1.AddItem linee
List1.ListIndex = List1.ListCount - 1
Loop
Close #1
End Sub
Для полноты чувств, можете еще ограничить показ в окне диа-
лога типы файлов. Для этого в свойствах CommonDialog1 щелк-
ните на поле “Custom”, появится кнопка, жми-те ее, и увидите:
(р.11)
Добавьте: (*.txt), |*.txt| в поля Filter и DefaultExt.
Это заставит отфильт-ровать файлы по приз-наку, указанному
между вертикальными черточками, а что в скобках, это для нас
комментарий, который мы увидим и узна-ем, какой тип файлов
следует ожидать в каталогах и не удивляться отсутствию всех
остальных.
Добавлю только, что последний взгляд профессионала, для
всех описанных выше форм, сделает их нерастяжимыми по раз-
меру, установив соответствующее свойство для их краев. Заодно
подберет для каждого случая List’а, наиболее удобный стиль,
они, знаете ли, варьируют способы выделения записей, в
зависимости от установленного типа, в панели свойств, в полях
MultiSelect и Style. Побалуйтесь с ними. Во всяком случае, сле-
дует в примере, селекции отбора записей, установить в объектах
списков, совсем не опцию None. Иначе, попросту, теряется
смысл в этой программе.
А теперь, вперед, на новые рубежи, но без меня. См. рис.12
Предлагаю, вам, еще пример - прог-рамму, разобрать без
меня... Она сорти-рует погенеральски, рота, ээ.... ListCount,
первый - второй, рассчитайсь! И записи из файла попадут в
зависимости от номера, чет-нечет в разные List’-ы. Но дам
справку по новым командам и операторам, LOF - это число, как
и ListCount, работает аналогично, но возвращает, в байтах,
значение конца файла, а не объекта List. Вы можете
использовать это для своих программ, например, чтоб узнать
размер вашего файла. А символы ”\” и ”/” это операция деления
чисел, однако, конечный результат не одинаков! Полученное
число будет либо целым, либо дробным! Зачем это, думайте!
Для справки, чтоб получить в результате операции деления,
число без остатка, можно использовать, также, функцию Mod.
Строка “i Mod 2” сделает то же самое, что “i \ 2”.
Private Sub cmSave_Click()
Open "ini.txt" For Output As #1
For i = 0 To List1.ListCount - 1
Print #1, List1.List(i)
Next i
Close #1
End Sub
Private Sub сmdOpen_Click()
Dim pos1, pos2
Dim linee As String
List1.Clear
List2.Clear
Open "ini.txt" For Input As #1
For i = 0 To LOF(1)
If EOF(1) = True Then Exit For
Line Input #1, linee
pos1 = i \ 2
pos2 = i / 2
If pos1 = pos2 Then
List1.AddItem lin
List1.ListIndex = List1.ListCount - 1
Else
List2.AddItem lin
List2.ListIndex = List2.ListCount - 1
End If
Next i
Close #1
End Sub
Private Sub cmdItem_Click()
Dim Add As String
Add = InputBox("string?", "Add item")
If Add <> "" Then
List1.AddItem Add
End If
End Sub
Теперь, покончив с этим, начну пробовать создать элементы
интеллекта, что было первым в мире? Слово! Вот и с ними и
поработаю... Вот, парочка - тройка программ, работающих со
словами. Осуществят поиск заданного или сообщат его местона-
хождение в тексте, либо сразу заменят найденное на другое..
Вспомните возможности Word’a. Чем мы хуже? Вперед! Вот,
эта делает:
Private Sub CmdStart_Click()
If Text1. SelLength < > 0 Then
Text2.Text = Text2.Text & Chr(13) & Chr(10) & Text1.SelText
Label1.Caption = Str(Text1.SelStart)
End If
End Sub
Как просто это оказалось, а?! Поставил условие, работать
только когда выделим в любом месте текст, хотя бы 1 символ.
SelLength это встроенная в объект функция, возвращающая кол-
во символов в выделении, а SelStart местоположение первого
символа в выделенном месте, если же, не выделено ничего, то
возвращает текущее местоположение текстового курсора. Эту
цифру я передаю в Label-метку. Так как она, собственно,
содержит данные как текст, я на всякий случай, числовые
данные трансформирую в текстовую переменную с помощью
дополнительной функции Str, для справки: Val производит
обратное действие. И, как видите, присвоил содержимому
правого объекта - текста, его старое значение с новой добавкой.
А эти, Chr(13) & Chr(10), всего лишь коды “для перевода
каретки на новую строку”, это нам досталось в наследство от
древних пишмашинок, действия машинистки при начинании
новой строки или перевода слишком длинной, на новую
позицию, и сейчас похожие внешне, действия компа, называют
так же. Я, это добавил в код, исключительно из высоких эстети-
ческих требований к красоте.
Микеланджело, гений, говорил: ”Не пренебрегайте мело-
чами, ибо великое состоит из мелочей, а оно не мелочь”. Вот и
стараюсь, по мере своих жалких сил. На рис 13. видно, что
полосы прокрутки повсюду, где только можно, это надо добыть,
в панели свойств обратитесь к полю ScrollBars, установите его в
3(Both). А чтоб, можно было иметь много строчек, взгляните
уже на поле MultiLine, исправьте его на True. Делу конец,
творцу венец. Может царский, не откажусь?
Из чистого мазохизма предлагаю еще поскрипеть мозгами.
Это напоследок, прежде как перейти уже к “настоящим
программам”.
Как видно, из рис14, компьютер будет “понимать” разницу
между словами. и погоняет их, точно овчарка, отару овец. Для
этого нужен код, чуть сложней предыдущего. Извольте
взглянуть, что я тут наворотил..
Dim beginPos As Integer
Dim endPos As Integer
Dim i As Integer
Dim wrd As String
Private Sub сmdStart_Click()
beginPos = 1
endPos = 1
List1.Clear
List2.Clear
While endPos > 0
endPos = InStr(beginPos, Text1.Text, " ")
If endPos = 0 Then
wrd = Mid(Text1, beginPos)
Else
wrd = Mid(Text1, beginPos, endPos - beginPos)
End If
beginPos = endPos + 1
If InStr(1, wrd, Text2.Text, 1) > 0 Then
List1.AddItem wrd
Else
List2.AddItem wrd
End If
Wend
End Sub
Это, While....Wend, синтаксический вариант, уже знакомого
вам цикла, Do...Loop.
Я дал понять программе, что искать и куда помещать. С
помощью функций InStr и Mid. Первая команда ищет позицию,
с которой возвращаются символы, указанные в поиске, а вторая,
возвращает сами символы, условия выбора перемещения наст-
роены, чтоб знакомая давно, команда AddItem, использовалась
выборочно, от зависимости, нашлось или нет, слово в тексте, по
заданному слову. Конкретные синтаксисы очень советую
посмотреть в хелпе, просто превосходные примеры там, не буду
попугаем.
Этот пример, последний, среди этого типа задач:
Видите?
Что-то не то, с большим текстовым блоком? Теперь взгляни-
те на код:
Private Sub cmdSearsh_Click()
Dim FoundPos As Integer
Dim FoundLine As Integer
' Find the text specified in the TextBox control.
FoundPos = RichTextBox1.Find(Text2.Text, , , rtfWholeWord)
' Show message based on whether the text was found or not.
If FoundPos <> -1 Then
' Returns number of line containing found text.-->
‘FoundLine = RichTextBox1.GetLineFromChar(FoundPos)
RichTextBox1.SelText = Mid(Text2.Text, FoundPos)
RichTextBox1.SelText = Text1.Text
Else
MsgBox "Word not found."
End If
End Sub
Private Sub cmdOpen_Click()
CommonDialog1.ShowOpen
RichTextBox1.LoadFile CommonDialog1.filename
End Sub
Он какой-то маленький, непонятный.. Что за фокус? А то, что
в VB50, редакции “Enterprise” или “Professional” имеется особый
текстовый объект, он побольше возможностей имеет, чем
простой TextBox, имя ему, RichTextBox. Его надо, как и Com-
monDialog, добавлять в проект сознательно. Так же вызываем
”Components...” и ищем там Microsoft Rish TextBox Control 5.0,
поставив галочку, жмем “ОК” и щелкаем новый значок на
панели инструментов, далее как обычно. Нарисовав все, я решил
воспользоваться хелпом и его примерами. Я содрал, целиком,
код из примера селекции слов, для этого объекта. Указал свои
критерии и ссылки, где их искать. Готово!
Дико удобно, на эту программу потратил 10 мин. и счастлив.
Разберите пример самостоятельно. Советую выполнять програм-
му по-шагово.. Для этого в редакторе кода щелкайте слева на
его дорожке, напротив интересующей вас строчке кода, увидите
как появятся кружочки, они сигнализируют о том, что когда
будут выполняться эти строчки кода, программа остановится и
будет ждать сигнала продолжения, им является нажатие F5 или
“Start” в панели Бейсика. А, когда код дойдет, выскочит вот это:
Подсветка на выполняемой строке, но меня интересовало
значение переменной, для ее поиска, навел мышку на пере-
менную и всплывающая подсказочка выдала мне все, как на
тарелочке с ярко голубой каёмочкой. Очень удобно при от-ладке
программ. Они, как правило, не выполняются, при неправиль-
ных критериях или неверных значениях перемен-ных, ошибке в
логике программы и этот способ, как быстрый проход всех
узких мест, мой любимый. Грубые ошибки, интеллектуальный
редактор, сам обнаружит и сообщит, вам, другие ошибки, дадут
о себе знать при работе программы и вы увидите окно редактора
с установленным курсором в месте ошибки, мол исправляй. Но,
не узнать, что чему равно, для этого мой способ и используйте,
удобно же. Есть и другие способы, их куча, о них потом. Реже
использую...
VB стал так популярен, оттого, что в нем куча мастеров,
которые за нас сгенерируют половину кода, можно за 5мин.
получить свой броузер интернета, текст-редактор со всеми
атрибутами фирменных программ, с их панелью кнопок,
заставкой при запуске и т.д. Я об этом обязательно расскажу, но
сейчас не хочу и думать, надо научиться самому писать код и
быть независящим от прихотей машины.
Потерпим еще немного, я хочу развить еще немного тему
списков данных, я о таблицах, они те же списки, но един во
многих лицах, удобнее, да и быстрее ищут информацию, чем
ListBox, или же, CombоBox, я о последних и не упоминал,
пардон, забыл. Эти объекты почти тождественны в свойствах, с
различием, подобно Label и TextBox. В первом случае, нельзя
вводить данные с клавиатуры, во втором же, не проблема.
Сейчас сделаю почти профессионально выглядящую прог-
рамму. Сначала, начинаю новый проект, рисую на нем кнопку и
2 новых обьекта, Data и DBGrid. Data есть в панели компо-
нентов, однако, DBGrid надо добыть. Так же лезем в
“Components..”, и ставим галочку на Microsoft Data Bound Grid
Control. Имею вот это: (рис.17)
Могу посоветовать, поставить, Acсess 7.0, самый
популярный гене-ратор баз данных, это файлы с рас-
ширением *.mdb. Они собственно, комплект, библиотека,
разных там, таблиц, графиков и т.д. Напоминает архив Zip’а,
файл 1, а внутри может быть больше. У Бейсика есть свой гене-
ратор баз данных и отчетов, он может тоже создавать и работать
с файлами Acсess’a. Это модули, Visual Data Manager и Report
Designer, их можно запустить из Add-Ins, меню Бейсика. Они не
так удобны, но тоже неплохие программы..
Вот и загрузим как источник данных, в Data1, файл
biblio.mdb, он входит в комплект Бейсика, должен быть и у вас.
Его взять в оборот, просто, щелкнем на Data1 и в панель
свойств, в поле DataBaseName щелкнем дважды быстро или раз
и на появившуюся кнопочку. Увидим привычное до тошноты,
окно диалога, отыскав сей файл, выбираем его и закрываем
диалог, бухнув по “ОК”. Готово! Теперь выделяем на форме
DBGrid1, в его свойствах, ищем полe, DataSource, в списке, что
там выпадет, должно быть Data1 его и выберем. Теперь оживим
кнопку, она открывает базу данных, выбирая определенную
таблицу из всех, имеющихся в наличии. Это и будет видно в
DBGrid1.. Для этого, режемся по кнопке, в редакторе, в ее
событие добавляем пару строчек, а именно:
Это, в 1 строку написать, просто, не уместилось на странице,
тут (копировать без знака переноса!).
Data1.RecordSource = "select Authors.Author,[Title Author].-
ISBN from authors,[Title Author] where [Title Author].-
Au_ID=Authors.Au_ID "
Data1.Refresh
DBGrid1.Refresh
Это все, запускайте и глядите! Мне это показалось скуч-
ным, добавил кнопку, чтоб ограничить загрузку данных, только
избранными по критерию. Назвал ее cmdPresise, то есть,
пресизионный поиск. А, на ней надпись: ”presise searsh”.
Для нее приберег код:
Search = InputBox("Test of SQL!!!")
Это тоже, не уместилось на странице, в 1 строку, пардон.
Data1.RecordSource = "select Authors.Author,[Title Author].-
ISBN from authors,[Title Author] where [Title Author].-
Au_ID=Authors.Au_ID and Authors.Author like '" & Trim (Search)
& "*'"
Data1.Refresh
DBGrid1.Refresh
If Data1.Recordset.RecordCount = 0 Then
cmdOpen.Value = True
End If
Перво наперво, обьясню код VB, RecordSource, это ищет в
таблице указанные данные. Refresh, перерисовывает объект.
Если, у него что-то менялось, во время работы, то новое, может
и не будет ”проявлено” и не видно. Эта команда гарантирует
смену декораций. Data1.Recordset.-RecordCount = 0 , это я по
условию, проверил, по критерию нашлись записи, или нет, при 0
- нет, то программно имитирую нажатие на 1-ую кнопку, чтоб
Grid не был пуст, а вернулся к исходному виду. cmdOpen.Value
= True это и “нажимает” кнопку, а нажав, запускает ее событие
с ее кодом. А что за такие странные длинные строки? В них-то
вся соль! Это команды, но не VB, а другого языка - SQL, он
является самым распространенным языком при работе с базами
данных. С его помощью, практически все программисты
оперируют с информацией из баз. Он почти буквально -
английский, допустим, надо из таблицы Authors, из полей
Authors и ISBN взять все и поместить в Grid. То, так и пишешь,
выбрать ”select” из “from” таблицы такой-то, такое-то поле,
между “between” такими-то значениями. Строка окантована
кавычками, чтоб Бейсик знал, что это команда из SQL.
Взгляните на событие кнопки cmdOpen. Параллельно, откройте
biblio.mdb в Access, откройте таблицу “Authors” и сравните,
какие поля там есть, и какие я задекларировал для просмотра.
Если, он русской версии, как у меня, то очень рекомендую
посмотреть по его хелпу, слова Celect From и Between, Like.
Прекрасно объясняет, с примерами. Если его нет у вас, тогда в
VB щелкните в Add-Ins и выберите Visual Data Manager. Там, в
File, в Open Data Base.. выберите тип базы, Microsoft Access, ну
далее как обычно, отыщите нужный файл и закройте окно
диалога. Увидите примерно, такое, что на рис.19.
Как видите, на рис.19, я уже в нужной нам таблице уже
нашел поля, что в ней. Сравните, теперь, что я написал, в
программе, и названия таблиц с полями. По-подменяйте их на
другие, руководствуясь информацией, из этой вспомогательной
программы или Acсess’а. Будьте уверены, очень быстро станет
понятна вся взаимосвязь. Эксперименты - великая вещь!
Покопайтесь в хелпе, по командам SQL, INSERT INTO
вставляет новое поле, запи-си, DELETE соответственно,
удаляет, а это:
UPDATE CLIENTS SET name = "Olga" WHERE name =
"Vasya";
Я, для примера, привел команду UPDATE (обновить) и где
(Where), с критериями действия, в предположительной таблице
CLIENTS, обновить в поле “name”, запись "Olga" на "Vasya".
А эта игрушка, создает новую таблицу! С 2 полями:
CREATE TABLE Table1 (Name1 TEXT (40), Age INTEGER)
Поля новой таблицы, Table1:
Name1, оно текстовое (может хранить текст), до 40 символов .
Age, а это, числовое (может хранить число), от 0 и выше.
Записи, в них, разумеется, пустые, вам INSERT INTO и запол-
нит их. А это, DROP Table Table1, удаляет эту несчастную таб-
лицу.
Вот вам, картинка из Асеss, не правда ли, покрасивей, чем
VB. (рис.20)
Все видно сразу, для подготовки базы данных к использо-
ванию в VB, я предпочитаю эту программу, а не Data Manager.
Вообще-то, не понимаю, один хозяин у них, Билл Гейтс, а вид
такой не родственный.
Сейчас, я по этой теме закругляюсь, она слишком обширна,
чтоб уместиться в этой книге. Я, напишу подробно, о базах
данных в отдельной книжке: ”Визуал Бейсик, базы данных и
интернет”.
Здесь с ними покончено. В утешение, прошу к следующей главе,
графика и анимация. Будем, возможно, великими художниками,
переплюнем Фотошоп и 3Д Студио Махс и Дуум, а? Надежда
питает людей, как бензин машину. За мноой, вперед!
Часть2, эксперименты с логикой компа
Гарцман Иосиф. Визуал Бейсик изначальный
Продолжение: Часть2,эксперименты.(проба сил в логике)