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

InputBox("сообщение", "заголовок окна", "данные по умолчанию", расстояние между левой границей экрана и левым краем экрана,то же для верхней границы, "имя Help-файла" , номер раздела Help-файла)

Обязательным здесь является только первый аргумент (), но желательно использовать второй и третий. Четвертый и пятый - при необходимости, шестой и седьмой - если есть Help (а у нас его нет). Смысл аргументов такой же, как и в MsgBox'е. Итак

  • "сообщение" - это, что мы пишем для пользователя, например, "Введи свое имя" (максимальная длина приблизительно 1024 символа)

  • "заголовок окна" - это то, что выводится в верхней полосочке окна, например, "Авторизация!"

  • "данные по умолчанию" -это то что выведется в поле окна, как бы предложение юзеру

  • расстояние между левой границей экрана и левым краем экрана - ну это понятно, только расстояние это в Твипах (такая неведомая единица измерения, принятая по-умолчанию в Бейсике, я думаю, что 1 пиксель приблизительно равен 27 твипам, но зуб за это не дам)

  • то же для верхней границы - то же самое, только по вертикали

Последние два аргумента нам пока ни к чему.

Добавим теперь в нашу замечательную программу "Я - не вирус" InputBox так, чтобы при загрузке он очень строго спрашивал пароль юзера, а поскольку тот его не знает, пускал бы и так. Вставим в процедуру Form_Load, сразу после определения заголовка формы (Form1.Caption = "Я - не вирус!") следующий код:

Dim Password As String 'объявим локальную переменную, чтоб записать то, что введет юзер

Password = InputBox ("Этот программный продукт доступен только по паролю." _ 'выведем окно InputBox & "Если Вы приобрели его законно, Прочитайте пароль на диске и введите его в это окно.", _ "Авторизация пользователя", "Ж4д17") 'это я такой пароль придумал - Ж4д17

If Password ="Ж4д17" Then 'если юзер воспользовался нашим паролем

PushButton = MsgBox ("Ты что, не смог ничего придумать?" & Chr(13) & _ "А пароля, то и нет", 0 + 48, "Результат авторизации")

ElseIf Password = "" Then 'в противном случае, если юзер ничего не ввел или нажал кнопку Отмена  PushButton = MsgBox ("Думаешь, можно так взять и уйти? " _ & Chr(13) & Password & Chr(13) & "Ну-ка заходи, сволочь", 0 + 48, _ "Результат авторизации")

Else ' в противном случае, если юзер ввел свой пароль PushButton = MsgBox ("Ты что, не смог ничего придумать?" & Chr(13) & _ "А пароля, то и нет", 0 + 48, "Результат авторизации") End If

Обрати внимание, что так, как некоторые строки кода получаются очень длинными, я использую перенос. Для этого надо поставить курсор в то место, с которого хотите перенести строчку и нажиматьпробел, нижнее подчеркивание и ENTER. Не надо только разрывать строчку, заключенную в кавычки, а то это вызовет ошибку.

Запрет вызова второй копии программы.

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

If App.PrevInstance = True Then MsgBox "Программа Я - не вирус уже загружена. Не надо вызывать ее еще раз.", 16, "Ошибка пользователя" End End If

Здесь все ясно. При запуске программы "Я - не вирус" App.PrevInstance проверяет, запущена ли эта программа ранее. Если нет, то App.PrevInstance принимает значение False, если запущена, тоTrue. Это условие проверяется оператором If. Выводится диалоговое окно MsgBox, и вторая копия закрывается.

Ну вот, пока все. Код программы можно скачать вверху страницы. В следущей главе наверное разберем PictureBox и IimageBox для работы с картинками.

DriveListBox, DirListBox, FileListBox.

Я все-таки подумал, что пора потихоньку начинать работать с файлами. Начнем с объектов, которые помогут пользователю выбрать необходимый файл. Откроем новый .exe-проект, и поместим на форму три объекта (контрола) . DriveListBox, DirListBox и FileListBox (Рис 12).

Рисунок 12.

Теперь положим на форму Text1и в окне его свойств поставим свойство MultiLine в True (это чтобы текст не выводился в одну строку). Сюда мы будем помещать основные возвращаемые этими объектами значения. Для этого напишем коротенький код. В окне кода для каждого объекта откроем следующие процедуры и впишем в них по три строчки кода:

Option Explicit

Private Sub Drive1_Change() Text1.Text = Drive1.Drive & vbCrLf Text1.Text = Text1.Text & Drive1.ListIndex & vbCrLf Text1.Text = Text1.Text & Drive1.ListCount End Sub

Private Sub Dir1_Click() Text1.Text = Dir1.Path & vbCrLf Text1.Text = Text1.Text & Dir1.ListIndex & vbCrLf Text1.Text = Text1.Text & Dir1.ListCount & vbCrLf End Sub

Private Sub File1_Click() Text1.Text = File1.FileName & vbCrLf Text1.Text = Text1.Text & File1.ListIndex & vbCrLf Text1.Text = Text1.Text & File1.ListCount End Sub Обрати внимание: каждая процедура выводит в Text1 три значения. Чтобы они не сливались в одну строчку, а печатались с новой строки, мы используем константу vbClLf. Она и переводит строчки (но только при условии, если у Text1 включено свойство MultiLine).

Объект Drive1 выводит имена дисков, Dir1 - имена папок, и File1- имена файлов.

Потыкай в эти объекты мышкой и посмотри, какие значения возвращают эти объекты.

Первое свойство (для каждого объекта - свое) возврашает строковое выражение, показывающее имя диска (Drive1.Drive), путь (Dir1.Path) или имя файла (File1.FileName). Нас это свойство интересует больше всего. Свойство .Path может использоваться и с объектом File1 (File1.Path), но не с Drive1.

Второе свойство .ListIndex для Drive1 и File1 возвращает порядковый номер диска или файла в текущей директории, начиная с нулевого. Для Dir1 она возвращает -1 (минус один) для корневой папки и далее с нуля порядковый номер для вложенных в нее папок. В обратную же сторону порядок вложения идет со знаком минус. Проще говоря, посмотри на Рис.13. Синими цифрами показаны значенияDir1.ListIndex.

Рисунок 13.

Теперь с этой фигней должно быть понятнее.

Третье свойство ListCount возвращает общее количество дисков, папок в текущей папке или файлов в текущей папке.

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

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

А посему, сотрем весь код, который мы написали для тренировки и напишем код так, чтобы у нас в Text1 выводилось полное имя файла, который мы выбрали:

Option Explicit

Dim PathSearch As String 'переменная для хранения значения пути

Dim DiskName As String 'переменная для имени диска

Private Sub Form_Load() PathSearch = App.Path Drive1.Drive = PathSearch Dir1.Path = PathSearch File1.FileName = PathSearch End Sub

Private Sub Dir1_Change() File1.Path = Dir1.Path End Sub

Private Sub Drive1_Change() DiskName = Drive1.Drive Dir1.Path = DiskName & "\" File1.Path = Dir1.Path End Sub

Private Sub File1_Click() If Right (File1.Path, 1) = "\" Then Text1.Text = File1.Path & File1.FileName Else Text1.Text = File1.Path & "\" & File1.FileName End If End Sub

В коде должно быть все относительно понятно. Однако поясню. Мы объявили две переменные как строковые, одну для хранения значения пути, другую для имени диска. Чтобы при загрузке программа корректно отображала папки, диски и пр., мы в процедуре Form_Load с помощью функции App.Path ставим тот путь, где находится наша программа. Это очень удобно. В дальнейшем мы будем создавать служебные файлы и папки для хранения данных, необходимых нашей программе. И с помощью функции App.Path VB всегда найдет наш рабочий каталог. Использование промежуточной переменной PathSearch (как впрочем и DiskName) необходимо для корректной работы программы.

Далее. Когда мы выбираем диск в Drive1, процедура Drive1_Change через промежуточную переменную DiskName присваивает значение нового диска для Dir1, и в свою очередь значение нового пути для File1. Аналогично при выборе папки в Dir1 процедуа Dir1_Change присваивает новое значение пути для File1. Процедура же File1_Click собирает полное имя файла из пути File1.Path и имени файлаFile1.FileName. Правда, она осуществляет проверку, оканчивается ли File1.Path обратным слежом (\). Если да, то мы его не вставляем. Это необходимо, потому что имя диска возвращается со слежом, а если есть папка, то без. При этом мы применяем функцию Right.

Функции Left и Right.

Мы уже использовали в Главе 4 функции Len, которая определяла число знаков в строке и Mid, с помощью которой мы можем выдернуть из строки необходимое количество знаков. Теперь мы к ним добавим еще две, очень простые:

Right ("строка",число знаков)

Left ("строка",число знаков)

Смысл их в том, что мы выьираем для себя из текстовой строки "строка" справа (функция Right) или слева (функция Left) необходимое нам количество символов число знаков в собственную строку. Эта собственная строка и есть то значение, которое возвращает функция.

Например, такая запись Right ("бармалей",3) возвратит нам значение "лей", а Left ("метрополитен",5) возвратит "метро". Вот и вся математика (арифметика).

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

Графические объекты PictureBox и Image.

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

Все, что мы понаписали, мы используем для создания программки для пробразования графических файлов .jpg или .bmp в иконки .ico. На самом деле файлы ico имеют свой, особый формат и реально мы получим файл bmp размером 32х32 с расширением ico. Но это сейчас не главное. В дальнейшем мы, может сделаем настоящий редактор иконок.  Итак, сперва мы поменяем свойство нашей формы ScaleMode с 1 - Twip на 3 - Пиксель. Потому как с твипами непривычно и трудно работать.

Мы будем использовать два новых элемента PictureBox и Image. В них можно загружать, изменять и сохранять графические файлы. Разместим на нашей форме два PictureBox (Picture1 и Picture2) и один Image (Image1). Я надеюсь, что ты их найдешь. Кроме того положим одну командную кнопку Command1 и один Label1. Назовем кнопку Command1 (свойство Caption) "Сделать иконку 32х32".

Выглядеть это должно приблизительно, как на Рис. 14

Рисунок 14.

Установим свойство Picture1 ScaleMode в окне свойств тоже в 3 - Пиксель, как и у формы.

Вставим в процедуру File1_Click последней строкой (перед End Sub) такую штуку:

Picture1.Picture = LoadPicture(Text1.Text)

Эта штука - функция, которая загружает в PictureBox картинку, путь которой отобразится в Text1.

Теперь, с помощью нашей программы выберем какой-нибудь графический файл в компьютере и кликнем по нему. В наш PictureBox загрузится картинка. Хочу предупредить, что из-за недостатка оперативной памяти (менее 256 Mb) в твоем компьютере и большого размера файла картинки (более 1 Mb) этот процесс может не состояться или занять значительное время. Поэтому бери маленькие по объему (300-600 Кб) картинки.

Далее мы видим, что мы не фига не видим. Картинка видна не вся, а только кусочек, который позволяет размер Picture1. Можно, конечно, в окне свойств Picture1 поставить свойство AutoSize из False вTrue, но тогда Picture1 может так увеличиться, что не влезет в форму и все равно ее видно не будет. Можешь попробовать, но потом восстанови это свойство. Мы так делать на будем.

Что же нам делать? Для начала нам нужно узнать, какого же размера эта чертова картинка и запомнить этот размер. Для этого у Picture существуют свойства .Picture.Height для высоты и .Picture.Widthдля ширины. Однако, к сожалению значения, которые мы получим, будут в метрической системе HiMetric и чтобы перевести их в пиксели придется использовать методы ScaleX и ScaleY. Ну да ничего, не так страшно. Объявим в (General) две переменные Shirina и Visota

Dim Shirina As Long Dim Visota As Long

а после нашего оператора загрузки картинки, в процедуре File1_Click, пишем две строки, которые и дадут нам ширину картинки в пикселях:

Shirina = ScaleX(Picture1.Picture.Width, vbHimetric, vbPixels) Visota = ScaleY(Picture1.Picture.Height, vbHimetric, vbPixels)

где Picture1.Picture.Width - ширина в HiMetric, vbHimetric - константа, из какой метрической системы переводим, vbPixels - константа, в какую метрическую систему переводим.

Далее для красоты выведем ширину и высоту в Label1

Label1.Caption = Shirina & " x " & Visota

Зная реальный размер картинки мы можем вписать ее в заданный размер, например Image1, не зря ж мы его клали, надо использовать как-нибудь. Я установил его размер 265 на 265 пикселей, исходя из размера нашей формы. И нам надо подогнать размеры нашей картинки, пропорционально изменив длину и ширину. Сперва надо узнать вертикальная картинка (высота больше ширины) или горизонтальная (ширина больше высоты). Это мы сделаем условием If. В нем мы вычислим коэффициент Koeff (его тоже придется объявить), разделив большую сторону картинки на длину соответствуюшей стороны Image1. (Раcчет коэффициента можно сделать и по-другому: взять отношение большей стороны к меньшей Picture1).

If Shirina > Visota Then Koeff = Shirina / Image1.Width Else Koeff = Visota / Image1.Height End If

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

Dim ShirinaNew As Long Dim VisotaNew As Long

Получаем новые значения для ширины и длины Image1.

ShirinaNew = Shirina / Koeff VisotaNew = Visota / Koeff

У есть Image1 свойство Stretch. Если оно False (по умолчанию), то сам объект Image1 меняет свой размер по размеру картинки, а если True, то картинка меняется по размеру Image1, что нам сейчас и нужно.

Image1.Stretch = True

Выставляем новые значения размеров Image1

Image1.Height = VisotaNew Image1.Width = ShirinaNew

и передаем картинку в Image1

Image1.Picture = Picture1.Picture

Тут еще вот какие нюансы. Поскольку мы каждый раз меняем размер Image1, надо его восстанавливать. Делать это лучше в начале нашей процедуры File1_Click.

Image1.Width = 265 Image1.Height = 265

Кроме того ее желательно очищать, впрочем как и Picture1. Для этого им передаются пустые значения.

Picture1.Picture = LoadPicture("") Image1.Picture = LoadPicture("")

А кроме того, поскольку мы в Picture1 все равно ни черта не видим, сделаем ее невидимой, для чего в окне свойств изменим ее свойство Visible c True на False.

Теперь перейдем к тому, то ради чего мы все это затеяли: как же нам все-таки иконку-то сделать?

Изменим следующие свойства Picture2 на значение 36: Height, Width, ScaleHeight и ScaleWidth. (Почему 36, а не 32 не знаю. Если поставить 32, то иконки получаются размером 28х28). СвойствоAutoRedraw, которое отвечает за перерисовку, обязательно поставим в True. Создадим процедуру Command1_Click для нашей командной кнопки. В ней объявим локальную переменную Ima для создания нового имени, под которым мы запишем нашу иконку.

Private Sub Command1_Click() Dim Ima As String

Теперь, используя известные нам функции Len и Mid отсечем справа 4 знака (это предполагается расширение 3 знака и точка) и вместо него прибавим расширение .ico.

Ima = Mid(Text1.Text, 1, Len(Text1.Text) - 4) & ".ico"

Теперь используем метод PaintPicture. Он позволит нам перерисовать картинку из Picture1 в Picture2, масштабировав ее при этом

Picture2.PaintPicture Picture1, 0, 0, 32, 32, 0, 0, , , vbSrcCopy

Это происходит так. Picture2.PaintPicture записывает картинку из Picture1 в Picture2 с координатами в Picture2 0,0 c размером Picture2 32,32 и координаты в Picture1 0,0. vbSrcCopy - этот параметр - константа - необязателен (им устанавливается побитная операция).

Далее с помощью оператора SavePicture мы записываем полученную в Picture2 иконку в файл.

SavePicture Picture2.Image, Ima

Готово! Заработало. Скачать исходник можно вверху страницы. Конечно, это в общем-то всего лишь пример, но тем не менее у нее большой потенциал. Поработай с исходником, попробуй сделать, чтобы имя иконки мог задавать пользователь, сделай иконки другого размера, измени дизайн, разработай, короче, интерфейс.

Ну, учимся работать с текстовыми файлами. Это даст нам возможность прочитать существующий файл, изменить его, или создать свой, не прибегая к текстовым редакторам. Кроме того, в текстовом файле удобно хранить служебные данные собственной программы, например установки пользователя, результаты обработки данных и т.п.  Текстовой файл, собственно по названию, содержит в себе текстовые символы, ну и символы типа возврат каретки или перевод строки. Традиционно они имеют расширение .txt для текста, .dat для данных, .bat для исполняемых (командных) файлов, ну Windows еще использует .ini, .log, .inf. Читать и записывать их надо последовательно, символ за символом, начиная с первого.

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

Для открытия файла используется оператор Open. Синтаксис его такой:

Open путь For режим As #номер файла Примечание: для открытия файлов прямого доступа, или двоичных файлов оператор Open содержит еще кое-какие аргументы, но сейчас мы их не используем и опускаем.

Все указанные аргументы должны обязательно присутствовать: путь - это полный путь к открываемому файлу - (строковое выражение) пишется в кавычках, может состоять из нескольких строк, соединенных знаком конкатенации &. (Например "c:\MyText\referat.txt" или "c:\Mytext\" & "referat.txt") режим - способ открытия файла и представляет собой ключевые слова. В этой главе му будем использовать Input для считывания данных из файла, Output - для записи данных в файл, и Append - для добавления данных в файл. В режиме Input можно еще раз открыть уже открытый файл под другим номером, не закрывая его, в режимах Output и Append надо сначала закрыть файл, а потом открыть его снова. #номер файла - это всего лишь номер, по которому VB индентефицирает открытый файл. Он может быть любой от #1 до #255. Однако, лучше всего использовать функцию FreeFile (см. в примере), которая сразу возвратит свободный номер в переменную, и тебе нет нужды искать по своему коду, открыт ли у тебя файл под номером, например #3.

Кстати сказать, после того, как передача или прием данных в (из) файл(а) будут закончены, его надо закрыть, делается это оператором Close. Если этот оператор написать без всяких аргументов, он закроет все открытые файлы. Если же нам надо закрыть файл, скажем номер 2, то пишем Close #2. Попробуем работать с файлами на примерах:

СЧИТЫВАНИЕ из текстового файла.

Создадим новый .exe проект в какой-нибудь папке и в ту же папку положим небольшой текстовой файл (у меня например "Справка.txt"). На форме разместим кнопку Command1 и текстовое поле Text1. В свойствах Text1 свойство Multiline поставим в True (чтобы текст переносился по строкам), а свойство ScrollBars в 2 - Вертикаль (чтобы можно было прокручивать текст, если он не уместился) смотри рис.15.   Рисунок 15. Откроем окно кода и в (Genarel) объявим переменные F для хранения номера свободного файла, MyText и AllMyText - для хранения считываемого текста:

Dim F As Long Dim MyText As String Dim AllMyText As String

Создадим прцедуру Command1_Click() (щелкнув мышью по Command1 в выпадающем списке в окне кодов в верхнем левом поле, там где (General)). В теле образовавщейся процедуры. Можно также щелкнуть два раза по кнопке Command1 в режиме Объект и перейти в режим Код - там появится нужная нам процедура.

Private Sub Command1_Click()

Напишем для определения номера свободного файла

F = FreeFile

и откроем файл для чтения

Open App.Path & "\Справка.txt" For Input As #F

Обратите внимание, что для указания пути файла мы опять используем функцию App.Path. Если бы мы написали просто "c:\VB\example\Справка.txt", то при переносе нашей паки с программой на другой диск или компьютер этот путь оказался бы ложным. А функция App.Path всегда возвращает путь, где лежит наша программа. Только перед именем файла не забывайте ставить обратный слеж (\), иначе запись работать не будет. Для считывания строки текста существует оператор Line Input. Попробуем считать с его помощью содержимое файла в переменную MyText :

Line Input #F, MyText

Передадим значение MyText переменной в Text1, чтобы увидеть, что мы там считали:

Text1.Text = MyText

затем закроем файл

Close #F End Sub

и запустим нашу программу. Когда мы нажмем кнопку Command1, то в Text1 появиться содержимое файла "Справка.txt". Проблема только в том, что, если,( как и случилось в нашем файле "Справка.txt"), при создании текста применялось нажатие кнопки ENTER (перевод строки), то оператор Line Input считает текст до этого знака и все, потому, что строка кончилась. Чтобы этого избежать, мы применим цикл и будем считывать строки до конца файла. Для этого придется разобраться с новым для нас циклом по условию Do... Loop.

Цикл по условию Do...Loop.

Это очень простая вещь. Цикл работает до тех пор, пока не выполнится какое-нибудь условие. Например мы будем увеличивать переменную X до тех пор, пока оне не станет равной, например, 100. Для этого применяется аргумент Until:

Do Until x>=100 x=x+1 Loop

при этом когда цикл закончится x будет равно 100. Можно записать его по другому, при этом смысл работы цикла не изменится:

Do x = x + 1 Loop Until x >=100

Можно цикл записать наоборот, и он будеn выполняться до тех пор, пока соблюдается какое-то условие. Для этого применяется аргумент While (делать, пока...) :

Do While x < 100 x = x + 1 Loop

или же:

Do x = x + 1 Loop While x < 100

Во всех четырех случаях результат будет один. Цикл остановится, когда X=100. Только надо обращаться с ними аккуратно. Если ты поставишь условие, которое изначально ложно, цикл не выполнится ни разу, и наоборот если условие будет истинно всегда, возникнет бесконечный цикл и программа по-сути зависнет. Вот этот цикл не будет выполняться:

Do While x =100 x = x + 1 Loop

а этот будет бесконечным

Do Until x < 0 x = x + 1 Loop

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

Private Sub Command1_Click() '1 Text1.Text = "" '2 F = FreeFile '3 Open App.Path & "\Справка.txt" For Input As #F '4 Do Until EOF(F) '5 Line Input #F, MyText '6 Text1.Text = Text1.Text & MyText & vbCrLf '7 Loop '8 Close #F '9 End Sub '10

По строкам здесь: 1 - объявление нашей процедуры 2 - очистка Text1 3 - присваиваем переменной F свободный номер файла 4 - открываем файл "Справка.txt" для последовательного чтения 5 - цикл по условию: до тех пор пока не конец файла 6 - DO в цикле считываем каждую строчку 7 - Присоединяем очередную строку к Text1 и ставим перевод строки (vbCrLf) чтоб красиво было 8 - LOOP завершаем цикл 9 - закрываем наш файл 10- конец процедуры Ну вот и готово.

Сейчас мы считаем файл другим способом, с помощью функции Input. Синтаксис ее такой: Input(число, [#]номерФайла)

Смысл ее такой, что она из файла [#]номерФайла, открытого в режиме Input считывает число знаков. Мы используем ее также, как оператор Line Input, только считывать будем не по одной строчке, а по одному символу, и собирать их будем в переменной AllMyText, значение которой присвоим потом текстбоксу Text1. Поместим на нашу форму еще одну кнопку Command2 (свойство Captionприсвоим "Функция Input") и создадим для нее прцедуру, где и используем функцию Input.

Private Sub Command2_Click() F = FreeFile Open App.Path & "\Справка.txt" For Input As #F Do Until EOF(F) MyText = Input(1, #F) AllMyText = AllMyText & MyText Loop Close #F Text1.Text = AllMyText End Sub

Здесь все почти в точности, как и в предыдущем примере, только суть несколько другая.

Ну и в дополнение попробуем прочитать наш файл с помощью оператора Input #. Это не самая лучшая идея, так как эта инструкция считывает файл, желательно, записанный с оператора Write #. Синтаксис такой: