Temperature Converter Class
You may create user-defined Classes based upon Dyalog GUI objects as illustrated by the Temperature Converter Class which is listed overleaf.
To base a Class on a Dyalog GUI object, you specify the name of the object as its Base Class. For example, the Temperature Converter is based upon a Form:
:Class Temp: 'Form'
Being based upon a top-level GUI object, the Temperature Converter may be used as follows:
T1←⎕NEW Temp(⊂'Posn'(68 50))
Temperature Converter Example
:Class Temp: 'Form'
∇ Make pv;TITLE
:Access Public
TITLE←'Temperature Converter'
:Implements Constructor :Base (⊂'Caption' TITLE),pv,
⊂('Size' (30 40))
MB←⎕NEW⊂'MenuBar'
MB.(M←⎕NEW'Menu'(,⊂'Caption' '&Scale'))
MB.M.(C←⎕NEW'MenuItem'(('Caption' '&Centigrade')
('Checked' 1)))
MB.M.(F←⎕NEW'MenuItem'(,⊂('Caption' '&Fahrenheit')))
LF←⎕NEW'Label'(('Caption' 'Fahrenheit')
('Posn'(10 10)))
F←⎕NEW'Edit'(('Posn'(10 40))('Size'(⍬ 20))
('FieldType' 'Numeric'))
LC←⎕NEW'Label'(('Caption' 'Centigrade')
('Posn'(40 10)))
C←⎕NEW'Edit'(('Posn'(40 40))('Size'(⍬ 20))
('FieldType' 'Numeric'))
F2C←⎕NEW'Button'(('Caption' 'F->C')('Posn'(10 70))
('Default' 1))
C2F←⎕NEW'Button'(('Caption' 'C->F')('Posn'(40 70)))
Q←⎕NEW'Button'(('Caption' '&Quit')('Posn'(70 30))
('Size'(⍬ 40))('Cancel' 1))
S←⎕NEW'Scroll'(⊂('Range' 101))
MB.M.C.onSelect←'SET_C'
MB.M.F.onSelect←'SET_F'
F2C.onSelect←'f2c'
F.onGotFocus←'SET_DEF'
C2F.onSelect←'c2f'
C.onGotFocus←'SET_DEF'
onClose←'QUIT'
Q.onSelect←'QUIT'
S.onScroll←'c2f_scroll'
∇
∇ f2c
C.Value←(F.Value-32)×5÷9
∇
∇ c2f
F.Value←32+C.Value×9÷5
∇
∇ c2f_scroll MSG
⍝ Callback for Centigrade input via scrollbar
C.Value←101-4⊃MSG
c2f
∇
∇ f2c_scroll Msg
⍝ Callback for Fahrenheit input via scrollbar
F.Value←213-4⊃Msg
f2c
∇
∇ Quit
Close
∇
∇ SET_DEF MSG
(⊃MSG).Default←1
∇
∇ SET_C
⍝ Sets the scrollbar to work in Centigrade
S.Range←101
S.onScroll←'c2f_scroll'
MB.M.C.Checked←1
MB.M.F.Checked←0
∇
∇ SET_F
⍝ Sets the scrollbar to work in Fahrenheit
S.Range←213
S.onScroll←'f2c_scroll'
MB.M.F.Checked←1
MB.M.C.Checked←0
∇
:EndClass ⍝ Temp
Notice that the :Implements Constructor
statement of its Constructor Make
:
:Implements Constructor :Base (⊂'Caption' TITLE),pv,
⊂('Size' (30 40))
passes on the application-specific property list (pv
) given as its argument, but (in this case) specifies Caption and Size as well. The order in which the properties are specified in the :Base
call ensures that the former will act as a default (and be overridden by an application-specific Caption requested in pv
), whereas the specified Size of(30 40)
will override whatever value of Size is requested by the host application in pv
.
Other Instances can co-exist with the first:
T2←⎕NEW Temp(('Caption' 'My Application')
('Posn'(10 10))