在函数内调用外部变量?

时间:2011-12-23 10:46:55

标签: delphi variables global

我想将Button1Click事件处理程序的代码包装到名为Show()的函数中,以便以后重用它。

事件处理程序代码:

procedure TForm2.Button1Click(Sender: TObject);
begin
  email := Form1.ed_Email.Text;
  password := Form1.Ed_typedpass.Text;

  MD5 := GetMD5;
  MD5.Init;
  MD5.Update(TByteDynArray(RawByteString(password)), Length(password));

  password := LowerCase(MD5.AsString);

end

当我将下面的代码放入我的脚本时,我得到非声明的变量错误(因为我调用的是未在我的脚本中声明的变量)但实际情况并非如此。

所有变量在程序内部都能正常工作,但不能在函数内部工作吗?

function Show();
begin
  email := Form1.ed_Email.Text;
  password := Form1.Ed_typedpass.Text;

  MD5 := GetMD5;
  MD5.Init;
  MD5.Update(TByteDynArray(RawByteString(password)), Length(password));

  password := LowerCase(MD5.AsString);
end;

2 个答案:

答案 0 :(得分:5)

在整个代码中,您似乎试图使用全局变量或成员变量,而应使用局部变量。不要那样做。这是一种不好的做法,将来会给你带来巨大的痛苦。在以错误的方式编写太多代码之前,就要失去这种坏习惯。

始终在可能的地方使用局部变量。

procedure Show;
var
  email: string;
  password: string;
  MD5: TMD5;
begin
  email := Form1.ed_Email.Text;
  password := Form1.Ed_typedpass.Text;

  MD5 := GetMD5;
  MD5.Init;
  MD5.Update(TByteDynArray(RawByteString(password)), Length(password));
  password := LowerCase(MD5.AsString);
end;

我不得不猜测MD5的类型,但您可以用实际类型替换它。

如果确实需要使用成员,则将它们作为参数传递给方法,或者使该过程成为拥有成员的表单类的方法。

这些变量似乎可能是TForm2的成员,如果您真的需要它们成为TForm2的成员,那么您可能应该Show TForm2方法。也就是说,Show是一个糟糕的名称选择,因为它已经是TForm的一种方法。


我也猜到了password的类型,但也许需要AnsiString来判断MD5.Update调用中的类型转换。或者,Length可能应为ByteLength。换句话说,我怀疑你在MD5.Update行中有一个错误,一旦你得到编译代码就会显露出来。

答案 1 :(得分:1)

Function中的{p> Delphi不能没有返回类型 尝试将其变成Procedure 您还没有提到功能减速的基类 试试这个

Procedure TForm1.Show();//TForm2 based on your decelaration
begin

 email := Form1.ed_Email.Text;
 password := Form1.Ed_typedpass.Text;

 MD5 := GetMD5;
 MD5.Init;
 MD5.Update(TByteDynArray(RawByteString(password)), Length(password));
 password := LowerCase(MD5.AsString);
end;