Here a simple example how to use a binary file to store records.
Routine to compact database not yet included...
Code: Select all
; Simple dataBase snippet with binary file; By Berikco
;
;
Structure Record
Deleted.l
Locked.l
Naam.b[50]
Straat.b[50]
Nummer.b[6]
PostNr.b[6]
Stad.b[40]
EndStructure
Structure DbHeader
Numrecords.l
NumDeleted.l
RecordLen.l
EndStructure
Global RecBuf.Record
Global Header.DbHeader
Header\RecordLen=SizeOf(Record)
#DataBase="PBaseIV.dat"
If FileSize(#DataBase)>0
OpenFile(1,#DataBase)
ReadData(@Header,SizeOf(DBHeader))
CloseFile(1)
Else
CreateFile(1,#DataBase)
WriteData(@Header,SizeOf(DBHeader))
CloseFile(1)
EndIf
Global Hwnd, Activ, Wit, Selected, Current
Current=-1
Hwnd=OpenWindow(0,100,150,600,400,#PB_Window_SystemMenu,"PBase IV")
Activ = CreateSolidBrush_($D3FAFF)
Wit=CreateSolidBrush_($FFFFFF)
Procedure myCallback(WindowID, Message, wParam, lParam)
Result = #PB_ProcessPureBasicEvents
Select Message
Case #WM_CTLCOLOREDIT
Select lparam
Case GadgetID(selected)
SetBkMode_(wParam,#TRANSPARENT)
Result = Activ
EndSelect
EndSelect
ProcedureReturn Result
EndProcedure
Procedure clear_record()
For r=0 To SizeOf(Record)-1
PokeB(@RecBuf\Deleted+r,0)
Next r
EndProcedure
Procedure Update()
If RecBuf\Deleted=1
clear_record()
RecBuf\Deleted=1
EndIf
SetGadgetText(11,PeekS(@RecBuf\Naam[0]))
SetGadgetText(12,PeekS(@RecBuf\Straat[0]))
SetGadgetText(13,PeekS(@RecBuf\Nummer[0]))
SetGadgetText(14,PeekS(@RecBuf\PostNr[0]))
SetGadgetText(15,PeekS(@RecBuf\Stad[0]))
SetGadgetText(30,"Records: "+Str(Header\Numrecords))
SetGadgetText(31,"Deleted: "+Str(Header\NumDeleted))
SetGadgetText(32,"DelFlag: "+Str(RecBuf\Deleted))
EndProcedure
If hwnd
SetWindowCallback(@myCallback())
CreateGadgetList(Hwnd)
TextGadget(1, 10, 10, 60, 18, "Naam",#PB_Text_Right)
TextGadget(2, 10, 30, 60, 18, "Straat",#PB_Text_Right)
TextGadget(3, 300, 30, 60, 18, "Nummer",#PB_Text_Right)
TextGadget(4, 10, 50, 60, 18, "PostNr",#PB_Text_Right)
TextGadget(5, 100, 50, 60, 18, "Stad",#PB_Text_Right)
StringGadget(11, 75, 10, 390, 18, "")
StringGadget(12, 75, 30, 240, 18, "")
StringGadget(13, 365, 30, 60, 18, "")
StringGadget(14, 75, 50, 60, 18, "")
StringGadget(15, 165, 50, 300, 18, "")
ButtonGadget(21, 10, 180, 80, 25, "" )
ButtonGadget(23, 170, 180, 80, 25, "Add" )
ButtonGadget(24, 250, 180, 80, 25, "Delete" )
ButtonGadget(25, 330, 180, 80, 25, "New" )
TextGadget(30, 500, 10, 60, 18, "")
TextGadget(31, 500, 30, 60, 18, "")
TextGadget(32, 500, 50, 60, 18, "")
update()
Repeat
Evt= WaitWindowEvent()
If Evt = #PB_EventGadget
Selected = EventGadgetID()
If selected > 10 And selected selected
sendmessage_(GadgetID(selected),#WM_SIZE,0,0)
If oldselection
sendmessage_(GadgetID(oldselection),#WM_SIZE,0,0)
EndIf
oldselection=selected
EndIf
Else
Select selected
Case 21 ; 0
If OpenFile(1,#DataBase)
Current-1
FileSeek(SizeOf(DBHeader)+Current*SizeOf(Record))
ReadData(@RecBuf,SizeOf(Record))
CloseFile(1)
update()
EndIf
EndIf
Case 22 ; >
If Current =0
If OpenFile(1,#DataBase)
RecBuf\Deleted=1 ; Set Deleted Flag
a$=Left(GetGadgetText(11),49)
CopyMemory(@a$,@RecBuf\Naam[0],Len(a$))
a$=Left(GetGadgetText(12),49)
CopyMemory(@a$,@RecBuf\Straat[0],Len(a$))
a$=Left(GetGadgetText(13),5)
CopyMemory(@a$,@RecBuf\Nummer[0],Len(a$))
a$=Left(GetGadgetText(14),5)
CopyMemory(@a$,@RecBuf\PostNr[0],Len(a$))
a$=Left(GetGadgetText(15),39)
CopyMemory(@a$,@RecBuf\Stad[0],Len(a$))
FileSeek(SizeOf(DBHeader)+Current*SizeOf(Record))
WriteData(@RecBuf,SizeOf(Record))
Header\RecordLen=SizeOf(Record)
Header\Numrecords-1
Header\NumDeleted+1
FileSeek(0)
WriteData(@Header,SizeOf(DBHeader))
CloseFile(1)
update()
EndIf
EndIf
Case 25 ; new
clear_record()
update()
EndSelect
EndIf
EndIf
Until Evt = #PB_EventCloseWindow
EndIf
End
Berikco
http://www.benny.zeb.be