That still didn't work - Global Selected is stated on this line: "Global Hwnd, Activ, Wit, Selected, Current"
However, I found another version of the code on this forum which runs fine. If anyone's interested, the original post is here:
Code: Select all
; Simple dataBase snippet with binary file
; By Berikco
;
;
; Additions, changes and errors by FangBeast/FarDarker (25/10/2002)
;- Structures -------------------------------------------------------------------------------------
Structure record
deleted.l
locked.l
name.b[50]
street.b[50]
number.b[6]
postcode.b[6]
state.b[40]
EndStructure
Structure dbheader
numrecords.l
numdeleted.l
recordlen.l
EndStructure
;- global data ------------------------------------------------------------------------------------
Global recbuf.record, header.dbheader, hwnd, current
;- precalculated variables ------------------------------------------------------------------------
header\recordlen = SizeOf(record)
;- constants --------------------------------------------------------------------------------------
#database = "pbaseiv.dat"
#forward = 1
#backward = 2
#first = 3
#last = 4
#addrec = 5
#newrec = 6
#delrec = 7
#updrec = 8
#namelabel = 10
#streetlabel = 11
#numberlabel = 12
#postcodelabel = 13
#statelabel = 14
#name = 15
#street = 16
#number = 17
#postcode = 18
#state = 19
#records = 20
#delrecd = 21
#delflag = 22
#recnum = 23
;- open the database or create it if it doesn't exist ---------------------------------------------
If FileSize(#database) > 0
OpenFile(1, #database)
ReadData(@header, SizeOf(dbheader))
CloseFile(1)
Else
CreateFile(1, #database)
WriteData(@header, SizeOf(dbheader))
CloseFile(1)
EndIf
;- current record pointer -------------------------------------------------------------------------
current = - 1
;- open the program window ------------------------------------------------------------------------
hwnd = OpenWindow(0, 100, 180, 560, 140, #pb_window_systemmenu, "pbase iv")
CreateGadgetList(hwnd)
TextGadget(#namelabel, 10, 10, 60, 18, "name", #pb_text_right)
TextGadget(#streetlabel, 10, 30, 60, 18, "street", #pb_text_right)
TextGadget(#numberlabel, 300, 30, 60, 18, "number", #pb_text_right)
TextGadget(#postcodelabel, 10, 50, 60, 18, "pcode", #pb_text_right)
TextGadget(#statelabel, 100, 50, 60, 18, "state", #pb_text_right)
StringGadget(#name, 75, 10, 390, 18, "")
StringGadget(#street, 75, 30, 240, 18, "")
StringGadget(#number, 365, 30, 60, 18, "")
StringGadget(#postcode, 75, 50, 60, 18, "")
StringGadget(#state, 165, 50, 300, 18, "")
ButtonGadget(#backward, 40, 100, 40, 25, "<")
ButtonGadget(#forward, 80, 100, 40, 25, ">")
ButtonGadget(#first, 120, 100, 40, 25, "<<")
ButtonGadget(#last, 160, 100, 40, 25, ">>")
ButtonGadget(#addrec, 224, 100, 60, 25, "Add")
ButtonGadget(#delrec, 284, 100, 60, 25, "Delete")
ButtonGadget(#newrec, 344, 100, 60, 25, "New")
ButtonGadget(#updrec, 404, 100, 60, 25, "Update")
TextGadget(#records, 480, 10, 60, 18, "")
TextGadget(#delrecd, 480, 30, 60, 18, "")
TextGadget(#delflag, 480, 50, 60, 18, "")
TextGadget(#recnum, 480, 70, 60, 18, "")
DisableGadget(#addrec, 1)
Gosub firstrecord
Gosub update
Repeat
eventid = WaitWindowEvent()
If eventid = #pb_eventgadget
Select EventGadgetID()
;------------------------------------------------------------------------------------------
Case #backward : Gosub backwards
Case #first : Gosub firstrecord
Case #forward : Gosub forwards
Case #last : Gosub lastrecord
;------------------------------------------------------------------------------------------
Case #addrec : Gosub addrecord
Case #delrec : Gosub deleterecord
Case #newrec : Gosub newrecord
Case #updrec : Gosub updaterecord
;------------------------------------------------------------------------------------------
EndSelect
EndIf
Until eventid = #pb_eventclosewindow
End
;- update a record's details ----------------------------------------------------------------------
update:
If recbuf\deleted = 1
For r = 0 To SizeOf(record) - 1 ; Must start at 0 and end at record - 1
PokeB(@recbuf\deleted + r, 0) ; Poke 0's at position (r)
Next r
recbuf\deleted = 1
EndIf
SetGadgetText(#name, PeekS(@recbuf\name[0]))
SetGadgetText(#street, PeekS(@recbuf\street[0]))
SetGadgetText(#number, PeekS(@recbuf\number[0]))
SetGadgetText(#postcode, PeekS(@recbuf\postcode[0]))
SetGadgetText(#state, PeekS(@recbuf\state[0]))
SetGadgetText(#records, "records: " + Str(header\numrecords))
SetGadgetText(#delrecd, "deleted: " + Str(header\numdeleted))
SetGadgetText(#delflag, "delflag: " + Str(recbuf\deleted))
SetGadgetText(#recnum, "recnum : " + Str(current))
Return
;- Go backwards one record ------------------------------------------------------------------------
backwards:
If current > 0
If OpenFile(1, #database)
DisableGadget(#addrec, 1)
current - 1
FileSeek(SizeOf(dbheader) + current * SizeOf(record))
ReadData(@recbuf, SizeOf(record))
CloseFile(1)
Gosub update
EndIf
EndIf
Return
;- Go forwards one record -------------------------------------------------------------------------
forwards:
If current < header\numrecords + header\numdeleted - 1
If OpenFile(1, #database)
DisableGadget(#addrec, 1)
current + 1
FileSeek(SizeOf(dbheader) + current * SizeOf(record))
ReadData(@recbuf, SizeOf(record))
CloseFile(1)
Gosub update
EndIf
EndIf
Return
;- Go to the first record -------------------------------------------------------------------------
firstrecord:
If OpenFile(1, #database)
DisableGadget(#addrec, 1)
current = 0
FileSeek(SizeOf(dbheader) + current * SizeOf(record)) ; Seek forward 176 bytes
ReadData(@recbuf, SizeOf(record)) ; Read record to buffer
CloseFile(1) ; Close the file
Gosub update ; Update buffer to screen
EndIf
Return
;- Go to the last record --------------------------------------------------------------------------
lastrecord:
If OpenFile(1, #database)
DisableGadget(#addrec, 1)
current = header\numrecords + header\numdeleted - 1
FileSeek(SizeOf(dbheader) + current * SizeOf(record))
ReadData(@recbuf, SizeOf(record))
CloseFile(1)
Gosub update
EndIf
Return
;- Add a new record to the database ---------------------------------------------------------------
addrecord:
If GetGadgetText(#name) = "" Or GetGadgetText(#street) = "" Or GetGadgetText(#number) = "" Or GetGadgetText(#postcode) = "" Or GetGadgetText(#state) = ""
DisableGadget(#addrec, 1)
Return
EndIf
If OpenFile(1, #database)
a$ = Left(GetGadgetText(#name), 49) : CopyMemory(@a$, @recbuf\name[0], Len(a$))
a$ = Left(GetGadgetText(#street), 49) : CopyMemory(@a$, @recbuf\street[0], Len(a$))
a$ = Left(GetGadgetText(#number), 5) : CopyMemory(@a$, @recbuf\number[0], Len(a$))
a$ = Left(GetGadgetText(#postcode), 5) : CopyMemory(@a$, @recbuf\postcode[0], Len(a$))
a$ = Left(GetGadgetText(#state), 39) : CopyMemory(@a$, @recbuf\state[0], Len(a$))
FileSeek(Lof()) ; Seek to the end of the file
WriteData(@recbuf, SizeOf(record)) ; Write the record to disk
header\recordlen = SizeOf(record) ; Compute the length of the record
header\numrecords + 1 ; Calculate new number of records
FileSeek(0) ; Seek to the start of the file
WriteData(@header, SizeOf(dbheader)) ; Write the header details (file length, records)
CloseFile(1) ; Close the file
For r = 0 To SizeOf(record) - 1 ; Clear the record buffer
PokeB(@recbuf\deleted + r, 0)
Next r
Gosub update ; Update the current record display
DisableGadget(#addrec, 1) ; Disable add until new is clicked again
EndIf
Return
;- Delete the current record ----------------------------------------------------------------------
deleterecord:
If current > = 0
If OpenFile(1, #database)
DisableGadget(#addrec, 1) ; Disable add until new is clicked again
;--------------------------------------------------------------------------------------------
FileSeek(0)
FileSeek(SizeOf(dbheader) + current * SizeOf(record))
If recbuf\deleted = 1
CloseFile(1)
Return
EndIf
;--------------------------------------------------------------------------------------------
a$ = Left(GetGadgetText(#name), 49) : CopyMemory(@a$, @recbuf\name[0], Len(a$))
a$ = Left(GetGadgetText(#street), 49) : CopyMemory(@a$, @recbuf\street[0], Len(a$))
a$ = Left(GetGadgetText(#number), 5) : CopyMemory(@a$, @recbuf\number[0], Len(a$))
a$ = Left(GetGadgetText(#postcode), 5) : CopyMemory(@a$, @recbuf\postcode[0], Len(a$))
a$ = Left(GetGadgetText(#state), 39) : CopyMemory(@a$, @recbuf\state[0], Len(a$))
recbuf\deleted = 1 ; Set deleted flag
FileSeek(SizeOf(dbheader) + current * SizeOf(record))
WriteData(@recbuf, SizeOf(record))
;--------------------------------------------------------------------------------------------
header\recordlen = SizeOf(record) ; Size of the record
header\numrecords - 1 ; How many live records there are
header\numdeleted + 1 ; How many deleted records there are
FileSeek(0) ; Go to start of file
WriteData(@header, SizeOf(dbheader)) ; Write the new header data
CloseFile(1) ; Close the file
Gosub update ; Update the screen
EndIf
EndIf
Return
;- Update the current visible record and reset it's deleted status if deleted ---------------------
updaterecord:
If OpenFile(1, #database)
DisableGadget(#addrec, 1) ; Disable add until new is clicked again
For r = 0 To SizeOf(record) - 1 ; Clear the record buffer
PokeB(@recbuf\deleted + r, 0)
Next r
a$ = Left(GetGadgetText(#name), 49) : CopyMemory(@a$, @recbuf\name[0], Len(a$))
a$ = Left(GetGadgetText(#street), 49) : CopyMemory(@a$, @recbuf\street[0], Len(a$))
a$ = Left(GetGadgetText(#number), 5) : CopyMemory(@a$, @recbuf\number[0], Len(a$))
a$ = Left(GetGadgetText(#postcode), 5) : CopyMemory(@a$, @recbuf\postcode[0], Len(a$))
a$ = Left(GetGadgetText(#state), 39) : CopyMemory(@a$, @recbuf\state[0], Len(a$))
If recbuf\deleted = 1 ; If we update a deleted record, change status to undeleted
recbuf\deleted = 0 ;
header\numdeleted - 1 ; Subtract one from the number of deleted records
header\numrecords + 1 ; Add it back to live record status
EndIf
FileSeek(SizeOf(dbheader) + current * SizeOf(record))
WriteData(@recbuf, SizeOf(record)) ; Write the record to disk
header\recordlen = SizeOf(record) ; Compute the length of the record
FileSeek(0) ; Seek to the start of the file
WriteData(@header, SizeOf(dbheader)) ; Write the header details (file length, records)
CloseFile(1) ; Close the file
EndIf
Gosub update ; Update the current record display
Return
;- Create a new, blank record field ---------------------------------------------------------------
newrecord:
DisableGadget(#addrec, 0)
For r = 0 To SizeOf(record) - 1
PokeB(@recbuf\deleted + r, 0)
Next r
Gosub update
Return
Thanks for all your help.