如何在delphi中将变量解释为函数/命令?

时间:2015-11-13 15:51:24

标签: delphi

我试图将变量解释为命令。 所以

procedure TForm1.Button1Click(Sender: TObject);
begin  
  opp := 'add' ;    
end;

procedure TForm1.Button2Click(Sender : TObject);
begin
  opp := 'sub'
end           

procedure TForm1.Button3Click(Sender : TObject);
var
  op1, op2: Integer;
begin
  op1 := 1;        
  op2 := 1;
  Edit1.Text := FloatToStr(opp(op1,op2));
end;

3 个答案:

答案 0 :(得分:2)

您可以为函数指定一个变量,以获得与您想要实现的类似的东西。

有关程序类型的详情 here

type
  TForm1 = class(TForm)
  . . .
  private
    FOpp: function (AOp1, AOp2: Integer): Double;
  . . .
  end;

implementation

function OpAddFunction(AOp1, AOp2: Integer): Double;
begin
  Result := AOp1 + AOp2;
end;

function OpSubFunction(AOp1, AOp2: Integer): Double;
begin
  Result := AOp1 - AOp2;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  FOpp := OpAddFunction;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  FOpp := OpSubFunction;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  op1, op2: Integer;
begin
  if not Assigned(FOpp) then
    Exit;
  op1 := 1;
  op2 := 2;
  Edit1.Text := FloatToStr(FOpp(op1, op2));
end;

end.

答案 1 :(得分:1)

Delphi不是脚本语言,所有内容都被编译。

要将字符串解释为delphi指令,您需要一个脚本解析器,例如DWScript

答案 2 :(得分:0)

我假设您从Button1Click和Button2Click处理程序的内容中询问如何根据操作名称的文本操作调用算术运算。所以我有点困惑,你已经接受了一个没有解决这个问题的答案,但无论如何。

正如另一个答案告诉你的那样,Delphi是一个编译器,而不是脚本解释器本身,但它们有很多Delphi实现,而DWScript是一个特别精细而强大的例子。

这个答案的重点是根据操作名称的文本操作调用算术运算。当然,这只是通用脚本解释器(或者实际上是一个更简单的表达式求值程序)所做的一小部分,但知道如何通过文本名称自己进行这种调用是有用的,而不需要整个级联“如果OpName ='xxx'那么......其他如果......”陈述。

在下面的代码中,TMethodWrapper类用于存储对特定整数操作的引用(为简单起见,我忽略了Float / Double结果)并将操作应用于调用的参数I1& I2。算术评估在其ApplyOperator方法中完成。

然后使用TStringList,“OpList”作为“字典”来存储包装器和操作名称。 Button1Click处理程序查找Edit1.Text中指定的操作并将其应用于操作的参数。

我编写了这个简单的实现,以便它可以在D7中运行。显然,对于最近的Delphi版本中的泛型工具,将所涉及的原理应用于除Integer之外的数据类型会更容易,并且您可以使用RTTI来添加函数及其名称,而不是我在FormCreate中如何完成它。他们还有像TDictionary这样的对象,你可以在TStringList的步伐中使用

type

  TIntegerOperation = function(Int1, Int2 : Integer) : Integer of object;

  TMethodWrapper = Class
  private
    FOperation : TIntegerOperation;
  public
    constructor Create(AnOperation : TIntegerOperation);
    function GetValue(I1, I2 : Integer) : Integer;
    property Operation : TIntegerOperation read FOperation write FOperation;
  end;

  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    OpList : TStringList;
    function Add(I1, I2 : Integer): Integer;
    function Subtract(I1, I2 : Integer): Integer;
    procedure ApplyOperator(OpName: String; I1, I2 : Integer);
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

function TForm1.Add(I1, I2 : Integer) : Integer;
begin
  Result := I1 + I2;
end;

function TForm1.Subtract(I1, I2 : Integer) : Integer;
begin
  Result := I1 - I2;
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  OpList := TStringList.Create;

  OpList.AddObject('Add', TMethodWrapper.Create(Add));

  OpList.AddObject('Subtract', TMethodWrapper.Create(Subtract));

end;

constructor TMethodWrapper.Create(AnOperation: TIntegerOperation);
begin
  inherited Create;
  Operation := AnOperation;
end;

function TMethodWrapper.GetValue(I1, I2 : Integer): Integer;
var
  IntegerOperation : TIntegerOperation;
begin
  IntegerOperation := TIntegerOperation(Operation);
  Result := IntegerOperation(I1, I2);
end;

procedure TForm1.ApplyOperator(OpName : String; I1, I2 : Integer);
var
  Index : Integer;
  Res : Integer;
  MW : TMethodWrapper;
begin
  Index := OpList.IndexOf(OpName);
  if Index < 0 then Exit;
  MW := TMethodWrapper(OpList.Objects[Index]);
  Res := MW.GetValue(I1, I2);
  Caption := IntToStr(Res);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ApplyOperator(Edit1.Text, 3, 5);
end;