Q&A

  • 탭시트에 각각 로드
먼저 메인폼이 있고 그 위에 페이지 컨트롤이 있읍니다.
페이지컨트롤에는 두개의 탭시트가 존재합니다.

하위 폼인 frmSub1와 frmSub2를 각각의 탭시트에 로드 햇읍니다.
frmSub1.Create(TabSheet1);
frmSub2.Create(TabShee2);

이때 서브폼간의 데이터를 전달하려고
(서브폼2.특정컨트롤.특정값을 서브폼1의 특정컨트롤.값 으로 전달)

frmSub1.edit1.text:= frmSub2.edit1.text;

이런식으로 코딩하니까 액세스바이올레이션이 뜨는데
해결 방법이 어떤게 있을까요?


4  COMMENTS
  • Profile
    이정욱 2007.11.13 21:03
    두 폼중 하나라도 생성이 안된 상태에서 호출 된것 같습니다..

    더 정확한것은 전체 샘플 코드를 봐야 알수 있겠네요..

  • Profile
    거리에서 2007.11.13 22:21
    일단 메인은

    <!--CodeS-->
    unit Unit1;

    interface

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

    type
      TForm1 = class(TForm)
        Button1: TButton;
        PageControl1: TPageControl;
        TabSheet1: TTabSheet;
        TabSheet2: TTabSheet;
        Button2: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
          tHan : TFormClass;
        procedure LoadClientForm(app : TApplication; parent : TWinControl);
        procedure LoadClientForm2(app : TApplication; parent : TWinControl);
      end;

    var
      Form1: TForm1;

    implementation
    uses unit2, unit3;


    {$R *.dfm}



    procedure TForm1.Button1Click(Sender: TObject);
    var frm2:TForm2;
    begin
      LoadClientForm(Application,tabsheet1);
    end;

    procedure TForm1.LoadClientForm(app: TApplication; parent: TWinControl);
    var
      form2:TForm2;
    begin
      application:=app;
      form2:=TForm2.Create(app);
      tHan:= TFormclass(form2);
      form2.BorderStyle:= bssingle;
      form2.Align:=alClient;
      form2.Parent:= Parent;
      form2.Show;
    end;

    procedure TForm1.Button2Click(Sender: TObject);
    begin
      LoadClientForm2(Application,tabsheet2);
    end;
    procedure TForm1.LoadClientForm2(app: TApplication; parent: TWinControl);
    var
      form3:TForm3;
    begin
      application:=app;
      form3:=TForm3.Create(app);
      form3.BorderStyle:= bssingle;
      form3.Align:=alClient;
      form3.Parent:= Parent;
      form3.Show;
    end;

    end.

    <!--CodeE-->

    subForm1
    <!--CodeS-->
    unit Unit2;

    interface

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

    type
      TForm2 = class(TForm)
        Button1: TButton;
        Memo1: TMemo;
        Label1: TLabel;
        Label2: TLabel;
        Edit1: TEdit;
        Edit2: TEdit;
      private
        { Private declarations }
      public
        { Public declarations }

      end;

    var
      Form2: TForm2;


    implementation
    uses unit3,unit1;
    {$R *.dfm}



    end.
    <!--CodeE-->
    subForm2
    <!--CodeS-->
    unit Unit3;

    interface

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

    type
      TForm3 = class(TForm)
        Button1: TButton;
        Label1: TLabel;
        Label2: TLabel;
        Edit1: TEdit;
        Edit2: TEdit;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;

    var
      Form3: TForm3;

    implementation
    uses unit2,unit1;
    {$R *.dfm}

    procedure TForm3.Button1Click(Sender: TObject);
    begin
      form1.Button1Click(sender);  //탭시트 1에 서브폼 로드
      form2.Edit1.Text:= form3.edit2.text; //로드된 폼에 값전달
                                                                //액세스바이롤레애션
    end;

    end.
    <!--CodeE-->

    이렇게하고 샘플로 만들엇고요
    메인폼의 Form3Load 버튼을 누르면
    탭시트2에 폼이 올라 오고요
    올라온폼의 버튼을 누르면
    탭시트 1에 또다른 폼을 올리고
    값을 전달하려고 했읍니다.
    거기서 액세스바이롤레이션이 뜨네요 ㅜ.ㅜ


    탬시트 2에서 버튼을 누르면
  • Profile
    최용일 2007.11.14 03:15
    tform2를 생성해서 할당한것은 LoadClientForm함수내에 있는 지역변수 form2이군요... 지역변수는 함수가 끝나면 존재가 사라집니다.

    에러가 발생할 때 참조한 form2는 Unit2에 선언된 전역변수입니다. 여기에는 어떤값도 할당한적이 없으니까 참조할 때 에러가 발생하는것이 당연합니다.

    두 변수사이에 연관성이 전혀 없습니다. LoadClientForm에서 전역변수를 쓰세요...

  • Profile
    거리에서 2007.11.14 04:42
    감사합니다.