Today I want to write about using the class ClassBuild.
A collegue of mine recently used this class for extending Axapta's IDE, so I decided you all should know about this class too.
OK, let's start with the declaration of the class:
It's simple, the class isn't extending any other class, a variable of type class ClassNode is declared together with a macro #aot - it contains pathes to all the objects in the AOT
X++:
public class ClassBuild
{
ClassNode classNode;
#aot
}
The class contains the following methods:
I will explain how the class should be used on a specific example: (click the image to enlarge)
Explanation:
In line 6 we create a new Object of class ClassBuild. Into the constructor we pass the name of the class we want to create and an optional paramter, which controls the execution of code in case the class already exists in the AOT.
After the execution of this line the class already exists.
After that we add a method test() to our class and set the source code for this method.
Then we add a member variable of our class, and will try using this variable in a second method we create - test2(). You can see that here I did this in 2 steps on purpose - to show the way you can use the method addSourceToMethod().
OK, now all the methods are created and we have to compile our class. For this we can use the method AotCompile() of class TreeNode, which we access through the method classNode of the created class.
Now, to see how 2 other methods work, we show a message dialog with the name of the class being created and the source code of one of the methods.
Then, just to show you the class works and is ready to be used, we can call one of its methods for execution.
For this, we use the class DictClass and its methods, but I will not discuss it in this post.
That's it. Try running the attached job and see how it works!
Attachment: Job17.xpo
There is also another way of creating the same class - by using the UtilElements table: (code provided by AndyD from AxForum)
UtilIdElements utilIdElements;
TreeNode tn;
;
utilIdElements.initValue();
utilIdElements.Name = "newClass";
utilIdElements.recordType = UtilElementType::Class;
utilIdElements.insert();
tn = xUtilIdElements::getNode(utilIdElements);
tn.AOTcompile(1);
tn.AOTsave();
See also: Classes\FormBuild, Classes\DictClass