在函数内调用外部变量?

Raf*_*ari -2 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
Run Code Online (Sandbox Code Playgroud)

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

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

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;
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 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;
Run Code Online (Sandbox Code Playgroud)

我不得不猜测它的类型,MD5但你可以用实际的类型代替它.

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

这些变量似乎很可能是成员,TForm2如果你真的需要它们成为TForm2当时的成员,你可能应该制作Show一个TForm2方法.也就是说,这Show是一个糟糕的名称选择,因为它已经是一种方法TForm.


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