Delphi Example Program


{ *******************************************************}

{                                                        *}

{   Description: Delphi example building one graph with  *}

{                Charting Tools for Windows              *}

{                                                        *}

{ *******************************************************}

{Main work unit for program}

unit easygrax;

interface

uses WinTypes, WinProcs, messages,qcwin, hook;

procedure MB_CreateGraph (thwnd:HWND; tinst:THANDLE);

procedure WM_DestroyGraph;

implementation

{$R easygr}

const

 NUMP1= 80;             {  number of data points}

var

  hX1, hY1: THANDLE;    {  global memory handles to data}

{  Prototypes of forward referenced functions}

procedure StartGraphs1 (pPageDesc:PPAGE_DEF); far; forward;

procedure DrawP1G1 (pGrDesc:PGRAPH_DEF; thdc:HDC); far; forward;

function randreal:realtype; forward;

procedure MB_CreateGraph (thwnd:HWND; tinst:THANDLE);

begin

  { page is created in the current window }

  WGCreatePage ('PAGE1', {  page ID string}

    thwnd,              {  handle to the parent window}

    tInst,              {  application instance handle}

    'First Graph',      {  Window title string}

    @StartGraphs1,      {  pointer to graph creation function}

    'PageMenu',

    {  Name of page window menu in resource file}

    C_LIGHTGRAY,        {  window background color}

    MM_PROPORT,         {  window sizing mode}

    0,                  {  window style - default}

    PAGE_CLIENT,

    {  window initial size and position option}

    0, 0, 0, 0);        {  initial window size and position}

end;

procedure WM_DestroyGraph;

begin

  WGCleanup (TRUE); {  clean up charting tools memory}

  PostQuitMessage (0);

end;

{ *******************************************************

   Routine StartGraphs1 is called by the Quinn-Curtis

   Windows Charting Tools when a page is created.

   It must be filled by the user, normally with

   functions WGCreateGraph that initialize individual graphs.

*********************************************************** }

const

 fInit: WORDBOOL = TRUE;

procedure StartGraphs1 (pPageDesc:PPAGE_DEF);

var    i: INTEGER;

    z: realtype;

    lpX1, lpY1: LPREAL;

begin

  {  create simulation data for plot}

  if (fInit) then begin

    {  do not initialize data twice}

    {  allocate global data arrays}

    hX1:= GlobalAlloc (GHND, sizeof (realtype) * NUMP1);

    hY1:= GlobalAlloc (GHND, sizeof (realtype) * NUMP1);

    {  get pointers to data arrays}

    lpX1:= GlobalLock (hX1);

    lpY1:= GlobalLock (hY1);

    {  create x and y data to be plotted}

    for i:= 0 to NUMP1 - 1 do begin

      z:= i;

      WGPutPntrReal (lpX1, i, z);

      WGPutPntrReal (lpY1, i, 15.0 *

        cos (PI * z / (4.0 + 0.3 * randreal)) +

        3.0 * randreal);

    end;

    fInit:= FALSE;

  end;

  {  Initialize graph }

  WGCreateGraph (pPageDesc, @DrawP1G1,

    {  points to function which builds graph}

    0.005, 0.005,

    {  window relative position inside parent page window}

    0.99, 0.99,

    C_WHITE,     {  white background}

    C_RED,       {  red   border}

    1);          {  border width in pixels}

end;

{ ******************************************************

   Builds the graph using Q-C Windows Charting Calls

******************************************************* }

procedure DrawP1G1 (pGrDesc:PGRAPH_DEF; thdc:HDC);

var

    hAxisX, hAxisY, hLabX, hLabY: THANDLE;  {  axes handles}

    hDataSet: THANDLE;        {  data set handle}

begin

  {  define a dataset }

  hDataSet:= WGDefineDataSet ('60 Cycle Noise', hX1, hY1, NUMP1);

  {  define the plotting area of the graph }

  WGSetPlotArea (pGrDesc, thdc, 0.15, 0.15, 0.9, 0.80, C_LIGHTGRAY);

  {  axes to be drawn in solid, black, 1 pixels thick}

  WGSetLineStyle (pGrDesc, thdc, PS_SOLID, 1, C_BLACK);

  {  set current font to Arial, 12 points, bold}

  WGSetTextByName (C_BLACK, 'Arial', 10, TEXT_BOLD);

  {  analyze the data set and automatically scale the }

  {  plot area, draw and label the axes}

  WGAutoAxes (pGrDesc, thdc, hDataSet, AS_ROUNDCLOSE,

    INTF_ZERO, hAxisX, hAxisY, hLabX, hLabY);

  {  set line style of actual plot to RED}

  WGSetLineStyle (pGrDesc, thdc, PS_SOLID, 0, C_RED);

  {  plot the data with spline interpolation on}

  WGLinePlot (pGrDesc, thdc, hDataSet, FALSE, TRUE);

  {  Write axes titles}

  WGTitleAxis (pGrDesc, thdc, hAxisX, POS_BELOW, 'Sample Interval');

  WGTitleAxis (pGrDesc, thdc, hAxisY, POS_LEFT, 'Volts');

  {  set current font to Arial, 16 points, bold, italic}

  WGSetTextByName (C_GREEN, 'Arial', 16, TEXT_BOLD  or  TEXT_ITAL);

  {  Write graph title}

  WGTitleGraph (pGrDesc, thdc, 'Input Waveform');

end;

function randreal:realtype;

begin

  randreal:= random (32766) / 32767.0;

end;

begin

end.

{ Delphi Unit file which supplies the TForm1 interface to easygrax.pas }

unit Unit8;

interface

uses

  SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,

  Forms, Dialogs, StdCtrls;

type

  TForm1 = class(TForm)

    Label1: TLabel;

    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;

      Shift: TShiftState; X, Y: Integer);

  private

    { Private declarations }

  public

    { Public declarations }

  end;

var

  Form1: TForm1;

implementation

uses easygrax;

{$R *.DFM}

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;

  Shift: TShiftState; X, Y: Integer);

begin

    if (Button =  mbRight)  THEN

      MB_CreateGraph(Form1.handle, hinstance);

end;

end.