안녕하세요
기존의 있는 컴포넌트를 동적으로 여러개 만들었을 때 각 각의 이벤트 처리를 위해
다음과 같이 해준다고 하더군요
procedure form1.image1click(sender:tobject) ;
if (sender as timage).tag =1 then 어떠구
if (sender as timage).tag =2 then 어떠구
제가 기존 컴포넌트를 상속 받아 새로운 컴포넌트를 만들었습니다.
물론 거기에는 이벤트를 만들었구요
새로만든 컴포넌트를 동적으로 여러개 만들구 각각의 이벤트를 구별 할려구
그러는데 안되서요, 새로 만든 이벤트에 (seder : tobject)를 이자로 주었더니
에러가 납니다.
소스는 다음과 같습니다.
function GetRoomButtonClick1 : TNotifyEvent;
procedure SetRoomButtonClick1(Value :TNotifyEvent);
property OnRoomButtonClick1 : TNotifyEvent read GetRoomButtonClick1 write
SetRoomButtonClick1;
조언좀 부탁드립니다.
읽어 주셔서 감사합니다.
무엇인가 쫌 이상한거 같아요..
이벤트는여..
쩝..
방금 알았슴다.. 이게 맞는지..
TNotifyEvent 이벤트핸들러는 EventHanderName (Sender: TObject);
Sender는 말그대로..메세지를 보내는 객체가 들어오죠..
같은 클래스의 객체를 여러개를 만들어서..한 이벤트 핸들러를 공유하면..
아래와 같이..
Sender로 체크를 해주면 되지만여..
클래스에서 이벤트핸들러를 정의해주었다면..따로 해줄 필요는 없져..
객체를 만들때마다..
각각의 이벤트 핸들러를 실행하겠져..
그러니깐 구별이 되는 거져..
만일 같은 이벤트핸들러를 할려면..클래스의 이벤트핸들러 정의에서 빼줘야 하겠져..
> procedure form1.image1click(sender:tobject) ;
> if (sender as timage).tag =1 then 어떠구
> if (sender as timage).tag =2 then 어떠구
위의 같은 이벤트 핸들러는 여러 Timage의 객체들이 같이 쓰나보죠?..
밑에는 저(초보)가 보기엔
OnRoomButtonClick1이라는 이벤트를 만들어주는 곳 인거 같네요..
근데..
이 이벤트를 실행하기 위한 코드가 필요할꺼 같구요....
저같은 경우 이렇게 합니다.
먼저 이벤트를 처리해줄 멤버TNotifyEvent를 클래스에다가 정의합니다.
FOnMyEvent: TNotifyEvent;
이것을 나중에 Property로 입력하고 출력할수 있게 해줍니다..
Property OnMyEvent : TNotifyEvent read FOnMyEvent write SetOnMyEvent;
그러면 SetOnMyEvent라는 메소드가 필요하겠져?
procedure MyControl.SetOnMyEvent (value :TNotifyEvent);
begin
FOnMyEvent := Value;
end;
TNotifyEvent는 함수 포인터(함수실행위치알려주는거)입니다..
그니깐..누가 OnMyEvent를 읽을때는 FOnMyEvent를 읽게 되는 거구요..
OnMyEvent를 정의해주면 FOnMyEvent라는 위치에 들어가게 되는 겁니다.
근데..이렇게만 하면 안되겠져..메세지를 받아서..이걸 실행시켜줘야..되는 거죠..
이벤트핸들러를 실행시켜주는 코드가 필요해요..
Procedure MyControl.DoMyEvent;
begin
if Assigned(FOnMyEvent) then FOnMyEvent(Self);
end;
여기가 바로 실행시키는 코드인데요..이부분은 맘대루 바꿔두 됩니다..
FOnMyEvent가 정의가 되어있다면..Self를 Sender로 해서..이벤트 핸들러를 실행시켜라...는 뜻이죠..
FOnMyEvent는 TNotifyEvent형..함수포인터 형태니깐여..(Help를 찾아보면..클래스형태나와여..) FOnMyEvent(Self); 라고 하면 실행을 합니다..
자..이젠 마지막으로..적당한 이벤트가 발생했을때..DoMyEvnt를 호출하면..끝이겠군요..
정리를 하면..
1, 내부 처리할 함수포인터 정한다 (예..TNotifyEvent)
2, Property로 노출시켜준다..
3, 입력해주는 메소드(write)에 첨에 만든 내부변수(함수포인터)에 value값을 넣어준다.
4, 이벤트 핸들러를 실행시킬 내부메소드를 만든다..
5, 적당한 이벤트가 발생되면..메소드를 호출해준다..
아..길게 적어봤습니다...
님은..버튼 클릭하는 이벤트 핸들러를 어떻게 하실 생각인거 같은데요..
음..
버튼이 눌러질때 OnRoomButtonClick1에 함수 포인터가 있나 확인 후에..
GetRoomButtonClick1을 실행시켜주셔야겠네요..그런데.쩝..근데..펑션이니깐..
GetRoomButtonClick1이라는..펑션이 TNotifyEvnet형태의 함수포인터를 잘 리턴해줘야겠습니다..(쫌 복잡하군여..)
SetRoomButtonClick1이라는 프로시저두..GetRoomButtonClick1의 펑션에 맞게...
잘 값들을...내부에 넣어줘야겠네요..
그러면..실행은 잘 됩니다..
근데..잘 넣어주는 게 왠지 복잡할꺼 같네요..^^;
버튼 클릭해서 하실꺼면..WM_LBUTTONMOUSEDOWN 형태의 메세지가
들어오면..
OnRoomButtonClick1에 함수포인터가 있나..체크해주신후에..
OnRoomButtonClick1의 함수포인터를 실행시키면..끝..입니다..
캬캬캬..복잡하져?
저두..젤처음 이벤트 만들때 힘들었습니다..
근데..책좀보고..
VCL 소스를 보니깐..
다들..이렇게 짰더군요..
당근..이런 방법이..보기두 좋구..생각하기두 좋구..객체지향(?)적이구요..
책들 마니 참고 하시길 바랍니다..
이만 소인은 물러갑니다..
마치 강좌를 하나 쓴거 같네여....
영원한 델초보 어린왕자.
> function GetRoomButtonClick1 : TNotifyEvent;
> procedure SetRoomButtonClick1(Value :TNotifyEvent);
>
>
> property OnRoomButtonClick1 : TNotifyEvent read GetRoomButtonClick1 write
> SetRoomButtonClick1;
>
>
김필수 wrote:
> 안녕하세요
>
> 기존의 있는 컴포넌트를 동적으로 여러개 만들었을 때 각 각의 이벤트 처리를 위해
> 다음과 같이 해준다고 하더군요
>
> procedure form1.image1click(sender:tobject) ;
> if (sender as timage).tag =1 then 어떠구
> if (sender as timage).tag =2 then 어떠구
>
>
> 제가 기존 컴포넌트를 상속 받아 새로운 컴포넌트를 만들었습니다.
> 물론 거기에는 이벤트를 만들었구요
>
> 새로만든 컴포넌트를 동적으로 여러개 만들구 각각의 이벤트를 구별 할려구
> 그러는데 안되서요, 새로 만든 이벤트에 (seder : tobject)를 이자로 주었더니
> 에러가 납니다.
>
> 소스는 다음과 같습니다.
>
> function GetRoomButtonClick1 : TNotifyEvent;
> procedure SetRoomButtonClick1(Value :TNotifyEvent);
>
>
> property OnRoomButtonClick1 : TNotifyEvent read GetRoomButtonClick1 write
> SetRoomButtonClick1;
>
>
> 조언좀 부탁드립니다.
>
> 읽어 주셔서 감사합니다.