Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
sranaya_informatika.doc
Скачиваний:
24
Добавлен:
12.04.2015
Размер:
2.48 Mб
Скачать

0 2 4 6 8 10

Далее в разделе (General) руками, т.е. с помощью кнопок на клавиатуре, запишем объявление необходимых нам переменных, собственной одной:

Option Explicit Dim ZnachenieScroll As Long 'сюда будет считываться значение 'Vscroll1.Value,  ' которое будет изменяться всякий раз при изменении положения 'ползунка

Значения переменной будут доступны всем процедурам нашей формы.

В процедуре Form_Load() изменим операторы и свойства, чтобы получилось следующее:

Private Sub Form_Load() VScroll1.Value = 1 VScroll1.Min = 1 VScroll1.LargeChange = 5 VScroll1.SmallChange = 1 Form1.Caption = "ACSII-reader" ' это заголовок нашей формы(вместо Form1) Text1.Text = "Сюда можно ввести всякие буковки и циферки , Fuck их!" ' этот текст вводится автоматом в Text1 ShowKod ' это имя нашей процедуры, которую мы создадим ниже End Sub

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

Private Sub VScroll1_Change() ZnachenieScroll = VScroll1.Value 'записываем текущее значение VSvroll1 в переменную. ' Можно было обойтись и без нее, но я хотел приллюстрировать различное объявление переменных. ShowKod ' это опять тоже имя нашей процедуры, которую мы создадим ниже End Sub

Теперь, мы создадим следующую собственную процедуру ShowKod() имя которой мы уже использовали в процедурах Form_Load() иVScroll1_Change(). Разберем ее подробно:

Private Sub ShowKod() Dim X As Long 'обратите внимание, что здесь мы переменную объявляем локально, внутри процедуры, для организации цикла. Ее значение будет недоступно в других процедурах нашей формы.

'далее мы определяем, сколько символов записано в Text1. Делается это с помощью функции Len(). Затем присваиваем это значение свойству .Max, т.е. наш ползунок не будет давать значение .Value больше, чем количество символов.  VScroll1.Max = Len(Text1.Text)

'Теперь, для того, чтобы выводить наши значения по 5, используем цикл For...Next. Начальное значение цикла принимаем за значение VScroll1.Value, а конечное на 4 больше. Таким образом, если наш ползунок имеет положение, например, 4, то в цикле мы будем считывать сиволы из Text1 4, 5, 6, 7 и 8.

For X = ZnachenieScroll To ZnachenieScroll + 4

'Далее с помощью функции Mid (в ней три аргумента: 1- текст, откуда считываем, 2 - с какого знака, считая слева начинаем считывание и наконец 3 - сколько знаков считываем) мы считываем по одному пять знаков (потому что цикл будет работать пять раз). Но переменную Х мы не можем использовать как есть для определения, в какой из пяти Text2 записать полученный символ. Ведь при значении ползунка, например 5, потребуется объект Text2(5), а у нас его нету, только с 0 до 4. Возникнет ошибка и программа аварийно прервется. Поэтому мы из значения X вычитаем значение ползунка. Тогда мы всегда вложимся в зону 0-4. Подумайте, как это происходит.

Text2(X - ZnachenieScroll).Text = Mid(Text1.Text, X, 1)

'Ну и теперь полученное значение в Text2(X-ZnachenieScroll) мы с помощью функци Asc() преврашаем в ASCII-код. Единственое но. Мы с помощью оператора If (без него никуда) и все той же функции Len() проверяем не пустое ли значение в Text2, т.е. не равна ли длина строки нулю, а то опять возникнет ошибка. Если длина строки - ноль, тогда мы в Text3 вписываем пустое значение (можно что угодно). If Len(Text2(X - ZnachenieScroll).Text) > 0 Then Text3(X - ZnachenieScroll).Text = Asc(Text2(X - ZnachenieScroll).Text) Else Text3(X - ZnachenieScroll).Text = "" End If

'Все. конец цикла . Next X End Sub

Да, чтобы мы могли вписать любой свой текст и запустить программу по-новой, напишем коротенький код для кнопки Command1.

Private Sub Command1_Click() ShowKod End Sub

В принципе, все предельно просто. Исходник кода можно скачать вначале страницы. Следующую главу посвятим прибамбахам на форме - вставка иконки программы, изменение курсора и прочей ерунде.

54 Массивы. Массивы, друзья мои, очень простая и крайне необходимая штука. Простой пример: ты считал из директории 50 имен файлов и тебе необходимо как-то поместить их в памяти, что-бы потом с ними работать. Без использования массива, ты должен объявить пятьдесят переменных и в каждую записать имя файла. Это безумие. Но еще большее безумие потом работать с этими переменными, пытаясь найти в них нужные нужные тебе данные. Иное дело массив. Имея его (в хорошем смысле), можно под одним именем запомнить все твои пятьдесят имен файлов и перебирать их сколько угодно, в любом цикле, меняя лишь индекс члена массива. Т.е., другими словами,

Массив - это сколько угодно значений, объединенных одним именем.

Массив, прежде чем использовать, надо объявить. Объявляется он совершенно также как и переменная. Если ты объявишь его локально в процедуре (здесь можно использовать ключевое слово Static), то он будет доступен только в этой процедуре и нигде больше, если в разделе(General)-(Daclarations) формы (c оператором Dim) - то во всей форме, а если тебе нужно объявить его глобально, так, чтобы он был доступен всему проекту, то в стандартном модуле с ключевым словом Public. Кроме того , массивы бывают статическими и динамическими.

Статические массивы. Статический массив - это когда ты заранее знаешь, сколько переменных туда нужно будет записать, т.е. если ты объявил массив на 10 членов, то уж туда никак не запихнешь одиннадцать. В форме он объявляется так: Dim Chislo(9) As Long  Что здесь важно. Dim - оператор, который точно также, как и при объявлении переменной, объявляет массив и выделяет для нее память. Chislo - ну это просто имя, придумывается также как и для переменной и отвечает тем же требованиям. (9) - количество элементов в массиве - их 10. Почему так. Дело в том, что элементы массива нумеруются с нуля, а не с единицы, поэтому у нас десять элементов массива c номерами 0, 1, 2, 3, 4, 5, 6, 7, 8 и 9. Если для каких-то целей такой порядок тебя не устраивает, то используется оператор Option Base 1, который прописывается в разделе Declarations и привязывает первый элемент ВСЕХ, повторяю ВСЕХ, массивов в программе к единице. As Long - определение типа данных массива так же как тип обычной переменной. Почти всегда все элементы массива имеют один и тот же тип ( в данном случае длинное число Long). На крайняк, если это не так, или если ты не знаешь какого типа будут данные, можно задать тип Variant, но это нежелательно из-за того, что это занимает значительный объем памяти, особенно если массив большой. Размерность - ее так сразу не заметно, но она здесь присутствует и равна единице, потому, что у на одна циферка (девятка), т.е. наш массив является одномерным - по сути список значений. Теперь создадим массив для хранения результатов, ну скажем таблицы умножения на 8. Поскольку на ноль умножать бесперспективно, привязываем первый элемент массива к единице и объявляем переменную x для организации цикла For...Next.

Option Explicit Option Base 1 Dim Chislo(10) As Long 'так как мы используем оператор Option Base, то элементы массива нумеруются с единицы  Dim x As Long

Положим на форму Text1 с установленными свойствами .MultiLine в True, а .ScrollBars - в 2-Вертикаль, а также кнопку Command1. В процедуре Form_Load напишем цикл, который будет присваивать каждому элементу массива значение, соответствующее его номеру, умноженному на 8.

Private Sub Form_Load() Text1.Text = "" For x = 1 To 10 Chislo(x) = x * 8 Next x End Sub

Как видите, в цикле мы вместо номера элемента просто используем значение x, и таким образом перебираются все элементы массива. Теперь мы выведем значения элементов массива в Text1 в процедуре Command1.

Private Sub Command1_Click() For x = 1 To 10 Text1.Text = Text1.Text & Chislo(x) & vbCrLf Next x End Sub

Таким образом наш одномерный массив представляет собой аналог таблицы с одной строчкой:

1 элемент

2 элемент

3 элемент

4 элемент

5 элемент

6 элемент

7 элемент

8 элемент

9 элемент

10 элемент

8

16

34

32

40

48

56

64

72

80

Теперь переделаем его в двухмерный массив, чтобы в еще одну строчку записать множитель, на который умножается число 8. Переделаем наш код на такой:

Option Explicit Option Base 1 Dim Chislo(10, 2) As Long Dim x As Long Private Sub Form_Load() Text1.Text = "" For x = 1 To 10 Chislo(x, 1) = x Chislo(x, 2) = x * 8 Next x Private Sub Command1_Click() For x = 1 To 10 Text1.Text = Text1.Text & "8 x " & Chislo(x, 1) & " = " & Chislo(x, 2) & vbCrLf Next x End Sub

И наш массив будет представлять собой следующее

 

1 элемент

2 элемент

3 элемент

4 элемент

5 элемент

6 элемент

7 элемент

8 элемент

9 элемент

10 элемент

1 элемент

1

2

3

4

5

6

7

8

9

10

2 элемент

8

16

34

32

40

48

56

64

72

80

таким образом элемент массива Chislo (7,2) будет иметь значение 56. Обратите внимание, что размерность массива определяет колиство циферек в объявлении. Массив Chislo (10,5) - тоже двухмерный, только строк в табличке было-бы не две, а пять. А объявление трехмерного массива выглядело бы так Dim(10,5,2).Такую трехмерную таблицу нарисовать мне затруднительно. В принципе VB поддерживает до 64 размерностей массива, но это в голове трудно укладывается. Все, как видите очень просто. Однако статические массивы используются довольно редко. Чаше мы не знаем сколько данных мы будем иметь и потом ведь хочется дописать при необходимости в массив новые данные. Для этого существуют

Динамические массивы. Часто возникает ситуация, когда мы не знаем заранее, сколько элементов массива мы будем использовать заранее. Поэтому массив объявляется без размерности, например Dim Mass () as String Но, перед его непосредственным использованием, его надо переобъявить c указанием размерности. Делается это с помощью оператора Redim. Redim Mass (5) as String Вообще-то, у нас два пути использования динамического массива. Первый путь, это года мы узнаем (просчитываем) , сколько элементов массива нам нужно, и после этого объявляем массив небходимого нам размера. Однако мне это путь не очень нравится, поскольку, нам приходится задавать два цикла: один - для просчета необходимого количества элементов, второй - для собственно присваивания массиву значений переменных.  Второй путь, это когда мы в одном цикле при нахождении каждого нового данного переобъявляем массив с увеличением количества его элементов. Но этот способ загружает компьютер и может занимать много времени на обработку, особенно если создается большой массив. Происходит это из-за перераспределения элементов массива в памяти всякий раз при его переобъявлении и добавлении нового члена. Но именно такой способ мы применим при разработке программки Scanfiles, которая будет сканировать файлы в выбранной директории, сортировать их по-возрастанию и выводить в Text1. Хочу сразу заметить, что при переобъявлении массива все записанные в него данные стираются - массив обнуляется. Чтобы этого не происходило, надо использовать ключевое слово Peserve: Redim Preserve Mass (5) as String

Идем дальше. Поместим на форму объекты Dir1 и Text1. Начнем писать код. Обратите внимание, что процедуры Form_Load у нас не будет, так как под это событие обрабатывать нам нечего. Ну-с, фигачим

Option Explicit 'Установим начальную нумерацию массива с единицы, сейчас так удобнее Option Base 1  'объявим переменные Dim OurDir As String 'для директории, где будем искать файлы Dim FileName As String 'для имен находимых файлов Dim X As Long 'просто для цикла 'и, наконец, наш динамический массив, как строковый Dim Files() As String Кроме того, поскольку одни имена - это уж совсем скучно, то мы еще во вторую размерность массива выведем атрибуты файла. Атрибуты, это когда по файлу шлепаешь правой кнопкой мыши и в выпавшем меню выбираешь "Свойства". Тогда снизу окна этих свойств можно увидеть галочки рядом с загадочными словами "Только чтение", "Скрытый" и "Архивный". Именно эти свойства можно устанавливать или получать с помощью оператора SetAttr и функции GetAttr. Весь геморрой в том, что этот атрибут представляет из себя число, получаемое из суммы значений атрибутов, приведенных в таблице ниже, и чтобы понять, какой атрибут все-таки у файла, нужно "с помощью оператора And выполнить поразрядное сравнение значения". Друзья мои. Это цитату из Help5 я привел для того, чтобы можно было почувствовать разницу между "академическим" и "вольным" изложением проблемы. Короче, привожу таблицу этих атрибутов:

Константа

Значение

Описание

vbNormal

0

Обычный.

vbReadOnly

1

Только для чтения.

vbHidden

2

Скрытый.

vbSystem

4

Системный.

vbDirectory

16

Каталог или папка.

vbArchive

32

Архивный.

Из всей этой дребедни нам нужны три константы: vbArchivevbReadOnly и vbHidden для этого самого "поразрядного сравнения". Делается это так: Чтобы узнать, только для чтения ли этот файл: Переменная = GetAttr("полный путь к файлу") And vbReadOnly Если в Переменной не ноль, то файл - только для чтения. Аналогично для других констант. Чтобы установить аттрибут, например "Архивный" для файла: SetAttr "C:\Andrey\index.htm", vbReadOnly при этом уже установленные атрибуты файла сбрасываются. Если надо установить атрибуты "только для чтения" и "архивный": SetAttr "C:\Andrey\index.htm", vbReadOnly +vbArchive  Все просто, а по сути - издевательство. Про атрибуты - все. Более интересные данные о файлах мы получим, когда начнем использовать FSO. Но об этом не сегодня. Итак, для хранения атрибута (на основании "поразрядного сравнения") продолжаем объявлять переменные (еще две)

Dim Attr As Long 'числовая, для атрибута файла Dim AttributFile As String 'строковая, для записи атрибута в виде слов

Напишем маленькую процедурку для Dir1 на событие Change. Дело в том, что событие Change наступает при двойном клике, а я и хочу, чтобы директория для поиска файлов устанавливалась по двойному клику. В этой процедурке мы очистим Text1 и обнулим переменные, ну и главное, запишем в переменную OurDir полный путь к директории, после чего перейдем к другой поцедуре - ScanDir, где собственно и будем искать файлы и записывать их имена и атрибуты в наш массив Files.

Private Sub Dir1_Change()  Text1.Text = ""  FileName = "" X = 0 OurDir = Dir1.Path  ScanDir 'переходим к процедуре сканирования файлов End Sub

Далее в процедуре ScanDir все, с учетом комментариев, понятно:

Private Sub ScanDir() FileName = Dir(OurDir & "\*.*", 0) 'присваиваем переменной значение функции Dir для всех файлов ReDim Files(2, 1) 'переобъявляем массив с минимальной размерностью, иначе может возникать ошибка Do While FileName <> "" 'запускаем цикл, до тех пор, пока Dir не вернет пустую строку X = X + 1 'счетчик элементов массива ReDim Preserve Files(2, X) 'переобъявляем массив по счетчику, сохраняя уже имеющиеся в нем данные AttributFile = "" 'обнуляем переменные Attr = 0 'проверяем файл на атрибут архивный Attr = GetAttr(OurDir & "\" & FileName) And vbArchive If Attr > 0 Then AttributFile = AttributFile & " Архивный" 'проверяем файл на атрибут только для чтения Attr = GetAttr(OurDir & "\" & FileName) And vbReadOnly If Attr > 0 Then AttributFile = AttributFile & " Только чтение" 'проверяем файл на атрибут скрытый для порядка, Бейсик все равно не видит такие файлы Attr = GetAttr(OurDir & "\" & FileName) And vbHidden If Attr > 0 Then AttributFile = AttributFile & " Скрытый"

Files(1, X) = FileName 'пишем в массив имя файла Files(2, X) = AttributFile 'пишем в массив атрибут файла FileName = Dir() 'запускаем функцию Dir без атрибутов Loop 'и так в цикле, пока файлы в директории не закончатся

If X > 0 Then Sort ' если хоть один файл найден, 'отправляемся к процедуре сортировки Else Text1.Text = "Файлов не найдено" 'в противном случае выводим сообщение. End If End Sub Основная прелесть массивов в том, что с данными, записанными в них, можно что угодно делать: сортировать, разбивать на группы, осуществлять поиск, делать выборки и т.п. Сейчас мы наш массив отсортирум по возрастанию имен файлов. Скажу сразу, что алгоритмы сортировки разработаны и существуют давно. Приводимый в примере был разработан лично мною, а возможное совпадение его с другими алгоритмами совершенно случайно. Но прежде, чем перейти к сортировке, я хочу рассказать вот о чем.  Поскольку количество элементов нашего массива меняется, а для сортировки его с помощью циклов For...Next нам надо точно знать минимальный (нижняя граница) и максимальный (верхняя граница) доступные значения индекса массива, то я использую функции LBound для определения минимального индекса и UBound для определения максимального индекса указанной размерности. Синтаксис их такой

Переменная=LBound(Massive,1) 'возвращает в Переменную минимальный индекс массива Massive по размерности 1. Переменная=UBound(Massive,1) 'возвращает в Переменную максимальный индекс массива Massive по размерности 1.

Надо сказать, что размерность - не обязательный параметр и по-умолчанию принимается за единицу. Теперь перейдем к сортировке массива: Private Sub Sort() 'процедура сортировки Dim K As Long Dim N As Long Dim y As Long 'просто для цикла For...Next Dim Peremen As String 'для временного храненения из массива имени файла Dim Peremen2 As String 'и атрибута файла Dim NomerPerem As String Dim NomerPerem2 As String 'сортировка массива K = LBound(Files, 2) 'присваиваем переменной К начальное значение массива - 1 (нижняя граница) For y = LBound(Files, 2) To UBound(Files, 2) 'просматриваем все строки массива с нижней до верхней границы Peremen = Files(1, y) 'присваиваем каждую строку в переменные Peremen2 = Files(2, y) 'вложенный цикл For N = y To UBound(Files, 2) 'просматриваем строки массива, начиная с той, 'значения которой храняться в переменных Peremen и Peremen2 If Files(1, N) < Peremen Then 'если значение в массиве меньше, чем в переменной Peremen = Files(1, N) 'то присваиваем переменным Peremen и Peremen2 новые, меньшие значения Peremen2 = Files(2, N) K = N 'присваиваем номер найденного элемента массива переменной K End If Next N 'конец вложенного цикла NomerPerem = Files(1, y) 'сохраняем в переменных старые значения строки массива NomerPerem2 = Files(2, y) Files(1, y) = Peremen ' и присваиваем этой строке массива новые Files(2, y) = Peremen2 If K > 0 Then 'если K не ноль, Files(1, K) = NomerPerem 'то строке К присваиваем старые значения из строки y Files(2, K) = NomerPerem2 End If Peremen = "" 'обнуляем переменные Peremen2 = "" K = 0 Next y 'конец сортировки 'просто выводим в Text1 отсортированные значения массива For X = 1 To UBound(Files, 2) Text1.Text = Text1.Text & Files(1, X) & Files(2, X) & vbCrLf Next X End Sub

Исходник программы можно, как всегда, скачать вверху страницы. Можно ли присвоить один массив другому не по отдельному элементу (в цикле), а сразу.

Вопрос посетителя сайта Cubic:

Можно ли присвоить один массив другому не по отдельному элементу (в цикле), а сразу?

Присвоение массивов. Visual Basic 6.0 и версии выше дают возможность проводить операции присваивания с массивами точно также, как с переменными. Теперь нет необходимости создавать цикл For...Next для присваивания одного массива другому по каждому элементу. Достаточно написать такой оператор NewMassive=OldMassive и содержимое массива OldMassive присвоится массиву NewMassive. Однако при этом следут учитывать, что для исключинения ошибок при таком присвоении, желательно соблюдать одинаковую размерность и тип массивов. Хотя при присвоении динамического массива динамическому массиву, массив в левой части оператора изменяется, как бы подстраивается под оператор в правой части. Однако при работе со статическими массивами возможна ошибка компиляции. Кроме того при присвоении, например массива типа Long типу Integer может возникнуть ошибка переполнения (Owerflow). В программе операция присвоения может выглядеть приблизиельно так (на форме должны быть кнопка Command1 и текстбокс Text1):

Option Explicit  Dim OldMassive() As Long Dim NewMassive() As Long

Private Sub Command1_Click() Dim x As Long For x = 0 To 999 'просто заполнение массива цифрами ReDim Preserve OldMassive(x) OldMassive(x) = x Next x NewMassive = OldMassive 'присоение массивов For x = 0 To UBound(NewMassive) ' считывание нового массива в Text1 Text1.Text = Text1.Text & NewMassive(x) & vbCrLf Next x End Sub

Я думаю, особых комментариев здесь не требуется.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]