Почемку не считается из формулы значение?

отредактировано 07:41 Раздел: FastScript
Берем стандартный пример
добавляем функцию которая вычисляется в скрипт демо.

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;
=====================================

Комментарии

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.