Microsoft PowerPoint - hci2-lecture0-cplusplus.ppt

Similar documents
슬라이드 1

설계란 무엇인가?

C++ Programming

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2

PowerPoint Presentation

Microsoft PowerPoint - additional08.ppt [호환 모드]

<4D F736F F F696E74202D2036C0CFC2B05FB0B4C3BCC1F6C7E2C7C1B7CEB1D7B7A1B9D62E707074>

4 장클래스와객체 클래스와객체 public과 private 구조체와클래스객체의생성과생성자객체의소멸과소멸자생성자와소멸자의호출순서디폴트생성자와디폴트소멸자멤버초기화멤버함수의외부정의멤버함수의인라인함수선언 C++ 프로그래밍입문

1. auto_ptr 다음프로그램의문제점은무엇인가? void func(void) int *p = new int; cout << " 양수입력 : "; cin >> *p; if (*p <= 0) cout << " 양수를입력해야합니다 " << endl; return; 동적할

PowerPoint Presentation

슬라이드 1

Microsoft PowerPoint - Chapter 6.ppt

C++ Programming

C++ 기본문법 정리

Microsoft PowerPoint - C++ 5 .pptx

Microsoft PowerPoint - additional01.ppt [호환 모드]

gnu-lee-oop-kor-lec06-3-chap7

C++ 기본문법 정리

Slide 1

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

PowerPoint Presentation

Microsoft PowerPoint - additional06.ppt [호환 모드]

PowerPoint Template

1. 클래스와배열 int 형배열선언및초기화 int ary[5] = 1, 2, 3, 4, 5 ; for (int i = 0; i < 5; i++) cout << "ary[" << i << "] = " << ary[i] << endl; 5 장클래스의활용 1

1. 객체의생성과대입 int 형변수 : 선언과동시에초기화하는방법 (C++) int a = 3; int a(3); // 기본타입역시클래스와같이처리가능 객체의생성 ( 복습 ) class CPoint private : int x, y; public : CPoint(int a

Microsoft PowerPoint - Chap12-OOP.ppt

PowerPoint 프레젠테이션

JAVA PROGRAMMING 실습 08.다형성

chap10.PDF

쉽게 풀어쓴 C 프로그래밍

PowerPoint Template

Microsoft PowerPoint - additional07.ppt [호환 모드]

Microsoft PowerPoint - chap06-2pointer.ppt

PowerPoint Presentation

금오공대 컴퓨터공학전공 강의자료

Slide 1

KNK_C_05_Pointers_Arrays_structures_summary_v02

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

제 1 강 희망의 땅, 알고리즘

Microsoft PowerPoint - 2강

구조체정의 자료형 (data types) 기본자료형 (primitive data types) : char, int, float 등과같이 C 언어에서제공하는자료형. 사용자정의자료형 (user-defined data types) : 다양한자료형을묶어서목적에따라새로운자료형을

PowerPoint 프레젠테이션

쉽게 풀어쓴 C 프로그래밍

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

Design Issues

(Microsoft Word - \301\337\260\243\260\355\273\347.docx)

PowerPoint Presentation

PowerPoint Template

JAVA PROGRAMMING 실습 02. 표준 입출력

쉽게 풀어쓴 C 프로그래밍

C# Programming Guide - Types

Microsoft PowerPoint - 8ÀÏ°_Æ÷ÀÎÅÍ.ppt

쉽게 풀어쓴 C 프로그래밍

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

Chapter 6 Objects and Classes

PowerPoint Presentation

PowerPoint Presentation

PowerPoint 프레젠테이션

Slide 1

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning

11장 포인터

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

C++ Programming

Microsoft PowerPoint - chap10-함수의활용.pptx

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

Microsoft PowerPoint - chap06-5 [호환 모드]

<432B2BC7C1B7CEB1D7B7A1B9D628BABBB9AE5FC3D6C1BE295B315D2E687770>

17장 클래스와 메소드

Blog

PowerPoint Presentation

1

Microsoft PowerPoint - ch07 - 포인터 pm0415

10.0pt1height.7depth.3width±â10.0pt1height.7depth.3widthÃÊ10.0pt1height.7depth.3widthÅë10.0pt1height.7depth.3width°è10.0pt1height.7depth.3widthÇÁ10.0pt1height.7depth.3width·Î10.0pt1height.7depth.3width±×10.0pt1height.7depth.3width·¡10.0pt1height.7depth.3width¹Ö pt1height.7depth.3widthŬ10.0pt1height.7depth.3width·¡10.0pt1height.7depth.3width½º, 10.0pt1height.7depth.3width°´10.0pt1height.7depth.3widthü, 10.0pt1height.7depth.3widthº¯10.0pt1height.7depth.3width¼ö, 10.0pt1height.7depth.3width¸Þ10.0pt1height.7depth.3width¼Ò10.0pt1height.7depth.3widthµå

윤성우의 열혈 TCP/IP 소켓 프로그래밍

Microsoft PowerPoint 장강의노트.ppt

Microsoft PowerPoint - chap11

Microsoft PowerPoint - CSharp-10-예외처리

JAVA PROGRAMMING 실습 05. 객체의 활용

제4장 기본 의미구조 (Basic Semantics)

Microsoft PowerPoint - additional03.ppt [호환 모드]

Microsoft PowerPoint - java2 [호환 모드]

1. 상속의기본개념 다음과같은문제를위한클래스설계 자동차 속성 : 색상, 배기량, 현재속도 메서드 : 가속하라, 멈춰라, 시동을켜라 트럭 속성 : 색상, 배기량, 현재속도, 최대중량 메서드 : 가속하라, 멈춰라, 시동을켜라 택시 속성 : 색상, 배기량, 현재속도, 요금,

강의계획서 1. 강의개요 학습과목명 객체지향프로그래밍 Ⅰ 학점 3 학점교 강사명교 강사전화번호 강의시간 4시간강의실수강대상 2. 교과목학습목표 4차산업혁명시대의도래로컴퓨터와프로그래밍에대한관심이커지고있으며, 여러분야에서소프트웨어의중요성을강조하며, 새시대를이끌

제11장 프로세스와 쓰레드

JVM 메모리구조

11장 포인터

Microsoft PowerPoint 자바-기본문법(Ch2).pptx

No Slide Title

Microsoft PowerPoint - 02-Class Review.pptx

Lab 3. 실습문제 (Single linked list)_해답.hwp

유니티 변수-함수.key

(Microsoft PowerPoint - java2-lecture3.ppt [\310\243\310\257 \270\360\265\345])

윤성우의 열혈 TCP/IP 소켓 프로그래밍

Microsoft PowerPoint - hci2-lecture1.ppt

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

설계란 무엇인가?

PowerPoint Presentation

Slide 1

Microsoft Word - java19-1-midterm-answer.doc

Microsoft PowerPoint - Chapter 1-rev

Transcription:

Object-Oriented Programming and C++ 단기코스 321190 2007 년가을학기 9/6/2007 박경신 Overview Windows.NET Object-Oriented Programming C++ Class 선언, 정의, 사용 Data Encapsulation Class constructor, destructor Function, Operator Overloading Inheritance Function Overriding Virtual Function new, delete Default parameter Reference 2 Windows.NET Object-Oriented Programming 구조적프로그램에서객체지향프로그램으로 SDK(Software Development Kit): 운영체제가응용프로그램에제공하는서비스로 C언어함수의집합형태 MFC(Microsoft Foundation Class): SDK를객체지향적으로포장 ATL(Active Template Library): 분산환경컴포넌트개발 객체지향프로그래밍 (Object-Oriented Programming) 프로그램기본단위를객체 (object) 로해서프로그램을개발 프로그램기본단위 : C 는함수이고, C++ 는클래스 구조적프로그래밍 vs. 객체지향프로그래밍 예제 : 클릭한곳에 X 표하는프로그램 구조적프로그래밍 마우스가클릭되면, 클릭된점의좌표를계산 클릭된점의좌표가몇번째격자인지계산 그격자의모서리점을계산하여대각선을그리기 객체지향프로그래밍 : 각각의격자를하나의오브젝트로처리 마우스가윈도우에클릭되면, 자기자신윈도우전체에대각선을그리기 3 4

Class 객체를정의한데이터타입 Class 키워드를사용하여객체를구성하는데이터와함수들을정의 클래스의인스턴스 ( 객체 ) 를생성하여사용 Class 선언, 구현, 사용 클래스선언 클래스구현 //Point class 선언 class Point { // 데이터 ( 멤버변수 ) int _x; int _y; // 메소드 ( 멤버함수 ) void setx(int x){ _x = x; void sety(int y){ _y = y; void move(int x, int y){ //Point 객체사용 void main() { //Point 클래스의인스턴스생성 Point p; //Point 객체의함수접근 ( 호출 ) p.setx(100); p.sety(40); p.move(20, 50); 클래스사용 인스턴스 (Instance): 메모리에생성된클래스의실체 멤버변수는각인스턴스마다독립적으로생성 멤버함수는메모리에한번만로딩되고모든인스턴스가이를공유 5 6 Data Abstraction C 언어 Structure 자료추상화 (Data Abstraction) 캡슐화 (Encapsulation), 정보은닉 (Information Hiding) 캡슐화 (Encapsulation) 캡슐화의필요성 사용자는오디오의사용법만파악 사용자가오디오의반도체동작원리나내부회로까지파악하여내부부품을떼었다붙였다하고배선을끊었다이었다하면고장 C 구조체 (structure) 변수만캡슐화, 외부함수에의해수동적으로제어 C ++ 클래스 변수, 함수를캡슐화, 내부함수를통해능동적으로동작 public: 외부에서보이는변수 protected, private: 내부에만보이는변수 7 인터페이스파일과구현파일의분리 헤더파일 (.h): 인터페이스파일, 소스파일 (.c): 구현파일 헤더파일 함수프로토타입만보여줌 블랙박스 ( 정보의은닉, 구현을볼수없음 ) 계약서역할 ( 작업의정의를자세하고정확하게기술 ) /* 헤더파일의예 */ typedef struct { int _x; int _y; Point; void setx(int x); void sety(int y); void move(int x, int y); 8

Class 내부와외부 Class 내부와외부 클래스내부에서는클래스의멤버변수, 멤버함수를직접접근가능 클래스외부에서는클래스의인스턴스를통하여공개된 (public) 멤버변수, 멤버함수를접근 클래스명을선언하고포함된멤버변수와멤버함수를선언 class Date { private: public: int year; int month; int day; bool valid; bool IsValidDate(int y, int m, int d); bool SetDate(int y, int m, int d); void PrintDate(); 클래스명 :: 멤버함수 (..) 형식으로멤버함수정의 BOOL Date::IsValidDate(int y, int m, int d) { static int lenmonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31; if (y<1900 y>2006) return false; if (m<1 m >12) return false; if (d<1 d>lenmonth[m]) return false; return true; 클래스의멤버함수에서의멤버함수, 멤버변수접근 BOOL Date::SetDate(int y, int m, int d) { if (IsValidDate(y, m, d) == true) { // 멤버함수 IsValidDate() 접근 year = y; // 멤버함수에서멤버변수 year 접근 month = m; // 멤버함수에서멤버변수 month 접근 day = d; // 멤버함수에서멤버변수 day 접근 valid = true; // 멤버함수에서멤버변수 valid 접근 return true; else { valid = false; return false; ; 9 10 Class 내부와외부 클래스의외부함수에서의멤버함수, 멤버변수접근 void main() { Date MyBirthday; // Date 클래스의인스턴스생성 MyBirthday.SetDate(1987, 11, 11); // 인스턴스의공개된멤버함수접근 MyBirthday.PrintDate(); // 인스턴스의공개된멤버함수접근 if (d<1 d>lenmonth[m]) return false; return true; Class Constructor & Destructor 생성자 (Constructor) 함수 클래스를초기화하며인스턴스가생성될때호출 클래스이름 :: 클래스이름 ( 매개변수가능 ) 소멸자 (Destructor) 함수 클래스를정리하며인스턴스가소멸될때호출 클래스이름 ::~ 클래스이름 ( 매개변수없음 ) 소멸자앞에는항상 virtual 로선언 주의사항 생성자와소멸자는반환값없음 11 12

Class Constructor & Destructor Member Variables 변수 (Variables) 전역변수 : 프로그램이시작될때생성되고끝날때소멸 정적변수 : 프로그램이시작될때생성되고끝날때소멸 지역변수 : 함수가시작될때생성되고끝날때소멸 자동변수 : new 할때생성되고 delete 할때소멸 정적멤버변수 (Static Member Variables) 한클래스에서하나만생성되어모든인스턴스가공유하는변수 13 class Point { int x; int y; public: static int count; Point() { count++; // 생성자 ~Point() { count--; // 소멸자 // 인스턴스의개수를세기위한변수 ; // static( 정적 ) 변수는클래스선언부밖에서별도로선언필요, 초기화작업 Int Point::count = 100; 14 Example 클래스 CTest1 의선언 (Test1.h) 멤버변수 : m_name 멤버함수 : 생성자 (char *msg), 소멸자 클래스 CTest1 의구현 (Test1.cpp) 생성자 (char *msg): msg( 정적호출 ) 를 m_name 에저장후출력 소멸자 (): m_name 을출력 클래스 CTest1 의사용 : (main.cpp) 지역적, 정적, 동적으로 ctest1 을 3 번호출 생성자 : 지역적호출생성자 : 정적호출생성자 : 동적호출파괴자 : 동적호출파괴자 : 지역적호출 15 파괴자 : 정적호출 Polymorphism 다형성 (Polymorphism) one interface, multiple implementation Compile time 다형성 함수 Overloading 연산자 Overloading Run time 다형성 가상함수를이용한함수의 Overriding 16

Function Overloading Operator Overloading 함수오버로딩 (Function Overloading) 함수의이름은같지만함수의매개변수나반환값이다르게정의 호출시함수의매개변수개수나데이터타입에따라구별되어처리 class Overload{ public: int Max(int a, int b){ if (a > b) return a; else return b; ; double Max(double a, double b){ if (a > b) return a; else return b; ; void main(){ Overload o; int x; double y; x = c.max(10, 50); y = c.max(10.6, 50.3); 17 연산자오버로딩 (Operator Overloading) 연산자를함수처럼재정의하여사용 연산자오버로딩연산자종류 단항연산자 : ++, -- 이항연산자 : +, -, *, /, %, ^, &,, ~,!,,, =, <, >, <=, >=, <<, >>, ==,!=, ->, += 등 연산자오버로딩 Operator 키워드뒤에연산자를넣은함수이름으로구현 18 Operator Overloading 연산자오버로딩 (Operator Overloading) Point q=++p; // 오류반환값이없으므로대입불가 Inheritance 상속 (Inheritance) 이미만들어진기반클래스에구현된모든특징을그대로계승받아새로운파생클래스를생성 상위클래스 (Super class, Base class) 하위클래스 (Subclass, Derived class, Extended class) 상속을통한오브젝트의계층구조적구현 비슷한속성을여러번중복구현하는일이없어짐 새로운클래스를추가하기가쉬워짐 Point class Point{ ColoredPoint 3DPoint class 3DPoint : Point { 19 3DColoredPoint 20

Inheritance 기반클래스 (Base Class) 와파생클래스 (Derived Class) Derived Class 에서사용가능한멤버변수는 3 개 즉, BaseVariable1, BaseVariable2, DerivedVariable Derived Class 에서사용가능한멤버함수는 3 개 즉, BaseFunction1, Example 클래스 ctest2_1 멤버변수 : name( 이름 ), age( 나이 ) 멤버함수 Constructor(char *n, int a): 이름, 나이저장 show(): 이름 ( 나이 ) 를출력 클래스 ctest2_2 는 ctest2_1 을상속 멤버변수 : kor( 국어 ), eng( 영어 ), math( 수학 ), avg( 평균 ) 멤버함수 Constructor(char *n, int a, int k, int e, int m): 평균을계산하고, 이름, 나이, 국어성적, 영어성적, 수학성적, 평균성적을저장 show(): ctest2_1 의 show() 를호출하고, 국어성적, 영어성적, 수학성적, 평균성적을출력 21 22 BaseFunction2, DerivedFunction A의이름은? 이정진 A의나이는? 29 B의이름은? 수애 B의나이는? 27 B의국어성적은? 89 B의영어성적은? 75 B의수학성적은? 67 ---------------------- 학생국어영어수학평균이정진 (29세) 수애 (27세) 89 75 67 77 Overriding 재정의 (Overriding) 기반클래스의마음에안드는함수만고쳐서파생클래스에서재정의해서사용 Overriding 오버로딩 (Overloading) 과재정의 (Overriding) 오버로딩 : 동일한함수명에매개변수가다른함수를둘이상정의 int Max(int a, int b); double Max(double a, double b); 재정의 : 동일한함수명에동일한매개변수를둘이상정의 Point Class: void Show(); Point3D Class: void Show(); 단, Point3D 클래스는 Point 클래스를상속받은파생클래스 23 24

Virtual Function 바인딩 (Binding) 함수를호출하는부분에함수가위치한메모리번지를연결시켜주는작업 정적바인딩 (Static Binding) 컴파일할때호출될함수가결정 동적바인딩 (Dynamic Binding) 실행할때호출될함수가결정 가상함수 (Virtual Function) 함수를선언할때 virtual 키워드를붙여주면가상함수는동적바인딩을사용 가상함수이외의모든함수는정적바인딩으로처리 동적바인딩의효과 파생된클래스의오버라이딩된함수가제대로호출되려면반드시가상함수를오버라이딩하여동적바인딩이가능하도록처리 25 Virtual Function 가상함수의필요성 Point 클래스의 Show 함수호출 Point3D 클래스의 Show 함수호출 Point 클래스의 Show 함수호출 Point 클래스의 Show 함수호출 26 Virtual Function Inline Function 가상함수의필요성 inline 함수란 함수를호출하는위치마다코드가통째로복사 실행파일의크기는증가하지만수행속도는빨라짐 빈번히호출되며크기가매우작은함수에적합 inline 함수만드는방법 묵시적인방법 명시적인방법 Point 클래스의 Show 함수호출 Point3D 클래스의 Show 함수호출 // Point3d 인스턴스 Show 호출 // 동적바인딩 Point 클래스의 Show 함수호출 Point3D 클래스의 Show 함수호출 27 함수의선언과구현을같이해주면자동으로 inline 함수가생성 28

메모리관리 C++ 프로그램에서다룰수있는메모리의종류 정적 (static) 프로그램의시작과동시에할당되고프로그램의종료와함께해제됨 Static 을사용하거나파일범위에서선언된변수는정적이됨 자동 (automatic) 인스턴스가선언된지역에있는블록내에서유효한것으로선언된지점에서생성되고블록을벗어나는순간해제됨. Auto를사용하거나블록범위에서선언된변수는자동이됨 함수에매개변수를전달할때복사본을전달 동적 (dynamic) 블록이나프로그램과관계없이사용자가지정하는순간할당되고해제됨 New, delete 연산자를이용해서할당또는해제됨 동적할당은효과적으로메모리를사용할수있으나메모리에대한반환에유의해야함 ( 메모리누수 ) 29 연산자 new 요청된타입의개체를담을수있는크기의메모리를할당하고할당된메모리블록의주소를반환함 할당에실패할경우 bad_alloc이라는예외를발생시킴 정수타입데이터의동적할당 int *d_int = new int; 배열의동적할당 int *d_array = new int[20]; 클래스타입의동적할당 클래스의동적메모리할당시생성자를호출 Point *d_point = new Point; 30 연산자 delete 연산자 new 를통해서할당된메모리는반드시명시적으로해제해야함 Delete ID 연산자 delete 의사용법 int*d_int= new int; int *d_array = new int[20]; Point *d_point = new Point; delete d_int; delete [] d_array; delete d_point; 연산자 delete 의잘못된사용법 int i = 10; int *p = &i; delete p; // new 를이용해서할당된메모리가아니므로 error long *pl = malloc (sizeof(long)); delete pl; // new 를이용해서할당된메모리가아니므로 error Reference 개체에대한또다른명칭 으로정의됨 포인터와달리해당자원을공유하는매개일뿐실제의인스턴스가아님 레퍼런스는반드시유효한객체를레퍼런스하고있어야함 레퍼런스는처음초기화시정해진개체만을참조. 레퍼런스의사용예 int i; int & ref = i; // OK : int 타입변수 i에대한레퍼런스 ref = 10; // i의값이변경 extern int &e_ref; // OK : 레퍼런스선언 int &illegal; // error : 레퍼런스가정의되었으나초기화안됨 int *p; int *& ref_of_pointer = p; // OK : 포인터 p에대한레퍼런스 31 32

Reference 값복사에의한호출 함수에매개변수를전달할때복사본을전달 Class Template 템플릿이란 데이터형만다르고형태가같은클래스를여러번찍어낼때사용 10 20 레퍼런스에의한호출 함수에매개변수를전달할때원본을전달 20 10 33 34 Default Parameter 함수의기본인자 (Default parameter) 함수를호출할때인자를명시하지않는경우에지정한기본값이자동으로전달되는인자 함수의선언과정에서값을명시하는방법으로지정 기본인자는항상맨뒤의인자부터순차적으로지정해야함 기본인자의사용법 int f (char *, int = 1, int 100); // 함수선언시매개변수값을명시 f( yourname ); // f( yourname, 1, 100) f( yourname, 10); // f( yourname, 10, 100) f( yourname, 10, 180); // f( yourname, 10, 180) f(); // char * 에대한기본인자가없으므로 error f(10); // char * 에대한기본인자가없으므로 error Default Parameter 기본인자의사용법 35 36

This Pointer this 포인터란 현재클래스의인스턴스가위치한메모리의주소 다른클래스에자기자신을매개변수로넘겨줄때사용 Const Variables/Functions const 변수 초기화는할수있지만변경할수없는상수 const 함수 변수의값을변경할수없는읽기전용함수 37 38 Coding Rules 변수표기법 의미있는단어의사용 멤버변수는 m_ 라는접두어추가 헝가리안표기법 접두어 b d h n p 또는 lp sz u w dw str clr 의미 BOOL 형변수 double 형변수 HANDLE 형변수 int 형변수 pointer 변수 NULL 문자로끝나는문자열 unsigned int 형변수 WORD(unsigned short 형변수 ) DWORD(unsigned long 형변수 ) CString 형변수 COLORREF m_lpszfilename m_ : 멤버변수 lp : 포인터변수 sz : 널로끝나는문자열 Filename: 파일이름 39 Windows Programming 대표적인윈도우메시지 윈도우메시지발생상황 WM_CREATE 윈도우가생성될때 WM_ACTIVATE 윈도우가활성화되거나비활성화될때 WM_PAINT 윈도우가다시그려져야할때 WM_MOUSEMOVE 마우스커서가움직였을때 WM_COMMAND 사용자가메뉴등을명령으로내렸을때 WM_LBUTTONDOWN 마우스왼쪽버튼을눌렀을때 WM_LBUTTONUP 마우스왼쪽버튼을떼었을때 WM_LBUTTONDBLCILK 마우스왼쪽버튼이더블클릭됐을때 WM_KEYDOWN 키보드가눌렸을때 WM_KEYUP 키보드가떼었을때 WM_SIZE 윈도우의크기가변경되었을때 WM_MOVE 윈도우가이동되었을때 WM_TIMER 설정된타이머시간이다되었을때 WM_DESTROY 윈도우가없어질때 메시지처리기 OnCreate OnActivate OnPaint OnMouseMove OnDestroy OnLButtonDown OnLButtonUp OnLButtonDblClk OnKeyDown OnKeyUp OnSize OnMove OnTimer 40 OnDestroy