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

多個動態視窗的值回傳

答題得分者是:aftcast
ken0127
一般會員


發表:3
回覆:9
積分:7
註冊:2009-09-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-09-28 14:17:19 IP:211.74.xxx.xxx 訂閱
大家好
我現在寫了一個程式
有三個Form,分別是Form1、Form2、Form3
Form2是由Form1動態產生,Form3則是由Form2動態產生
我現在將值從Form2寫回Form1都沒問題
我是直接用Form1->.....這種方法寫的

但現在遇到問題是從Form3將資料寫回Form2時
則是在執行程式時會出現Access violation at address 0040396B in module 'Project1.exe'.Read of address 000002F0

我也有將Form3 include Form2的.h檔
想問大家這樣的問題該怎麼解決

站上有小小爬過文…也許是不知道該怎麼打關鍵字
剛學BCB,關念還不是很懂
請站上各位大大多多指教
aftcast
站務副站長


發表:81
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-10-02 21:30:00 IP:61.219.xxx.xxx 訂閱
都沒人回…實在是因為1/你講的有一點點的不清楚2/解答有點難說的很清楚…幾天前我就看了,但有點…懶…

原因應該是出在: 「動態產生」造成的。

因為TForm1(注意我特別強調的是有T,所以是類別)是自動被建的,所以Form1這個預設的變數就被賦與一個物件。當你在Form2使用Form1-> 時,一切正常。因為Form1是真的有被創出來的實體。然而Form2呢? 有被賦與物件嗎? 很難說,不知你程式是怎寫的…因為它是動態產生的。你有可能如下而產生
TForm2 *Form2= new TForm2(this); // a種方式
或者你把form2的unit include進來然後
Form2 = new TForm2(this); //這樣的話Form2就是真的有物件,看清楚最前面是Form2 = 而不是 TForm2 *Form2 = (意義很不同) //b種方式

如果你用的是a種方式,那就會出現你說的錯誤! 因為…你new出來的Form2不是全域變數(因為new的時候是處於某方法裡)。那為何b種可以? 因為TForm2.h這個檔有宣告Form2是全域的變數。

所有的問題都根源於 你要了解什麼是 全域變數 ,什麼是區域變數,又當二個地方都有名稱一樣的變數時,會發生什麼事…


===================引 用 ken0127 文 章===================
大家好
我現在寫了一個程式
有三個Form,分別是Form1、Form2、Form3
Form2是由Form1動態產生,Form3則是由Form2動態產生
我現在將值從Form2寫回Form1都沒問題
我是直接用Form1->.....這種方法寫的

但現在遇到問題是從Form3將資料寫回Form2時
則是在執行程式時會出現Access violation at address 0040396B in module 'Project1.exe'.Read of address 000002F0

我也有將Form3 include Form2的.h檔
想問大家這樣的問題該怎麼解決

站上有小小爬過文…也許是不知道該怎麼打關鍵字
剛學BCB,關念還不是很懂
請站上各位大大多多指教
------



蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
ken0127
一般會員


發表:3
回覆:9
積分:7
註冊:2009-09-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-10-03 13:29:26 IP:203.67.xxx.xxx 訂閱
感謝aftcast大大的回覆,解答了我的疑惑
原來是因為我沒有將form2宣告成全域變數的關係
我宣告的就是您說的第一種方法

但對於new的用法及關念其實在下不是很懂
可否請大大簡單的說明一下
我有查關鍵字「new」但找不到東西= =
bcb的書上似乎沒有寫到這邊...

===================引 用 aftcast 文 章===================
都沒人回…實在是因為1/你講的有一點點的不清楚2/解答有點難說的很清楚…幾天前我就看了,但有點…懶…

原因應該是出在:? 「動態產生」造成的。

因為TForm1(注意我特別強調的是有T,所以是類別)是自動被建的,所以Form1這個預設的變數就被賦與一個物件。當你在Form2使用Form1-> 時,一切正常。因為Form1是真的有被創出來的實體。然而Form2呢? 有被賦與物件嗎?? 很難說,不知你程式是怎寫的…因為它是動態產生的。你有可能如下而產生
TForm2 *Form2= new TForm2(this);? // a種方式
或者你把form2的unit? include進來然後
Form2 = new TForm2(this);? //這樣的話Form2就是真的有物件,看清楚最前面是Form2 = 而不是 TForm2 *Form2 = (意義很不同)? //b種方式

如果你用的是a種方式,那就會出現你說的錯誤!? 因為…你new出來的Form2不是全域變數(因為new的時候是處於某方法裡)。那為何b種可以?? 因為TForm2.h這個檔有宣告Form2是全域的變數。

所有的問題都根源於? 你要了解什麼是 全域變數 ,什麼是區域變數,又當二個地方都有名稱一樣的變數時,會發生什麼事…


===================引 用 ken0127 文 章===================
大家好
我現在寫了一個程式
有三個Form,分別是Form1、Form2、Form3
Form2是由Form1動態產生,Form3則是由Form2動態產生
我現在將值從Form2寫回Form1都沒問題
我是直接用Form1->.....這種方法寫的

但現在遇到問題是從Form3將資料寫回Form2時
則是在執行程式時會出現Access violation at address 0040396B in module 'Project1.exe'.Read of address 000002F0

我也有將Form3 include Form2的.h檔
想問大家這樣的問題該怎麼解決

站上有小小爬過文…也許是不知道該怎麼打關鍵字
剛學BCB,關念還不是很懂
請站上各位大大多多指教
系統時間:2017-10-17 15:55:46
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!