Hi,
I want to create a simple database that stores contact details i.e. an address book application. I don't think I need to use SQL and reckon that I could store all the details in a .csv file.
Does anyone know where I can find PureBasic source code for a simple address book application or code for reading and writing to a .csv file?
Simple database
Found this file - created by Berikco....
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(22, 90, 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 < 16
If oldselection <> 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 ; <
If Current >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 < Header\Numrecords+Header\NumDeleted-1
If OpenFile(1,#DataBase)
Current+1
FileSeek(SizeOf(DBHeader)+Current*SizeOf(Record))
ReadData(@RecBuf,SizeOf(Record))
CloseFile(1)
update()
EndIf
EndIf
Case 23 ; Add
If OpenFile(1,#DataBase)
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(Lof())
WriteData(@RecBuf,SizeOf(Record))
Header\RecordLen=SizeOf(Record)
Header\Numrecords+1
FileSeek(0)
WriteData(@Header,SizeOf(DBHeader))
CloseFile(1)
clear_record()
update()
EndIf
Case 24 ; Delete
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
-
- User
- Posts: 27
- Joined: Sat Oct 16, 2004 1:25 pm
Thanks for that! It'd be nice to see what the program actually looks like but I can't get it to run - I get "Error at line 51: #Gadget object not initialized". Line 51 is "Case GadgetID(selected)".
Can someone tell me how to correct the source code? I'm still new to PureBasic and apologise if it appears obvious!
Can someone tell me how to correct the source code? I'm still new to PureBasic and apologise if it appears obvious!
Hi johnnyutah:Can someone tell me how to correct the source code?
Just add
Code: Select all
Global Selected
-
- User
- Posts: 27
- Joined: Sat Oct 16, 2004 1:25 pm
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: viewtopic.php?p=6076 and updated code is shown below:
Thanks for all your help.
However, I found another version of the code on this forum which runs fine. If anyone's interested, the original post is here: viewtopic.php?p=6076 and updated code is shown below:
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