ПЕТР » 06.08.2003 (Ср) 3:36
Ну вот я тут примерно набросал.
Я этот пример в Access пробовал, том просто удобнее
Option Compare Database
Option Explicit
'об'являем тип запись, поле f это специально для отметки как
'удаленная запись
Type rec
i As Long
t As String * 50
b As Byte
f As Boolean
End Type
Private r As rec
'---------------------------------
Private Sub MyWriteAll()
'создаем какой нибудь файл
Dim i As Long
Open "C:\p.p" For Random As #1 Len = Len(r)
For i = 1 To 120
r.b = 12
r.i = i
r.t = "Привет"
r.f = False 'это поле специальное для отметок как удаленная запись
Put #1, i, r
Next i
Close #1
End Sub
'----------------------------------------------
Private Sub MyReadAll()
' читаем все
Dim i As Long
Open "C:\p.p" For Random As #1 Len = Len(r)
i = 0
Do
i = i + 1
Get #1, i, r
If r.i > 0 Then
' можно например делать специальную установку выводить удаленные записи, не выводить
' If Not r.f Then
Debug.Print r.i, r.t, r.b, r.f
' End If
End If
Loop While Not EOF(1)
Close #1
End Sub
'-------------------------------------------
Private Sub MyReadRec(nRec As Long)
' чтение записи с определенным номером
Open "c:\p.p" For Random As #1 Len = Len(r)
Get #1, nRec, r
If EOF(1) Then
r.i = 0
End If
Close #1
End Sub
'----------------------------------------------------
Private Function MyDel(nRec As Long) As Long
' пометка записи с номером как удаленной
Dim RetVal As Long
Open "C:\p.p" For Random As #1 Len = Len(r)
Get #1, nRec, r
If EOF(1) Then
RetVal = 0
Else
r.f = True
Put #1, nRec, r
RetVal = nRec
End If
Close #1
MyDel = RetVal
End Function
'---------------------------------------------------------------
Private Sub MyWriteRec(nRec As Long, rW As rec)
'Write записи если nRec = 0 то ищем первую удаленную запись и пишем на ее место
'если nRec > 0 то пишем на запись с указанным номером
'ну тут нужно покумекать, запись в конец, если номер больше чем записей, ошибки и пр.
Dim i As Long
Open "C:\p.p" For Random As #1 Len = Len(r)
If nRec = 0 Then
i = 0
Do
i = i + 1
Get #1, i, r
If r.f Then
Exit Do
End If
Loop While Not EOF(1)
nRec = i
End If
rW.f = False
Put #1, nRec, rW
Close #1
End Sub
'------------------------------------------------------------
Private Sub MyMy()
'читаем определенную запись
MyReadRec (12)
Debug.Print r.i, r.t, r.b, r.f
End Sub
'-------------------------------------------
Private Sub MyMyDel()
' удаляем запись с номером
Dim ii As Long, nRec As Long
nRec = 12
ii = MyDel(nRec)
If ii > 0 Then
MsgBox ("Запись " & nRec & " Успешно помечена как удаленная")
End If
End Sub
'-----------------------------------------
Private Sub MyWrite()
'пишем запись на первую удаленную если она есть
Dim rww As rec
rww.i = 1222
rww.t = "До свидания"
rww.b = 128
Call MyWriteRec(0, rww)
End Sub
Ну вот, примерно в таком духе, конечно это набросок. Я думаю идею ты понял, имеем специальное поле для отметки и запись просто отмечаем как удаленную, а при работе с файлом нужно иметь ввиду что есть отметка об удалении.
Если файл данных большой, то желательно иметь на него, что-то вроде индексов. Допустим индекс на удаленные записи, там храняться номера удаленных записей, затем можно просто его открыть и прочитать первый номер, но для его обновления его придется всегда заново переписывать.
Для ускорения поиска можно иметь индексы на нужные поля, формат примерно такой: поле индекса, номер записи в базе.
Здесь открывается огромный простор для творчества как сортировать, как хранить индексы их перезаписывать и т.д. и т.п.
В таблицах можно первую строку использовать как заголовок файла и там описывать поля (название, тип, длина и пр.).
Некоторые могут сказать, а нафига.
Ну во первых это интересно, пускай народ не обижается но класс программирование в VB в основном зависит от того кто сколько литературы и Help_ов поимел, чем дальше залазишь в дебри классов, свойств и методов тем грустнее становиться. К тому-же это катострофически пожирает ресурсы, а с 128 метрами памяти по моему нет особого труда открыть тот же индекс на 10000 записей в памяти и не мучить винт. И к тому-же ты не зависишь от лицензий.
Я недавно видел в одной организации 286-й на нем кадровая задачка на С, чудно работает.
На вопрос, че компьютер не замените, ответ а на фига.
Работает, что надо делает в игрушки не играют и даже последние вирусы его не трогают.
Ну я чето расфилосовствовался, это не к добру, ну давай дерзай.
[/img]