2012-12-24 12 views
4

我設計C++ Builder中有兩種形式:傳輸數據++ Builder的

  • TfrmMain
  • TfrmChooseName

在TfrmMain類我有一個名爲btnNext按鈕。當單擊btnNext時,下面的代碼將運行並創建新的TfrmChooseName。

frmChooseName = new TfrmChooseName(this); 
this->Hide(); 
frmChooseName->ShowModal(); 
this->Show(); 
delete frmChooseName; 
frmChooseName = NULL; 

也在TfrmMain我有TEdit控件名爲txtInput。
在TfrmChooseName的構造函數中我想獲取txtInput的文本並將其設置爲窗體的標題,但是出現訪問聲音錯誤!
我也讓兩個班的朋友!

+0

請出示您的TfrmChooseName構造函數代碼。 –

回答

2

處理這種情況最好的辦法是到所需的標題值傳遞給構造本身,而不是編寫代碼的時候獵取的值,例如:

__fastcall TfrmChooseName(TComponent *Owner, const String &ACaption) 
    : TForm(Owner) 
{ 
    Caption = ACaption; 
} 

frmChooseName = new TfrmChooseName(this, txtInput->Text); 

或者,你可以在構造函數退出後設置標題,例如:

frmChooseName = new TfrmChooseName(this); 
frmChooseName->Caption = txtInput->Text; 
+0

謝謝! 從TfrmChooseName類創建新的對象後,我做了你說的和問題解決! 非常感謝! – ioio

2

我認爲不可能在沒有看到更多代碼的情況下檢測確切的問題。製作類朋友不應該是必需的,因爲使用表單設計器添加的組件無論如何都具有公共訪問權限。

您是否已從自動創建表格中刪除TfrmChooseName?如果不是,並且frmChooseName是指向自動創建表單的全局變量,則可能會導致訪問衝突。

的RADStudio文檔文章Creating Forms Dynamically說:

注:如果您在使用它的構造函數創建一個表單,一定要檢查的形式是不是在對項目>選項自動創建窗體列表>表單頁面。 特別是,如果您在不從列表中刪除同名表單的情況下創建新表單,則Delphi會在啓動時創建表單,並且此事件處理程序會創建表單的新實例,並將引用重寫爲自動創建的實例。自動創建的實例仍然存在,但應用程序不能再訪問它。事件處理程序終止後,全局變量不再指向有效的表單。任何使用全局變量的嘗試都可能導致應用程序崩潰。

您可能還想看看Creating a Form Instance Using a Local Variable

+0

感謝您的幫助 – ioio