unit Parser;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Parser8, Buttons, DBTables, DB, Grids, DBGrids,
ExtCtrls, THFormula, DBCtrls;
Type
TForm1 = class(TForm)
Formula1: TTHFormula;
DataSource1: TDataSource;
DBNavigator1: TDBNavigator;
DBGrid1: TDBGrid;
Table1: TTable;
Table1PartNo: TFloatField; Table1VendorNo: TFloatField;
Table1Description: TStringField; Table1OnHand: TFloatField;
Table1OnOrder: TFloatField; Table1Cost: TCurrencyField;
Table1ListPrice: TCurrencyField;
sbEval: TSpeedButton;
eResult: TEdit; eErrors: TEdit; eResultType: TEdit; eEntry: TComboBox;
Panel1: TPanel; Panel2: TPanel;
Label1: TLabel;
Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel;
Label6: TLabel; Label7: TLabel; Label8: TLabel; Label9: TLabel;
Label10: TLabel; Label11: TLabel; Label12: TLabel; Label13: TLabel;
Label14: TLabel; Label15: TLabel; Label16: TLabel; Label17: TLabel;
Label18: TLabel; Label19: TLabel; Label20: TLabel; Label21: TLabel;
GroupBox1: TGroupBox; GroupBox2: TGroupBox; GroupBox3: TGroupBox;
procedure sbEvalClick (Sender: TObject);
procedure eEntryKeyPress (Sender: TObject; var Key: Char);
procedure Formula1Error (Sender: TObject);
procedure FormCreate (Sender: TObject);
procedure Formula1Change (Sender: TObject);
procedure Formula1Zero (Sender: TObject);
procedure Formula1Plus (Sender: TObject);
procedure Formula1Minus (Sender: TObject);
procedure Formula1True (Sender: TObject);
procedure Formula1False (Sender: TObject);
procedure Formula1String (Sender: TObject);
procedure Formula1Boolean(Sender: TObject);
procedure Formula1Integer(Sender: TObject);
procedure Formula1Float (Sender: TObject);
procedure FormShow (Sender: TObject);
private
public
end;
var Form1: TForm1;
implementation
{$R *.DFM}
//-----------------------------------------------------------------------------
const YN:array[boolean] of string=('No ','Yes');
// Define a new function returning a TOperand and
// using as an argument array a TStringList
function YesNo(Args: TStringList):TOperand;
begin
if Args.Count<>1 then
raise SyntaxError.Create('Yes/No takes only one argument');
result:=TOperand.CreateStr(YN[TOperand(Args.Objects[0]).AsBoolean]);
TOperand(Args.Objects[0]).Free;
end;
//-----------------------------------------------------------------------------
procedure TForm1.FormCreate(Sender: TObject);
begin
// Embbed the above function in THFormula with a name to use in expressions
Formula1.AddFunction('YesNo',@YesNo);
// Add a new symbol - Profit in the Symbol Table combining
// two fields existing in the data source
Formula1.SymbolTable.Add('Profit=[ListPrice]-[Cost]');
end;
// Rest of the code links the THFormula component in the form from the
// previous page
procedure TForm1.eEntryKeyPress(Sender: TObject; var Key: Char);
begin
if Key=^m then sbEvalClick(Sender);
end;
procedure TForm1.sbEvalClick(Sender: TObject);
begin
sbEval.Enabled:=false;
Application.ProcessMessages;
Formula1.Formula:=eEntry.Text;
end;
procedure TForm1.Formula1Error(Sender: TObject);
begin
eErrors.Color:=clRed;
eErrors.Text:=Formula1.ErrorMsg;
sbEval.Enabled:=true;
end;
procedure TForm1.Formula1Change(Sender: TObject);
begin
eErrors.Color:=clNavy;
eErrors.Text:='';
eResult.text:=Formula1.AsString;
sbEval.Enabled:=true;
end;
procedure TForm1.Formula1Zero(Sender: TObject);
begin
eResult.Font.Color:=clBlack;
end;
procedure TForm1.Formula1Plus(Sender: TObject);
begin
eResult.Font.Color:=clGreen;
end;
procedure TForm1.Formula1Minus(Sender: TObject);
begin
eResult.Font.Color:=clRed;
end;
procedure TForm1.Formula1True(Sender: TObject);
begin
eResult.Font.Color:=clNavy;
end;
procedure TForm1.Formula1False(Sender: TObject);
begin
eResult.Font.Color:=clOlive;
end;
procedure TForm1.Formula1String(Sender: TObject);
begin
eResultType.Text:='S';
eResult.Font.Color:=clBlack;
end;
procedure TForm1.Formula1Boolean(Sender: TObject);
begin
eResultType.Text:='B';
end;
procedure TForm1.Formula1Integer(Sender: TObject);
begin
eResultType.Text:='I';
end;
procedure TForm1.Formula1Float(Sender: TObject);
begin
eResultType.Text:='F';
end;
procedure TForm1.FormShow(Sender: TObject);
begin
Formula1Change(Sender);
end;
end.
|
|
Horia Tudosie Computer Consulting horiatu@pathcom.com Go to my Home Page |