我试图将变量解释为命令。 所以
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;
答案 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;