Removing only one from list - help
Blitz3D Forums/Blitz3D Programming/Removing only one from list - help| 
 | ||
| 
Global numlist
Graphics3D 800,600,32,2
SetBuffer BackBuffer()
AntiAlias True
LoadFileData("datafile.dat")
While Not KeyDown( 1 ) 
Cls
if keyhit(2) then numlist=numlist+1:dat.dataobj = new dataobj
if keyhit(3) then
numlist=numlist-1
for dat.dataobj = each dataobj
delete dat
next
endif
if keyhit(4) then SaveFileData("datafile.dat")
Flip
Wend
ClearWorld
EndGraphics
End
Function SaveFileData(filename$)
file=WriteFile(filename$)
If file Then
WriteInt(file,numlist)
for dat.dataobj = each dataobj
WriteByte(file,dat\data1)
WriteInt(file,dat\data2)
WriteInt(file,dat\data3)
next
CloseFile(file)
EndIf
End Function
Function LoadFileData(filename$)
file=ReadFile(filename$)
If file Then
numlist=ReadInt(file)
for l=0 to numlist-1
dat.dataobj = new dataobj
dat\data0=ReadByte(file)
dat\data1=ReadInt(file)
dat\data2=ReadInt(file)
next
CloseFile(file)
EndIf
End Function
Type DataObj
Field data1,data2,data3
End Type
 | 
| 
 | ||
| I think that you are the king of description (of a problem), i wonder who will find a solution to that (since the description of the problem is vague). | 
| 
 | ||
| . | 
| 
 | ||
| I can only guess, what you want to ask... You have a type "dataobj" and you add new instances "dat" to it. Now you want to remove one from this list? The solution depends on, which one you want to remove.... You can remove the first, the last, or any position. Or you can kill one if Data1 reaches a condition. What do you want? here is a sample to kill the first instance (thanks to Bobbysait) Type DataObj
     Field Data1:INT, Data2:INT, Data3:INT 
End Type
.....
If keyhit(2) 
     numlist=numlist+1
     dat.dataobj = new dataobj
ElseIf keyhit(3) then
     numlist=numlist-1
     local dat.dataobj = First dataobj
     delete dat
endifhere is a sample to kill the last instance (thanks to Bobbysait) Type DataObj
     Field Data1:INT, Data2:INT, Data3:INT 
End Type
.....
If keyhit(2) 
     numlist=numlist+1
     dat.dataobj = new dataobj
ElseIf keyhit(3) then
     numlist=numlist-1
     Local dat.dataobj = Last dataobj
     delete dat
endifhere is a sample to kill the instance at position P=4. Before you can do this, you need a unique identifier which points to the single instances. So add another field "Number" to the type. P:INT=4
Type DataObj
     Field Data1:INT, Data2:INT, Data3:INT , Number:INT
End Type
.....
If keyhit(2) 
     numlist=numlist+1
     dat.dataobj = new dataobj
     dat.Number=numlist
ElseIf keyhit(3) then
     numlist=numlist-1
     For dat.dataobj = Each dataobj
          If dat.Number=p
               delete dat
               Exit
          Endif
     Next
endifhere is a sample to kill all instances, when Data1 is smaller than 5: Type DataObj
     Field Data1:INT, Data2:INT, Data3:INT
End Type
.....
If keyhit(2) 
     numlist=numlist+1
     dat.dataobj = new dataobj
ElseIf keyhit(3) then
     numlist=numlist-1
     For dat.dataobj = Each dataobj
          If dat.Data1<5
               delete dat
          Endif
     Next
endifMy last sample is to kill instances which you don not need any more. Anywhere in your code you can "mark" them and later they will be killed together. Before you can do this, you need a flag "KillMe" which you can set to kill the instance later. So add another field "KillMe" to the type. 
Type DataObj
     Field Data1:INT, Data2:INT, Data3:INT , KillMe:INT
End Type
.....
If keyhit(2) 
     numlist=numlist+1
     dat.dataobj = new dataobj
ElseIf keyhit(3) then
     numlist=numlist-1
     For dat.dataobj = Each dataobj
          If dat.KillMe=TRUE
               delete dat
          Endif
     Next
endif | 
| 
 | ||
| This is another reason why I stash my ojects inside an array, no offense RemiD! ;) To make this more valid, it gives me a way of indexing them by number. | 
| 
 | ||
| Use a cursor to point an object of your type then use the After/Before/First/Last to iterate When you're on the good one use Delete on the pointer. (in this sample, you 'll be able to move the cursor with left and right arrows) 
LoadFileData("datafile.dat")
Local curData.DataObj
While Not KeyDown( 1 ) 
	Cls
	If KeyHit(2)
		curData = New dataobj
	EndIf
	
	If KeyHit(3)
		If CurData=Null Then CurData = Last DataObj
		If CurData<>Null Then Delete CurData
		CurData = Last DataObj
	EndIf
	
	; Right arrow -> select next dataobj (or first)
	If KeyHit(205)
		If CurData = Null
			CurData = First DataObj
		Else
			CurData = After CurData
			; keep curdata on last object if no next data exists
			If CurData = Null Then CurData = Last DataObj
		EndIf
	EndIf
	
	; Left arrow -> select previous dataobj (or last)
	If KeyHit(203)
		If CurData = Null
			CurData = Last DataObj
		Else
			CurData = Before CurData
			; keep curdata on first object if no previous data exists
			If CurData = Null Then CurData = First DataObj
		EndIf
	EndIf
	
	If KeyHit(4) Then SaveFileData("datafile.dat")
	
	Flip
Wend
ClearWorld
EndGraphics
End
 | 
| 
 | ||
| @Bobbysait :: Please correct your "/code]" Thank You ~GF | 
| 
 | ||
| Ah, did not know, tha Blitz3D already knows "first", "last", "before" and "after" |