Get data form the first and last objects in a list

BlitzMax Forums/BlitzMax Beginners Area/Get data form the first and last objects in a list

Longhair(Posted 2010) [#1]
Hi all,

I need to get data from the first and last instances in my list but cannot work it out???

I am very new to this oop coding and although some of it is starting to make sense to me I really am fairly clueless on the logic of how it all works, so sorry if this is obvious. I have been trying to find the answer for too long and need help :)

Here is an example of what I am trying to do using the Last() function. It’s for a text scroll and I need to read the X value to determine when to create the next character in the scroll.

SeedRnd MilliSecs() 
Type TText
   Field X:Int=100
   Field Y:Int=200
   
   Global List:TList

   Function Create() 
      Local New_Char:TText 
      New_Char = New TText
      New_Char.X:+Rnd(0,100)
      New_Char.Y:+Rnd(0,100)
      If List = False Then List = CreateList() 
      ListAddLast(List,New_Char) 
   EndFunction
EndType 

For Local c = 0 To 9 
   TText.Create()
Next 
 
If List = Null Then End
For Local Read:TText = EachIn TText.List 
   Print Read.X
Next

Local Latest_Char:Object = TText.List.Last() 
Print
Print Latest_Char.X 


The line: Latest_Char:Object = Ttext.List.Last() Compiles without error although it’s what I came up with after lots of trials and is probably wrong?

Running the code gives an - Identifier (X) not found - on the last Print statement

Any help is greatly appreciated


Yan(Posted 2010) [#2]
Strict
SeedRnd MilliSecs()
 
Type TText
	Global List:TList '= New TList ' Can create the global TList when defined
		
  Field X:Int=100
  Field Y:Int=200

  Function Create() 
     Local New_Char:TText
 
     New_Char = New TText
     New_Char.X:+Rnd(0,100)
     New_Char.Y:+Rnd(0,100)

     If List = Null Then List = CreateList() ' TText.List is an object not a variable so comparing to 'False' isn't valid 
     ListAddLast(List, New_Char) 
  EndFunction
EndType 

For Local c = 0 To 9 
   TText.Create()
Next 
 
If TText.List = Null Then End
For Local Read:TText = EachIn TText.List 
   Print Read.X
Next

'------------------------------ This ------------------------------
Local Latest_Char:Object = TText.List.Last() 
Print
Print TText(Latest_Char).X ' Cast the base object to a TText object

'----------------------------- Or This -----------------------------
'Local Latest_Char:TText = TText(TText.List.Last()) ' Cast the base object to a TText object
'Print
'Print Latest_Char.X



Longhair(Posted 2010) [#3]
Hey Yan, Thanks for your help and for the extra info.

Really appreciate that


Czar Flavius(Posted 2010) [#4]
If you want to go oop, you should use List.AddLast(New_Char)

You can also do this
Method New()
     List.AddLast(Self)
End Method


Now all of that type will be in the list, even if you were to use different Create functions. Put common startup code in new.

The second way Yan shows you is the prefered way. Create a local variable to hold a reference to it, and cast the Object that comes out of the list.

If the list contains only that type (or types that derive from it) you can do it as shown. However, if you have a list which contains multiple unrelated types, the local variable will be Null after attempting to cast. You can use that to find out if the object returned was indeed a TText, or something else.

Example, if you have a list which contains a mixture of TText and something else
Local textobject:TText = TText(List.Last())
If textobject
     'text object code
End If



Longhair(Posted 2010) [#5]
Hi Czar, thanks for the info it's a great help.

I can achieve what i want the old way but am determined to learn oop. It's slowly coming together..

Thanks again