Liberty BASIC News
Safe Registry and Ini File Alternative
Deleting and Renaming Disk Files
Segments and Flushing
Flat Toolbar with Toolips
Translating 32-bit VB API Calls
Event-Driven Programming Concepts
Spotlight on the Community!
ODBC in Liberty BASIC
Hex Viewer
Listing Files Recursively
Registering Hot Keys
Preventing more than 1 instance
Multi-Coloured Text Input Boxes
Images on Buttons and Statictext
Two Demos by David Conner
From the eBook, Mastering Liberty BASIC 3:
Liberty BASIC graphics consume memory. Each graphics command is written to memory to something called a metafile. If many graphics are drawn, memory resources may become low. This can make a program and a system perform sluggishly. It can even cause a program to crash. You can avoid this problem with proper graphics memory management. There are three commands that release memory consumed by graphics: CLS, DISCARD, and DELSEGMENT
CLS
The CLS (CLearScreen) command clears the graphics area and releases all memory
consumed by graphics. This will work fine if there is no need to remember
previous drawing routines, and if the flickering associated with clearing
the screen is acceptable in a program.
FLUSH
The FLUSH command may be a bit confusing. In other areas of life, the word
flush may mean to remove things, or to clean things out. We flush the old
antifreeze from our radiators so that we can fill them with new antifreeze,
just as one example. In Liberty BASIC, FLUSH has a unique meaning. It means
"make graphics persist". Graphics drawn on a graphics window or
graphicbox will disappear if the window is obscured or covered-over. If we
issue a FLUSH command, the graphics will persist so that they will still be
visible when the window is again made visible.
Each time the FLUSH command is issued, a "drawing segment" is created. All drawing operations that are accomplished in between FLUSHes (or from the beginning to the first FLUSH command) are part of a drawing segment. Each of these segments has an ID number. A FLUSH command closes the current drawing segment and increments the ID by 1.
SEGMENT
You can retrieve the segment number (segment ID) of the current drawing segment
with the SEGMENT command. It looks like this:
syntax: print #handle, "segment variableName"
as it might look in a program:
print #1, "segment segID" notice "Drawing segment is ";segID
After this command is issued, the segment ID number will be contained in the receiver variable. This is the ID for the segment that is currently open. The first segment begins with the first graphic command and ends with the first FLUSH command. All segments after that are contained between FLUSH commands. To get the ID of a segment, use the SEGMENT command right before the FLUSH command. Segment IDs are used to DISCARD or REDRAW individual segments. The receiver variable can be named as desired, and it is advantageous to use discriptive names for it. For instance, if a circle has been drawn, you might call the segment "circleID".
The segment ID for each segment doesn't change, regardless of any additions
or deletions of other segments.
SPRITES
Segments and flushing do not apply to sprite graphics placed on the screen
with DRAWSPRITES. If sprite graphics are flushed by using GETBMP, DRAWBMP,
FLUSH then this sequence does constitute a drawing segment.
DISCARD
This causes all items drawn since the last flush to be removed from memory
immediately. Discard does not force an immediate redraw, so the items that
have been discarded will still be displayed until a REDRAW (see REDRAW below).
syntax: print #handle, "discard"
as it might appear in a program:
print #1, "discard"
REDRAW
This command has two forms. The first form will cause the window to redraw
all flushed drawn segments. Any deleted segments will not be redrawn (see
DELSEGMENT below). Any items drawn since the last flush will not be redrawn
either, and will be lost.
syntax: print #handle, "redraw"
as it might appear in a program:
print #1, "discard; redraw"
The second form of the command allows us to redraw a specific drawing segment.
Syntax: syntax: print #handle, "redraw "; idNum
For instance, let's imagine that we've filled the screen with blue and drawn a pink circle and a green box in the first drawing segment, which we close with a FLUSH command. We issue other drawing commands later in the program, but later still, we went to display that first segment again. Knowing that this is the first segment, we can issue a REDRAW command like this:
print #1, "discard; redraw"
Any segment may be redrawn in this fashion, as long as it hasn't been deleted with DELSEGMENT (see below), or by the CLS command. We can retrieve the ID of a drawing segment and store it in a variable for use later with the SEGMENT command, which is explained above. If we have placed a particular segment ID into a variable called "myID", then we redraw that segment like this:
print #1, "redraw 1"
DELSEGMENT
This causes the drawn segment identified to be removed from the window's list
of drawn items. The memory that was consumed by the drawn segment is reclaimed
by the operating system. When the window is redrawn, the deleted segment will
not be included in the redraw. It will not be possible to redraw this segment
with the REDRAW command.
Syntax: print #handle, "delsegment n"
As it might appear in a program:
'with hard-coded ID number: print #1, "delsegment 2" 'or with ID number contained in a variable: print #1, "delsegment ";myID
DEMO
The following small program illustrates how to flush graphics, how to obtain
segment IDs, how to discard grahics, and how to redraw individual segments.
nomainwin button #1.redraw, "Redraw",[newDraw],UL,10,10, 120,24 open "Flush and Redraw Demo" for graphics_nf_nsb as #1 #1 "trapclose [quit]" #1 "down; fill yellow; size 5" #1 "color darkgreen;backcolor green" #1 "place 10 70;boxfilled 200 200" #1 "place 30 120;\First Segment" #1 "segment boxID" #1 "flush" 'end first segment #1 "fill pink;color yellow" #1 "backcolor darkcyan" #1 "place 150 150; circlefilled 100" #1 "place 100 140;\Second Segment" #1 "segment circleID" #1 "flush" 'end second segment #1 "fill blue; color lightgray" #1 "backcolor darkred;place 150 150" #1 "ellipsefilled 250 200" #1 "place 50 140;\Third Segment, not flushed" #1 "discard" 'discard these commands from memory wait [newDraw] if currentID=circleID then #1 "redraw ";boxID currentID=boxID else #1 "redraw ";circleID currentID=circleID end if wait [quit] close #1:end
Liberty BASIC News
Safe Registry and Ini File Alternative
Deleting and Renaming Disk Files
Segments and Flushing
Flat Toolbar with Toolips
Translating 32-bit VB API Calls
Event-Driven Programming Concepts
Spotlight on the Community!
ODBC in Liberty BASIC
Hex Viewer
Listing Files Recursively
Registering Hot Keys
Preventing more than 1 instance
Multi-Coloured Text Input Boxes
Images on Buttons and Statictext
Two Demos by David Conner