home *** CD-ROM | disk | FTP | other *** search
- { FormulaBuilder 1.0 }
- { YGB Software, Inc. }
- { Copyright 1995 Clayton Collie }
- { All Rights Reserved }
-
- {* Main Form of the main FormulaBuilder Demo *}
-
- unit Mainform;
- interface
- uses
- SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
- Forms, Dialogs, TabNotBk, StdCtrls, Buttons, ExtCtrls, DB,
- DBTables, Grids, DBGrids,DBCtrls,
- FBCalc,FBComp,FBDBComp,
- FiltrFrm,FuncDlg,extfunc,
- DBExprFm, VBXCtrl, Chart2fx, Outline,
- fb_rtti,FBRTCOMP;
-
- type
- TMainDemoFm = class(TForm)
- Notebook: TTabbedNotebook;
- ResultsPanel: TPanel;
- Panel1: TPanel;
- ExpressionListbox: TListBox;
- Panel2: TPanel;
- btnFunctions: TBitBtn;
- CancelBtn: TBitBtn;
- SpeedButton2: TSpeedButton;
- CustomerGrid: TDBGrid;
- CustomerTable: TTable;
- CustomerDataSource: TDataSource;
- Panel5: TPanel;
- OrdersGrid: TDBGrid;
- OrdersTable: TTable;
- OrdersDataSource: TDataSource;
- Panel8: TPanel;
- OrdersResultPanel: TPanel;
- Panel9: TPanel;
- cbxApplyCustomerFilter: TCheckBox;
- OrdersTableOrderNo: TFloatField;
- OrdersTableCustNo: TFloatField;
- OrdersTableSaleDate: TDateTimeField;
- OrdersTableShipDate: TDateTimeField;
- OrdersTableEmpNo: TIntegerField;
- OrdersTableTerms: TStringField;
- OrdersTablePaymentMethod: TStringField;
- OrdersTableItemsTotal: TCurrencyField;
- OrdersTableTaxRate: TFloatField;
- OrdersTableFreight: TCurrencyField;
- OrdersTableAmountPaid: TCurrencyField;
- btnCustomerFilter: TBitBtn;
- btnOrdersFilter: TBitBtn;
- cbxApplyOrdersFilter: TCheckBox;
- Formula: TBitBtn;
- ChartFX1: TChartFX;
- GroupBox1: TGroupBox;
- ResultMemo: TMemo;
- ExpressionGroupBox: TGroupBox;
- ExpressionCombo: TComboBox;
- VariablesBtn: TSpeedButton;
- CalcBtn: TSpeedButton;
- Panel3: TPanel;
- FormulaEdit: TEdit;
- XMinEdit: TEdit;
- XMaxEdit: TEdit;
- NumPtsEdit: TEdit;
- btnDrawGraph: TSpeedButton;
- Label1: TLabel;
- Label2: TLabel;
- Label3: TLabel;
- Label4: TLabel;
- newFuncsCombo: TComboBox;
- NewFuncsListbox: TListBox;
- RunBtn: TSpeedButton;
- runmemo: TMemo;
- RegisterFuncBtn: TBitBtn;
- UnregisterBtn: TBitBtn;
- HelpBtn: TBitBtn;
- btnAbout: TSpeedButton;
- Bevel1: TBevel;
- SimpleExpression: TExpression;
- CustomersFilter: TDSFilter;
- OrdersFilter: TDSFilter;
- OrdersExpression: TDBExpression;
- lblCustomerGrid: TLabel;
- lblOrdersGrid: TLabel;
- CustomerTableCustNo: TFloatField;
- CustomerTableCompany: TStringField;
- CustomerTableAddr1: TStringField;
- CustomerTableCity: TStringField;
- CustomerTableState: TStringField;
- CustomerTableZip: TStringField;
- CustomerTableCountry: TStringField;
- CustomerTablePhone: TStringField;
- CustomerTableFAX: TStringField;
- CustomerTableTaxRate: TFloatField;
- CustomerTableContact: TStringField;
- CustomerTableLastInvoiceDate: TDateTimeField;
- lblDemo: TLabel;
- BitBtn1: TBitBtn;
- Panel4: TPanel;
- Panel6: TPanel;
- Memo2: TMemo;
- MainLabel: TLabel;
- procedure btnFunctionsClick(Sender: TObject);
- procedure FormCreate(Sender: TObject);
- procedure FilterBtnClick(Sender: TObject);
- procedure btnOrdersFilterClick(Sender: TObject);
- procedure cbxApplyCustomerFilterClick(Sender: TObject);
- procedure FormulaClick(Sender: TObject);
- procedure CustomerDataSourceDataChange(Sender: TObject; Field: TField);
- procedure OrdersDataSourceDataChange(Sender: TObject; Field: TField);
- procedure cbxApplyOrdersFilterClick(Sender: TObject);
- procedure CalcBtnClick(Sender: TObject);
- procedure VariablesBtnClick(Sender: TObject);
- procedure ExpressionListboxDblClick(Sender: TObject);
- procedure btnDrawGraphClick(Sender: TObject);
- procedure RegisterFuncBtnClick(Sender: TObject);
- procedure UnregisterBtnClick(Sender: TObject);
- procedure RunBtnClick(Sender: TObject);
- procedure NewFuncsListboxClick(Sender: TObject);
- procedure HelpBtnClick(Sender: TObject);
- procedure btnAboutClick(Sender: TObject);
- procedure BitBtn1Click(Sender: TObject);
- private
- { Private declarations }
- { Page 1 - Filter and DBExpression Demo }
- Xmax,XMin : double;
- OldNumpts,NumPts : longint;
- GraphFormula : string[150];
- Function CollectGraphOpts : boolean;
- Procedure PlotGraph;
- Procedure UpdateCustomerGrid;
- Procedure UpdateOrdersGrid;
- Procedure UpdateOrderCalc;
- Procedure RunFunc;
- { RTTI }
- public
- { Public declarations }
- end;
-
- var
- MainDemoFm: TMainDemoFm;
-
- implementation
- uses FBMisc,VarDlg,ChartFX,FBHelpFm,demabout,typinfo,WarnDlg,RTTIFm;
- {$R *.DFM}
-
- Const ALLTYPES = [vtSTRING,vtINTEGER,vtFLOAT,vtBOOLEAN,vtDATE,vtCHAR,vtANY];
- const DBExpr =
- '[Customer->Company] + " paid $"+str([Orders->AmountPaid],2) + '+
- '" on order #"+Str([Orders->OrderNo])+ " on " + '+
- 'DateToStr([Orders->SaleDate])+". Payment was by " + '+
- '[Orders->PaymentMethod]';
-
- CustExpr = 'Company + " is in " +City+" " +State+" "+Zip';
-
- OrderExpr = '"Customer #"+Str(CustNo)+" Owes $"+str(ItemsTotal-AmountPaid,2) + '+
- '" on Order # "+Str(OrderNo)';
-
-
- Function RemoveCRLF(const s : string):string;
- var a,b : string;
- begin
- SplitByDelim(s,#13#10,a, b);
- result := a + b;
- end;
-
-
- procedure TMainDemoFm.btnFunctionsClick(Sender: TObject);
- begin
- DisplayFunctionList;
- end;
-
- procedure TMainDemoFm.FormCreate(Sender: TObject);
- var proplist : TStringList;
- begin
- CustomerTable.Active := True; { Do this only on enter page 1 ?}
- OrdersTable.Active := True;
- {::::::}
- OrdersExpression.Database := OrdersTable.Database;
- OrdersExpression.Formula := DBExpr;
- { UpdateOrderCalc }
- RunBtn.Enabled := False;
- end;
-
-
-
- {/%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%}
- { Page 1 - Basic Demo }
- {::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::}
-
- procedure TMainDemoFm.CalcBtnClick(Sender: TObject);
- var s: String;
-
- Procedure DispError;
- begin
- ResultMemo.Text := SimpleExpression.StatusText;
- MessageBeep(MB_ICONHAND);
- end;
-
- begin
- s := ExpressionCombo.Text;
- if (s[1] = ';') OR (s = '') then exit; { ignore comments and blank lines }
- with simpleExpression do
- begin
- Formula := S;
- if Status = EXPR_SUCCESS then
- begin
- ResultMemo.Text := AsString;
- if Status = EXPR_SUCCESS then
- ExpressionCombo.Items.Add(s)
- else
- DispError;
- end
- else
- DispError;
- end;
- end;
-
-
- procedure TMainDemoFm.VariablesBtnClick(Sender: TObject);
- begin
- ManageVariables(SimpleExpression.Handle);
- end;
-
- procedure TMainDemoFm.ExpressionListboxDblClick(Sender: TObject);
- var s : string;
- begin
- with ExpressionListBox do
- if itemIndex > 0 then
- begin
- s := items[ItemIndex];
- if s[1] <> ';' then
- ExpressionCombo.Text := s;
- end;
- end;
-
-
-
- {* *}
- {* Page 2 - BDE Expression Demo *}
- {* Utilizes all the Data-Aware Types *}
- {* *}
-
- Procedure TMainDemoFm.UpdateCustomerGrid;
- begin
- CustomersFilter.Refresh;
- CustomerGrid.Invalidate;
- CustomerTable.First;
- end;
-
- Procedure TMainDemoFm.UpdateOrdersGrid;
- begin
- OrdersFilter.Refresh;
- OrdersGrid.Invalidate;
- OrdersTable.First;
- end;
-
- Procedure TMainDemoFm.UpdateOrderCalc;
- begin
- if (not Assigned(OrdersExpression)) or OrdersExpression.isNull then
- OrdersResultPanel.Caption := ''
- else
- OrdersResultPanel.Caption := ' > '+RemoveCRLF(OrdersExpression.AsString);
- end;
-
-
- procedure TMainDemoFm.btnOrdersFilterClick(Sender: TObject);
- begin
- if BuildDSExpression('Orders Filter Expression',[vtBoolean],
- OrdersFilter,OrdersTable) then
- UpdateOrdersGrid;
- end;
-
- procedure TMainDemoFm.FilterBtnClick(Sender: TObject);
- begin
- if BuildDSExpression('Customer Filter Expression',[vtBOOLEAN],
- CustomersFilter,CustomerTable) then
- UpdateCustomerGrid;
- end;
-
-
- procedure TMainDemoFm.cbxApplyCustomerFilterClick(Sender: TObject);
- begin
- CustomersFilter.Active := cbxApplyCustomerFilter.Checked;
- UpdateCustomerGrid;
- end;
-
- procedure TMainDemoFm.FormulaClick(Sender: TObject);
- begin
- OrdersExpression.Database := CustomerTable.Database;
- if BuildDBExpression('Database Expression Example',OrdersExpression) then
- UpdateOrderCalc;
- end;
-
- procedure TMainDemoFm.CustomerDataSourceDataChange(Sender: TObject;Field: TField);
- begin
- UpdateOrderCalc;
- end;
-
- procedure TMainDemoFm.OrdersDataSourceDataChange(Sender: TObject; Field: TField);
- begin
- UpdateOrderCalc;
- end;
-
- procedure TMainDemoFm.cbxApplyOrdersFilterClick(Sender: TObject);
- begin
- OrdersFilter.Active := cbxApplyOrdersFilter.Checked;
- UpdateOrdersGrid;
- end;
-
- {* *}
- {* ::: Graphing Demo :::: *}
- {* *}
- {* Demonstrates a typical use of FormulaBuilder *}
- {* *}
-
-
- Procedure DispError(const errstr : string);
- begin
- MessageDlg(ErrStr, mtError, [mbOK], 0);
- end;
-
-
- Function TMainDemoFm.CollectGraphOpts : Boolean;
- begin
- Result := False;
- try
- XMin := StrToFloat(XMinEdit.Text);
- XMax := StrToFloat(XMaxEdit.Text);
- NumPts := StrToInt(NumPtsEdit.Text);
- GraphFormula := FormulaEdit.Text;
- if (XMax < xMin) then
- DispError('Maximum less than minimum value')
- else
- if (numpts <= 2) then
- DispError('Number of points must be >= 2 ')
- else
- if GraphFormula = '' then
- DispError('Formula must be non blank')
- else
- result := true;
- Except
- DispError('Invalid numeric input ');
- Result := False;
- end;
- end; { CollectGraphData }
-
-
- Procedure TMainDemoFm.PlotGraph;
- var ydata : Double;
- xdelta : double;
- xdata : ^Double;
- ymax,Ymin : double;
- tmp : double;
- cnt : integer;
- ret : byte;
- GraphExpression : TExpression;
- Status : Integer;
-
- begin
- GraphExpression := TExpression.Create(NIL);
- TRY
- With GraphExpression do
- begin
- UseExceptions := True;
- TRY
- AddVariable('X',vtFLOAT);
- Formula := GraphFormula;
- ret := GraphExpression.ReturnType;
- if (ret <> vtFloat) then
- begin
- DispError('Floating point expression expected');
- GraphExpression.Free;
- exit;
- end;
- GetVarPtr('X',ret,pointer(XData));
- EXCEPT
- on EFBError do
- begin
- DispError(StatusText);
- GraphExpression.Free;
- exit;
- end;
- END;
- UseExceptions := False;
- end; {}
- xdelta := (xMax - xMin)/numpts;
- xmax := xmax + xdelta;
- tmp := xmin;
- xmin := xmin - xdelta;
- cnt := 0;
- With ChartFx1 do begin
- {* Hide the Graph while we draw *}
- visible := False;
- OpenData[COD_VALUES] := MAKELONG(1,NumPts);
- OpenData[COD_XVALUES] := MAKELONG(1,NumPts);
- Adm[CSA_XMIN]:= xmin;
- Adm[CSA_XMAX]:= xmax;
- thisSerie := 0;
- xdata^ := tmp;
- ymax := 5.0E-320; {}
- ymin := 1.7E+308; { Double }
-
- {* Populate the Graph *}
-
- while (xdata^ <= xMax) and (Cnt < NumPts) do
- begin
- ydata := GraphExpression.AsFloat;
- if yData > yMax then
- yMax := yData;
- if YData < yMin then
- YMin := yData;
- XValue[cnt] := xData^;
- Value[cnt] := yData;
- inc(Cnt);
- xdata^ := xData^ + xDelta;
- end;
-
- {* Set the Chart Titles *}
-
- Title[CHART_TOPTIT] := 'Graph Of : '+ GraphExpression.Formula;
- Title[CHART_BOTTOMTIT] := 'X Values';
- Title[CHART_LEFTTIT] := 'Y Values';
- Adm[CSA_MIN] := ymin;
- Adm[CSA_MAX] := yMax;
- CloseData[COD_VALUES] := 0;
- CloseData[COD_XVALUES] := 0;
-
- {* Show Graph Again *}
- Visible := True;
- end;
- FINALLY
- GraphExpression.Free;
- END;
- end; { PlotGraph }
-
-
-
- procedure TMainDemoFm.btnDrawGraphClick(Sender: TObject);
- begin
- if CollectGraphOpts then PlotGraph;
- end;
-
- {::::::::::::::::::}
- {* *}
- {* Extensibility Demo. Allows the user to Run the *}
- {* functions defined in the unit EXTFUNC.PAS *}
- {* *}
- Procedure TMainDemoFM.RunFunc;
- var s: String;
-
- Procedure DispError;
- begin
- RunMemo.Text := SimpleExpression.StatusText;
- MessageBeep(MB_ICONHAND);
- end;
-
- begin
- s := NewfuncsCombo.Text;
- if s <> '' then
- with simpleExpression do
- begin
- Formula := S;
- if Status = EXPR_SUCCESS then
- begin
- RunMemo.Text := AsString;
- if Status = EXPR_SUCCESS then
- newfuncsCombo.Items.Add(s)
- else
- DispError;
- end
- else
- DispError;
- end;
- end;
-
-
- procedure TMainDemoFm.RegisterFuncBtnClick(Sender: TObject);
- begin
- EXTFUNC.RegisterFunctions;
- newFuncsListBox.Enabled := true;
- RegisterFuncBtn.Enabled := False;
- RunBtn.Enabled := True;
- end;
-
- procedure TMainDemoFm.UnregisterBtnClick(Sender: TObject);
- begin
- EXTFUNC.UnRegisterFunctions;
- newFuncsListBox.Enabled := false;
- RegisterFuncBtn.Enabled := true;
- RunBtn.Enabled := false;
- end;
-
- procedure TMainDemoFm.RunBtnClick(Sender: TObject);
- begin
- runfunc;
- end;
-
- procedure TMainDemoFm.NewFuncsListboxClick(Sender: TObject);
- begin
- With NewFuncsListbox do
- NewFuncsCombo.Text := Items[ItemIndex];
- end;
-
- procedure TMainDemoFm.HelpBtnClick(Sender: TObject);
- begin
- DisplayHelp(Notebook.PageIndex);
- end;
-
- procedure TMainDemoFm.btnAboutClick(Sender: TObject);
- begin
- DisplayAbout;
- end;
-
- { RTTI Demo Page }
-
- Function RemoveSpaces(const s : String):string;
- var i : integer;
- begin
- result := '';
- for i := 1 to length(s) do begin
- if not(s[i] in [#32,#160]) then
- result := result + s[i];
- end;
- end;
-
-
-
- procedure TMainDemoFm.BitBtn1Click(Sender: TObject);
- begin
- if ShowDelayWarning = mrOk then
- ShowRTTIDemo;
- end;
-
- end.
-