Axaptapedia is now maintained by AgileCadence For more information please click here.

ClassBuild Class

From Axaptapedia
Jump to: navigation, search

ClassBuild class can be used to create a class and its methods.

Description[edit]

The class contains the following methods: <xpp> void new(str _name, boolean _allowExisting = true // this is the constructor of the class) void addMemberVariable(str _variableType, str _variableName) // this method is used to create a variable declaration in a class) TreeNode addMethod(str _name, str _source) // this method is used to create new methods and set their source code) void addSourceToMethod(str _memberFunction, str _addSource) // using this method we can set the source code of an existing method) ClassNode classNode() // this method returns a ClassNode object pointing to the created class) public MemberFunction getMethodImplementation(str _methodName, boolean _includeParents) // the method return a MemberFunction object, which has methods to edit or view the source code of the specified method of the class) public str name() // the method returns the name of the created class) TreeNode overrideMethod(str _name, str _newSource = ) // this method is used to override the method of the parent class in case one exists) </xpp>

Examples[edit]

Example with ClassBuild[edit]

<xpp> static void Job17(Args _args) {

   ClassBuild  classBuild;
   DictClass   dictClass;
   ;
   classBuild = new ClassBuild("TRN_ClassBuild", false);
   classBuild.addMethod("test",

@"void test() {

   ;
   print 'Hello';
   pause;

}");

   classBuild.addMemberVariable("\n    TreeNodeName", "testVar;");
   classBuild.addMethod("test2", 'void test2()\n{\n}');
   classBuild.addSourceToMethod("test2", @"
   ;
   testVar = 'TRN_ClassBuild';
   info('We created a Class ' + testVar + ' and can use its variables');
   TreeNode::findNode('Classes\\'+TestVar).AotNewWindow();");
   classBuild.classNode().AOTcompile();
   box::info(strFmt("Creating class %1 with 2 methods. Code of method test2:\n\n%2", classBuild.name(),
       classBuild.getMethodImplementation("test2", false).AOTgetSource()));
   dictClass = new DictClass(className2Id(classBuild.name()));
   dictClass.callObject('test2', dictClass.makeObject());

} </xpp>

Explanation[edit]

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.

Another way of creating a class[edit]

There is also another way of creating the same class - by using the UtilElements table: (code provided by AndyD from AxForum) <xpp>

   UtilIdElements  utilIdElements;
   TreeNode tn;
   ;
   utilIdElements.initValue();
   utilIdElements.Name = "newClass";
   utilIdElements.recordType = UtilElementType::Class;
   utilIdElements.insert();
   tn = xUtilIdElements::getNode(utilIdElements);
   tn.AOTcompile(1);
   tn.AOTsave();

</xpp>

Download and try it[edit]

Job17.xpo

See also[edit]

FormBuild сlass, DictClass сlass, SysDictClass сlass