adding/taking info from types
BlitzMax Forums/BlitzMax Programming/adding/taking info from types
| ||
| I'm kicking myself for this but I have been away from coding for awhile and just recently decided to try and write a very basic application for myself. I need have an app that adds a users name and email to a list box but I want to only show the name and when I click on the users name I can pull up info on the name and email address. I figured a type would work where I would just use: Type User Field Name Field Email End Type Problem is how do I link both fields together so name/email is linked together and then once I do that how do I pull the info from each selected field. |
| ||
| Name and email are linked together. They are linked together as part of the type user. AUser.name and AUser.Email Method NameAndEmail:String() return Self.Name+Self.Email Endmethod If you mean how do you make a union, I dont think Bmax has those. |
| ||
| Just use a TMap (built-in) or another associative array (which you'll have to write yourself). |
| ||
| Or have a third field which contains both. Make sure you have a method called ChangeName() which sets name and the combo field, and another method called ChangeEmail() which sets the email and the combo field. |
| ||
| @Grey, Would you recomend that over just a method that returns both as if they were attached? |
| ||
| As the Duck says, a TMap is probably the best way to go here... For example:
' you have a list of Users...
Local usersList:User = new TList
' populated with name/emails
' ...
usersList.AddLast(User.Create("Albert", "mymail@..."))
' ...
Local names:TMap = new TMap
' add some name/user objects
For Local u:User = Eachin usersList
names.Insert(u.name, u)
Next
' retrieve a User for a given name :
Local thisUser:User = User(names.ValueForKey("Albert"))
' will be Null if name isn't in the map
.. you could lookup the names map by the Text value of the currently selected combox/list item, for example. HTH :o) |
| ||
| nice thanks I will try this, again sorry for the noobness its been awhile. After adding that code Brucey it errors on Global usersList:User = New TList (unable to convert from 'unknown' to user) now im sure its because im not doing something with userlist? or am I from what I understand userlist:user is telling it userlist = Users right? |
| ||
| Think it should be userslist:tlist=new tlist |
| ||
| see I thought that and changed it to userslist:tlist=new tlist the problem with that is now it spits an error out on User.Create saying that Create doesnt exist but isnt Create a Built in function |
| ||
| no, createisn't a build in function the only build in methods are new compare and delete. You have to implement the user type by yourself. |
| ||
| wow I always thought create was a built in function like Addlast |
| ||
| well, Addlast isn't a built in Function neither. These Functions (Addlast = method)are defined by Mark Sibly or whoever wrote the TList Module and so they are only belonging to the TList type. Maybe you should reread the Types section in the Bmax Help to clarify some of these things ;) . |
| ||
well I think i did it but I have a problem some where because its either A) not storing the info or I am not pulling the info from it correctly whats wrong...
Type User
Field Name
Field Email
Function Create(name$,email$)
Local names:TMap = New TMap
For Local u:User = EachIn usersList
names.Insert(u.name, u)
Next
End Function
Function Find:User(name:String)
For Local u:User = EachIn usersList
If u.Name = name Then
Return u
EndIf
Next
Return
End Function
End Type
Global usersList:TList = New TList
Case AddKeyButt ' user pressed button
AddGadgetItem(libListBox0,GadgetText(tfdTextField0))
usersList.AddLast(User.Create(GadgetText(tfdTextField0), Email))
This is what im using to Display the results
thisUser = User.Find(GadgetItemText(liblistbox0,SelectedGadgetItem(liblistbox0)))
SetGadgetText(ClickStats,thisUser)
|
| ||
| Maybe this could help. Uses 2 Tmaps and a list defined in the User Type Scope (nicely encapsulated) Basically creates 2 TMAPS. 1 to get name from a supplied email, another to get an Email address from a supplied name.
Type User
Global usersList:TList = New TList
Global Name2Email:Tmap = CreateMap()
Global Email2Name:Tmap = CreateMap()
Field Name:String
Field Email:String
Function Create(name$,email$)
Local newperson:User = New User
newperson.Name = name
newperson.email = email
ListAddLast user.userslist , newperson
MapInsert (user.Name2Email , newperson.Name , newperson ) ' < value is the USER
MapInsert (user.Email2Name , newperson.Email , newperson )
Print "added "+newperson.Name+" "+newperson.email
End Function
Function Getname:String(email:String)
this_User:Object = MapValueForKey(User.Email2Name , email)
If this_User
Return User(this_user).name
Else
Return "Could Not Find Name, Check your spelling and Caps"
EndIf
End Function
Function GetEmail:String(name:String)
this_User:Object = MapValueForKey(User.Name2Email , name)
If this_User
Return User(this_User).Email
Else
Return "Could Not Find EMAIL, Check your spelling and Caps"
EndIf
End Function
End Type
Function CreateUser(n$ , e$)
User.Create(n$ , e$)
End Function
Function GetUserEmail:String(nm$)
Return User.getEmail(nm$)
End Function
Function GetUserName:String(em$)
Return User.getName(em$)
End Function
Print "~n~n~nAdding Users"
CreateUser(\"John\",\"John@...")
CreateUser(\"Jim\",\"Jim@...")
CreateUser(\"Sue\",\"Sue@...")
Repeat
Print ; Print
mailQuery$ = Input$("Enter a name to get email address=>")
Print mailQuery$+" retrieved: "+GetUserEmail(mailQuery)
Print ; Print
nameQuery$ = Input$("Enter an email to get NAME=>")
Print nameQuery$+" retrieved: "+GetUserName(nameQuery)
Until AppTerminate()
|
| ||
| ...? |