2011-12-29 5 views
-1

델파이 7에서 어플리케이션을 만들었습니다. 메인 폼은 서브 폼의 실행 프로 시저를 호출합니다. Execute 프로 시저는 하위 폼의 개체를 만들고 하위 폼을 사용자에게 표시합니다. 자동 작성에서 하위 양식을 제거했습니다. 이제 하위 폼에 하나의 편집 상자를 추가하고 실행 프로 시저에서 만든 하위 폼 뒤에 텍스트를 설정하려고했습니다. 하지만이 경우에는 액세스 위반 오류가 발생합니다. subform.editbox를 사용하여 텍스트를 설정하면 오류가 발생하지 않습니다. 양식이 자동으로 만들어지지 않을 때 양식 참조가있는 구성 요소를 사용하는 것이 항상 필수입니까? 도와 주셔서 감사합니다.델파이 폼 생성

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

이 코드하시기 바랍니다 보여! – evilone

+0

양식이 자동 작성되지 않은 경우 mandotory가 양식 참조를 사용합니까? frmSubForm.edit1.text를 좋아합니까? – Nalu

답변

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; 

(BTW : 귀하의 함수는 반환 형식이 없습니다.)

3

양식은 다른 개체와 크게 다르지 않습니다. 만들려면 Application.CreateForm(..) 또는 수동으로 Form2 := TForm2.Create(..)을 사용해야합니다. 그것이 생성되지 않는다면, 물론 당신은 Form2 = nil로 AccessViolation을 얻게 될 것입니다.

편집

A. 당신은 어디를 지정하지 않았고 frmSubForm은 어떻게 선언됩니다. TSubForm 양식의 별도 인스턴스가 될 예정입니까?

B. function TSubForm.execute(temp:String);을 아직 작성하지 않은 양식에서 실행 한 것 같습니다. 어쩌면 이것은 클래스 함수 여야합니다.

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; 

당신 경우 : 귀하의 질문에 어디

C. 당신은 효과적으로 당신이 여기

+0

Tform2.create (..)를 사용하여 실행 절차 시작시 양식을 만들었습니다. 그 후 편집 상자를 사용하여 텍스트를 설정했습니다. – Nalu

+0

'Form2 : = TForm2.Create (..)'라고 지정하셨습니까? – Kromster

+0

위와 같은 방식으로 예. – Nalu

1

frmSubForm.edit1이 아닌 자동 생성 양식을 사용하는 전형적인 코드 (TForm2)는 액세스 싶었다 같은 소리 Self.edit1에 액세스

,321 : 당신이 OnClose 핸들러에서 caFree에 밀접한 조치를 설정해야합니다 비 모달로 Form2를 보여 (대신 ShowModalShow를) 원하는 또한,

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

을 당신이 그것으로 완료 한 후, 하위 폼에 무료 전화 : 0

1

는이처럼 텍스트 상자의 텍스트를 액세서한다.

+0

자동 작성시 해당 양식을 추가하면 frmSubForm.edit1과 같이 사용할 필요가 없습니다. edit1.text로 직접 지정할 수 있습니다. 그러나 수동 제작에서 왜 우리는 레퍼런스를 제공해야합니까? – Nalu

+1

이 양식이 자동으로 작성되면 frmSubForm.edit1도 호출해야합니다. 그 점에는 차이점이 없습니다. – evilone

+0

테스트를 마쳤습니다. 내가 자동으로 하위 폼을 추가하고 TSubForm.create (self)를 사용하지 않으면; edt1.text 만 사용하는 동안 오류가 발생하지 않습니다. – Nalu

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에 액세스하는 장소가 아닌 한 번만 변경하면됩니다.

+0

@dummzeuch 아이디어가 마음에 들었으므로 폼에 클래스 함수와 로컬 변수를 사용하도록 내 대답을 수정했습니다. – TDC