You are on page 1of 10

Ring Documentation, Release 1.

5.5 Better RingQt

RingQt classes are updated to include methods to get events (The code that will be executed when an event is fired).
This is necessary to enable/disable events for some time or to get the events information.
For example the next code disable an event then call a method then enable the event again.
cEvent = oView.oListResult.getCurrentItemChangedEvent()
oView.oListResult.setCurrentItemChangedEvent("")
FindValueAction() # Call Method while an event is disabled
oView.oListResult.setCurrentItemChangedEvent(cEvent)

Also the QAllEvents class is updated where we can set the output from the event function to be true or false using a
new method added to the class called setEventOutput.
Load "guilib.ring"

MyApp = New qApp {


win = new qWidget() {
setwindowtitle("Hello World")
setGeometry(100,100,370,250)
lineedit1 = new qlineedit(win) {
setGeometry(10,100,350,30)
setinputmask("9999;_")
oFilter = new qallevents(lineedit1)
oFilter.setfocusoutEvent("pMove()")
installeventfilter(oFilter)
}
lineedit2 = new qlineedit(win) {
setGeometry(10,150,350,30)
}
show()
}
exec()
}

func pMove
win.setWindowTitle("xxxx")
oFilter.setEventOutput(False)

5.6 Objects Library for RingQt

Ring 1.2 comes with the Objects library for RingQt applications. Instead of using global variables for windows
objects and connecting events to objects using the object name, the Objects Library will manage the GUI objects and
will provide a more natural API to quickly create one or many windows from the same class and the library provide
a way to quickly set methods to be executed when an event is fired. Also the library provide a natural interface to
quickly use the parent or the caller windows from the child or sub windows.
The Objects Library is designed to be used with the MVC Design Pattern.
The Objects Library is merged in RingQt so you can use it directly when you use RingQt
Example :
load "guilib.ring"

new qApp {

5.5. Better RingQt 38


Ring Documentation, Release 1.3

open_window( :MainWindowController )
exec()
}

class MainWindowController from WindowsControllerParent


oView = new MainWindowView
func SubWindowAction
Open_window( :SubWindowController )
Last_Window().SetParentObject(self)

class MainWindowView from WindowsViewParent


win = new qWidget() {
SetWindowTitle("Main Window")
btnSub = new qPushButton(win) {
setText("Sub Window")
setClickEvent( Method( :SubWindowAction ) )
}
resize(400,400)
}

class SubWindowController from WindowsControllerParent


oView = new SubWindowView
func SetMainWindowTitleAction
Parent().oView.win.SetWindowTitle("Message from the Sub Window")
oView.win.SetWindowTitle("Click Event Done!")

class SubWindowView from WindowsViewParent


win = new qWidget() {
SetWindowTitle("Sub Window")
btnMsg = new qPushButton(win) {
setText("Set Main Window Title")
setClickEvent( Method( :SetMainWindowTitleAction ) )
}
btnClose = new qPushButton(win) {
Move(200,0)
setText("Close")
setClickEvent( Method( :CloseAction ) )
}
resize(400,400)
}

5.7 RingLibCurl

The LibCurl library is used starting from Ring 1.0 for the Download() and SendEmail() functions implementation. In
Ring 1.2 more functions are added to provide a powerful library (RingLibCurl) around LibCurl.
Example:
load "libcurl.ring"

curl = curl_easy_init()

cPostThis = "page=4&Number1=4&Number2=5"
curl_easy_setopt(curl, CURLOPT_URL, "http://localhost/ringapp/index.ring?page=3")
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, cPostThis)

5.7. RingLibCurl 39
Ring Documentation, Release 1.3

curl_easy_perform(curl)

curl_easy_cleanup(curl)

5.8 Better Call Command

The Call command is updated to support calling functions from object attributes also (not only variables).
For example the next code from the Stars Fighter Game
cFunc = oself.keypress
call cFunc(oGame,oSelf,Key_Space)

Can be written in one line


call oself.keypress(oGame,oSelf,Key_Space)

5.9 Using NULL instead of NULLPointer()

We can pass NULL to functions instead of using NULLPointer()


For example the next code from RingLibSDL
SDL_RenderCopy(SDL_ren,tex,NULLPointer(),rect)

Can be written as in the next line


SDL_RenderCopy(SDL_ren,tex,NULL,rect)

5.10 Display Warnings Option

In Ring 1.2 the Ring compiler is updated to include the Display Warnings option (-w)
Example:
load "stdlib.ring"
load "stdlib.ring"

compiling the program using the Display Warnings option will display the file duplication warning, While without that
option the error will pass silent.
This is a warning (not an error) because in large projects you may use the same file more than one time. For example
its common to start each file with the next code. where the function IsMainSourceFile() is part from the stdlib.ring
load "stdlib.ring"
if IsMainSourceFile()
// Testing
ok

5.8. Better Call Command 40


Ring Documentation, Release 1.3

5.11 Better Quality

Ring 1.2 is more stable, We discovered and fixed more bugs during Ring usage everyday in practical projects. Some
functions are optimized to be faster like the SubStr() function. Also the documentation is more better.

5.11. Better Quality 41


CHAPTER

SIX

WHAT IS NEW IN RING 1.1?

In this chapter we will learn about the changes and new features in Ring 1.1 release.

6.1 List of changes and new features

Ring 1.1 comes with many new features


Better Natural Language Programming Support
Generate/Execute Ring Object Files (*.ringo)
Syntax Flexibility and different styles for I/O and Control Structures
New Functions and Changes
StdLib functions and classes written in Ring
RingLibSDL
Demo Project - Game Engine for 2D Games
RingSQLite
Better Code Generator for Extensions
Using Self.Attribute in the Class Region to define new attributes
Using This.Attribute in nested Braces inside the Class Methods
Better Documentation

6.2 Better Natural Language Programming Support

Ring is an innovative language because of its compact syntax, smart implementation (small, transparent & visual) and
its ability to create declarative and natural domain specific languages in a fraction of time.
This release add support for calling methods when an expression is evaluated
check this example:
# Natural Code
new program {
Accept 2 numbers then print the sum
}

# Natural Code Implementation

42
Ring Documentation, Release 1.3

class program
# Keywords
Accept=0 numbers=0 then=0 print=0 the=0 sum=0

# Execution
func braceexpreval x
value = x
func getnumbers
for x=1 to value
see "Enter Number ("+x+") :" give nNumber
aNumbers + nNumber
next
func getsum
nSUm = 0
for x in aNumbers nSum+= x next
see "The Sum : " + nSum
private
value=0 aNumbers=[]

Output:
Enter Number (1) :3
Enter Number (2) :4
The Sum : 7

for more information see the Natural Language Programming chapter.

6.3 Generate/Execute Ring Object Files (*.ringo)

This feature enable you to distribute your applications without distributing the source code. Also it makes application
distribution a simple process where you get one Ring object file for the complete project (many source code files).
Also using Ring object file remove the loading time required for compiling the application.
Check the command line options chapter to know more about this feature.

6.4 Syntax Flexibility and different styles for I/O and Control Struc-
tures

Programmers are sensitive to the programming language syntax. Great programmers know how to work using many
different styles but each programmer may have his/her favorite style.
Each programming language comes with a style that you may like or not. Ring is just one of these languages, but as a
response to many programmers asking for a better syntax we decided to provide more options.
Also some of these features are very necessary for Natural Language Programming.
Example :
We have two commands to change language keywords and operators.
ChangeRingOperator + plus
ChangeRingKeyword see print

Print 5 plus 5

6.3. Generate/Execute Ring Object Files (*.ringo) 43


Ring Documentation, Release 1.3

ChangeRingOperator plus +
ChangeRingKeyword print see

We have new styles (Optional) for Input/Output.


Example :
Put "What is your name? "
Get cName
Put "Hello " + cName

Example :
Load "stdlib.ring"

Print("What is your name? ") # print message on screen


cName=GetString() # get input from the user
print("Hello #{cName}") # say hello!

We have new styles (optional) for control structures.


Example :
While True

Put "
Main Menu
---------
(1) Say Hello
(2) About
(3) Exit

" Get nOption

Switch nOption
Case 1
Put "Enter your name : "
Get name
Put "Hello " + name + nl
Case 2
Put "Sample : using while loop" + nl
Case 3
Bye
Else
Put "bad option..." + nl
End
End

Example :
Load "stdlib.ring"

While True {

print("
Main Menu
---------
(1) Say Hello
(2) About
(3) Exit

6.4. Syntax Flexibility and different styles for I/O and Control Structures 44
Ring Documentation, Release 1.3

")

nOption = GetString()

switch nOption {
case 1
print("Enter your name : ")
name = getstring()
print("Hello #{name}\n")
case 2
print("Sample : using switch statement\n")
case 3
Bye
else
print("bad option...\n")
}

Check the next chapters:-


Getting Started - Second Style
Getting Started - Third Style
Control Structures - Second Style - May looks like Lua and Ruby
Control Structures - Third Style - May looks like C (uses braces)
Syntax Flexibility

Note: All of these styles are provided automatically by the compiler at the same time, Its better to select one style for
the same project (you can create your style as a mix from these styles) for example you can use Put/Get and Braces.

6.5 New Functions and Changes

Changed:
get() function : changed to sysget()
sort() function : can now work on list of objects
find() function : can now work on list of objects
Added:
clockspersecond()
CurrentDir()
ExeFileName()
ChDir()
ExeFolder()
varptr()
space()
nullpointer()

6.5. New Functions and Changes 45


Ring Documentation, Release 1.3

object2pointer()
pointer2object()
Check the next chapters
System Functions
Object Oriented Programming (OOP)
Low Level Functions

6.6 StdLib functions and classes written in Ring

Ring 1.1 comes with a library called StdLib, its written in Ring by the help of Ring Team
The library provide a useful group of new functions and classes
Example:
Load "stdlib.ring"

Puts("Test Times()")
Times ( 3 , func { see "Hello, World!" + nl } )

Example:
Load "stdlib.ring"

Puts("Test Map()")
See Map( 1:10, func x { return x*x } )

Example:
Load "stdlib.ring"

Puts("Test Filter()")
See Filter( 1:10 , func x { if x <= 5 return true else return false ok } )

Example:
Load "stdlib.ring"

See "Testing the String Class" + nl


oString = new string("Hello, World!")
oString.println()
oString.upper().println()
oString.lower().println()
oString.left(5).println()
oString.right(6).println()

Example:
Load "stdlib.ring"

oList = new list ( [1,2,3] )


oList.Add(4)
oList.print()

Example:

6.6. StdLib functions and classes written in Ring 46


Ring Documentation, Release 1.3

Load "stdlib.ring"

oStack = new Stack


oStack.push(1)
oStack.push(2)
oStack.push(3)
see oStack.pop() + nl

Example:
Load "stdlib.ring"

oQueue = new Queue


oQueue.add(1)
oQueue.add(2)
oQueue.add(3)
see oQueue.remove() + nl

Example:
Load "stdlib.ring"

ohashtable = new hashtable


See "Test the hashtable Class Methods" + nl
ohashtable {
Add("Egypt","Cairo")
Add("KSA","Riyadh")
see self["Egypt"] + nl
see self["KSA"] + nl
see contains("Egypt") + nl
see contains("USA") + nl
see index("KSA") + NL
print()
delete(index("KSA"))
see copy("*",60) + nl
print()
}

Example:
Load "stdlib.ring"

otree = new tree


See "Test the tree Class Methods" + nl
otree {
set("The first step") # set the root node value
see value() + nl
Add("one")
Add("two")
Add("three") {
Add("3.1")
Add("3.2")
Add("3.3")
see children
}
see children
oTree.children[2] {
Add("2.1") Add("2.2") Add("2.3") {
Add("2.3.1") Add("2.3.2") Add("test")

6.6. StdLib functions and classes written in Ring 47

You might also like