A mini-texte editor » History » Version 3
iri, 10/03/2012 11:11 PM
| 1 | 1 | iri | h1. A mini-texte editor |
|---|---|---|---|
| 2 | |||
| 3 | 2 | iri | * Load packages |
| 4 | 1 | iri | * Define and call a function |
| 5 | 2 | iri | * A structure |
| 6 | * Create and use a (pseudo) class (Oriented-Object Programming) |
||
| 7 | 1 | iri | * Manage a window, text and button components |
| 8 | * Callbacks |
||
| 9 | * Default dialog boxes |
||
| 10 | 2 | iri | |
| 11 | First, Scol is case sensitive, remember this ! |
||
| 12 | MyVariable, myVariable, myvariABle are differents. MyFunction, myFunction, MYFunction are differents too. |
||
| 13 | fun is a Scol keyword but Fun is not one. |
||
| 14 | |||
| 15 | 3 | iri | h2. Create a class |
| 16 | 1 | iri | |
| 17 | 3 | iri | The better way is the creation of a new file. It will contains only the class code. |
| 18 | Like other languages, a class is a type. We can create an object : this is an instantiation of the class. Thus, we must be write a constructor. A class has one or more functions (methods or procedures in other languages), privates or publics. |
||
| 19 | |||
| 20 | Here is an example. There are several manners to create / use / write a class in Scol, depending on the context. It is our first step in the OOP. |
||
| 21 | |||
| 22 | The full commented source code is available in the "repository":http://redmine.scolring.org/projects/tutorials/repository/show/mini_editors |
||
| 23 | |||
| 24 | <pre> |
||
| 25 | /* new type */ |
||
| 26 | struct MyClass = [ |
||
| 27 | // fields / attributs |
||
| 28 | ] mkMyClass;; |
||
| 29 | |||
| 30 | /* Private functions */ |
||
| 31 | ... |
||
| 32 | /* public functions */ |
||
| 33 | // The constructor of our class |
||
| 34 | fun MC_Constructor (...)= |
||
| 35 | mkMyClass [...];; |
||
| 36 | |||
| 37 | fun MC_GetField1 (objMC)= |
||
| 38 | objMC.field1;; |
||
| 39 | |||
| 40 | fun MC_SetField1 (objMC, value)= |
||
| 41 | set objMC.field1 = value; |
||
| 42 | objMC;; |
||
| 43 | ... |
||
| 44 | </pre> |
||
| 45 | |||
| 46 | h2. Create the graphic interface class |
||
| 47 | |||
| 48 | 2 | iri | In our project, we need a window, a text field (multi lines) and two buttons. Add the width and the height of the window to put our graphics components. |
| 49 | 1 | iri | |
| 50 | 3 | iri | We define a new type : TextEd |
| 51 | 1 | iri | |
| 52 | 3 | iri | <pre> |
| 53 | struct TextEd = [ |
||
| 54 | oWin : ObjWin, |
||
| 55 | winWidth : I, |
||
| 56 | winHeight : I, |
||
| 57 | title : S, |
||
| 58 | oText : ObjText, |
||
| 59 | oLoad : ObjButton, |
||
| 60 | oSave : ObjButton, |
||
| 61 | cbLoad : fun [ObjButton TextEd] I, |
||
| 62 | cbSave : fun [ObjButton TextEd] I, |
||
| 63 | cbClose : fun [] I |
||
| 64 | ] mkTextEd;; |
||
| 65 | </pre> |
||
| 66 | 1 | iri | |
| 67 | 3 | iri | The constructor is a simple initialization of the TextEd object : |
| 68 | |||
| 69 | <pre> |
||
| 70 | fun TE_new (width, height, title, funLoad, funSave, funClose)= |
||
| 71 | mkTextEd [nil width height nil nil nil nil funLoad funSave funClose];; |
||
| 72 | </pre> |
||
| 73 | |||
| 74 | Of course, it must return the new object. |
||
| 75 | |||
| 76 | To build the user interface, we could do something like that : |
||
| 77 | |||
| 78 | <pre> |
||
| 79 | fun TE_create (ed)= |
||
| 80 | if ed != nil then |
||
| 81 | ( |
||
| 82 | set ed.oWin = _CRwindow _channel nil 0 0 ed.winWidth ed.winHeight WN_NORMAL ed.title; |
||
| 83 | set ed.oText = _CReditText _channel ed.oWin 3 3 ed.winWidth-6 ed.winHeight-26 ET_DOWN|ET_ALIGN_LEFT|ET_HSCROLL|ET_VSCROLL nil; |
||
| 84 | set ed.oLoad = _CRbutton _channel ed.oWin 3 ed.winHeight-23 (ed.winWidth-6)/2 20 0 "Load file"; |
||
| 85 | set ed.oSave = _CRbutton _channel ed.oWin (ed.winWidth-6)/2+3 ed.winHeight-23 (ed.winWidth-6)/2 20 0 "Save file"; |
||
| 86 | te_defineCallback ed |
||
| 87 | ) |
||
| 88 | else |
||
| 89 | ed;; |
||
| 90 | </pre> |
||
| 91 | |||
| 92 | _ed_ is a TextEd object. |
||
| 93 | See source code files (link above) to know all private and public functions of this example. |
||
| 94 | |||
| 95 | h2. The main file |
||
| 96 | |||
| 97 | We call the constructor and the builder. |
||
| 98 | |||
| 99 | <pre> |
||
| 100 | fun main()= |
||
| 101 | let TE_new 500 400 "Mini text editor" @_cbLoad @_cbSave @close -> ed in |
||
| 102 | TE_create ed; |
||
| 103 | 0;; |
||
| 104 | </pre> |
||
| 105 | |||
| 106 | __cbLoad_ and __cbSave_ are functions called when the load (save) click button event occurs. |
||
| 107 | _close_ is called after the destruction of the object. |
||
| 108 | |||
| 109 | Note : we could write __cbLoad_ and __cbSave_ in our class ... |
||
| 110 | 1 | iri | |
| 111 | License : "GNU FDL v1.3":https://www.gnu.org/licenses/fdl-1.3-standalone.html |
||
| 112 | Tutorial by iri |
||
| 113 | Updated by / |