|
: 임프님께 부탁 하기를...
:
: 563번 질문으로부터 한참을 도움을 받으며 질문을 진행 했었거든요.
:
: 임프님께서 갈켜주신대로 했는데 에러가 나거든요. 아직도 해결을 못했구요.
:
: 그래서 다시 소스랑 함께 올리오니 부디 해결을 좀...
:
: <아래는 헤더파일 입니다.>
:
: #include <StdCtrls.hpp>
: #include <Forms.hpp>
: #include <Db.hpp>
: #include <DBClient.hpp>
: //---------------------------------------------------------------------------
: class TForm1 : public TForm
: {
: __published: // IDE-managed Components
: void __fastcall FormCreate(TObject *Sender);
: private: // User declarations
: public: // User declarations
: TButton *EXButton;
: void __fastcall BtnClick(TObject *Sender);
: __fastcall TForm1(TComponent* Owner);
: };
: //---------------------------------------------------------------------------
: extern PACKAGE TForm1 *Form1;
: //---------------------------------------------------------------------------
: #endif
:
:
: <여기서부터는 소스파일이구요.>
:
: //---------------------------------------------------------------------------
: #include <vcl.h>
: #pragma hdrstop
:
: #include "Unit4.h"
: //---------------------------------------------------------------------------
: #pragma package(smart_init)
: #pragma resource "*.dfm"
: TForm1 *Form1;
: //---------------------------------------------------------------------------
: __fastcall TForm1::TForm1(TComponent* Owner)
: : TForm(Owner)
: {
:
: }
: //---------------------------------------------------------------------------
: void __fastcall TForm1::BtnClick(TObject *Sender)
: {
: delete EXButton;
: }
:
: void __fastcall TForm1::FormCreate(TObject *Sender)
: {
: EXButton = new TButton((TComponent *)NULL);//이 부분 때문에 안 되었다고 하셨는데 임프님깨서
: EXButton->Parent = Form1; //갈켜주신 위에 처럼 했는데도 안되는군요.
: EXButton->Caption = "동적버튼";
: EXButton->OnClick = BtnClick;
: }
: //---------------------------------------------------------------------------
:
임펠리테리입니다.
버튼을 삭제하는 부분의 에러입니다.
소스를 보면 동적으로 만든 버튼 EXButton의 OnClick 핸들러로 BtnClick() 함수를 달아줬는데,
이 BtnClick()에서 EXButton을 삭제했기 때문에 억세스바이얼레이션이 발생합니다.
모든 이벤트핸들러는 연결된 컴퍼넌트의 내부에 있는 멤버함수에서 실행을 시킵니다.
이 경우를 예로 들면, EXButton을 클릭하면 마우스 메시지들의 처리루틴을 거쳐 결국 TButton의
Click() 멤버함수가 실행되는데, 여기서 OnClick 이벤트핸들러가 연결되어 있는지를 검사합니다.
연결된 이벤트핸들러가 없는 경우 그냥 다음으로 진행하고, 있으면 그 이벤트핸들러를 실행시키죠.
결론적으로, 이벤트핸들러를 실행시키는 것이 그 컴퍼넌트의 멤버함수이므로, 이벤트핸들러가
실행이 끝나면 다시 그 컴퍼넌트의 멤버함수로 돌아가서 계속 실행을 한다는 말입니다.
그런데 보여주신 소스에서는, 이벤트핸들러에서 자신이 연결된 컴퍼넌트인 버튼을 삭제해버렸으니
돌가야할 멤버함수도 역시 메모리에서 삭제되어버렸겠지요? 무효한 메모리 주소로 돌아가려고
시도하므로 억세스바이얼레이션이 발생하는 것입니다.
이런 경우엔 다른 방법이 없습니다. 이벤트핸들러에서는 자신이 연결된 컴퍼넌트를 삭제할 수
없습니다. 편법이 하나 생각나긴 했습니다만, 간단한 방법은 아닙니다.
그럼 참고하시길...
|