2011-12-29 77 views
-1

我在delphi 7中創建了一個應用程序。我的主窗體調用子窗體的執行過程。執行過程創建子窗體的對象並將子窗體顯示給用戶。我已經從自動創建中刪除了子窗體。現在,我在子窗體上添加了一個編輯框,並試圖在執行過程中創建子窗體後設置文本。但在這種情況下,我得到訪問衝突錯誤。如果我使用subform.editbox設置文本,那麼它不會給出任何錯誤。未自動創建表單時,是否總是使用具有表單參考的組件?感謝幫助。delphi表單創建

function TSubForm.execute(temp:String); 
begin 
    frmSubForm:= TSubForm.create(self); 
    edit1.text:= temp; 
    frmSubForm.ShowModal; 
end; 
+1

顯示你的代碼,請! – evilone 2011-12-29 09:41:56

+0

如果表單沒有被自動創建,那麼它的使用形式參照的授權?像frmSubForm.edit1.text? – Nalu 2011-12-29 10:06:35

回答

2

你在做什麼是危險的。一個方法可以隱式地訪問對象的所有字段,即使它可能還沒有被創建。儘量做到一個類的方法來代替:

class function TSubForm.execute(temp:String); 
begin 
    frmSubForm:= TSubForm.create(self); 
    edit1.text:= temp; 
    frmSubForm.ShowModal; 
end; 

(也適應它的類聲明) 這種變化之後,編譯器將不再允許您訪問EDIT1,因爲它不是一個類的變量,而是該類的一個實例。所以,正確的代碼是:

class function TSubForm.execute(temp:String); 
begin 
    frmSubForm:= TSubForm.create(self); 
    frmSubForm.edit1.text:= temp; 
    frmSubForm.ShowModal; 
end; 

但要注意:你的frmSubForm變量不是方法中聲明,所以它可能是全球性的。你在哪裏獲得表格?這將是清潔:

class function TSubForm.execute(temp:String); 
begin 
    frm:= TSubForm.create(self); 
    try 
    frm.edit1.text:= temp; 
    frm.ShowModal; 
    finally 
    frm.Free; 
    end; 
end; 

(順便說一句:您的函數沒有返回類型。)

3

窗體與其他對象沒有多大區別。您需要創建它(使用Application.CreateForm(..)或手動使用Form2 := TForm2.Create(..))。除非它被創建,否則你將獲得一個AccessViolation,Form2 = nil。

編輯

A.你沒有指定的地點和frmSubForm的聲明方式。它是否意味着是一個單獨的TSubForm表單實例? B.您看起來像是從尚未創建的表格中運行function TSubForm.execute(temp:String);。也許這應該是一個類功能。

C.你有效地訪問Self.edit1凡在你的問題是你聽起來像你想訪問frmSubForm.edit1

+0

我使用Tform2.create(..)創建了執行過程的開始窗體。之後,我用編輯框設置文本。 – Nalu 2011-12-29 09:48:15

+0

你有沒有爲它分配'Form2:= TForm2.Create(..)'? – Kromster 2011-12-29 09:58:52

+0

是的,就像你上面提到的一樣。 – Nalu 2011-12-29 10:00:33

1

下面是使用非自動創建形式的典型代碼(TForm2):

procedure TForm1.Button1Click(Sender: TObject); 
var 
    Form: TForm2; 

begin 
    Form:= TForm2.Create(Application); 
    try 
    Form.Edit1.Text:= 'Hello'; 
    Form.ShowModal; 
    finally 
    Form.Free; 
    end; 
end; 

如果您要顯示窗體2作爲非模態(Show而不是ShowModal),你應該設置其caFree關閉行動OnClose處理:

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction); 
begin 
    Action:= caFree; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
    Form: TForm2; 

begin 
    Form:= TForm2.Create(Application); 
    Form.Edit1.Text:= 'Hello'; 
    Form.Show; 
end; 
1

你應該進入您的文本框的文字是這樣的:

function TSubForm.execute(temp:String); 
begin 
    frmSubForm:= TSubForm.create(self); 
    frmSubForm.edit1.text:= temp; 
    frmSubForm.ShowModal; 
end; 

此外,撥打免費在你的窗體,你用它做了。

+0

如果我在自動創建中添加該表單,則不需要使用像frmSubForm.edit1。我們可以直接通過edit1.text分配它。但爲什麼我們必須在手工創作中引用參考? – Nalu 2011-12-29 10:26:28

+1

如果這個表單是自動創建的,您也需要調用frmSubForm.edit1。這沒有什麼區別。 – evilone 2011-12-29 11:00:12

+0

我已經測試過。如果我在自動創建中添加子窗體並且不使用TSubForm.create(self);那麼只使用edt1.text時不會有任何錯誤。 – Nalu 2011-12-29 11:45:30

1

我不認爲我會做這種方式,但這個工程:

unit UfrmSubForm; 

interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, StdCtrls; 

type 
    TfrmSubForm = class(TForm) 
    edit1: TEdit; 
    private 
    procedure Set_EditText(const Value: String); 
    { Private declarations } 
    public 
    { Public declarations } 
    class function Execute(Temp: String): TModalResult; 
    property EditText: String write Set_EditText; 
    end; 


function SubFormExecute(Temp: String): TModalResult; 

implementation 

{$R *.dfm} 

{ TfrmSubForm } 

class function TfrmSubForm.Execute(Temp: String): TModalResult; 
var 
    frmSubForm: TfrmSubForm; 
begin 
    frmSubForm := TfrmSubForm.Create(Application); 
    try 
    frmSubForm.EditText := Temp; 
    Result := frmSubForm.ShowModal; 
    finally 
    frmSubForm.Free; 
    end; 
end; 

procedure TfrmSubForm.Set_EditText(const Value: String); 
begin 
    edit1.Text := Value; 
end; 

end. 

然後用它從第一種形式,像這樣:

procedure TForm1.btnExecuteClick(Sender: TObject); 
begin 
    TfrmSubForm.Execute('Some Text'); 
end; 

返回一個ShowModal的狀態的確沒有傷害,你永遠不知道你什麼時候需要它。

您可能不應直接訪問其他對象(窗體或其他)的屬性;如果TEdit將來成爲TLabel,則只需更改一次frmSubForm,而不是訪問frmSubForm.Edit.Text的地方,請使用父對象的propery。

+0

我喜歡@dummzeuch的想法,所以我修改了我的答案,爲表單使用類函數和局部變量。 – TDC 2011-12-29 15:23:30