請教密碼輸入後出現Access Violation 無法呼叫主程式 |
答題得分者是:P.D.
|
K1086
初階會員 發表:63 回覆:148 積分:42 註冊:2007-04-09 發送簡訊給我 |
[code delphi] procedure THnk_PassKey_Fm1.SpeedButton1Click(Sender: TObject); var work_send:string; work_exec:pchar; SQL:string; begin SQL:='SELECT * FROM PASSWD WHERE '; SQL:=SQL ' PGNAME=''BEHI'' AND '; SQL:=SQL ' PGPASS=''' EDIT1.TEXT ''' '; QUERY1.Close; QUERY1.SQL.CLEAR; QUERY1.SQL.ADD(SQL); QUERY1.Open; IF QUERY1.RecordCount =0 THEN RxGIF_2.Visible := true ELSE BEGIN SpeedButton1.Visible := true; RxGIF_2.Visible := false; work_send:=''; work_send:=('Hnk_Man_Dp_01.exe'); work_exec:=pchar(work_send); winexec(work_exec,SW_SHOWNORMAL); Hnk_PassKey_Fm1.Hide; Hnk_PassKey_Fm1.Show; Hnk_PassKey_Fm1.Close; end; end; procedure THnk_PassKey_Fm1.Edit1KeyPress(Sender: TObject; var Key: Char); var work_send:string; work_exec:pchar; begin if key = #13 then begin SpeedButton1.OnClick(Sender); end; end; procedure THnk_PassKey_Fm1.FormActivate(Sender: TObject); begin RxGIF_2.Visible := false; SpeedButton1.Visible := false; end; end. [/code] ====>>問題是當輸入正確密碼之後 出現下列錯誤訊息 請問個位大大 是小弟的密碼資料有問題還是程式錯誤? 謝謝! Project Hnk_PassKey_Dp.exe raised exception class EAccessViolation with Message 'Access Violation at address 00000000. Read of address 00000000'. |
mephise
高階會員 發表:4 回覆:149 積分:205 註冊:2004-02-09 發送簡訊給我 |
|
ac910127
一般會員 發表:7 回覆:27 積分:11 註冊:2009-11-06 發送簡訊給我 |
您好
請問你確定錯誤發生在這部分程式嘛 ?? 小弟愚昧,看了一下並且模擬了一下您的 程式碼,並不會發生錯誤。 是否自行再逐步DEBUG看看錯誤發生點 !! 另外小弟用的是Delphi2010,winexec是第一個 參數是用"PAnsiChar" !! 不知大大的版本為何 ?? PS: TO: Mephise 大大 "forbidden" 一詞應該是網頁造成的, 有前輩教導可利用"引述回覆" 即可看到原始內文。
編輯記錄
ac910127 重新編輯於 2011-02-17 02:46:29, 註解 無‧
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
SpeedButton1.forbidden(Sender)
有可能是Ktop系統把 onclick給轉換了, 這是常有的事 我的做法, 我會把 SpeedButton1Click下的事件程式寫成一支function 或 procedure, 再來call它 如下 private procedure myspeedBtnclick; ..... implementation procedure THnk_PassKey_Fm1.myspeedBtnclick; var work_send:string; work_exec:pchar; SQL:string; begin SQL:='SELECT * FROM PASSWD WHERE '; SQL:=SQL ' PGNAME=''BEHI'' AND '; SQL:=SQL ' PGPASS=''' EDIT1.TEXT ''' '; QUERY1.Close; QUERY1.SQL.CLEAR; QUERY1.SQL.ADD(SQL); QUERY1.Open; IF QUERY1.RecordCount =0 THEN RxGIF_2.Visible := true ELSE BEGIN SpeedButton1.Visible := true; RxGIF_2.Visible := false; work_send:=''; work_send:=('Hnk_Man_Dp_01.exe'); work_exec:=pchar(work_send); winexec(work_exec,SW_SHOWNORMAL); Hnk_PassKey_Fm1.Hide; Hnk_PassKey_Fm1.Show; Hnk_PassKey_Fm1.Close; end; end; procedure THnk_PassKey_Fm1.SpeedButton1Click(Sender: TObject); begin Hnk_PassKey_Fm1.myspeedBtnclick; end; procedure THnk_PassKey_Fm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin if Key=#13 then Hnk_PassKey_Fm1.myspeedBtnclick end; 或許是你的SpeedButton有問題, 或者是其內引用的變數有未被宣告, 以上的寫法不代表原來你的寫法是錯的, 只是比較具有結構化, 因為有時候你直接去呼叫另一組Delphi創建物件的事件時, 會有先後順序的問題, 如果順序不對, 很可能就會造成後呼叫者先run, 而前者卻未被創建出來的問題, 你引發的問題, 正是呼叫的事件引用到不存在變數或被釋放的物件所導致的 另外, 建議你先檢查SpeedButton中所有的自定變數宣告是否存在 ===================引 用 mephise 文 章=================== 小弟資質愚魯, 怎麼查也查不出來 Delphi 有 forbidden 這個 method, 莫不成是自訂的嗎? 如果是的話, 問題一定出在這行 SpeedButton1.forbidden(Sender); var work_send:string; |
mephise
高階會員 發表:4 回覆:149 積分:205 註冊:2004-02-09 發送簡訊給我 |
糗大了,原來是網頁造成了forbidden這個詞
但是答案還是不變, 問題就是出在speedbutton這行, 因為錯誤是在按下 Enter 的時候發出的, 所以問題一定在這 從以前到現在, 只要我遇到 Access Violation at address 00000000 的錯誤 千篇一律都是物件沒有實體, 但是卻引用了所造成的 比如說, SpeedButton1.OnClick 會呼叫出一個Form, 但是那個Form卻不是 AutoCreate, 而且此時並沒有被建立 這在 Compile時期不會有問題, 但是執行時期就會出現 Access Violation at address 00000000 我建議在 SpeedButton1 的 OnClick 中每一行都設立 BreakPoint 然後一行一行執行 這樣就會比較容易抓出問題了
------
Mephise Chen 前興德工程師 |
K1086
初階會員 發表:63 回覆:148 積分:42 註冊:2007-04-09 發送簡訊給我 |
===================引 用 P.D. 文 章=================== SpeedButton1.forbidden(Sender) 有可能是Ktop系統把 onclick給轉換了, 這是常有的事 我的做法, 我會把 SpeedButton1Click下的事件程式寫成一支function 或 procedure, 再來call它 如下 private? ??? procedure myspeedBtnclick; ..... implementation procedure THnk_PassKey_Fm1.myspeedBtnclick; var?? work_send:string;?? ??? work_exec:pchar;?? ??? SQL:string;?? begin? ? SQL:='SELECT * FROM PASSWD WHERE ';?? ? SQL:=SQL ' PGNAME=''BEHI'' AND ';?? ? SQL:=SQL ' PGPASS=''' EDIT1.TEXT ''' ';?? ? QUERY1.Close;?? ? QUERY1.SQL.CLEAR;?? ? QUERY1.SQL.ADD(SQL);?? ? QUERY1.Open;?? ? IF QUERY1.RecordCount =0 THEN?? ? RxGIF_2.Visible := true? ? ELSE?? ??? BEGIN?? ? SpeedButton1.Visible := true;?? ? RxGIF_2.Visible := false;?? ? work_send:='';?? ? work_send:=('Hnk_Man_Dp_01.exe');?? ? work_exec:=pchar(work_send);?? ? winexec(work_exec,SW_SHOWNORMAL);?? ? Hnk_PassKey_Fm1.Hide;?? ? Hnk_PassKey_Fm1.Show;?? ? Hnk_PassKey_Fm1.Close;?? ??? end;?? end;?? procedure THnk_PassKey_Fm1.SpeedButton1Click(Sender: TObject);?? begin ??? Hnk_PassKey_Fm1.myspeedBtnclick; end; procedure?THnk_PassKey_Fm1.Edit1KeyPress(Sender:?TObject;?var?Key:?Char);? begin ?? if Key=#13 then Hnk_PassKey_Fm1.myspeedBtnclick end; 或許是你的SpeedButton有問題, 或者是其內引用的變數有未被宣告, 以上的寫法不代表原來你的寫法是錯的, 只是比較具有結構化, 因為有時候你直接去呼叫另一組Delphi創建物件的事件時, 會有先後順序的問題, 如果順序不對, 很可能就會造成後呼叫者先run, 而前者卻未被創建出來的問題, 你引發的問題, 正是呼叫的事件引用到不存在變數或被釋放的物件所導致的 另外, 建議你先檢查SpeedButton中所有的自定變數宣告是否存在 ===================引 用 mephise 文 章=================== 小弟資質愚魯, 怎麼查也查不出來 Delphi 有 forbidden 這個 method, 莫不成是自訂的嗎? 如果是的話, 問題一定出在這行 SpeedButton1.forbidden(Sender); var???work_send:string;??? ===>>感謝 Mephise 及 ac910127 二位前輩熱誠分析指導, 問題好像如 PD 版主說的 [呼叫者先run, 而前者卻未被創建出來的問題] 小弟把SpeedButton 刪掉 重新加入 然後再測試,居然就不再出現錯誤,請問這是物件問題嗎? |
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |