You are on page 1of 10

Ring Documentation, Release 1.

96.26 Where can I write a program and execute it?

Run the Ring Notepad where you can write/execute programs.


If you want to run programs using the command line
Add Ring/bin folder to the path then

96.27 How to get the file size using ftell() and fseek() functions?

The next function can be used to get the file size without reading the file!
func getFileSize fp
C_FILESTART = 0
C_FILEEND = 2
fseek(fp,0,C_FILEEND)
nFileSize = ftell(fp)
fseek(fp,0,C_FILESTART)
return nFileSize

Note: The previous function take the fp (file pointer) as parameter, We can get the fp from opening the file using
fopen() function.

fp = fopen("filename","r")

see "File Size : " + getFileSize(fp) + nl

Another solution (Read the file)


see len(read("filename"))

96.28 How to get the current source file path?

We can use the next function to get the current source file path then we can add the path variable to the file name
cPath = CurrentPath()
func currentpath
cFileName = filename()
for x = len(cFileName) to 1 step -1
if cFileName[x] = "/"
return left(cFileName,x-1)
ok
next
return cFileName

96.29 What about predefined parameters or optional parameters in


functions?

if you want to use predefined parameters or optional parameters Just accept a list that works like hash/dictionary
Example

96.26. Where can I write a program and execute it? 1705


Ring Documentation, Release 1.5

sum([ :a = 1, :b = 2])
sum([ :a = 1 ])
sum([ :b = 2 ])
func sum pList
if plist[:a] = NULL pList[:a] = 4 ok
if plist[:b] = NULL pList[:b] = 5 ok
see pList[:a] + pList[:b] + nl

Output
3
6
6

96.30 How to print keys or values only in List/Dictionary?

If you want to print keys only or values only just select the index of the item (one or two).
Example
C_COUNTRY = 1
C_CITY = 2
mylist = [
:KSA = "Riyadh" ,
:Egypt = "Cairo"
]

for x in mylist
see x[C_COUNTRY] + nl
next

for x in mylist
see x[C_CITY] + nl
next

Output
ksa
egypt
Riyadh
Cairo

96.31 Why I get a strange result when printing nl with lists?

In the next code


list = 1:5 # list = [1,2,3,4,5]
see list + nl

New Line will be added to the list then the list will be printed, the default print of the lists will print a newline at the
end, You added new newline and You have now 2 newlines to be printed.
See <Expr>

The see command just print the final result of the expression, the expression will be evaluated as it

96.30. How to print keys or values only in List/Dictionary? 1706


Ring Documentation, Release 1.5

nl = char(13) + char(10) # just a variable that you can change to anything !

The + is an operator
string + string ---> new string
string + number ---> new string
number + number ---> new number
number + string ---> new number

list + item > nothing new will be created but the item will be added to the same list
Exception
number + nl ?> New String
This exception is added to easily print numbers then new line.
No need for this with printing lists because after printing the last item we already get a new line.

96.32 Could you explain the output of the StrCmp() function?

At first remember that you can check strings using = operator directly.
see strcmp("hello","hello") + nl +
strcmp("abc","bcd") + nl +
strcmp("bcd","abc") + nl

if the two strings are the same then it returns 0


abc and bcd arent the same. in the second line it returns -1 and in the third line it returns 1
In the second line we compare between abc and bcd
Not equal because the first letter in abc = a and the first letter in bcd = b
So we have a != b and a < b
So we get output = -1
In the third line we have bcd and abc
the first letter in bcd is b and the first letter in abc is a
So we have b != a and b > a
So we get output = 1

Note: ASCII(a) = 97 and ASCII(b) = 98 So a < b because 97 < 98

96.33 How to use many source code files in the project?

Example:
I have the next folder
C:\LRing

Contains the next files

96.32. Could you explain the output of the StrCmp() function? 1707
Ring Documentation, Release 1.5

C:\LRing\t1.ring
C:\LRing\mylib.ring
C:\LRing\libs\mylib2.ring

The file t1.ring contains the next code


load "mylib.ring"
load "libs\mylib2.ring"
myfunc()
test()

The file mylib.ring contains the next code


func myfunc
see "message from myfunc"+nl

The file libsmylib2.ring contains the next code


func test
see "message from test" + nl

from the folder C:LRing


If Ring is not added to the path you can add it or use the next command
set path=%path%;c:\ring\bin;

Where c:ring is the Ring folder


Now run
Ring t1.ring

Output
message from myfunc
message from test

96.34 Why this example use the GetChar() twice?

The GetChar() function accept one character from the keyboard buffer
In this example
While True
See "
Main Menu
(1) Say Hello
(2) Exit
"
Option = GetChar()
GetChar() GetChar() # End of line
# the previous two lines can be replaced with the next line
# Give Option

if Option = 1
see "Enter your name : " give cName
see "Hello " + cName
else

96.34. Why this example use the GetChar() twice? 1708


Ring Documentation, Release 1.5

bye
ok
End

We uses GetChar() Three times


The first time we get the user option
Option = GetChar()

But in the second and the third times (We accept the new line characters from the buffer)
GetChar() GetChar() # End of line

Example : when the user select the option number 1 then press ENTER
We have Three Characters
The first character is : Number 1
The second character is : CHAR(13)
The third character is : CHAR(10)
Because Windows uses CHAR(13) and CHAR(10) for each new line ( i.e. CR+LF )

96.35 How to use NULL and ISNULL() function?

when we try to use uninitialized variable in the Ring programming language, we get a clear runtime error message
Example
See x

Output
Line 1 Error (R24) : Using uninitialized variable : x
in file tests\seeuninit.ring

The same happens when you try to access uninitialized attributes


Example
o1 = new point
see o1
see o1.x
class point x y z

Output
x: NULL
y: NULL
z: NULL

Line 3 Error (R24) : Using uninitialized variable : x


in file tests\seeuninit2.ring

if you want to check for the error, just use Try/Catch/End

96.35. How to use NULL and ISNULL() function? 1709


Ring Documentation, Release 1.5

Try
see x
Catch
See "Sorry, We can't use x!" + nl
Done

Output
Sorry, We can't use x!

Now we will talk about NULL and ISNULL()


Since we get error message when we deal with uninitialized variables
We can check these errors using Try/Catch/Done, So we uses NULL and ISNULL() for dealing with Strings.
NULL is a variable contains an empty string
ISNULL() is a function that returns true (1) if the input is an empty string or just a string contains NULL
This because we need to test these values (empty strings) and strings contains NULL that sometimes come from
external resource like DBMS.
Example
See IsNull(5) + nl + # print 0
IsNull("hello") + nl + # print 0
IsNull([1,3,5]) + nl + # print 0
IsNull("") + nl + # print 1
IsNull("NULL") # print 1

96.36 How to print lists that contains objects?

In this example we will see how we can print a list contains objects.
aList = [[1,2,3] , new point(1,2,3), new point(1,2,3)]
see "print the list" + nl
see alist
see "print the item (object)" + nl
see alist[2]
class point x y z
func init p1,p2,p3 x=p1 y=p2 z=p3

Output
print the list
1
2
3
x: 1.000000
y: 2.000000
z: 3.000000
x: 1.000000
y: 2.000000
z: 3.000000
print the item (object)
x: 1.000000
y: 2.000000
z: 3.000000

96.36. How to print lists that contains objects? 1710


Ring Documentation, Release 1.5

96.37 How to insert an item to the first position in the list?

To insert an item we can use the insert(aList,nIndex,Value) function.


aList = 1:5
insert(aList,0,0)
See aList # print numbers from 0 to 5

96.38 How to print new lines and other characters?

To print new line we can use the nl variable.


See "Hello" + nl

or we can use multi-line literal as in the next example


See "Hello

"

if we want to print other characters we can use the char(nASCII) function


See char(109) + nl + # print m
char(77) # print M

96.39 Why we dont use () after the qApp class name?

When we use RingQt to create GUI application, we uses () after the class name when we create new objects for
example.
new qWidget() { setWindowTitle("Hello World") resize(400,400) show() }

but before doing that we create an object from the qApp class and we dont use () after that
Load "guilib.ring"
app = new qApp
{
win=new qWidget()
{
setwindowtitle(:test)
show()
}
exec()
}

Using () after the class name means calling the init() method in the class and passing parameters to this method.
If we used () while no init() method in the class we get the expected error message.
The class qApp dont have this method while the other classes have it because they need it to create an object using
a function that return a pointer to that object and this pointer will be stored in an attribute called pObject, for more
information see ring_qt.ring file which contains the classes.

96.37. How to insert an item to the first position in the list? 1711
Ring Documentation, Release 1.5

96.40 Why the window title bar is going outside the screen?

When we write the next code


Load "guilib.ring"
app = new qApp
{
win=new qWidget()
{
setwindowtitle(:test)
setGeometry(0,0,200,200)
show()
}
exec()
}

I would expect that the window will run at the point (0,0) with (200,200) size but the actual result is that the window
title bar is going outside the screen.
This is related to the behavior of Qt framework.
The next code will avoid the problem
load "guilib.ring"
new qApp {
new qWidget() {
move(0,0)
resize(200,200)
show()
}
exec()
}

96.41 How to create an array of buttons in GUI applications?

Check the next example:


Load "guilib.ring"

App1 = new qApp {

win1 = new qWidget() {


move(0,0)
resize(500,500)
new qPushButton(win1)
{
settext("OK")
setclickevent("click()")
}
btn1 = new qPushButton(win1)
{
setgeometry(100,100,100,30)
settext("Button1")
}

btn2 = new qPushButton(win1)


{

96.40. Why the window title bar is going outside the screen? 1712
Ring Documentation, Release 1.5

setgeometry(200,100,100,30)
settext("Button2")
}

button = [btn1, btn2]


show()
}

exec()

func click

button[1] { settext ("Button3") }


button[2] { settext ("Button4") }

96.42 How to Close a window then displaying another one?

This example demonstrates how to close a window and show another one
Load "guilib.ring"

app=new qApp
{
frmBefore=new Qwidget()
{
setWindowTitle("before!")
resize(300,320)
move(200,200)

button=new qPushButton(frmBefore)
{
setText("Close")
setClickEvent("frmBefore.close() frmMain.show()")
}

show()
}

frmMain=new Qwidget()
{
setWindowTitle("After!")
resize(300,320)
move(200,200)
}

exec()

96.43 How to create a Modal Window?

This example demonstrates how to create a modal window

96.42. How to Close a window then displaying another one? 1713


Ring Documentation, Release 1.5

load "guilib.ring"
app=new qApp
{
frmStart=new Qwidget()
{
setWindowTitle("The First Window")
resize(300,320)
move(200,200)

button=new qPushButton(frmStart)
{
setText("Show Modal Window")
resize(200,30)
setClickEvent("frmModal.show()")
}

new qPushButton(frmStart)
{
setText("Close Window")
move(0,50)
resize(200,30)
setClickEvent("frmStart.Close()")
}

show()
}

frmModal =new Qwidget()


{
setWindowTitle("Modal Window")
resize(300,320)
move(200,200)
setparent(frmStart)
setwindowmodality(true)
setwindowflags(Qt_Dialog)
}

exec()

Related Documents
http://doc.qt.io/qt-5/qtwidgets-widgets-windowflags-example.html
http://doc.qt.io/qt-5/qt.html#WindowType-enum
http://doc.qt.io/qt-5/qwindow.html#setParent
http://doc.qt.io/qt-5/qt.html#WindowModality-enum

96.44 How can I disable maximize button and resize window?

Use the method setWindowFlags()


Load "guilib.ring"
app1 = new qapp {
win1 = new qwidget() {

96.44. How can I disable maximize button and resize window? 1714

You might also like