Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект VB.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
2 Мб
Скачать
☆

15,"Пятнадцать" #true#,#2004-07-20#

Поэтому делать текстовые файлы для чтения их в других приложения бессмысленно. Но использовать операторы Write# - Input# внутри программы для работы с собстенными данными очень удобно.

Добавление данных в текстовой файл.

Чтобы добавить новые данные в текстовой файл и при этом не стирать имеющихся там, надо просто открыть файл с ключевым словом Append. Новые данные будут записываться в конец файла. Быстренько разберем это на примере. Для этого положим на форму последнюю кнопку Command7 и в ней напишем код: Private Sub Command7_Click() Text2.Text = "" MyText = "" F = FreeFile 'открываем файл для дабавления Open App.Path & "\Запись.txt" For Append As #F Print #F, Spc(15); "Я добавляю этот текст снова и снова" Close #F

'считаем записанный текст в Text2 F = FreeFile Open App.Path & "\Запись.txt" For Input As #F Do Until EOF(F) Line Input #F, MyText Text2.Text = Text2.Text & MyText & vbCrLf Loop Close #F End Sub

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

Снова становимся на тенистый путь программиста. Поговорим о о тех объектах, которые мы пока не затронули (конечно только пока из тех, которые стандартно лежат в окне Панели инструментов, то есть слева, где наши объекты формы). Вот на рисуночке я обвел их кружочками. Хочешь поговорить об этом? Ну и ладно, наплевать. Все равно поговорим.

Рисунок 16.

До фига получилось. Ну ничего. Это вобщем-то простые объекты, но в один пример запихнуть их все, пожалуй, не удасться.

Создадим новый exe-проект и положим на форму, например три флажка (CheckBox'а). Ну и вот, по умолчанию в квадратике нет ничего и главное значение этого объекта .Value равно 0 - Неотмечено. Когда мы щелкаем по флажку, то появляется галочка, и значение .Value становится равным 1-Отмечено. Bот и все. Есть еще и третье значение 2 - Выключено, но установить его щелканьем мышки не удасться. Надо либо в окне свойств задать значение, либо в коде написать Check1.Value=2  при этом квадратик станет сереньким, типа выключился, но если по нему щелкнуть, то он опять примет значение включенного.

Аналогично работает и и радиокнопка (OptionButton) за исключением следующего. Первое: у OptionButton только два значения и принимают они "False" - выключено, точки в кружочке нет, и "True" - включено, точка есть. А второе, если вы на форму положите пять Check'ов, то вы можете включить сколько угодно из них, хоть три, хоть все пять. А вот Option можно включить только один. Если щелкнешь по другому, то включенный тут же выключится. Кроме того, и у Check и у Option есть еще одно свойство Style. По умолчанию оно равно 0 - Standart. Но если его поставить в состояние 1- Graphical, то бац, твоя фигня с галочкой превращается по виду в кнопку. Внешне от кнопки Command она отличается тем, что в нажатом состоянии она показана, как нажатая. Ну и само собой свойство Caption позволяет Вам обзывать эти объекты, как угодно.

Далее объект Фрейм (Frame). Это как-бы окно, в которое можно запихивать флажки, радиокнопки, да что угодно. Но чтоб объект попал во Frame, надо его туда класть сразу. Если ты его создашь в форме вне фрейма, а потом перетащишь его во фрейм, то ничего не выйдет. Объект просто ляжет сверху. Ну и передвигая фрейм, ты сразу двигаешь и запихнутые туда объекты, что удобно. А если уничтожишь фрейм, то погибнут и все встроенные в него объекты. Вообще фреймами удобно делить форму на зоны. Кроме того, радиокнопки одного фрейма не связаны с радиокнопками другого или с внешними (на форме). Т.е. ты в каждом фрейме можешь создавать свой блок кнопок.

Программка-тестер (не тостер!).

Сейчас мы напишем программку для тестов, где все это попробуем, а заодно потренируемся работать с текстовыми файлами, о чем говорилось в прошлой главе. Смысл программки в том, что мы готовим тест, например, психологический и на вопрос предлагаем испытуемому несколько ответов. По результатам теста выводим характеристику испытуемому.  Во-первых сделаем одну форму Form1 для создания контрольных вопросов, которую испытуемому видеть ни к чему - это форма для руководителя проекта тестирования. А вторая - Form2 - предлагается испытуемому для проведения теста. Создадим новый exe-проект и на Form1 положим Text1 для занесения вопроса (не забудь его свойство Multiline поставить в True), Text2, Text3 и Text4 - для ответов, Text5, Text6, и Text7 для баллов по каждому ответу, кнопку Command1 для записи этого в файл и кнопки Command2 и Command3 для навигации по файлам (типа вверх-вниз). Я не стал использовать ScrollBar, чтобы не затемнять смысл программы. Поскольку мы еще не все познали-изучили (массивы или там файлы с прямым доступом), то будем записывать каждый вопрос в отдельный файл. Поэтому один Label1 надо положить сразу, он будет показывать номер вопроса, который будет и именем txt-файлов. А лучше сразу положить еще Label2 и Label3. У тебя должно получиться что-то типа рис.17

Рисунок 17.

Теперь убираем во всех Text'ах свойство Text (просто стираем в окне свойств), затем в свойстве Caption лейблов Label2 и Label3 пишем Ответы и Баллы соответственно. В свойствах Caption у кнопкиCommand1 пишем Сохранить вопрос, у кнопки Command2 - Назад, у кнопки Command3 - Вперед и изменяем их размеры соответственно надписи. Теперь пишем код в окне кода.

Перво-наперво, конечно Option Explicit, если вы не смогли установить VB, чтоб он прописывал это автоматом (я рассказывал как). Потом там - же, в области (General) - (Declarations) объявляем следующие переменные:

Option Explicit 'Для хранения номера вопроса (числовое, потому, что будем  'складывать и вычитать) и одновременно имя файла (строковое).  ' Вот единственный случай использования типа Variant Dim NomVopros As Variant 'и для каждого нашего текстбокса Dim Vopros As String 'Text1-строковое, здесь пишем вопрос Dim Otvet1 As String 'Text2-строковое- пишем возможный ответ №1 Dim Otvet2 As String 'Text3-строковое- пишем возможный ответ №2 Dim Otvet3 As String 'Text4-строковое- пишем возможный ответ №3 Dim Ball1 As Long 'Text5 -числовое - баллы к ответу №1 Dim Ball2 As Long 'Text6-числовое - баллы к ответу №2 Dim Ball3 As Long 'Text7-числовое - баллы к ответу №3

Почему так? На фик нам эти переменные? Писали бы в файл и грузили бы сразу из TextBox'ов. А потому, во-первых, что из TextBox'ов все бы записывалось как текст (строка), а у нас переменные разных типов, а во-вторых, при считывании вообще возникла бы ошибка, потому что нельзя так. И вообще, лучше всегда использовать переменные, а не объекты. Далее объявим еще две переменные, одна просто для получения свободного номера файла

Dim F As Long

а вторая, булева, т.е. логическая (ты помнишь, она может принимать только два значения False и True). Мы ее будем использовать, как флаг (т.е. переменная, которая показывает состояние чего-либо, как на флоте: флаг поднял (в смысле True) - корабль плывет, опустил (False), крабля напрвляется ко дну.), индикации состояния чего, позже скажу

Dim Flag As Boolean

Теперь немного прервемся. Нам самое время поговорить о файлах. Поскольку мы с ними так лихо начали работать, то нам как-то надо проверять, существует ли нужный нам файл, какие файлы существуют в директории и т.д. А то сунемся файл открывать, а его и нету. Тогда возникнет ошибка. Для этого есть очень простая, но крайне нужная функция Dir.

Функция DIR подробно.

Синтаксис ее такой: Dir (Полный путь, атрибут) Ну полный путь - это понятно, типа "c:\windows\system\хрень.dll". А атрибуты его это константы и могут принимать такие значения

Имя константы

Числовое значение константы

Тип файлов

vbNormal

0

обычные файлы

vbHidden

2

скрытые файлы

vbSystem

4

системные файлы

vbVolume

8

метка тома

vbDirectory

16

каталог (папка)

Если атрибут не ставить, то по умолчанию он равен 0 (обычный файл). Еще нам будет интересен атрибут = 16 (каталог, то бишь папка).  Причем все элементы функции Dir необязательны. Так как еe использовать? Смысл ее работы в том, что она ищет файл, удовлетворяющий пути. Если она его находит, то возвращает его имя, если нет, то пустую строку (""). Используя это замечательное свойство, можно ее использовать следующим образом:

- Проверить, существует ли файл "c:\windows\system\хрень.dll" If Dir("c:\windows\system\хрень.dll")<>"" Then Text1.Text="А я нашла файлик" т.е. можно смело с этим файлом работать.

-Проверить, существует ли директория windows If Dir("c:\windows",vbDirectory)<>"" Then Text1.Text="А я нашла папочку"  или (вместо константы vbDirectory можно поставить число 16 If Dir("c:\windows",16)<>"" Then Text1.Text="А я нашла папочку"  Это довольно-таки просто. А вот что бы найти все файлы в папке, узнать их имена, и т.п., надо написать такой код: Для этого примера я предполагаю, что на форме есть кнопка Command1 и текстбокс Text1. Весь код пишется в процедуре кнопки.

Private Sub Command1_Click()

Объявим переменную, FileName как строковую. Мы будем присваивать ей имя файла (переменная локальная, работает только в этой процедуре)

Dim FileName As String

и очистим Text1 (на всякий случай)

Text1.Text = ""

Присвоим нашей переменной значение, которое вернет функция Dir. Обратите внимание, что имя файла состоит из звездочек. Это потому, что мы хотим получить имена всех существующих файлов, независимо от имени и расширения. Допустимо также использовать знак ? (например, если мы хотим получить имена всех файлов с расширение txt, имена которых одинаковы, кроме последнего знака (file1.txt, file2.txt... file9.txt) , можно написать "file?. txt"

FileName = Dir("D:\MyPicture\Disk_001\*.*")

Сейчас функция Dir сработала первый раз (по полному пути) и теперь знает, в какой директории мы ведем поиск. Далее проверяем, может в этой папке вообще файлов нет

If FileName <> "" Then

если наша переменная, которая должна была получить имя от функции Dir - не пустая, значит все в порядке, файлы есть. И теперь организовываем цикл Do...While, который будет выполнятся, пока функция Dir не вернет пустую строку (а это значит, что файлов, удовлетворяющих нашему пути "D:\MyPicture\Disk_001\*.*" нет.

Do While FileName <> ""

Теперь дописываем имя полученного файла в тектбокс Text1 (константу vbCrLf ставим, чтобы у нас каждое новое имя файла писалось с новой строки, если конечно свойство MultiLine текстбокса стоит в состоянии True)

Text1.Text = Text1.Text & FileName & vbCrLf

теперь нам в этом же цикле нужно снова запустить функцию Dir, на сей раз без аргументов, просто скобочки (а можно и вообще без них

FileName = Dir() ' или FileName = Dir

Теперь закроем цикл, закроем условие If и закроем процедуру Command1_Click

Loop End If End Sub

Вот и все. Можете проверить. Еще раз поясняю работу Dir для выборки группы файлов. Первый вызов функции имеет полный путь до файла и маску имени файла ( с использованием * и ? ). При этом функция возвращает первое попавшееся имя файла, удовлетворяющее маске. Второй и последующие вызовы - функция не имеет аргументов и возвращает имена файлов, удовлетворяющих маске в произвольном порядке. После того, как все имена файлов возвращены и в директории нет больше файлов с именами, удовлетворяющими нашей маске, функция Dir возвращает значение "пустая строка" (""). Это сигнал к тому, что пора прекратить вызовы функции Dir. Если снова вызвать функцию Dir без аргументов, то это вызовет ошибку выполнения. Вызывать функцию можно теперь по-новой , с полным путем до файла. Поскольку мы не использовали второй аргумент "атрибут", то по умолчанию он равен 0, т.е. выбираются файлы. Если мы поставим атрибут 16 - папка, то это вовсе не значит, что функция Dir будет выбирать для нас только папки. Она выберет и папки и файлы, входящие в указанную нами в пути директорию. Есть прием, который позволяет отделить файлы и оставить только папки. Он приведен в Хелпе для пятого Бейсика.  Кроме того, поскольку Функция Dir возвращает файлы в произвольном порядке, то для достойного вывода списка файлов на экран, их надо отсортировать хотя бы в алфавитном порядке. О сортировке мы будем говорить, когда будем рассматривать массивы.

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

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

  • оператор Kill путь - уничтожает файл (или файлы, если используются подстановочные знаки * или ?) с диска (пример Kill "c:\mypicture\*.jpg")

  • оператор FileCopy "копируемый файл", "новое имя копируемого файла" - копирует файл. Лучше писать полный путь в обоих аргументах. (например: FileCopy "c:\referat.txt", "c:\allreferats\referat4.txt"). Открытый (например оператором Open) файл скопировать нельзя. Это вызовет ошибку выполнения.

  • оператор Name "староеимяфайла" As "новоеимяфайла" - переименовывает файл или каталог. При этом если указать разные пути, то файл перенесется под другим именем. А если пути одинаковые, а имена разные, то произойдет переименование файла. (пример: Name "c:\autoexe.bat" As "d:\myfile.bat")

  • оператор RmDir "путь" - уничтожает существующую пустую папку (пример RmDir "c:\Programs\Project"). При попытке удалить непустую папку возникает ошибка. Внимание, если не указать полный путь, оператор удалит папку из текущего каталога (пример RmDir "PAPKA").

  • оператор MkDir "путь" - создает новую папку (пример MkDir "c:\Programs\Project"). Если полный путь не указан, папка создается в текущем каталоге. (пример MkDir "Новый проект" ).

  • оператор СhDir "путь" - изменяет текущий каталог (а не диск) на указываемый в пути.

  • функция CurDir ("диск") - возвращает текущий диск. Аргумент диск необязательный.

  • оператор ChDrive "диск" - изменяет текущий диск. Аргумент диск - обязательный, в нем используется только первый символ.

В принципе, здесь все просто, поэтому специальной программой я иллюстрировать это не буду.

Кроме того, до кучи, хочу сказать, что из своей программы ты можешь запустить любой исполняемый файл, например .exe в ассинхронном режиме (т.е. он будет выполняться независимо от выполнения твоей программы, из которой ты его вызвал) с помощью функции