Q&A

  • 쳇팅시 대화창을 여러개 띄우고 제어할려고 하는데요...
메신저에서 보면 TreeView에서 subitem을 더블클릭하면 대화창이 여러개 생성되자나요....
미리 디자인한 폼을 여러개 띄우고 제어할려고 하는데 폼을 어떤식으로 생성하고 제어해야 할지
잘 모르겠어요...
일단 아이디를 할당해줘야 할것 같은데...
고수님들 좀 알려주세요....
좀 상세히 설명 좀 부탁드리겠습니다....
참 그리고 리스트는 TreeView를 써도 괜찮을지 아니면 ListBox를 써야 할지 어떤게 제어하기 편할까요...
대신 메인 아이템과 서브 아이템이 들어가야 하거든요....
1  COMMENTS
  • Profile
    윤수아 2005.05.18 01:25
    동적으로 생성된 컴포넌트는 그것을 관리할 수 있는 객체를 두어 생성된 컴포넌트를 그 객체에서 관리하고..
    우리는 그 객체를 통해 해당 컴포넌트에 접근할 수 있게 하시면 됩니다..

    다음은 동적으로 여러개 생성된 TLabel을 관리 하는 예제입니다.. 폼도 기본 로직은 같으니 참고 하세요..
    (전에 답변해놓은 게 있어서 긁어서 올립니다 여기서 LabelManagerList가 제가 선언한 관리 객체이고..식별자는 Name으로 했습니다... )

    -----------------------------

    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;

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