Вызывать внешние переменные внутри функции? - PullRequest
0 голосов
/ 23 декабря 2011

Я хочу обернуть код обработчика события 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 ]

5 голосов
/ 23 декабря 2011

Может показаться, что вы пытаетесь использовать глобальные переменные или переменные-члены во всем коде, где должны использоваться локальные переменные.Не делай этого.Это плохая практика, которая принесет вам огромное количество боли в будущем.Избавьтесь от этой дурной привычки, прежде чем неправильно писать слишком много кода.

Всегда используйте локальные переменные там, где это возможно.

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 голос
/ 23 декабря 2011

Function в 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...