Attributes
BlitzMax Forums/BlitzMax Programming/Attributes
| ||
| Does blitzMAX supports attributes like those seen in c#? IE is there a way to tag classes and methods with information for other applications that will be using the module? Thanks! |
| ||
It supports metadata, which isn't the same thing but perhaps as close as you can get using builtin features (I might have got the syntax wrong here):Type Foo { FooAttr }
Field a { deprecated }
Field x { status="untested" }
End TypeYou can read metadata using the reflection module. It doesn't "do" anything unless you write code to seek out and act on it. Some people have written modules that can make use of it though, e.g. to mark methods for automated testing or profiling. |
| ||
| Wth are this {…} metadata.. first time i see it. Please. Down to earth explanation. Thnks ) |
| ||
| This is exactly what I'm looking for! @Hardcoal - Metadata allows you to provide information about types, fields, and methods that may be useful for other applications that use the module. For example - Say you have a module with a class with fields that are being populated by a GUI form. You have some fields that you want to be represented as checkboxes on a GUI form. When the user checks the box this field will be set to true and when its uncheck then to false. One approach is to do this manually. create a checkbox for each field check for events from the control, on the onchange event check to see if the box is checked or not and set the field in our class accordingly. By using metadata, the gui can use reflection to read all of the fields with specific metadata (ie { IsCheckBox = 1 }) and automatically create create the checkbox and handle the events(you code this once). Now our GUI app knows how to read the Metadata and what it should do based on what metadata each class, field, or method has. Whenever we tag a new field with { IsCheckBox = 1 } our form will automatically create a checkbox for that field. Does that make sense? |
| ||
| No. What is this witchcraft? Can you post a working example? |
| ||
| In this example everything is contained within the same file. Typically, you would have another application reading the metadata within a module. Just add a { CheckBox } metadata tag to one of the byte fields and it shows up on the form. The user can then change the value of the field by checking the box.
SuperStrict
Import maxgui.maxgui
Import maxgui.drivers
Local instance:Class = New Class
Local wnd:TGadget = CreateWindow("test", 100, 100, 300, 400, Null, WINDOW_TITLEBAR)
'Create checkboxes based on the metadata of our class
Local id:TTypeId = TTypeId.ForObject(instance)
Local y:Int = 5
For Local fld:TField = EachIn id.EnumFields()
If fld.MetaData() = "CheckBox=1"
Local but:TGadget = CreateButton(fld.Name(), 5, y, 200, 20, wnd, BUTTON_CHECKBOX)
but.context = fld
y:+20
EndIf
Next
Repeat
Select WaitEvent()
Case EVENT_GADGETACTION
Local e:Object = EventSource()
If TGadget(e)
Local g:TGadget = TGadget(e)
If ButtonState(g)
Local fld:TField = TField(g.context)
fld.SetInt(instance, 1)
Else
Local fld:TField = TField(g.context)
fld.SetInt(instance, 0)
End If
'Notify us of all "instance's" field values
Local str:String
For Local fld:TField = EachIn id.EnumFields()
str:+fld.Name() + " " + fld.GetInt(instance) + "~n"
Next
Notify str
End If
Case EVENT_WINDOWCLOSE
End
End Select
Forever
'To show checkbox and give the ability to automatically change a fields value just add the { CheckBox } metadata tag
Type Class
Field bit1:Byte { CheckBox }
Field bit2:Byte
Field bit3:Byte { CheckBox }
Field bit4:Byte
End Type
|
| ||
| Ok i just learnt new stuff. Gfk is right! One code sample worth 1000 explanations. |