2011-12-23 56 views
-2

我想将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 

当我把下面的代码到我的剧本,我拿不声明的变量错误(如我打电话这是不是我的脚本中声明的变量),但现实ISN “T。

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

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; 
+1

这将是有益的,如果你提供给我们的位置在减速done.Both了'全球variables'和'function' – Shirish11 2011-12-23 11:06:26

+0

同样,你需要阅读帕斯卡尔基础手册句法。你快到哪儿去了。变量具有范围,即意味着它们有效的地方,以及它们无效的地方。 'TSomething.MyClickyProcedure'是一个属于某个类的过程,可以访问该类中的字段。没有'TSomething.'的函数'Show'不能访问它们。 – 2011-12-23 13:57:19

+0

-1反复询问懒惰的问题。 – 2011-12-23 13:58:31

回答

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 a TForm2方法。也就是说,Show是名称的不好选择,因为它已经是TForm的一种方法。


我也猜到了在类型password但也许它需要AnsiString从类型转换,在MD5.Update通话推移判断。或者,也许Length应该是ByteLength。换句话说,我怀疑在MD5.Update这行中有一个错误,当你得到编译的代码时它会显示出来。

+0

你给我的代码已经在工作,我添加的第二个代码导致了我的问题。'_'感谢您的回复 – 2011-12-23 10:51:56

+1

@RafikBari如果您可以说明定义了“email”,“password”和“MD5”的位置,那么您的问题会更容易回答。我确信他们目前在错误的地方宣布,但此时我只能猜测你有什么错误。 – 2011-12-23 11:00:09

+0

单独第一段+1。另一个建议使用参数(如果SO会让我) – 2011-12-23 11:36:16

1

DelphiFunction不能没有返回类型。
尝试使其成为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; 
+1

这个答案有一些问题。如果这是答案,那么使代码成为'TForm1'的方法将'email'和'password'带入范围。这很好,但你不想写'Form1.'。你应该使用'Self.',这当然可以省略。 – 2011-12-23 11:04:57

+0

@DavidHeffernan是的,但他没有提到功能的位置。他有2个窗体Form1和Form2.But绝对不能把它作为一个函数。 – Shirish11 2011-12-23 11:09:25

+0

@David Heffernan:如果稍后修复了损坏的代码,评论将不同步。在这种情况下做什么? – menjaraz 2011-12-23 11:14:39