Home > Articles > Programming > General Programming/Other Languages

  • Print
  • + Share This
This chapter is from the book

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 1–7 shows this diagram of the layers of classes.

Figure 1-7Figure 1–7 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 1–8. 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 1-8Figure 1–8 Execution Results of Walk the Dog Code

  • + Share This
  • 🔖 Save To Your Account