Q&A

  • 동적 생성시...
패널을 동적으로 생성하였습니다.

dPanel : array [0..11] of TPanel;

이렇게 배열로 선언해서 12개의 패널을 생성했는데

이렇게 생성된 패널을 클릭시 어떤 패널이 클릭되었는지 알수 있는 방법이 없나요?

지금은 생성된 패널의 caption에 이름 [('패널' + inttostr(i + 1)) <-이런식으로] 을 주어 마지막 i값을 구해 동적 생성되 패널의 배열값을 알아옵니다.

하지만 caption에 이름을 주면 보이기 때문에 name을 주려고 했는데 에러가나네요

어떤 배열에 있는 패널을 클릭했는지 알수있는 방법이 없나요?

고수님들 부탁합니다.
4  COMMENTS
  • Profile
    하얀까마귀 2003.09.30 05:27
    여러가지 방법이 있겠지만. 님처럼 간단하게 이름을 구분할수도있구요.
    아니면 tag 같은데다가 넣어줘도 되구요...

    아마 에러나는건 이름에 한글이 들어가서 그런건 아닌가요?? ㅠㅠ

    한글때문이 아니라면.. 소스와 어떤에러인지 보여주세요 그럼
    알수 있을껍니다.

    동적으로 생성하는것은 마무런 문제가 없구요.
    해당 패널 각각에 모두 이벤트를 연결해 주세요..

    음. 예를들어서..

    // 이런식으로 주었겟죠?
    dPanel[0].OnClick := MyClick;

    그럼
    procedure MyClick( Sender : TObject );
    begin
      if Sender is TPanel then  // 이넘이 패널인지 확인하구요
      begin
        (Sender as TPanel).Tag <-- 이넘을 확인하시던지
        (Sender as TPanel).Name <-- 이넘을 확인하시던지 하시면 되겟네요.

      end;
    end;

    그럼..


  • Profile
    ♡아리♡ 2003.09.30 20:56
        if not (Sender is TBitBtn) then
            exit;

        for i := 0 to 11 do
            if not (DymPnl[i] = nil) then begin
                DymPnl[i].Free;     // 동적 객체제거 메모리 해제
                DymPnl[i] := nil;
            end;

        with Sender as TBitBtn do
            lv_iPnlCnt := strtoint(caption);            // 권취될 Roll의 수

        // 생성될 패널(Roll)의 가로길이 = 총길이 / 생성될 패널(Roll)수
        iPnlwidth := (984 div lv_iPnlcnt);

        for i := 0 to lv_iPnlcnt - 1 do begin
            DymPnl[i] := TPanel.Create(frmRwMain);
            with DymPnl[i] do begin
                parent := frmRwMain;
                left := 20 + (iPnlwidth * (i));
                Top := 177;
                Width := iPnlWidth;
                Height := 100;
    //            bevelInner := bvLowered;
    //            shape := stRoundRect;               // 둥근 사각형
                bevelwidth := 1;
                borderwidth := 5;
                color := clGradientInactiveCaption;
                Caption := 'Roll No ' + inttostr(i + 1);
    //            Name := 'Roll No ' + inttostr(i + 1);;
    //            showmessage (name);
                Onclick := DymPnlclick;             <- 이부분
            end;
        end;

    소스는 이거구요
    설명하것처럼
    (Sender as TPanel).Tag <-- 이넘을 확인하시던지
    (Sender as TPanel).Name <-- 이넘을 확인하시던지 하시면 되겟네요
    하면... name에 아무런 이름을 주지않았는데 어떻게 참조 하나요?
    그리고 총 12개의 컴포넌트를 생성했구
    Onclick := DymPnlclick;             <- 이부분
    이벤트는 생성된 12개의 컴포넌트가 동일한 이벤트를 사용합니다.
    방법좀 다시... 부탁합니다.

    제 설명이 어렵죠? 고수님께서 이해하시리라 믿고 ....




  • Profile
    하얀까마귀 2003.10.02 04:20
    쪽지 받아서. ..^^

    강형철 님께서 소스까지 써서 별로설명할것이 없구요..

    단지 이름은 주는것이 좋습니다.
    여러모로 쓸모도 있구요.. 또 가급적이면 줘서 생성하는것이 안정성도 있겠죠?

    ComponentCount 같은걸 이용하거나
    FindComponent <-- 이넘은 이름으로 찾죠..

    이런식으로 사용할수도 있으니 가급적이면 이름을 주는방향으로 하세요..

    그럼.
  • Profile
    강형철 2003.09.30 21:12

    procedure TFormMain.DymPnlclick(Sender: TObject);
    var
        nButtonNo : Integer;
    begin
        nButtonNo := TBitBtn(Sender).Tag;
        ShowMessage( IntToStr( nButtonNo ) + '번째 버튼' );
    end;


            DymPnl[i] := TPanel.Create(frmRwMain);
            with DymPnl[i] do begin
                parent := frmRwMain;
                left := 20 + (iPnlwidth * (i));
                Top := 177;
                Width := iPnlWidth;
                Height := 100;
    //            bevelInner := bvLowered;
    //            shape := stRoundRect;               // 둥근 사각형
                bevelwidth := 1;
                borderwidth := 5;
                color := clGradientInactiveCaption;
                Caption := 'Roll No ' + inttostr(i + 1);
    //            Name := 'Roll No ' + inttostr(i + 1);;
    //            showmessage (name);
                Onclick := DymPnlclick;             <- 이부분
                Tag := i;       //******** 여기에 버튼 번호 넣음.. ^^
            end;

    그럼 즐코