'----- Compiler Directives
$OPTIMIZE ON
$TYPECHECK ON
'----- Code modules (Change path to point to the correct directory on your system)
$INCLUDE "QChart.obj"
'----- Form Event SUB Declarations
DECLARE SUB btnOnClick (SENDER AS QButton)
DECLARE SUB frmMainResize (SENDER AS QForm)
'----- API Constants and Functions
CONST GWL_HWNDPARENT = (-8) 'Minimize to task bar
CONST HWND_DESKTOP = 0
DECLARE FUNCTION SetWindowLong LIB "user32" ALIAS "SetWindowLongA"_
(hwnd AS LONG, nIndex AS LONG, dwNewLong AS LONG) AS LONG
'----- Rapid-Q Constants
CONST alRight = 4
CONST poLandscape = 1
CREATE frmMain AS QForm
Center
Width = 640
Height = 480
Caption = "QChart Example"
OnResize = frmMainResize
CREATE drwHisto1 AS QButton
Caption = "Histogram"
OnClick = btnOnClick
END CREATE
CREATE drwBar1 AS QButton
Caption = "Bar Graph 1"
Top = 25
OnClick = btnOnClick
END CREATE
CREATE drwBar2 AS QButton
Caption = "Bar Graph 2"
Top = 50
OnClick = btnOnClick
END CREATE
CREATE drwBar3 AS QButton
Caption = "Bar Graph 3"
Top = 75
OnClick = btnOnClick
END CREATE
CREATE drwXYpt AS QButton
Caption = "XY Points"
Top = 100
OnClick = btnOnClick
END CREATE
CREATE drwXYln AS QButton
Caption = "XY Lines"
Top = 125
OnClick = btnOnClick
END CREATE
CREATE drwXYboth AS QButton
Caption = "XY Both"
Top = 150
OnClick = btnOnClick
END CREATE
CREATE drwXYlog AS QButton
Caption = "XY Logs"
Top = 175
OnClick = btnOnClick
END CREATE
CREATE drwLine AS QButton
Caption = "Line Graph"
Top = 200
OnClick = btnOnClick
END CREATE
CREATE drwLinePts AS QButton
Caption = "Line w/Points"
Top = 225
OnClick = btnOnClick
END CREATE
CREATE drwBox AS QButton
Caption = "Box Plot"
Top = 250
OnClick = btnOnClick
END CREATE
CREATE drwHiLo1 AS QButton
Caption = "HLC Style 1"
Top = 275
OnClick = btnOnClick
END CREATE
CREATE drwHiLo2 AS QButton
Caption = "HLC Style 2"
Top = 300
OnClick = btnOnClick
END CREATE
CREATE btnRedraw AS QButton
Caption = "Redraw"
Top = 325
OnClick = btnOnClick
END CREATE
CREATE btnClear AS QButton
Caption = "Clear"
Top = 350
OnClick = btnOnClick
END CREATE
CREATE btnSave AS QButton
Caption = "Save"
Top = 375
OnClick = btnOnClick
END CREATE
CREATE btnPrint AS QButton
Caption = "Print"
Top = 400
OnClick = btnOnClick
END CREATE
CREATE btnExit AS QButton
Caption = "Exit"
Top = 425
OnClick = btnOnClick
END CREATE
CREATE Graph AS QChart 'Create a copy of the new object
Align = alRight
Width = frmMain.ClientWidth - btnClear.Width
Height = frmMain.ClientHeight
Image.OnPaint = Graph.ImagePaint 'This line REQUIRED to process Repaints
END CREATE'Graph
END CREATE'frmMain
'API Call that lets RapidQ programs minimize to the task bar
setwindowlong(frmMain.handle, GWL_HWNDPARENT, HWND_DESKTOP)
setwindowlong(application.handle, GWL_HWNDPARENT, frmMain.handle)
WITH Graph
.Initialize 'Set default values
.ClearBuffer 'Start with a clean slate
.ImagePaint 'Paint the blank Canvas
END WITH
frmMain.ShowModal
'----- Event SUBs
SUB btnOnClick (SENDER AS QButton)
DIM i AS INTEGER 'Loop counters...
DIM j AS INTEGER
DIM k AS SINGLE 'A Scratch Variable
SELECT CASE Sender.Caption
CASE "Histogram"
WITH Graph
.Initialize 'Set defaults
.MainTitle.Text = "Histogram Example" 'Change desired options
.SubTitle.Text = "No Grid, No Border"
.XTitle.Text = "X Axis"
.YTitle.Text = "Y Axis"
.DoLegend = False
.AxisBorder = False
.XAxis.Grid = False
.YAxis.Grid = False
.Data.ColCount = 1 'Set .Data Grid dimensions
.Data.RowCount = 10
j = 25 'Load the data
RANDOMIZE
FOR i = 1 to .Data.RowCount
.Data.Cell(0,i) = "Class " + STR$(i)
.Data.Cell(1,i) = STR$(RND * j)
NEXT i
.ChartType = ctBar 'Bar Chart
.ChartStyle = csHisto 'Histogram
.DrawBar (False) 'Draw it!
END WITH
CASE "Bar Graph 1"
WITH Graph
.Initialize 'Set defaults
.MainTitle.Text = "Bar Graph Example 1" 'change desired options
.SubTitle.Text = "Positive Values"
.XTitle.Text = "X Axis"
.YTitle.Text = "Y Axis"
.XAxis.Grid = False
.Data.ColCount = 5 'Set .Data Grid dimensions
.Data.RowCount = 2
k = 25 'Load the data
RANDOMIZE
FOR i = 1 to .Data.ColCount
.Data.Cell(i , 0) = STR$(i) 'Legend in Row 0 of each Col
FOR j = 1 TO .Data.RowCount
.Data.Cell(i,j) = STR$(RND * k)
NEXT j
NEXT i
FOR j = 1 TO .Data.RowCount
.Data.Cell(0,j) = "Treatment " + STR$(j) 'X Labels in Col 0 of each Row
NEXT j
.ChartType = ctBar 'Bar Chart
.ChartStyle = csBar 'Grouped Bars
.DrawBar (False) 'Draw it!
END WITH
CASE "Bar Graph 2"
WITH Graph
.Initialize 'Set defaults
.MainTitle.Text = "Bar Graph Example 2" 'change desired options
.SubTitle.Text = "Negative Values"
.XTitle.Text = "X Axis"
.YTitle.Text = "Y Axis"
.Data.ColCount = 8 'Set .Data Grid dimensions
.Data.RowCount = 1
k = 25 'Load the data
RANDOMIZE
FOR i = 1 to .Data.ColCount
.Data.Cell(i , 0) = "Group " + STR$(i) 'Legend in Row 0 of each Col
FOR j = 1 TO .Data.RowCount
.Data.Cell(i,j) = STR$((RND) * -k)
NEXT j
NEXT i
FOR j = 1 TO .Data.RowCount
.Data.Cell(0,j) = "Level " + STR$(j) 'X Labels in Col 0 of each Row
NEXT j
.ChartType = ctBar 'Bar Chart
.ChartStyle = csBar 'Grouped Bars
.DrawBar (False) 'Draw it!
END WITH
CASE "Bar Graph 3"
WITH Graph
.Initialize 'Set defaults
.MainTitle.Text = "Bar Graph Example 3" 'change desired options
.SubTitle.Text = "Positive and Negative Values"
.XTitle.Text = "X Axis"
.YTitle.Text = "Y Axis"
.Data.ColCount = 4 'Set .Data Grid dimensions
.Data.RowCount = 3
k = 20 'Load the data
RANDOMIZE
FOR i = 1 to .Data.ColCount
.Data.Cell(i , 0) = "Long Legend Title " + STR$(i)'Legend in Row 0 of each Col
FOR j = 1 TO .Data.RowCount
.Data.Cell(i,j) = STR$((RND - RND) * k)
NEXT j
NEXT i
FOR j = 1 TO .Data.RowCount
.Data.Cell(0,j) = "Level " + STR$(j) 'X Labels in Col 0 of each Row
NEXT j
.ChartType = ctBar 'Bar Chart
.ChartStyle = csBar 'Grouped Bars
.DrawBar (False) 'Draw it!
END WITH
CASE "XY Points"
WITH Graph
.Initialize 'Set defaults
.MainTitle.Text = "Scatter Plot Example" 'change desired options
.SubTitle.Text = "Data in All Four Quadrants"
.XTitle.Text = "X Axis"
.YTitle.Text = "Y Axis"
.Data.ColCount = 16 'Set .Data Grid dimensions
.Data.RowCount = 5
k = .00100 '<-- change k for large and small values
RANDOMIZE 'Load the data
FOR i = 2 to .Data.ColCount STEP 2 'for each col pair
.Data.Cell(i , 0) = "Group " + STR$(i \ 2) 'Legend in 2nd Col (Y) of Pair, Row 0
FOR j = 1 to .Data.RowCount 'add data to each row
.Data.Cell(i - 1 , j) = STR$(k * (RND - RND))'X Values in Col 1
.Data.Cell(i , j) = STR$(k * (RND - RND)) 'Y Values in Col 2
NEXT j
NEXT i
.ChartType = ctXY 'XY Scatter Chart
.ChartStyle = csPointsOnly 'Just the Points
.DrawXY (False) 'Draw it!
END WITH
CASE "XY Lines"
WITH Graph
.Initialize 'Set defaults
.MainTitle.Text = "Two Sine Curves" 'change desired options
.SubTitle.Text = "Out of Phase"
.XTitle.Text = "Radians"
.YTitle.Text = "Sine of X"
.BW = True
.YAxis.Div = 6
.XAxis.AutoScale = False 'Manually Scale
.XAxis.Max = 2 'Set Max Manually
.XAxis.Min = 0 'Set Min Manually
.YAxis.AutoScale = False 'Manually Scale
.YAxis.Max = 1.5 'Set Max Manually
.YAxis.Min = -1.5 'Set Min Manually
.Data.ColCount = 4 'Set .Data Grid dimensions
.Data.RowCount = 21 'Load the data
FOR i = 2 to .Data.ColCount STEP 2 'for each col pair
.Data.Cell(i , 0) = "Group " + STR$(i \ 2) 'Legend in 2nd Col of Pair, Row 0
.Series(i\2).LineStyle = (i\2-1) MOD 5 'Cycle line styles
FOR j = 1 to .Data.RowCount 'add data to each row
.Data.Cell(i - 1 , j) = STR$((j-1)/10) 'X Values in 1st Col of Pair
k = ((j-1)/10 + [(i-2) * 4.75])* 3.141592
.Data.Cell(i , j) = STR$(SIN(k)) 'Y Values in 2nd Col of Pair
NEXT j
NEXT i
.ChartType = ctXY 'XY Scatter Chart
.ChartStyle = csLinesOnly 'Just the Lines
.DrawXY (False) 'Draw it!
END WITH
CASE "XY Both"
WITH Graph
.Initialize 'Set defaults
.MainTitle.Text = "Scatter Plot With Lines" 'change desired options
.SubTitle.Text = "All options set to default"
.XTitle.Text = "X Axis"
.YTitle.Text = "Y Axis"
.Data.ColCount = 4 'Set .Data Grid dimensions
.Data.RowCount = 11
k = 100 'Load the data
RANDOMIZE
FOR i = 2 to .Data.ColCount STEP 2 'for each col pair
.Data.Cell(i , 0) = "Group " + STR$(i \ 2) 'Legend in 2nd Col of Pair, Row 0
FOR j = 1 to .Data.RowCount 'add data to each row
.Data.Cell(i - 1 , j) = STR$(j) 'X Values in 1st Col of Pair
.Data.Cell(i , j) = STR$(RND * k) 'Y Values in 2nd Col of Pair
NEXT j
NEXT i
' .Data.Cell(1,4) = "" 'Uncomment to see how QChart
' .Data.Cell(4,8) = "" 'handles missing data
.ChartType = ctXY 'XY Scatter Chart
.ChartStyle = csBoth 'Lines and Points
.DrawXY (True) 'Draw it as an Overlay
END WITH
CASE "XY Logs"
WITH Graph
.Initialize 'Set defaults
.MainTitle.Text = "Log - Log Scaling" 'change desired options
.SubTitle.Text = "Grid with no Tics"
.XTitle.Text = "X Axis"
.YTitle.Text = "Y Axis"
.YAxis.Tics = False
.YAxis.LogScale = True
.XAxis.Tics = False
.XAxis.LogScale = True
.DoLegend = False
.Data.ColCount = 2 'Set .Data Grid dimensions
.Data.RowCount = 10
RANDOMIZE 'Load the data
FOR i = 2 to .Data.ColCount STEP 2 'for each col pair
.Data.Cell(i , 0) = "Group " + STR$(i \ 2) 'Legend in 2nd Col of Pair, Row 0
FOR j = 1 to .Data.RowCount 'add data to each row
.Data.Cell(i - 1 , j) = STR$(j) 'X Values in 1st Col of Pair
.Data.Cell(i , j) = STR$(RND * 10^ (j/5)) 'Y Values in 2nd Col of Pair
NEXT j
NEXT i
.ChartType = ctXY 'XY Scatter Chart
.ChartStyle = csBoth 'Points and Lines
.DrawXY (True) 'Draw it!
END WITH
CASE "Line Graph"
WITH Graph
.Initialize 'Set defaults
.MainTitle.Text = "Simple Line Graph" 'change desired options
.SubTitle.Text = "X Labels Alternate Up and Down for Room"
.XTitle.Text = "X Axis"
.YTitle.Text = "Y Axis"
.Data.ColCount = 5 'Set .Data Grid dimensions
.Data.RowCount = 12
k = 18 'Load the data
RANDOMIZE
FOR i = 1 to .Data.ColCount 'for each col
.Series(i).LineStyle = (i-1) MOD 5 'Cycle line styles
.Data.Cell(i , 0) = "Group " + STR$(i) 'Legend in Row 0 of Each Col
FOR j = 1 to .Data.RowCount 'add data to each row
.Data.Cell(0 , j) = "Label " + STR$(j) 'X Labels
.Data.Cell(i , j) = STR$(RND * k) 'Y Values
NEXT j
NEXT i
.ChartType = ctLine 'Line Chart
.ChartStyle = csLinesOnly 'Lines only
.DrawLine (False) 'Draw it!
END WITH
CASE "Line w/Points"
WITH Graph
.Initialize 'Set defaults
.MainTitle.Text = "Line Graph With Points" 'change desired options
.SubTitle.Text = "Tics Only, No Grid"
.XTitle.Text = "X Axis"
.YTitle.Text = "Y Axis"
.BW = True
.XAxis.Grid = False 'Tics only
.YAxis.Grid = False
.Data.ColCount = 4 'Set .Data Grid dimensions
.Data.RowCount = 6
k = 18 'Load the data
RANDOMIZE
FOR i = 1 to .Data.ColCount 'for each col
.Data.Cell(i , 0) = "Group " + STR$(i) 'Legend in Row 0 of Each Col
FOR j = 1 to .Data.RowCount 'add data to each row
.Data.Cell(0 , j) = "Lbl " + STR$(j) 'X Labels
.Data.Cell(i , j) = STR$(RND * k) 'Y Values
NEXT j
NEXT i
' .Data.Cell(1,4) = "" 'Uncomment to see QChart handle missing data
.ChartType = ctLine 'Line Chart
.ChartStyle = csBoth 'Points and Lines
.DrawLine (False) 'Draw it!
END WITH
CASE "Box Plot"
WITH Graph
.Initialize 'Set defaults
.MainTitle.Text = "Box and Whisker Plot" 'change desired options
.XTitle.Text = "X Axis"
.YTitle.Text = "Y Axis"
.XAxis.Grid = False
.XAxis.Tics = False
.YAxis.AutoScale = False
.YAxis.Min = 0
.YAxis.Max = 50
.Data.ColCount = 16 'Set .Data Grid dimensions
.Data.RowCount = 5
k = 10 'Load the data
RANDOMIZE
FOR i = 1 to .Data.ColCount 'for each col
.Data.Cell(i , 0) = "Group " + STR$(i) 'Legend in Row 0 of Each Col
.Data.Cell(i , 1) = STR$(RND * k + 40) 'Max Values
.Data.Cell(i , 2) = STR$(RND * k + 30) 'Q3 Values
.Data.Cell(i , 3) = STR$(RND * k + 20) 'Q2 Values
.Data.Cell(i , 4) = STR$(RND * k + 10) 'Q1 Values
.Data.Cell(i , 5) = STR$(RND * k) 'Min Values
NEXT i
.ChartType = ctBox 'Box and Whisker Plot
.ChartStyle = csWhisker
.DrawBox (False) 'Draw it!
END WITH
CASE "HLC Style 1"
'NOTE: If values for .Data.Cells 2, 3 and 4 are set equal,
'Box routine will draw a Hi-Lo-Close antenna style graph
WITH Graph
.Initialize 'Set defaults
.MainTitle.Text = "Hi-Lo-Close Plot" 'change desired options
.SubTitle.Text = "Antenna Style"
.XTitle.Text = "X Axis"
.YTitle.Text = "Y Axis"
.XAxis.Grid = False
.XAxis.Tics = False
.Data.ColCount = 8 'Set .Data Grid dimensions
.Data.RowCount = 5
k = 10 'Load the data
RANDOMIZE
FOR i = 1 to .Data.ColCount 'for each col
.Data.Cell(i , 0) = "Group " + STR$(i) 'Legend in Row 0 of Each Col
.Data.Cell(i , 1) = STR$(RND * k + 50) 'Hi Value
.Data.Cell(i , 2) = STR$(RND * k + 37) '<-- Set all Three to
.Data.Cell(i , 3) = .Data.Cell(i , 2) '<-- the mid or "Close"
.Data.Cell(i , 4) = .Data.Cell(i , 2) '<-- Value
.Data.Cell(i , 5) = STR$(RND * k + 25) 'Lo Value
NEXT i
.ChartType = ctBox 'Hi-Lo-Close Plot
.ChartStyle = csHiLo
.DrawBox (False) 'Draw it!
END WITH
CASE "HLC Style 2"
'NOTE: If values for .Data.Cells 1 & 2 and 4 & 5 are set equal,
'Box routine will draw a Hi-Lo-Close box style graph
WITH Graph
.Initialize 'Set defaults
.MainTitle.Text = "Hi-Lo-Close Plot" 'change desired options
.SubTitle.Text = "Box Style"
.XTitle.Text = "X Axis"
.YTitle.Text = "Y Axis"
.XAxis.Grid = False
.XAxis.Tics = False
.Data.ColCount = 8 'Set .Data Grid dimensions
.Data.RowCount = 5
k = 10 'Load the data
RANDOMIZE
FOR i = 1 to .Data.ColCount 'for each col
.Data.Cell(i , 0) = "Group " + STR$(i) 'Legend in Row 0 of Each Col
.Data.Cell(i , 1) = STR$(RND * k + 50) 'Hi Value
.Data.Cell(i , 2) = .Data.Cell(i , 1) '<-- Set = to Hi Value
.Data.Cell(i , 3) = STR$(RND * k + 35) 'Close Value
.Data.Cell(i , 4) = STR$(RND * k + 20) 'Lo Value
.Data.Cell(i , 5) = .Data.Cell(i , 4) '<-- Set = Lo Value
NEXT i
.ChartType = ctBox 'Hi-Lo-Close Plot
.ChartStyle = csWhisker 'Whiskers are hidden :)
.DrawBox (False) 'Draw it!
END WITH
CASE "Redraw"
WITH Graph
.MainFont.Name = "Times New Roman" 'Change some options
.SubFont.Name = "Times New Roman" 'on the currently defined chart
.PlotAreaColr = .Colors(15)
SELECT CASE .SubFont.Size
CASE .MainFont.Size
.SubFont.Size = 12
CASE ELSE
.SubFont.Size = .MainFont.Size
END SELECT
SELECT CASE .DoLegend
CASE TRUE
.DoLegend = False
CASE FALSE
.DoLegend = True
END SELECT
SELECT CASE .GreyScale
CASE TRUE
.GreyScale = False
CASE FALSE
.GreyScale = True
END SELECT
.RedrawChart 'and redraw the chart
END WITH
CASE "Clear"
Graph.ClearBuffer 'Start with a clean slate
Graph.ImagePaint 'Paint the blank Canvas
CASE "Save"
Graph.SaveChart ("")
CASE "Print"
Graph.PrintChart (Printer.PrinterIndex, poLandscape, 40, 1)
CASE "Exit"
Application.Terminate
END SELECT
END SUB
'-------------------------------------------------------------------------------------------
SUB frmMainResize (SENDER AS QForm)
WITH Graph
.Width = frmMain.ClientWidth - btnClear.Width 'Calculate new sizes
.Height = frmMain.ClientHeight
.RedrawChart 'Redraw the QChart Object
END WITH
'Plus anything else that needs doing in your form resize
END SUB