2011-12-29 69 views
-1

下面的代碼是寫在unit2(form2)中,它調用在電子郵件和密碼框(form1)中輸入的值,昨天代碼工作完美,我做了一些更改,現在:此代碼不起作用,當我按一下按鈕COMMENCER它會引發訪問衝突錯誤:影響變量值時訪問衝突?

procedure TForm2.Btn_commencerClick(Sender: TObject); 
    begin 

    email := form1.ed_Email.Text;// <----- LOOK HERE 
    password := form1.Ed_typedpass.Text; // <-----AND HERE 
    MD5 := GetMD5; 
    MD5.Init; 
    MD5.Update(TByteDynArray(RawByteString(password)), Length(password)); 
    password := LowerCase(MD5.AsString); 

    etc....... 

但此代碼的工作:

email := '[email protected]'; 
password := 'mypass'; 
MD5 := GetMD5; 
MD5.Init; 
etc etc...... 

問題:

爲什麼?

+0

訪問衝突在您的代碼中出現? – PresleyDias 2011-12-29 11:31:09

+0

在這一行:email:= form1.ed_Email.Text; 地址爲0067A868(讀取地址爲0000038C)的訪問衝突 – 2011-12-29 11:38:11

回答

3

你在哪裏創建你的form1對象?聽起來像它沒有初始化之前,你訪問它,因此你得到AV。

您的第二個代碼有效,因爲您在訪問或賦值給它們之前不必初始化字符串變量,而是直接分配它們,而不是通過form1變量。

但斷點到email := form1.ed_Email.Text;並看看如果form1是nil或不。

1

我認爲你必須創建在Form1(因爲我認爲它可利用的形式在您的情況)......你可能已經關閉並釋放形式的話,你的

email := form1.ed_Email.Text; 

是給AV,爲Form1不存在(因爲它現在釋放),所以你不能有ed_Email.Text值。

確保按Btn_commencer

1

如果表單已創建第一個以避免訪問衝突,您可以隨時檢查前你不關閉在Form1(釋放)。

if if assigned(Form1)then begin // assignments end;

+0

+1,這是一種檢查可用表單的好方法,如果它們是創建或不是。 @Rafik但請確保您使用的Form1變量是不是您的程序本地,但您的實際form1名稱(全球) – PresleyDias 2011-12-30 05:07:28