Q&A

  • 동적생성한 탭페이지의 컨트롤(?) 을 가져올때의 문제입니다
<!--CodeS-->
// 동적으로 탭페이지를 생성합니다.

TabSheet := TTabSheet.Create(self);
TabSheet.Caption :=   'xxxx';
TabSheet.PageControl := PageControl1;

// 특정폼을 동적생성해서 탭페이지 붙입니다.
FrmNew := TFrmNew.Create(self);

FrmNew.Parent := TabSheet;
FrmNew.Align := alClient;
FrmNew.SetBounds(0,0,200,200);  
FrmNew.Show;

TabSheet.Visible := true;

PageControl1.ActivePageIndex := PageControl1.PageCount +1;
PageControl1.ActivePage := TabSheet;
<!--CodeE-->
---------------------------------------------

생성된 페이지 갯수 만큼 돌면서
이거저거 처리를 합니다.
<!--CodeS-->
for i:=0 to PageControl1.PageCount-1 do
   begin
    
    //이런식으로 페이지내의 폼에 접근하려고 하는데
    //첫째 인덱스(i)에 할당된 폼의 값은 가져오는것 같습니다만
    //그 이후의 페이지들의 폼값은 nil 값을 가져오네요.    
    
    FrmControl :=(PageControl1.Pages[i].FindChildControl('FrmNew') As TFrmNew);

    if Assigned(FrmControl) then
      begin

  '''''''''''''''
      end;
   end;
<!--CodeE-->
   델파이 경험이 별로없습니다.
   무엇이 잘못된걸까요?
1  COMMENTS
  • Profile
    최용일 2007.09.20 18:58
    안녕하세요. 최용일입니다.

    아마도 메인폼의 페이지컨트롤에 탭쉬트를 동적으로 생성해서 또다른 폼을 붙이시려고 하시는 것 같은데요...

    FindComponent, FindChildControl메소드들은 모두 컴포넌트의 이름(Name)을 가지고 검색을 합니다.

    여기서 중요한것이 한 부모내의 모든 자식컴포넌트들은 이름이 공백이거나 중복되지 않아야 합니다.

    특별히 이름을 지정하지 않으면 첫번째 만든 폼은 폼의 클래스이름에서 'T'를 뺀 값(ex: FrmNew)이 들어갑니다. 두번째부터는 여기에 숫자나 다른 문자가 추가되어서 이름이 달라집니다. 폼에 컴포넌트를 떨꿀때처럼...
    그렇다고 이름을 지정하면 EComponentError란 예외가 발생하게 됩니다. 같은 이름의 컴포넌트는 절대 같은 부모를 가질수가 없습니다...

    결론은... FindComponent, FindChildControl대신에 다른 방법을 사용하도록 하세요... 배열이나 리스트를 이용하든가해서요...

    ^^ 항상 즐코하세요...