2011-12-23 2 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 «т.

Все переменные работают правильно внутри процедур, но не внутри функций?

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

+0

Опять же, вам необходимо прочитать основной учебник по паскаль синтаксис. Вы не идете туда-сюда быстро. Переменные имеют область действия, что означает, что они действительны, и указывает, что они недействительны. 'TSomething.MyClickyProcedure' - это процедура, принадлежащая классу, и доступ к полям этого класса. Функция 'Show' без' TSomething.' в ней не может получить к ним доступ. –

+0

-1 для повторного запроса ленивых вопросов. –

ответ

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, то вы, вероятно, следует сделать ShowTForm2 метод. Тем не менее, Show - это плохой выбор имени, поскольку он уже является методом TForm.


я догадывался типа для password, но, возможно, она должна быть AnsiString судя по типу литья, что происходит в MD5.Update вызова. Или, возможно, Length должно быть ByteLength. Другими словами, я подозреваю, что у вас есть ошибка в строке MD5.Update, которая откроется, как только вы получите код для компиляции.

+0

Код, который вы мне дали, уже работает, второй код, который я добавил, который вызывает у меня проблему.'_' Спасибо за ответ –

+1

@RafikBari Ваш вопрос будет легче ответить, если вы можете указать, где определены 'email',' password' и 'MD5'. Я совершенно уверен, что они объявлены в неподходящем месте на данный момент, но на данный момент я могу только догадываться о том, что вы ошибаетесь. –

+0

+1 для первого абзаца. Еще один вопрос о том, чтобы использовать параметры (если бы это позволяло мне) –

1

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

Этот ответ имеет некоторые проблемы. Если это ответ, то создание кода будет методом 'TForm1', привносящим« email »и« password »в область видимости. Все в порядке, но вы не хотите писать 'Form1'. Вместо этого вы должны использовать 'Self.', который, конечно, может быть опущен. –

+0

@ Давид Хеффернан да, но он не упомянул, где находится функция. И у него есть 2 формы Form1 и Form2.Но определенно u не может иметь его как функцию. – Shirish11

+0

@David Heffernan: Если сломанный код исправлен позже, комментарий будет не синхронизирован. Что делать в этом случае? – menjaraz

Смежные вопросы