on new record error |
答題得分者是:Justmade
|
QOO10
初階會員 發表:59 回覆:89 積分:29 註冊:2002-12-25 發送簡訊給我 |
請教各位: 下列兩段程式中為何第二段程式再第二次執行出現
'Access violation at address 0055f478 in...'
但是加了 dmSLS_DeliverOrder 就 ok !!
單此欄位本來在 dmSLS_DeliverOrder 內ㄚ怪怪,且
第一次 run 沒問題??謝謝!! ps.第二此執行使指,在 mainfrom 第二次 create procedure TdmSLS_DeliverOrder.dtDellistNewRecord(DataSet: TDataSet);
begin
inherited; dataset.fieldbyname'DEL_SER').value:=dmSLS_DeliverOrder.dtDeliverDEL_NO.value;
end; procedure TdmSLS_DeliverOrder.dtDellistNewRecord(DataSet: TDataSet);
begin
inherited;
dataset.fieldbyname('DEL_SER').value:=dtDeliverDEL_NO.value;
end;
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
出現 Access violation , 絕大部份的原因是你呼叫沒建立或已釋放的一個物件。 雖然我不知道為甚麼會第二次 create mainform,但我相信你是在 MainForm 裡 create TdmSLS_DeliverOrder 的,而你兩次 create mainform, 就 create 了 兩個 TdmSLS_DeliverOrder 的 instance 了。 你的兩個例子顯示,在你第二次執行時,由第二個 mainform create 及使用的 TdmSLS_DeliverOrder instance 裡 dtDeliverDEL_NO 未被建立起來。 那為何加上 dmSLS_DeliverOrder 就可以呢? 因為 由第一個 MainForm 建立的TdmSLS_DeliverOrder instance (dmSLS_DeliverOrder) 還存在, 你加上了 dmSLS_DeliverOrder 就即是到第一個 Mainform 建立的 dm 去拿 dtDeliverDEL_NO.value 這個資料而用在 第二個 mainform 建立的 dm 裡。 這些主要是按你寫上有限的資料作估計,要更多的資料才可能更精確的分析。
|
QOO10
初階會員 發表:59 回覆:89 積分:29 註冊:2002-12-25 發送簡訊給我 |
引言: 出現 Access violation , 絕大部份的原因是你呼叫沒建立或已釋放的一個物件。 雖然我不知道為甚麼會第二次 create mainform,但我相信你是在 MainForm 裡 create TdmSLS_DeliverOrder 的,而你兩次 create mainform, 就 create 了 兩個 TdmSLS_DeliverOrder 的 instance 了。 你的兩個例子顯示,在你第二次執行時,由第二個 mainform create 及使用的 TdmSLS_DeliverOrder instance 裡 dtDeliverDEL_NO 未被建立起來。 那為何加上 dmSLS_DeliverOrder 就可以呢? 因為 由第一個 MainForm 建立的TdmSLS_DeliverOrder instance (dmSLS_DeliverOrder) 還存在, 你加上了 dmSLS_DeliverOrder 就即是到第一個 Mainform 建立的 dm 去拿 dtDeliverDEL_NO.value 這個資料而用在 第二個 mainform 建立的 dm 裡。 這些主要是按你寫上有限的資料作估計,要更多的資料才可能更精確的分析。謝謝您的回答,可能是我描述不清楚所以您可能誤會了我再詳細描述一下: 我有一個 mainform 與 DeliverOrderform 及 dmSLS_DeliverOrder (DataModule) MainFrom 利用如下程式 call DeliverOrderFrom try DeliverOrderform := TDeliverOrderform.create(nil); DeliverOrderform.showmodal; finally freeandnil(DeliverOrderForm); end; . . 然在 DeliverOrderForm OnCreate Events create DataModule dmSLS_DeliverOrder:=tdmSLS_DeliverOrder.create(self) 使用 self 所以理當 DeliverOrderForm 在 MainForm Freeandnil( deliverOrderForm) 也 free dmSls_DeliverOrder 了但我的 mainform 第二次呼叫 deliverOrderForm 出現錯誤?? 我使用了教簡易的程式如上方式!!測都 ok 但為獨在專案內不行,應 專案是公司的我不能整個 post 上來請前輩幫我想想方式來 debug!! 感績不盡!! |
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
引言: 使用 self 所以理當 DeliverOrderForm 在 MainForm Freeandnil( deliverOrderForm) 也 free dmSls_DeliverOrder 了你最好再看看 FreeAndNil 的 Help。我從沒使用這功能但我看 help 後不認為他會自動為你 Free dmSls_DeliverOrder。 引言: 我使用了教簡易的程式如上方式!!測都 ok 但為獨在專案內不行,應 專案是公司的我不能整個 post 上來請前輩幫我想想方式來 debug!! 感績不盡!!使用較簡易的程式如上方式沒問題,但在那專案不行,即是問題不是完全出現在這部份。既然我們沒能看到問題在那裡,也很難直接準確地指出問題所在及解決方法。 重申一下你提的資料出現了甚麼可調查的方向。 procedure TdmSLS_DeliverOrder.dtDellistNewRecord(DataSet: TDataSet); begin inherited; dataset.fieldbyname'DEL_SER').value:=dmSLS_DeliverOrder.dtDeliverDEL_NO.value; end; procedure TdmSLS_DeliverOrder.dtDellistNewRecord(DataSet: TDataSet); begin inherited; dataset.fieldbyname('DEL_SER').value:=dtDeliverDEL_NO.value; end; 第二次執行時第一版本可行但第二個不行,很明顯地顯示那個時侯有兩個 TdmSLS_DeliverOrder 的 instance 存在,而執行中的那個絕不是叫做 dmSLS_DeliverOrder ,因為若執行中的 instance 叫做 dmSLS_DeliverOrder 的話,這兩個版本便完全相同了。而第一個版本沒問題亦證明了當時確實有一個名字叫 dmSLS_DeliverOrder 的 instance 存在,只是不是正在執行的那個 instance 罷了。 建議你在 DeliverOrderForm onClose 時手動 free 了 dmSLS_DeliverOrder試試看。 |
QOO10
初階會員 發表:59 回覆:89 積分:29 註冊:2002-12-25 發送簡訊給我 |
引言:謝謝您我試試 用手動 free !!引言: 使用 self 所以理當 DeliverOrderForm 在 MainForm Freeandnil( deliverOrderForm) 也 free dmSls_DeliverOrder 了你最好再看看 FreeAndNil 的 Help。我從沒使用這功能但我看 help 後不認為他會自動為你 Free dmSls_DeliverOrder。引言: 我使用了教簡易的程式如上方式!!測都 ok 但為獨在專案內不行,應 專案是公司的我不能整個 post 上來請前輩幫我想想方式來 debug!! 感績不盡!!使用較簡易的程式如上方式沒問題,但在那專案不行,即是問題不是完全出現在這部份。既然我們沒能看到問題在那裡,也很難直接準確地指出問題所在及解決方法。 重申一下你提的資料出現了甚麼可調查的方向。 procedure TdmSLS_DeliverOrder.dtDellistNewRecord(DataSet: TDataSet); begin inherited; dataset.fieldbyname'DEL_SER').value:=dmSLS_DeliverOrder.dtDeliverDEL_NO.value; end; procedure TdmSLS_DeliverOrder.dtDellistNewRecord(DataSet: TDataSet); begin inherited; dataset.fieldbyname('DEL_SER').value:=dtDeliverDEL_NO.value; end; 第二次執行時第一版本可行但第二個不行,很明顯地顯示那個時侯有兩個 TdmSLS_DeliverOrder 的 instance 存在,而執行中的那個絕不是叫做 dmSLS_DeliverOrder ,因為若執行中的 instance 叫做 dmSLS_DeliverOrder 的話,這兩個版本便完全相同了。而第一個版本沒問題亦證明了當時確實有一個名字叫 dmSLS_DeliverOrder 的 instance 存在,只是不是正在執行的那個 instance 罷了。 建議你在 DeliverOrderForm onClose 時手動 free 了 dmSLS_DeliverOrder試試看。 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |