Q&A

  • 컴포넌트를 코드창에서 생성할 수 있을까요?
안녕하세요..

저는 label 컴포넌트를 사용할때 일일히 컴포넌트를 만들어 주는데,

나중에 필요한 label 컴포넌트 갯수가 다를경우에는 코드에서 만들어 줘야 할거 같아요.

예를 들면 화면에 데이터베이스에서 필드갯수만큼 출력을 해야 할때

while(필드갯수)

>>> 이부분에 label 컴포넌트를 등록해야 합니다. <<<

end

저렇게 컴포넌트를 사용자가 등록하는것이 아니라 자동으로 등록해주고 싶은데,

어떻게 해야 하나요?


그리고 제가 클릭하세요 델파이7 이라는 책을 보고 공부하고 있는데 정말, 제가 원하는 질문은

나와 있지 않네요... 좋은 책 있나요?
2  COMMENTS
  • Profile
    윤수아 2005.05.13 19:39
    질문이 애매...생성과 등록이라는 말이 중복되어 있어서요..
    그냥 컴포넌트를 디자인시가 아니라 런타임시에 생성하는 방법을 묻는 질문으로 이해하고 답변 올립니다.

    var
       tempLabel : TLabel;
       Loop : integer;
    begin
      for Loop := 0 to 2 do // 세개 만들다고 할때
      begin
        tempLabel := TLabel.Create(nil);
        tempLabel.parent := Self;    // Label의 Parent 윈컨트롤 지정..Label이 어느놈 위에 나타나는가..
        tempLabel.Caption := 'aaaaa';
        tempLabel.Left       := Loop  * 40;

        ......
      end;
    end;

    근데 이런식으로만 해주면 다른 함수에서 라벨에 접근하기도...힘들고 하고 나중에 Free를 해줄 수 없으므로..
    전역으로 LabelManagerList : TStringList;
    를 선언하시고 FormCreate할때 TSTringList(LabelManagerList  := TStringList.create) 를
    생성해주시고요....

    var
       tempLabel : TLabel;
       Loop         : integer;
    begin
      for Loop := 0 to 2 do // 세개 만들다고 할때
      begin
        tempLabel := TLabel.Create(nil);
        tempLabel.parent := Self;                                   // Label의 Parent 윈컨트롤 지정..Label이
                                                                                       어느 놈 위에 나타나는가..
        tempLabel.Name := 'MyLabel' + IntToStr(Loop); //이름을 구분자로 사용할 경우
        tempLabel.Caption := 'aaaaa';
        tempLabel.Left       := Loop  * 40;
        ......
        LabelManagerList.addObject(tempLabel.Name,tempLabel);
      end;
    end;

    일케 해시고요 접근하실때는
      TLabel(LabelManagerList.Objects[LabelManagerList.IndexOf('MyLabel1')]).Caption := 'ccccc';
      뭐 이런식으로 접근하시고요...

    프로그램 끝낼때
    var
       Loop : integer;
    begin
       for Loop := LabelManagerList.count - 1 downto 0 do
       begin
          TLabel(LabelManagerList.Object[Loop]).Free;
       end;
       LabelManagerList.Free;
    end;

    이런식으로 해주시면 되요..

    여서 대강 코딩한거라... 부분부분 에러가 있을지도 모르겠네요...


  • Profile
    김종윤 2005.05.13 19:49
    아 정말정말 원하는 답변이었습니다. ^^
    너무 너무 고맙습니다.