全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:975
推到 Plurk!
推到 Facebook!

工程源码中的一段错误

答題得分者是:malanlk
ntjrr
高階會員


發表:240
回覆:312
積分:110
註冊:2005-04-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-09-04 07:48:33 IP:222.184.xxx.xxx 未訂閱
var    bConnectOk: Boolean; begin   Application.Initialize;   Application.CreateForm(TDataModuleform, DataModuleform);   Application.CreateForm(Tzjmform, zjmform);   Application.CreateForm(TLogoinForm, LogoinForm);   sqlsetupform := Tsqlsetupform.Create(Application);   try    if not sqlsetupform.CheckSetupDataOk then     begin     sqlsetupform.ShowModal;      bConnectOk := sqlsetupform.ConnectionTestOk;     end     else     begin     bconnectok:=true;     end;   finally     sqlsetupform.Free;    end;   if bConnectOk then   begin      Application.Run;   end; end. 有一个很小但也不容忽视的错误,在SQLSETUPFORM显示后,如果不做任何操作就关闭窗口(代码为:FConnectionTestOk := False;    close;)那么代码一步一步执行都不会有错误提示,只是到了上面代码中的最后一个end.后就跳出如图错误:     如果Application.Run后就不会有错,如果不能run而跳到end.后就出错。出错后还会引起系统死机,不断要求发送错误报告。
------
我的编程起步于ktop,我将永远支持ktop
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-09-04 11:38:27 IP:211.22.xxx.xxx 未訂閱
 .....
 if bConnectOk then
 begin
    Application.Run;
 end
 
 else 
 begin
    Application.Terminate; //加上這個敘述呢?
 end;
 
end.
---------------------------------------------- We will either find a way, or make one. -Hannibal -。
ntjrr
高階會員


發表:240
回覆:312
積分:110
註冊:2005-04-24

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-09-04 11:59:05 IP:222.184.xxx.xxx 未訂閱
引言:
 .....
 if bConnectOk then
 begin
    Application.Run;
 end
 
 else 
 begin
    Application.Terminate; //加上這個敘述呢?
 end;
 
end.
---------------------------------------------- We will either find a way, or make one. -Hannibal -。
前辈我也是这么想过的,试了一下,不知道什么原因Application.Terminate,这一行代码也会执行的,也不会错,跳到END后,再下一步就错了,但如果是从RUN跳到END后,再下一步就不会错。 (就说明end下一步应该不会有什么错,而是在这段代码本身有什么问题?) 發表人 - ntjrr 於 2005/09/04 12:02:20
------
我的编程起步于ktop,我将永远支持ktop
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-09-04 12:13:43 IP:61.219.xxx.xxx 未訂閱
if bConnectOk then
begin 
  Application.Run;
end
else
  DataModuleform.Free;
改成這樣看看. 應該是 ADO 物件釋放不同步造成的...這是我的推測, 主程式(Application)結束時, 對ADO 物件下達釋放令, 同時也結束自己, 而 ADO 釋放成功要回報給 Application 卻找不到 Application 了.... 所以加 DataModuleform.Free 先自行釋放, 再結束 Application.
ntjrr
高階會員


發表:240
回覆:312
積分:110
註冊:2005-04-24

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-09-04 12:23:23 IP:222.184.xxx.xxx 未訂閱
引言:
if bConnectOk then
begin 
  Application.Run;
end
else
  DataModuleform.Free;
改成這樣看看. 應該是 ADO 物件釋放不同步造成的...這是我的推測, 主程式(Application)結束時, 對ADO 物件下達釋放令, 同時也結束自己, 而 ADO 釋放成功要回報給 Application 卻找不到 Application 了.... 所以加 DataModuleform.Free 先自行釋放, 再結束 Application.
我匆忙试了一下好象也不行,我晚上再细测。
------
我的编程起步于ktop,我将永远支持ktop
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-09-04 12:30:24 IP:61.219.xxx.xxx 未訂閱
是不是還有其他 Form 也有放 ADO 物件, 沒有拿掉的...    
if bConnectOk then
begin 
  Application.Run;
end
else
begin
  LogoinForm.Free;
  zjmform.Free;
  DataModuleform.Free;
end;
ntjrr
高階會員


發表:240
回覆:312
積分:110
註冊:2005-04-24

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-09-04 17:27:35 IP:222.184.xxx.xxx 未訂閱
malanlk前辈,您的判断没错,我试用了如下方法,在开始自动创建几个窗口,在下面的ELSE中就FREE几个窗口,结果就没错误提示了。我的大部分窗口中都用了ADOTABLE或者ADOQUERY,那么我该如何处理合适呢?一个一个FREE? 前辈,对这个问题,我本来还有一个疑问:您有没有注意我有一次把您的代码搬动了位置,就是般到Application.Initialize; Application.CreateForm(TDataModuleform, DataModuleform); 下面就加sqlsetupform := Tsqlsetupform.Create(Application); if ..... 然后再create 其它FORM了,后来您又把这一段移动到了最下面,也就是RUN前,不知道那段判断的代码能不能放在上面的,那样的话其它窗口不CREAT,也就不用FREE了?
------
我的编程起步于ktop,我将永远支持ktop
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-09-04 20:02:36 IP:61.62.xxx.xxx 未訂閱
var 
  bConnectOk: Boolean;
  Label ForceStop;
begin
  Application.Initialize;
  Application.CreateForm(TDataModuleform, DataModuleform);
  sqlsetupform := Tsqlsetupform.Create(Application);
  try
    if not sqlsetupform.CheckSetupDataOk then
    begin
      sqlsetupform.ShowModal;
      bConnectOk := sqlsetupform.ConnectionTestOk;
    end
    else
    begin
      bconnectok:=true;
    end;
  finally
    sqlsetupform.Free; 
  end;
  if not bConnectOk then
  begin
    DataModuleform.Free;
    Goto ForceStop;
  end;
  Application.CreateForm(Tzjmform, zjmform);
  Application.CreateForm(TLogoinForm, LogoinForm);
  Application.Run;
ForceStop:
end.
當然可以啊, 我上面的寫法應該也可以... 發表人 - malanlk 於 2005/09/04 22:58:23
ntjrr
高階會員


發表:240
回覆:312
積分:110
註冊:2005-04-24

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-09-04 20:40:50 IP:222.184.xxx.xxx 未訂閱
ForceStop是什么意思,好象无法执行,要不要USE什么单元?
------
我的编程起步于ktop,我将永远支持ktop
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-09-04 21:14:07 IP:61.62.xxx.xxx 未訂閱
不用, 它只是一個 Label, 前面有個 Goto ForceStop; 表示跳過下面的程式碼到 標有 ForceStop 的地方開始再執行 "ForceStop" 是我隨便取的, 望文生義而已...
系統時間:2024-06-24 20:10:04
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!