Stepping through a TList manually

BlitzMax Forums/BlitzMax Programming/Stepping through a TList manually

Hi,

Is there a way I can step through a tlist manually outside a loop?

* I want to properly learn how this is done now for fast and efficient code.

* I would also like to insert an item before or after my current position in the list.

I know there are wrappers to emulate Blitz3D style ways of working but I want to embrace the max way of working for maximum efficiency. Thank you...

Stepping through list
Finding links
Link methods

BTW : Index / TLink will show the functions/methods available.

The following is an example of indexing a TLIST and casting the object:

pTImage = TImage(m_pTImageList.ValueAtIndex(m_iCurrentImage-1))

For handling lists of strings I use this method:

First, I create a TList:
Global mylist:TList=New TList

To add strings to the list:
mylist.AddLast "Apple"
mylist.AddLast "Banana"
mylist.AddLast "Pear"
etc..

Now I create a TLink and point it the the FIRST item in my list:
Global link:TLink=mylist.FirstLink()

From here, I can iterate through the list both forwards and backwards. (Note how I wrap around the list if I go past the start/end) ...

FORWARDS:
link=link.NextLink()
If link=Null link=mylist.FirstLink()

BACKWARDS:
link=link.PrevLink()
If link=Null link=mylist.LastLink()

If I want to find out the contents of the item in the list which 'link' is currently pointing at I do this:
text$=String(link.Value())


To insert an entry AFTER the one being pointed to by the TLink:
mylist.InsertAfterLink("Some new fruit",link)


To insert an entry BEFORE the one being pointed to by the TLink:
mylist.InsertBeforeLink("Some new fruit",link)




Putting it all together:
Strict

' Initialise a TList called mylist
' This is used to hold a list of strings
Global mylist:TList=New TList

' add some items to mylist
mylist.AddLast "Apple"
mylist.AddLast "Banana"
mylist.AddLast "Pear"
mylist.AddLast "Blackberry"
mylist.AddLast "Peach"
mylist.AddLast "Mango"

' Initialise a TLink called link
' Set it to point to the first item in mylist
Global link:TLink=mylist.FirstLink()

' store the string from the first item into selected$
Global selected$=String(link.Value())

' open a small graphic window
AppTitle = "Lists - Next/Previous example"
Graphics 400,300,0,30|SOFTSYNC
SetClsColor $aa,$aa,$aa


Repeat
	
	' if user presses ESCAPE break out of the loop
	If KeyHit(KEY_ESCAPE) Exit
	
	' if user presses DOWN ARROW move to next item in list
	If KeyHit(KEY_DOWN) 
		link=link.NextLink()
		If link=Null link=mylist.FirstLink()
		selected$=String(link.Value())
	EndIf
	
	' if user presses UP ARROW move to previous item in list
	If KeyHit(KEY_UP)
		link=link.PrevLink()
		If link=Null link=mylist.LastLink()
		selected$=String(link.Value())
	EndIf
	
	' If DEL pressed remove selected item
	' Now point to the first item in the remaining list
	' If the list is empty exit from the loop
	If KeyHit(KEY_DELETE)
		mylist.Remove selected$
		link=mylist.FirstLink()
		If link=Null Exit
		selected$=String(link.Value())
	EndIf

	' insert an entry AFTER the currently selected one
	If KeyHit(KEY_A)
		mylist.InsertAfterLink("Lemon "+Rand(100),link)
	EndIf
	
	' insert an entry BEFORE the currently selected one
	If KeyHit(KEY_B)
		mylist.InsertBeforeLink("Lemon"+Rand(100),link)
	EndIf

	' if user presses RETURN key show item selected
	If KeyHit(KEY_RETURN)
		Notify "Your choice is "+selected$
	EndIf
	
	' show list and highlight the 'selected' item
	Cls
	SetColor $88,$44,$00
	DrawText "UP/DOWN = select item",10,10
	DrawText "RETURN  = confirm selection",10,24
	DrawText "DEL     = Remove selected item",10,38
	DrawText "A       = Insert 'Lemon' AFTER selected item",10,52
	DrawText "B       = Insert 'Lemon' BEFORE selected item",10,66
	Local y=100
	For Local l$=EachIn mylist
		SetColor $22,$22,$22
		If l$=selected$	SetColor $ff,$ff,$ff
		DrawText l$,40,y
		y:+16
	Next

	Flip
	FlushMem
Forever

End


thank you jb, this had been very interresting and helpful to me :)

Many thanks for your kind help lads.