2016-06-07 126 views
1

我寫這樣一份申請表// //標籤頁訪問方法:創建表格

有上有一個的PageControl, 在頁面控件創建Tabsheets, 在Tabsheets一種主要形式,表格被放置。

這有助於用戶可以多次創建一種類型的表單,如在多個選項卡中打開的標準PDF查看器,但顯示不同的數據,本質上是相同的形式。

這工作得很好,非常有用!不幸的是有什麼不工作很重要,這就是問題所在:

此代碼將正常工作:

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    Label1.Caption := 'Hello'; 
end; 

然而,字幕會改變,如果我想調用一個方法來代替,就像這樣:

Procedure changeLabel(str : String); 
Begin 
    Form1.Label1.Caption := str; 
End; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    changeLabel('Hello'); 
end; 

我在Form1.Label1.Caption獲得訪問衝突:= str;在程序

這裏是我創建的形式:

procedure TfrmPage.CDMA1Click(Sender: TObject); 
var 
    TabSheet: TTabSheet; 
    frmTest : TForm; 

begin 
    TabSheet := TTabSheet.Create(PageControl1); 
    TabSheet.Caption := 'kjklhhj'; 
    TabSheet.PageControl := PageControl1; 

    frmTest := TForm1.Create(Nil); 
    frmTest.Show; 
    frmTest.Parent := TabSheet; 
end; 

我所做的一切,每個人都在這裏說:another stackoverflow question

我的問題,如何能在新創建的窗體,釘在Tabsheet,訪問自己的程序而不拋出異常?另一個可能很重要的部分:當我有delphi自動創建窗體時,沒有訪問衝突,但該方法對窗體沒有任何影響,所以我認爲這個過程可能會改變錯誤窗體上的東西,一個還沒有創建(它給AV),而不是我剛剛創建的那個,或者應用程序不是在我的新窗體上調用方法,而是在某個窗體尚未創建的地方調用它。

如果我自動創建的形式,調用過程可能變化的時候,應用程序啓動,而不是新的形式創建的窗體上的標籤..

任何幫助,將不勝感激,因爲我已經一直沒有真正的幫助谷歌上搜索了幾個小時,現在這個問題提前:)

回答

1

感謝如果您打算創建TForm1類的幾個實例,它是正確的不自動創建Form1。事實上,您應該完全刪除Form1: TForm1聲明以降低錯誤風險。 您可能希望保留對創建f.ex的表單的引用。在TList中,可能由TfrmPage實例託管,具體取決於TfrmPage是什麼。 (請參見下面約AV討論)

訪問衝突

當您在TfrmPage.CDMAClick()創建的TForm1一個實例你分配到一個局部變量frmTest創建的窗體的引用,然後告訴你它是在一個標籤頁。您可以點擊Button1並更改標題Label1。然而,當你調用ChangeLabel過程中,您聲明

Form1.Label1.Caption := str; 

Form1變量從未分配,因此nil和AV被觸發。現在,由於您將形式參考分配給TfrmPage.CDMAClick()中的當地frmTest變量,因此您不再具有對該表單的任何參考,並且無法訪問它(實際上,由於您已將其歸檔到製表單,因此您可以在tabsheets控件)。這就是爲什麼我建議繼續引用您在列表中創建的表單。然後,您可以在需要時通過該列表訪問表單。

我的問題,如何將新創建的表格固定到Tabsheet, 訪問自己的過程而不會拋出異常?

您可以隨時從對象本身訪問對象方法,字段和屬性,而無需使用引用變量。事實上,你永遠不應該使用的對象從對象中引用變量:

Label1.Caption := 'Whatever'; // correct from within the form 

有時可能需要使用該對象中的引用,併爲此目的,你可以使用self f.ex:

self.Label1.Caption := 'Whatever'; // self can be used if needed 

從外部方法/過程/函數,你需要使用一個參考對象

Form1.Label1.Caption := 'Whatever'; // assuming Form1 has been assigned 
+0

謝謝您的回答,我用它和整理等小親後瑕疵,它似乎工作,但由於某種原因,我的應用程序(不是一個正常的測試應用程序)現在不允許我編輯一些簡單的編輯框:(即使在一個全新的形式,呃,也許有什麼建議嗎? –

+0

不客氣! 'TEdit'具有'Enabled'和'ReadOnly'屬性。如果它不能分別檢查那些是「真」還是「假」,那就提出一個新問題。 –