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

close 與 close() 的差別

尚未結案
jacky_5678
一般會員


發表:5
回覆:14
積分:3
註冊:2004-04-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-06-08 16:03:45 IP:211.21.xxx.xxx 未訂閱
各位大大你們好 請問一下 我們再寫程式的時候 有時會用close; 有時候會用 close(); 可否請問一下兩者有何差別ㄋ? 因為現在我有一個問題就是,不曉得什麼樣的狀況之下會close 不成功, 之前有查詢了一下,還是不太明瞭,煩請各位大大為我解惑一下     ===== 永遠都是初學者 =====
supman
尊榮會員


發表:29
回覆:770
積分:924
註冊:2002-04-22

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-06-08 16:29:02 IP:61.70.xxx.xxx 未訂閱
您好: close()跟close一樣阿. procedure test(); begin end; test; test(); 結果一樣,除非是procedure有傳參數. 可以把您的code貼上來讓大家看一下問題出在哪.
jacky_5678
一般會員


發表:5
回覆:14
積分:3
註冊:2004-04-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-06-08 17:23:22 IP:211.21.xxx.xxx 未訂閱
這是我的close code ,不曉得哪裡會出錯..造成 close 不起來
procedure TFrmTest.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 
  // 清除預覽的印表機屬性
  QRPreview.QRPrinter.ClosePreview(Self);  
  QRPreview.QRPrinter := nil;
  
  // 關閉視窗時, 自動從記憶體中移除程式.
  Action := caFree;
end;    
發表人 - jacky_5678 於 2005/06/08 17:31:39
supman
尊榮會員


發表:29
回覆:770
積分:924
註冊:2002-04-22

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-06-08 18:52:49 IP:61.70.xxx.xxx 未訂閱
您好: ClosePreview()的原型是ClosePreview(Control:TWinControl)所以當然要傳參數進入. 如果像From.Close他的原型是procedure Close;所以你可用Form.Close;跟Form.Close()都一樣. 至於您提到的 QRPreview.QRPrinter.ClosePreview(Self); 為何會有錯誤訊息,我找了一些資料提到只要將Form給Close掉就可以了,並不需要自己去Close. 另外如果要把您那段改成正常,參考下面,但我並不能夠很確定是否沒有問題. procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); var AQRPrinter:TQRPrinter; begin AQRPrinter:=TQRPrinter.Create(); QRPreview1.QRPrinter:=AQRPrinter; QRPreview1.QRPrinter.ClosePreview(Self); QRPreview1.QRPrinter:=nil; Action := caFree; end; 參考資料: http://www.mail-archive.com/delphi@delphi.org.nz/msg11387.html http://www.mail-archive.com/delphi@itb.ac.id/msg03431.html
jacky_5678
一般會員


發表:5
回覆:14
積分:3
註冊:2004-04-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-06-09 10:58:45 IP:211.21.xxx.xxx 未訂閱
你好:   我想我在敘述一下我的問題一下,可能敘述的不是很清楚,如下    
procedure TFrmTest.Button1Click(Sender: TObject);
begin
  close();
end;    procedure TFrmTest.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 
  // 清除預覽的印表機屬性
  QRPreview.QRPrinter.ClosePreview(Self);  
  QRPreview.QRPrinter := nil;
  
  // 關閉視窗時, 自動從記憶體中移除程式.
  Action := caFree;
end;    出現錯誤訊息如下
Exception:
-----------------------------------------------------------------------------------------------------
  2.1 Date   : Wed, 1 Jun 2005 09:54:55  0800
  2.2 Address: 0082BF00
  2.3 Module : qrpt70.bpl
  2.4 Type   : EAccessViolation
  2.5 Message: Access violation at address 0082BF00 in module 'qrpt70.bpl'. Read of address 00000044.    Call Stack Information:
-----------------------------------------------------------------------------------
|Address |Module      |Unit           |Class         |Procedure/Method       |Line|
-----------------------------------------------------------------------------------
|0082BF00|qrpt70.bpl  |Qrprntr.pas    |TQRPrinter    |ClosePreview           |    |
|0082BEFC|qrpt70.bpl  |Qrprntr.pas    |TQRPrinter    |ClosePreview           |    |
|00716B49|SCking70.bpl|FrmTest.pas|TFrmTest|FormClose              |265 |        
===== 永遠都是初學者 =====
supman
尊榮會員


發表:29
回覆:770
積分:924
註冊:2002-04-22

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-06-09 11:25:02 IP:61.70.xxx.xxx 未訂閱
我知道會出現錯誤訊息,上面也寫了,所以? 你也講一下我上面寫的是否是可行的方式吧?
jacky_5678
一般會員


發表:5
回覆:14
積分:3
註冊:2004-04-21

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-06-09 11:52:39 IP:211.21.xxx.xxx 未訂閱
你好:
  你寫的方式,應該是不可行的,因為我的QRPreview 是本身已經
拉到畫面上的元件,所以應該不需要再Create ,
現在的問題是,我不知道會有什麼樣的情況,會使得
  QRPreview.QRPrinter.ClosePreview(Self);  
  QRPreview.QRPrinter := nil;
這兩行會有錯誤,我有點懷疑,是不是 QRPreview 還在作動作,可能印表中,
可能還在產生報表中,但是這兩個判斷我已經有做了,
還是還有其他狀況我沒有判斷到的所導致....
< > ===== 永遠都是初學者 ===== < > 發表人 - jacky_5678 於 2005/06/09 11:55:52
supman
尊榮會員


發表:29
回覆:770
積分:924
註冊:2002-04-22

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-06-09 13:22:04 IP:61.70.xxx.xxx 未訂閱
我知道你的QRPreview是一個可視元件,不用去Create,但我的Create是QRPrinter耶,不曉得你有沒有仔細看. 請你把他改成像我下面這樣試試.    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); var AQRPrinter:TQRPrinter; begin AQRPrinter:=TQRPrinter.Create(); QRPreview1.QRPrinter:=AQRPrinter; QRPreview1.QRPrinter.ClosePreview(Self); QRPreview1.QRPrinter:=nil; Action := caFree; end;    你所提的: >這兩行會有錯誤,我有點懷疑,是不是 QRPreview 還在作動作,可能印表中, >可能還在產生報表中,但是這兩個判斷我已經有做了, 我測試不是這個狀況,你可以測試一下,只要很單純的使用QRPreview,然後使用你的方式去Close他就會出現錯誤訊息了.    根據我查資料你要使用ClosePreview必須要去設定他的QRPrint才行,我猜測是ClosePreview他必須要去釋放QRPrint,而如果沒有去指定他的 QRPreview1.QRPrinter:=AQRPrinter; 則ClosePreview在釋放時便會產生錯誤訊息.    你可在測以下的方式. procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); var AQRPrinter:TQRPrinter; begin AQRPrinter:=TQRPrinter.Create(); QRPreview1.QRPrinter:=AQRPrinter; QRPreview1.QRPrinter.ClosePreview(Self); AQRPrinter.Free();//你單步追蹤這裡將出現錯誤訊息,原因是他已經被ClosePreview釋放了 Action := caFree; end; 最後我詢問有使用QRPreview相關經驗的朋友,據他們表示,把Form關掉就可以了,無須自己去釋放.
jacky_5678
一般會員


發表:5
回覆:14
積分:3
註冊:2004-04-21

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-06-09 15:10:16 IP:211.21.xxx.xxx 未訂閱
supman 你好: 我剛有用你的去測試一下,果然都會當機,哪可否再請教一下, 據你所說,我應該每次跑都會出現錯誤訊息才對,怎會是偶發的ㄋ 煩請你再指教一下,萬分感激....    也謝謝你為我解惑,因為我是維護別人的程式,有很多不明瞭的地方, 非常感激你,謝謝    < >===== 永遠都是初學者 =====< >
supman
尊榮會員


發表:29
回覆:770
積分:924
註冊:2002-04-22

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-06-09 16:16:42 IP:203.204.xxx.xxx 未訂閱
你測試我的應該是每次都會出現錯誤訊息吧,那代表你的程式裡面應該有去指定QRPrint,但我不知道你那邊程式怎麼寫的,所以只能看你自己去找了. 維護別人的程式你要知道別人的架構是怎麼寫的,了解每一段程式的意義,不然單看一個地方是找不出問題的.
jacky_5678
一般會員


發表:5
回覆:14
積分:3
註冊:2004-04-21

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-06-09 16:56:57 IP:211.21.xxx.xxx 未訂閱
supman 你好:   我大概知道問題點了,謝謝你的解答,萬分感激.......    < >===== 永遠都是初學者 =====< >
系統時間:2024-04-25 15:55:46
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!