1.7 COBOL Classes and the .NET Base Classes
We have seen above how the different .NET-enabled languages can inherit and communicate with each other. This is a powerful feature of the .NET Framework, however, the real power for the developer in developing new applications is in the thousands of .NET base classes available. Using these base classes is how the programmer communicates with the Common Language Runtime (CLR), which then controls the powerful operating system engine. The CLR works with an extensive set of Win32 APIs to implement the functionality desired. Figure 17 shows this diagram of the layers of classes.
Figure 17 Class Layers
Let's look at an example of using several of the .NET base classes by a COBOL program. The WalkTheDog example is on the FTP site. The program is WalkTheDog.cob, which we show next.
000010 CLASS-ID. Walk INHERITS Form. 000020 ENVIRONMENT DIVISION. 000030 CONFIGURATION SECTION. 000040 REPOSITORY. 000050 CLASS Form AS "System.Windows.Forms.Form" 000060 -CLASS Application AS "System.Windows.Forms._Application" 000070 -CLASS Container AS "System.ComponentModel._Container" 000080 CLASS Button AS "System.Windows.Forms.Button" 000090 CLASS Timer AS "System.Windows.Forms.Timer" 000100 CLASS EventHandler AS "System.EventHandler" 000110 CLASS EventArgs AS "System.EventArgs" 000120 CLASS Point AS "System.Drawing.Point" 000130 CLASS Drawing-Size AS "System.Drawing.Size" 000140 CLASS Sys-Object AS "System.Object" 000150 -CLASS MessageBox AS "System.Windows.Forms._MessageBox" 000160 -CLASS Control-Collection AS "System.Windows. Forms.Control+ControlCollection" 000170 PROPERTY Interval AS "Interval" 000180 PROPERTY Enabled AS "Enabled" 000190 PROPERTY Location AS "Location" 000200 PROPERTY Button-Size AS "Size" 000210 PROPERTY TabIndex AS "TabIndex" 000220 PROPERTY Button-Text AS "Text" 000230 PROPERTY App-Controls AS "Controls" 000240 PROPERTY App-Text AS "Text" 000250 PROPERTY AutoScaleBaseSize AS "AutoScalBaseSize". 000260 STATIC. 000270 PROCEDURE DIVISION. 000280 METHOD-ID. MAIN. 000290 DATA-DIVISION. 000300 WORKING-STORAGE SECTION. 000310 77 Obj OBJECT REFERENCE Walk. 000320 PROCEDURE DIVISION. 000330 INVOKE Walk "New" RETURNING Obj. 000340 INVOKE Application "Run" USING BY VALUE Obj. 000350 END METHOD MAIN. 000360 END STATIC. 000370 OBJECT. 000380 DATA DIVISION. 000390 WORKING-STORAGE SECTION. 000400 77 Components OBJECT REFERENCE Container. 000410 77 Button1 OBJECT REFERENCE Button. 000420 77 Timer1 OBJECT REFERENCE Timer. 000430 PROCEDURE DIVISION 000440 METHOD-ID. NEW. 000450 PROCEDURE DIVISION. 000460 INVOKE Self "InitializeComponent". 000470 END METHOD NEW. 000480 METHOD-ID. DISPOSE AS "Dispose" OVERRIDE. 000490 PROCEDURE DIVISION. 000500 INVOKE SUPER "Dispose". 000510 INVOKE Components "Dispose". 000520 END METHOD DISPOSE. 000530 -METHOD-ID. INITIALIZECOMPONENT AS _"InitializeComponent". 000540 DATA DIVISION. 000550 WORKING-STORAGE SECTION. 000560 77 TICK-EVENT OBJECT REFERENCE EventHandler. 000570 77 Click-Event OBJECT REFERENCE EventHandler. 000580 PROCEDURE DIVISION. 000590 INVOKE Container "New" RETURNING Components. 000600 -INVOKE Timer "New" USING BY VALUE Components _RETURNING Timer1. 000610 INVOKE Button "New" RETURNING Button1. 000620 MOVE 2000 TO Interval OF Timer1. 000630 MOVE B'1' TO Enabled OF Timer1. 000640 -INVOKE EventHandler "New" USING BY VALUE SELF "Timer1_Tick" 000650 RETURNING Tick-Event. 000660 -INVOKE Timer1 "add_Tick" USING BY VALUE Tick-Event. 000670 SET Location OF Button1 TO Point::"New" (96 64). 000680 -SET Button-Size OF Button1 TO Drawing-Size::"New" (88 40). 000690 MOVE 0 TO TabIndex OF Button1. 000700 SET Button-Text OF Button1 TO "Stop It". 000710 -INVOKE EventHandler "New" USING BY VALUE SELF "Button1_Click" 000720 RETURNING Click-Event. 000730 -INVOKE Button1 "add_Click" USING BY VALUE Click-Event. 000740 SET App-Text OF SELF TO "Walk". 000750 -SET AutoScaleBaseSize OF SELF TO Drawing-Size::"New" (5 13). 000760 -INVOKE App-Controls OF SELF "Add" USING BY VALUE Button1. 000770 END METHOD INITIALIZECOMPONENT. 000780 METHOD-ID. Button1_Click. 000790 DATA DIVISION. 000800 LINKAGE SECTION. 000810 77 Sender OBJECT REFERENCE Sys-Object. 000820 77 e OBJECT REFERENCE EventArgs. 000830 PROCEDURE DIVISION USING BY VALUE Sender e. 000840 MOVE B'0' TO Enabled OF Timer1. 000850 END METHOD Button1_Click. 000860 METHOD-ID. Timer1_Tick. 000870 DATA DIVISION. 000880 LINKAGE SECTION. 000890 77 Sender OBJECT REFERENCE Sys-Object. 000900 77 e OBJECT REFERENCE EventArgs. 000910 PROCEDURE DIVISION USING BY VALUE Sender e. 000920 INVOKE MessageBox "Show" USING BY VALUE 000930 "Walk the Dog!" "Things to do". 000940 END METHOD Timer1_Tick. 000950 END OBJECT. 000960 END CLASS Walk.
Let's build this project and run it. The results are shown Figure 18. Kind of reminds me of my wife telling me to go walk the dog over and over until I say stop it (push the button) and I go walk the dog. The program is using the .NET base classes to implement all the code for creating the MessageBox, displaying it on a timed interval, inserting the text, and picking up when the Stop It button is pushed. It also uses the base classes for drawing and sizing the displays. This is but a minor example of the many classes and the tremendous amount of methods and data that are available in the classes for creating applications. Another interesting aspect is the creating of shorthand descriptions for activities, which saves a lot of code writing. For example, line 00090 shows CLASS Timer AS "System.Windows.Forms.Timer", however, in the code such as line 000420 when we defined the timer object, we used Timer instead of System.Windows.Forms.Timer. If you were to look at Section 2.2 in Chapter 2, you would see some of the main .NET Framework namespaces. For example, in the listing of namespaces item 9 you would see System.Drawing. Line 000130 above shows CLASS Drawing-Size AS "System.Drawing.Size". We have thus used one of the namespace methods "Size" of System.Drawing and assigned it a shorthand definition of Drawing-Size. If you look at line 000750 SET AutoScaleBaseSize OF SELF TO Drawing-Size::"New" (5 13), we are setting up the drawing size for display. More insight will be provided in Chapter 2 on how the .NET base classes are used. These base classes almost completely encapsulate the some 1,925 Win32 APIs of Windows, and we never have to worry about that amount of complexity. However, in Chapter 8 we cover some of the more fundamental Win32 APIs to give you a feel for this complexity and to let you gain some understanding of the Windows engine underneath the .NET Framework.
Figure 18 Execution Results of Walk the Dog Code