<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8929482477382507970</id><updated>2011-09-16T17:30:08.054+03:00</updated><category term='unpackDesign()'/><category term='DEV_QueryBrowser'/><category term='EnableWindow'/><category term='Attractor'/><category term='SysTableBrowser'/><category term='packDesign()'/><category term='newsgroup'/><category term='enabled()'/><category term='stereogram'/><category term='Cross-reference'/><category term='SysUsersSendMessage'/><category term='TreeControl'/><category term='Infolog'/><category term='Scrolling'/><category term='SysListSelect'/><category term='tutorial_Form_Capture'/><category term='Axaptapedia'/><category term='QueryBrowser'/><category term='Logistic'/><title type='text'>Ruslan Goncharov Dynamics AX Development</title><subtitle type='html'>Useful Dynamics AX tips &amp; tricks</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://rusgon.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8929482477382507970/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://rusgon.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Ruslan Goncharov</name><uri>http://www.blogger.com/profile/16144278259112759869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://bp1.blogger.com/_2cRBcMvuiG4/R2eKi4QRYDI/AAAAAAAAAAM/X5f025zSGhQ/S220/ruslan.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>20</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8929482477382507970.post-9146719871889598948</id><published>2009-11-20T17:05:00.031+02:00</published><updated>2009-11-22T08:02:01.011+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SysTableBrowser'/><category scheme='http://www.blogger.com/atom/ns#' term='TreeControl'/><category scheme='http://www.blogger.com/atom/ns#' term='DEV_QueryBrowser'/><title type='text'>SysTableBrowser instant field navigator</title><content type='html'>&lt;p&gt;Without any doubt AX SysTableBrowser is very useful tool which helps to watch on content of exploring table.
Unfortunately as for me there is one essential fault. 
When table contains large number of fields using SysTableBrowser sometimes it's hard to find out &lt;br /&gt;
&lt;b&gt;a.&lt;/b&gt; which column corresponds to particular field; and&lt;br /&gt;
&lt;b&gt;b.&lt;/b&gt; using horizontal scroll bar it's difficult to "catch up" needed field. 
&lt;br /&gt;&lt;p&gt;I must confess that using of scroll bar is inconvenient very match in case when table has a dozen and more fields.

&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_2cRBcMvuiG4/Swax3ZgzuqI/AAAAAAAAAWk/1PBA9eNJ1sk/s1600/Example+1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 206px;" src="http://1.bp.blogspot.com/_2cRBcMvuiG4/Swax3ZgzuqI/AAAAAAAAAWk/1PBA9eNJ1sk/s320/Example+1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5406203968004274850" /&gt;&lt;/a&gt;

&lt;p&gt;&lt;i&gt;Figure 1&lt;/i&gt; demonstrates lack of information of column's headers (checkbox fields).&lt;br /&gt;&lt;p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_2cRBcMvuiG4/Swax36WMqdI/AAAAAAAAAW0/KlTim5HWDoY/s1600/Example+3.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 309px;" src="http://4.bp.blogspot.com/_2cRBcMvuiG4/Swax36WMqdI/AAAAAAAAAW0/KlTim5HWDoY/s320/Example+3.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5406203976818141650" /&gt;&lt;/a&gt;
&lt;p&gt;&lt;i&gt;Figure 2&lt;/i&gt; illustrates disambiguation between fields RemainSalesPhysical and RemainSalesFinancial (SalesLine Table).

&lt;p&gt;The simpliest way to reach needed field is Tab button. Pressing Tab user may find needed field at the end.
But if there is necessity to find another one field user has to repeat Tab-pressing another one time. 
And another one time. And another one time...

&lt;p&gt;Take a look at &lt;a href="http://www.axaptapedia.com/AOT"&gt;Axapta Object Tree&lt;/a&gt; (AOT) especially at \Data Dictionary\Tables\Table\Fields node.
It's easy to watch on full range of fields and move from one field to another, isn't it?

&lt;p&gt;Let's combine SysTableBrowser and Table\Fields node into one window.

&lt;p&gt;SysTableBrowser tool this is a conjunction of SysTableBrowser Class and SysTableBrowser Form. I decided not to touch SysTableBrowser Class
and following modification this is a modification of SysTableBrowser Form only.

&lt;p&gt;&lt;b&gt;1.&lt;/b&gt; Open SysTableBrowser Form Design and add FormTreeControl TreeControl like this:&lt;br /&gt;&lt;p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_2cRBcMvuiG4/SwayBw9GZWI/AAAAAAAAAXM/grOavJZs_xM/s1600/SysTableBrowserForm.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 230px; height: 114px;" src="http://2.bp.blogspot.com/_2cRBcMvuiG4/SwayBw9GZWI/AAAAAAAAAXM/grOavJZs_xM/s320/SysTableBrowserForm.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5406204146095646050" /&gt;&lt;/a&gt;

&lt;p&gt;Set Left Property to Right edge.&lt;br /&gt;
Set Height Property to Column height.
&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_2cRBcMvuiG4/Swa1u-EWIwI/AAAAAAAAAXc/J6WNAJkyQFE/s1600/FormTreeControl.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 271px; height: 301px;" src="http://2.bp.blogspot.com/_2cRBcMvuiG4/Swa1u-EWIwI/AAAAAAAAAXc/J6WNAJkyQFE/s320/FormTreeControl.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5406208221244695298" /&gt;&lt;/a&gt;

&lt;p&gt;&lt;b&gt;2.&lt;/b&gt; We need to create new fillTree() method:

&lt;pre class="code" style="HEIGHT: 275px;"&gt;&lt;span class="co1"&gt;// GRR fields navigator --&amp;gt;&lt;/span&gt;
&lt;span class="kw1"&gt;void&lt;/span&gt; fillTree&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;int&lt;/span&gt; _i;


&amp;nbsp; &amp;nbsp; FormDesign &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Ctrl &lt;span class="sy0"&gt;=&lt;/span&gt; element.&lt;span class="me1"&gt;design&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; FormControl &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; _buildCtrl;

&amp;nbsp; &amp;nbsp; FormControl &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; _formControl;
&amp;nbsp; &amp;nbsp; TreeItemIdx &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; treeItemIdx;

&amp;nbsp; &amp;nbsp; ImageListAppl_Aot &amp;nbsp; &amp;nbsp; &amp;nbsp; ImageListAppl_Aot;
&amp;nbsp; &amp;nbsp; FormTreeItem &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;item;

&amp;nbsp; &amp;nbsp; DictField &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dictField;

&amp;nbsp; &amp;nbsp; fieldId &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fieldId;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;int&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; i&lt;span class="sy0"&gt;,&lt;/span&gt;j;

&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;int&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fieldCnt;
&amp;nbsp; &amp;nbsp; #DictField
&amp;nbsp; &amp;nbsp; #resAppl

&amp;nbsp; &amp;nbsp; ImageRes findOverlayImage&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;Types _type&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ImageRes imageRes;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;switch&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;_type&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;case&lt;/span&gt; Types&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;STRING&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; Types&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;VARSTRING&lt;/span&gt; &lt;span class="sy0"&gt;:&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt; #ImageOverlayString;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;case&lt;/span&gt; Types&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;ENUM&lt;/span&gt;&lt;span class="sy0"&gt;:&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2
"&gt;return&lt;/span&gt; #ImageOverlayEnum;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;case&lt;/span&gt; Types&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="kw1"&gt;REAL&lt;/span&gt;&lt;span class="sy0"&gt;:&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt; #ImageOverlayReal;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;case&lt;/span&gt; Types&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="kw1"&gt;DATE&lt;/span&gt;&lt;span class="sy0"&gt;:&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt; #ImageOverlayDate;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;case&lt;/span&gt; Types&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;INTEGER&lt;/span&gt;&lt;span class="sy0"&gt;:&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt; #ImageOverlayInteger;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;case&lt;/span&gt; Types&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;DATETIME&lt;/span&gt;&lt;span class="sy0"&gt;:&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt; #ImageOverlayTime;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;case&lt;/span&gt; Types&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="kw1"&gt;CONTAINER&lt;/span&gt;&lt;span class="sy0"&gt;:&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt; #ImageOverlayContainer;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;default&lt;/span&gt;&lt;span class="sy0"&gt;:&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt; imageRes;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; ;&lt;/bp&gt;

&amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;// Find 'Grid' object --&amp;gt;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;for&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;_i&lt;span class="sy0"&gt;=&lt;/span&gt;&lt;span class="nu0"&gt;1&lt;/span&gt;; _i&lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt;Ctrl.&lt;span class="me1"&gt;controlCount&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;; _i&lt;span class="sy0"&gt;++&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; _buildCtrl &lt;span class="sy0"&gt;=&lt;/span&gt; Ctrl.&lt;span class="me1"&gt;controlNum&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;_i&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; _formControl &lt;span class="sy0"&gt;=&lt;/span&gt; element.&lt;span class="me1"&gt;control&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;_buildCtrl.&lt;span class="me1"&gt;id&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;/br&gt;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;_formControl.&lt;span class="me1"&gt;name&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="sy0"&gt;==&lt;/span&gt; &lt;span class="st0"&gt;'Grid'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; _formGridControl &lt;span class="sy0"&gt;=&lt;/span&gt; _formControl;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;// Find 'Grid' object &amp;lt;--&lt;/span&gt;

&amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;// Fill tree --&amp;gt;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;FormTreeControl.&lt;span class="me1"&gt;visible&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;dictTable&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ImageListAppl_Aot &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="kw2"&gt;new&lt;/span&gt; ImageListAppl_Aot&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; formTreeControl.&lt;span class="me1"&gt;setImagelist&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;ImageListAppl_Aot.&lt;span class="me1"&gt;imageList&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; formTreeControl.&lt;span class="me1"&gt;deleteAll&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fieldCnt &lt;span class="sy0"&gt;=&lt;/span&gt; dictTable.&lt;span class="me1"&gt;fieldCnt&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;for&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;i&lt;span class="sy0"&gt;=&lt;/span&gt;&lt;span class="nu0"&gt;1&lt;/span&gt;; i&lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt;fieldCnt; i&lt;span class="sy0"&gt;++&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fieldId &lt;span class="sy0"&gt;=&lt;/span&gt; dictTable.&lt;span class="me1"&gt;fieldCnt2Id&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;i&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dictField &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="kw2"&gt;new&lt;/span&gt; DictField&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;dictTable.&lt;span class="me1"&gt;id&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; fieldId&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;bitTest&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;dictField.&lt;span class="me1"&gt;flags&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; #DBF_STORE&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;for&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;j &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="nu0"&gt;1&lt;/span&gt;;j &lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt; dictField.&lt;span class="me1"&gt;arraySize&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;; j&lt;span class="sy0"&gt;++&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; treeItemIdx &lt;span class="sy0"&gt;=&lt;/span&gt; SysFormTreeControl&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;addTreeItem&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;formTreeControl&lt;span class="sy0"&gt;,&lt;/span&gt; dictField.&lt;span class="me1"&gt;name&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="kw2"&gt;null&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; imageListAppl_Aot.&lt;span class="me1"&gt;image&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;#ImageField&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SysFormTreeControl&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;setOverlayImage&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;formTreeControl&lt;span class="sy0"&gt;,&lt;/span&gt; treeItemIdx&lt;span class="sy0"&gt;,&lt;/span&gt; imageListAppl_Aot.&lt;span class="me1"&gt;image&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;findOverlayImage&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;dictField.&lt;span class="me1"&gt;baseType&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; itemIdxContainer &lt;span class="sy0"&gt;+=&lt;/span&gt; treeItemIdx;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SysFormTreeControl&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;expandTree&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;formTreeControl&lt;span class="sy0"&gt;,&lt;/span&gt; formTreeControl.&lt;span class="me1"&gt;getRoot&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;// Do predefined design width more wider&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; element.&lt;span class="me1"&gt;design&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;.&lt;span class="me1"&gt;width&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt; element.&lt;span class="me1"&gt;design&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;.&lt;span class="me1"&gt;widthValue&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;+&lt;/span&gt;FormTreeControl.&lt;span class="me1"&gt;widthValue&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;_formGridControl&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; _formGridControl.&lt;span class="me1"&gt;topMode&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;FormTop&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;TopEdge&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;// Fill tree &amp;lt;--&lt;/span&gt;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;&lt;b&gt;3.&lt;/b&gt; In run() method we'll run fillTree() method:
&lt;pre class="code" style="HEIGHT:"&gt;
&lt;span class="kw2"&gt;&lt;span class="kw1"&gt;void&lt;/span&gt; run&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;super&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; dictTable &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="kw2"&gt;new&lt;/span&gt; DictTable&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;tableId&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; this.&lt;span class="me1"&gt;parmSQLStmt&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'SELECT * FROM '&lt;/span&gt;&lt;span class="sy0"&gt;+&lt;/span&gt;&lt;span class="kw3"&gt;tableId2name&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;tableId&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;// GRR fields navigator --&amp;gt;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; this.&lt;span class="me1"&gt;fillTree&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;// GRR fields navigator &amp;lt;--&lt;/span&gt;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;b&gt;4.&lt;/b&gt; In ClassDeclaration we need declare two variables itemIdxContainer and _formGridControl:

&lt;pre class="code" style="HEIGHT:"&gt;&lt;span class="kw2"&gt;class&lt;/span&gt; FormRun &lt;span class="kw2"&gt;extends&lt;/span&gt; ObjectRun
&lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; TableId tableId;
&amp;nbsp; &amp;nbsp; source sqlcmd;
&amp;nbsp; &amp;nbsp; DictTable dictTable;

&amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;// GRR fields navigator --&amp;gt;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;Container&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; itemIdxContainer;
&amp;nbsp; &amp;nbsp; FormGridControl &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; _formGridControl;
&amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;// GRR fields navigator &amp;lt;--&lt;/span&gt;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;span class="kw2"&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;b&gt;5.&lt;/b&gt; Override mouseDblClick() method of FormTreeControl TreeControl. Now by mouse double click we may move from one field to another:

&lt;pre class="code" style="HEIGHT: 275px;"&gt;&lt;span class="co1"&gt;// GRR fields navigator --&amp;gt;&lt;/span&gt;
&lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="kw1"&gt;int&lt;/span&gt; mouseDblClick&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw1"&gt;int&lt;/span&gt; _x&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="kw1"&gt;int&lt;/span&gt; _y&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="kw1"&gt;int&lt;/span&gt; _button&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="kw1"&gt;boolean&lt;/span&gt; _Ctrl&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="kw1"&gt;boolean&lt;/span&gt; _Shift&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; TreeItemIdx &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; itemIdx;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;int&lt;/span&gt; ret;
&amp;nbsp; &amp;nbsp; ;

&amp;nbsp; &amp;nbsp; ret &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="kw2"&gt;super&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;_x&lt;span class="sy0"&gt;,&lt;/span&gt; _y&lt;span class="sy0"&gt;,&lt;/span&gt; _button&lt;span class="sy0"&gt;,&lt;/span&gt; _Ctrl&lt;span class="sy0"&gt;,&lt;/span&gt; _Shift&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#91;&lt;/span&gt;itemIdx&lt;span class="br0"&gt;&amp;#93;&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; this.&lt;span class="me1"&gt;hitTest&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;_x&lt;span class="sy0"&gt;,&lt;/span&gt; _y&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;

&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;_formGridControl&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;itemIdx&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; _formGridControl.&lt;span class="me1"&gt;controlNum&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt; &lt;span class="kw3"&gt;conFind&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;itemIdxContainer&lt;span class="sy0"&gt;,&lt;/span&gt; itemIdx &lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;.&lt;span class="me1"&gt;setFocus&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;

&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt; ret;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&lt;span class="kw2"&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Now we may enjoy our extra functionality.
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_2cRBcMvuiG4/Swax4D9H1sI/AAAAAAAAAW8/BgGAWkm6IR8/s1600/Extra.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 159px;" src="http://4.bp.blogspot.com/_2cRBcMvuiG4/Swax4D9H1sI/AAAAAAAAAW8/BgGAWkm6IR8/s320/Extra.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5406203979397322434" /&gt;&lt;/a&gt;

If we want to hide this functionality just set FormTreeControl &lt;b&gt;Visible&lt;/b&gt; Property to &lt;b&gt;No&lt;/b&gt;.
&lt;p&gt;I'd like to notice that navigating tree would be very useful for another tool &lt;a href="http://www.axaptapedia.com/DEV_QueryBrowser"&gt;QueryBrowser&lt;/a&gt; which usually deals with huge number of fields.
&lt;p&gt;Who interested in another modificated SysTableBrowser take a look at Kashperuk's &lt;a href="http://www.axaptapedia.com/DEV_SysTableBrowser"&gt;DEV SysTableBrowser&lt;/a&gt; 

&lt;pre class="foot"&gt;Copyright © 2009 Ruslan Goncharov&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8929482477382507970-9146719871889598948?l=rusgon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rusgon.blogspot.com/feeds/9146719871889598948/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8929482477382507970&amp;postID=9146719871889598948' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8929482477382507970/posts/default/9146719871889598948'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8929482477382507970/posts/default/9146719871889598948'/><link rel='alternate' type='text/html' href='http://rusgon.blogspot.com/2009/11/systablebrowser-instant-field-navigator.html' title='SysTableBrowser instant field navigator'/><author><name>Ruslan Goncharov</name><uri>http://www.blogger.com/profile/16144278259112759869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://bp1.blogger.com/_2cRBcMvuiG4/R2eKi4QRYDI/AAAAAAAAAAM/X5f025zSGhQ/S220/ruslan.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_2cRBcMvuiG4/Swax3ZgzuqI/AAAAAAAAAWk/1PBA9eNJ1sk/s72-c/Example+1.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8929482477382507970.post-4277893509176053989</id><published>2009-02-18T16:19:00.014+02:00</published><updated>2009-02-19T13:24:37.016+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Logistic'/><title type='text'>A few words about sorting codes</title><content type='html'>&lt;p&gt;In AX each item may be assigned by its own sort code. On the other hand each WMS location has its own sort code and there is a functionality for updating sort codes.
&lt;p&gt;Let's analyse how do they work together.
&lt;p&gt;Take a look at WMSAisle table which has following fields: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;inventLocationId &lt;/li&gt;&lt;li&gt;sortCode &lt;/li&gt;&lt;li&gt;sortDescending &lt;/li&gt;&lt;li&gt;aisleId &lt;/li&gt;&lt;li&gt;aisleNo &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;
A sample of WMSAisle table:

&lt;/p&gt;&lt;a href="http://1.bp.blogspot.com/_2cRBcMvuiG4/SZwacd_99zI/AAAAAAAAAE8/VYLPJDaZzwo/s1600-h/WMSAisle+table.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5304143537527191346" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 320px; CURSOR: hand; HEIGHT: 60px; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_2cRBcMvuiG4/SZwacd_99zI/AAAAAAAAAE8/VYLPJDaZzwo/s320/WMSAisle+table.JPG" border="0" /&gt;&lt;/a&gt;

&lt;p&gt;By the way combination inventLocationId and aisleId fields is unique (see \Data Dictionary\Tables\WMSAisle\Indexes\AisleIdx).

&lt;p&gt;Every time when we try to update WMSLocation sort codes (e.g. \Menus\Invent\Periodic\Locations\Sort codes)
&lt;a href="http://msdn.microsoft.com/en-us/library/aa621677(AX.10).aspx"&gt;updateSortCodes()&lt;/a&gt; method of WMSAisle table is invoking. The sort codes are updating in two steps:

&lt;p&gt;- initialSortCode seeking;
&lt;p&gt;- updating sort codes;

&lt;p&gt;&lt;strong&gt;Determining of initialSortCode&lt;/strong&gt;
&lt;p&gt;If WMSParameters.manualSortCode is true the initialSortCode is assigned by WMSAisle.sortCode. Else initialSortCode will be equal maximal value of WMSLocation.sortCode for all aisles less than current aisleNo.
&lt;p&gt;To understand how does it work suppose there is an inventLocation 00001 with several aisles (WMSAisle table)
&lt;/p&gt;&lt;pre class="code" style="HEIGHT: auto"&gt;
&lt;span class="kw2"&gt;inventLocationId        aisleId         aisleNo
    00001                   &lt;span class="nu0"&gt;1&lt;/span&gt;               &lt;span class="nu0"&gt;1&lt;/span&gt;
    00001                   &lt;span class="nu0"&gt;2&lt;/span&gt;               &lt;span class="nu0"&gt;2&lt;/span&gt;
    00001                   &lt;span class="nu0"&gt;3&lt;/span&gt;               &lt;span class="nu0"&gt;3&lt;/span&gt;
    00001                   &lt;span class="nu0"&gt;4&lt;/span&gt;               &lt;span class="nu0"&gt;4&lt;/span&gt;
    00001                   &lt;span class="nu0"&gt;5&lt;/span&gt;               &lt;span class="nu0"&gt;5&lt;/span&gt;
    00001                   &lt;span class="nu0"&gt;6&lt;/span&gt;               &lt;span class="nu0"&gt;6&lt;/span&gt;
    00001                   &lt;span class="nu0"&gt;7&lt;/span&gt;               &lt;span class="nu0"&gt;7&lt;/span&gt;
    00001                   &lt;span class="nu0"&gt;8&lt;/span&gt;               &lt;span class="nu0"&gt;8&lt;/span&gt;
    00001                   &lt;span class="nu0"&gt;9&lt;/span&gt;               &lt;span class="nu0"&gt;9&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;WMSLocation is filtered by inventLocationId = '00001'

&lt;p&gt;&lt;/p&gt;&lt;pre class="code" style="HEIGHT: 275px"&gt;
&lt;span class="kw2"&gt;inventLocationId        wmsLocationId           sortCode        aisleId
    00001                   &lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="sy0"&gt;-&lt;/span&gt;07&lt;span class="sy0"&gt;-&lt;/span&gt;&lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="sy0"&gt;-&lt;/span&gt;&lt;span class="nu0"&gt;1&lt;/span&gt;                &lt;span class="nu0"&gt;11&lt;/span&gt;              &lt;span class="nu0"&gt;1&lt;/span&gt;
    00001                   &lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="sy0"&gt;-&lt;/span&gt;07&lt;span class="sy0"&gt;-&lt;/span&gt;&lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="sy0"&gt;-&lt;/span&gt;&lt;span class="nu0"&gt;2&lt;/span&gt;                &lt;span class="nu0"&gt;12&lt;/span&gt;              &lt;span class="nu0"&gt;1&lt;/span&gt;
    00001                   &lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="sy0"&gt;-&lt;/span&gt;07&lt;span class="sy0"&gt;-&lt;/span&gt;&lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="sy0"&gt;-&lt;/span&gt;&lt;span class="nu0"&gt;3&lt;/span&gt;                &lt;span class="nu0"&gt;13&lt;/span&gt;              &lt;span class="nu0"&gt;1&lt;/span&gt;
………
    00001                   &lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="sy0"&gt;-&lt;/span&gt;07&lt;span class="sy0"&gt;-&lt;/span&gt;&lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="sy0"&gt;-&lt;/span&gt;&lt;span class="nu0"&gt;20&lt;/span&gt;               &lt;span class="nu0"&gt;30&lt;/span&gt;              &lt;span class="nu0"&gt;1&lt;/span&gt;

    00001                   &lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="sy0"&gt;-&lt;/span&gt;07&lt;span class="sy0"&gt;-&lt;/span&gt;&lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="sy0"&gt;-&lt;/span&gt;&lt;span class="nu0"&gt;21&lt;/span&gt;               &lt;span class="nu0"&gt;31&lt;/span&gt;              &lt;span class="nu0"&gt;2&lt;/span&gt;
    00001                   &lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="sy0"&gt;-&lt;/span&gt;07&lt;span class="sy0"&gt;-&lt;/span&gt;&lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="sy0"&gt;-&lt;/span&gt;&lt;span class="nu0"&gt;22&lt;/span&gt;               &lt;span class="nu0"&gt;32&lt;/span&gt;              &lt;span class="nu0"&gt;2&lt;/span&gt;
………
    00001                   &lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="sy0"&gt;-&lt;/span&gt;07&lt;span class="sy0"&gt;-&lt;/span&gt;&lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="sy0"&gt;-&lt;/span&gt;&lt;span class="nu0"&gt;32&lt;/span&gt;               &lt;span class="nu0"&gt;42&lt;/span&gt;              &lt;span class="nu0"&gt;2&lt;/span&gt;

    00001                   &lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="sy0"&gt;-&lt;/span&gt;07&lt;span class="sy0"&gt;-&lt;/span&gt;&lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="sy0"&gt;-&lt;/span&gt;&lt;span class="nu0"&gt;33&lt;/span&gt;               &lt;span class="nu0"&gt;43&lt;/span&gt;              &lt;span class="nu0"&gt;3&lt;/span&gt;
    00001                   &lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="sy0"&gt;-&lt;/span&gt;07&lt;span class="sy0"&gt;-&lt;/span&gt;&lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="sy0"&gt;-&lt;/span&gt;&lt;span class="nu0"&gt;34&lt;/span&gt;               &lt;span class="nu0"&gt;44&lt;/span&gt;              &lt;span class="nu0"&gt;3&lt;/span&gt;
………
    00001                   &lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="sy0"&gt;-&lt;/span&gt;07&lt;span class="sy0"&gt;-&lt;/span&gt;&lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="sy0"&gt;-&lt;/span&gt;&lt;span class="nu0"&gt;39&lt;/span&gt;               &lt;span class="nu0"&gt;49&lt;/span&gt;              &lt;span class="nu0"&gt;3&lt;/span&gt;

………

    00001                   &lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="sy0"&gt;-&lt;/span&gt;07&lt;span class="sy0"&gt;-&lt;/span&gt;&lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="sy0"&gt;-&lt;/span&gt;&lt;span class="nu0"&gt;91&lt;/span&gt;               &lt;span class="nu0"&gt;101&lt;/span&gt;             &lt;span class="nu0"&gt;9&lt;/span&gt;
    00001                   &lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="sy0"&gt;-&lt;/span&gt;07&lt;span class="sy0"&gt;-&lt;/span&gt;&lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="sy0"&gt;-&lt;/span&gt;&lt;span class="nu0"&gt;92&lt;/span&gt;               &lt;span class="nu0"&gt;102&lt;/span&gt;             &lt;span class="nu0"&gt;9&lt;/span&gt;
………
    00001                   &lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="sy0"&gt;-&lt;/span&gt;07&lt;span class="sy0"&gt;-&lt;/span&gt;&lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="sy0"&gt;-&lt;/span&gt;&lt;span class="nu0"&gt;92&lt;/span&gt;               &lt;span class="nu0"&gt;112&lt;/span&gt;             &lt;span class="nu0"&gt;9&lt;/span&gt;
 &lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;We are trying to determine initialSortCode for aisleId = 3.
Aisles less 3 are 1 and 2. For these aisles (1 and 2) maximal sortCode is 42. Therefore in our example initialSortCode is 42.

&lt;p&gt;&lt;/p&gt;&lt;strong&gt;Updating sort codes&lt;/strong&gt;

&lt;p&gt;&lt;/p&gt;Updating sort codes is pretty easy and works according following algorithm:

&lt;p&gt;&lt;/p&gt;&lt;pre class="code" style="HEIGHT: auto"&gt;
&lt;span class="kw2"&gt;sortCode &lt;span class="sy0"&gt;=&lt;/span&gt; initialSortCode;
WMSLocation.&lt;span class="me1"&gt;sortCode&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; sortCode;
sortCode&lt;span class="sy0"&gt;++&lt;/span&gt;;
&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;i.e. each record updating aisle WMSLocation.sortCode is incrimenting by 1.

&lt;p&gt;If WMSAisle.sortDescending is true all the records before updating are arranged by descended rack, ascended level and ascended position.
&lt;p&gt;If WMSAisle.sortDescending is false records are arranged by ascended rack, ascended level and ascended position.

&lt;p&gt;It is useful to mention that records with WMSLocation.manualSortCode = true are excluded from initialSortCode
seeking and sort codes updating.

And now take a look at WMSOrderTrans table (reservation). At Tables\WMSPickingRoute\Methods\makePickingLine
&lt;a href="http://msdn.microsoft.com/en-us/library/aa656015(AX.10).aspx"&gt;WMSPickingRoute.makePickingLine&lt;/a&gt; method we may watch on followng lines:

&lt;p&gt;&lt;/p&gt;&lt;pre class="code" style="HEIGHT: auto"&gt;
&lt;span class="kw2"&gt;    &lt;span class="kw4"&gt;select&lt;/span&gt; &lt;span class="kw4"&gt;firstonly&lt;/span&gt; &lt;span class="kw4"&gt;forupdate&lt;/span&gt; WMSOrderTransCopy
        &lt;span class="kw4"&gt;index hint&lt;/span&gt; RouteIdx
        &lt;span class="kw4"&gt;where&lt;/span&gt; WMSOrderTransCopy.&lt;span class="me1"&gt;routeId&lt;/span&gt;         &lt;span class="sy0"&gt;==&lt;/span&gt; WMSOrderTrans.&lt;span class="me1"&gt;routeId&lt;/span&gt;    &lt;span class="sy0"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
              WMSOrderTransCopy.&lt;span class="me1"&gt;fullPallet&lt;/span&gt;      &lt;span class="sy0"&gt;==&lt;/span&gt; NoYes&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;No&lt;/span&gt;                &lt;span class="sy0"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
              WMSOrderTransCopy.&lt;span class="me1"&gt;recId&lt;/span&gt;           &lt;span class="sy0"&gt;==&lt;/span&gt; WMSOrderTrans.&lt;span class="me1"&gt;recId&lt;/span&gt;;

    WMSOrderTransCopy.&lt;span class="me1"&gt;routeId&lt;/span&gt;                   &lt;span class="sy0"&gt;=&lt;/span&gt; this.&lt;span class="me1"&gt;pickingRouteID&lt;/span&gt;;
    WMSOrderTransCopy.&lt;span class="me1"&gt;sortCode&lt;/span&gt;                  &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;WMSLocation&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="sy0"&gt;?&lt;/span&gt; WMSLocation.&lt;span class="me1"&gt;sortCode&lt;/span&gt; &lt;span class="sy0"&gt;:&lt;/span&gt;

WMSOrderTrans.&lt;span class="me1"&gt;WMSLocation&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;.&lt;span class="me1"&gt;sortCode&lt;/span&gt;;
    WMSOrderTransCopy.&lt;span class="me1"&gt;itemSortCode&lt;/span&gt;              &lt;span class="sy0"&gt;=&lt;/span&gt; inventTable.&lt;span class="me1"&gt;sortCode&lt;/span&gt;;
    WMSOrderTransCopy.&lt;span class="me1"&gt;volume&lt;/span&gt;                    &lt;span class="sy0"&gt;=&lt;/span&gt; WMSOrderTrans.&lt;span class="me1"&gt;qty&lt;/span&gt; &lt;span class="sy0"&gt;*&lt;/span&gt; inventTable.&lt;span class="me1"&gt;grossVolume&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;
    WMSOrderTransCopy.&lt;span class="me1"&gt;expectedExpeditionTime&lt;/span&gt;    &lt;span class="sy0"&gt;=&lt;/span&gt; expectedPickTime;
    WMSOrderTransCopy.&lt;span class="me1"&gt;fullPallet&lt;/span&gt;                &lt;span class="sy0"&gt;=&lt;/span&gt; NoYes&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;No&lt;/span&gt;;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Here WMSLocation.sortCode and inventTable.sortCode are stored. And the result of sorting codes we may watch in WMSPickForm form where records are arranged by itemSortCode and sortCode.

&lt;p&gt;&lt;/p&gt;&lt;pre class="code" style="HEIGHT: auto"&gt;
&lt;span class="kw2"&gt;    queryBuildDataSource&lt;span class="sy0"&gt;.&lt;/span&gt;addSortField&lt;span class="br0"&gt;(&lt;/span&gt;fieldNum&lt;span class="br0"&gt;(&lt;/span&gt;WMSOrderTrans&lt;span class="sy0"&gt;,&lt;/span&gt; routeId&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
    queryBuildDataSource&lt;span class="sy0"&gt;.&lt;/span&gt;addSortField&lt;span class="br0"&gt;(&lt;/span&gt;fieldNum&lt;span class="br0"&gt;(&lt;/span&gt;WMSOrderTrans&lt;span class="sy0"&gt;,&lt;/span&gt; itemSortCode&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
    queryBuildDataSource&lt;span class="sy0"&gt;.&lt;/span&gt;addSortField&lt;span class="br0"&gt;(&lt;/span&gt;fieldNum&lt;span class="br0"&gt;(&lt;/span&gt;WMSOrderTrans&lt;span class="sy0"&gt;,&lt;/span&gt; sortCode&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
    queryBuildDataSource&lt;span class="sy0"&gt;.&lt;/span&gt;addSortField&lt;span class="br0"&gt;(&lt;/span&gt;fieldNum&lt;span class="br0"&gt;(&lt;/span&gt;WMSOrderTrans&lt;span class="sy0"&gt;,&lt;/span&gt; itemId&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;
    queryBuildDataSource&lt;span class="sy0"&gt;.&lt;/span&gt;addSortField&lt;span class="br0"&gt;(&lt;/span&gt;fieldNum&lt;span class="br0"&gt;(&lt;/span&gt;WMSOrderTrans&lt;span class="sy0"&gt;,&lt;/span&gt; dataAreaId&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;\Forms\WMSPickForm\Data Sources\WMSOrderTrans\Methods\init()
&lt;p&gt;Therefore itemSortCode is more prevalent than Location sortCode as described in Logistic documentation.

&lt;pre class="foot"&gt;Copyright © 2009 Ruslan Goncharov&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8929482477382507970-4277893509176053989?l=rusgon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rusgon.blogspot.com/feeds/4277893509176053989/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8929482477382507970&amp;postID=4277893509176053989' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8929482477382507970/posts/default/4277893509176053989'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8929482477382507970/posts/default/4277893509176053989'/><link rel='alternate' type='text/html' href='http://rusgon.blogspot.com/2009/02/few-words-about-sorting-codes.html' title='A few words about sorting codes'/><author><name>Ruslan Goncharov</name><uri>http://www.blogger.com/profile/16144278259112759869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://bp1.blogger.com/_2cRBcMvuiG4/R2eKi4QRYDI/AAAAAAAAAAM/X5f025zSGhQ/S220/ruslan.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_2cRBcMvuiG4/SZwacd_99zI/AAAAAAAAAE8/VYLPJDaZzwo/s72-c/WMSAisle+table.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8929482477382507970.post-8002835116247306468</id><published>2008-08-27T13:26:00.007+03:00</published><updated>2008-09-04T10:10:05.522+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='packDesign()'/><category scheme='http://www.blogger.com/atom/ns#' term='unpackDesign()'/><title type='text'>Storing report design in database</title><content type='html'>&lt;p&gt;Today I'd like to say a few words about packDesign()/unpackDesign() methods. &lt;p&gt;As a matter of fact we may store report design just in database. All we need is new container field in table where report design is storing. &lt;p&gt;Following job demonstrates storing technique.
&lt;a href="http://2.bp.blogspot.com/_2cRBcMvuiG4/SLUsLgRYHsI/AAAAAAAAADw/rs1Fb-YDiwI/s1600-h/ReportDesign.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_2cRBcMvuiG4/SLUsLgRYHsI/AAAAAAAAADw/rs1Fb-YDiwI/s320/ReportDesign.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5239142317668441794" /&gt;&lt;/a&gt;
&lt;p&gt;When &lt;strong&gt;restore&lt;/strong&gt; is false - we store the design. Else design restoring.
&lt;p&gt;P.S. FieldReportDesign field should be Container.
&lt;pre class="code" style="HEIGHT: 275px;"&gt;
&lt;span class="kw2"&gt;static&lt;/span&gt; &lt;span class="kw1"&gt;void&lt;/span&gt; JobReportDesign&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;Args _args&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; Report &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;report &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="kw2"&gt;new&lt;/span&gt; Report&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; ReportRun &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; reportRun;

&amp;nbsp; &amp;nbsp; ReportDesign &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;reportDesign;
&amp;nbsp; &amp;nbsp; ReportSection &amp;nbsp; &amp;nbsp; &amp;nbsp; reportSection;
&amp;nbsp; &amp;nbsp; ReportTextControl &amp;nbsp; reportTextControl;

&amp;nbsp; &amp;nbsp; Table1 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Table1;
&lt;span class="co1"&gt;// &amp;nbsp; &amp;nbsp;boolean &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; restore = true;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;boolean&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; restore &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="kw2"&gt;false&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; BinData &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; binData;

&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;void&lt;/span&gt; runReport&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;ReportRun _reportRun&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ReportDesign &amp;nbsp; &amp;nbsp;_reportDesign &lt;span class="sy0"&gt;=&lt;/span&gt; _reportRun.&lt;span class="me1"&gt;report&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;.&lt;span class="me1"&gt;design&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;int&lt;/span&gt; sCount &amp;nbsp; &amp;nbsp;&lt;span class="sy0"&gt;=&lt;/span&gt; _reportDesign.&lt;span class="me1"&gt;sectionCount&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;int&lt;/span&gt; i;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;for&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;i&lt;span class="sy0"&gt;=&lt;/span&gt;&lt;span class="nu0"&gt;1&lt;/span&gt;; i&lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt;sCount; i&lt;span class="sy0"&gt;++&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; _reportDesign.&lt;span class="me1"&gt;section&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;i&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;.&lt;span class="me1"&gt;executeSection&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; ;

&amp;nbsp; &amp;nbsp; reportDesign &lt;span class="sy0"&gt;=&lt;/span&gt; report.&lt;span class="me1"&gt;addDesign&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; reportRun &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="kw2"&gt;new&lt;/span&gt; ReportRun&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;report&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;// ReStore the report --&amp;gt;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;restore&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;select&lt;/span&gt; Table1
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;where&lt;/span&gt; Table1.&lt;span class="me1"&gt;ItemId&lt;/span&gt; &lt;span class="sy0"&gt;==&lt;/span&gt; &lt;span class="st0"&gt;'000000000001'&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; reportRun.&lt;span class="me1"&gt;unpackDesign&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;Table1.&lt;span class="me1"&gt;FieldReportDesign&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; runReport&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;reportRun&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; report.&lt;span class="me1"&gt;interactive&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw2"&gt;false&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; reportRun.&lt;span class="me1"&gt;run&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;// ReStore the report &amp;lt;--&lt;/span&gt;

&amp;nbsp; &amp;nbsp; reportSection &lt;span class="sy0"&gt;=&lt;/span&gt; reportDesign.&lt;span class="me1"&gt;addProgrammableSection&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; reportTextControl &lt;span class="sy0"&gt;=&lt;/span&gt; reportSection.&lt;span class="me1"&gt;addTextControl&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'Small'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; reportTextControl.&lt;span class="me1"&gt;width100mmInclBorder&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="nu0"&gt;20120&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; reportTextControl.&lt;span class="me1"&gt;fontSize&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="nu0"&gt;15&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; reportTextControl.&lt;span class="me1"&gt;bold&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="nu0"&gt;10&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; reportTextControl.&lt;span class="me1"&gt;alignment&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="nu0"&gt;3&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; reportSection.&lt;span class="me1"&gt;executeSection&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; reportSection &lt;span class="sy0"&gt;=&lt;/span&gt; reportDesign.&lt;span class="me1"&gt;addProgrammableSection&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; reportTextControl &lt;span class="sy0"&gt;=&lt;/span&gt; reportSection.&lt;span class="me1"&gt;addTextControl&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'report'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; reportTextControl.&lt;span class="me1"&gt;width100mmInclBorder&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="nu0"&gt;20120&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; reportTextControl.&lt;span class="me1"&gt;fontSize&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="nu0"&gt;15&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; reportTextControl.&lt;span class="me1"&gt;bold&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="nu0"&gt;10&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; reportTextControl.&lt;span class="me1"&gt;alignment&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="nu0"&gt;3&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; reportSection.&lt;span class="me1"&gt;executeSection&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; report.&lt;span class="me1"&gt;interactive&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw2"&gt;false&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;// Store the report --&amp;gt;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="sy0"&gt;!&lt;/span&gt;restore&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;ttsbegin&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;select&lt;/span&gt; &lt;span class="kw4"&gt;forupdate&lt;/span&gt; Table1
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;where&lt;/span&gt; Table1.&lt;span class="me1"&gt;ItemId&lt;/span&gt; &lt;span class="sy0"&gt;==&lt;/span&gt; &lt;span class="st0"&gt;'000000000001'&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Table1.&lt;span class="me1"&gt;FieldReportDesign&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; reportRun.&lt;span class="me1"&gt;packDesign&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Table1.&lt;span class="me1"&gt;update&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw4"&gt;ttscommit&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;// Store the report &amp;lt;--&lt;/span&gt;

&amp;nbsp; &amp;nbsp; reportRun.&lt;span class="me1"&gt;run&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;

&lt;pre class="foot"&gt;Copyright © 2008 Ruslan Goncharov&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8929482477382507970-8002835116247306468?l=rusgon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rusgon.blogspot.com/feeds/8002835116247306468/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8929482477382507970&amp;postID=8002835116247306468' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8929482477382507970/posts/default/8002835116247306468'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8929482477382507970/posts/default/8002835116247306468'/><link rel='alternate' type='text/html' href='http://rusgon.blogspot.com/2008/08/storing-report-design-in-database.html' title='Storing report design in database'/><author><name>Ruslan Goncharov</name><uri>http://www.blogger.com/profile/16144278259112759869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://bp1.blogger.com/_2cRBcMvuiG4/R2eKi4QRYDI/AAAAAAAAAAM/X5f025zSGhQ/S220/ruslan.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_2cRBcMvuiG4/SLUsLgRYHsI/AAAAAAAAADw/rs1Fb-YDiwI/s72-c/ReportDesign.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8929482477382507970.post-6609549175640554928</id><published>2008-07-31T16:44:00.016+03:00</published><updated>2008-08-27T13:32:39.471+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SysListSelect'/><title type='text'>SysListSelect</title><content type='html'>&lt;p&gt;In AX there is an easy tool for creating simple lists with following selection needed items called SysListSelect. In this form we may check/uncheck every item separately or whole list by clicking at Yes to All or No to All buttons.&lt;br /&gt; &lt;a href="http://bp2.blogger.com/_2cRBcMvuiG4/SJHC4dDWGnI/AAAAAAAAADI/CdnGwd7hXNY/s1600-h/SysListSelectForm.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_2cRBcMvuiG4/SJHC4dDWGnI/AAAAAAAAADI/CdnGwd7hXNY/s320/SysListSelectForm.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5229174917480979058" /&gt;&lt;/a&gt;&lt;br /&gt;
Some information about SysListSelect we may find in MSDN &lt;a href="http://msdn.microsoft.com/en-us/library/aa871164.aspx"&gt;SysListSelect class&lt;/a&gt;, but unfortunately description is very compact and it's hard even for experienced developer to understand how to fully use this tool. Following article is meant to fill this gap in knowledge.
&lt;p&gt;To call SysListSelect form we don't need write any code. In Global class there is corresponding wrapper selectMultiple() method:
&lt;pre class="code" style="HEIGHT: auto"&gt;&lt;span class="coMULTI"&gt;/*
Returns container with the status of how the form is closed plus the selected ids.
*/&lt;/span&gt;
&lt;span class="kw2"&gt;static&lt;/span&gt; &lt;span class="kw2"&gt;client&lt;/span&gt; &lt;span class="kw1"&gt;container&lt;/span&gt; selectMultiple&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; Caption &amp;nbsp; &amp;nbsp; caption&lt;span class="sy0"&gt;,&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;str&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; info&lt;span class="sy0"&gt;,&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;// An info text displayed in the top of the form&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;container&lt;/span&gt; &amp;nbsp; choices&lt;span class="sy0"&gt;,&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;container&lt;/span&gt; &amp;nbsp; headers &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="kw3"&gt;conNull&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;// If null, the list view is used&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;/pre&gt;
The first and second parameters are evident. There are form's caption and info respectively.
At first glance third parameter is obvious too:
choices container contains items we need to select. But be aware that each item consists from three fields:&lt;br /&gt;&lt;p&gt;
label - (string) in fact this is an item we are selecting&lt;br /&gt;
id - (integer) item's identifier&lt;br /&gt;
set - (boolean) determines default state of item (checked\unchecked)&lt;br /&gt;
&lt;p&gt;before passing choices into selectMultiple() we need to pack every item into container using sysListSelect::packChoice()
&lt;pre class="code" style="HEIGHT: auto"&gt;&lt;span class="kw2"&gt;static&lt;/span&gt; &lt;span class="kw1"&gt;container&lt;/span&gt; packChoice&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;str&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; label&lt;span class="sy0"&gt;,&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;int&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; id&lt;span class="sy0"&gt;,&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;boolean&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; set
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt; &lt;span class="br0"&gt;&amp;#91;&lt;/span&gt;label&lt;span class="sy0"&gt;,&lt;/span&gt;id&lt;span class="sy0"&gt;,&lt;/span&gt;set&lt;span class="br0"&gt;&amp;#93;&lt;/span&gt;;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;

Here we create our first row.
&lt;pre class="code" style="HEIGHT: auto"&gt;con&lt;span class="sy0"&gt;+=&lt;/span&gt;&lt;span class="br0"&gt;&amp;#91;&lt;/span&gt;sysListSelect&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;packChoice&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;label&lt;span class="sy0"&gt;,&lt;/span&gt; id&lt;span class="sy0"&gt;,&lt;/span&gt; set&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#93;&lt;/span&gt;;&lt;/pre&gt;

The fourth parameter headers is used to show headers. That means that we may visualise more than one column. But how to pass these columns?&lt;br /&gt;The answer is simple. If we need to pass some columns we just need to "divide" each label at columns by '\n' symbol:&lt;br /&gt;
&lt;p&gt;label = column1+'\n'+column2+'\n'+...+columnN&lt;br /&gt;
&lt;p&gt;Thats all. Now we are ready to launch SysListSelect form.
&lt;pre class="code" style="HEIGHT: auto"&gt;&lt;span class="kw2"&gt;static&lt;/span&gt; &lt;span class="kw1"&gt;void&lt;/span&gt; sysListSelectSampleJob&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;Args _args&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;container&lt;/span&gt; con;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;container&lt;/span&gt; ret;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;boolean&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ok;

&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;str&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; label;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;int&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; id;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;boolean&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; set;
&amp;nbsp; &amp;nbsp; ;

&amp;nbsp; &amp;nbsp; label &amp;nbsp; &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="st0"&gt;'label_11'&lt;/span&gt;&lt;span class="sy0"&gt;+&lt;/span&gt;&lt;span class="st0"&gt;'&lt;span class="es0"&gt;\n&lt;/span&gt;'&lt;/span&gt;&lt;span class="sy0"&gt;+&lt;/span&gt;&lt;span class="st0"&gt;'label_12'&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; id &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="nu0"&gt;1&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; set &amp;nbsp; &amp;nbsp; &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="kw2"&gt;false&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; con&lt;span class="sy0"&gt;+=&lt;/span&gt;&lt;span class="br0"&gt;&amp;#91;&lt;/span&gt;sysListSelect&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;packChoice&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;label&lt;span class="sy0"&gt;,&lt;/span&gt; id&lt;span class="sy0"&gt;,&lt;/span&gt; set&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#93;&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; label &amp;nbsp; &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="st0"&gt;'label_21'&lt;/span&gt;&lt;span class="sy0"&gt;+&lt;/span&gt;&lt;span class="st0"&gt;'&lt;span class="es0"&gt;\n&lt;/span&gt;'&lt;/span&gt;&lt;span class="sy0"&gt;+&lt;/span&gt;&lt;span class="st0"&gt;'label_22'&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; id &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="nu0"&gt;2&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; set &amp;nbsp; &amp;nbsp; &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="kw2"&gt;true&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; con&lt;span class="sy0"&gt;+=&lt;/span&gt;&lt;span class="br0"&gt;&amp;#91;&lt;/span&gt;sysListSelect&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;packChoice&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;label&lt;span class="sy0"&gt;,&lt;/span&gt; id&lt;span class="sy0"&gt;,&lt;/span&gt; set&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#93;&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#91;&lt;/span&gt;ok&lt;span class="sy0"&gt;,&lt;/span&gt; ret&lt;span class="br0"&gt;&amp;#93;&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; selectMultiple&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'Caption'&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt;&lt;span class="st0"&gt;'Info'&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; con&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="br0"&gt;&amp;#91;&lt;/span&gt;&lt;span class="st0"&gt;'First column'&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="st0"&gt;'Second column'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#93;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; conView&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;ret&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://bp3.blogger.com/_2cRBcMvuiG4/SJHEp_rlTDI/AAAAAAAAADQ/gWIfEu13cp0/s1600-h/SysListSelect2Columns.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_2cRBcMvuiG4/SJHEp_rlTDI/AAAAAAAAADQ/gWIfEu13cp0/s320/SysListSelect2Columns.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5229176868101770290" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;p&gt;I absolutely forgot to say that selectMultiple() returns container which first parameter is boolean (in our example this is ok) pointing whether was pressed OK button or not and container of selected id's.&lt;br /&gt;
&lt;br /&gt;&lt;a href="http://bp3.blogger.com/_2cRBcMvuiG4/SJHE75aB3nI/AAAAAAAAADY/SYopCvWJnpI/s1600-h/containerRet.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_2cRBcMvuiG4/SJHE75aB3nI/AAAAAAAAADY/SYopCvWJnpI/s320/containerRet.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5229177175655177842" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;Here we selected 2 elements.&lt;p&gt;And here we try to work with AX breakpoints (something similar with native SysBreakpoints form)&lt;pre class="code" style="HEIGHT: 275px;"&gt;&lt;span class="kw2"&gt;static&lt;/span&gt; &lt;span class="kw1"&gt;void&lt;/span&gt; sysListSelectBreakpointsJob&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;Args _args&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;container&lt;/span&gt; con;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;container&lt;/span&gt; ret;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;boolean&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ok;

&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;str&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; label;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;int&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; id;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;boolean&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; set;

&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;container&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; breakpoints;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;int&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; i&lt;span class="sy0"&gt;,&lt;/span&gt; bpLen;
&amp;nbsp; &amp;nbsp; ;

&amp;nbsp; &amp;nbsp; breakpoints &lt;span class="sy0"&gt;=&lt;/span&gt; infolog.&lt;span class="kw2"&gt;breakpoint&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; bpLen &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="kw3"&gt;conLen&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;breakpoints&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;for&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;i&lt;span class="sy0"&gt;=&lt;/span&gt;&lt;span class="nu0"&gt;2&lt;/span&gt;; i&lt;span class="sy0"&gt;&amp;lt;=&lt;/span&gt;bpLen; i&lt;span class="sy0"&gt;++&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;switch&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;i &lt;span class="kw2"&gt;mod&lt;/span&gt; &lt;span class="nu0"&gt;3&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;case&lt;/span&gt; &lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="sy0"&gt;:&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; label &amp;nbsp; &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="kw3"&gt;conpeek&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;breakpoints&lt;span class="sy0"&gt;,&lt;/span&gt; i&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;break&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;case&lt;/span&gt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="sy0"&gt;:&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; id &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="kw3"&gt;conpeek&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;breakpoints&lt;span class="sy0"&gt;,&lt;/span&gt; i&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;break&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;case&lt;/span&gt; &lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="sy0"&gt;:&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; set &amp;nbsp; &amp;nbsp; &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="kw3"&gt;conpeek&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;breakpoints&lt;span class="sy0"&gt;,&lt;/span&gt; i&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;break&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; con&lt;span class="sy0"&gt;+=&lt;/span&gt;&lt;span class="br0"&gt;&amp;#91;&lt;/span&gt;sysListSelect&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;packChoice&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;label&lt;span class="sy0"&gt;,&lt;/span&gt; id&lt;span class="sy0"&gt;,&lt;/span&gt; set&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#93;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#91;&lt;/span&gt;ok&lt;span class="sy0"&gt;,&lt;/span&gt; ret&lt;span class="br0"&gt;&amp;#93;&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; selectMultiple&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'Caption'&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt;&lt;span class="st0"&gt;'Breakpoints'&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; con&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="br0"&gt;&amp;#91;&lt;/span&gt;&lt;span class="st0"&gt;'Path'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#93;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&lt;span class="br0"&gt;&amp;#125;&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://bp2.blogger.com/_2cRBcMvuiG4/SJHFrj4Vl3I/AAAAAAAAADg/cTiUExKUJVg/s1600-h/SysListSelectBreakpoints.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_2cRBcMvuiG4/SJHFrj4Vl3I/AAAAAAAAADg/cTiUExKUJVg/s320/SysListSelectBreakpoints.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5229177994510440306" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;
I'd like to point at fact that using SysListSelect is very rare. I've found in AX it in one place only:
\Classes\SysDataImport\deleteTablesCheck (AX 3.0) so this tool is still waiting for developers :-)&lt;br /&gt;&lt;br /&gt;
I've discovered too that there is a small bug in \Classes\SysListSelect\selected() method.&lt;br /&gt;
When we launch the form from a wrapper and try to close form (not click at OK or Cancel) AX falls at endless loop(AX 3.0). The matter of fact in this case listView is destroyed already and impossible to get listView items correctly.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bp3.blogger.com/_2cRBcMvuiG4/SJHF-fMDnVI/AAAAAAAAADo/OhwJ13CuOq4/s1600-h/EndlessLoop.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_2cRBcMvuiG4/SJHF-fMDnVI/AAAAAAAAADo/OhwJ13CuOq4/s320/EndlessLoop.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5229178319668485458" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;
To avoid this I dropped a line into selected() method:&lt;br /&gt;
&lt;pre class="code" style="HEIGHT: auto"&gt;&lt;span class="kw1"&gt;container&lt;/span&gt; selected&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; Counter &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; i;
&amp;nbsp; &amp;nbsp; FormListItem &amp;nbsp; &amp;nbsp;item;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;container&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; selected;
&amp;nbsp; &amp;nbsp; ;

&amp;nbsp; &amp;nbsp; 
&amp;nbsp; &lt;span class="kw2"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;listView.&lt;span class="me1"&gt;getCount&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="co1"&gt;// added by GRR&lt;/span&gt;
&amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;for&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;i&lt;span class="sy0"&gt;=&lt;/span&gt;listView.&lt;span class="me1"&gt;getNextItem&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;FormListNext&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;ALL&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;; i&lt;span class="sy0"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="nu0"&gt;0&lt;/span&gt;; i&lt;span class="sy0"&gt;=&lt;/span&gt;listView.&lt;span class="me1"&gt;getNextItem&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;FormListNext&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;ALL&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt;i&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; item &lt;span class="sy0"&gt;=&lt;/span&gt; listView.&lt;span class="me1"&gt;getItem&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;i&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;item &lt;span class="sy0"&gt;&amp;amp;&amp;amp;&lt;/span&gt; item.&lt;span class="me1"&gt;image&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="sy0"&gt;==&lt;/span&gt; this.&lt;span class="me1"&gt;imageOn&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; selected &lt;span class="sy0"&gt;+=&lt;/span&gt; item.&lt;span class="me1"&gt;data&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt; selected;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;

&lt;pre class="foot"&gt;Copyright © 2008 Ruslan Goncharov&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8929482477382507970-6609549175640554928?l=rusgon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rusgon.blogspot.com/feeds/6609549175640554928/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8929482477382507970&amp;postID=6609549175640554928' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8929482477382507970/posts/default/6609549175640554928'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8929482477382507970/posts/default/6609549175640554928'/><link rel='alternate' type='text/html' href='http://rusgon.blogspot.com/2008/07/syslistselect.html' title='SysListSelect'/><author><name>Ruslan Goncharov</name><uri>http://www.blogger.com/profile/16144278259112759869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://bp1.blogger.com/_2cRBcMvuiG4/R2eKi4QRYDI/AAAAAAAAAAM/X5f025zSGhQ/S220/ruslan.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_2cRBcMvuiG4/SJHC4dDWGnI/AAAAAAAAADI/CdnGwd7hXNY/s72-c/SysListSelectForm.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8929482477382507970.post-8713563521130375114</id><published>2008-05-30T16:56:00.006+03:00</published><updated>2008-07-31T17:10:13.457+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='stereogram'/><title type='text'>Stereogram in AX</title><content type='html'>&lt;a href="http://4.bp.blogspot.com/_2cRBcMvuiG4/SEAHruvzRpI/AAAAAAAAACQ/tNxDmmfY29g/s1600-h/stereogram.bmp"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_2cRBcMvuiG4/SEAHruvzRpI/AAAAAAAAACQ/tNxDmmfY29g/s320/stereogram.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5206169617104586386" /&gt;&lt;/a&gt;
&lt;a href="http://1.bp.blogspot.com/_2cRBcMvuiG4/SEAHr-vzRqI/AAAAAAAAACY/r7d6gGT9PJc/s1600-h/pattern.bmp"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_2cRBcMvuiG4/SEAHr-vzRqI/AAAAAAAAACY/r7d6gGT9PJc/s320/pattern.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5206169621399553698" /&gt;&lt;/a&gt;
&lt;p&gt;Following job demonstrates &lt;a href="http://en.wikipedia.org/wiki/Random-dot_stereogram"&gt;random dot stereogram&lt;/a&gt; technique in AX.

&lt;pre class="code" style="height:275px;"&gt;&lt;span class="kw2"&gt;static&lt;/span&gt; &lt;span class="kw1"&gt;void&lt;/span&gt; RDStechniqueJob&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;Args _args&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; #define.&lt;span class="me1"&gt;image&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;&amp;quot;C:&lt;span class="es0"&gt;\\&lt;/span&gt;Images&lt;span class="es0"&gt;\\&lt;/span&gt;pattern.bmp&amp;quot;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; #define.&lt;span class="me1"&gt;imageSizeX&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="nu0"&gt;300&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="co1"&gt;// width*2&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; #define.&lt;span class="me1"&gt;imageSizeY&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="nu0"&gt;300&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="co1"&gt;// height&lt;/span&gt;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; #define.&lt;span class="me1"&gt;depth&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="nu0"&gt;5&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Form &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;form;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; FormRun &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; formRun;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; FormDesign &amp;nbsp; &amp;nbsp; &amp;nbsp;formDesign;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Args &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;args;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; FormBuildDesign formBuildDesign;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; FormBuildWindowControl formBuildWindowControl;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; FormWindowControl pane;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Image image &amp;nbsp; &amp;nbsp; &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="kw2"&gt;new&lt;/span&gt; Image&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Image pattern &amp;nbsp; &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="kw2"&gt;new&lt;/span&gt; Image&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;int&lt;/span&gt; &amp;nbsp; &amp;nbsp; _x&lt;span class="sy0"&gt;,&lt;/span&gt; _y;


&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;void&lt;/span&gt; Draw&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Random &amp;nbsp;rnd &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="kw2"&gt;new&lt;/span&gt; Random&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;int&lt;/span&gt; &amp;nbsp; &amp;nbsp; color;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;for&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;_x&lt;span class="sy0"&gt;=&lt;/span&gt;&lt;span class="nu0"&gt;0&lt;/span&gt;; _x&lt;span class="sy0"&gt;&amp;lt;&lt;/span&gt;#imageSizeX&lt;span class="sy0"&gt;/&lt;/span&gt;&lt;span class="nu0"&gt;2&lt;/span&gt;; _x&lt;span class="sy0"&gt;++&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;for&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;_y&lt;span class="sy0"&gt;=&lt;/span&gt;&lt;span class="nu0"&gt;0&lt;/span&gt;; _y&lt;span class="sy0"&gt;&amp;lt;&lt;/span&gt;#imageSizeY; _y&lt;span class="sy0"&gt;++&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; color &lt;span class="sy0"&gt;=&lt;/span&gt; rnd.&lt;span class="me1"&gt;nextInt&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;*&lt;/span&gt;0xFF;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; image.&lt;span class="me1"&gt;setPixel&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;_x&lt;span class="sy0"&gt;,&lt;/span&gt; _y&lt;span class="sy0"&gt;,&lt;/span&gt; color&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; image.&lt;span class="me1"&gt;setPixel&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;_x&lt;span class="sy0"&gt;+&lt;/span&gt;#imageSizeX&lt;span class="sy0"&gt;/&lt;/span&gt;&lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; _y&lt;span class="sy0"&gt;,&lt;/span&gt; color&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;void&lt;/span&gt; CreateStereogram&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;int&lt;/span&gt; &amp;nbsp; &amp;nbsp; color;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;int&lt;/span&gt; &amp;nbsp; &amp;nbsp; d;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pattern.&lt;span class="me1"&gt;loadImage&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;#image&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;for&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;_x&lt;span class="sy0"&gt;=&lt;/span&gt;&lt;span class="nu0"&gt;0&lt;/span&gt;; _x&lt;span class="sy0"&gt;&amp;lt;&lt;/span&gt;#imageSizeX&lt;span class="sy0"&gt;/&lt;/span&gt;&lt;span class="nu0"&gt;2&lt;/span&gt;; _x&lt;span class="sy0"&gt;++&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;for&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;_y&lt;span class="sy0"&gt;=&lt;/span&gt;&lt;span class="nu0"&gt;0&lt;/span&gt;; _y&lt;span class="sy0"&gt;&amp;lt;&lt;/span&gt;#imageSizeY; _y&lt;span class="sy0"&gt;++&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="sy0"&gt;!&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;pattern.&lt;span class="me1"&gt;getPixel&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;_x&lt;span class="sy0"&gt;,&lt;/span&gt; _y&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="kw2"&gt;mod&lt;/span&gt; &lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; color &lt;span class="sy0"&gt;=&lt;/span&gt; image.&lt;span class="me1"&gt;getPixel&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;_x&lt;span class="sy0"&gt;,&lt;/span&gt; _y&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; image.&lt;span class="me1"&gt;setPixel&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;_x&lt;span class="sy0"&gt;+&lt;/span&gt;#imageSizeX&lt;span class="sy0"&gt;/&lt;/span&gt;&lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="sy0"&gt;-&lt;/span&gt;#depth&lt;span class="sy0"&gt;,&lt;/span&gt; _y&lt;span class="sy0"&gt;,&lt;/span&gt; color&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; form &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="kw2"&gt;new&lt;/span&gt; Form&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; formBuildDesign &lt;span class="sy0"&gt;=&lt;/span&gt; form.&lt;span class="me1"&gt;addDesign&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'design'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; formBuildDesign.&lt;span class="me1"&gt;hideToolbar&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw2"&gt;true&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; formBuildDesign.&lt;span class="me1"&gt;columns&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; formBuildDesign.&lt;span class="me1"&gt;topMode&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;; &lt;span class="co1"&gt;// Auto&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; formBuildDesign.&lt;span class="me1"&gt;leftMode&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;; &lt;span class="co1"&gt;// Auto&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; formBuildDesign.&lt;span class="me1"&gt;widthMode&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;; &lt;span class="co1"&gt;// Auto&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; formBuildDesign.&lt;span class="me1"&gt;heightMode&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;; &lt;span class="co1"&gt;// Auto&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; formBuildDesign.&lt;span class="me1"&gt;width&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="nu0"&gt;1.1&lt;/span&gt;&lt;span class="sy0"&gt;*&lt;/span&gt;#imageSizeX&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; formBuildWindowControl &lt;span class="sy0"&gt;=&lt;/span&gt; formBuildDesign.&lt;span class="me1"&gt;addControl&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;FormControlType&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;IMAGE&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="st0"&gt;'pane'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; formBuildWindowControl.&lt;span class="me1"&gt;height&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;#imageSizeY&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; formBuildWindowControl.&lt;span class="me1"&gt;width&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;#imageSizeX&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; formBuildWindowControl.&lt;span class="me1"&gt;backgroundColor&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; args &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="kw2"&gt;new&lt;/span&gt; Args&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; args.&lt;span class="me1"&gt;object&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;form&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; formRun &lt;span class="sy0"&gt;=&lt;/span&gt; classFactory.&lt;span class="me1"&gt;formRunClass&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;args&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; formRun.&lt;span class="me1"&gt;init&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; formRun.&lt;span class="me1"&gt;resetSize&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; formDesign &lt;span class="sy0"&gt;=&lt;/span&gt; formRun.&lt;span class="me1"&gt;design&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; formRun.&lt;span class="me1"&gt;resetSize&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; formrun.&lt;span class="me1"&gt;formOnTop&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; formRun.&lt;span class="me1"&gt;run&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;


&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; formRun.&lt;span class="me1"&gt;design&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;.&lt;span class="me1"&gt;caption&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'Random-dot stereogram'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pane &lt;span class="sy0"&gt;=&lt;/span&gt; formRun.&lt;span class="me1"&gt;control&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;formBuildWindowControl.&lt;span class="me1"&gt;id&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; image.&lt;span class="me1"&gt;saveType&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;ImageSaveType&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;BMP_UNCOMP&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; image.&lt;span class="me1"&gt;createImage&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;#imageSizeX&lt;span class="sy0"&gt;,&lt;/span&gt; #imageSizeY&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="nu0"&gt;24&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Draw&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CreateStereogram&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pane.&lt;span class="me1"&gt;image&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;image&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; formRun.&lt;span class="me1"&gt;wait&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Notes:&lt;/strong&gt; &lt;br /&gt;
in this job &lt;br /&gt;

&lt;strong&gt;-&lt;/strong&gt; pattern.bmp should be monochrome.&lt;br /&gt;
&lt;strong&gt;-&lt;/strong&gt; imageSizeX should be twice more than width of bitmap file.&lt;br /&gt;
&lt;strong&gt;-&lt;/strong&gt; depth -- z-axis (depth).&lt;br /&gt;

&lt;pre class="foot"&gt;Copyright © 2008 Ruslan Goncharov&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8929482477382507970-8713563521130375114?l=rusgon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rusgon.blogspot.com/feeds/8713563521130375114/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8929482477382507970&amp;postID=8713563521130375114' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8929482477382507970/posts/default/8713563521130375114'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8929482477382507970/posts/default/8713563521130375114'/><link rel='alternate' type='text/html' href='http://rusgon.blogspot.com/2008/05/stereogram-in-ax.html' title='Stereogram in AX'/><author><name>Ruslan Goncharov</name><uri>http://www.blogger.com/profile/16144278259112759869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://bp1.blogger.com/_2cRBcMvuiG4/R2eKi4QRYDI/AAAAAAAAAAM/X5f025zSGhQ/S220/ruslan.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_2cRBcMvuiG4/SEAHruvzRpI/AAAAAAAAACQ/tNxDmmfY29g/s72-c/stereogram.bmp' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8929482477382507970.post-7454561764967160766</id><published>2008-05-23T18:00:00.004+03:00</published><updated>2008-07-31T17:10:34.537+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='newsgroup'/><title type='text'>From Microsoft Dynamics AX Programming newsgroup tricks</title><content type='html'>&lt;p&gt;&lt;a href="http://www.microsoft.com/Businesssolutions/Community/NewsGroups/dgbrowser/en-us/default.mspx?&amp;amp;lang=&amp;amp;cr=&amp;amp;guid=&amp;amp;sloc=en-us&amp;amp;dg=microsoft.public.axapta.programming&amp;amp;p=1&amp;amp;tid=6c9be28b-43db-4944-812d-5d4e8d241f33&amp;amp;mid=6c9be28b-43db-4944-812d-5d4e8d241f33"&gt;&lt;strong&gt;TreeNode Alternative for FormControls&lt;/strong&gt;&lt;/a&gt;

&lt;p&gt;I want to create a Control on a Form just like I would with a TreeNode in AX
3.0. But the TreeNode.AOTAdd doesn't work for FOrmControls. Is there an
Alternative how I can create a Control? These Fields should notbe temporary
like in the Tutorial_Form_AddControl. They should be in the AOT after being
created.

&lt;pre class="code" style="HEIGHT: auto"&gt;    TreeNode                formlist;
    Form                    formNode;

    FormBuildDesign         formDesign;

    ;

    formlist &lt;span class="sy0"&gt;=&lt;/span&gt; infolog.&lt;span class="me1"&gt;findNode&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="st0"&gt;'Forms'&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;
    formNode &lt;span class="sy0"&gt;=&lt;/span&gt; formlist.&lt;span class="me1"&gt;AOTfindChild&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="st0"&gt;'Form1'&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;

    formDesign &lt;span class="sy0"&gt;=&lt;/span&gt; formNode.&lt;span class="me1"&gt;design&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;
    formDesign.&lt;span class="me1"&gt;addControl&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;FormControlType&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;String&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="st0"&gt;'StringEdit'&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;
    formNode.&lt;span class="me1"&gt;save&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;
 &lt;/pre&gt;

&lt;p&gt;
&lt;a href="http://www.microsoft.com/Businesssolutions/Community/NewsGroups/dgbrowser/en-us/default.mspx?&amp;amp;lang=&amp;amp;cr=&amp;amp;guid=&amp;amp;sloc=en-us&amp;amp;dg=microsoft.public.axapta.programming&amp;amp;p=1&amp;amp;tid=46a9a8e3-391a-4b07-a0b2-8d81e67cfc1f&amp;amp;mid=46a9a8e3-391a-4b07-a0b2-8d81e67cfc1f"&gt;&lt;strong&gt;Saved form settings&lt;/strong&gt;&lt;/a&gt;

&lt;p&gt;When we import new objects, the user defined form settings are lost.
It's possible to prevent that from happening?

&lt;pre class="code" style="HEIGHT: auto"&gt;&lt;span class="kw2"&gt;static&lt;/span&gt; &lt;span class="kw1"&gt;void&lt;/span&gt; JobSettingsStoringAndRestoring&lt;span class="br0"&gt;(&lt;/span&gt;Args _args&lt;span class="br0"&gt;)&lt;/span&gt;
&lt;span class="br0"&gt;{&lt;/span&gt;
    syslastvalue    sysLastValue;
    &lt;span class="kw1"&gt;container&lt;/span&gt;       dataContainer;
    BinData         binData;

    &lt;span class="kw1"&gt;container&lt;/span&gt;       blobContainer;
    ContainerClass  containerClass;
    &lt;span class="kw1"&gt;str&lt;/span&gt;             settingsFileName &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="st0"&gt;"c:&lt;span class="es0"&gt;\\&lt;/span&gt;settings.txt"&lt;/span&gt;;
    ;

&lt;span class="co1"&gt;//  Store settings --&amp;gt;&lt;/span&gt;
    dataContainer &lt;span class="sy0"&gt;=&lt;/span&gt; xSysLastValue&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;getValue&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;
        &lt;span class="kw3"&gt;curExt&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="kw3"&gt;curUserId&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; UtilElementType&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;Usersetup&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="st0"&gt;'AddressCheck'&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="st0"&gt;'myDesign'&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;

    containerClass &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="kw2"&gt;new&lt;/span&gt; ContainerClass&lt;span class="br0"&gt;(&lt;/span&gt;dataContainer&lt;span class="br0"&gt;)&lt;/span&gt;;
    blobContainer &lt;span class="sy0"&gt;=&lt;/span&gt; containerClass.&lt;span class="me1"&gt;toBlob&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;

    binData &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="kw2"&gt;new&lt;/span&gt; BinData&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;
    binData.&lt;span class="me1"&gt;setData&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;blobContainer&lt;span class="br0"&gt;)&lt;/span&gt;;

    binData.&lt;span class="me1"&gt;saveFile&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;settingsFileName&lt;span class="br0"&gt;)&lt;/span&gt;;
&lt;span class="co1"&gt;//  Store settings &amp;lt;--&lt;/span&gt;

&lt;span class="co1"&gt;//  Restore settings --&amp;gt;&lt;/span&gt;
&lt;span class="coMULTI"&gt;/*    binData = new BinData();
    binData.loadFile(settingsFileName);

    dataContainer = containerClass::blob2Container(binData.getData());
    xSysLastValue::putValue(dataContainer,
        curExt(), curUserId(), UtilElementType::Usersetup, 'AddressCheck', 'myDesign');*/&lt;/span&gt;
&lt;span class="co1"&gt;//  Restore settings &amp;lt;--&lt;/span&gt;
&lt;span class="br0"&gt;}&lt;/span&gt;
&lt;/pre&gt;

&lt;pre class="foot"&gt;Copyright © 2008 Ruslan Goncharov&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8929482477382507970-7454561764967160766?l=rusgon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rusgon.blogspot.com/feeds/7454561764967160766/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8929482477382507970&amp;postID=7454561764967160766' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8929482477382507970/posts/default/7454561764967160766'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8929482477382507970/posts/default/7454561764967160766'/><link rel='alternate' type='text/html' href='http://rusgon.blogspot.com/2008/05/from-microsoft-dynamics-ax-programming.html' title='From Microsoft Dynamics AX Programming newsgroup tricks'/><author><name>Ruslan Goncharov</name><uri>http://www.blogger.com/profile/16144278259112759869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://bp1.blogger.com/_2cRBcMvuiG4/R2eKi4QRYDI/AAAAAAAAAAM/X5f025zSGhQ/S220/ruslan.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8929482477382507970.post-3592952249550715027</id><published>2008-04-18T16:47:00.009+03:00</published><updated>2008-07-31T17:11:23.099+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='EnableWindow'/><category scheme='http://www.blogger.com/atom/ns#' term='enabled()'/><title type='text'>Dynamic enabled() property for StringEdit and arrows</title><content type='html'>&lt;p&gt;Sometimes we need to enable or disable some field depending on value from another field.

&lt;p&gt;The first way is using Group object where FrameOptionButton property is set to Check. For details see \Forms\tutorial_Form_groupOption

&lt;p&gt;The second approach is setting enabled() property for StringEdit object.

&lt;pre class="code" style="HEIGHT: auto"&gt;&lt;span class="kw1"&gt;void&lt;/span&gt; enableControls&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; StringEdit_1.&lt;span class="me1"&gt;enabled&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;myTable.&lt;span class="me1"&gt;Field&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Unfortunately we may notice that the arrow object of StringEdit doesn't work properly. Sometimes the arrow is vanish away from control.

&lt;a href="http://4.bp.blogspot.com/_2cRBcMvuiG4/SAipDKU1k9I/AAAAAAAAABo/uv_fQ6MT_U8/s1600-h/Enabled_OK.JPG"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_2cRBcMvuiG4/SAipDKU1k9I/AAAAAAAAABo/uv_fQ6MT_U8/s320/Enabled_OK.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5190584442320950226" /&gt;&lt;/a&gt;

&lt;a href="http://3.bp.blogspot.com/_2cRBcMvuiG4/SAiqA6U1k-I/AAAAAAAAABw/2yp9KrVHbN0/s1600-h/Enabled_NO.JPG"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_2cRBcMvuiG4/SAiqA6U1k-I/AAAAAAAAABw/2yp9KrVHbN0/s320/Enabled_NO.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5190585503177872354" /&gt;&lt;/a&gt;

&lt;a href="http://3.bp.blogspot.com/_2cRBcMvuiG4/SAiqZ6U1k_I/AAAAAAAAAB4/MK-j8e8bs30/s1600-h/Disabled_OK.JPG"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_2cRBcMvuiG4/SAiqZ6U1k_I/AAAAAAAAAB4/MK-j8e8bs30/s320/Disabled_OK.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5190585932674601970" /&gt;&lt;/a&gt;

&lt;a href="http://1.bp.blogspot.com/_2cRBcMvuiG4/SAiqkaU1lAI/AAAAAAAAACA/4SgHLUpIX1s/s1600-h/Disabled_NO.JPG"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_2cRBcMvuiG4/SAiqkaU1lAI/AAAAAAAAACA/4SgHLUpIX1s/s320/Disabled_NO.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5190586113063228418" /&gt;&lt;/a&gt;

&lt;p&gt;The small modification should improve the arrow's behaviour. 
&lt;p&gt;In fact the arrow is the child window of StringEdit. The idea consists in managing state of parent and child window trough winApi. 

&lt;p&gt;All what we need to do is:

&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; Add new enableWindow() method in WinApi class:
&lt;pre class="code" style="HEIGHT: auto"&gt;&lt;span class="co1"&gt;// Created by GRR&lt;/span&gt;
&lt;span class="kw2"&gt;client&lt;/span&gt; &lt;span class="kw2"&gt;static&lt;/span&gt; &lt;span class="kw1"&gt;boolean&lt;/span&gt; enableWindow&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw1"&gt;int&lt;/span&gt; _handle&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="kw1"&gt;boolean&lt;/span&gt; _value&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; DLL &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; _DLL &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="kw2"&gt;new&lt;/span&gt; DLL&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'USER32'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; DLLFunction _enableWindow &amp;nbsp; &amp;nbsp;&lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="kw2"&gt;new&lt;/span&gt; DLLFunction&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;_DLL&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="st0"&gt;'EnableWindow'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; _enableWindow.&lt;span class="me1"&gt;returns&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;ExtTypes&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;DWord&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; _enableWindow.&lt;span class="me1"&gt;arg&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;ExtTypes&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;DWord&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; _enableWindow.&lt;span class="me1"&gt;arg&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;ExtTypes&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;DWord&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt; _enableWindow.&lt;span class="me1"&gt;call&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;_handle&lt;span class="sy0"&gt;,&lt;/span&gt; _value&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt; Rewrite our enableControls() method:

&lt;pre class="code" style="HEIGHT: auto"&gt;&lt;span class="kw1"&gt;void&lt;/span&gt; enableControls&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;void&lt;/span&gt; controlEnabled&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;FormControl control&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="kw1"&gt;boolean&lt;/span&gt; _value&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; #WinApi

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;int&lt;/span&gt; ctrlHwnd &amp;nbsp; &amp;nbsp;&lt;span class="sy0"&gt;=&lt;/span&gt; control.&lt;span class="me1"&gt;hWnd&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;int&lt;/span&gt; childHwnd &amp;nbsp; &lt;span class="sy0"&gt;=&lt;/span&gt; WinApi&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;getWindow&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;ctrlHwnd&lt;span class="sy0"&gt;,&lt;/span&gt; #GW_CHILD&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; WinApi&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;showWindow&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;ctrlHwnd&lt;span class="sy0"&gt;,&lt;/span&gt; #SW_SHOW&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; WinApi&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;showWindow&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;childHwnd&lt;span class="sy0"&gt;,&lt;/span&gt; #SW_SHOW&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; WinApi&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;enableWindow&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;ctrlHwnd&lt;span class="sy0"&gt;,&lt;/span&gt; &amp;nbsp;_value&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; WinApi&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;enableWindow&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;childHwnd&lt;span class="sy0"&gt;,&lt;/span&gt; _value&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; ;

&amp;nbsp; &amp;nbsp; controlEnabled&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;StringEdit_1&lt;span class="sy0"&gt;,&lt;/span&gt; &amp;nbsp; myTable.&lt;span class="me1"&gt;Field&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; controlEnabled&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;StringEdit_2&lt;span class="sy0"&gt;,&lt;/span&gt; &amp;nbsp; myTable.&lt;span class="me1"&gt;Field&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;AX 3.0 SP4

&lt;pre class="foot"&gt;Copyright © 2008 Ruslan Goncharov&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8929482477382507970-3592952249550715027?l=rusgon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rusgon.blogspot.com/feeds/3592952249550715027/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8929482477382507970&amp;postID=3592952249550715027' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8929482477382507970/posts/default/3592952249550715027'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8929482477382507970/posts/default/3592952249550715027'/><link rel='alternate' type='text/html' href='http://rusgon.blogspot.com/2008/04/dynamic-enabled-property-for-stringedit.html' title='Dynamic enabled() property for StringEdit and arrows'/><author><name>Ruslan Goncharov</name><uri>http://www.blogger.com/profile/16144278259112759869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://bp1.blogger.com/_2cRBcMvuiG4/R2eKi4QRYDI/AAAAAAAAAAM/X5f025zSGhQ/S220/ruslan.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_2cRBcMvuiG4/SAipDKU1k9I/AAAAAAAAABo/uv_fQ6MT_U8/s72-c/Enabled_OK.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8929482477382507970.post-3952187643553556788</id><published>2008-03-09T16:12:00.011+02:00</published><updated>2008-07-31T17:11:55.793+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scrolling'/><title type='text'>Scrolling in AX 3.0 without dll</title><content type='html'>&lt;a href="http://2.bp.blogspot.com/_2cRBcMvuiG4/R9Q-ZDGHboI/AAAAAAAAABg/lGAf4WDkwzI/s1600-h/Scrolling.JPG"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_2cRBcMvuiG4/R9Q-ZDGHboI/AAAAAAAAABg/lGAf4WDkwzI/s320/Scrolling.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5175830471804153474" /&gt;&lt;/a&gt;
&lt;p&gt;As is well known in AX 3.0 it's unable to scroll objects (first of all Groups etc.) in the form. This feature is present since AX4 and supported, as far as I know by axScroll.dll. &lt;p&gt;Honestly, I'm not a big worshipper of using side components. On the other hand I've been thinking about how to implement scrolling feature in AX3.

&lt;p&gt;About one year ago there was published very interesting project &lt;a href="http://www.trucosax.com/phpnuke/modules.php?name=Forums&amp;amp;file=viewtopic&amp;amp;t=711&amp;amp;NSNST_Flood=0454b2f62d9eb0e728396af50c380cd7"&gt;Capturando el WindowProc desde Axapta&lt;/a&gt; by Manekaze

&lt;p&gt;In this project the author showed a possibility to trap keyboard events using API in AX.
So why don't capture the scrollbar events.

&lt;p&gt;What we have to do:&lt;/br&gt;
1. &lt;strong&gt;Apply scrollable style for the window which we are going to scroll.&lt;/strong&gt;&lt;/br&gt;
2. &lt;strong&gt;Trap scroll events in AX.&lt;/strong&gt;&lt;/br&gt;
3. &lt;strong&gt;Scroll the window according scrollbar positions.&lt;/strong&gt;&lt;/br&gt;

&lt;p&gt;Let's go.

&lt;p&gt;&lt;strong&gt;- Apply scrollable style for the window which we are going to scroll&lt;/strong&gt;

&lt;p&gt;Setting scrollable style for the window is pretty easy:
&lt;pre class="code" style="HEIGHT: auto"&gt;WinApi::&lt;span class="me2"&gt;showScrollbar&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;handle, #SB_BOTH, &lt;span class="kw2"&gt;true&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;&lt;/pre&gt;

&lt;p&gt;By the way we need to set some parameters for vertical and horizontal scrollbars
&lt;pre class="code" style="HEIGHT: auto"&gt;&lt;span class="co1"&gt;//                            pos pSize  min max&lt;/span&gt;
    WinApi::&lt;span class="me2"&gt;setScrollInfo&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;handle, &lt;span class="nu0"&gt;0&lt;/span&gt;, &lt;span class="nu0"&gt;20&lt;/span&gt;,    &lt;span class="nu0"&gt;0&lt;/span&gt;, &lt;span class="nu0"&gt;100&lt;/span&gt;, &lt;span class="kw2"&gt;true&lt;/span&gt;, #SB_HORZ&lt;span class="br0"&gt;)&lt;/span&gt;;
    WinApi::&lt;span class="me2"&gt;setScrollInfo&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;handle, &lt;span class="nu0"&gt;0&lt;/span&gt;, &lt;span class="nu0"&gt;20&lt;/span&gt;,    &lt;span class="nu0"&gt;0&lt;/span&gt;, &lt;span class="nu0"&gt;100&lt;/span&gt;, &lt;span class="kw2"&gt;true&lt;/span&gt;, #SB_VERT&lt;span class="br0"&gt;)&lt;/span&gt;; &lt;/pre&gt;

and get back these parameters
&lt;pre class="code" style="HEIGHT: auto"&gt;   cScrollInfoH = WinApi::&lt;span class="me2"&gt;getScrollInfo&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;handle, #SB_HORZ&lt;span class="br0"&gt;)&lt;/span&gt;;
    xOffset      = &lt;span class="kw3"&gt;conpeek&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;cScrollInfoH, #pos&lt;span class="br0"&gt;)&lt;/span&gt;;
    xScroll      = &lt;span class="kw3"&gt;conpeek&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;cScrollInfoH, #maxValue&lt;span class="br0"&gt;)&lt;/span&gt;;
    xSize        = &lt;span class="kw3"&gt;conpeek&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;cScrollInfoH, #pageSize&lt;span class="br0"&gt;)&lt;/span&gt;;
   cScrollInfoV = WinApi::&lt;span class="me2"&gt;getScrollInfo&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;handle, #SB_VERT&lt;span class="br0"&gt;)&lt;/span&gt;;
    yOffset      = &lt;span class="kw3"&gt;conpeek&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;cScrollInfoV, #pos&lt;span class="br0"&gt;)&lt;/span&gt;;
    yScroll      = &lt;span class="kw3"&gt;conpeek&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;cScrollInfoV, #maxValue&lt;span class="br0"&gt;)&lt;/span&gt;;
    ySize        = &lt;span class="kw3"&gt;conpeek&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;cScrollInfoV, #pageSize&lt;span class="br0"&gt;)&lt;/span&gt;;
 &lt;/pre&gt;

In my case page size of each scrollbar is 20, minimum scrolling position is 0 and maximum scrolling position is 100.

&lt;p&gt;&lt;strong&gt;- Scroll the window according scrollbar positions&lt;/strong&gt;
&lt;p&gt;Here I don't like to reinvent something new and I used standard &lt;scroll.c&gt;library, which I've found &lt;a href="http://www.w3.org/LineMode/src/windows/scroll.c"&gt;here&lt;/a&gt; with small modifications

As a matter of fact we need only two methods:&lt;/br&gt;
int Scroll_SetVert(ScrollInfo_t* pScroll, HWND hWnd, WORD wScrollCmd, WORD wScrollPos)&lt;/br&gt;
int Scroll_SetHorz(ScrollInfo_t* pScroll, HWND hWnd, WORD wScrollCmd, WORD wScrollPos)&lt;/br&gt;

&lt;pre class="code" style="HEIGHT: 275px"&gt;&lt;span class="kw1"&gt;int&lt;/span&gt; Scroll_SetVert&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;ScrollInfo_t* pScroll, HWND hWnd, WORD wScrollCmd, WORD wScrollPos&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;int&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; nScrollAmt ;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;switch&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;wScrollCmd&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;case&lt;/span&gt; SB_TOP:
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; nScrollAmt = -pScroll-&amp;gt;yOffset ;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;break&lt;/span&gt; ;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;case&lt;/span&gt; SB_BOTTOM:
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; nScrollAmt = pScroll-&amp;gt;yScroll - pScroll-&amp;gt;yOffset ;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;break&lt;/span&gt; ;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;case&lt;/span&gt; SB_PAGEUP:
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; nScrollAmt = -pScroll-&amp;gt;ySize ;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;break&lt;/span&gt; ;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;case&lt;/span&gt; SB_PAGEDOWN:
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; nScrollAmt = pScroll-&amp;gt;ySize ;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;break&lt;/span&gt; ;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;case&lt;/span&gt; SB_LINEUP:
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; nScrollAmt = -pScroll-&amp;gt;yChar ;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;break&lt;/span&gt; ;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;case&lt;/span&gt; SB_LINEDOWN:
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; nScrollAmt = pScroll-&amp;gt;yChar ;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;break&lt;/span&gt; ;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;case&lt;/span&gt; SB_THUMBPOSITION:
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; nScrollAmt = wScrollPos - pScroll-&amp;gt;yOffset ;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;break&lt;/span&gt; ;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;default&lt;/span&gt;:
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt; &lt;span class="kw2"&gt;FALSE&lt;/span&gt; &lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; ;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;pScroll-&amp;gt;yOffset + nScrollAmt&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &amp;gt; pScroll-&amp;gt;yScroll&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; nScrollAmt = pScroll-&amp;gt;yScroll - pScroll-&amp;gt;yOffset ;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;pScroll-&amp;gt;yOffset + nScrollAmt&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &amp;lt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; nScrollAmt = -pScroll-&amp;gt;yOffset ;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ScrollWindow&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt; hWnd, &lt;span class="nu0"&gt;0&lt;/span&gt;, -nScrollAmt, &lt;span class="nu0"&gt;0&lt;/span&gt;, &lt;span class="nu0"&gt;0&lt;/span&gt; &lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; ;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pScroll-&amp;gt;yOffset = pScroll-&amp;gt;yOffset + nScrollAmt ;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SetScrollPos&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt; hWnd, SB_VERT, pScroll-&amp;gt;yOffset, &lt;span class="kw2"&gt;TRUE&lt;/span&gt; &lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; ;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt; &lt;span class="kw2"&gt;TRUE&lt;/span&gt; &lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; ;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt; &lt;span class="co1"&gt;// end of Scroll_SetVert()&lt;/span&gt;

&lt;span class="kw1"&gt;int&lt;/span&gt; Scroll_SetHorz&lt;span class="br0"&gt;(&lt;/span&gt;ScrollInfo_t* pScroll, HWND hWnd, WORD wScrollCmd, WORD wScrollPos&lt;span class="br0"&gt;)&lt;/span&gt;
        &lt;span class="br0"&gt;{&lt;/span&gt;
        &lt;span class="kw1"&gt;int&lt;/span&gt;               nScrollAmt ;

        &lt;span class="kw2"&gt;switch&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;wScrollCmd&lt;span class="br0"&gt;)&lt;/span&gt;
                &lt;span class="br0"&gt;{&lt;/span&gt;
                &lt;span class="kw2"&gt;case&lt;/span&gt; SB_TOP:
                        nScrollAmt = -pScroll-&amp;gt;xOffset ;
                        &lt;span class="kw2"&gt;break&lt;/span&gt; ;

                &lt;span class="kw2"&gt;case&lt;/span&gt; SB_BOTTOM:
                        nScrollAmt = pScroll-&amp;gt;xScroll - pScroll-&amp;gt;xOffset ;
                        &lt;span class="kw2"&gt;break&lt;/span&gt; ;

                &lt;span class="kw2"&gt;case&lt;/span&gt; SB_PAGEUP:
                        nScrollAmt = -pScroll-&amp;gt;xSize ;
                        &lt;span class="kw2"&gt;break&lt;/span&gt; ;

                &lt;span class="kw2"&gt;case&lt;/span&gt; SB_PAGEDOWN:
                        nScrollAmt = pScroll-&amp;gt;xSize ;
                        &lt;span class="kw2"&gt;break&lt;/span&gt; ;

                &lt;span class="kw2"&gt;case&lt;/span&gt; SB_LINEUP:
                        nScrollAmt = -pScroll-&amp;gt;xChar ;
                        &lt;span class="kw2"&gt;break&lt;/span&gt; ;

                &lt;span class="kw2"&gt;case&lt;/span&gt; SB_LINEDOWN:
                        nScrollAmt = pScroll-&amp;gt;xChar ;
                        &lt;span class="kw2"&gt;break&lt;/span&gt; ;

                &lt;span class="kw2"&gt;case&lt;/span&gt; SB_THUMBPOSITION:
                        nScrollAmt = wScrollPos - pScroll-&amp;gt;xOffset ;
                        &lt;span class="kw2"&gt;break&lt;/span&gt; ;

                &lt;span class="kw2"&gt;default&lt;/span&gt;:
                        &lt;span class="kw2"&gt;return&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt; &lt;span class="kw2"&gt;FALSE&lt;/span&gt; &lt;span class="br0"&gt;)&lt;/span&gt; ;
                &lt;span class="br0"&gt;}&lt;/span&gt;
        &lt;span class="kw2"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;pScroll-&amp;gt;xOffset + nScrollAmt&lt;span class="br0"&gt;)&lt;/span&gt; &amp;gt; pScroll-&amp;gt;xScroll&lt;span class="br0"&gt;)&lt;/span&gt;
                nScrollAmt = pScroll-&amp;gt;xScroll - pScroll-&amp;gt;xOffset ;
        &lt;span class="kw2"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;pScroll-&amp;gt;xOffset + nScrollAmt&lt;span class="br0"&gt;)&lt;/span&gt; &amp;lt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;
                nScrollAmt = -pScroll-&amp;gt;xOffset ;
        ScrollWindow&lt;span class="br0"&gt;(&lt;/span&gt; hWnd, -nScrollAmt, &lt;span class="nu0"&gt;0&lt;/span&gt;, &lt;span class="nu0"&gt;0&lt;/span&gt;, &lt;span class="nu0"&gt;0&lt;/span&gt; &lt;span class="br0"&gt;)&lt;/span&gt; ;
        pScroll-&amp;gt;xOffset = pScroll-&amp;gt;xOffset + nScrollAmt ;
        SetScrollPos&lt;span class="br0"&gt;(&lt;/span&gt; hWnd, SB_HORZ, pScroll-&amp;gt;xOffset, &lt;span class="kw2"&gt;TRUE&lt;/span&gt; &lt;span class="br0"&gt;)&lt;/span&gt; ;

        &lt;span class="kw2"&gt;return&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt; &lt;span class="kw2"&gt;TRUE&lt;/span&gt; &lt;span class="br0"&gt;)&lt;/span&gt; ;
        &lt;span class="br0"&gt;}&lt;/span&gt; &lt;span class="co1"&gt;// end of Scroll_SetHorz()&lt;/span&gt;
 &lt;/pre&gt;

In my WinApi class I haven't found scrollWindow() method. And I've added it into WinApi class
&lt;pre class="code" style="HEIGHT: auto"&gt;&lt;span class="co1"&gt;// Created by GRR&lt;/span&gt;
&lt;span class="kw2"&gt;client&lt;/span&gt; &lt;span class="kw2"&gt;static&lt;/span&gt; &lt;span class="kw1"&gt;int&lt;/span&gt; scrollWindow&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="kw1"&gt;int&lt;/span&gt;     hwnd,
                               &lt;span class="kw1"&gt;int&lt;/span&gt;     XAmount,
                               &lt;span class="kw1"&gt;int&lt;/span&gt;     YAmount&lt;span class="br0"&gt;)&lt;/span&gt;
&lt;span class="br0"&gt;{&lt;/span&gt;
    DLL         _winApiDLL     = &lt;span class="kw2"&gt;new&lt;/span&gt; DLL&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="st0"&gt;'USER32'&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;
    DLLFunction _scrollWindow  = &lt;span class="kw2"&gt;new&lt;/span&gt; DLLFunction&lt;span class="br0"&gt;(&lt;/span&gt;_winApiDLL, &lt;span class="st0"&gt;'ScrollWindow'&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;

    _scrollWindow.&lt;span class="me1"&gt;returns&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;ExtTypes::&lt;span class="me2"&gt;DWord&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;
    _scrollWindow.&lt;span class="me1"&gt;arg&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;ExtTypes::&lt;span class="me2"&gt;DWord&lt;/span&gt;,
                       ExtTypes::&lt;span class="me2"&gt;DWord&lt;/span&gt;,
                       ExtTypes::&lt;span class="me2"&gt;DWord&lt;/span&gt;,
                       ExtTypes::&lt;span class="me2"&gt;DWord&lt;/span&gt;,
                       ExtTypes::&lt;span class="me2"&gt;DWord&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;

    &lt;span class="kw2"&gt;return&lt;/span&gt; _scrollWindow.&lt;span class="me1"&gt;call&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;hwnd, XAmount, YAmount, &lt;span class="nu0"&gt;0&lt;/span&gt;,&lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;
&lt;span class="br0"&gt;}&lt;/span&gt;
 &lt;/pre&gt;
Now we are ready for third step
&lt;p&gt;&lt;strong&gt;- Trapping scroll events&lt;/strong&gt;

I've designed it as a new class xApplyScrolling
// Begin of xApplyScrolling class --&gt;
&lt;pre class="code" style="HEIGHT: 275px"&gt;#define.&lt;span class="me1"&gt;minValue&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;
#define.&lt;span class="me1"&gt;maxValue&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;
#define.&lt;span class="me1"&gt;pageSize&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;3&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;
#define.&lt;span class="me1"&gt;pos&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;4&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;

#define.&lt;span class="me1"&gt;xChar&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;5&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;
#define.&lt;span class="me1"&gt;yChar&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;5&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;

&lt;span class="kw2"&gt;class&lt;/span&gt; xApplyScrolling
&lt;span class="br0"&gt;{&lt;/span&gt;
    #WinApi

    TrucosAx_TrapperWndProc     WndProcHScroll, WndProcVScroll;
    HWND                        handle;

    &lt;span class="kw1"&gt;container&lt;/span&gt;    cScrollInfoH, cScrollInfoV;
    &lt;span class="kw1"&gt;int&lt;/span&gt;          xOffset, yOffset;
    &lt;span class="kw1"&gt;int&lt;/span&gt;          xScroll, yScroll;
    &lt;span class="kw1"&gt;int&lt;/span&gt;          xSize,   ySize;
&lt;span class="br0"&gt;}&lt;/span&gt;

&lt;span class="co1"&gt;//In new() method we are installing hooks for WM_HSCROLL and WM_VSCROLL separately&lt;/span&gt;
&lt;span class="kw1"&gt;void&lt;/span&gt; &lt;span class="kw2"&gt;new&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;FormRun _element, FormControl _formControl&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="co1"&gt;//HWND _HWnd&lt;/span&gt;
&lt;span class="br0"&gt;{&lt;/span&gt;
    handle = _formControl.&lt;span class="me1"&gt;hWnd&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;

    WndProcHScroll = &lt;span class="kw2"&gt;new&lt;/span&gt; TrucosAx_TrapperwndProc&lt;span class="br0"&gt;(&lt;/span&gt;_element, handle, &lt;span class="kw2"&gt;true&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;
    WndProcHScroll.&lt;span class="me1"&gt;InstallHook&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;#WM_HSCROLL, &lt;span class="st0"&gt;'scrlMessageH'&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;
    WndProcHScroll.&lt;span class="me1"&gt;setObject&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;this&lt;span class="br0"&gt;)&lt;/span&gt;;

    WndProcVScroll = &lt;span class="kw2"&gt;new&lt;/span&gt; TrucosAx_TrapperwndProc&lt;span class="br0"&gt;(&lt;/span&gt;_element, handle, &lt;span class="kw2"&gt;true&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;
    WndProcVScroll.&lt;span class="me1"&gt;InstallHook&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;#WM_VSCROLL, &lt;span class="st0"&gt;'scrlMessageV'&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;
    WndProcVScroll.&lt;span class="me1"&gt;setObject&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;this&lt;span class="br0"&gt;)&lt;/span&gt;;

    this.&lt;span class="me1"&gt;setScrollable&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;
&lt;span class="br0"&gt;}&lt;/span&gt;

&lt;span class="co1"&gt;//Here we set scrollable style for the window&lt;/span&gt;
&lt;span class="kw2"&gt;protected&lt;/span&gt; &lt;span class="kw1"&gt;void&lt;/span&gt; setScrollable&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;
&lt;span class="br0"&gt;{&lt;/span&gt;
    ;
    WinApi::&lt;span class="me2"&gt;showScrollbar&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;handle, #SB_BOTH, &lt;span class="kw2"&gt;true&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;

&lt;span class="co1"&gt;//                 pos pSize  min max&lt;/span&gt;
    WinApi::&lt;span class="me2"&gt;setScrollInfo&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;handle, &lt;span class="nu0"&gt;0&lt;/span&gt;, &lt;span class="nu0"&gt;20&lt;/span&gt;,    &lt;span class="nu0"&gt;0&lt;/span&gt;, &lt;span class="nu0"&gt;100&lt;/span&gt;, &lt;span class="kw2"&gt;true&lt;/span&gt;, #SB_HORZ&lt;span class="br0"&gt;)&lt;/span&gt;;
    WinApi::&lt;span class="me2"&gt;setScrollInfo&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;handle, &lt;span class="nu0"&gt;0&lt;/span&gt;, &lt;span class="nu0"&gt;20&lt;/span&gt;,    &lt;span class="nu0"&gt;0&lt;/span&gt;, &lt;span class="nu0"&gt;100&lt;/span&gt;, &lt;span class="kw2"&gt;true&lt;/span&gt;, #SB_VERT&lt;span class="br0"&gt;)&lt;/span&gt;;&lt;/br&gt;
    cScrollInfoH = WinApi::&lt;span class="me2"&gt;getScrollInfo&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;handle, #SB_HORZ&lt;span class="br0"&gt;)&lt;/span&gt;;
    xOffset      = &lt;span class="kw3"&gt;conpeek&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;cScrollInfoH, #pos&lt;span class="br0"&gt;)&lt;/span&gt;;
    xScroll      = &lt;span class="kw3"&gt;conpeek&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;cScrollInfoH, #maxValue&lt;span class="br0"&gt;)&lt;/span&gt;;
    xSize        = &lt;span class="kw3"&gt;conpeek&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;cScrollInfoH, #pageSize&lt;span class="br0"&gt;)&lt;/span&gt;;&lt;/br&gt;
    cScrollInfoV = WinApi::&lt;span class="me2"&gt;getScrollInfo&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;handle, #SB_VERT&lt;span class="br0"&gt;)&lt;/span&gt;;
    yOffset      = &lt;span class="kw3"&gt;conpeek&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;cScrollInfoV, #pos&lt;span class="br0"&gt;)&lt;/span&gt;;
    yScroll      = &lt;span class="kw3"&gt;conpeek&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;cScrollInfoV, #maxValue&lt;span class="br0"&gt;)&lt;/span&gt;;
    ySize        = &lt;span class="kw3"&gt;conpeek&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;cScrollInfoV, #pageSize&lt;span class="br0"&gt;)&lt;/span&gt;;
&lt;span class="br0"&gt;}&lt;/span&gt;&lt;/br&gt;
&lt;span class="co1"&gt;//Here we scroll the window&lt;/span&gt;
&lt;span class="kw2"&gt;protected&lt;/span&gt; &lt;span class="kw1"&gt;str&lt;/span&gt; translateHCode&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="kw1"&gt;int&lt;/span&gt; _nScrollCode&lt;span class="br0"&gt;)&lt;/span&gt;
&lt;span class="br0"&gt;{&lt;/span&gt;
    &lt;span class="kw1"&gt;int&lt;/span&gt;          nScrollAmt ;
    &lt;span class="kw1"&gt;str&lt;/span&gt;          strCode;
    ;

    &lt;span class="kw2"&gt;switch&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;_nScrollCode&lt;span class="br0"&gt;)&lt;/span&gt;
    &lt;span class="br0"&gt;{&lt;/span&gt;
        &lt;span class="kw2"&gt;case&lt;/span&gt; #SB_BOTTOM: &lt;span class="co1"&gt;// Scrolls to the lower right.&lt;/span&gt;
            &lt;span class="co1"&gt;//nScrollAmt = pScroll-&amp;gt;xScroll - pScroll-&amp;gt;xOffset;&lt;/span&gt;
            nScrollAmt = xScroll - xOffset;
            strCode = &lt;span class="st0"&gt;'SB_BOTTOM'&lt;/span&gt;;
        &lt;span class="kw2"&gt;break&lt;/span&gt;;

        &lt;span class="kw2"&gt;case&lt;/span&gt; #SB_ENDSCROLL: &lt;span class="co1"&gt;// Ends scroll.&lt;/span&gt;
            strCode = &lt;span class="st0"&gt;'SB_ENDSCROLL'&lt;/span&gt;;
        &lt;span class="kw2"&gt;break&lt;/span&gt;;

        &lt;span class="kw2"&gt;case&lt;/span&gt; #SB_LINELEFT: &lt;span class="co1"&gt;// Scrolls left by one unit.&lt;/span&gt;
            nScrollAmt = -#xChar;
            strCode = &lt;span class="st0"&gt;'SB_LINELEFT'&lt;/span&gt;;
        &lt;span class="kw2"&gt;break&lt;/span&gt;;

        &lt;span class="kw2"&gt;case&lt;/span&gt; #SB_LINERIGHT: &lt;span class="co1"&gt;// Scrolls right by one unit.&lt;/span&gt;
            nScrollAmt = #xChar;
            strCode = &lt;span class="st0"&gt;'SB_LINERIGHT'&lt;/span&gt;;
        &lt;span class="kw2"&gt;break&lt;/span&gt;;

        &lt;span class="kw2"&gt;case&lt;/span&gt; #SB_PAGELEFT: &lt;span class="co1"&gt;// Scrolls left by the width of the window.&lt;/span&gt;
            &lt;span class="co1"&gt;//nScrollAmt = -pScroll-&amp;gt;xSize;&lt;/span&gt;
            nScrollAmt = -xSize;
            strCode = &lt;span class="st0"&gt;'SB_PAGELEFT'&lt;/span&gt;;
        &lt;span class="kw2"&gt;break&lt;/span&gt;;

        &lt;span class="kw2"&gt;case&lt;/span&gt; #SB_PAGERIGHT: &lt;span class="co1"&gt;// Scrolls right by the width of the window.&lt;/span&gt;
            &lt;span class="co1"&gt;//nScrollAmt = pScroll-&amp;gt;xSize;&lt;/span&gt;
            nScrollAmt = xSize;
            strCode = &lt;span class="st0"&gt;'SB_PAGERIGHT'&lt;/span&gt;;
        &lt;span class="kw2"&gt;break&lt;/span&gt;;

        &lt;span class="kw2"&gt;case&lt;/span&gt; #SB_THUMBPOSITION: &lt;span class="co1"&gt;// Scrolls to the absolute position. The current position is specified by the nPos parameter. &lt;/span&gt;
            &lt;span class="co1"&gt;//nScrollAmt = wScrollPos - pScroll-&amp;gt;xOffset;&lt;/span&gt;
            nScrollAmt = -xSize;
            strCode = &lt;span class="st0"&gt;'SB_THUMBPOSITION'&lt;/span&gt;;
        &lt;span class="kw2"&gt;break&lt;/span&gt;;

        &lt;span class="kw2"&gt;case&lt;/span&gt; #SB_THUMBTRACK: &lt;span class="co1"&gt;// Drags scroll box to the specified position. The current position is specified by &lt;/span&gt; the nPos parameter.
            &lt;span class="me1"&gt;strCode&lt;/span&gt; = &lt;span class="st0"&gt;'SB_THUMBTRACK'&lt;/span&gt;;
        &lt;span class="kw2"&gt;break&lt;/span&gt;;
        &lt;span class="kw2"&gt;case&lt;/span&gt; #SB_TOP: &lt;span class="co1"&gt;// Scrolls to the upper left.&lt;/span&gt;
            &lt;span class="co1"&gt;//nScrollAmt = -pScroll-&amp;gt;xOffset;&lt;/span&gt;
            nScrollAmt = -xOffset;
            strCode = &lt;span class="st0"&gt;'SB_TOP'&lt;/span&gt;;
        &lt;span class="kw2"&gt;break&lt;/span&gt;;

        &lt;span class="kw2"&gt;default&lt;/span&gt;:
            &lt;span class="co1"&gt;//return int2HEX(_nScrollCode);&lt;/span&gt;
            nScrollAmt = _nScrollCode/0x10000 - xOffset;
            strCode = int2HEX&lt;span class="br0"&gt;(&lt;/span&gt;_nScrollCode&lt;span class="br0"&gt;)&lt;/span&gt;;
    &lt;span class="br0"&gt;}&lt;/span&gt;

    &lt;span class="kw2"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;xOffset + nScrollAmt&lt;span class="br0"&gt;)&lt;/span&gt; &amp;gt; xScroll&lt;span class="br0"&gt;)&lt;/span&gt;
        nScrollAmt = xScroll - xOffset ;
    &lt;span class="kw2"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;xOffset + nScrollAmt&lt;span class="br0"&gt;)&lt;/span&gt; &amp;lt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;
        nScrollAmt = -xOffset ;
&lt;span class="co1"&gt;//    ScrollWindow( hWnd, -nScrollAmt, 0,) ;&lt;/span&gt;
    WinApi::&lt;span class="me2"&gt;scrollWindow&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;handle, -nScrollAmt, &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;

    xOffset+=nScrollAmt ;
&lt;span class="co1"&gt;//    SetScrollPos( hWnd, SB_HORZ, pScroll-&amp;gt;xOffset, TRUE ) ;&lt;/span&gt;
    WinApi::&lt;span class="me2"&gt;setScrollPos&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;handle, #SB_HORZ, xOffset, &lt;span class="kw2"&gt;true&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;
    WinApi::&lt;span class="me2"&gt;invalidateRect&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;handle&lt;span class="br0"&gt;)&lt;/span&gt;;

    &lt;span class="kw2"&gt;return&lt;/span&gt; strCode;
&lt;span class="br0"&gt;}&lt;/span&gt;

&lt;span class="kw2"&gt;protected&lt;/span&gt; &lt;span class="kw1"&gt;str&lt;/span&gt; translateVCode&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="kw1"&gt;int&lt;/span&gt; _nScrollCode&lt;span class="br0"&gt;)&lt;/span&gt;
&lt;span class="br0"&gt;{&lt;/span&gt;
    &lt;span class="kw1"&gt;int&lt;/span&gt;          nScrollAmt ;
    &lt;span class="kw1"&gt;str&lt;/span&gt;          strCode;
    ;

    &lt;span class="kw2"&gt;switch&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;_nScrollCode&lt;span class="br0"&gt;)&lt;/span&gt;
    &lt;span class="br0"&gt;{&lt;/span&gt;
        &lt;span class="kw2"&gt;case&lt;/span&gt; #SB_BOTTOM: &lt;span class="co1"&gt;// Scrolls to the lower right.&lt;/span&gt;
            nScrollAmt = yScroll - yOffset;&lt;span class="co1"&gt;//nScrollAmt = pScroll-&amp;gt;yScroll - pScroll-&amp;gt;yOffset ;&lt;/span&gt;
            strCode = &lt;span class="st0"&gt;'SB_BOTTOM'&lt;/span&gt;;
        &lt;span class="kw2"&gt;break&lt;/span&gt;;
        &lt;span class="kw2"&gt;case&lt;/span&gt; #SB_ENDSCROLL: &lt;span class="co1"&gt;// Ends scroll.&lt;/span&gt;
            &lt;span class="kw2"&gt;return&lt;/span&gt; &lt;span class="st0"&gt;'SB_ENDSCROLL'&lt;/span&gt;;
        &lt;span class="kw2"&gt;break&lt;/span&gt;;
        &lt;span class="kw2"&gt;case&lt;/span&gt; #SB_LINEDOWN: &lt;span class="co1"&gt;// Scrolls one line down.&lt;/span&gt;
            nScrollAmt = #yChar;&lt;span class="co1"&gt;//nScrollAmt = pScroll-&amp;gt;yChar;&lt;/span&gt;
            strCode = &lt;span class="st0"&gt;'SB_LINEDOWN'&lt;/span&gt;;
        &lt;span class="kw2"&gt;break&lt;/span&gt;;

        &lt;span class="kw2"&gt;case&lt;/span&gt; #SB_LINEUP: &lt;span class="co1"&gt;// Scrolls one line up.&lt;/span&gt;
            nScrollAmt = -#yChar;&lt;span class="co1"&gt;//nScrollAmt = -pScroll-&amp;gt;yChar;&lt;/span&gt;
            strCode = &lt;span class="st0"&gt;'SB_LINEUP'&lt;/span&gt;;
        &lt;span class="kw2"&gt;break&lt;/span&gt;;
        &lt;span class="kw2"&gt;case&lt;/span&gt; #SB_PAGEDOWN: &lt;span class="co1"&gt;// Scrolls one page down.&lt;/span&gt;
            nScrollAmt = ySize;&lt;span class="co1"&gt;//nScrollAmt = pScroll-&amp;gt;ySize;&lt;/span&gt;
            strCode = &lt;span class="st0"&gt;'SB_PAGEDOWN'&lt;/span&gt;;
        &lt;span class="kw2"&gt;break&lt;/span&gt;;

        &lt;span class="kw2"&gt;case&lt;/span&gt; #SB_PAGEUP: &lt;span class="co1"&gt;// Scrolls one page up.&lt;/span&gt;
            nScrollAmt = -ySize;&lt;span class="co1"&gt;//nScrollAmt = -pScroll-&amp;gt;ySize;&lt;/span&gt;
            strCode = &lt;span class="st0"&gt;'SB_PAGEUP'&lt;/span&gt;;
        &lt;span class="kw2"&gt;break&lt;/span&gt;;

        &lt;span class="kw2"&gt;case&lt;/span&gt; #SB_THUMBPOSITION: &lt;span class="co1"&gt;// Scrolls to the absolute position. The current position is specified by the nPos parameter.&lt;/span&gt;
            &lt;span class="co1"&gt;//nScrollAmt = wScrollPos - pScroll-&amp;gt;yOffset;&lt;/span&gt;
            nScrollAmt = -ySize;
            strCode = &lt;span class="st0"&gt;'SB_THUMBPOSITION'&lt;/span&gt;;
        &lt;span class="kw2"&gt;break&lt;/span&gt;;

        &lt;span class="kw2"&gt;case&lt;/span&gt; #SB_THUMBTRACK: &lt;span class="co1"&gt;// Drags scroll box to the specified position. The current position is specified by the nPos parameter.&lt;/span&gt;
            &lt;span class="kw2"&gt;return&lt;/span&gt; &lt;span class="st0"&gt;'SB_THUMBTRACK'&lt;/span&gt;;
        &lt;span class="kw2"&gt;break&lt;/span&gt;;

        &lt;span class="kw2"&gt;case&lt;/span&gt; #SB_TOP: &lt;span class="co1"&gt;// Scrolls to the upper left.&lt;/span&gt;
            nScrollAmt = -yOffset;&lt;span class="co1"&gt;// nScrollAmt = -pScroll-&amp;gt;yOffset;&lt;/span&gt;
            strCode = &lt;span class="st0"&gt;'SB_TOP'&lt;/span&gt;;
        &lt;span class="kw2"&gt;break&lt;/span&gt;;

        &lt;span class="kw2"&gt;default&lt;/span&gt;:
            nScrollAmt = _nScrollCode/0x10000 - yOffset;
            strCode = int2HEX&lt;span class="br0"&gt;(&lt;/span&gt;_nScrollCode&lt;span class="br0"&gt;)&lt;/span&gt;;
    &lt;span class="br0"&gt;}&lt;/span&gt;

    &lt;span class="kw2"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;yOffset + nScrollAmt&lt;span class="br0"&gt;)&lt;/span&gt; &amp;gt; yScroll&lt;span class="br0"&gt;)&lt;/span&gt;
        nScrollAmt = yScroll - yOffset;
    &lt;span class="kw2"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;yOffset + nScrollAmt&lt;span class="br0"&gt;)&lt;/span&gt; &amp;lt; &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;
        nScrollAmt = -yOffset;

    WinApi::&lt;span class="me2"&gt;scrollWindow&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;handle, &lt;span class="nu0"&gt;0&lt;/span&gt;, -nScrollAmt&lt;span class="br0"&gt;)&lt;/span&gt;;
&lt;span class="co1"&gt;//    pScroll-&amp;gt;yOffset = pScroll-&amp;gt;yOffset + nScrollAmt ;&lt;/span&gt;
&lt;span class="co1"&gt;//    SetScrollPos( hWnd, SB_VERT, pScroll-&amp;gt;yOffset, TRUE ) ;&lt;/span&gt;

    yOffset+=nScrollAmt;
    WinApi::&lt;span class="me2"&gt;setScrollPos&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;handle, #SB_VERT, yOffset, &lt;span class="kw2"&gt;true&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;
    WinApi::&lt;span class="me2"&gt;invalidateRect&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;handle&lt;span class="br0"&gt;)&lt;/span&gt;;

    &lt;span class="kw2"&gt;return&lt;/span&gt; strCode;
&lt;span class="br0"&gt;}&lt;/span&gt;

&lt;span class="co1"&gt;// Here we process scrolling messages&lt;/span&gt;
&lt;span class="kw2"&gt;protected&lt;/span&gt; &lt;span class="kw1"&gt;void&lt;/span&gt; scrlMessageH&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;
&lt;span class="br0"&gt;{&lt;/span&gt;
    map     MMsgH;
    ;

    MMsgH = WndProcHScroll.&lt;span class="me1"&gt;GetMsg&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;

    this.&lt;span class="me1"&gt;translateHCode&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;MMsgH.&lt;span class="me1"&gt;lookup&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="st0"&gt;'WPARAM'&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;
&lt;span class="br0"&gt;}&lt;/span&gt;

&lt;span class="kw2"&gt;protected&lt;/span&gt; &lt;span class="kw1"&gt;void&lt;/span&gt; scrlMessageV&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;
&lt;span class="br0"&gt;{&lt;/span&gt;
    map     MMsgV;
    ;

    MMsgV = WndProcVScroll.&lt;span class="me1"&gt;GetMsg&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;

    this.&lt;span class="me1"&gt;translateVCode&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;MMsgV.&lt;span class="me1"&gt;lookup&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="st0"&gt;'WPARAM'&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;
&lt;span class="br0"&gt;}&lt;/span&gt;

&lt;span class="co1"&gt;// Here we finalize our class &lt;/span&gt;
&lt;span class="kw1"&gt;void&lt;/span&gt; finalize&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;
&lt;span class="br0"&gt;{&lt;/span&gt;
    WndProcHScroll.&lt;span class="me1"&gt;RemoveMainProc&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;
    WndProcVScroll.&lt;span class="me1"&gt;RemoveMainProc&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;
&lt;span class="br0"&gt;}&lt;/span&gt;
 &lt;/pre&gt;
// &lt;-- End of xApplyScrolling class &lt;p&gt;By the way there was modificated a bit TrucosAx_TrapperWndProc class.&lt;/br&gt; In method processMessages() in our case we need to work with class object, not with FormRun object. Here are modifications: &lt;pre class="code" style="height:275px;"&gt;&lt;span class="kw2"&gt;class&lt;/span&gt; TrucosAx_TrapperWndProc &lt;span class="kw2"&gt;extends&lt;/span&gt; TrucosAx_TrapperBase
&lt;span class="br0"&gt;{&lt;/span&gt;
 #define.&lt;span class="me1"&gt;CodeSize&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;159&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="co1"&gt;// Total bytes de codigo&lt;/span&gt;
  #define.&lt;span class="me1"&gt;InternalDataSize&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;16&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;
  #define.&lt;span class="me1"&gt;MaxDataelements&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;100&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="co1"&gt;// Si se cambia se debe cambiar el codigo asm&lt;/span&gt;
  #Define.&lt;span class="me1"&gt;DataSize&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;16&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="co1"&gt;// +16 bytes de buffer&lt;/span&gt;
  #Define.&lt;span class="me1"&gt;offsetcounter&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;#CodeSize + &lt;span class="nu0"&gt;4&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;
  #Define.&lt;span class="me1"&gt;offsetlastmsg&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;#CodeSize + &lt;span class="nu0"&gt;8&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;
  #Define.&lt;span class="me1"&gt;offsetCallwndproc&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;#CodeSize + &lt;span class="nu0"&gt;12&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;

  map hooks;
  #define.&lt;span class="me1"&gt;maxHooks&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="nu0"&gt;20&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="co1"&gt;//si se cambia se debe cambiar el codigo asm&lt;/span&gt;
  Binary HooksBuffer;

    Object  object;&lt;span class="co1"&gt;//Created by GRR&lt;/span&gt;
&lt;span class="br0"&gt;}&lt;/span&gt;

&lt;span class="co1"&gt;//Created by GRR&lt;/span&gt;
&lt;span class="kw1"&gt;void&lt;/span&gt; setObject&lt;span class="br0"&gt;(&lt;/span&gt;Object _object&lt;span class="br0"&gt;)&lt;/span&gt;
&lt;span class="br0"&gt;{&lt;/span&gt;
    ;
    object = _object;
&lt;span class="br0"&gt;}&lt;/span&gt;

&lt;span class="kw2"&gt;protected&lt;/span&gt; &lt;span class="kw1"&gt;void&lt;/span&gt; processMessages&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;
&lt;span class="br0"&gt;{&lt;/span&gt; map Mmsg;
  &lt;span class="kw1"&gt;int&lt;/span&gt; msgId;


  &lt;span class="kw1"&gt;void&lt;/span&gt; Ejecuta&lt;span class="br0"&gt;(&lt;/span&gt; &lt;span class="kw1"&gt;str&lt;/span&gt; methodname &lt;span class="br0"&gt;)&lt;/span&gt;
  &lt;span class="br0"&gt;{&lt;/span&gt;
    &lt;span class="kw1"&gt;str&lt;/span&gt; func = @&lt;span class="st0"&gt;"void FireHook(object obj)
    {
     ;
      obj.%1();
    }"&lt;/span&gt;;
    func = &lt;span class="kw3"&gt;strfmt&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;func,methodname&lt;span class="br0"&gt;)&lt;/span&gt;;
    &lt;span class="co1"&gt;//RunBuf(func, xelement); //Commented by GRR&lt;/span&gt;

    &lt;span class="co1"&gt;// Created by GRR --&amp;gt;&lt;/span&gt;
    &lt;span class="kw2"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;object&lt;span class="br0"&gt;)&lt;/span&gt;
        &lt;span class="kw3"&gt;RunBuf&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;func, object&lt;span class="br0"&gt;)&lt;/span&gt;;
    &lt;span class="kw2"&gt;else&lt;/span&gt;
        &lt;span class="kw3"&gt;RunBuf&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;func, xelement&lt;span class="br0"&gt;)&lt;/span&gt;;
    &lt;span class="co1"&gt;// Created by GRR &amp;lt;--&lt;/span&gt;
  &lt;span class="br0"&gt;}&lt;/span&gt;
;

 &lt;span class="kw2"&gt;do&lt;/span&gt;
 &lt;span class="br0"&gt;{&lt;/span&gt;
  MMsg = this.&lt;span class="me1"&gt;GetMsg&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;
  &lt;span class="kw2"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;! MMsg&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="kw2"&gt;continue&lt;/span&gt;;
  MsgId = MMsg.&lt;span class="me1"&gt;lookup&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="st0"&gt;'MSG'&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;
  &lt;span class="kw2"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;hooks.&lt;span class="kw4"&gt;exists&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;MsgId&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;
  &lt;span class="br0"&gt;{&lt;/span&gt;
    Ejecuta&lt;span class="br0"&gt;(&lt;/span&gt;hooks.&lt;span class="me1"&gt;lookup&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;MsgId&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;

   &lt;span class="co1"&gt;// Si se queda el mensaje debe devolver algo en 'RESULT' en el MMSG&lt;/span&gt;
    &lt;span class="kw2"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt; ! MMsg.&lt;span class="kw4"&gt;exists&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="st0"&gt;'RESULT'&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;
     this.&lt;span class="me1"&gt;CallbackOriginalProc&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;MMsg&lt;span class="br0"&gt;)&lt;/span&gt;;
  &lt;span class="br0"&gt;}&lt;/span&gt;
 &lt;span class="br0"&gt;}&lt;/span&gt; &lt;span class="kw2"&gt;while&lt;/span&gt; &lt;span class="br0"&gt;(&lt;/span&gt;MMsg &amp;amp;&amp;amp; this.&lt;span class="me1"&gt;nextmessage&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;
&lt;span class="br0"&gt;}&lt;/span&gt;&lt;/pre&gt;
 
That's all.
To work with scrollable objects we need drop a line in run() method:

&lt;pre class="code" style="height:275px;"&gt;&lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="kw1"&gt;void&lt;/span&gt; run&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;
&lt;span class="br0"&gt;{&lt;/span&gt;
    &lt;span class="kw2"&gt;super&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;

    applyScrolling = &lt;span class="kw2"&gt;new&lt;/span&gt; xApplyScrolling&lt;span class="br0"&gt;(&lt;/span&gt;element, element.&lt;span class="me1"&gt;control&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;control::&lt;span class="me2"&gt;HRMPersonal&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;
&lt;span class="br0"&gt;}&lt;/span&gt;

&lt;span class="co1"&gt;// don't forget to finalize ApplyScrolling class&lt;/span&gt;
&lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="kw1"&gt;void&lt;/span&gt; close&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;
&lt;span class="br0"&gt;{&lt;/span&gt;
    applyScrolling.&lt;span class="me1"&gt;finalize&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;

    &lt;span class="kw2"&gt;super&lt;/span&gt;&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;
&lt;span class="br0"&gt;}&lt;/span&gt;

&lt;span class="co1"&gt;// and declare applyScrolling variable in ClassDeclaration &lt;/span&gt;
xApplyScrolling applyScrolling;&lt;/pre&gt;
 
Following picture demonstrates scrolling TabPage:HRMPersonal EmplTable form

&lt;/br&gt;&lt;strong&gt;P.S.&lt;/strong&gt; This project is raw enough. For example it doesn't support form resizing.&lt;/br&gt;
Another words... to be continued.

&lt;pre class="foot"&gt;Copyright © 2008 Ruslan Goncharov&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8929482477382507970-3952187643553556788?l=rusgon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rusgon.blogspot.com/feeds/3952187643553556788/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8929482477382507970&amp;postID=3952187643553556788' title='13 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8929482477382507970/posts/default/3952187643553556788'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8929482477382507970/posts/default/3952187643553556788'/><link rel='alternate' type='text/html' href='http://rusgon.blogspot.com/2008/03/scrolling-in-ax-30-without-dll.html' title='Scrolling in AX 3.0 without dll'/><author><name>Ruslan Goncharov</name><uri>http://www.blogger.com/profile/16144278259112759869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://bp1.blogger.com/_2cRBcMvuiG4/R2eKi4QRYDI/AAAAAAAAAAM/X5f025zSGhQ/S220/ruslan.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_2cRBcMvuiG4/R9Q-ZDGHboI/AAAAAAAAABg/lGAf4WDkwzI/s72-c/Scrolling.JPG' height='72' width='72'/><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8929482477382507970.post-8989364463192732010</id><published>2008-02-24T14:55:00.006+02:00</published><updated>2008-07-31T17:12:26.747+03:00</updated><title type='text'>Posting InventJournal from X++</title><content type='html'>Once I was faced the problem to post InventJournal from code. &lt;br /&gt;

At first glance it's easy. Let's open AOT. Then we find corresponding Menu Item in \Menu Items\Action\InventJournalPost. Open class InventJournalCheckPost... And looking at main() method of this class we are coming to conclusion that this class is tightly tied to the journalForm. What's a pity!&lt;br /&gt;

&lt;p&gt;So let's try to write own code.&lt;br /&gt;

&lt;p&gt;Look at main() method:&lt;br /&gt;

&lt;pre class="code" style="height:275px;"&gt;&lt;span class="kw2"&gt;static&lt;/span&gt; &lt;span class="kw1"&gt;void&lt;/span&gt; main&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;Args args&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; InventJournalCheckPost journalCheckPost;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; journalForm journalForm;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; journalForm = journalForm::&lt;span class="me2"&gt;fromArgs&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;args&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; journalCheckPost = InventJournalCheckPost::&lt;span class="me2"&gt;newFromForm&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;args,journalForm&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; journalForm.&lt;span class="me1"&gt;runbaseMainStart&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;!journalCheckPost.&lt;span class="me1"&gt;PROMPT&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;! journalCheckPost.&lt;span class="me1"&gt;BatchInfo&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;.&lt;span class="me1"&gt;parmBatchExecute&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; journalForm.&lt;span class="me1"&gt;runbaseMainCancel&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;try&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; journalCheckPost.&lt;span class="me1"&gt;run&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; journalForm.&lt;span class="me1"&gt;runbaseMainEnd&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;journalCheckPost,&lt;span class="kw2"&gt;false&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; catch &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;Exception::&lt;span class="me2"&gt;Error&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; journalForm.&lt;span class="me1"&gt;runbaseMainEnd&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;journalCheckPost,&lt;span class="kw2"&gt;true&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;

First of all we need to get rid of journalForm.&lt;br /&gt;

Let's rewrite newFromForm() method. The parameters wich passing into this method are used to achieve InventJournalTable. So we may just pass InventJournalTable into our new method.&lt;br /&gt;
&lt;pre class="code" style="height:275px;"&gt;JournalCheckPost getJournalCheckPost&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;InventJournalTable _inventJournalTable&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;// \Menu Items\Action\InventJournalPost&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;switch&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;inventJournalTable.&lt;span class="me1"&gt;journalType&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;case&lt;/span&gt; InventJournalType::&lt;span class="me2"&gt;Movement&lt;/span&gt;:
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;case&lt;/span&gt; InventJournalType::&lt;span class="me2"&gt;LossProfit&lt;/span&gt;:
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;case&lt;/span&gt; InventJournalType::&lt;span class="me2"&gt;Transfer&lt;/span&gt;:
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;case&lt;/span&gt; InventJournalType::&lt;span class="me2"&gt;BOM&lt;/span&gt;:
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;case&lt;/span&gt; InventJournalType::&lt;span class="kw4"&gt;Count&lt;/span&gt;:
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;case&lt;/span&gt; InventJournalType::&lt;span class="me2"&gt;project&lt;/span&gt;:
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;case&lt;/span&gt; InventJournalType::&lt;span class="me2"&gt;Asset&lt;/span&gt;:
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; journalCheckPost_Mov = InventJournalCheckPost_Movement::&lt;span class="me2"&gt;newJournalCheckPost&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;false&lt;/span&gt;,&lt;span class="kw2"&gt;true&lt;/span&gt;, JournalCheckPostType::&lt;span class="me2"&gt;Post&lt;/span&gt;, _inventJournalTable.&lt;span class="me1"&gt;tableId&lt;/span&gt;, &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; _inventJournalTable.&lt;span class="me1"&gt;journalId&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;// journalTransData = _journalForm.JournalTransData();&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;// if (journalTransData)&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;// journalCheckPost_Mov.parmVoucher(journalTransData.journalTrans().voucher);&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt; journalCheckPost_Mov;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;case&lt;/span&gt; InventJournalType::&lt;span class="me2"&gt;TagCounting&lt;/span&gt;:
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; journalCheckPost = InventJournalCheckPost_Tag::&lt;span class="me2"&gt;newJournalCheckPost&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;false&lt;/span&gt;, &lt;span class="kw2"&gt;true&lt;/span&gt;, JournalCheckPostType::&lt;span class="me2"&gt;Post&lt;/span&gt;, inventJournalTable.&lt;span class="me1"&gt;tableId&lt;/span&gt;, &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; _inventJournalTable.&lt;span class="me1"&gt;journalId&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt; journalCheckPost_Tag;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;&lt;/pre&gt;

Look at JournalFormTable class. It extends journalForm class. &lt;p&gt;Inside of runbaseMainStart() method we may find following line &lt;br /&gt;
journalTableData.updateBlock(JournalBlockLevel::None,JournalBlockLevel::System,false);&lt;br /&gt;

&lt;p&gt;inside of runbaseMainCancel() method:&lt;br /&gt;
journalTableData.updateBlock(JournalBlockLevel::System,JournalBlockLevel::None,false);&lt;br /&gt;

&lt;p&gt;and inside of runbaseMainEnd() method:&lt;br /&gt;
journalTableData.updateBlock(JournalBlockLevel::System,JournalBlockLevel::None,false);&lt;br /&gt;

&lt;p&gt;That's enough. Now we may rewrite main() method:&lt;br /&gt;
&lt;pre class="code" style="height:275px;"&gt;&lt;span class="co1"&gt;// Posting start. According to \Classes\InventJournalCheckPost&lt;/span&gt;
&lt;span class="co1"&gt;// journalForm.runbaseMainStart();&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; journalTableData::&lt;span class="me2"&gt;updateBlockServer&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; inventJournalTable, JournalBlockLevel::&lt;span class="me2"&gt;None&lt;/span&gt;, JournalBlockLevel::&lt;span class="me2"&gt;System&lt;/span&gt;, &lt;span class="kw2"&gt;false&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; journalCheckPost = getJournalCheckPost&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;inventJournalTable&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;!journalCheckPost.&lt;span class="me1"&gt;PROMPT&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;! journalCheckPost.&lt;span class="me1"&gt;BatchInfo&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;.&lt;span class="me1"&gt;parmBatchExecute&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;// journalForm.runbaseMainCancel();&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; journalTableData::&lt;span class="me2"&gt;updateBlockServer&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; inventJournalTable, JournalBlockLevel::&lt;span class="me2"&gt;System&lt;/span&gt;, JournalBlockLevel::&lt;span class="me2"&gt;None&lt;/span&gt;, &lt;span class="kw2"&gt;false&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;try&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; journalCheckPost.&lt;span class="me1"&gt;run&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;// journalForm.runbaseMainEnd(journalCheckPost,false);&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; journalTableData::&lt;span class="me2"&gt;updateBlockServer&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; inventJournalTable, JournalBlockLevel::&lt;span class="me2"&gt;System&lt;/span&gt;, JournalBlockLevel::&lt;span class="me2"&gt;None&lt;/span&gt;, &lt;span class="kw2"&gt;false&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; catch &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;Exception::&lt;span class="me2"&gt;Error&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;// journalForm.runbaseMainEnd(journalCheckPost,true);&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; journalTableData::&lt;span class="me2"&gt;updateBlockServer&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; inventJournalTable, JournalBlockLevel::&lt;span class="me2"&gt;System&lt;/span&gt;, JournalBlockLevel::&lt;span class="me2"&gt;None&lt;/span&gt;, &lt;span class="kw2"&gt;true&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&lt;span class="co1"&gt;// Posting end&lt;/span&gt;&lt;/pre&gt;

Finally, we are ready to write our remarkable job:&lt;br /&gt;

&lt;pre class="code" style="height:275px;"&gt;&lt;span class="kw2"&gt;static&lt;/span&gt; &lt;span class="kw1"&gt;void&lt;/span&gt; JobInventJournalPost&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;Args _args&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; InventJournalCheckPost_Movement journalCheckPost_Mov;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; InventJournalCheckPost_Tag journalCheckPost_Tag;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; InventJournalCheckPost journalCheckPost;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; InventJournalTable inventJournalTable;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; InventJournalId inventJournalId = &lt;span class="st0"&gt;'Inv002372'&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; JournalCheckPost getJournalCheckPost&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;InventJournalTable _inventJournalTable&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;// \Menu Items\Action\InventJournalPost&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;switch&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;_inventJournalTable.&lt;span class="me1"&gt;journalType&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;case&lt;/span&gt; InventJournalType::&lt;span class="me2"&gt;Movement&lt;/span&gt;:
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;case&lt;/span&gt; InventJournalType::&lt;span class="me2"&gt;LossProfit&lt;/span&gt;:
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;case&lt;/span&gt; InventJournalType::&lt;span class="me2"&gt;Transfer&lt;/span&gt;:
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;case&lt;/span&gt; InventJournalType::&lt;span class="me2"&gt;BOM&lt;/span&gt;:
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;case&lt;/span&gt; InventJournalType::&lt;span class="kw4"&gt;Count&lt;/span&gt;:
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;case&lt;/span&gt; InventJournalType::&lt;span class="me2"&gt;project&lt;/span&gt;:
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;case&lt;/span&gt; InventJournalType::&lt;span class="me2"&gt;Asset&lt;/span&gt;:
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; journalCheckPost_Mov = InventJournalCheckPost_Movement::&lt;span class="me2"&gt;newJournalCheckPost&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;false&lt;/span&gt;,&lt;span class="kw2"&gt;true&lt;/span&gt;, JournalCheckPostType::&lt;span class="me2"&gt;Post&lt;/span&gt;, _inventJournalTable.&lt;span class="me1"&gt;tableId&lt;/span&gt;, &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; _inventJournalTable.&lt;span class="me1"&gt;journalId&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;// journalTransData = _journalForm.JournalTransData();&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;// if (journalTransData)&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;// journalCheckPost_Mov.parmVoucher(journalTransData.journalTrans().voucher);&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt; journalCheckPost_Mov;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;case&lt;/span&gt; InventJournalType::&lt;span class="me2"&gt;TagCounting&lt;/span&gt;:
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; journalCheckPost = InventJournalCheckPost_Tag::&lt;span class="me2"&gt;newJournalCheckPost&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;false&lt;/span&gt;, &lt;span class="kw2"&gt;true&lt;/span&gt;, JournalCheckPostType::&lt;span class="me2"&gt;Post&lt;/span&gt;, _inventJournalTable.&lt;span class="me1"&gt;tableId&lt;/span&gt;, &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; _inventJournalTable.&lt;span class="me1"&gt;journalId&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt; journalCheckPost_Tag;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; inventJournalTable = InventJournalTable::&lt;span class="me2"&gt;find&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;inventJournalId&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;inventJournalTable&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;// Posting start. According to \Classes\InventJournalCheckPost&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;// journalForm.runbaseMainStart();&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; journalTableData::&lt;span class="me2"&gt;updateBlockServer&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; inventJournalTable, JournalBlockLevel::&lt;span class="me2"&gt;None&lt;/span&gt;, JournalBlockLevel::&lt;span class="me2"&gt;System&lt;/span&gt;, &lt;span class="kw2"&gt;false&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; journalCheckPost = getJournalCheckPost&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;inventJournalTable&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;!journalCheckPost.&lt;span class="me1"&gt;PROMPT&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;! journalCheckPost.&lt;span class="me1"&gt;BatchInfo&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;.&lt;span class="me1"&gt;parmBatchExecute&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;// journalForm.runbaseMainCancel();&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; journalTableData::&lt;span class="me2"&gt;updateBlockServer&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; inventJournalTable, JournalBlockLevel::&lt;span class="me2"&gt;System&lt;/span&gt;, JournalBlockLevel::&lt;span class="me2"&gt;None&lt;/span&gt;, &lt;span class="kw2"&gt;false&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;try&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; journalCheckPost.&lt;span class="me1"&gt;run&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;// journalForm.runbaseMainEnd(journalCheckPost,false);&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; journalTableData::&lt;span class="me2"&gt;updateBlockServer&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; inventJournalTable, JournalBlockLevel::&lt;span class="me2"&gt;System&lt;/span&gt;, JournalBlockLevel::&lt;span class="me2"&gt;None&lt;/span&gt;, &lt;span class="kw2"&gt;false&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; catch &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;Exception::&lt;span class="me2"&gt;Error&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;// journalForm.runbaseMainEnd(journalCheckPost,true);&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; journalTableData::&lt;span class="me2"&gt;updateBlockServer&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; inventJournalTable, JournalBlockLevel::&lt;span class="me2"&gt;System&lt;/span&gt;, JournalBlockLevel::&lt;span class="me2"&gt;None&lt;/span&gt;, &lt;span class="kw2"&gt;true&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;// Posting end&lt;/span&gt;
&amp;nbsp;}&lt;/pre&gt;

&lt;pre class="foot"&gt;Copyright © 2008 Ruslan Goncharov&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8929482477382507970-8989364463192732010?l=rusgon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rusgon.blogspot.com/feeds/8989364463192732010/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8929482477382507970&amp;postID=8989364463192732010' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8929482477382507970/posts/default/8989364463192732010'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8929482477382507970/posts/default/8989364463192732010'/><link rel='alternate' type='text/html' href='http://rusgon.blogspot.com/2008/02/posting-inventjournal-from-x.html' title='Posting InventJournal from X++'/><author><name>Ruslan Goncharov</name><uri>http://www.blogger.com/profile/16144278259112759869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://bp1.blogger.com/_2cRBcMvuiG4/R2eKi4QRYDI/AAAAAAAAAAM/X5f025zSGhQ/S220/ruslan.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8929482477382507970.post-7643971634817225303</id><published>2008-02-09T16:53:00.001+02:00</published><updated>2008-07-31T17:13:29.363+03:00</updated><title type='text'>Quick sorting in info messages</title><content type='html'>&lt;p&gt;Sometimes developer face the problem formatting of information messages to user, namely how to sort any items in message especially without duplications. Don't design own sorting algorhytms indeed. 

&lt;p&gt;Let's use class Set. The question is toString() method automatically sorts the values and supresses duplicate values.

&lt;p&gt;Following job illustrates how to prepate formatting message using toString() method.

&lt;pre class="code" style="height:auto;"&gt;&lt;span class="kw2"&gt;static&lt;/span&gt; &lt;span class="kw1"&gt;void&lt;/span&gt; JobSetSorting&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;Args _args&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;str&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; out;
&amp;nbsp; &amp;nbsp; set &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; is = &lt;span class="kw2"&gt;new&lt;/span&gt; set &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;types::&lt;span class="kw1"&gt;Real&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; ;

&amp;nbsp; &amp;nbsp; is.&lt;span class="me1"&gt;add&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="nu0"&gt;0.5&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; is.&lt;span class="me1"&gt;add&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="nu0"&gt;1.25&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; is.&lt;span class="me1"&gt;add&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="nu0"&gt;1.0&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; is.&lt;span class="me1"&gt;add&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="nu0"&gt;3.0&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; is.&lt;span class="me1"&gt;add&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="nu0"&gt;0.5&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; out = is.&lt;span class="me1"&gt;toString&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; out = strReplace&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;out,&lt;span class="st0"&gt;&amp;quot;{&amp;quot;&lt;/span&gt;, &lt;span class="st0"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; out = strReplace&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;out,&lt;span class="st0"&gt;&amp;quot;}&amp;quot;&lt;/span&gt;, &lt;span class="st0"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;//out = strReplace(out,&amp;quot;,&amp;quot;, &amp;quot;/&amp;quot;);&lt;/span&gt;

&amp;nbsp; &amp;nbsp; box::&lt;span class="me2"&gt;info&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;&amp;quot;In fact: &amp;quot;&lt;/span&gt;+out&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&lt;/pre&gt;

&lt;pre class="foot"&gt;Copyright © 2008 Ruslan Goncharov&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8929482477382507970-7643971634817225303?l=rusgon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rusgon.blogspot.com/feeds/7643971634817225303/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8929482477382507970&amp;postID=7643971634817225303' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8929482477382507970/posts/default/7643971634817225303'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8929482477382507970/posts/default/7643971634817225303'/><link rel='alternate' type='text/html' href='http://rusgon.blogspot.com/2008/02/quick-sorting-in-info-messages.html' title='Quick sorting in info messages'/><author><name>Ruslan Goncharov</name><uri>http://www.blogger.com/profile/16144278259112759869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://bp1.blogger.com/_2cRBcMvuiG4/R2eKi4QRYDI/AAAAAAAAAAM/X5f025zSGhQ/S220/ruslan.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8929482477382507970.post-4964352348232978950</id><published>2008-01-26T15:58:00.001+02:00</published><updated>2008-07-31T17:13:54.201+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SysUsersSendMessage'/><title type='text'>Sending message to user</title><content type='html'>Following job illustrates how to send message to user in AX 3.0

&lt;pre class="code" style="height:275px;"&gt;&lt;span class="kw2"&gt;static&lt;/span&gt; &lt;span class="kw1"&gt;void&lt;/span&gt; JobSendMessage&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;Args _args&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; AOSSessionInfo &amp;nbsp;testSession;

&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;int&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; counter;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;int&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; maxSessions;

&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;container&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; users;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;int&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sesId;
&amp;nbsp; &amp;nbsp; userId &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;userId;
&amp;nbsp; &amp;nbsp; ClientType &amp;nbsp; &amp;nbsp; &amp;nbsp;clientKind;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;date&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;logindate;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;int&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; logintime;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;str&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; clientComputerName;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;str&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; databaseSpid;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;str&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; itemSTr;
&amp;nbsp; &amp;nbsp; userName &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;userName;
&amp;nbsp; &amp;nbsp; AOSClientMode &amp;nbsp; clientMode;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;int&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sessionCount;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;int&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; idleTicks;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;str&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; recipient = &lt;span class="kw3"&gt;curuserid&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;span class="co1"&gt;// place here addressee userid&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;int&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; recSesId = &lt;span class="nu0"&gt;-1&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; ;

&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#91;&lt;/span&gt; users, maxSessions &lt;span class="br0"&gt;&amp;#93;&lt;/span&gt; = SysUsersOnline::&lt;span class="me2"&gt;getAllOnlineUserInfo&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;for&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;counter = &lt;span class="nu0"&gt;1&lt;/span&gt;; counter &amp;lt;= maxSessions; counter++&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#91;&lt;/span&gt; &amp;nbsp; sesId,
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; userId,
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; clientKind,
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; loginDate,
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; loginTime,
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; clientComputerName,
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; databaseSpid,
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; userName,
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; clientMode,
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; idleTicks
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#93;&lt;/span&gt; = &lt;span class="kw3"&gt;conPeek&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;users, counter&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="kw2"&gt; if&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;userId == recipient&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; recSesId = sesId;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;break&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;

&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;recsesId != &lt;span class="nu0"&gt;-1&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; testSession = &lt;span class="kw2"&gt;new&lt;/span&gt; AOSSessionInfo&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;recsesId&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;testSession&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; AOSSessionInfo::&lt;span class="me2"&gt;sendMessage&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;recsesId, &lt;span class="kw3"&gt;strfmt&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;&amp;quot;@SYS55325&amp;quot;&lt;/span&gt;, &lt;span class="kw3"&gt;curuserid&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;, &lt;span class="kw3"&gt;time2str&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw3"&gt;timenow&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;,&lt;span class="nu0"&gt;0&lt;/span&gt;,&lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="st0"&gt;&amp;quot;Hello!&amp;quot;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; box::&lt;span class="me2"&gt;info&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;&amp;quot;Delievered&amp;quot;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;else&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;throw&lt;/span&gt; error&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span  class="kw3"&gt;strFmt&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;&amp;quot;User %1 is offline.&amp;quot;&lt;/span&gt;, recipient&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;
&lt;br /&gt;
Borrowed from \Menu Items\Action\SysUsersSendMessage
&lt;br /&gt;
Involved classes:&lt;br /&gt;
\Classes\SysUsersSendMessage&lt;br /&gt;
\Classes\SysUsersOnline

&lt;pre class="foot"&gt;Copyright © 2008 Ruslan Goncharov&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8929482477382507970-4964352348232978950?l=rusgon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rusgon.blogspot.com/feeds/4964352348232978950/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8929482477382507970&amp;postID=4964352348232978950' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8929482477382507970/posts/default/4964352348232978950'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8929482477382507970/posts/default/4964352348232978950'/><link rel='alternate' type='text/html' href='http://rusgon.blogspot.com/2008/01/sending-message-to-user.html' title='Sending message to user'/><author><name>Ruslan Goncharov</name><uri>http://www.blogger.com/profile/16144278259112759869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://bp1.blogger.com/_2cRBcMvuiG4/R2eKi4QRYDI/AAAAAAAAAAM/X5f025zSGhQ/S220/ruslan.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8929482477382507970.post-5973342686646753617</id><published>2008-01-17T10:56:00.001+02:00</published><updated>2008-07-31T17:14:18.752+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cross-reference'/><title type='text'>How to clarify what happened with variables in AX</title><content type='html'>In &lt;a href="http://www.microsoft.com/Businesssolutions/Community/NewsGroups/dgbrowser/en-us/default.mspx?dg=microsoft.public.axapta.programming"&gt;microsoft.public.axapta.programming&lt;/a&gt; group
Arjang in subject "Finding the lookup table of a lookup field" asked how to find 
out what is the look up table used to display the values for SalesTable.SalesStatus filed.

&lt;p&gt;I've suggested look at SalesTableType and SalesLineType classes. The next question was how did I pointed at these classes.
&lt;p&gt;Unfortunately I can't reply in the newsgroup at the moment (something wrong with the newsgroup or my browser), so I've decided to answer here in my blog.

&lt;p&gt;Actually in AOT you may find out a huge chunk of information about tables, classes, enumerations etc. In case of SalesTable.SalesStatus field first of all I've decided to look at SalesTable Methods AOT node (just clicked Search [SalesStatus]). Looking at table's methods we may get a lot of useful information.

&lt;p&gt;The second step was the searching of SalesStatus text in Classes.

&lt;p&gt;By the way don't forget about &lt;em&gt;cross-references&lt;/em&gt;. The cross-reference is important tool when you develop or debug Dynamics Ax.

&lt;pre class="foot"&gt;Copyright © 2008 Ruslan Goncharov&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8929482477382507970-5973342686646753617?l=rusgon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rusgon.blogspot.com/feeds/5973342686646753617/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8929482477382507970&amp;postID=5973342686646753617' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8929482477382507970/posts/default/5973342686646753617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8929482477382507970/posts/default/5973342686646753617'/><link rel='alternate' type='text/html' href='http://rusgon.blogspot.com/2008/01/how-to-clarify-what-happened-with.html' title='How to clarify what happened with variables in AX'/><author><name>Ruslan Goncharov</name><uri>http://www.blogger.com/profile/16144278259112759869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://bp1.blogger.com/_2cRBcMvuiG4/R2eKi4QRYDI/AAAAAAAAAAM/X5f025zSGhQ/S220/ruslan.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8929482477382507970.post-7481784167336693287</id><published>2008-01-12T10:54:00.001+02:00</published><updated>2008-07-31T17:16:12.297+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tutorial_Form_Capture'/><title type='text'>How to get the screenshots of all open windows in AX</title><content type='html'>This job allows get screenshots of all currently open windows in Axapta.
It based on idea published in &lt;a href="http://rusgon.blogspot.com/2007/12/how-to-get-list-of-all-open-windows-in.html"&gt;How to get list of all open windows and their names in AX&lt;/a&gt;

&lt;pre class="code" style="height:275px;"&gt;&lt;span class="kw2"&gt;static&lt;/span&gt; &lt;span class="kw1"&gt;void&lt;/span&gt; JobAllTheWindowsScreenshots&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;Args _args&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; #define.&lt;span class="me1"&gt;screenshotFolder&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'q:&lt;span class="es0"&gt;\\&lt;/span&gt;capture&lt;span class="es0"&gt;\\&lt;/span&gt;'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; hWnd Parent;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; hWnd handle;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; hWnd mdi;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; #WinApi

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dialog d = &lt;span class="kw2"&gt;new&lt;/span&gt; Dialog&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; DialogTabPage dt;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;str&lt;/span&gt; text;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;// retrieves the visibility state of the specified window --&amp;gt;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; DLL _DLL = &lt;span class="kw2"&gt;new&lt;/span&gt; DLL&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'USER32'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; DLLFunction _isWindowVisible = &lt;span class="kw2"&gt;new&lt;/span&gt; DLLFunction&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;_DLL, &lt;span class="st0"&gt;'IsWindowVisible'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;// retrieves the visibility state of the specified window &amp;lt;--&lt;/span&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;container&lt;/span&gt; cHWnd;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;int&lt;/span&gt; i;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;void&lt;/span&gt; addTab&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;text&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dt = d.&lt;span class="me1"&gt;addTabPage&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;text&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; d.&lt;span class="me1"&gt;addText&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;text&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cHWnd+=handle;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fileName getSaveName&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;identifiername name&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt; #screenshotFolder + name + &lt;span class="st0"&gt;&amp;quot;.bmp&amp;quot;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;void&lt;/span&gt; captureForm&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Image image = &lt;span class="kw2"&gt;new&lt;/span&gt; Image&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;// Take a screenshoot of the form&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; image.&lt;span class="me1"&gt;captureWindow&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;handle&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;// reduce the colors (bits/pixel)&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; image.&lt;span class="me1"&gt;reduceColorOctree&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw2"&gt;FALSE&lt;/span&gt;,&lt;span class="nu0"&gt;256&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;// Save it as bitmap&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; image.&lt;span class="me1"&gt;saveImage&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;getSaveName&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;text&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;, ImageSaveType::&lt;span class="me2"&gt;BMP_UNCOMP&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; d.&lt;span class="me1"&gt;caption&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;&amp;quot;All the windows&amp;quot;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; d.&lt;span class="me1"&gt;windowType&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;FormWindowType::&lt;span class="me2"&gt;PopUp&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Parent = infolog.&lt;span class="me1"&gt;hWnd&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mdi = WinApi::&lt;span class="me2"&gt;getWindow&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;Parent, #GW_CHILD&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; handle = WinApi::&lt;span class="me2"&gt;getWindow&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;mdi, #GW_CHILD&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; text = WinApi::&lt;span class="me2"&gt;getWindowText&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;handle&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; addTab&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;handle&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;while&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;handle&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; handle = WinApi::&lt;span class="me2"&gt;getWindow&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;handle, #GW_HWNDNEXT&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; text = WinApi::&lt;span class="me2"&gt;getWindowText&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;handle&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; addTab&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;// retrieves the visibility state of the specified window --&amp;gt;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; _isWindowVisible.&lt;span class="me1"&gt;returns&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;ExtTypes::&lt;span class="me2"&gt;DWord&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; _isWindowVisible.&lt;span class="me1"&gt;arg&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;ExtTypes::&lt;span class="me2"&gt;DWord&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;// retrieves the visibility state of the specified window &amp;lt;--&lt;/span&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;for&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;i=&lt;span class="nu0"&gt;1&lt;/span&gt;; i&amp;lt;=&lt;span class="kw3"&gt;conlen&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;cHWnd&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;; i++&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; handle = &lt;span class="kw3"&gt;conPeek&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;cHWnd, i&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt; _isWindowVisible.&lt;span class="me1"&gt;call&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;handle&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; infolog.&lt;span class="me1"&gt;activateWindow&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;handle&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; WinApi::&lt;span class="me2"&gt;updateWindow&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;handle&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; text = &lt;span class="kw3"&gt;strFmt&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'%1 %2'&lt;/span&gt;, i, &lt;span class="kw3"&gt;strRem&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;WinApi::&lt;span class="me2"&gt;getWindowText&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;handle&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;, &lt;span class="st0"&gt;'&lt;span class="es0"&gt;\\&lt;/span&gt;/:*?&amp;quot;&amp;lt;&amp;gt;|'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; captureForm&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; d.&lt;span class="me1"&gt;run&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;&lt;/pre&gt;

&lt;strong&gt;Note&lt;/strong&gt; #screenshotFolder definition sets the path to the folder where screenshot collection is storing, so you have to adjusting your path on you own.

&lt;pre class="foot"&gt;Copyright © 2008 Ruslan Goncharov&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8929482477382507970-7481784167336693287?l=rusgon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rusgon.blogspot.com/feeds/7481784167336693287/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8929482477382507970&amp;postID=7481784167336693287' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8929482477382507970/posts/default/7481784167336693287'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8929482477382507970/posts/default/7481784167336693287'/><link rel='alternate' type='text/html' href='http://rusgon.blogspot.com/2008/01/how-to-get-screenshots-of-all-open.html' title='How to get the screenshots of all open windows in AX'/><author><name>Ruslan Goncharov</name><uri>http://www.blogger.com/profile/16144278259112759869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://bp1.blogger.com/_2cRBcMvuiG4/R2eKi4QRYDI/AAAAAAAAAAM/X5f025zSGhQ/S220/ruslan.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8929482477382507970.post-5963286863854729561</id><published>2008-01-09T15:52:00.001+02:00</published><updated>2008-07-31T17:18:19.380+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Attractor'/><title type='text'>Lorenz attractor</title><content type='html'>&lt;a href="http://2.bp.blogspot.com/_2cRBcMvuiG4/R4TUqoQRYJI/AAAAAAAAABM/lWcNEqC0Qak/s1600-h/LorenzAttractor.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_2cRBcMvuiG4/R4TUqoQRYJI/AAAAAAAAABM/lWcNEqC0Qak/s320/LorenzAttractor.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5153477702443950226" /&gt;&lt;/a&gt;











&lt;a href="http://en.wikipedia.org/wiki/Lorenz_attractor"&gt;The Lorenz attractor&lt;/a&gt; is a set of differential equations which are popular in the field of Chaos.



Following job visualize Lorenz attractor:
&lt;pre class="code" style="height:275px;"&gt;&lt;span class="kw2"&gt;static&lt;/span&gt; &lt;span class="kw1"&gt;void&lt;/span&gt; JobLorenzAttractor&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;Args _args&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; #define.&lt;span class="me1"&gt;iterations&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="nu0"&gt;1000000&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; #define.&lt;span class="me1"&gt;sigma&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="nu0"&gt;5&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; #define.&lt;span class="me1"&gt;r&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="nu0"&gt;15&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; #define.&lt;span class="me1"&gt;b&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; #define.&lt;span class="me1"&gt;imageSizeX&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="nu0"&gt;300&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; #define.&lt;span class="me1"&gt;imageSizeY&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="nu0"&gt;300&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Form&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; form;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; FormRun &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; formRun;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; FormDesign &amp;nbsp; &amp;nbsp; &amp;nbsp;formDesign;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Args &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; args;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; FormBuildDesign formBuildDesign;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; FormBuildWindowControl formBuildWindowControl;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; FormWindowControl pane;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Image image = &lt;span class="kw2"&gt;new&lt;/span&gt; Image&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;void&lt;/span&gt; DrawAttractor&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;real&lt;/span&gt; x, y, z;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;int&lt;/span&gt; color;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;real&lt;/span&gt; t;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;real&lt;/span&gt; x1, y1, z1;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;real&lt;/span&gt; dt;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;int&lt;/span&gt; _x, _y;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; color = 0xFF00;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; x = &lt;span class="nu0"&gt;3.051522&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; y = &lt;span class="nu0"&gt;1.582542&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; z = &lt;span class="nu0"&gt;15.62388&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dt = &lt;span class="nu0"&gt;0.0001&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;for&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;t=&lt;span class="nu0"&gt;0&lt;/span&gt;; t&amp;lt;#iterations; t++&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; x1 = x + #sigma*&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;y-x&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;*dt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; y1 = y + &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;#r*x-y-z*x&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;*dt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; z1 = z + &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;x*y-#b*z&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;*dt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; x = x1; y = y1; z = z1;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; _x = &lt;span class="nu0"&gt;16&lt;/span&gt;*&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;y - x*&lt;span class="nu0"&gt;0.292893&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; + &lt;span class="nu0"&gt;150&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; _y =&lt;span class="nu0"&gt;-13&lt;/span&gt;*&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;z + x*&lt;span class="nu0"&gt;0.292893&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; + &lt;span class="nu0"&gt;330&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;_x&amp;gt;&lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&amp;amp;&amp;amp;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;_x&amp;lt;#imageSizeX&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&amp;amp;&amp;amp;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;_y&amp;gt;&lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&amp;amp;&amp;amp;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;_y&amp;lt;#imageSizeY&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; image.&lt;span class="me1"&gt;setPixel&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;_x,_y, color&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;span class="co1"&gt;// + (t div 1000));&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; form = &lt;span class="kw2"&gt;new&lt;/span&gt; Form&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; formBuildDesign = form.&lt;span class="me1"&gt;addDesign&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'design'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; formBuildDesign.&lt;span class="me1"&gt;hideToolbar&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw2"&gt;true&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; formBuildDesign.&lt;span class="me1"&gt;columns&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; formBuildDesign.&lt;span class="me1"&gt;topMode&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;; &lt;span class="co1"&gt;// Auto&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; formBuildDesign.&lt;span class="me1"&gt;leftMode&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;; &lt;span class="co1"&gt;// Auto&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; formBuildDesign.&lt;span class="me1"&gt;widthMode&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;; &lt;span class="co1"&gt;// Auto&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; formBuildDesign.&lt;span class="me1"&gt;heightMode&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;; &lt;span class="co1"&gt;// Auto&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; formBuildDesign.&lt;span class="me1"&gt;width&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="nu0"&gt;1.4&lt;/span&gt;*#imageSizeX&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; formBuildWindowControl = formBuildDesign.&lt;span class="me1"&gt;addControl&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;FormControlType::&lt;span class="me2"&gt;IMAGE&lt;/span&gt;, &lt;span class="st0"&gt;'pane'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; formBuildWindowControl.&lt;span class="me1"&gt;height&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;#imageSizeY&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; formBuildWindowControl.&lt;span class="me1"&gt;width&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;#imageSizeX&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; formBuildWindowControl.&lt;span class="me1"&gt;backgroundColor&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; args = &lt;span class="kw2"&gt;new&lt;/span&gt; Args&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; args.&lt;span class="me1"&gt;object&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;form&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; formRun = classFactory.&lt;span class="me1"&gt;formRunClass&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;args&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; formRun.&lt;span class="me1"&gt;init&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; formRun.&lt;span class="me1"&gt;resetSize&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; formDesign = formRun.&lt;span class="me1"&gt;design&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; formRun.&lt;span class="me1"&gt;resetSize&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; formrun.&lt;span class="me1"&gt;formOnTop&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; formRun.&lt;span class="me1"&gt;run&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;


&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; formRun.&lt;span class="me1"&gt;design&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;.&lt;span class="me1"&gt;caption&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'Lorenz attractor'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pane = formRun.&lt;span class="me1"&gt;control&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;formBuildWindowControl.&lt;span class="me1"&gt;id&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; image.&lt;span class="me1"&gt;saveType&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;ImageSaveType::&lt;span class="me2"&gt;BMP_UNCOMP&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; image.&lt;span class="me1"&gt;createImage&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;#imageSizeX, #imageSizeY, &lt;span class="nu0"&gt;24&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; DrawAttractor&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pane.&lt;span class="me1"&gt;image&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;image&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; formRun.&lt;span class="me1"&gt;design&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;.&lt;span class="me1"&gt;caption&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw3"&gt;strFmt&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'Lorenz attractor - sigma: %1, r: %2, b: %3, iterations: %4'&lt;/span&gt;,
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; #sigma, #r, #b, #iterations&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; formRun.&lt;span class="me1"&gt;wait&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&lt;/pre&gt;
&lt;strong&gt;Note&lt;/strong&gt;: in the job the number of iterations is equal one million by default, so it takes several minutes to see the result.

You may change parameters &lt;em&gt;sigma, r, b &lt;/em&gt;and &lt;em&gt;iterations&lt;/em&gt; and enjoy the behaviour of attractor.

&lt;pre class="foot"&gt;Copyright © 2008 Ruslan Goncharov&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8929482477382507970-5963286863854729561?l=rusgon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rusgon.blogspot.com/feeds/5963286863854729561/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8929482477382507970&amp;postID=5963286863854729561' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8929482477382507970/posts/default/5963286863854729561'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8929482477382507970/posts/default/5963286863854729561'/><link rel='alternate' type='text/html' href='http://rusgon.blogspot.com/2008/01/lorenz-attractor-in-ax.html' title='Lorenz attractor'/><author><name>Ruslan Goncharov</name><uri>http://www.blogger.com/profile/16144278259112759869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://bp1.blogger.com/_2cRBcMvuiG4/R2eKi4QRYDI/AAAAAAAAAAM/X5f025zSGhQ/S220/ruslan.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_2cRBcMvuiG4/R4TUqoQRYJI/AAAAAAAAABM/lWcNEqC0Qak/s72-c/LorenzAttractor.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8929482477382507970.post-4146941442566490916</id><published>2007-12-28T14:08:00.000+02:00</published><updated>2008-01-18T17:14:36.036+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Infolog'/><title type='text'>How to get list of all open windows and their names in AX</title><content type='html'>How to get list of all open windows and their names in AX. 
Just run following job. 
&lt;pre class="code" style="height:275px;"&gt;&lt;span class="kw2"&gt;static&lt;/span&gt; &lt;span class="kw1"&gt;void&lt;/span&gt; JobAllTheWindows&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;Args _args&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; hWnd Parent;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; hWnd handle;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; hWnd mdi;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; #WinApi

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dialog d = &lt;span class="kw2"&gt;new&lt;/span&gt; Dialog&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; DialogTabPage dt;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;str&lt;/span&gt; text;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; d.&lt;span class="me1"&gt;caption&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;&amp;quot;All the windows&amp;quot;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; d.&lt;span class="me1"&gt;windowType&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;FormWindowType::&lt;span class="me2"&gt;PopUp&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Parent = infolog.&lt;span class="me1"&gt;hWnd&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mdi = WinApi::&lt;span class="me2"&gt;getWindow&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;Parent, #GW_CHILD&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; handle = WinApi::&lt;span class="me2"&gt;getWindow&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;mdi, #GW_CHILD&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; text = WinApi::&lt;span class="me2"&gt;getWindowText&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;handle&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;text&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dt = d.&lt;span class="me1"&gt;addTabPage&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;text&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; d.&lt;span class="me1"&gt;addText&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;text&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;handle&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;while&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;handle&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; handle = WinApi::&lt;span class="me2"&gt;getWindow&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;handle, #GW_HWNDNEXT&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; text = WinApi::&lt;span class="me2"&gt;getWindowText&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;handle&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;text&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dt = d.&lt;span class="me1"&gt;addTabPage&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;text&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; d.&lt;span class="me1"&gt;addText&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;text&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; d.&lt;span class="me1"&gt;run&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;

An interesting observation: as a matter of fact Infolog window is open always, even if we not see it at the moment!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8929482477382507970-4146941442566490916?l=rusgon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rusgon.blogspot.com/feeds/4146941442566490916/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8929482477382507970&amp;postID=4146941442566490916' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8929482477382507970/posts/default/4146941442566490916'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8929482477382507970/posts/default/4146941442566490916'/><link rel='alternate' type='text/html' href='http://rusgon.blogspot.com/2007/12/how-to-get-list-of-all-open-windows-in.html' title='How to get list of all open windows and their names in AX'/><author><name>Ruslan Goncharov</name><uri>http://www.blogger.com/profile/16144278259112759869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://bp1.blogger.com/_2cRBcMvuiG4/R2eKi4QRYDI/AAAAAAAAAAM/X5f025zSGhQ/S220/ruslan.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8929482477382507970.post-4996755742143341656</id><published>2007-12-21T17:41:00.000+02:00</published><updated>2008-01-20T13:12:48.780+02:00</updated><title type='text'>Mandatory property for DialogField</title><content type='html'>Usually in Dialog Forms it's unable to set mandatory property for Dialog Fields. The lack of this property 
sometimes annoyed me. At the end I've decided to eliminate this gap :-)

To expand the standard functionality you need to do the following steps:

1.Add mandatory() method into DialogField class: 

&lt;pre class="code" style=""&gt;&lt;span class="kw1"&gt;void&lt;/span&gt; mandatory&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw1"&gt;boolean&lt;/span&gt; r&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;str&lt;/span&gt; name;

&amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;// If properties exists then we are on server&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;properties&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; name = #Propertymandatory;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;! properties.&lt;span class="kw4"&gt;exists&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;name&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; properties.&lt;span class="me1"&gt;add&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;name,&lt;span class="kw2"&gt;true&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; properties.&lt;span class="me1"&gt;value&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;name,r&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;else&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.&lt;span class="me1"&gt;fieldControl&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;.&lt;span class="me1"&gt;mandatory&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;r&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;

2. Add into unpack() method following lines: 
&lt;pre class="code" style=""&gt;&lt;span class="kw2"&gt;case&lt;/span&gt; #PropertyMandatory:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.&lt;span class="me1"&gt;mandatory&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;unpackedProperties.&lt;span class="me1"&gt;valueIndex&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;i&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&lt;span class="kw2"&gt;break&lt;/span&gt;;&lt;/pre&gt;
Now you may enjoy mandatory property in Dialog Forms.

This trick published in &lt;a href="http://www.axaptapedia.com/Mandatory_DialogField"&gt;Axaptapedia&lt;/a&gt; too.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8929482477382507970-4996755742143341656?l=rusgon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rusgon.blogspot.com/feeds/4996755742143341656/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8929482477382507970&amp;postID=4996755742143341656' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8929482477382507970/posts/default/4996755742143341656'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8929482477382507970/posts/default/4996755742143341656'/><link rel='alternate' type='text/html' href='http://rusgon.blogspot.com/2007/12/mandatory-property-for-dialogfield.html' title='Mandatory property for DialogField'/><author><name>Ruslan Goncharov</name><uri>http://www.blogger.com/profile/16144278259112759869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://bp1.blogger.com/_2cRBcMvuiG4/R2eKi4QRYDI/AAAAAAAAAAM/X5f025zSGhQ/S220/ruslan.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8929482477382507970.post-2393283339602307895</id><published>2007-12-19T13:31:00.001+02:00</published><updated>2008-07-31T17:18:46.911+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='QueryBrowser'/><category scheme='http://www.blogger.com/atom/ns#' term='DEV_QueryBrowser'/><category scheme='http://www.blogger.com/atom/ns#' term='Axaptapedia'/><title type='text'>QueryBrowser</title><content type='html'>&lt;a href="http://1.bp.blogspot.com/_2cRBcMvuiG4/R2kCjIQRYFI/AAAAAAAAAAY/5CfxJ907FU4/s1600-h/QueryBrowser_SQL.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5145646851781910610" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://1.bp.blogspot.com/_2cRBcMvuiG4/R2kCjIQRYFI/AAAAAAAAAAY/5CfxJ907FU4/s320/QueryBrowser_SQL.jpg" border="0" /&gt;&lt;/a&gt;
&lt;div&gt;&lt;span style="font-family:arial;"&gt;The tool I've developed allows browse queries from &lt;/span&gt;&lt;a title="AOT" href="http://www.axaptapedia.com/AOT"&gt;&lt;span style="font-family:arial;"&gt;AOT&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;"&gt; or custom queries as such as TableBrowser works.&lt;/span&gt;

&lt;div&gt;&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;/div&gt;

&lt;div&gt;&lt;/div&gt;&lt;/div&gt;
Visit axaptapedia to download &lt;a href="http://www.axaptapedia.com/DEV_QueryBrowser"&gt;QueryBrowser&lt;/a&gt;

&lt;pre class="foot"&gt;Copyright © 2007 Ruslan Goncharov&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8929482477382507970-2393283339602307895?l=rusgon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rusgon.blogspot.com/feeds/2393283339602307895/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8929482477382507970&amp;postID=2393283339602307895' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8929482477382507970/posts/default/2393283339602307895'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8929482477382507970/posts/default/2393283339602307895'/><link rel='alternate' type='text/html' href='http://rusgon.blogspot.com/2007/12/querybrowser.html' title='QueryBrowser'/><author><name>Ruslan Goncharov</name><uri>http://www.blogger.com/profile/16144278259112759869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://bp1.blogger.com/_2cRBcMvuiG4/R2eKi4QRYDI/AAAAAAAAAAM/X5f025zSGhQ/S220/ruslan.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_2cRBcMvuiG4/R2kCjIQRYFI/AAAAAAAAAAY/5CfxJ907FU4/s72-c/QueryBrowser_SQL.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8929482477382507970.post-277115065235035861</id><published>2007-12-19T10:06:00.000+02:00</published><updated>2008-01-18T17:36:41.022+02:00</updated><title type='text'>How to add a document into AX programmically (Document handling)</title><content type='html'>&lt;span style="font-family:arial;"&gt;As a matter of fact it's pretty easy.
Following lines allow you do this.&lt;/span&gt;

&lt;pre class="code" style="height:275px;"&gt;&lt;span class="kw1"&gt;void&lt;/span&gt; saveIntoDocuRefTable&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; DocuValue docuValue;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; DocuRef docuRef;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;Container&lt;/span&gt; cFile;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; BinData binData;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; DocuTypeId _docuTypeId = ...;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; binData = &lt;span class="kw2"&gt;new&lt;/span&gt; BinData&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; binData.&lt;span class="me1"&gt;loadFile&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;fileName&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cFile = Docu::&lt;span class="me2"&gt;splitFileName&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;fileName&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; docuValue.&lt;span class="me1"&gt;fileName&lt;/span&gt; = &lt;span class="kw3"&gt;conpeek&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;cFile,&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; docuValue.&lt;span class="me1"&gt;path&lt;/span&gt; = &lt;span class="kw3"&gt;conpeek&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;cFile,&lt;span class="nu0"&gt;3&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; docuValue.&lt;span class="me1"&gt;fileType&lt;/span&gt; = &lt;span class="kw3"&gt;conpeek&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;cFile,&lt;span class="nu0"&gt;2&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; docuValue.&lt;span class="me1"&gt;File&lt;/span&gt; = binData.&lt;span class="me1"&gt;getData&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; docuValue.&lt;span class="me1"&gt;insert&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; docuRef.&lt;span class="me1"&gt;ValueRecId&lt;/span&gt; = docuValue.&lt;span class="me1"&gt;recId&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; docuRef.&lt;span class="me1"&gt;RefCompanyId&lt;/span&gt; = &lt;span class="kw3"&gt;CurExt&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; docuRef.&lt;span class="me1"&gt;RefTableId&lt;/span&gt; = &lt;span class="kw3"&gt;tableNum&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;....&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; docuRef.&lt;span class="me1"&gt;RefRecId&lt;/span&gt; = .....;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; docuRef.&lt;span class="kw3"&gt;TypeId&lt;/span&gt; = _docuTypeId;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; docuRef.&lt;span class="me1"&gt;Name&lt;/span&gt; = fileName;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; docuRef.&lt;span class="me1"&gt;Notes&lt;/span&gt; = ....;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; docuRef.&lt;span class="me1"&gt;insert&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; WinApi::&lt;span class="me2"&gt;deleteFile&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;fileName&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8929482477382507970-277115065235035861?l=rusgon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rusgon.blogspot.com/feeds/277115065235035861/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8929482477382507970&amp;postID=277115065235035861' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8929482477382507970/posts/default/277115065235035861'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8929482477382507970/posts/default/277115065235035861'/><link rel='alternate' type='text/html' href='http://rusgon.blogspot.com/2007/12/how-to-add-document-into-ax.html' title='How to add a document into AX programmically (Document handling)'/><author><name>Ruslan Goncharov</name><uri>http://www.blogger.com/profile/16144278259112759869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://bp1.blogger.com/_2cRBcMvuiG4/R2eKi4QRYDI/AAAAAAAAAAM/X5f025zSGhQ/S220/ruslan.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8929482477382507970.post-5544082869085792619</id><published>2007-12-18T11:40:00.000+02:00</published><updated>2008-01-20T15:27:40.022+02:00</updated><title type='text'>Integration AX with side applications</title><content type='html'>The Microsoft Business Connector is the way to integrate AX with outside world. It allows the programmer to leverage existing Microsoft Axapta functionality in his favorite programming language. At the other hand AX has one powerful feature: enumerators. An enum is a list of literals, which can be used throughout the development environment in MorphX.

Really, in MorphX using enumerators very simple, e.g.:

&lt;pre class="code" style=""&gt;SalesStatus status; &lt;span class="co1"&gt;//Order status as to delivery and invoicing;&lt;/span&gt;
&lt;span class="kw2"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;status == SalesStatus::&lt;span class="me2"&gt;Invoiced&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
...
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;

There are two advantages:
it is an easy way to make an overall change in the system;
the code is easier to read;

Unfortunately, side application nothing "knows" about this AX feature. And we need to use constants directly in code!

&lt;pre class="code" style=""&gt;&lt;span class="kw2"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;status == &lt;span class="nu0"&gt;3&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="co1"&gt;//SalesStatus::Invoiced)&lt;/span&gt;
&lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
...
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;

Let's try to instruct side applications enums feature. The idea consists in asking AX directly what does construction SalesStatus::Invoiced mean.

To do this I've developed new DEV_DictTable class with some methods.

&lt;pre class="code" style=""&gt;&lt;span class="co1"&gt;// Created by GRR on 18.07.2007 for AX Connector&lt;/span&gt;
&lt;span class="kw2"&gt;class&lt;/span&gt; DEV_DictTable
&lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;

&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;

&lt;span class="co1"&gt;// Returns constant, where _enumName is enum's name; _enumSymbol - literal&lt;/span&gt;
&lt;span class="kw1"&gt;int&lt;/span&gt; getEnum&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;identifierName _enumName, &lt;span class="kw1"&gt;str&lt;/span&gt; 
_enumSymbol&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt; &lt;span class="kw2"&gt;new&lt;/span&gt; DictEnum&lt;span 
class="br0"&gt;&amp;#40;&lt;/span&gt;enumName2Id&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;_enumName&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;.&lt;span class="me1"&gt;symbol2Value&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;_enumSymbol&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;

An example how to use this class:

&lt;pre class="code" style=""&gt;dict = AX.&lt;span class="me1"&gt;CreateObject&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;&amp;quot;DEV_DictTable&amp;quot;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;; &lt;span class="co1"&gt;// A reference at our class&lt;/span&gt;
SalesStatus_Invoiced = dict.&lt;span class="me1"&gt;Call&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;&amp;quot;getEnum&amp;quot;&lt;/span&gt;, &lt;span class="st0"&gt;&amp;quot;SalesStatus&amp;quot;&lt;/span&gt;, &lt;span class="st0"&gt;&amp;quot;Invoiced&amp;quot;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;; &lt;span class="co1"&gt;// here we store our constant 3&lt;/span&gt;&lt;span class="co1"&gt;
//And now we may use SalesStatus::Invoiced in side application code --&amp;gt;&lt;/span&gt;
&lt;span class="kw2"&gt;if&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;status == SalesStatus_Invoiced&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
...
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;span class="co1"&gt;// &amp;lt;--&lt;/span&gt;&lt;/pre&gt;

There are some methods in DEV_DictTable class to improve integration's flexibility:

&lt;pre class="code" style="height:275px;"&gt;&lt;span class="co1"&gt;// gets enum label according enum name and specific value&lt;/span&gt;
&lt;span class="kw1"&gt;str&lt;/span&gt; getEnumLabel&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;identifierName _enumName, &lt;span class="kw1"&gt;int&lt;/span&gt; _value&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt; &lt;span class="kw2"&gt;new&lt;/span&gt; DictEnum&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;enumName2Id&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;_enumName&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;.&lt;span class="me1"&gt;value2Label&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;_value&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;

&lt;span class="co1"&gt;// gets fieldId according Axapta's tableName and fieldName&lt;/span&gt;
FieldId getFieldId&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw1"&gt;str&lt;/span&gt; tableName, &lt;span class="kw1"&gt;str&lt;/span&gt; fieldName&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; FieldId fieldId;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; DictField dictField;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; TableId tableId;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; tableId = &lt;span class="kw2"&gt;new&lt;/span&gt; SysDictTable&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw3"&gt;tableName2Id&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;tableName&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;.&lt;span class="me1"&gt;id&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dictField = &lt;span class="kw2"&gt;new&lt;/span&gt; DictField&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;tableid, &lt;span class="kw3"&gt;fieldName2Id&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;tableId, fieldName&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fieldId = dictField.&lt;span class="me1"&gt;id&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt; fieldId;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
&lt;span class="co1"&gt;// gets tableId according Axapta's tableName&lt;/span&gt;&lt;br /&gt;
TableId getTableId&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw1"&gt;str&lt;/span&gt; tableName&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;
&lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SysDictTable sysDictTable;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; TableId tableId;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sysDictTable = &lt;span class="kw2"&gt;new&lt;/span&gt; SysDictTable&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="kw3"&gt;tableName2Id&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;tableName&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; tableId = sysDictTable.&lt;span class="me1"&gt;id&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;return&lt;/span&gt; tableId;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8929482477382507970-5544082869085792619?l=rusgon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rusgon.blogspot.com/feeds/5544082869085792619/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8929482477382507970&amp;postID=5544082869085792619' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8929482477382507970/posts/default/5544082869085792619'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8929482477382507970/posts/default/5544082869085792619'/><link rel='alternate' type='text/html' href='http://rusgon.blogspot.com/2007/12/integration-ax-with-side-applications.html' title='Integration AX with side applications'/><author><name>Ruslan Goncharov</name><uri>http://www.blogger.com/profile/16144278259112759869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://bp1.blogger.com/_2cRBcMvuiG4/R2eKi4QRYDI/AAAAAAAAAAM/X5f025zSGhQ/S220/ruslan.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8929482477382507970.post-8831434289373295769</id><published>2007-12-18T10:40:00.020+02:00</published><updated>2008-07-31T16:44:04.789+03:00</updated><title type='text'>Hello Everybody!</title><content type='html'>Hello Everybody!&lt;br /&gt;&lt;br /&gt;In this blog I'd like to share with everyone who interested in and works with Dynamics AX useful tips and tricks.&lt;br /&gt;&lt;br /&gt;Hope it will be interesting information.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8929482477382507970-8831434289373295769?l=rusgon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rusgon.blogspot.com/feeds/8831434289373295769/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8929482477382507970&amp;postID=8831434289373295769' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8929482477382507970/posts/default/8831434289373295769'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8929482477382507970/posts/default/8831434289373295769'/><link rel='alternate' type='text/html' href='http://rusgon.blogspot.com/2007/12/hello-everybody.html' title='Hello Everybody!'/><author><name>Ruslan Goncharov</name><uri>http://www.blogger.com/profile/16144278259112759869</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://bp1.blogger.com/_2cRBcMvuiG4/R2eKi4QRYDI/AAAAAAAAAAM/X5f025zSGhQ/S220/ruslan.jpg'/></author><thr:total>0</thr:total></entry></feed>
