{"id":1335,"date":"2012-06-05T17:27:24","date_gmt":"2012-06-05T22:27:24","guid":{"rendered":"http:\/\/anvil-of-time.com\/wordpress\/?p=1335"},"modified":"2021-03-11T12:16:45","modified_gmt":"2021-03-11T17:16:45","slug":"powerbuilder-using-net-visual-controls-in-pb-classic-applications","status":"publish","type":"post","link":"https:\/\/anvil-of-time.com\/powerbuilder\/powerbuilder-using-net-visual-controls-in-pb-classic-applications\/","title":{"rendered":"PowerBuilder &#8211; Using .Net Visual Controls in PB Classic Applications"},"content":{"rendered":"<p>This article describes the techniques and code used during my presentations at the Carolina Code Camp 2012 and at the May 2012 meeting of the North Carolina PowerBuilder User Group.<\/p>\n<p>The techniques described here utilize Visual Basic .Net (coded in Visual Studio 2010) with the <a href=\"http:\/\/msdn.microsoft.com\/en-us\/vstudio\/bb419144\" target=\"_blank\" rel=\"noopener\">Interop Forms Toolkit<\/a> available from Microsoft. The Interop Forms Toolkit was originally intended as a &#8216;bridge&#8217; between the VB 6 world and VB .Net. It allows you to host any .Net control in any Win32 application that supports COM. The current version supports Visual Studio 2005, 2008, and 2010.<\/p>\n<p>In this example we are creating a horizontal track bar control to use in a PB application (PB12.5). Why not use the PB control you say? Well, we want one which allows us to control the background color.<\/p>\n<p>First create a project in Visual Studio and under &#8216;Visual Basic&#8217; &#8211; &#8216;Windows&#8217; choose the VB6 Interop UserControl. Give the control a meaningful name at the bottom, I picked &#8216;vb_trackbar&#8217;.<br \/>\n<a href=\"http:\/\/anvil-of-time.com\/wordpress\/wp-content\/uploads\/2012\/06\/dotnet-000.png\"><img loading=\"lazy\" class=\"aligncenter wp-image-1348 size-full\" title=\"dotnet 000\" src=\"https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-000.png\" alt=\"\" width=\"717\" height=\"637\" srcset=\"https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-000.png 717w, https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-000-300x266.png 300w, https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-000-150x133.png 150w\" sizes=\"(max-width: 717px) 100vw, 717px\" \/><\/a><\/p>\n<p>In the Solution Explorer you should see a number of components which are automatically created. Almost all the work is done in the &#8216;InterobUserControl.vb&#8217; element<br \/>\n<a href=\"http:\/\/anvil-of-time.com\/wordpress\/wp-content\/uploads\/2012\/06\/dotnet-001.png\"><img loading=\"lazy\" class=\"aligncenter wp-image-1349 size-full\" title=\"dotnet 001\" src=\"https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-001.png\" alt=\"\" width=\"281\" height=\"213\" srcset=\"https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-001.png 281w, https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-001-150x113.png 150w\" sizes=\"(max-width: 281px) 100vw, 281px\" \/><\/a><\/p>\n<p>Double click on the &#8216;InteropUserControl.vb&#8217; element to bring it up in design mode so the actual control can be built.<br \/>\n<a href=\"http:\/\/anvil-of-time.com\/wordpress\/wp-content\/uploads\/2012\/06\/dotnet-002.png\"><img loading=\"lazy\" class=\"aligncenter wp-image-1350 size-full\" title=\"dotnet 002\" src=\"https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-002.png\" alt=\"\" width=\"212\" height=\"218\" srcset=\"https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-002.png 212w, https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-002-145x150.png 145w\" sizes=\"(max-width: 212px) 100vw, 212px\" \/><\/a><br \/>\nChoose a Trackbar from the tools window in Visual Studio<br \/>\n<a href=\"http:\/\/anvil-of-time.com\/wordpress\/wp-content\/uploads\/2012\/06\/dotnet-003.png\"><img loading=\"lazy\" class=\"aligncenter wp-image-1351 size-full\" title=\"dotnet 003\" src=\"https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-003.png\" alt=\"\" width=\"385\" height=\"141\" srcset=\"https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-003.png 385w, https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-003-300x109.png 300w, https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-003-150x54.png 150w\" sizes=\"(max-width: 385px) 100vw, 385px\" \/><\/a><br \/>\nand drop it on the usercontrol. Rearrange its size and position as appropriate<br \/>\n<a href=\"http:\/\/anvil-of-time.com\/wordpress\/wp-content\/uploads\/2012\/06\/dotnet-004.png\"><img loading=\"lazy\" class=\"aligncenter wp-image-1352 size-full\" title=\"dotnet 004\" src=\"https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-004.png\" alt=\"\" width=\"205\" height=\"206\" srcset=\"https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-004.png 205w, https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-004-150x150.png 150w, https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-004-100x100.png 100w, https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-004-120x120.png 120w\" sizes=\"(max-width: 205px) 100vw, 205px\" \/><\/a><br \/>\nNow choose a Label and drop it on the control.<br \/>\n<a href=\"http:\/\/anvil-of-time.com\/wordpress\/wp-content\/uploads\/2012\/06\/dotnet-005.png\"><img loading=\"lazy\" class=\"aligncenter wp-image-1353 size-full\" title=\"dotnet 005\" src=\"https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-005.png\" alt=\"\" width=\"324\" height=\"133\" srcset=\"https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-005.png 324w, https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-005-300x123.png 300w, https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-005-150x61.png 150w\" sizes=\"(max-width: 324px) 100vw, 324px\" \/><\/a><\/p>\n<p>Change the backcolor of the trackbar to yellow; the name to TB; the Margin to 0,0,0,0; the Maximum to 100; the TickFrequency to 10; and the TickStyle to Both.<br \/>\n<a href=\"http:\/\/anvil-of-time.com\/wordpress\/wp-content\/uploads\/2012\/06\/dotnet-006.png\"><img loading=\"lazy\" class=\"aligncenter wp-image-1354 size-full\" title=\"dotnet 006\" src=\"https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-006.png\" alt=\"\" width=\"292\" height=\"627\" \/><\/a><\/p>\n<p>Modify the background color of the label and the usercontrol itself to yellow. Rename the control to &#8216;IOP_Trackbar&#8217;, the label to &#8216;LB_Value&#8217;, and give the label a border.<br \/>\n<a href=\"http:\/\/anvil-of-time.com\/wordpress\/wp-content\/uploads\/2012\/06\/dotnet-007.png\"><img loading=\"lazy\" class=\"aligncenter wp-image-1355 size-full\" title=\"dotnet 007\" src=\"https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-007.png\" alt=\"\" width=\"221\" height=\"114\" srcset=\"https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-007.png 221w, https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-007-150x77.png 150w\" sizes=\"(max-width: 221px) 100vw, 221px\" \/><\/a><\/p>\n<p>Right click on the &#8216;InteropUserControl.vb&#8217; element from the Project window and choose &#8216;View Code&#8217;<br \/>\n<a href=\"http:\/\/anvil-of-time.com\/wordpress\/wp-content\/uploads\/2012\/06\/dotnet-008.png\"><img loading=\"lazy\" class=\"aligncenter wp-image-1356 size-full\" title=\"dotnet 008\" src=\"https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-008.png\" alt=\"\" width=\"293\" height=\"108\" srcset=\"https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-008.png 293w, https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-008-150x55.png 150w\" sizes=\"(max-width: 293px) 100vw, 293px\" \/><\/a><\/p>\n<p>You will see code like this (this is from Visual Studio 2010).<br \/>\n<a href=\"http:\/\/anvil-of-time.com\/wordpress\/wp-content\/uploads\/2012\/06\/dotnet-009.png\"><img loading=\"lazy\" class=\"aligncenter wp-image-1357 size-full\" title=\"dotnet 009\" src=\"https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-009.png\" alt=\"\" width=\"652\" height=\"199\" srcset=\"https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-009.png 652w, https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-009-300x91.png 300w, https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-009-150x45.png 150w\" sizes=\"(max-width: 652px) 100vw, 652px\" \/><\/a><\/p>\n<p>Here is the code to add.<\/p>\n<pre name=\"code\" class=\"VB\">   &#039;Please enter any new code here, below the Interop code\n\n    &#039; event to show in PB\n    Public Event tbScroll()\n    Public Event tbValuechanged()\n\n    Private Sub TB_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TB.Scroll\n        LB_Value.Text = TB.Value.ToString()\n        RaiseEvent tbScroll()\n    End Sub\n    Private Sub TB_Valuechanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TB.ValueChanged\n        RaiseEvent tbValuechanged()\n    End Sub\n\n    &#039; method to call from PB\n    Public Sub tbSetBackColor(ByVal testval As Integer)\n        Dim myColor As Color = ColorTranslator.FromWin32(testval)\n\n        TB.BackColor = myColor &#039; set color on trackbar\n        LB_Value.BackColor = myColor &#039; set color on label\n        BackColor = myColor &#039; set color on interop control\n    End Sub\n    &#039; Property get\/set\n    Public Shadows Property TBBackgroundColor() As Integer\n        Get\n            Return ActiveXControlHelpers.GetOleColorFromColor(TB.BackColor)\n        End Get\n        Set(ByVal value As Integer)\n            TB.BackColor = ActiveXControlHelpers.GetColorFromOleColor(value)\n        End Set\n    End Property\n    &#039; this is the value of the trackbar\n    Public Shadows Property TBValue() As Integer\n        Get\n            Return TB.Value\n        End Get\n        Set(ByVal value As Integer)\n            TB.Value = value\n        End Set\n    End Property<\/pre>\n<p>In the first portion there are two events we want to expose to PowerBuilder so we can write code in our PB app to respond to the control. These are &#8216;tbScroll&#8217; and &#8216;tbValuechanged&#8217;. One is triggered in response to the Scroll event on the trackbar (which we named &#8216;TB&#8217;) and the other by the Valuechanged event. In the tbScroll event we are setting the Text in the label (we called it &#8216;LB_Value&#8217;) on the userobject to the Value property of the Trackbar.<\/p>\n<p>We also are creating a method, tbSetBackColor, which can be called from our PB app to set the background colors of the userobject, trackbar, and label.<\/p>\n<p>Finally we are exposing two properties of the Trackbar so we can either set or get them from our PB app. These are called &#8216;TBBackgroundColor&#8217; and &#8216;TBValue&#8217;.<\/p>\n<p>The last thing we need to do in Visual Studio is to add an Interface to the project so the events we are exposing can be seen from within PowerBuilder. From the Project menu choose &#8216;Add New Item&#8217;.<br \/>\n<a href=\"http:\/\/anvil-of-time.com\/wordpress\/wp-content\/uploads\/2012\/06\/dotnet-010.png\"><img loading=\"lazy\" class=\"aligncenter wp-image-1339 size-full\" title=\"dotnet 010\" src=\"https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-010.png\" alt=\"\" width=\"406\" height=\"209\" srcset=\"https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-010.png 406w, https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-010-300x154.png 300w, https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-010-150x77.png 150w\" sizes=\"(max-width: 406px) 100vw, 406px\" \/><\/a><br \/>\nThen under the &#8216;Common Items&#8217; choose &#8216;Interface&#8217;<br \/>\n<a href=\"http:\/\/anvil-of-time.com\/wordpress\/wp-content\/uploads\/2012\/06\/dotnet-011.png\"><img loading=\"lazy\" class=\"aligncenter wp-image-1340 size-full\" title=\"dotnet 011\" src=\"https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-011.png\" alt=\"\" width=\"864\" height=\"369\" srcset=\"https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-011.png 864w, https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-011-300x128.png 300w, https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-011-150x64.png 150w\" sizes=\"(max-width: 864px) 100vw, 864px\" \/><\/a><\/p>\n<p>In the code for the interface, replace it with the following.<\/p>\n<pre name=\"code\" class=\"VB\">&lt;guid(&quot;ca16a9e8-02c7-43d2-90f6-4ef30885a338&quot;), _=&quot;&quot; interfacetype(cominterfacetype.interfaceisidispatch)=&quot;&quot;&gt; _\nPublic Interface iIOP_Trackbar\n    &lt;dispid(1)&gt; _\n    Sub tbScroll()\n    &lt;dispid(2)&gt; _\n    Sub tbValuechanged()\nEnd Interface&lt;\/dispid(2)&gt;&lt;\/dispid(1)&gt;&lt;\/guid(&quot;ca16a9e8-02c7-43d2-90f6-4ef30885a338&quot;),&gt;<\/pre>\n<p>The first thing to do now is to replace the example GUID with one of your own (Visual Studio can generate one). Also give the Interface a more meaningful name &#8211; &#8216;iIOP_Trackbar&#8217; in this example. Within the interface definition are the two events which will be visible from within PowerBuilder.<\/p>\n<p>With this done you can now build the solution from the &#8216;Build&#8217; menu<br \/>\n<a href=\"http:\/\/anvil-of-time.com\/wordpress\/wp-content\/uploads\/2012\/06\/dotnet-012.png\"><img loading=\"lazy\" class=\"aligncenter wp-image-1341 size-full\" title=\"dotnet 012\" src=\"https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-012.png\" alt=\"\" width=\"283\" height=\"73\" srcset=\"https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-012.png 283w, https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-012-150x38.png 150w\" sizes=\"(max-width: 283px) 100vw, 283px\" \/><\/a><\/p>\n<p>This will create and register the dll on the machine.<\/p>\n<p>Now in PowerBuilder the control will be available when you choose to add an userobject.<br \/>\n<a href=\"http:\/\/anvil-of-time.com\/wordpress\/wp-content\/uploads\/2012\/06\/dotnet-013.png\"><img loading=\"lazy\" class=\"aligncenter wp-image-1342 size-full\" title=\"dotnet 013\" src=\"https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-013.png\" alt=\"\" width=\"382\" height=\"379\" srcset=\"https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-013.png 382w, https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-013-150x148.png 150w, https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-013-300x297.png 300w, https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-013-100x100.png 100w, https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-013-120x120.png 120w\" sizes=\"(max-width: 382px) 100vw, 382px\" \/><\/a><\/p>\n<p>The events are visible in Powerscript.<br \/>\n<a href=\"http:\/\/anvil-of-time.com\/wordpress\/wp-content\/uploads\/2012\/06\/dotnet-014.png\"><img loading=\"lazy\" class=\"aligncenter wp-image-1343 size-full\" title=\"dotnet 014\" src=\"https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-014.png\" alt=\"\" width=\"222\" height=\"397\" srcset=\"https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-014.png 222w, https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-014-167x300.png 167w\" sizes=\"(max-width: 222px) 100vw, 222px\" \/><\/a><\/p>\n<p>Now in the tbscroll event on our ole control we put the following.<\/p>\n<pre name=\"code\" class=\"VB\">long ll_val\n\/\/report on the current value of the control\n\/\/this uses the &#039;getter&#039; method to return the track bar value from the .net control\nll_val = ole_1.object.event tbvalue()\n\/\/move the PB control\nhtb_1.position = ll_val\n\/\/ show value\nst_1.text = string(ll_val)<\/pre>\n<p>Code in the tbvaluechanged event on the ole control<\/p>\n<pre name=\"code\" class=\"VB\">sle_2.text = &#039;tbvaluechanged at &#039; + string(Now(),&#039;hh:mm:ss&#039;)<\/pre>\n<p>Code to set the color of the ole control.<\/p>\n<pre name=\"code\" class=\"VB\">long ll_color\n\n\/\/ set the desired color on the control\nIF sle_1.text = string(RGB(0,174,221)) THEN\n\tll_color = 15780518\nELSE\n\tll_color = RGB(0,174,221)\nEND IF\n\/\/ call method on .Net control to set the background colors\nole_1.object.event tbsetbackcolor(ll_color)\n\/\/ get the color value using the &#039;getter&#039; method in .Net class\nsle_1.text = string(ole_1.object.tbbackgroundcolor())<\/pre>\n<p>Running the application gives the following<br \/>\n<a href=\"http:\/\/anvil-of-time.com\/wordpress\/wp-content\/uploads\/2012\/06\/dotnet-016.png\"><img loading=\"lazy\" class=\"aligncenter wp-image-1344 size-full\" title=\"dotnet 016\" src=\"https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-016.png\" alt=\"\" width=\"367\" height=\"493\" srcset=\"https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-016.png 367w, https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-016-223x300.png 223w, https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-016-111x150.png 111w\" sizes=\"(max-width: 367px) 100vw, 367px\" \/><\/a><br \/>\nSee the original control background color. Clicking the Set Color button gives this<br \/>\n<a href=\"http:\/\/anvil-of-time.com\/wordpress\/wp-content\/uploads\/2012\/06\/dotnet-017.png\"><img loading=\"lazy\" class=\"aligncenter wp-image-1345 size-full\" title=\"dotnet 017\" src=\"https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-017.png\" alt=\"\" width=\"370\" height=\"453\" srcset=\"https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-017.png 370w, https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-017-245x300.png 245w, https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-017-122x150.png 122w\" sizes=\"(max-width: 370px) 100vw, 370px\" \/><\/a><\/p>\n<p>Moving the trackbar ole control results in this.<\/p>\n<p><a href=\"http:\/\/anvil-of-time.com\/wordpress\/wp-content\/uploads\/2012\/06\/dotnet-018.png\"><img loading=\"lazy\" class=\"aligncenter wp-image-1346 size-full\" title=\"dotnet 018\" src=\"https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-018.png\" alt=\"\" width=\"366\" height=\"429\" srcset=\"https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-018.png 366w, https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-018-255x300.png 255w, https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/dotnet-018-127x150.png 127w\" sizes=\"(max-width: 366px) 100vw, 366px\" \/><\/a><\/p>\n<p>There are a couple of things to look out for when using the techniques described here. The first is that any events exposed via the .Net Interface must have some sort of Powerscript in them within PB. Failure to do this results in an &#8216;unhandled exception&#8217; application crash. There may be some way to prevent this from within Visual Basic but I am not sure.<\/p>\n<p>The other issue is that if you have to change your VB.Net component you must re add it to your window\/form within PowerBuilder. Usually I will add a second ole object to the existing window, transfer all the code from the old ole control, delete the original control, and finally rename the new control to that of the old control. This is the biggest issue I have with working with &#8216;roll your own&#8217; ole controls. If anyone knows of a work around for this I would like to hear it.<\/p>\n<p>Visual studio and PB files can be <a href=\"https:\/\/anvil-of-time.com\/wp-content\/uploads\/2012\/06\/vb_trackbar.zip\">downloaded from here<\/a>.<\/p>\n<p>The video presentation of this is on <a href=\"http:\/\/www.youtube.com\/watch?v=DSyKkpZg9Ns\" target=\"_blank\" rel=\"noopener\">YouTube<\/a>.<br \/>\n<a style=\"display: none;\" href=\"http:\/\/www.codeproject.com\" rel=\"tag\">CodeProject<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>This article describes the techniques and code used during my presentations at the Carolina Code Camp 2012 and at the May 2012 meeting of the North Carolina PowerBuilder User Group. The techniques described here utilize Visual Basic .Net (coded in Visual Studio 2010) with the Interop Forms Toolkit available from Microsoft. The Interop Forms Toolkit&hellip;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[47,3,10,85],"tags":[50,12,13,16,48],"_links":{"self":[{"href":"https:\/\/anvil-of-time.com\/wp-json\/wp\/v2\/posts\/1335"}],"collection":[{"href":"https:\/\/anvil-of-time.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/anvil-of-time.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/anvil-of-time.com\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/anvil-of-time.com\/wp-json\/wp\/v2\/comments?post=1335"}],"version-history":[{"count":15,"href":"https:\/\/anvil-of-time.com\/wp-json\/wp\/v2\/posts\/1335\/revisions"}],"predecessor-version":[{"id":2035,"href":"https:\/\/anvil-of-time.com\/wp-json\/wp\/v2\/posts\/1335\/revisions\/2035"}],"wp:attachment":[{"href":"https:\/\/anvil-of-time.com\/wp-json\/wp\/v2\/media?parent=1335"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/anvil-of-time.com\/wp-json\/wp\/v2\/categories?post=1335"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/anvil-of-time.com\/wp-json\/wp\/v2\/tags?post=1335"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}