SlideShare a Scribd company logo
Ring Documentation, Release 1.4
• void swapSections(int first, int second)
• int visualIndex(int logicalIndex)
• int visualIndexAt(int position)
• void headerDataChanged(Qt::Orientation orientation, int logicalFirst, int logicalLast)
• void setOffset(int offset)
• void setOffsetToLastSection(void)
• void setOffsetToSectionPosition(int visualSectionNumber)
• void setgeometriesChangedEvent(const char *)
• void setsectionClickedEvent(const char *)
• void setsectionCountChangedEvent(const char *)
• void setsectionDoubleClickedEvent(const char *)
• void setsectionEnteredEvent(const char *)
• void setsectionHandleDoubleClickedEvent(const char *)
• void setsectionMovedEvent(const char *)
• void setsectionPressedEvent(const char *)
• void setsectionResizedEvent(const char *)
• void setsortIndicatorChangedEvent(const char *)
• const char *getgeometriesChangedEvent(void)
• const char *getsectionClickedEvent(void)
• const char *getsectionCountChangedEvent(void)
• const char *getsectionDoubleClickedEvent(void)
• const char *getsectionEnteredEvent(void)
• const char *getsectionHandleDoubleClickedEvent(void)
• const char *getsectionMovedEvent(void)
• const char *getsectionPressedEvent(void)
• const char *getsectionResizedEvent(void)
• const char *getsortIndicatorChangedEvent(void)
• void geteventparameters(void)
69.141 QFontMetrics Class
C++ Reference : http://doc.qt.io/qt-5/QFontMetrics.html
Parameters : QFont
• int ascent(void)
• int averageCharWidth(void)
• QRect boundingRect(QChar ch)
69.141. QFontMetrics Class 788
Ring Documentation, Release 1.4
• QRect boundingRect_2( QString text)
• QRect boundingRect_3(int x, int y, int width, int height, int flags, QString text, int tabStops , int * tabArray )
• QRect boundingRect_4( QRect rect, int flags, QString text, int tabStops , int * tabArray )
• int descent(void)
• QString elidedText( QString text, Qt::TextElideMode mode, int width, int flags )
• int height(void)
• bool inFont(QChar ch)
• bool inFontUcs4(uint character)
• int leading(void)
• int leftBearing(QChar ch)
• int lineSpacing(void)
• int lineWidth(void)
• int maxWidth(void)
• int minLeftBearing(void)
• int minRightBearing(void)
• int overlinePos(void)
• int rightBearing(QChar ch)
• QSize size(int flags, QString text, int tabStops , int * tabArray )
• int strikeOutPos(void)
• QRect tightBoundingRect( QString text)
• int underlinePos(void)
• int width( QString text, int len )
• int width_2(QChar ch)
• int xHeight(void)
69.142 QSplashScreen Class
C++ Reference : http://doc.qt.io/qt-5/QSplashScreen.html
Parameters : QPixmap
Parent Class : QWidget
• void finish(QWidget *mainWin)
• QPixmap pixmap(void)
• void repaint(void)
• void setPixmap(QPixmap pixmap)
• void clearMessage(void)
• void showMessage(QString message, int alignment ,QColor color)
69.142. QSplashScreen Class 789
Ring Documentation, Release 1.4
69.143 QBoxLayout Class
C++ Reference : http://doc.qt.io/qt-5/QBoxLayout.html
Parameters : QBoxLayout::Direction dir, QWidget *parent
Parent Class : QLayout
• void addLayout(QLayout * layout, int stretch )
• void addSpacerItem(QSpacerItem * spacerItem)
• void addSpacing(int size)
• void addStretch(int stretch )
• void addStrut(int size)
• void addWidget(QWidget * widget, int stretch , Qt::Alignment alignment )
• QBoxLayout::Direction direction(void)
• void insertLayout(int index, QLayout * layout, int stretch )
• void insertSpacerItem(int index, QSpacerItem * spacerItem)
• void insertSpacing(int index, int size)
• void insertStretch(int index, int stretch )
• void insertWidget(int index, QWidget * widget, int stretch , Qt::Alignment alignment )
• void setDirection(QBoxLayout::Direction direction)
• void setSpacing(int spacing)
• void setStretch(int index, int stretch)
• bool setStretchFactor(QWidget * widget, int stretch)
• bool setStretchFactor_2(QLayout * layout, int stretch)
• int spacing(void)
• int stretch(int index)
69.144 QLayout Class
C++ Reference : http://doc.qt.io/qt-5/QLayout.html
Parameters : QWidget *
Parent Class : QObject
• bool activate(void)
• void addWidget(QWidget *w)
• QMargins contentsMargins(void)
• QRect contentsRect(void)
• void getContentsMargins(int *left, int *top, int *right, int *bottom)
• bool isEnabled(void)
• QWidget *menuBar(void)
69.143. QBoxLayout Class 790
Ring Documentation, Release 1.4
• QWidget *parentWidget(void)
• void removeItem(QLayoutItem *item)
• void removeWidget(QWidget *widget)
• bool setAlignment(QWidget *w, Qt::Alignment alignment)
• void setAlignment_2(Qt::Alignment alignment)
• bool setAlignment_3(QLayout *l, Qt::Alignment alignment)
• void setContentsMargins(int left, int top, int right, int bottom)
• void setContentsMargins_2(QMargins margins)
• void setEnabled(bool enable)
• void setMenuBar(QWidget *widget)
• void setSizeConstraint(QLayout::SizeConstraint)
• void setSpacing(int)
• QLayout::SizeConstraint sizeConstraint(void)
• int spacing(void)
• void update(void)
• QSize closestAcceptableSize( QWidget * widget, QSize size)
69.145 QLinearGradient Class
C++ Reference : http://doc.qt.io/qt-5/QLinearGradient.html
Parameters : void
Parent Class : QGradient
• QPointF finalStop(void)
• void setFinalStop(QPointF stop)
• void setFinalStop_2(qreal x,qreal y)
• void setStart(QPointF start)
• void setStart_2(qreal x,qreal y)
• QPointF start(void)
69.146 QGradient Class
C++ Reference : http://doc.qt.io/qt-5/QGradient.html
Parameters : void
• QGradient::CoordinateMode coordinateMode(void)
• void setColorAt(qreal position, QColor color)
• void setCoordinateMode(QGradient::CoordinateMode mode)
• void setSpread(QGradient::Spread method)
69.145. QLinearGradient Class 791
Ring Documentation, Release 1.4
• void setStops(QGradientStops stopPoints)
• QGradient::Spread spread(void)
• QGradientStops stops(void)
• QGradient::Type type(void)
69.147 QPointF Class
C++ Reference : http://doc.qt.io/qt-5/QPointF.html
Parameters : void
• bool isNull(void)
• qreal manhattanLength(void)
• qreal rx(void)
• qreal ry(void)
• void setX(qreal x)
• void setY(qreal y)
• QPoint toPoint(void)
• qreal x(void)
• qreal y(void)
69.148 QPoint Class
C++ Reference : http://doc.qt.io/qt-5/QPoint.html
Parameters : void
• bool isNull(void)
• int manhattanLength(void)
• int rx(void)
• int ry(void)
• void setX(int x)
• void setY(int y)
• int x(void)
• int y(void)
69.149 QScrollArea Class
C++ Reference : http://doc.qt.io/qt-5/QScrollArea.html
Parameters : QWidget *parent
Parent Class : QAbstractScrollArea
69.147. QPointF Class 792
Ring Documentation, Release 1.4
• Qt::Alignment alignment(void)
• void ensureVisible(int x, int y, int xmargin , int ymargin )
• void ensureWidgetVisible(QWidget *childWidget, int xmargin , int ymargin )
• void setAlignment(Qt::Alignment)
• void setWidget(QWidget *widget)
• void setWidgetResizable(bool resizable)
• QWidget *takeWidget(void)
• QWidget *widget(void)
• bool widgetResizable(void)
69.150 QSplitter Class
C++ Reference : http://doc.qt.io/qt-5/QSplitter.html
Parameters : QWidget *parent
Parent Class : QFrame
• void addWidget(QWidget *widget)
• bool childrenCollapsible(void)
• int count(void)
• void getRange(int index, int *min, int *max)
• QSplitterHandle * handle(int index)
• int handleWidth(void)
• int indexOf(QWidget *widget)
• void insertWidget(int index, QWidget *widget)
• bool isCollapsible(int index)
• bool opaqueResize(void)
• Qt::Orientation orientation(void)
• void refresh(void)
• bool restoreState( QByteArray state)
• QByteArray saveState(void)
• void setChildrenCollapsible(bool)
• void setCollapsible(int index, bool collapse)
• void setHandleWidth(int)
• void setOpaqueResize(bool opaque )
• void setOrientation(Qt::Orientation)
• void setSizes( QList<int> list)
• void setStretchFactor(int index, int stretch)
69.150. QSplitter Class 793
Ring Documentation, Release 1.4
• QList<int> sizes(void)
• QWidget * widget(int index)
69.151 QCompleter Class
C++ Reference : http://doc.qt.io/qt-5/QCompleter.html
Parameters : QObject *parent
Parent Class : QObject
• Qt::CaseSensitivity caseSensitivity(void)
• int completionColumn(void)
• int completionCount(void)
• QCompleter::CompletionMode completionMode(void)
• QAbstractItemModel *completionModel(void)
• QString completionPrefix(void)
• int completionRole(void)
• QString currentCompletion(void)
• QModelIndex currentIndex(void)
• int currentRow(void)
• Qt::MatchFlags filterMode(void)
• int maxVisibleItems(void)
• QAbstractItemModel * model(void)
• QCompleter::ModelSorting modelSorting(void)
• QAbstractItemView * popup(void)
• void setCaseSensitivity(Qt::CaseSensitivity caseSensitivity)
• void setCompletionColumn(int column)
• void setCompletionMode(QCompleter::CompletionMode mode)
• void setCompletionRole(int role)
• bool setCurrentRow(int row)
• void setFilterMode(Qt::MatchFlags filterMode)
• void setMaxVisibleItems(int maxItems)
• void setModel(QAbstractItemModel *model)
• void setModelSorting(QCompleter::ModelSorting sorting)
• void setPopup(QAbstractItemView *popup)
• void setWidget(QWidget *widget)
• QWidget * widget(void)
• bool wrapAround(void)
69.151. QCompleter Class 794
Ring Documentation, Release 1.4
• void complete(QRect rect)
• void setCompletionPrefix(QString prefix)
• void setWrapAround(bool wrap)
69.152 QCompleter2 Class
C++ Reference : http://doc.qt.io/qt-5/QCompleter2.html
Parameters : QAbstractItemModel *model, QObject *parent
Parent Class : QCompleter
69.153 QCompleter3 Class
C++ Reference : http://doc.qt.io/qt-5/QCompleter3.html
Parameters : QStringList list, QObject *parent
Parent Class : QCompleter
69.154 QString2 Class
C++ Reference : http://doc.qt.io/qt-5/QString2.html
Parameters : void
• QString append( QString str)
• QStringList split( QString sep, QString::SplitBehavior behavior , Qt::CaseSensitivity cs )
• QStringList split_2(QChar sep, QString::SplitBehavior behavior , Qt::CaseSensitivity cs )
• QStringList split_3( QRegExp rx, QString::SplitBehavior behavior )
• QStringList split_4( QRegularExpression re, QString::SplitBehavior behavior )
69.155 QProcess Class
C++ Reference : http://doc.qt.io/qt-5/QProcess.html
Parameters : QObject *
Parent Class : QIODevice
• QStringList arguments(void)
• void closeReadChannel(QProcess::ProcessChannel channel)
• void closeWriteChannel(void)
• QProcess::ProcessError error(void)
• int exitCode(void)
• QProcess::ExitStatus exitStatus(void)
69.152. QCompleter2 Class 795
Ring Documentation, Release 1.4
• QProcess::InputChannelMode inputChannelMode(void)
• QProcess::ProcessChannelMode processChannelMode(void)
• QProcessEnvironment processEnvironment(void)
• QString program(void)
• QByteArray readAllStandardError(void)
• QByteArray readAllStandardOutput(void)
• QProcess::ProcessChannel readChannel(void)
• void setArguments( QStringList arguments)
• void setInputChannelMode(QProcess::InputChannelMode mode)
• void setProcessChannelMode(QProcess::ProcessChannelMode mode)
• void setProcessEnvironment( QProcessEnvironment environment)
• void setProgram( QString program)
• void setReadChannel(QProcess::ProcessChannel channel)
• void setStandardErrorFile( QString fileName, QIODevice::OpenMode mode )
• void setStandardInputFile( QString fileName)
• void setStandardOutputFile( QString fileName, QIODevice::OpenMode mode )
• void setStandardOutputProcess(QProcess *destination)
• void setWorkingDirectory( QString dir)
• void start( QString program, QStringList arguments, QIODevice::OpenMode mode )
• void start_2( QString command, QIODevice::OpenMode mode )
• void start_3(QIODevice::OpenMode mode )
• QProcess::ProcessState state(void)
• bool waitForFinished(int msecs )
• bool waitForStarted(int msecs )
• QString workingDirectory(void)
• void kill(void)
• void terminate(void)
• void setreadyReadStandardErrorEvent(const char *)
• void setreadyReadStandardOutputEvent(const char *)
• const char *getreadyReadStandardErrorEvent(void)
• const char *getreadyReadStandardOutputEvent(void)
69.156 QMdiArea Class
C++ Reference : http://doc.qt.io/qt-5/QMdiArea.html
Parameters : QWidget *
69.156. QMdiArea Class 796
Ring Documentation, Release 1.4
Parent Class : QAbstractScrollArea
• QMdiArea::WindowOrder activationOrder(void)
• QMdiSubWindow * activeSubWindow(void)
• QMdiSubWindow * addSubWindow(QWidget * widget, Qt::WindowFlags windowFlags )
• QBrush background(void)
• QMdiSubWindow * currentSubWindow(void)
• bool documentMode(void)
• void removeSubWindow(QWidget * widget)
• void setActivationOrder(QMdiArea::WindowOrder order)
• void setBackground( QBrush background)
• void setDocumentMode(bool enabled)
• void setOption(QMdiArea::AreaOption option, bool on )
• void setTabPosition(QTabWidget::TabPosition position)
• void setTabShape(QTabWidget::TabShape shape)
• void setTabsClosable(bool closable)
• void setTabsMovable(bool movable)
• void setViewMode(QMdiArea::ViewMode mode)
• QList<QMdiSubWindow *> subWindowList(QMdiArea::WindowOrder order )
• QTabWidget::TabPosition tabPosition(void)
• QTabWidget::TabShape tabShape(void)
• bool tabsClosable(void)
• bool tabsMovable(void)
• bool testOption(QMdiArea::AreaOption option)
• QMdiArea::ViewMode viewMode(void)
• void activateNextSubWindow(void)
• void activatePreviousSubWindow(void)
• void cascadeSubWindows(void)
• void closeActiveSubWindow(void)
• void closeAllSubWindows(void)
• void setActiveSubWindow(QMdiSubWindow * window)
• void tileSubWindows(void)
69.157 QMdiSubWindow Class
C++ Reference : http://doc.qt.io/qt-5/QMdiSubWindow.html
Parameters : QWidget *
69.157. QMdiSubWindow Class 797
Ring Documentation, Release 1.4
Parent Class : QWidget
• bool isShaded(void)
• int keyboardPageStep(void)
• int keyboardSingleStep(void)
• QMdiArea * mdiArea(void)
• void setKeyboardPageStep(int step)
• void setKeyboardSingleStep(int step)
• void setOption(QMdiSubWindow::SubWindowOption option, bool on )
• void setSystemMenu(QMenu * systemMenu)
• void setWidget(QWidget * widget)
• QMenu * systemMenu(void)
• bool testOption(QMdiSubWindow::SubWindowOption option)
• QWidget * widget(void)
• void showShaded(void)
• void showSystemMenu(void)
69.158 QCursor Class
C++ Reference : http://doc.qt.io/qt-5/QCursor.html
Parameters : void
• QBitmap *bitmap(void)
• QPoint hotSpot(void)
• QBitmap *mask(void)
• QPixmap pixmap(void)
• void setShape(Qt::CursorShape shape)
• Qt::CursorShape shape(void)
69.159 QListView Class
C++ Reference : http://doc.qt.io/qt-5/QListView.html
Parameters : QWidget *
Parent Class : QAbstractItemView
• int batchSize(void)
• void clearPropertyFlags(void)
• QListView::Flow flow(void)
• QSize gridSize(void)
• bool isRowHidden(int row)
69.158. QCursor Class 798
Ring Documentation, Release 1.4
• bool isSelectionRectVisible(void)
• bool isWrapping(void)
• QListView::LayoutMode layoutMode(void)
• int modelColumn(void)
• QListView::Movement movement(void)
• QListView::ResizeMode resizeMode(void)
• void setBatchSize(int batchSize)
• void setFlow(QListView::Flow flow)
• void setGridSize( QSize size)
• void setLayoutMode(QListView::LayoutMode mode)
• void setModelColumn(int column)
• void setMovement(QListView::Movement movement)
• void setResizeMode(QListView::ResizeMode mode)
• void setRowHidden(int row, bool hide)
• void setSelectionRectVisible(bool show)
• void setSpacing(int space)
• void setUniformItemSizes(bool enable)
• void setViewMode(QListView::ViewMode mode)
• void setWordWrap(bool on)
• void setWrapping(bool enable)
• int spacing(void)
• bool uniformItemSizes(void)
• QListView::ViewMode viewMode(void)
• bool wordWrap(void)
69.160 QAxObject Class
C++ Reference : http://doc.qt.io/qt-5/QAxObject.html
Parameters : QString
Parent Class : QAxBase
69.161 QAxBase Class
C++ Reference : http://doc.qt.io/qt-5/QAxBase.html
Parameters : QWidget *
Parent Class : QObject
• QVariant asVariant(void)
69.160. QAxObject Class 799
Ring Documentation, Release 1.4
• QString control(void)
• void disableClassInfo(void)
• void disableEventSink(void)
• void disableMetaObject(void)
• QVariant dynamicCall( char *function)
• QVariant dynamicCall_2( char *function,QString)
• QString generateDocumentation(void)
• bool isNull(void)
• QAxObject * querySubObject( char *name)
• bool setControl( QString )
• QStringList verbs(void)
69.162 QUuid Class
C++ Reference : http://doc.qt.io/qt-5/QUuid.html
Parameters : void
• QString toString(void)
69.163 QToolButton Class
C++ Reference : http://doc.qt.io/qt-5/QToolButton.html
Parameters : QWidget *
Parent Class : QAbstractButton
• Qt::ArrowType arrowType(void)
• bool autoRaise(void)
• QAction * defaultAction(void)
• QMenu * menu(void)
• QToolButton::ToolButtonPopupMode popupMode(void)
• void setArrowType(Qt::ArrowType type)
• void setAutoRaise(bool enable)
• void setMenu(QMenu * menu)
• void setPopupMode(QToolButton::ToolButtonPopupMode mode)
• Qt::ToolButtonStyle toolButtonStyle(void)
• void setDefaultAction(QAction * action)
• void setToolButtonStyle(Qt::ToolButtonStyle style)
• void showMenu(void)
• void settriggeredEvent(const char *)
69.162. QUuid Class 800
Ring Documentation, Release 1.4
• const char *gettriggeredEvent(void)
• void setClickEvent(const char *)
• const char *getClickEvent(void)
69.164 QSerialPort Class
C++ Reference : http://doc.qt.io/qt-5/QSerialPort.html
Parameters : QObject *
Parent Class : QIODevice
• qint32 baudRate(QSerialPort::Directions directions)
• bool clear(QSerialPort::Directions directions)
• void clearError(void)
• QSerialPort::DataBits dataBits(void)
• QSerialPort::SerialPortError error(void)
• QSerialPort::FlowControl flowControl(void)
• bool flush(void)
• void *handle(void)
• bool isBreakEnabled(void)
• bool isDataTerminalReady(void)
• bool isRequestToSend(void)
• QSerialPort::Parity parity(void)
• QSerialPort::PinoutSignals pinoutSignals(void)
• QString portName(void)
• qint64 readBufferSize(void)
• bool setBaudRate(qint32 baudRate, QSerialPort::Directions directions)
• bool setBreakEnabled(bool set)
• bool setDataBits(QSerialPort::DataBits dataBits)
• bool setDataTerminalReady(bool set)
• bool setFlowControl(QSerialPort::FlowControl flowControl)
• bool setParity(QSerialPort::Parity parity)
• void setPort(QSerialPortInfo serialPortInfo)
• void setPortName(QString name)
• void setReadBufferSize(qint64 size)
• bool setRequestToSend(bool set)
• bool setStopBits(QSerialPort::StopBits stopBits)
• QSerialPort::StopBits stopBits(void)
69.164. QSerialPort Class 801
Ring Documentation, Release 1.4
• void setbaudRateChangedEvent(const char *)
• void setbreakEnabledChangedEvent(const char *)
• void setdataBitsChangedEvent(const char *)
• void setdataTerminalReadyChangedEvent(const char *)
• void seterrorEvent(const char *)
• void setflowControlChangedEvent(const char *)
• void setparityChangedEvent(const char *)
• void setrequestToSendChangedEvent(const char *)
• void setstopBitsChangedEvent(const char *)
• const char *getbaudRateChangedEvent(void)
• const char *getbreakEnabledChangedEvent(void)
• const char *getdataBitsChangedEvent(void)
• const char *getdataTerminalReadyChangedEvent(void)
• const char *geterrorEvent(void)
• const char *getflowControlChangedEvent(void)
• const char *getparityChangedEvent(void)
• const char *getrequestToSendChangedEvent(void)
• const char *getstopBitsChangedEvent(void)
69.165 QSerialPortInfo Class
C++ Reference : http://doc.qt.io/qt-5/QSerialPortInfo.html
Parameters : void
• QString description(void)
• bool hasProductIdentifier(void)
• bool hasVendorIdentifier(void)
• bool isBusy(void)
• bool isNull(void)
• QString manufacturer(void)
• QString portName(void)
• quint16 productIdentifier(void)
• QString serialNumber(void)
• void swap(QSerialPortInfo other)
• QString systemLocation(void)
• quint16 vendorIdentifier(void)
69.165. QSerialPortInfo Class 802
CHAPTER
SEVENTY
FREQUENTLY ASKED QUESTIONS (FAQ)
70.1 Why do we need Yet Another Programming Language (YAPL)?
The language comes with better support for Natural Language Programming and Declarative Programming. The inno-
vation comes in supporting these paradigms with new practical techniques on the top of Object-Oriented Programming
and Functional Programming. Ring provide the programmers with the tools required to build a Natural Language like
Supernova or Declarative Language like REBOL and QML without the need to know anything about (Compilers and
Parsing). You get the language constructs ready for use to create domain-specific languages in a fraction of time.
Check the Supernova programming language, In this language you can type (I want window and the window title is
hello world.) and it will create a GUI window with “Hello, World!” as the window title. When I created Supernova
language in 2010. I discovered that using the Natural Code can be (Like English without limits and we can get the
human language power in programming) but to implement that You need a new language that are
1. General Purpose
2. Practical
3. Can create Natural Languages very quickly.
So we can get a System that can increase ease of use and productivity to the maximum level.
Ring is the best language to do that. So I created Ring to achieve this goal.
Supernova was just a test for the idea. To get a near view about what are the Advantages and Disadvantages. After
testing the new ideas you provide something practical. So we have Ring after Supernova. A story that maybe similar
to having Python after ABC. Python avoid ABC problems but bring ABC advantages. Also Ring learn from Ruby and
ROR story. The language power could appears in Frameworks better than direct usage as a general purpose language.
Also Ring comes with a clear goal/motivation (Creating a new version of the PWCT Software) something learned
from designing the C language to create the Unix Operating System. You have a goal that direct you in each design
decision.
You will understand the value of our decisions once you start trying to solve the problem that we will use Ring to
solve. Could you enable any one in the world without knowledge about computer programming concepts to create very
powerful software? In science the answer is (Visual Programming) and (Natural Programming). In practical we still
away from switching to these paradigms without introducing other problems. Ring is designed to solve this problem.
It’s designed to provide Natural Programming in a practical way. And to create a powerful Visual Programming tool.
Ring is designed to be a new world of programming after 10 years of research in Visual Programming and Natural
Languages.
The Ring Programming Language (Compiler+VM) is developed 100% using Visual Programming without writing a
single line of code. I used my tool (Programming Without Coding Technology) to design everything and get the C
code generated for me. Advantages ?
1. More Faster
2. No Syntax Errors
803
Ring Documentation, Release 1.4
3. Easy to understand and manage the code because the Abstraction level is more higher
4. No Critical Disadvantages because you can control everything as writing your code.
From my experience in using Visual Programming for 10 years and Natural Programming for 5 years I designed Ring
to move the knowledge to mainstream programmers by providing a practical language that support these ideas.
I agree that each programmer/developer has the freedom to form his opinions about any software including program-
ming languages. Ring is not an exception but you may miss the idea behind the language. It’s innovative and may
help you to think different about how to solve your problems. Maybe this is not clear to many programmers because
It’s practical language and includes many features known to programmers and when a programmer look at a language
he/she may think that nothing new because it’s familiar. I created Ring to solve problems in a different way. Where I
will start programming just by describing the software using new natural interfaces that I will implement later when
I move from the design stage to the implementation stage. (I don’t determine the time to switch between stages, You
are free to use Agile methods). Since Ring is a new language you have 3 options.
1. Just don’t care.
2. Think in the future of the language and help us if you understand the idea and want to contribute.
3. Wait and come back again in the future to use it.
Summary:
• Ring is designed based on a need to develop a new version of the PWCT software.
Once we finish PWCT 2.0 we will have good and large software developed using Ring.
• We will push Declarative and Natural paradigms many steps forward. Also in next versions
we have a plan to present a new paradigm for Network Programming and Concurrency. We tested this new paradigm
through simple prototypes during the last years and we will integrate it with Ring in Future releases.
• It’s a new language, just Ring version 1.4. A serious ecosystem comes along the way.
70.2 Why Ring is weakly typed?
Because it’s more Natural, and Faster and this is important for the language goals. What comes first is what you want.
When you type “Print : ” + 5 , The String comes first then 5 will be converted to a String. while when you type 5 +
“10” The number comes first so “10” will be converted to 10. This help a lot to quickly convert between numbers and
strings using the same operator. If you want to prevent conversion (Write code that prevent conversion) In these cases
you will notice that what you are writing is less code (And can be removed).
Weakly Typed = Automatic Conversion and Automatic is Good Thing and is better than Manual if you know how to
use it correctly.
70.3 What are the advantages to using Ring over Lisp or Smalltalk?
Smalltalk and Lisp are GREAT languages. I like many of the concepts behind them but I’m sure that selecting the
right programming language is based on the problem and comes after the problem definition. I have a problem that I
want to solve and these GREAT languages are not ideal for this problem so I designed Ring.
When you design a new language, You can learn from the past but you must look forward and live in the Future. What
you know about Natural Programming maybe based on the Old Knowledge about the power of these paradigms in the
practical world and I agree with you but I see another techniques that can be applied to get this to work in practical.
What you miss about Natural Language is that they are Context Sensitive and this means we can use it and think
different about how we can express our ideas.
70.2. Why Ring is weakly typed? 804
Ring Documentation, Release 1.4
example : I want window contains 3 buttons.
In one sentence I created 4 objects (The window and the three buttons) and added the buttons to the window. The idea
of Natural Programming is to get many things done like that.
70.4 Why Ring is largely focussed on UI creation?
Yes UI creation is one of the important things in the language features because it’s designed to create a visual pro-
gramming tool, But the language is a multi-paradigm language where we can select the programming paradigm based
on the problem.
70.5 Is Ring some sort of improvement over PHP?
Ring is not designed to replace PHP, Lua and/or Smalltalk. And Ring support for Declarative Programming and
Natural Language Programming is very innovative and much better than staying with Procedural, Object-Oriented and
Functional Languages. Ring see the future in programming without code (Using Natural Languages) and is designed
to support that.
70.6 What are the advantages to using Ring over native C or C++?
Ring provides a better way to mix between different programming paradigms in solving problems.
The different programming paradigms play well together in the same language.
1. It’s easy to switch from one programming paradigm to another one because the language constructs use similar
syntax for similar concepts.
2. The paradigms are provided to interact and used together in different layers in the software.
for example you can create a game engine using object-oriented programming but write the game code using declara-
tive programming or natural programming and behind the scene your declarative or natural code will use the object-
oriented classes.
3. Ring is very productive and natural programming language than C/C++ languages.
4. Ring is a dynamic language. We can generate and execute code during the runtime. We have dynamic typing
and weakly typed language for flexibility.
5. The Garbage collector is generational (escape analysis) and also use reference counting. it’s very fast and still
provide control to the programmer who can delete memory at any time.
6. Ring Compiler and Virtual Machine is just 15,000 lines of ANSI C code that can be compiled and used in any
platform.
7. You can use C/C++ libraries and Ring comes with code generator to create wrappers from C functions or C++
classes. so when you need more performance or when you need to use more libraries you can easily do that.
70.7 What is the difference between Ring and Python? And is Ring
Open Source?
Yes the language is Free Open Source (MIT license)
70.4. Why Ring is largely focussed on UI creation? 805
Ring Documentation, Release 1.4
In general I like Python and Ruby but I was looking for a language more suitable for creating the next version of the
Programming Without Coding Technology (PWCT) software so I started the Ring design.
Some simple changes that matters for my goal are
1. Not case sensitive
2. The list index start from 1
3. You can call functions before definition
4. Don’t use Python syntax like (indentation, using self, :, pass & _)
5. Weakly typed (convert automatically between types based on context)
6. The programs follow simple and constant structure (Statements then functions then packages and classes)
7. Using the ‘=’ operator for assignment and for testing values
Critical changes are
1. Small Language : The Ring compiler + Virtual Machine = 15K lines of C code , the other 85K lines are related
to libraries and are optional when we go for using the language in C/C++ programs.
2. The Garbage collector : Uses Escape Analysis/Reference counting and give the programmer the ability to
determine when to delete memory using the assignment operator
3. Compact Syntax : Ring is not line sensitive, you don’t need to write ; or press ENTER to separate between
statements
4. Using { } to access the object then using the object attributes and methods directly
5. Natural Programming : It’s very easy to create natural interfaces using Ring based on OOP
6. Declarative Programming using Nested Structure
The Ring programming language is designed based on my experience from using many other languages like C, C++,
C#, Lua, PHP, Python, Ruby, Harbour, Basic and Supernova And the language comes with innovative features added
to achieve the language goal
• Applications programming language.
• Productivity and developing high quality solutions that can scale.
• Small and fast language that can be embedded in C/C++ projects.
• Simple language that can be used in education and introducing Compiler/VM concepts.
• General-Purpose language that can be used for creating domain-specific libraries, frameworks and tools.
• Practical language designed for creating the next version of the Programming Without Coding Technology
software.
70.8 What are the advantages to using Ring over Perl, PHP, Python
or Ruby?
1. Ring is New and Innovative. The language will let you think different about programming.
2. Ring is Smaller. (Lessons learned from the Lua language)
3. Ring is Simple. (Lessons learned from the BASIC and Clipper/Harbour languages)
4. Ring is more Natural. (Lessons learned from the Supernova language)
5. Ring is more Declarative. (Lessons learned from REBOL and QML languages)
70.8. What are the advantages to using Ring over Perl, PHP, Python or Ruby? 806
Ring Documentation, Release 1.4
6. Ring Implementation is Transparent, Visual and comes with Rich Features.
70.9 What are the advantages to using Ring over Tcl or Lua?
1. Clean Code (More Natural)
2. More Features (A lot of useful programming paradigms)
70.10 What are the advantages to using Ring over C# or Java?
1. Compact Code (Clean and Natural), More Productivity and Flexibility.
2. Better support for Declarative Programming and Natural Programming
70.11 The documentation says functional programming is sup-
ported, but then this happens?
The question was about this code
f = func {
a = 42
return func { return a }
}
innerF = call f()
call innerF()
Output:
Using uninitialized variable : a In function _ring_anonymous_func_16601()
The Answer:
• It’s Anonymous Functions, i.e. Not Closures.
• It’s Just Ring version 1.4 (Many developers asked about supporting Closures) and during language development
we may add new features that doesn’t go against the language goals or sprite.
• You can use classes and objects when you want to merge between the state and functions to provide a clear
solution.
• You can use Lists and put the anonymous function inside the List then return the list that contains the state and
the function. Pass the list to the function when you use it.
• You can use eval() and substr() to add the variable value directly to the anonymous function before return.
• We protect you from other scopes when you define the function. In Ring we provided the Three Scopes Rule
where at each point you have only at maximum three scopes (Global, Object Scope and Local Scope).
• We don’t get everything from everywhere to be like others! We don’t need to do that. If we will think like that
then we will create a very complex language or we will save our time and use other languages.
• When you think about learning or studying a new language concentrate about (What is new?) and (What is
better in this language?) to know when to use it. Don’t compare a new language just released little months ago
with languages started many years ago and expect to find everything that you used to have.
70.9. What are the advantages to using Ring over Tcl or Lua? 807
Ring Documentation, Release 1.4
• Each programming language miss features in other languages. The idea is not the Features. it’s the sprite and
ability behind all of the features together.
70.12 Why the ability to define your own languages Instead of just
handing over the syntax so you can parse it using whatever
code you like?
It’s innovation - You create natural statements without the need to learn about parsing. You just use Classes which is
intelligent decision (where later we can mix between classes to support more statements based on the context - We can
change and translate the defined statements and many more!). Also the statements are added in Ring World where you
can use any Ring statement.
70.13 Why you can specify the number of loops you want to break
out of?
The language support programming in the small and programming in the large. The selection of what features to use
is based on what are you going to do. Any programmer can write bad code in any language if he/she wants to do that.
The idea is what must be done from the language design to prevent errors without causing other problems like killing
flexibility.
Read some source code in the Linux Kernel and Ruby Implementation for example, You will find good usage for
GOTO as a practical example that General Rules are not for All Use Cases and great programmers know when to
break the rules. I’m not saying go and use GOTO or saying Ring add things like that. But the ability to break more
than one loop and/or the ability to break the loop from sub functions is practical for small programs.
Anyway these are some of the small new things added by the language (Not the big idea).
70.14 Why Ring uses ‘See’, ‘Give’, ‘But’ and ‘Ok’ Keywords?
See and Give are selected not to be “opposite actions” but to reflect what I want to do as a programmer.
When I want to see something on the screen I use ‘See’.
When I want to give some input to the program I use ‘Give’.
My selection of “but” and “ok” is based on selecting keywords that can be written quickly.
Also using “but” is easy to remember than elseif/elif/elsif where each language select a different keyword.
In Ring 1.1 and later versions All of this is just an option.
You can use ‘Put’ and ‘Get’ instead of ‘See’ and ‘Give’
You can use ‘elseif’ and ‘end’ insetad of ‘But’ and ‘Ok’
It’s your choice. In Ring we have syntax flexibility where we provide more than one style.
Also you can change the language keywords and operators.
Also you can define new natural languages too.
70.12. Why the ability to define your own languages Instead of just handing over the syntax so you
can parse it using whatever code you like?
808
Ring Documentation, Release 1.4
70.15 What is the philosophy behind data types in Ring?
The Ring programming language is designed to be SMALL. The language provides the basic constructs that you need
to do anything! One of the goals is to keep the basic constructs simple and small as possible.
Using Lists in Ring you can
• Create Arrays (one data type)
• Create Lists (Mix of data types)
• Create Tree (Nested arrays)
• Use String Index (Looks like Dictionary/Hash Table)
The same principle is applied to Numbers
• You can use the number for int value
• You can use the number for double value
• You can use the number for Boolean value (True/False)
The sample principle is applied for Strings
• You can use the string for storing one character
• You can use the string for storing text (one or many lines)
• You can use the string for storing binary data
• You can use the string for storing date
• You can use the string for storing time
• You can use the string for storing NULL values (empty strings)
And we have Object Oriented Support + Operator Overloading where the programmer can define new data types and
use them as default types defined by the language
So We have
• A small and simple language that someone can pick in little days
• A fast language that provide primitive types (String ? Number ? List ? Object)
• A flexible language that can be extended using OOP to add new types according to the application domain
70.16 What about the Boolean values in Ring?
You can use true for 1 and false for 0
when you test the result of Boolean expressions in your code.
Just when you print the value using the see command you will see 1 for (true) and 0 for (false)
Why ?
Because Ring contains only 4 types of variables
1. Number
2. String
3. List
70.15. What is the philosophy behind data types in Ring? 809
Ring Documentation, Release 1.4
4. Object
The first type (Number) is used to represent int, double and Boolean values.
The second type (String) is used to represent char, array of characters, date and time.
The third type (List) is used to represent Arrays of one type, Arrays of more than one type, Hash (Dictionary), Tree,
etc.
The object can be an object created from a Ring class (Any Class) or just a C Pointer that we get from calling a C/C++
function/method.
Why ?
The Ring is designed to give the programmer/developer the most simple constructs that can be used to do everything.
The programmer/developer can customize the language by creating new classes (and use operator overloading) to get
more types that he care about according to the problem domain.
Why ?
Because simple is better, and easy to learn and remember! And this provide flexibility to convert between high level
types that can be represented using the same basic type
70.17 What is the goal of including the “Main” function in Ring?
The main function is very important, you need it when you want to write statements that uses local variables instead
of the Global scope.
Example:
x = 10
myfunc()
See "X value = " + X # here I expect that x will be (10)
# but I will get another value (6) because myfunc() uses x !
Func myfunc
for x = 1 to 5
See x + nl
next
Output:
1
2
3
4
5
X value = 6
Now using the Main function
Func Main
x = 10
myfunc()
See "X value = " + X
Func myfunc
for x = 1 to 5
See x + nl
next
70.17. What is the goal of including the “Main” function in Ring? 810
Ring Documentation, Release 1.4
Output
1
2
3
4
5
X value = 10
70.18 Why the list index start from 1 in Ring?
It’s about how we count in the real world, when we have three apples in our hand
we say 1 2 3
We don’t start from 0
The question must be why the other languages start from 0 ?
The answer is, because this is related to the machine and how we deal with values and memory address.
Example
we have array called myarray[5]
In memory : myarray will have an address
The first item will be stored in that address
The second item will come after that address and so on
Now when we need to point to the first item we need the address of myarray
So we type myarray[0] because myarray + 0 result will still point to the first item
for the second item myarray[1] because myarray + 1 result will point to the second item and so on
In Low Level languages or languages near to the machine it’s good to be like this
But for high level language designed for applications it’s better to be natural
Example
mylist = [1,2,3,4,5]
for x = 1 to len(mylist)
see x + nl
next
In the previous example we start from 1 to the length of the array if the index starts from 0 we will write
for x = 0 to len(mylist)-1
or remember the for loop in other languages
for(x=0 ; x<nMax ; x++ )
You will use the < operator !
70.19 Is there constructor methods in Ring?
When you create new object for example
70.18. Why the list index start from 1 in Ring? 811
Ring Documentation, Release 1.4
new point
1 - Ring will allocate dynamic memory space to be used for the new object attributes that Ring doesn’t know anything
about them.
2 - Ring will change the current local scope and the current object scope to use the object state created in step (1)
3 - Ring will move the execution to the class Region (After the class name and before any methods)
4 - Any Instructions/Code in the class region will be executed as any Ring code
5 - Control is moved from the class region to the location of (new point) once we reach the end of the class region or
we uses a Return command.
So All attributes that added to the object are dynamic attributes, this mean that you can control what attributes will be
added through the runtime.
Example:
$3D = False
see new point
$3D = True
see new point
class point
x y
if not $3D return ok
z
Output:
x: NULL
y: NULL
x: NULL
y: NULL
z: NULL
You have an option to call init() method directly when you create a new object
This method can do anything with the object attributes as it will be called after creating the object and executing the
class region code.
p1 = new point3d(100,200,300)
see p1
class point3d
x y z
func init p1,p2,p3
x=p1 y=p2 z=p3
70.20 What happens when we create a new object?
1- When you create an object, the class region code will be executed and you will have the object attributes based on
the code in that region
2- Ring don’t care about the object methods until you start calling a method
3- When you call a method, Ring will check the object class and the class parent (if you are using inheritance) and
will collect the methods for you to be used now or later from any object that belong to the same class.
70.20. What happens when we create a new object? 812
Ring Documentation, Release 1.4
4- Since methods are dynamic and each object get the method from the class, you can after creating objects, add new
methods and use it with the object or any object created or will be created from the same class.
Example:
o1 = new point {x=10 y=20 z=30}
o2 = new point {x=100 y=200 z =300}
addmethod(o1,"print", func { see x + nl + y + nl + z + nl } )
o1.print()
o2.print()
class point x y z
Output:
10
20
30
100
200
300
70.21 Can we use the attributes by accessing the Getter and Setter
methods?
Yes we can, The setter/getter methods are called automatically when you start using the attributes from outside the
class Also you can call the methods instead of using the attributes. It’s your choice.
Example:
o1 = new Developer
o1.name = "Mahmoud" see o1.name + nl
o1 { name = "Gal" see name }
o1 { name = "Bert" see name }
o1.setname("Marino")
see o1.getname()
Class Developer
name language = "Ring Programming Language"
func setname value
see "Message from SetName() Function!" + nl
name = value + " - " + language
func getname
see "Message from GetName() Function!" + nl + nl
return "Mr. " + name + nl
Output
Message from SetName() Function!
Message from GetName() Function!
70.21. Can we use the attributes by accessing the Getter and Setter methods? 813
Ring Documentation, Release 1.4
Mr. Mahmoud - Ring Programming Language
Message from SetName() Function!
Message from GetName() Function!
Mr. Gal - Ring Programming Language
Message from SetName() Function!
Message from GetName() Function!
Mr. Bert - Ring Programming Language
Message from SetName() Function!
Message from GetName() Function!
Mr. Marino - Ring Programming Language
70.22 Why should a search of global names be made while defining
the class attributes?
The question is why we don’t avoid conflicts with global variable names when we define the class attributes ?
At first remember that using the optional $ mark in the global variables names solve the problem. Also using the Main
function and avoiding global variables may help.
The Answer:
Ring is a dynamic language
We can in the run-time determine the class attributes (Add/Remove)
We can execute (any code) while defining the class attributes
Example (1)
oPerson = new Person
Class Person
See "Welcome to the Ring language"
Example (2)
Customize attributes based on global variable value
$debug = true
oPerson = new Person
see oPerson
Class Person
if $debug date=date() time=time() ok
In the previous example when we have the $debug flag set to true, we will add the Date and Time attributes to the
object state.
Example (3)
Store the object index based on global variable
$ObjectsCount = 0
oPerson = new Person
see oPerson
oPerson2 = new Person
see oPerson2
70.22. Why should a search of global names be made while defining the class attributes? 814
Ring Documentation, Release 1.4
Class Person
$ObjectsCount++
nIndex = $ObjectsCount
Output:
nindex: 1.000000
nindex: 2.000000
Common Example:
• Connect to the database then get table columns (Using global Variable/Object).
• Create class attributes based on the column names.
• Later when you modify the database - you may don’t need to modify your code.
It’s flexibility but remember that power comes with great responsibility.
70.23 Why Ring doesn’t avoid the conflict between Global Variables
and Class Attributes Names?
In this use case we have
1 - Global Variable defined without a special mark like $
2 - Class contains Attributes defined using a special syntax (where we type the attribute name directly after the class)
3 - The Attributes are defined in the class region that allows writing code and using global variables
If I will accepted your proposal about changing how Ring find variables in the class region I must break one of the
previous three features which will lead to more problems that are more important than this problem.
I don’t like changing the feature number (1) because I would like to keep Ring code more clean and let the programmer
decide when to use $ or not.
I don’t like changing the feature number (2) because I like this feature and I don’t like forcing the programmer to type
self.attribute
I don’t like changing the feature number (3) because it’s very important in many applications to access global variables
in the class region.
So what was my decision ?
I decided to leave this case for the programmer who will decide what to do to avoid this special case
1 - The programmer can avoid using global variables (Better) and can use the Main function (Optional)
2 - The programmer can use $ before the variable name or any mark like global_ or g_
3 - The programmer can use self.attribute after the class name to define the attributes
In general, for small programs you can use global variables and functions. For large programs, use classes and objects
and small number of global variables or avoid them at all.
70.24 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
70.23. Why Ring doesn’t avoid the conflict between Global Variables and Class Attributes Names?815
Ring Documentation, Release 1.4
Add Ring/bin folder to the path then
70.25 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"))
70.26 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
70.27 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
sum([ :a = 1, :b = 2])
sum([ :a = 1 ])
sum([ :b = 2 ])
func sum pList
if plist[:a] = NULL pList[:a] = 4 ok
70.25. How to get the file size using ftell() and fseek() functions? 816
Ring Documentation, Release 1.4
if plist[:b] = NULL pList[:b] = 5 ok
see pList[:a] + pList[:b] + nl
Output
3
6
6
70.28 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
70.29 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
nl = char(13) + char(10) # just a variable that you can change to anything !
The + is an operator
70.28. How to print keys or values only in List/Dictionary? 817

More Related Content

PDF
The Ring programming language version 1.6 book - Part 178 of 189
PDF
The Ring programming language version 1.6 book - Part 176 of 189
PDF
The Ring programming language version 1.7 book - Part 105 of 196
PDF
The Ring programming language version 1.9 book - Part 104 of 210
PDF
The Ring programming language version 1.9 book - Part 108 of 210
PDF
The Ring programming language version 1.9 book - Part 114 of 210
PDF
The Ring programming language version 1.5.2 book - Part 159 of 181
PDF
The Ring programming language version 1.9 book - Part 111 of 210
The Ring programming language version 1.6 book - Part 178 of 189
The Ring programming language version 1.6 book - Part 176 of 189
The Ring programming language version 1.7 book - Part 105 of 196
The Ring programming language version 1.9 book - Part 104 of 210
The Ring programming language version 1.9 book - Part 108 of 210
The Ring programming language version 1.9 book - Part 114 of 210
The Ring programming language version 1.5.2 book - Part 159 of 181
The Ring programming language version 1.9 book - Part 111 of 210

What's hot (20)

PDF
The Ring programming language version 1.10 book - Part 125 of 212
PDF
The Ring programming language version 1.7 book - Part 98 of 196
PDF
The Ring programming language version 1.5.1 book - Part 158 of 180
PDF
The Ring programming language version 1.5.1 book - Part 172 of 180
PDF
The Ring programming language version 1.10 book - Part 116 of 212
PDF
The Ring programming language version 1.4.1 book - Part 28 of 31
PDF
The Ring programming language version 1.10 book - Part 114 of 212
PDF
The Ring programming language version 1.10 book - Part 106 of 212
PDF
The Ring programming language version 1.3 book - Part 63 of 88
PDF
The Ring programming language version 1.9 book - Part 96 of 210
PDF
The Ring programming language version 1.7 book - Part 112 of 196
PDF
The Ring programming language version 1.6 book - Part 123 of 189
PDF
The Ring programming language version 1.5.1 book - Part 79 of 180
PDF
The Ring programming language version 1.2 book - Part 60 of 84
PDF
The Ring programming language version 1.6 book - Part 156 of 189
PDF
The Ring programming language version 1.5.4 book - Part 157 of 185
PDF
The Ring programming language version 1.9 book - Part 154 of 210
PDF
The Ring programming language version 1.5.3 book - Part 120 of 184
PDF
The Ring programming language version 1.10 book - Part 203 of 212
PDF
The Ring programming language version 1.5.1 book - Part 139 of 180
The Ring programming language version 1.10 book - Part 125 of 212
The Ring programming language version 1.7 book - Part 98 of 196
The Ring programming language version 1.5.1 book - Part 158 of 180
The Ring programming language version 1.5.1 book - Part 172 of 180
The Ring programming language version 1.10 book - Part 116 of 212
The Ring programming language version 1.4.1 book - Part 28 of 31
The Ring programming language version 1.10 book - Part 114 of 212
The Ring programming language version 1.10 book - Part 106 of 212
The Ring programming language version 1.3 book - Part 63 of 88
The Ring programming language version 1.9 book - Part 96 of 210
The Ring programming language version 1.7 book - Part 112 of 196
The Ring programming language version 1.6 book - Part 123 of 189
The Ring programming language version 1.5.1 book - Part 79 of 180
The Ring programming language version 1.2 book - Part 60 of 84
The Ring programming language version 1.6 book - Part 156 of 189
The Ring programming language version 1.5.4 book - Part 157 of 185
The Ring programming language version 1.9 book - Part 154 of 210
The Ring programming language version 1.5.3 book - Part 120 of 184
The Ring programming language version 1.10 book - Part 203 of 212
The Ring programming language version 1.5.1 book - Part 139 of 180
Ad

Similar to The Ring programming language version 1.4 book - Part 28 of 30 (18)

PDF
The Ring programming language version 1.2 book - Part 76 of 84
PDF
The Ring programming language version 1.5.1 book - Part 170 of 180
PDF
The Ring programming language version 1.5.2 book - Part 171 of 181
PDF
The Ring programming language version 1.7 book - Part 101 of 196
PDF
The Ring programming language version 1.10 book - Part 104 of 212
PDF
The Ring programming language version 1.8 book - Part 105 of 202
PDF
The Ring programming language version 1.5.2 book - Part 80 of 181
PDF
The Ring programming language version 1.9 book - Part 103 of 210
PDF
The Ring programming language version 1.10 book - Part 98 of 212
PDF
The Ring programming language version 1.5.4 book - Part 83 of 185
PDF
The Ring programming language version 1.6 book - Part 86 of 189
PDF
The Ring programming language version 1.5.2 book - Part 173 of 181
PDF
The Ring programming language version 1.8 book - Part 107 of 202
PDF
Petri Niemi Qt Advanced Part 1
PPTX
Best Practices in Qt Quick/QML - Part I
 
PDF
The Ring programming language version 1.5.1 book - Part 84 of 180
PDF
Advanced Visualization with OpenGL in Oil & Gas
PDF
The Ring programming language version 1.5.3 book - Part 93 of 184
The Ring programming language version 1.2 book - Part 76 of 84
The Ring programming language version 1.5.1 book - Part 170 of 180
The Ring programming language version 1.5.2 book - Part 171 of 181
The Ring programming language version 1.7 book - Part 101 of 196
The Ring programming language version 1.10 book - Part 104 of 212
The Ring programming language version 1.8 book - Part 105 of 202
The Ring programming language version 1.5.2 book - Part 80 of 181
The Ring programming language version 1.9 book - Part 103 of 210
The Ring programming language version 1.10 book - Part 98 of 212
The Ring programming language version 1.5.4 book - Part 83 of 185
The Ring programming language version 1.6 book - Part 86 of 189
The Ring programming language version 1.5.2 book - Part 173 of 181
The Ring programming language version 1.8 book - Part 107 of 202
Petri Niemi Qt Advanced Part 1
Best Practices in Qt Quick/QML - Part I
 
The Ring programming language version 1.5.1 book - Part 84 of 180
Advanced Visualization with OpenGL in Oil & Gas
The Ring programming language version 1.5.3 book - Part 93 of 184
Ad

More from Mahmoud Samir Fayed (20)

PDF
The Ring programming language version 1.10 book - Part 212 of 212
PDF
The Ring programming language version 1.10 book - Part 211 of 212
PDF
The Ring programming language version 1.10 book - Part 210 of 212
PDF
The Ring programming language version 1.10 book - Part 208 of 212
PDF
The Ring programming language version 1.10 book - Part 207 of 212
PDF
The Ring programming language version 1.10 book - Part 205 of 212
PDF
The Ring programming language version 1.10 book - Part 206 of 212
PDF
The Ring programming language version 1.10 book - Part 204 of 212
PDF
The Ring programming language version 1.10 book - Part 202 of 212
PDF
The Ring programming language version 1.10 book - Part 201 of 212
PDF
The Ring programming language version 1.10 book - Part 200 of 212
PDF
The Ring programming language version 1.10 book - Part 199 of 212
PDF
The Ring programming language version 1.10 book - Part 198 of 212
PDF
The Ring programming language version 1.10 book - Part 197 of 212
PDF
The Ring programming language version 1.10 book - Part 196 of 212
PDF
The Ring programming language version 1.10 book - Part 195 of 212
PDF
The Ring programming language version 1.10 book - Part 194 of 212
PDF
The Ring programming language version 1.10 book - Part 193 of 212
PDF
The Ring programming language version 1.10 book - Part 192 of 212
PDF
The Ring programming language version 1.10 book - Part 191 of 212
The Ring programming language version 1.10 book - Part 212 of 212
The Ring programming language version 1.10 book - Part 211 of 212
The Ring programming language version 1.10 book - Part 210 of 212
The Ring programming language version 1.10 book - Part 208 of 212
The Ring programming language version 1.10 book - Part 207 of 212
The Ring programming language version 1.10 book - Part 205 of 212
The Ring programming language version 1.10 book - Part 206 of 212
The Ring programming language version 1.10 book - Part 204 of 212
The Ring programming language version 1.10 book - Part 202 of 212
The Ring programming language version 1.10 book - Part 201 of 212
The Ring programming language version 1.10 book - Part 200 of 212
The Ring programming language version 1.10 book - Part 199 of 212
The Ring programming language version 1.10 book - Part 198 of 212
The Ring programming language version 1.10 book - Part 197 of 212
The Ring programming language version 1.10 book - Part 196 of 212
The Ring programming language version 1.10 book - Part 195 of 212
The Ring programming language version 1.10 book - Part 194 of 212
The Ring programming language version 1.10 book - Part 193 of 212
The Ring programming language version 1.10 book - Part 192 of 212
The Ring programming language version 1.10 book - Part 191 of 212

Recently uploaded (20)

PDF
Machine learning based COVID-19 study performance prediction
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PPTX
sap open course for s4hana steps from ECC to s4
PPTX
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PDF
KodekX | Application Modernization Development
PDF
Chapter 3 Spatial Domain Image Processing.pdf
PPTX
Big Data Technologies - Introduction.pptx
PDF
Encapsulation theory and applications.pdf
PDF
Empathic Computing: Creating Shared Understanding
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PDF
Review of recent advances in non-invasive hemoglobin estimation
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PDF
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
PDF
Spectral efficient network and resource selection model in 5G networks
PDF
Approach and Philosophy of On baking technology
Machine learning based COVID-19 study performance prediction
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
Digital-Transformation-Roadmap-for-Companies.pptx
sap open course for s4hana steps from ECC to s4
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
20250228 LYD VKU AI Blended-Learning.pptx
KodekX | Application Modernization Development
Chapter 3 Spatial Domain Image Processing.pdf
Big Data Technologies - Introduction.pptx
Encapsulation theory and applications.pdf
Empathic Computing: Creating Shared Understanding
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
Diabetes mellitus diagnosis method based random forest with bat algorithm
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
Review of recent advances in non-invasive hemoglobin estimation
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
Reach Out and Touch Someone: Haptics and Empathic Computing
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
Spectral efficient network and resource selection model in 5G networks
Approach and Philosophy of On baking technology

The Ring programming language version 1.4 book - Part 28 of 30

  • 1. Ring Documentation, Release 1.4 • void swapSections(int first, int second) • int visualIndex(int logicalIndex) • int visualIndexAt(int position) • void headerDataChanged(Qt::Orientation orientation, int logicalFirst, int logicalLast) • void setOffset(int offset) • void setOffsetToLastSection(void) • void setOffsetToSectionPosition(int visualSectionNumber) • void setgeometriesChangedEvent(const char *) • void setsectionClickedEvent(const char *) • void setsectionCountChangedEvent(const char *) • void setsectionDoubleClickedEvent(const char *) • void setsectionEnteredEvent(const char *) • void setsectionHandleDoubleClickedEvent(const char *) • void setsectionMovedEvent(const char *) • void setsectionPressedEvent(const char *) • void setsectionResizedEvent(const char *) • void setsortIndicatorChangedEvent(const char *) • const char *getgeometriesChangedEvent(void) • const char *getsectionClickedEvent(void) • const char *getsectionCountChangedEvent(void) • const char *getsectionDoubleClickedEvent(void) • const char *getsectionEnteredEvent(void) • const char *getsectionHandleDoubleClickedEvent(void) • const char *getsectionMovedEvent(void) • const char *getsectionPressedEvent(void) • const char *getsectionResizedEvent(void) • const char *getsortIndicatorChangedEvent(void) • void geteventparameters(void) 69.141 QFontMetrics Class C++ Reference : http://doc.qt.io/qt-5/QFontMetrics.html Parameters : QFont • int ascent(void) • int averageCharWidth(void) • QRect boundingRect(QChar ch) 69.141. QFontMetrics Class 788
  • 2. Ring Documentation, Release 1.4 • QRect boundingRect_2( QString text) • QRect boundingRect_3(int x, int y, int width, int height, int flags, QString text, int tabStops , int * tabArray ) • QRect boundingRect_4( QRect rect, int flags, QString text, int tabStops , int * tabArray ) • int descent(void) • QString elidedText( QString text, Qt::TextElideMode mode, int width, int flags ) • int height(void) • bool inFont(QChar ch) • bool inFontUcs4(uint character) • int leading(void) • int leftBearing(QChar ch) • int lineSpacing(void) • int lineWidth(void) • int maxWidth(void) • int minLeftBearing(void) • int minRightBearing(void) • int overlinePos(void) • int rightBearing(QChar ch) • QSize size(int flags, QString text, int tabStops , int * tabArray ) • int strikeOutPos(void) • QRect tightBoundingRect( QString text) • int underlinePos(void) • int width( QString text, int len ) • int width_2(QChar ch) • int xHeight(void) 69.142 QSplashScreen Class C++ Reference : http://doc.qt.io/qt-5/QSplashScreen.html Parameters : QPixmap Parent Class : QWidget • void finish(QWidget *mainWin) • QPixmap pixmap(void) • void repaint(void) • void setPixmap(QPixmap pixmap) • void clearMessage(void) • void showMessage(QString message, int alignment ,QColor color) 69.142. QSplashScreen Class 789
  • 3. Ring Documentation, Release 1.4 69.143 QBoxLayout Class C++ Reference : http://doc.qt.io/qt-5/QBoxLayout.html Parameters : QBoxLayout::Direction dir, QWidget *parent Parent Class : QLayout • void addLayout(QLayout * layout, int stretch ) • void addSpacerItem(QSpacerItem * spacerItem) • void addSpacing(int size) • void addStretch(int stretch ) • void addStrut(int size) • void addWidget(QWidget * widget, int stretch , Qt::Alignment alignment ) • QBoxLayout::Direction direction(void) • void insertLayout(int index, QLayout * layout, int stretch ) • void insertSpacerItem(int index, QSpacerItem * spacerItem) • void insertSpacing(int index, int size) • void insertStretch(int index, int stretch ) • void insertWidget(int index, QWidget * widget, int stretch , Qt::Alignment alignment ) • void setDirection(QBoxLayout::Direction direction) • void setSpacing(int spacing) • void setStretch(int index, int stretch) • bool setStretchFactor(QWidget * widget, int stretch) • bool setStretchFactor_2(QLayout * layout, int stretch) • int spacing(void) • int stretch(int index) 69.144 QLayout Class C++ Reference : http://doc.qt.io/qt-5/QLayout.html Parameters : QWidget * Parent Class : QObject • bool activate(void) • void addWidget(QWidget *w) • QMargins contentsMargins(void) • QRect contentsRect(void) • void getContentsMargins(int *left, int *top, int *right, int *bottom) • bool isEnabled(void) • QWidget *menuBar(void) 69.143. QBoxLayout Class 790
  • 4. Ring Documentation, Release 1.4 • QWidget *parentWidget(void) • void removeItem(QLayoutItem *item) • void removeWidget(QWidget *widget) • bool setAlignment(QWidget *w, Qt::Alignment alignment) • void setAlignment_2(Qt::Alignment alignment) • bool setAlignment_3(QLayout *l, Qt::Alignment alignment) • void setContentsMargins(int left, int top, int right, int bottom) • void setContentsMargins_2(QMargins margins) • void setEnabled(bool enable) • void setMenuBar(QWidget *widget) • void setSizeConstraint(QLayout::SizeConstraint) • void setSpacing(int) • QLayout::SizeConstraint sizeConstraint(void) • int spacing(void) • void update(void) • QSize closestAcceptableSize( QWidget * widget, QSize size) 69.145 QLinearGradient Class C++ Reference : http://doc.qt.io/qt-5/QLinearGradient.html Parameters : void Parent Class : QGradient • QPointF finalStop(void) • void setFinalStop(QPointF stop) • void setFinalStop_2(qreal x,qreal y) • void setStart(QPointF start) • void setStart_2(qreal x,qreal y) • QPointF start(void) 69.146 QGradient Class C++ Reference : http://doc.qt.io/qt-5/QGradient.html Parameters : void • QGradient::CoordinateMode coordinateMode(void) • void setColorAt(qreal position, QColor color) • void setCoordinateMode(QGradient::CoordinateMode mode) • void setSpread(QGradient::Spread method) 69.145. QLinearGradient Class 791
  • 5. Ring Documentation, Release 1.4 • void setStops(QGradientStops stopPoints) • QGradient::Spread spread(void) • QGradientStops stops(void) • QGradient::Type type(void) 69.147 QPointF Class C++ Reference : http://doc.qt.io/qt-5/QPointF.html Parameters : void • bool isNull(void) • qreal manhattanLength(void) • qreal rx(void) • qreal ry(void) • void setX(qreal x) • void setY(qreal y) • QPoint toPoint(void) • qreal x(void) • qreal y(void) 69.148 QPoint Class C++ Reference : http://doc.qt.io/qt-5/QPoint.html Parameters : void • bool isNull(void) • int manhattanLength(void) • int rx(void) • int ry(void) • void setX(int x) • void setY(int y) • int x(void) • int y(void) 69.149 QScrollArea Class C++ Reference : http://doc.qt.io/qt-5/QScrollArea.html Parameters : QWidget *parent Parent Class : QAbstractScrollArea 69.147. QPointF Class 792
  • 6. Ring Documentation, Release 1.4 • Qt::Alignment alignment(void) • void ensureVisible(int x, int y, int xmargin , int ymargin ) • void ensureWidgetVisible(QWidget *childWidget, int xmargin , int ymargin ) • void setAlignment(Qt::Alignment) • void setWidget(QWidget *widget) • void setWidgetResizable(bool resizable) • QWidget *takeWidget(void) • QWidget *widget(void) • bool widgetResizable(void) 69.150 QSplitter Class C++ Reference : http://doc.qt.io/qt-5/QSplitter.html Parameters : QWidget *parent Parent Class : QFrame • void addWidget(QWidget *widget) • bool childrenCollapsible(void) • int count(void) • void getRange(int index, int *min, int *max) • QSplitterHandle * handle(int index) • int handleWidth(void) • int indexOf(QWidget *widget) • void insertWidget(int index, QWidget *widget) • bool isCollapsible(int index) • bool opaqueResize(void) • Qt::Orientation orientation(void) • void refresh(void) • bool restoreState( QByteArray state) • QByteArray saveState(void) • void setChildrenCollapsible(bool) • void setCollapsible(int index, bool collapse) • void setHandleWidth(int) • void setOpaqueResize(bool opaque ) • void setOrientation(Qt::Orientation) • void setSizes( QList<int> list) • void setStretchFactor(int index, int stretch) 69.150. QSplitter Class 793
  • 7. Ring Documentation, Release 1.4 • QList<int> sizes(void) • QWidget * widget(int index) 69.151 QCompleter Class C++ Reference : http://doc.qt.io/qt-5/QCompleter.html Parameters : QObject *parent Parent Class : QObject • Qt::CaseSensitivity caseSensitivity(void) • int completionColumn(void) • int completionCount(void) • QCompleter::CompletionMode completionMode(void) • QAbstractItemModel *completionModel(void) • QString completionPrefix(void) • int completionRole(void) • QString currentCompletion(void) • QModelIndex currentIndex(void) • int currentRow(void) • Qt::MatchFlags filterMode(void) • int maxVisibleItems(void) • QAbstractItemModel * model(void) • QCompleter::ModelSorting modelSorting(void) • QAbstractItemView * popup(void) • void setCaseSensitivity(Qt::CaseSensitivity caseSensitivity) • void setCompletionColumn(int column) • void setCompletionMode(QCompleter::CompletionMode mode) • void setCompletionRole(int role) • bool setCurrentRow(int row) • void setFilterMode(Qt::MatchFlags filterMode) • void setMaxVisibleItems(int maxItems) • void setModel(QAbstractItemModel *model) • void setModelSorting(QCompleter::ModelSorting sorting) • void setPopup(QAbstractItemView *popup) • void setWidget(QWidget *widget) • QWidget * widget(void) • bool wrapAround(void) 69.151. QCompleter Class 794
  • 8. Ring Documentation, Release 1.4 • void complete(QRect rect) • void setCompletionPrefix(QString prefix) • void setWrapAround(bool wrap) 69.152 QCompleter2 Class C++ Reference : http://doc.qt.io/qt-5/QCompleter2.html Parameters : QAbstractItemModel *model, QObject *parent Parent Class : QCompleter 69.153 QCompleter3 Class C++ Reference : http://doc.qt.io/qt-5/QCompleter3.html Parameters : QStringList list, QObject *parent Parent Class : QCompleter 69.154 QString2 Class C++ Reference : http://doc.qt.io/qt-5/QString2.html Parameters : void • QString append( QString str) • QStringList split( QString sep, QString::SplitBehavior behavior , Qt::CaseSensitivity cs ) • QStringList split_2(QChar sep, QString::SplitBehavior behavior , Qt::CaseSensitivity cs ) • QStringList split_3( QRegExp rx, QString::SplitBehavior behavior ) • QStringList split_4( QRegularExpression re, QString::SplitBehavior behavior ) 69.155 QProcess Class C++ Reference : http://doc.qt.io/qt-5/QProcess.html Parameters : QObject * Parent Class : QIODevice • QStringList arguments(void) • void closeReadChannel(QProcess::ProcessChannel channel) • void closeWriteChannel(void) • QProcess::ProcessError error(void) • int exitCode(void) • QProcess::ExitStatus exitStatus(void) 69.152. QCompleter2 Class 795
  • 9. Ring Documentation, Release 1.4 • QProcess::InputChannelMode inputChannelMode(void) • QProcess::ProcessChannelMode processChannelMode(void) • QProcessEnvironment processEnvironment(void) • QString program(void) • QByteArray readAllStandardError(void) • QByteArray readAllStandardOutput(void) • QProcess::ProcessChannel readChannel(void) • void setArguments( QStringList arguments) • void setInputChannelMode(QProcess::InputChannelMode mode) • void setProcessChannelMode(QProcess::ProcessChannelMode mode) • void setProcessEnvironment( QProcessEnvironment environment) • void setProgram( QString program) • void setReadChannel(QProcess::ProcessChannel channel) • void setStandardErrorFile( QString fileName, QIODevice::OpenMode mode ) • void setStandardInputFile( QString fileName) • void setStandardOutputFile( QString fileName, QIODevice::OpenMode mode ) • void setStandardOutputProcess(QProcess *destination) • void setWorkingDirectory( QString dir) • void start( QString program, QStringList arguments, QIODevice::OpenMode mode ) • void start_2( QString command, QIODevice::OpenMode mode ) • void start_3(QIODevice::OpenMode mode ) • QProcess::ProcessState state(void) • bool waitForFinished(int msecs ) • bool waitForStarted(int msecs ) • QString workingDirectory(void) • void kill(void) • void terminate(void) • void setreadyReadStandardErrorEvent(const char *) • void setreadyReadStandardOutputEvent(const char *) • const char *getreadyReadStandardErrorEvent(void) • const char *getreadyReadStandardOutputEvent(void) 69.156 QMdiArea Class C++ Reference : http://doc.qt.io/qt-5/QMdiArea.html Parameters : QWidget * 69.156. QMdiArea Class 796
  • 10. Ring Documentation, Release 1.4 Parent Class : QAbstractScrollArea • QMdiArea::WindowOrder activationOrder(void) • QMdiSubWindow * activeSubWindow(void) • QMdiSubWindow * addSubWindow(QWidget * widget, Qt::WindowFlags windowFlags ) • QBrush background(void) • QMdiSubWindow * currentSubWindow(void) • bool documentMode(void) • void removeSubWindow(QWidget * widget) • void setActivationOrder(QMdiArea::WindowOrder order) • void setBackground( QBrush background) • void setDocumentMode(bool enabled) • void setOption(QMdiArea::AreaOption option, bool on ) • void setTabPosition(QTabWidget::TabPosition position) • void setTabShape(QTabWidget::TabShape shape) • void setTabsClosable(bool closable) • void setTabsMovable(bool movable) • void setViewMode(QMdiArea::ViewMode mode) • QList<QMdiSubWindow *> subWindowList(QMdiArea::WindowOrder order ) • QTabWidget::TabPosition tabPosition(void) • QTabWidget::TabShape tabShape(void) • bool tabsClosable(void) • bool tabsMovable(void) • bool testOption(QMdiArea::AreaOption option) • QMdiArea::ViewMode viewMode(void) • void activateNextSubWindow(void) • void activatePreviousSubWindow(void) • void cascadeSubWindows(void) • void closeActiveSubWindow(void) • void closeAllSubWindows(void) • void setActiveSubWindow(QMdiSubWindow * window) • void tileSubWindows(void) 69.157 QMdiSubWindow Class C++ Reference : http://doc.qt.io/qt-5/QMdiSubWindow.html Parameters : QWidget * 69.157. QMdiSubWindow Class 797
  • 11. Ring Documentation, Release 1.4 Parent Class : QWidget • bool isShaded(void) • int keyboardPageStep(void) • int keyboardSingleStep(void) • QMdiArea * mdiArea(void) • void setKeyboardPageStep(int step) • void setKeyboardSingleStep(int step) • void setOption(QMdiSubWindow::SubWindowOption option, bool on ) • void setSystemMenu(QMenu * systemMenu) • void setWidget(QWidget * widget) • QMenu * systemMenu(void) • bool testOption(QMdiSubWindow::SubWindowOption option) • QWidget * widget(void) • void showShaded(void) • void showSystemMenu(void) 69.158 QCursor Class C++ Reference : http://doc.qt.io/qt-5/QCursor.html Parameters : void • QBitmap *bitmap(void) • QPoint hotSpot(void) • QBitmap *mask(void) • QPixmap pixmap(void) • void setShape(Qt::CursorShape shape) • Qt::CursorShape shape(void) 69.159 QListView Class C++ Reference : http://doc.qt.io/qt-5/QListView.html Parameters : QWidget * Parent Class : QAbstractItemView • int batchSize(void) • void clearPropertyFlags(void) • QListView::Flow flow(void) • QSize gridSize(void) • bool isRowHidden(int row) 69.158. QCursor Class 798
  • 12. Ring Documentation, Release 1.4 • bool isSelectionRectVisible(void) • bool isWrapping(void) • QListView::LayoutMode layoutMode(void) • int modelColumn(void) • QListView::Movement movement(void) • QListView::ResizeMode resizeMode(void) • void setBatchSize(int batchSize) • void setFlow(QListView::Flow flow) • void setGridSize( QSize size) • void setLayoutMode(QListView::LayoutMode mode) • void setModelColumn(int column) • void setMovement(QListView::Movement movement) • void setResizeMode(QListView::ResizeMode mode) • void setRowHidden(int row, bool hide) • void setSelectionRectVisible(bool show) • void setSpacing(int space) • void setUniformItemSizes(bool enable) • void setViewMode(QListView::ViewMode mode) • void setWordWrap(bool on) • void setWrapping(bool enable) • int spacing(void) • bool uniformItemSizes(void) • QListView::ViewMode viewMode(void) • bool wordWrap(void) 69.160 QAxObject Class C++ Reference : http://doc.qt.io/qt-5/QAxObject.html Parameters : QString Parent Class : QAxBase 69.161 QAxBase Class C++ Reference : http://doc.qt.io/qt-5/QAxBase.html Parameters : QWidget * Parent Class : QObject • QVariant asVariant(void) 69.160. QAxObject Class 799
  • 13. Ring Documentation, Release 1.4 • QString control(void) • void disableClassInfo(void) • void disableEventSink(void) • void disableMetaObject(void) • QVariant dynamicCall( char *function) • QVariant dynamicCall_2( char *function,QString) • QString generateDocumentation(void) • bool isNull(void) • QAxObject * querySubObject( char *name) • bool setControl( QString ) • QStringList verbs(void) 69.162 QUuid Class C++ Reference : http://doc.qt.io/qt-5/QUuid.html Parameters : void • QString toString(void) 69.163 QToolButton Class C++ Reference : http://doc.qt.io/qt-5/QToolButton.html Parameters : QWidget * Parent Class : QAbstractButton • Qt::ArrowType arrowType(void) • bool autoRaise(void) • QAction * defaultAction(void) • QMenu * menu(void) • QToolButton::ToolButtonPopupMode popupMode(void) • void setArrowType(Qt::ArrowType type) • void setAutoRaise(bool enable) • void setMenu(QMenu * menu) • void setPopupMode(QToolButton::ToolButtonPopupMode mode) • Qt::ToolButtonStyle toolButtonStyle(void) • void setDefaultAction(QAction * action) • void setToolButtonStyle(Qt::ToolButtonStyle style) • void showMenu(void) • void settriggeredEvent(const char *) 69.162. QUuid Class 800
  • 14. Ring Documentation, Release 1.4 • const char *gettriggeredEvent(void) • void setClickEvent(const char *) • const char *getClickEvent(void) 69.164 QSerialPort Class C++ Reference : http://doc.qt.io/qt-5/QSerialPort.html Parameters : QObject * Parent Class : QIODevice • qint32 baudRate(QSerialPort::Directions directions) • bool clear(QSerialPort::Directions directions) • void clearError(void) • QSerialPort::DataBits dataBits(void) • QSerialPort::SerialPortError error(void) • QSerialPort::FlowControl flowControl(void) • bool flush(void) • void *handle(void) • bool isBreakEnabled(void) • bool isDataTerminalReady(void) • bool isRequestToSend(void) • QSerialPort::Parity parity(void) • QSerialPort::PinoutSignals pinoutSignals(void) • QString portName(void) • qint64 readBufferSize(void) • bool setBaudRate(qint32 baudRate, QSerialPort::Directions directions) • bool setBreakEnabled(bool set) • bool setDataBits(QSerialPort::DataBits dataBits) • bool setDataTerminalReady(bool set) • bool setFlowControl(QSerialPort::FlowControl flowControl) • bool setParity(QSerialPort::Parity parity) • void setPort(QSerialPortInfo serialPortInfo) • void setPortName(QString name) • void setReadBufferSize(qint64 size) • bool setRequestToSend(bool set) • bool setStopBits(QSerialPort::StopBits stopBits) • QSerialPort::StopBits stopBits(void) 69.164. QSerialPort Class 801
  • 15. Ring Documentation, Release 1.4 • void setbaudRateChangedEvent(const char *) • void setbreakEnabledChangedEvent(const char *) • void setdataBitsChangedEvent(const char *) • void setdataTerminalReadyChangedEvent(const char *) • void seterrorEvent(const char *) • void setflowControlChangedEvent(const char *) • void setparityChangedEvent(const char *) • void setrequestToSendChangedEvent(const char *) • void setstopBitsChangedEvent(const char *) • const char *getbaudRateChangedEvent(void) • const char *getbreakEnabledChangedEvent(void) • const char *getdataBitsChangedEvent(void) • const char *getdataTerminalReadyChangedEvent(void) • const char *geterrorEvent(void) • const char *getflowControlChangedEvent(void) • const char *getparityChangedEvent(void) • const char *getrequestToSendChangedEvent(void) • const char *getstopBitsChangedEvent(void) 69.165 QSerialPortInfo Class C++ Reference : http://doc.qt.io/qt-5/QSerialPortInfo.html Parameters : void • QString description(void) • bool hasProductIdentifier(void) • bool hasVendorIdentifier(void) • bool isBusy(void) • bool isNull(void) • QString manufacturer(void) • QString portName(void) • quint16 productIdentifier(void) • QString serialNumber(void) • void swap(QSerialPortInfo other) • QString systemLocation(void) • quint16 vendorIdentifier(void) 69.165. QSerialPortInfo Class 802
  • 16. CHAPTER SEVENTY FREQUENTLY ASKED QUESTIONS (FAQ) 70.1 Why do we need Yet Another Programming Language (YAPL)? The language comes with better support for Natural Language Programming and Declarative Programming. The inno- vation comes in supporting these paradigms with new practical techniques on the top of Object-Oriented Programming and Functional Programming. Ring provide the programmers with the tools required to build a Natural Language like Supernova or Declarative Language like REBOL and QML without the need to know anything about (Compilers and Parsing). You get the language constructs ready for use to create domain-specific languages in a fraction of time. Check the Supernova programming language, In this language you can type (I want window and the window title is hello world.) and it will create a GUI window with “Hello, World!” as the window title. When I created Supernova language in 2010. I discovered that using the Natural Code can be (Like English without limits and we can get the human language power in programming) but to implement that You need a new language that are 1. General Purpose 2. Practical 3. Can create Natural Languages very quickly. So we can get a System that can increase ease of use and productivity to the maximum level. Ring is the best language to do that. So I created Ring to achieve this goal. Supernova was just a test for the idea. To get a near view about what are the Advantages and Disadvantages. After testing the new ideas you provide something practical. So we have Ring after Supernova. A story that maybe similar to having Python after ABC. Python avoid ABC problems but bring ABC advantages. Also Ring learn from Ruby and ROR story. The language power could appears in Frameworks better than direct usage as a general purpose language. Also Ring comes with a clear goal/motivation (Creating a new version of the PWCT Software) something learned from designing the C language to create the Unix Operating System. You have a goal that direct you in each design decision. You will understand the value of our decisions once you start trying to solve the problem that we will use Ring to solve. Could you enable any one in the world without knowledge about computer programming concepts to create very powerful software? In science the answer is (Visual Programming) and (Natural Programming). In practical we still away from switching to these paradigms without introducing other problems. Ring is designed to solve this problem. It’s designed to provide Natural Programming in a practical way. And to create a powerful Visual Programming tool. Ring is designed to be a new world of programming after 10 years of research in Visual Programming and Natural Languages. The Ring Programming Language (Compiler+VM) is developed 100% using Visual Programming without writing a single line of code. I used my tool (Programming Without Coding Technology) to design everything and get the C code generated for me. Advantages ? 1. More Faster 2. No Syntax Errors 803
  • 17. Ring Documentation, Release 1.4 3. Easy to understand and manage the code because the Abstraction level is more higher 4. No Critical Disadvantages because you can control everything as writing your code. From my experience in using Visual Programming for 10 years and Natural Programming for 5 years I designed Ring to move the knowledge to mainstream programmers by providing a practical language that support these ideas. I agree that each programmer/developer has the freedom to form his opinions about any software including program- ming languages. Ring is not an exception but you may miss the idea behind the language. It’s innovative and may help you to think different about how to solve your problems. Maybe this is not clear to many programmers because It’s practical language and includes many features known to programmers and when a programmer look at a language he/she may think that nothing new because it’s familiar. I created Ring to solve problems in a different way. Where I will start programming just by describing the software using new natural interfaces that I will implement later when I move from the design stage to the implementation stage. (I don’t determine the time to switch between stages, You are free to use Agile methods). Since Ring is a new language you have 3 options. 1. Just don’t care. 2. Think in the future of the language and help us if you understand the idea and want to contribute. 3. Wait and come back again in the future to use it. Summary: • Ring is designed based on a need to develop a new version of the PWCT software. Once we finish PWCT 2.0 we will have good and large software developed using Ring. • We will push Declarative and Natural paradigms many steps forward. Also in next versions we have a plan to present a new paradigm for Network Programming and Concurrency. We tested this new paradigm through simple prototypes during the last years and we will integrate it with Ring in Future releases. • It’s a new language, just Ring version 1.4. A serious ecosystem comes along the way. 70.2 Why Ring is weakly typed? Because it’s more Natural, and Faster and this is important for the language goals. What comes first is what you want. When you type “Print : ” + 5 , The String comes first then 5 will be converted to a String. while when you type 5 + “10” The number comes first so “10” will be converted to 10. This help a lot to quickly convert between numbers and strings using the same operator. If you want to prevent conversion (Write code that prevent conversion) In these cases you will notice that what you are writing is less code (And can be removed). Weakly Typed = Automatic Conversion and Automatic is Good Thing and is better than Manual if you know how to use it correctly. 70.3 What are the advantages to using Ring over Lisp or Smalltalk? Smalltalk and Lisp are GREAT languages. I like many of the concepts behind them but I’m sure that selecting the right programming language is based on the problem and comes after the problem definition. I have a problem that I want to solve and these GREAT languages are not ideal for this problem so I designed Ring. When you design a new language, You can learn from the past but you must look forward and live in the Future. What you know about Natural Programming maybe based on the Old Knowledge about the power of these paradigms in the practical world and I agree with you but I see another techniques that can be applied to get this to work in practical. What you miss about Natural Language is that they are Context Sensitive and this means we can use it and think different about how we can express our ideas. 70.2. Why Ring is weakly typed? 804
  • 18. Ring Documentation, Release 1.4 example : I want window contains 3 buttons. In one sentence I created 4 objects (The window and the three buttons) and added the buttons to the window. The idea of Natural Programming is to get many things done like that. 70.4 Why Ring is largely focussed on UI creation? Yes UI creation is one of the important things in the language features because it’s designed to create a visual pro- gramming tool, But the language is a multi-paradigm language where we can select the programming paradigm based on the problem. 70.5 Is Ring some sort of improvement over PHP? Ring is not designed to replace PHP, Lua and/or Smalltalk. And Ring support for Declarative Programming and Natural Language Programming is very innovative and much better than staying with Procedural, Object-Oriented and Functional Languages. Ring see the future in programming without code (Using Natural Languages) and is designed to support that. 70.6 What are the advantages to using Ring over native C or C++? Ring provides a better way to mix between different programming paradigms in solving problems. The different programming paradigms play well together in the same language. 1. It’s easy to switch from one programming paradigm to another one because the language constructs use similar syntax for similar concepts. 2. The paradigms are provided to interact and used together in different layers in the software. for example you can create a game engine using object-oriented programming but write the game code using declara- tive programming or natural programming and behind the scene your declarative or natural code will use the object- oriented classes. 3. Ring is very productive and natural programming language than C/C++ languages. 4. Ring is a dynamic language. We can generate and execute code during the runtime. We have dynamic typing and weakly typed language for flexibility. 5. The Garbage collector is generational (escape analysis) and also use reference counting. it’s very fast and still provide control to the programmer who can delete memory at any time. 6. Ring Compiler and Virtual Machine is just 15,000 lines of ANSI C code that can be compiled and used in any platform. 7. You can use C/C++ libraries and Ring comes with code generator to create wrappers from C functions or C++ classes. so when you need more performance or when you need to use more libraries you can easily do that. 70.7 What is the difference between Ring and Python? And is Ring Open Source? Yes the language is Free Open Source (MIT license) 70.4. Why Ring is largely focussed on UI creation? 805
  • 19. Ring Documentation, Release 1.4 In general I like Python and Ruby but I was looking for a language more suitable for creating the next version of the Programming Without Coding Technology (PWCT) software so I started the Ring design. Some simple changes that matters for my goal are 1. Not case sensitive 2. The list index start from 1 3. You can call functions before definition 4. Don’t use Python syntax like (indentation, using self, :, pass & _) 5. Weakly typed (convert automatically between types based on context) 6. The programs follow simple and constant structure (Statements then functions then packages and classes) 7. Using the ‘=’ operator for assignment and for testing values Critical changes are 1. Small Language : The Ring compiler + Virtual Machine = 15K lines of C code , the other 85K lines are related to libraries and are optional when we go for using the language in C/C++ programs. 2. The Garbage collector : Uses Escape Analysis/Reference counting and give the programmer the ability to determine when to delete memory using the assignment operator 3. Compact Syntax : Ring is not line sensitive, you don’t need to write ; or press ENTER to separate between statements 4. Using { } to access the object then using the object attributes and methods directly 5. Natural Programming : It’s very easy to create natural interfaces using Ring based on OOP 6. Declarative Programming using Nested Structure The Ring programming language is designed based on my experience from using many other languages like C, C++, C#, Lua, PHP, Python, Ruby, Harbour, Basic and Supernova And the language comes with innovative features added to achieve the language goal • Applications programming language. • Productivity and developing high quality solutions that can scale. • Small and fast language that can be embedded in C/C++ projects. • Simple language that can be used in education and introducing Compiler/VM concepts. • General-Purpose language that can be used for creating domain-specific libraries, frameworks and tools. • Practical language designed for creating the next version of the Programming Without Coding Technology software. 70.8 What are the advantages to using Ring over Perl, PHP, Python or Ruby? 1. Ring is New and Innovative. The language will let you think different about programming. 2. Ring is Smaller. (Lessons learned from the Lua language) 3. Ring is Simple. (Lessons learned from the BASIC and Clipper/Harbour languages) 4. Ring is more Natural. (Lessons learned from the Supernova language) 5. Ring is more Declarative. (Lessons learned from REBOL and QML languages) 70.8. What are the advantages to using Ring over Perl, PHP, Python or Ruby? 806
  • 20. Ring Documentation, Release 1.4 6. Ring Implementation is Transparent, Visual and comes with Rich Features. 70.9 What are the advantages to using Ring over Tcl or Lua? 1. Clean Code (More Natural) 2. More Features (A lot of useful programming paradigms) 70.10 What are the advantages to using Ring over C# or Java? 1. Compact Code (Clean and Natural), More Productivity and Flexibility. 2. Better support for Declarative Programming and Natural Programming 70.11 The documentation says functional programming is sup- ported, but then this happens? The question was about this code f = func { a = 42 return func { return a } } innerF = call f() call innerF() Output: Using uninitialized variable : a In function _ring_anonymous_func_16601() The Answer: • It’s Anonymous Functions, i.e. Not Closures. • It’s Just Ring version 1.4 (Many developers asked about supporting Closures) and during language development we may add new features that doesn’t go against the language goals or sprite. • You can use classes and objects when you want to merge between the state and functions to provide a clear solution. • You can use Lists and put the anonymous function inside the List then return the list that contains the state and the function. Pass the list to the function when you use it. • You can use eval() and substr() to add the variable value directly to the anonymous function before return. • We protect you from other scopes when you define the function. In Ring we provided the Three Scopes Rule where at each point you have only at maximum three scopes (Global, Object Scope and Local Scope). • We don’t get everything from everywhere to be like others! We don’t need to do that. If we will think like that then we will create a very complex language or we will save our time and use other languages. • When you think about learning or studying a new language concentrate about (What is new?) and (What is better in this language?) to know when to use it. Don’t compare a new language just released little months ago with languages started many years ago and expect to find everything that you used to have. 70.9. What are the advantages to using Ring over Tcl or Lua? 807
  • 21. Ring Documentation, Release 1.4 • Each programming language miss features in other languages. The idea is not the Features. it’s the sprite and ability behind all of the features together. 70.12 Why the ability to define your own languages Instead of just handing over the syntax so you can parse it using whatever code you like? It’s innovation - You create natural statements without the need to learn about parsing. You just use Classes which is intelligent decision (where later we can mix between classes to support more statements based on the context - We can change and translate the defined statements and many more!). Also the statements are added in Ring World where you can use any Ring statement. 70.13 Why you can specify the number of loops you want to break out of? The language support programming in the small and programming in the large. The selection of what features to use is based on what are you going to do. Any programmer can write bad code in any language if he/she wants to do that. The idea is what must be done from the language design to prevent errors without causing other problems like killing flexibility. Read some source code in the Linux Kernel and Ruby Implementation for example, You will find good usage for GOTO as a practical example that General Rules are not for All Use Cases and great programmers know when to break the rules. I’m not saying go and use GOTO or saying Ring add things like that. But the ability to break more than one loop and/or the ability to break the loop from sub functions is practical for small programs. Anyway these are some of the small new things added by the language (Not the big idea). 70.14 Why Ring uses ‘See’, ‘Give’, ‘But’ and ‘Ok’ Keywords? See and Give are selected not to be “opposite actions” but to reflect what I want to do as a programmer. When I want to see something on the screen I use ‘See’. When I want to give some input to the program I use ‘Give’. My selection of “but” and “ok” is based on selecting keywords that can be written quickly. Also using “but” is easy to remember than elseif/elif/elsif where each language select a different keyword. In Ring 1.1 and later versions All of this is just an option. You can use ‘Put’ and ‘Get’ instead of ‘See’ and ‘Give’ You can use ‘elseif’ and ‘end’ insetad of ‘But’ and ‘Ok’ It’s your choice. In Ring we have syntax flexibility where we provide more than one style. Also you can change the language keywords and operators. Also you can define new natural languages too. 70.12. Why the ability to define your own languages Instead of just handing over the syntax so you can parse it using whatever code you like? 808
  • 22. Ring Documentation, Release 1.4 70.15 What is the philosophy behind data types in Ring? The Ring programming language is designed to be SMALL. The language provides the basic constructs that you need to do anything! One of the goals is to keep the basic constructs simple and small as possible. Using Lists in Ring you can • Create Arrays (one data type) • Create Lists (Mix of data types) • Create Tree (Nested arrays) • Use String Index (Looks like Dictionary/Hash Table) The same principle is applied to Numbers • You can use the number for int value • You can use the number for double value • You can use the number for Boolean value (True/False) The sample principle is applied for Strings • You can use the string for storing one character • You can use the string for storing text (one or many lines) • You can use the string for storing binary data • You can use the string for storing date • You can use the string for storing time • You can use the string for storing NULL values (empty strings) And we have Object Oriented Support + Operator Overloading where the programmer can define new data types and use them as default types defined by the language So We have • A small and simple language that someone can pick in little days • A fast language that provide primitive types (String ? Number ? List ? Object) • A flexible language that can be extended using OOP to add new types according to the application domain 70.16 What about the Boolean values in Ring? You can use true for 1 and false for 0 when you test the result of Boolean expressions in your code. Just when you print the value using the see command you will see 1 for (true) and 0 for (false) Why ? Because Ring contains only 4 types of variables 1. Number 2. String 3. List 70.15. What is the philosophy behind data types in Ring? 809
  • 23. Ring Documentation, Release 1.4 4. Object The first type (Number) is used to represent int, double and Boolean values. The second type (String) is used to represent char, array of characters, date and time. The third type (List) is used to represent Arrays of one type, Arrays of more than one type, Hash (Dictionary), Tree, etc. The object can be an object created from a Ring class (Any Class) or just a C Pointer that we get from calling a C/C++ function/method. Why ? The Ring is designed to give the programmer/developer the most simple constructs that can be used to do everything. The programmer/developer can customize the language by creating new classes (and use operator overloading) to get more types that he care about according to the problem domain. Why ? Because simple is better, and easy to learn and remember! And this provide flexibility to convert between high level types that can be represented using the same basic type 70.17 What is the goal of including the “Main” function in Ring? The main function is very important, you need it when you want to write statements that uses local variables instead of the Global scope. Example: x = 10 myfunc() See "X value = " + X # here I expect that x will be (10) # but I will get another value (6) because myfunc() uses x ! Func myfunc for x = 1 to 5 See x + nl next Output: 1 2 3 4 5 X value = 6 Now using the Main function Func Main x = 10 myfunc() See "X value = " + X Func myfunc for x = 1 to 5 See x + nl next 70.17. What is the goal of including the “Main” function in Ring? 810
  • 24. Ring Documentation, Release 1.4 Output 1 2 3 4 5 X value = 10 70.18 Why the list index start from 1 in Ring? It’s about how we count in the real world, when we have three apples in our hand we say 1 2 3 We don’t start from 0 The question must be why the other languages start from 0 ? The answer is, because this is related to the machine and how we deal with values and memory address. Example we have array called myarray[5] In memory : myarray will have an address The first item will be stored in that address The second item will come after that address and so on Now when we need to point to the first item we need the address of myarray So we type myarray[0] because myarray + 0 result will still point to the first item for the second item myarray[1] because myarray + 1 result will point to the second item and so on In Low Level languages or languages near to the machine it’s good to be like this But for high level language designed for applications it’s better to be natural Example mylist = [1,2,3,4,5] for x = 1 to len(mylist) see x + nl next In the previous example we start from 1 to the length of the array if the index starts from 0 we will write for x = 0 to len(mylist)-1 or remember the for loop in other languages for(x=0 ; x<nMax ; x++ ) You will use the < operator ! 70.19 Is there constructor methods in Ring? When you create new object for example 70.18. Why the list index start from 1 in Ring? 811
  • 25. Ring Documentation, Release 1.4 new point 1 - Ring will allocate dynamic memory space to be used for the new object attributes that Ring doesn’t know anything about them. 2 - Ring will change the current local scope and the current object scope to use the object state created in step (1) 3 - Ring will move the execution to the class Region (After the class name and before any methods) 4 - Any Instructions/Code in the class region will be executed as any Ring code 5 - Control is moved from the class region to the location of (new point) once we reach the end of the class region or we uses a Return command. So All attributes that added to the object are dynamic attributes, this mean that you can control what attributes will be added through the runtime. Example: $3D = False see new point $3D = True see new point class point x y if not $3D return ok z Output: x: NULL y: NULL x: NULL y: NULL z: NULL You have an option to call init() method directly when you create a new object This method can do anything with the object attributes as it will be called after creating the object and executing the class region code. p1 = new point3d(100,200,300) see p1 class point3d x y z func init p1,p2,p3 x=p1 y=p2 z=p3 70.20 What happens when we create a new object? 1- When you create an object, the class region code will be executed and you will have the object attributes based on the code in that region 2- Ring don’t care about the object methods until you start calling a method 3- When you call a method, Ring will check the object class and the class parent (if you are using inheritance) and will collect the methods for you to be used now or later from any object that belong to the same class. 70.20. What happens when we create a new object? 812
  • 26. Ring Documentation, Release 1.4 4- Since methods are dynamic and each object get the method from the class, you can after creating objects, add new methods and use it with the object or any object created or will be created from the same class. Example: o1 = new point {x=10 y=20 z=30} o2 = new point {x=100 y=200 z =300} addmethod(o1,"print", func { see x + nl + y + nl + z + nl } ) o1.print() o2.print() class point x y z Output: 10 20 30 100 200 300 70.21 Can we use the attributes by accessing the Getter and Setter methods? Yes we can, The setter/getter methods are called automatically when you start using the attributes from outside the class Also you can call the methods instead of using the attributes. It’s your choice. Example: o1 = new Developer o1.name = "Mahmoud" see o1.name + nl o1 { name = "Gal" see name } o1 { name = "Bert" see name } o1.setname("Marino") see o1.getname() Class Developer name language = "Ring Programming Language" func setname value see "Message from SetName() Function!" + nl name = value + " - " + language func getname see "Message from GetName() Function!" + nl + nl return "Mr. " + name + nl Output Message from SetName() Function! Message from GetName() Function! 70.21. Can we use the attributes by accessing the Getter and Setter methods? 813
  • 27. Ring Documentation, Release 1.4 Mr. Mahmoud - Ring Programming Language Message from SetName() Function! Message from GetName() Function! Mr. Gal - Ring Programming Language Message from SetName() Function! Message from GetName() Function! Mr. Bert - Ring Programming Language Message from SetName() Function! Message from GetName() Function! Mr. Marino - Ring Programming Language 70.22 Why should a search of global names be made while defining the class attributes? The question is why we don’t avoid conflicts with global variable names when we define the class attributes ? At first remember that using the optional $ mark in the global variables names solve the problem. Also using the Main function and avoiding global variables may help. The Answer: Ring is a dynamic language We can in the run-time determine the class attributes (Add/Remove) We can execute (any code) while defining the class attributes Example (1) oPerson = new Person Class Person See "Welcome to the Ring language" Example (2) Customize attributes based on global variable value $debug = true oPerson = new Person see oPerson Class Person if $debug date=date() time=time() ok In the previous example when we have the $debug flag set to true, we will add the Date and Time attributes to the object state. Example (3) Store the object index based on global variable $ObjectsCount = 0 oPerson = new Person see oPerson oPerson2 = new Person see oPerson2 70.22. Why should a search of global names be made while defining the class attributes? 814
  • 28. Ring Documentation, Release 1.4 Class Person $ObjectsCount++ nIndex = $ObjectsCount Output: nindex: 1.000000 nindex: 2.000000 Common Example: • Connect to the database then get table columns (Using global Variable/Object). • Create class attributes based on the column names. • Later when you modify the database - you may don’t need to modify your code. It’s flexibility but remember that power comes with great responsibility. 70.23 Why Ring doesn’t avoid the conflict between Global Variables and Class Attributes Names? In this use case we have 1 - Global Variable defined without a special mark like $ 2 - Class contains Attributes defined using a special syntax (where we type the attribute name directly after the class) 3 - The Attributes are defined in the class region that allows writing code and using global variables If I will accepted your proposal about changing how Ring find variables in the class region I must break one of the previous three features which will lead to more problems that are more important than this problem. I don’t like changing the feature number (1) because I would like to keep Ring code more clean and let the programmer decide when to use $ or not. I don’t like changing the feature number (2) because I like this feature and I don’t like forcing the programmer to type self.attribute I don’t like changing the feature number (3) because it’s very important in many applications to access global variables in the class region. So what was my decision ? I decided to leave this case for the programmer who will decide what to do to avoid this special case 1 - The programmer can avoid using global variables (Better) and can use the Main function (Optional) 2 - The programmer can use $ before the variable name or any mark like global_ or g_ 3 - The programmer can use self.attribute after the class name to define the attributes In general, for small programs you can use global variables and functions. For large programs, use classes and objects and small number of global variables or avoid them at all. 70.24 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 70.23. Why Ring doesn’t avoid the conflict between Global Variables and Class Attributes Names?815
  • 29. Ring Documentation, Release 1.4 Add Ring/bin folder to the path then 70.25 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")) 70.26 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 70.27 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 sum([ :a = 1, :b = 2]) sum([ :a = 1 ]) sum([ :b = 2 ]) func sum pList if plist[:a] = NULL pList[:a] = 4 ok 70.25. How to get the file size using ftell() and fseek() functions? 816
  • 30. Ring Documentation, Release 1.4 if plist[:b] = NULL pList[:b] = 5 ok see pList[:a] + pList[:b] + nl Output 3 6 6 70.28 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 70.29 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 nl = char(13) + char(10) # just a variable that you can change to anything ! The + is an operator 70.28. How to print keys or values only in List/Dictionary? 817