Почемку не считается из формулы значение?
Берем стандартный пример
добавляем функцию которая вычисляется в скрипт демо.
Var Q23 :Extended = 180;
Function __aa__ :Extended;
begin
result := (-0.0000796032* sin(Q23) + 0.0229054687*Q23 + 4.3681821721);
end;
begin
ShowMessage(__aa__);
ShowMessage(F_GetFormulaLess1('',0));
end.
Добавим файл
с описанием вызова новой функции F_GetFormulaLess1
=====================================
unit Unit3;
interface
uses SysUtils, Classes, fs_iinterpreter, fs_itools, Math ,frxClass ,frxVariables
, MaskUtils, Variants, Windows, ComObj , forms
;
type
TEleFunctions1 = class(TfsRTTIModule)
private
FNameGrp: String;
function CallMethod(Instance: TObject; ClassType: TClass;
const MethodName: String; Caller: TfsMethodHelper): Variant;
function F_GetFormulaLess1(pName: String; pValue1:extended):extended;
public
constructor Create(AScript: TfsScript); override;
end;
implementation
uses Unit_Dm;
function TEleFunctions1.CallMethod(Instance: TObject; ClassType: TClass;
const MethodName: String; Caller: TfsMethodHelper): Variant;
Var p1,p2:Extended;
begin
if MethodName = 'F_GETFORMULALESS1' then
begin
Result := F_GetFormulaLess1(Caller.Params[0], Caller.Params[1]) ;
end
end;
constructor TEleFunctions1.Create(AScript: TfsScript);
begin
inherited Create(AScript);
FNameGrp := '╘юЁьєы√';
with AScript do
begin
AddMethod('function F_GetFormulaLess1(pName: String; pValue1:extended):extended', CallMethod, FNameGrp);
end;
end;
function TEleFunctions1.F_GetFormulaLess1(pName: String; pValue1: extended): extended;
var iFormulaID:Integer;
sFrormula: WideString;
begin
result := DataModule4.FormulaCalc(
'Var Q22 :Extended = 180;'
+'Function __XXX__ :Extended;'
+'begin'
+' result := (-0.0000796032* sin(Q22) + 0.0229054687*Q22 + 4.3681821721);'
+'end;'
+'begin end.'
);
end;
initialization
fsRTTIModules.Add(TEleFunctions1);
end.
=====================================
Добавим обработку в дата модуле
=====================================
unit Unit_Dm;
interface
uses
SysUtils, Classes, fs_iTools , fs_iinterpreter, fs_ipascal , Variants, Dialogs;
type
TDataModule4 = class(TDataModule)
private
{ Private declarations }
public
function FormulaCalc(pFunction: string): Extended;
end;
var
DataModule4: TDataModule4;
implementation
uses Unit1;
{$R *.dfm}
{ TDataModule4 }
function TDataModule4.FormulaCalc(pFunction: string): Extended;
var
s:string;
res :Variant;
FStmp : TfsScript;
begin
res := Null; result :=0;
FStmp := TfsScript.Create(nil);
try
FStmp.AddRTTI;
FStmp.Parent := fsGlobalUnit;
// FStmp.Parent := form1.fsScript1;
FStmp.Lines.Text := pFunction;
if NOT FStmp.Compile then
ShowMessage(s+ ' '+FStmp.ErrorMsg + ' at ' + FStmp.ErrorPos);
if FStmp.ErrorMsg = '' then
begin
Res := FStmp.CallFunction('__XXX__', VarArrayOf([]));
if Res <> Null then
result := Res;
end
finally
FStmp.Free;
end;
end;
end.
=====================================
В чем разница в вычисление функции?
почему возвращается последнее число из строки фукции - 4.3681821721
а не сам результат
=====================================
'Var Q22 :Extended = 180;'
+'Function __XXX__ :Extended;'
+'begin'
+' result := (-0.0000796032* sin(Q22) + 0.0229054687*Q22 + 4.3681821721);'
+'end;'
+'begin end.'
);
=====================================
Var Q23 :Extended = 180;
Function __aa__ :Extended;
begin
result := (-0.0000796032* sin(Q23) + 0.0229054687*Q23 + 4.3681821721);
end;
=====================================
добавляем функцию которая вычисляется в скрипт демо.
Var Q23 :Extended = 180;
Function __aa__ :Extended;
begin
result := (-0.0000796032* sin(Q23) + 0.0229054687*Q23 + 4.3681821721);
end;
begin
ShowMessage(__aa__);
ShowMessage(F_GetFormulaLess1('',0));
end.
Добавим файл
с описанием вызова новой функции F_GetFormulaLess1
=====================================
unit Unit3;
interface
uses SysUtils, Classes, fs_iinterpreter, fs_itools, Math ,frxClass ,frxVariables
, MaskUtils, Variants, Windows, ComObj , forms
;
type
TEleFunctions1 = class(TfsRTTIModule)
private
FNameGrp: String;
function CallMethod(Instance: TObject; ClassType: TClass;
const MethodName: String; Caller: TfsMethodHelper): Variant;
function F_GetFormulaLess1(pName: String; pValue1:extended):extended;
public
constructor Create(AScript: TfsScript); override;
end;
implementation
uses Unit_Dm;
function TEleFunctions1.CallMethod(Instance: TObject; ClassType: TClass;
const MethodName: String; Caller: TfsMethodHelper): Variant;
Var p1,p2:Extended;
begin
if MethodName = 'F_GETFORMULALESS1' then
begin
Result := F_GetFormulaLess1(Caller.Params[0], Caller.Params[1]) ;
end
end;
constructor TEleFunctions1.Create(AScript: TfsScript);
begin
inherited Create(AScript);
FNameGrp := '╘юЁьєы√';
with AScript do
begin
AddMethod('function F_GetFormulaLess1(pName: String; pValue1:extended):extended', CallMethod, FNameGrp);
end;
end;
function TEleFunctions1.F_GetFormulaLess1(pName: String; pValue1: extended): extended;
var iFormulaID:Integer;
sFrormula: WideString;
begin
result := DataModule4.FormulaCalc(
'Var Q22 :Extended = 180;'
+'Function __XXX__ :Extended;'
+'begin'
+' result := (-0.0000796032* sin(Q22) + 0.0229054687*Q22 + 4.3681821721);'
+'end;'
+'begin end.'
);
end;
initialization
fsRTTIModules.Add(TEleFunctions1);
end.
=====================================
Добавим обработку в дата модуле
=====================================
unit Unit_Dm;
interface
uses
SysUtils, Classes, fs_iTools , fs_iinterpreter, fs_ipascal , Variants, Dialogs;
type
TDataModule4 = class(TDataModule)
private
{ Private declarations }
public
function FormulaCalc(pFunction: string): Extended;
end;
var
DataModule4: TDataModule4;
implementation
uses Unit1;
{$R *.dfm}
{ TDataModule4 }
function TDataModule4.FormulaCalc(pFunction: string): Extended;
var
s:string;
res :Variant;
FStmp : TfsScript;
begin
res := Null; result :=0;
FStmp := TfsScript.Create(nil);
try
FStmp.AddRTTI;
FStmp.Parent := fsGlobalUnit;
// FStmp.Parent := form1.fsScript1;
FStmp.Lines.Text := pFunction;
if NOT FStmp.Compile then
ShowMessage(s+ ' '+FStmp.ErrorMsg + ' at ' + FStmp.ErrorPos);
if FStmp.ErrorMsg = '' then
begin
Res := FStmp.CallFunction('__XXX__', VarArrayOf([]));
if Res <> Null then
result := Res;
end
finally
FStmp.Free;
end;
end;
end.
=====================================
В чем разница в вычисление функции?
почему возвращается последнее число из строки фукции - 4.3681821721
а не сам результат
=====================================
'Var Q22 :Extended = 180;'
+'Function __XXX__ :Extended;'
+'begin'
+' result := (-0.0000796032* sin(Q22) + 0.0229054687*Q22 + 4.3681821721);'
+'end;'
+'begin end.'
);
=====================================
Var Q23 :Extended = 180;
Function __aa__ :Extended;
begin
result := (-0.0000796032* sin(Q23) + 0.0229054687*Q23 + 4.3681821721);
end;
=====================================
Комментарии
http://fast-report.com/ru/forum/index.php?showtopic=5358
Прикрепленные файлы
test_function.rar ( 6.96 килобайт )