디자인시 판넬위에 버튼 컴포넌트를 두고 자신을 클릭했을 경우
procedure TMainForm.Button1Click(Sender: TObject);
begin
Button1.Free; <-- 에러가 발생하지 않습니다.
end;
그런데 동적생성을 하고
NewBtn := TButton.Create(Self);
with NewBtn do begin
Parent := Panel1;
Name := 'Btn1';
Top := 100;
Left := 100;
Visible := True;
OnClick := NewBtnClick;
end;
procedure TMainForm.NewBtnClick(Sender: TObject);
begin
TButton(Sender).Free; <- Access Violation 에러 발생
end;
이유가 무엇일까요?
디자인시에 생성했던 버튼은 자신을 클릭시 Free가 가능하고
프로그램 실행시 동적생성했던 버튼은 자신을 클릭했을 때 Violation 에러가 발생하는데,
어떤 해결 방법이 없을까요?
한번 봐주세요.. ^^;;;
조금 다른문제 아닐까요?
다른 두분은 에러안나는게 맞을듯 합니다만....
만약 님의 말씀처럼만으로 한다면 에러가 안나는게 맞을듯 하군요...
두분이나 해보셧으니 저까지는 안해도 될것같구요..
님이 소스의 전체내용을 올려주지 않았다는 가정하에서요..
제생각은 이렇습니다.
마우스의 이벤트가 onClick이외에 onMouseup도 있지 않냐는거죠..
아니면 TButton이 아닌 다른 버튼 이라던지...
뭐 답변을 보고 생각난거라서.. ㅎㅎ
일단 마우스 이벤트는 혼자 다니지 않죠..
그러니까.. 델파이의 소스에 보면 MouseDown 에서 마우스를 캡쳐합니다.
따라서 반드시 MouseUp이 발생을 하게 되죠..
문제는 님의 소스에서는 Click에서 Free를 시켰기 때문에 이때는 이미
콘트롤이 존재하지 않는다는거죠..
음. 그러니까..
밑의 소스에서
MouseUp 이벤트에서
NewBtn.Left := 5;
뭐 이런식으로 넣으면 에러날꺼라는거죠..
보통은 TButton(Sender).Left 뭐 이렇게 쓰거나 첵크 루틴이 있을꺼니까
이 이벤트 내에서는 에러나지 않을수도 있습니다만.
Tbutton이 아닌 다른 버튼이라면 그 버튼의 기능에서 MouseUp할때
어떤 동작을 할것이므로 이때 에러날수도 있을것 같네요.. ㅎㅎ
에구 쓰다보니 길어졌다. ㅋㅋ 그것말고는 솔직히 저 소스에서 에러날 부분은 생각나지 않는군요. . 그럼. 즐델하세요