Автор вопроса: angrynews | Web-сайт:www.angrynews.ru
Приветствую уважаемых программистов!
Описываю ситуацию:
Неспециалист, недавно начавший любитель. Решил написать минибазу для сохранеия информации о клиентах. 9 текстовых полей ввода. Данные из них идут в базу txt, причем идут в строку. Заносятся оператором PRINT, разделитель запятая. Вот код:
Open "C:\Base.txt" For Append As #1
Print #1, Text1(0).Text, Text1(1).Text, Text1(2).Text, Text1(3).Text, Text1(4).Text, Text1(5).Text, Text1(6).Text, Text1(7).Text, Text1(8).Text
Close #1
Заносится без проблем, слова в самом файле получаются разделенными просто пробелами, причем длина символов слова и пробела в сумме одинакова.
Я хочу сделать так, чтобы при поиске по данному одного из полей, инфа возвращалась обратно в текстовые поля. Мой подход был такой: выделяю строку в базе, просматриваю ее на предмет слова, если оно есть, то каждое слово строки именно этой должно помещаться в свой textbox. Слово находится без проблем, а вот дальше не могу ничего понять. Оператор INPUT не подходит, т.к. он последовательно смотрит, а мне надо сразу перейти к нужной строке. Хотя он идеально все делал, но со следующей строкой за нужной мне. И данные считывал и помещал их в переменные, но со следующей строки, и как его заставить брать их из нужной я не придумал. Значит использую GET. Перерыл кучу литературы и сайтов...толково нигде нет информации, как его использовать. Методом тыка тоже не вычислил ничего. Я хотел в пользовательский тип переменной с 9-ю полями (столько же сколько и textbox) поместить строку, как это описывается в примерах. Помещается, но как-то странно, не по порядку, слова разорваны, кол-во разное....косяк в общем.
Вот код:
Type record
chislo As String * 10
den As String * 10
famil As String * 10
imya As String * 10
phone As String * 10
usluga As String * 10
oplata As String * 10
sdacha As String * 10
primechanie As String * 10
End Type
Private Sub Command2_Click()
Dim danie As record
counter = 1
Open "C:\Base.txt" For Input As #1
Do While Not EOF(1)
Line Input #1, stroka
If InStr(1, stroka, Text1(4).Text) > 0 Then
Exit Do
End If
counter = counter + 1
Loop
Close #1
Get #1, counter, danie
End Sub
В связи с этой всей фигней назрело решение спросить специалистов следующее:
1. Пользовательский тип переменной, когда он применяется?
2. Что означают *10 при описании ее полей?
3. Если я ее использую как пробовал, то каким образом в эти поля попадают данные - по порядку или...?
4. Описание оператора GET сказало, что используется одинаковая длина строк. Это как, одинаковая длина чего? При помещении в базу не надо делать пробелов и разделителей, чтобы шло сплошное слово, а потом указывать кол-во букв в описании пользовательского типа? Не понимаю...
5. При занесении данных в базу, какие разделители ставить , или ; С , есть пробелы как я описывал одинаковой со словом в сумме длины, а с ; вообще нет разрывов. Можно ли как нить это регулировать и есть ли еще какие нить типы разделителей, а если есть, то когда и как их использовать?
6. Почему иногда данные видит в кавычках а иногда без них? Принципиально ли это?
Вот вроде такая проблема и такие вопросы. Может кто порекомендует какую-нить книгу...или сайт с ответами людей на вопросы, вернее четкие комментарии при описании функции или оператора. У меня книга Сайлера и Спотса, 800 листов, но полных комментариев нет. На сайтах тоже не полностью описывается это.
Спасибо за то, что выдержали такое чтение.
1. Когда хоцца собрать в одном месте несколько переменных, относящихся к одной вещи.
2. Длина строки в символах.
3. По порядку.
4. Для организации файлов такого рода используется Random-доступ с указанием len=len(danie)
5. Никаких, ввод-вывод только через get и put.
6. Смотря как записать.
Public Sub SaveToFile(Data$, PathFile As String)
On Error Resume Next
Kill PathFile
'Сохранение переменной в файл
n = FreeFile
Open PathFile For Binary As #n
Put n, , Data$
Close #n
End Sub
Public Function LoadTextFile(path As String) As String
'Загрузка файла в переменную
Dim l As Long
Dim s As String
n = FreeFile
Open path For Binary As #n
l = LOF(n)
s = String(l, vbNullChar)
Get n, , s
Close #n
LoadTextFile = s
End Function
Раз 100 на форуме постил этот код...
'Записываем:
Dim txt as String, i as Integer
For i% = 0 to Ubound(Text1)
txt$ = txt$ & Text1(i & ","
Next i%
Call SaveToFile (txt$, file$)
'Читаем:
txt$ = LoadTextFile (file$)
'Разбиваем на массив и заносим в текстбоксы
Dim tmpArray() as String
tmpArray = Split (txt$, ","
'Показуем в текстовых полях:
For i% = 0 to Ubound(Text1)
Text1(i = tmpArray(i
Next i%
Тебе не понятно как работать с GET?
Для начала действительно файл неплохо было бы открыть. Открывать нужно в двоичном режиме (Binary, Random), а не в режиме Ввода-вывода (Input, Output).
Далее, прототип оператора GET такой:
GET #НомерФайла,[Позиция],Переменная
НомерФайла - это тот же номер, который ты использовал для открытия файла;
Позиция - номер байта, с которого начнётся считывание. В квадратных скобках потому что опционально, т.е. может не использоваться (GET #НомерФайла,,Запись), а вместо него будет автоматически подставлена позиция по умолчанию, которая зависит от предыдущих файловых операций. Контролировать эту позицию можно оператором и функцией SEEK;
Переменная - блок данных фиксированной длины (в VB могут быть и динамические строки, которые записываются в файл вместе с длиной). Например, это может быть пользовательский тип или строка фиксированной длины. Как только произойдёт операция чтения/записи (GET/PUT), то маркер позиции автоматически сместится на равное длине переменной количество байт.
По-моему, все забыли о команде Write #. Она как-раз делает то, что надо: разделяет поля заятыми, берет строки в кавычки при надобности. При этом для чтения можно использовать Input #
Используем Split. В "помогите, пожалуйста решить школьную программу в Pascal" это описано. А писать в файл хорошо бы через запятую. Тогда объединение происходит с помощью Join.