C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[66972] Re:새로 생성된 버튼 이벤트랑 마우스 x,y 질문...ㅠㅠ
강재호.만해 [greenuri] 1202 읽음    2012-04-20 23:07
작은하마 님이 쓰신 글 :
: 배열을 쓰고, 사용자가 임의로 버튼을 추가 하는 소스까지는 구현을 성공했는데요...
: 문제는 항상 이벤트 생성을 오브젝트 클릭등에서 따온거라 임의로 추가된 버튼에 이벤트 부여를
: 모르겠네요...그리고 그 버튼과 drag & drop 이벤트를 결합해서 어느 범위에 있으면 form2가 뜨게하는건데
: 그거마저 잘 모르겟네요 ㅠ 학생이라 많이 헤맵니다 ㅠ 도와주세요

안녕하세요 만해입니다.

예제 소스 올립니다 참고 하세요. .

Unit1.h
----------------------------------------------------------------------------------
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
    TButton *Button1;
    void __fastcall Button1Click(TObject *Sender);
private:    // User declarations
public:        // User declarations
    __fastcall TForm1(TComponent* Owner);
    void __fastcall NewBtnClick(TObject *Sender);  //<<-- 동적으로 추가할 이벤트 핸들러를 정의 합니다.           };
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
-----------------------------------------------------------------------------

Unit1.cpp

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TButton * Btn = new TButton(this);
    Btn->OnClick  = NewBtnClick; //동적 생성한 컴포넌트에 이벤트를 연결 해 줍니다.
    Btn->Parent   = Form1;
    Btn->Top      = 20;
    Btn->Left     = 20;
}
//---------------------------------------------------------------------------
//동적 생성한 컴포넌트에 연결된 이벤트의 내용을 구현 합니다.
void __fastcall TForm1::NewBtnClick(TObject *Sender)
{
    ShowMessage("Hi This is New Button Click Event");
}
------------------------------------------------------------------------------

위의 소스에서 NewBtnClick라는 메소드를 TForm1에 Published 속성으로 추가시켰고요
(굳이 퍼블리쉬드가 아니어도 됩니다. 프라이빗이나 퍼블릭도 가능하고 중요한건 함수의 형태가 맞아야 합니다.)

추가 시킨 NewBtnClick라는 메소드를 Button1Click이벤트에서 Btn이라는 TButton의 인스턴스를

동적으로 생성하고 그 인스턴스의 OnClick이벤트에 연결 시켜 줍니다.

그리고 NewBtnClick 메소드의 내용을 구현해 주면

Btn이라는 인스턴스가 생성되고, 이 인스턴스의 OnClick이벤트에서는 NewBtnClick이라는 메소드를 콜 하게 됩니다.

자세한 내용은 다음과 같습니다.

OnClick이라는 이벤트는 소스를 잘 살펴 보게 되면 다음과 같이 정의 되어 있습니다.

TControl
{
-----
System::Classes::TNotifyEvent FOnClick;
------
__property System::Classes::TNotifyEvent OnClick = {read=FOnClick, write=FOnClick, stored=IsOnClickStored};
------
};

TNotifyEvent는 다음과 같이 정의 되어 있습니다.

typedef void __fastcall (__closure *TNotifyEvent)(System::TObject* Sender);

TButton 클래스는 TControl -> TWinControl -> TButton 로 상속 받아서 구현 되어 있습니다.

그러므로 OnClickEvent는 중간에 바꾸지 않는 한 TControl에서 정의된 그대로 가져 오게 됩니다.

OnClick 이벤트 같은 경우는 거의 공통이기 때문에 별로 바꾸지 않는 경우가 많으므로 그냥 TControl에서

정의된걸 가져 온다고 보시면 됩니다.

OnClick이벤트는 TnotifyEvent타입으로 정의된 메소드로 보시면 되고요

TNotifyEvent는 어려운거 다 빼고 생략 하자면, C의 함수 포인터와 비슷 하다고 생각 하시면 됩니다.

즉 이 변수는 어딘가 있을 이벤트 처리하는 메소드의 메소리상의 위치를 기억하게 됩니다.
(단, __Closure로 VCL폼 위의 메소드(디테일 하게 설명하자면 복잡해서 간략히 합니다^^)만 가능하다는 제한점을 가집니다. )

OnClick 이벤트는 이 이벤트가 발생 했을때 처리 해야할 메소드가 있는 위치를 가르키게 됩니다.
보통 일반적으로 오브젝트 인스펙트에서 만든 메소드는 폼의 구설 파일인 DFM에 저장됩니다.

그게 아니고 동적으로 컨트롤을 생성하고 이벤트를 연결 시킬려면,

1. 이벤트 타입에 맞는 함수를 정의 한다.
  이벤트의 타입은 Controls.Pas 파일에서 확인 할수 있습니다.

  Controls.Pas
----
      TStartDockEvent FOnStartDock;
    TEndDragEvent FOnEndDock;
    TStartDragEvent FOnStartDrag;
    TEndDragEvent FOnEndDrag;
    System::Classes::TNotifyEvent FOnClick;
    System::Classes::TNotifyEvent FOnDblClick;
    TContextPopupEvent FOnContextPopup;
    TMouseActivateEvent FOnMouseActivate;
    System::Classes::TNotifyEvent FOnMouseLeave;
    System::Classes::TNotifyEvent FOnMouseEnter;
    TMouseWheelEvent FOnMouseWheel;
    TMouseWheelUpDownEvent FOnMouseWheelDown;
    TMouseWheelUpDownEvent FOnMouseWheelUp;
  -----
  위의 파스칼 소스에서 앞부분에 있는 T~~~Event는 메소드 타입을 의미 하고, FOn~~~~은 이벤트를 의미 합니다.

2. 동적 생성한 컨트롤에 정의한 함수를 연결 시켜 준다.
  TButton * btn = new TBtton(this);
  btn->OnClick = OnNewClick; <- 이부분

3. 이벤트 타입에서 정의한 함수의 내용을 구현 합니다.

void __fastcall TForm1::NewBtnClick(TObject *Sender)
{
    ShowMessage("Hi This is New Button Click Event");
}
------------------------------------------------------------------------------

이런식으로 하시면 됩니다.

간단한걸 넘 장황하게 설명한듯 하네요.. T_T

혹시 이해가 안되시면 댓글 달아 주세요....

+ -

관련 글 리스트
66935 새로 생성된 버튼 이벤트랑 마우스 x,y 질문...ㅠㅠ 작은하마 895 2012/04/17
66972     Re:새로 생성된 버튼 이벤트랑 마우스 x,y 질문...ㅠㅠ 강재호.만해 1202 2012/04/20
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.