C#,Delphi,Oracle,MSSQL 개발자블로그

델파이 Delphi- 이벤트 실행 순서 본문

Programming/Delphi

델파이 Delphi- 이벤트 실행 순서

19760323 2018. 11. 6. 18:49

델파이 프로그램 실행 과정

 

프로그램실행 시작 과정
프로그램이 실행되면 application객체게 생성되면서 application객체의 componentcount속성의 갯수만큼 폼객체가 생성되고 폼이 생성될때마다 폼객체의 componentcount의 갯수만큼 컴포넌트가 생성됩니다.

 

프로그램실행 종료 과정

application객체의 componentcount의 갯수만큼 폼을 차례대로 종료합니다.

각각의 폼은 componentcount의 갯수만큼 컴포넌트를 하나씩 종료하고 다종료되면 form도 종료됩니다. 이후에도 application의 갯수만큼 form이 차례로 종료됩니다.

 

※ 수동 생성시 인자로 application,self의 입력

.create(application);

//application객체에 포함되어 생성

.create(self);

//해당폼객체에 포함되어 생성

.create(nil);

//아무곳에도 포함시키지않고 생성

 

※ 폼과 애플리케이션객체에 생성된 객체의 갯수 

ShowMessage(IntToStr(form_name.componentCount));

ShowMessage(IntToStr(application.ComponentCount));

 

Event 실행 순서

 

Create : OnCreate

Show : OnShow

Paint : OnPaint

Activate : OnActivate

ReSize : OnResize

Paint : OnPaint

Close query : OnCloseQuery

Close : OnClose

Deactivate : OnDeactivate

Hide : OnHide

Destroy : OnDestroy

 

Event(이벤트) 실행시점

 

OnCreate

해당 폼을 create(생성) 할때 초기1회 발생하며 현재 폼이 생성되어진 상태이므로 onCreate 프로시져안에서 해당 폼의 모든 모든 객체를 제어할수 있다.

폼이 생성만 된상태라 화면에 출력되기전에 실행된다.

해당폼에 초기화 작업을 해줄때 사용한다.

OnCreate 이벤트는 폼생성 초기 1회만 실행됩니다.

※ 아래의 명령을 사용하면 에러메세지가 뜬다. 그러므로 아래의 소스를 OnShow 이벤트에

사용하자. oncreate 시점에는 컴포넌트들이 눈에 안보이는 상태라서 포커스를 사용할수

없다.

컴포넌트명.setfocus();

메시지 : Cannot focus a disabled or invisible window.

출력사유1 : onCreate 이벤트에 setfocus() 메소드를 사용

출력사유2 : 화면에서 인비저블된 컴포넌트에 setfocus() 메소드를 적용할때

 

OnShow

OnCreate 이벤트가 실행된후 Run, Show, ShowModal 메소드등을 실행하여 폼이 화면에 출력되기전에 실행됩니다.

OnShow 이벤트는 폼생성 초기 1회만 실행됩니다.

 

OnActivate
OnShow 이벤트가 실행된후 Run, Show, ShowModal 메소드등을 실행하여 폼이 화면에 출력된후 실행됩니다.

OnActivate 이벤트는 폼생성 초기 1회 외에도 현재 창이 비활성화에서 활성화로 전환될때마다 계속 실행됩니다.

 

 

OnQueryClose

해당 폼을 Close 메소드나 우측상단 종료버튼으로 닫을시에 첫번째로 실행된다.

해당 폼에서 application.Terminate;로 종료시에는 이벤트 발생하지 않는다.

※ 폼종료를 중단할지 그대로 종료할지 설정 가능 , 쿼리입력 가능

 

OnClose

해당 폼을 Close 메소드나 우측상단 종료버튼으로 닫을시에 두번째로 실행된다.

해당 폼에서 application.Terminate;로 종료시에는 이벤트 발생하지 않는다.

※ 쿼리입력 불가능

 

OnDestroy

해당 폼을 Close 메소드나 우측상단 종료버튼으로 닫은후 소멸(Free)시킬때 실행된다.

해당 폼에서 application.Terminate;로 종료시에는 이벤트 발생하지 않는다.

 

이벤트 실행시점 예제

procedure TForm1.Button2Click(Sender: TObject);
var
  Form2:TForm2;
begin
  Form2 := TForm2.Create(Application); //# OnCreate 실행
  Form2.ShowModal; //# OnShow 실행(출력전) -> OnActivate 실행(출력후)
  //# Form2를 닫을때 OnQueryClose 실행 -> onClose 실행
  FreeAndNil(Form2); //# onDestroy 실행
end;

 

해당폼을 닫을때 CloseQuery 이벤트에서 종료를 막는방법 예제

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
 canclose := false; //종료가 안된다.
end;

 

일반 프로그램 해석 방법

 

CPU가 해석하고 실행한다고 했는데 보통 CPU는 해석하는데 2가지 방법이 있습니다.

컴파일러방식과 인터프리터방식입니다.

 

인터프리터방식

프로그램의 코드를 한줄한줄씩 해석하여 그때마다 실행을 합니다.

즉 고급 언어로 작성된 원시코드 명령문들을 한번에 한 줄씩 읽어들여서 실행하는 프로그램이죠.
 그래서 실행중에 에러가 발생해도 쉽게 찾을수있습니다.

그리고 코드의 내용만 담고 있어서 크기가 작죠.하지만 매번 실행할때마다 해석을 하므로

좀느립니다. (여기서 해석은 CPU가 알수있는 기계어로 바꿔주는 것이죠 그래서 해석할때는

CPU와 무관하지만 실행은 CPU와 유관합니다.^^)

 

컴파일러방식

모든 코드를 한번에 해석하고 실행파일로 만들어줍니다.

이말은 곧 속도가 빠르다는 것인데요.왜냐면 실행할때마다 해석이라는 과정이 배제됩니다

아시겠죠..^^그래서 실행만 하므로 빨라집니다.하지만 해석한 모든정보를 실행파일에 넣기

때문에 크기가 점 커지는 단점이있겠죠 



출처 : https://ksch7.wordpress.com/2010/02/02/delphi-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EC%8B%A4%ED%96%89-%EC%88%9C%EC%84%9C/

Comments