線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1394
推到 Plurk!
推到 Facebook!

Form 被 Free 後再 create , 原先的變數值還在 ??

尚未結案
bruce0211
版主


發表:157
回覆:668
積分:279
註冊:2002-06-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-12-03 14:23:17 IP:211.21.xxx.xxx 未訂閱
請問各位長官 若 Form1 動態 create Form2 , Form2 中的global i 將其值設定後 , 當 form2 被 free 再被 create , 原先的 i 值還存在 , 這算 bug 嗎 ? 若希望每次 form2 被 create 後所有的變數值都跟第一次 create 時一樣 有方法嗎 ? 雖然養成好習慣在 formcreate 時都去 initial global (例如每次 create 就設 i:=0), 但目前多支程式已寫好了, 往一個一個去 initial global 的方向可能 loading 太重了 謝謝
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-12-03 14:39:55 IP:61.222.xxx.xxx 未訂閱
global i I變數的宣告是放在 Form2 的 Public 還是在 implementation 之前。 若為後者,則不算為 BUG!
bruce0211
版主


發表:157
回覆:668
積分:279
註冊:2002-06-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-12-03 15:02:19 IP:211.21.xxx.xxx 未訂閱
不管是否為 bug , 我目前需要一快速的方法 , 讓 form2 每次 free 掉後再進來 , 全部的變數都是初始化狀態 , 謝謝
tonytop
中階會員


發表:6
回覆:114
積分:89
註冊:2003-12-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-12-03 15:35:57 IP:210.64.xxx.xxx 未訂閱
Try it. Form2.Show; Form2:=nil; //加這行 我正確的mail:h832214@hotmail.com
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-12-03 15:46:45 IP:61.222.xxx.xxx 未訂閱
我只能建議。 1. 沒有好的作法!請埋頭苦幹吧。 2. 由於您的global 變數在 implementation 之前宣告,為獨立的變數。 很難處理的。 比較好的作法: 將所有initial global 動作(含其他Form)寫在一個 Procedure 裡。 並在Form2 Free 之後,呼叫該Procedure 。{這也是沒有辦法的事}
bruce0211
版主


發表:157
回覆:668
積分:279
註冊:2002-06-13

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-12-03 17:18:32 IP:211.21.xxx.xxx 未訂閱
引言: 我只能建議。 1. 沒有好的作法!請埋頭苦幹吧。 2. 由於您的global 變數在 implementation 之前宣告,為獨立的變數。 很難處理的。 比較好的作法: 將所有initial global 動作(含其他Form)寫在一個 Procedure 裡。 並在Form2 Free 之後,呼叫該Procedure 。{這也是沒有辦法的事}
前面已說過,程式以超過百支,不可能一個一個去補上 initial 變數的動作,我在想是否有某個函式可以在 Form2.Free 後再徹底催毀 Form2 , 讓下次 Form2 被 create 時就像是第一次被 Create 時, 不會留下前一次的 global 值,待其他長官指點迷津了
fadichen
初階會員


發表:29
回覆:68
積分:29
註冊:2003-09-11

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-12-22 20:51:21 IP:61.230.xxx.xxx 未訂閱
你可以用initialization這個節區, 以下是delphi的help, 研究一下, 應該不難, 變數的初值可以在這個地方設定 The initialization section The initialization section is optional. It begins with the reserved word initialization and continues until the beginning of the finalization section or, if there is no finalization section, until the end of the unit. The initialization section contains statements that are executed, in the order in which they appear, on program start-up. So, for example, if you have defined data structures that need to be initialized, you can do this in the initialization section. For units in the interface uses list, the initialization sections of units used by a client are executed in the order in which the units appear in the client's uses clause. ****阿彌陀佛*****
elvis1000
一般會員


發表:6
回覆:50
積分:16
註冊:2004-12-18

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-12-23 03:43:18 IP:220.134.xxx.xxx 未訂閱
Form1以外的Form都獨立編譯成EXE檔,然後全部放到Form1,要執行在解出來,這樣就永遠跟新的一樣了! ----------------------- God bless you! I am Dark_Angel.
------
-----------------------
God bless you!
I am Dark_Angel.
kenspc
一般會員


發表:1
回覆:20
積分:4
註冊:2004-12-09

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-12-23 09:48:21 IP:61.6.xxx.xxx 未訂閱
不修改巳寫好的程式是沒辨法解決的吧 1. 如果global i 只是本unit使用而于, 不如把它移到implementation 之后. 2. 或者使用finalization (與之上的initialization略同)
arvin
一般會員


發表:12
回覆:9
積分:4
註冊:2002-09-11

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-12-23 10:36:29 IP:140.92.xxx.xxx 未訂閱
呵呵呵... 我試過了... 如果把變數放在implementation是值都會在... 而放在public裡...就可以了....
sryang
尊榮會員


發表:39
回覆:762
積分:920
註冊:2002-06-27

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-12-23 12:39:37 IP:211.20.xxx.xxx 未訂閱
引言: 你可以用initialization這個節區, 以下是delphi的help, 研究一下, 應該不難, 變數的初值可以在這個地方設定
unit 中 initialization 節區 和 finalization 節區的執行時機,跟 unit 中的 class Create 或 Free 一點關係也沒有 是 unit 載入記憶體,或從記憶體中移除時,才會執行 例如:用 LoadPackage 載入一個 package 時,所有包含在這個 package 中的 unit,若含有 initialization 節區的話,都會執行 反之,若用 UnloadPackage 把某個 package 從記憶體中移除時,則 finalization 區段會執行 要保持一個 class Create 出來之後的變數初值,在每次 Create 都一樣,只有在 constructor (Create) 中,或 constructor 會呼叫到的事件中做 而 TForm 的話,可以在 OnCreate 事件中作 加油喔,喵~ 發表人 - sryang 於 2004/12/23 12:43:24
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-12-23 16:51:00 IP:220.130.xxx.xxx 未訂閱
用繼承的方式看看...
     var //Global Variable//
  A: Integer;
  B: Integer;
  C: Integer;
type      TBaseForm = class(TForm)
  public
    constructor Create(AOwner: TComponent); override;
  end;      TForm1 = class(TBaseForm)
  public
  end;      TForm2 = class(TBaseForm)
  public
  end;    implementation    constructor TBaseForm.Create(AOwner: TComponent);
begin
  inherited;
  A := 1;
  B := 2;
  C := 3;
end;    
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-12-23 17:02:50 IP:220.130.xxx.xxx 未訂閱
步驟補充:
(1)先備分你的專案.
(2)開一個unit,將TBaseForm及Global變數宣告於此並實作.       constructor TBaseForm.Create(AOwner: TComponent);
   begin
      inherited;
        Initial_All_Global_Variables;
   end;    (3)Ctrl-F -> Find in Files-> Key=class(TForm)    (4)你可以直接將相關的Form改為自TBaseForm繼承.    
報告完畢< >< >
系統時間:2024-05-21 20:23:20
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!