You've already forked lazarus-ccr
303 lines
8.3 KiB
ObjectPascal
303 lines
8.3 KiB
ObjectPascal
![]() |
unit EquationUnit;
|
||
|
|
||
|
{$mode objfpc}{$H+}
|
||
|
|
||
|
interface
|
||
|
|
||
|
uses
|
||
|
Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
|
||
|
StdCtrls, ExtCtrls, Math,
|
||
|
MainUnit, Globals, OutputUnit, DataProcs, DictionaryUnit;
|
||
|
|
||
|
type
|
||
|
|
||
|
{ TEquationForm }
|
||
|
|
||
|
TEquationForm = class(TForm)
|
||
|
Bevel1: TBevel;
|
||
|
FinishedBtn: TButton;
|
||
|
Memo1: TLabel;
|
||
|
NextBtn: TButton;
|
||
|
Panel1: TPanel;
|
||
|
Panel2: TPanel;
|
||
|
ResetBtn: TButton;
|
||
|
CancelBtn: TButton;
|
||
|
ComputeBtn: TButton;
|
||
|
ReturnBnt: TButton;
|
||
|
VarCombo: TComboBox;
|
||
|
FunctionCombo: TComboBox;
|
||
|
OpsCombo: TComboBox;
|
||
|
VarEdit: TEdit;
|
||
|
FuncEdit: TEdit;
|
||
|
OpEdit: TEdit;
|
||
|
Label2: TLabel;
|
||
|
NewVarEdit: TEdit;
|
||
|
Label1: TLabel;
|
||
|
procedure CancelBtnClick(Sender: TObject);
|
||
|
procedure ComputeBtnClick(Sender: TObject);
|
||
|
procedure FinishedBtnClick(Sender: TObject);
|
||
|
procedure FormCreate(Sender: TObject);
|
||
|
procedure FunctionComboClick(Sender: TObject);
|
||
|
procedure FunctionComboSelect(Sender: TObject);
|
||
|
procedure NextBtnClick(Sender: TObject);
|
||
|
procedure OpsComboClick(Sender: TObject);
|
||
|
procedure OpsComboSelect(Sender: TObject);
|
||
|
procedure ResetBtnClick(Sender: TObject);
|
||
|
procedure ReturnBntClick(Sender: TObject);
|
||
|
procedure VarComboClick(Sender: TObject);
|
||
|
procedure VarComboSelect(Sender: TObject);
|
||
|
private
|
||
|
{ private declarations }
|
||
|
operations, functions, variables : StrDyneVec;
|
||
|
NoEntries : integer;
|
||
|
selected : IntDyneVec;
|
||
|
public
|
||
|
{ public declarations }
|
||
|
end;
|
||
|
|
||
|
var
|
||
|
EquationForm: TEquationForm;
|
||
|
|
||
|
implementation
|
||
|
|
||
|
{ TEquationForm }
|
||
|
|
||
|
procedure TEquationForm.ResetBtnClick(Sender: TObject);
|
||
|
VAR i : integer;
|
||
|
begin
|
||
|
NewVarEdit.Text := '';
|
||
|
OpEdit.Text := '';
|
||
|
FuncEdit.Text := '';
|
||
|
VarEdit.Text := '';
|
||
|
OpsCombo.Text := 'Operations';
|
||
|
FunctionCombo.Text := 'Functions';
|
||
|
VarCombo.Clear;
|
||
|
for i := 1 to NoVariables do
|
||
|
VarCombo.Items.Add(OS3MainFrm.DataGrid.Cells[i,0]);
|
||
|
VarCombo.Text := 'Variables';
|
||
|
VarCombo.DropDownCount := NoVariables;
|
||
|
SetLength(operations,NoVariables);
|
||
|
SetLength(functions,NoVariables);
|
||
|
SetLength(variables,NoVariables);
|
||
|
NoEntries := 0;
|
||
|
end;
|
||
|
|
||
|
procedure TEquationForm.ReturnBntClick(Sender: TObject);
|
||
|
begin
|
||
|
variables := nil;
|
||
|
functions := nil;
|
||
|
operations := nil;
|
||
|
end;
|
||
|
|
||
|
procedure TEquationForm.VarComboClick(Sender: TObject);
|
||
|
VAR index : integer;
|
||
|
begin
|
||
|
index := VarCombo.ItemIndex;
|
||
|
if index < 0 then exit;
|
||
|
VarEdit.Text := VarCombo.Items.Strings[index];
|
||
|
VarCombo.ItemIndex := -1;
|
||
|
end;
|
||
|
|
||
|
procedure TEquationForm.VarComboSelect(Sender: TObject);
|
||
|
VAR index : integer;
|
||
|
begin
|
||
|
index := VarCombo.ItemIndex;
|
||
|
if index < 0 then exit;
|
||
|
VarEdit.Text := VarCombo.Items.Strings[index];
|
||
|
VarCombo.ItemIndex := -1;
|
||
|
end;
|
||
|
|
||
|
procedure TEquationForm.NextBtnClick(Sender: TObject);
|
||
|
begin
|
||
|
operations[NoEntries] := OpEdit.Text;
|
||
|
if ((NoEntries > 0) and (operations[NoEntries] = '') )then
|
||
|
begin
|
||
|
ShowMessage('ERROR-No operation selected - enter again!');
|
||
|
exit;
|
||
|
end;
|
||
|
functions[NoEntries] := FuncEdit.Text;
|
||
|
variables[NoEntries] := VarEdit.Text;
|
||
|
if (variables[NoEntries] = '') then
|
||
|
begin
|
||
|
ShowMessage('ERROR-No variable entered - enter again!');
|
||
|
exit;
|
||
|
end;
|
||
|
NoEntries := NoEntries + 1;
|
||
|
OpEdit.Text := '';
|
||
|
FuncEdit.Text := '';
|
||
|
VarEdit.Text := '';
|
||
|
OpsCombo.Text := 'Operations';
|
||
|
FunctionCombo.Text := 'Functions';
|
||
|
VarCombo.Text := 'Variables';
|
||
|
end;
|
||
|
|
||
|
procedure TEquationForm.OpsComboClick(Sender: TObject);
|
||
|
VAR index : integer;
|
||
|
begin
|
||
|
index := OpsCombo.ItemIndex;
|
||
|
if index < 0 then exit;
|
||
|
OpEdit.Text := OpsCombo.Items.Strings[index];
|
||
|
OpsCombo.ItemIndex := -1;
|
||
|
end;
|
||
|
|
||
|
procedure TEquationForm.OpsComboSelect(Sender: TObject);
|
||
|
VAR index : integer;
|
||
|
begin
|
||
|
index := OpsCombo.ItemIndex;
|
||
|
if index < 0 then exit;
|
||
|
OpEdit.Text := OpsCombo.Items.Strings[index];
|
||
|
OpsCombo.ItemIndex := -1;
|
||
|
end;
|
||
|
|
||
|
procedure TEquationForm.FinishedBtnClick(Sender: TObject);
|
||
|
begin
|
||
|
operations[NoEntries] := OpEdit.Text;
|
||
|
if ((NoEntries > 0) and (operations[NoEntries] = '')) then
|
||
|
begin
|
||
|
ShowMessage('ERROR-No operation selected - enter again!');
|
||
|
exit;
|
||
|
end;
|
||
|
functions[NoEntries] := FuncEdit.Text;
|
||
|
variables[NoEntries] := VarEdit.Text;
|
||
|
if (variables[NoEntries] = '') then
|
||
|
begin
|
||
|
ShowMessage('ERROR-No variable entered - enter again!');
|
||
|
exit;
|
||
|
end;
|
||
|
NoEntries := NoEntries + 1;
|
||
|
OpsCombo.Text := 'Operations';
|
||
|
FunctionCombo.Text := 'Functions';
|
||
|
VarCombo.Text := 'Variables';
|
||
|
end;
|
||
|
|
||
|
procedure TEquationForm.FormCreate(Sender: TObject);
|
||
|
begin
|
||
|
Assert(OS3MainFrm <> nil);
|
||
|
if OutputFrm = nil then
|
||
|
Application.CreateForm(TOutputFrm, OutputFrm);
|
||
|
if DictionaryFrm = nil then
|
||
|
Application.CreateForm(TDictionaryFrm, DictionaryFrm);
|
||
|
end;
|
||
|
|
||
|
procedure TEquationForm.FunctionComboClick(Sender: TObject);
|
||
|
VAR index : integer;
|
||
|
begin
|
||
|
index := FunctionCombo.ItemIndex;
|
||
|
if index < 0 then exit;
|
||
|
FuncEdit.Text := FunctionCombo.Items.Strings[index];
|
||
|
FunctionCombo.ItemIndex := -1;
|
||
|
end;
|
||
|
|
||
|
procedure TEquationForm.FunctionComboSelect(Sender: TObject);
|
||
|
VAR index : integer;
|
||
|
begin
|
||
|
index := FunctionCombo.ItemIndex;
|
||
|
if index < 0 then exit;
|
||
|
FuncEdit.Text := FunctionCombo.Items.Strings[index];
|
||
|
FunctionCombo.ItemIndex := -1;
|
||
|
end;
|
||
|
|
||
|
procedure TEquationForm.ComputeBtnClick(Sender: TObject);
|
||
|
VAR
|
||
|
cellstring, outline : string;
|
||
|
opsitem, funcsitem, col, newcol, i, j, k : integer;
|
||
|
newvalue, xvalue : double;
|
||
|
begin
|
||
|
// get position of selected variables from the main grid
|
||
|
SetLength(selected,NoEntries);
|
||
|
for i := 1 to NoVariables do
|
||
|
begin
|
||
|
cellstring := Trim(OS3MainFrm.DataGrid.Cells[i,0]);
|
||
|
for j := 0 to NoEntries - 1 do
|
||
|
if (cellstring = variables[j]) then selected[j] := i;
|
||
|
end;
|
||
|
|
||
|
// create a new variable in the main grid
|
||
|
col := NoVariables + 1;
|
||
|
newcol := col;
|
||
|
DictionaryFrm.NewVar(col);
|
||
|
OS3MainFrm.DataGrid.Cells[col,0] := NewVarEdit.Text;
|
||
|
DictionaryFrm.DictGrid.Cells[1,col] := NewVarEdit.Text;
|
||
|
|
||
|
// for each subject obtain selected variable values and add to newvalue
|
||
|
for i := 1 to NoCases do // subject loop
|
||
|
begin
|
||
|
newvalue := 0.0;
|
||
|
for j := 0 to NoEntries - 1 do // list loop
|
||
|
begin
|
||
|
col := selected[j];
|
||
|
xvalue := StrToFloat(Trim(OS3MainFrm.DataGrid.Cells[col,i]));
|
||
|
if (functions[j] <> '') then // do the function
|
||
|
begin
|
||
|
for k := 0 to 11 do // get function number
|
||
|
begin
|
||
|
if (functions[j] = FunctionCombo.Items.Strings[k]) then funcsitem := k;
|
||
|
end;
|
||
|
case (funcsitem) of
|
||
|
0: xvalue *= xvalue;
|
||
|
1: xvalue := sqrt(xvalue);
|
||
|
2: xvalue := sin(xvalue);
|
||
|
3: xvalue := cos(xvalue);
|
||
|
4: xvalue := tan(xvalue);
|
||
|
5: xvalue := arcsin(xvalue);
|
||
|
6: xvalue := arccos(xvalue);
|
||
|
7: xvalue := arctan(xvalue);
|
||
|
8: xvalue := log10(xvalue);
|
||
|
9: xvalue := ln(xvalue);
|
||
|
10: xvalue := exp(xvalue);
|
||
|
11: xvalue := 1.0 / xvalue;
|
||
|
end;
|
||
|
end; // end if function
|
||
|
if (operations[j] = '') then newvalue := newvalue + xvalue
|
||
|
else // find operation
|
||
|
begin
|
||
|
for k := 0 to 3 do
|
||
|
begin
|
||
|
if (operations[j] = OpsCombo.Items.Strings[k]) then opsitem := k;
|
||
|
end;
|
||
|
case (opsitem) of
|
||
|
0: newvalue += xvalue;
|
||
|
1: newvalue -= xvalue;
|
||
|
2: newvalue *= xvalue;
|
||
|
3: newvalue /= xvalue;
|
||
|
end;
|
||
|
end; // end else
|
||
|
end; // end jth variable
|
||
|
OS3MainFrm.DataGrid.Cells[newcol,i] := floattostr(newvalue);
|
||
|
FormatCell(newcol,i);
|
||
|
end; // next subject
|
||
|
|
||
|
OutputFrm.RichEdit.Clear;
|
||
|
OutputFrm.RichEdit.Lines.Add('Equation Used for the New Variable');
|
||
|
OutputFrm.RichEdit.Lines.Add('');
|
||
|
outline := NewVarEdit.Text;
|
||
|
outline := outline +' = ';
|
||
|
for j := 0 to NoEntries - 1 do
|
||
|
begin
|
||
|
outline := outline + functions[j];
|
||
|
outline := outline + ' ';
|
||
|
outline := outline + variables[j];
|
||
|
outline := outline + ' ';
|
||
|
if (j < NoEntries-1) then
|
||
|
begin
|
||
|
outline := outline + operations[j+1];
|
||
|
outline := outline + ' ';
|
||
|
end;
|
||
|
end;
|
||
|
OutputFrm.RichEdit.Lines.Add(outline);
|
||
|
OutputFrm.ShowModal;
|
||
|
end;
|
||
|
|
||
|
procedure TEquationForm.CancelBtnClick(Sender: TObject);
|
||
|
begin
|
||
|
variables := nil;
|
||
|
functions := nil;
|
||
|
operations := nil;
|
||
|
end;
|
||
|
|
||
|
initialization
|
||
|
{$I equationunit.lrs}
|
||
|
|
||
|
end.
|
||
|
|