컴퓨터 언어는 기계어에서 고급 언어로, 복잡한 것에서 간단한 것(사실 단순하지 않음)으로 발전해 왔으며, 이는 컴퓨터 과학과 기술의 발전을 반영합니다. 컴퓨터 언어가 발전할수록 추상적이고 인간적이며, 낮은 수준의 하드웨어와 관련이 적고 사용하기가 더 편리합니다. 그러나 컴퓨터 언어가 아무리 발전하더라도 이는 운영 체제 계층의 추상화이므로 우리는 항상 고급 언어를 이해하는 규칙을 찾을 수 있습니다. 즉, 고급 언어로 작성된 코드는 사람들의 요구 사항을 설명하기 위해 이러한 코드는 "번역기"를 통과해야 하며 이를 컴퓨터가 인식하고 실행할 수 있도록 기계어 형태로 번역합니다. 소위 번역 방법에는 두 가지가 있습니다. 하나는 컴파일러에 의해 미리 기계어로 코드가 생성된 다음 델파이 언어, C++ 언어 등과 같은 운영 체제에 의해 예약되고 실행되는 컴파일 방법입니다. ; 다른 하나는 해석 방법인데, 해석과 실행이 기본 언어, 스크립팅 언어 등 대상 프로그램에 영향을 미치지 않습니다. 해석 방법의 특징은 실행 속도가 느리고 컴퓨터 하드웨어에 대한 요구 사항이 상대적으로 높다는 것입니다.
컴퓨터 언어는 사람들의 요구를 설명하는 규칙을 정의합니다. 언어 뒤에는 컴파일러나 통역사가 있습니다. 컴파일러나 인터프리터의 주요 임무는 코드를 번역하고 인간과 컴퓨터 간의 통신을 위한 주요 채널이 되는 것입니다. 이처럼 운영체제가 그대로 유지되면 다양한 개발 도구들이 고유한 능력을 발휘하지만 결국 컴퓨터에서 실행 가능한 코드를 생성해야 한다. 따라서 프로그램이 어떤 컴퓨터 언어로 작성되었든 그것이 좋은지 나쁜지는 해당 언어의 컴파일러나 해석기에 크게 좌우됩니다. 델파이의 컴파일러는 여전히 세계에서 가장 발전되고, 최고이며, 가장 효율적인 컴파일러입니다.
고급 언어의 특성상 기본적으로 운영체제에서 제공하는 서비스 인터페이스를 캡슐화하고, 이를 기반으로 OOP, 포인터, 메모리 관리 모드 등 고유한 언어 기능을 추가합니다.
Delphi 언어의 전체 아키텍처에서 우리는 프로그램을 작성할 때 VCL을 직접 사용하거나 운영 체제에서 제공하는 API를 호출하거나 Com 서비스를 사용하거나 어셈블리 언어를 직접 사용하여 작업을 완료합니다.
Delphi의 핵심이자 가장 큰 점은 Visual Component Library(VCL - Visual Component Library)와 크로스 플랫폼 컴포넌트 라이브러리(CLX - aComponent Library for Cross-Platform)로, Microsoft MFC와 유사하지만 아키텍처는 최소한 MFC 3세대보다 2~3년 더 발전했습니다. Delphi에서 프로그래밍할 때 VCL을 선택하거나 처음부터 시작하지 않을 수 있습니다. 창을 생성하고 "Hello world"를 표시하는 프로그램을 작성한다고 가정해 보겠습니다. VCL을 사용하지 않는 경우 API의 CreateWindow를 호출하여 시작해야 합니다. 이는 매우 번거로운 일이지만 요구 사항에 따라 다릅니다. 이는 콘솔 프로그램과 같이 VCL 없이 델파이 프로그래밍을 사용하는 것이 불가능하지 않다는 것을 보여줍니다.
VCL은 델파이 언어의 객체 지향 기능의 핵심이자 결정체인 강력한 클래스 라이브러리입니다. 클래스 다이어그램 구조는 다음과 같습니다.
이는 축약된 클래스 다이어그램 구조이지만 매우 대표적인 클래스 다이어그램에서 VCL에는 하나의 루트(TObjct)만 있고 각 파생 클래스에는 하나의 조상만 있음을 알 수 있습니다. 이것이 델파이 언어의 객체지향적 특징입니다. 모든 클래스의 가장 원형은 TObjcet이며, 상속 방식은 단일 상속입니다. 설명해야 할 것은 다음과 같습니다.
l VCL 디자인은 클래식하고 거대하지만 이에 겁먹지 마세요. 직설적으로 말하면, 이는 특정 기능을 완성하기 위해 여러 관련 클래스가 함께 모인 클래스 라이브러리입니다. 이러한 클래스는 Windows API를 캡슐화하거나 Windows COM 서비스를 호출하거나 어셈블리를 사용하여 메모리를 직접 작동합니다. 앞서 언급했듯이 VCL을 사용하거나 사용하지 않고 프로그램을 작성할 수 있습니다. 이는 VCL이 필요하지 않음을 의미합니다. 필요한 경우 클래스를 상속하고 확장하여 자체 요구 사항을 충족하는 클래스로 만들 수 있습니다. 예를 들어 TPanal 클래스를 확장하려는 경우 QQ 패널의 기능과 같이 마우스가 들어오고 나갈 때 해당 이벤트(OnMouseEnter/OnMouseLeave)가 트리거될 수 있습니다.
u [파일]->[새로 만들기]->[유닛]에서 새 유닛을 생성합니다.
u 다음과 같이 코드를 작성한 후 유닛을 MyPanelUnit으로 저장합니다.
단위 MyPanelUnit;
인터페이스
클래스, ExtCtrls, 메시지, 컨트롤을 사용합니다.
유형
TMouseActionEvent = 객체의 PRocedure(Sender: TObject);
TMyPanel = 클래스(TPanel)
사적인
FOnMouseEnter, FOnMouseLeave:
포커스액션이벤트;
//마우스 입력 메시지 가로채기
절차 WMMouseEnter(var 메시지:
TMessage); 메시지 CM_MOUSEENTER;
//마우스 이동 메시지를 가로채기
절차 WMMouseLeave(var 메시지:
TMessage); 메시지 CM_MOUSELEAVE;
출판됨
속성 OnMouseEnter: TMouseActionEvent 읽기
FOnMouseEnter 쓰기 FOnMouseEnter;
속성 OnMouseLeave: TMouseActionEvent 읽기
FOnMouseLeave 쓰기 FOnMouseLeave;
끝;
//"Register"의 "R"은 대문자로 시작해야 합니다. 이는 Delphi 언어에서 크기에 주의해야 하는 유일한 부분입니다.
절차 등록;
구현
{TMyPanel}
절차 등록;
시작하다
//델파이 IDE에 컴포넌트를 등록하고 "MyControl" 패널에 표시합니다.
RegisterComponents('MyControl', [TMyPanel]);
끝;
절차 TMyPanel.WMMouseEnter(var 메시지: TMessage);
시작하다
//마우스 입력시 코드가 있는지, 실행되는지 판단
할당된 경우(FOnMouseEnter) 다음
FOnMouseEnter(Self);
끝;
절차 TMyPanel.WMMouseLeave(var 메시지: TMessage);
시작하다
//마우스 입력시 코드가 있는지, 실행되는지 판단
할당된 경우(FOnMouseLeave) 다음
FOnMouseLeave(Self);
끝;
끝.
u 그런 다음 아래와 같이 [컴포넌트]->[컴포넌트 설치…]를 클릭합니다.
"유닛 파일 이름"에서 방금 생성한 유닛인 MyPanelUnit.pas를 선택하고 다른 옵션은 기본값으로 둡니다. 그런 다음 "확인"을 클릭하고 "패키지 dclusr.bpk가 빌드된 후 설치됩니까?"에서 "예"를 선택하고 컴파일 및 설치 후에 저장합니다. 이렇게 하면 TmyPanel 컨트롤이 Delphi에 설치됩니다. Delphi 제어판을 끝까지 스크롤하면 아래와 같이 제어 페이지 MyControl이 표시됩니다.
u 그런 다음 새 프로젝트를 생성하고 [파일]->[새로 만들기]->[응용 프로그램]을 클릭하고 MyControl 페이지에서 MyPanel을 양식으로 드래그한 후 F11 키를 누르고 다음과 같이 이벤트 페이지로 전환합니다.
OnMouseEnter 및 OnMouseLeave 이벤트가 더 있는지 확인하려면 TPanel과 비교하세요. OnMouseEnter를 두 번 클릭하고 다음과 같이 코드를 작성합니다.
절차 TForm1.MyPanel1MouseEnter(Sender: TObject);
시작하다
ShowMessage('마우스가 MyPanel1에 들어갔습니다.');
끝;
그런 다음 F9를 눌러 실행하고 마우스를 MyPanel1로 이동하여 결과를 확인하세요.
매우 간단합니다. TPanel을 확장하여 마우스 입력 및 제거 이벤트를 처리할 수 있으므로 VCL은 누구나 내부의 구성 요소(클래스)를 원하는 대로 다시 작성할 수 있습니다.
l Delphi는 다중 상속을 구현하는 인터페이스 상속을 지원합니다. 예를 들어 TComponent는 다음과 같이 정의됩니다.
TComponent = 클래스(TPertant, IInterface,
IInterfaceComponent참조)
l 추상 클래스의 인스턴스를 생성하지 마십시오. 클래스의 한 메서드가 추상 메서드인 한 클래스는 추상 클래스입니다. 예를 들어 TStrings는 다음과 같이 정의됩니다.
TStream = 클래스(TObject)
사적인
…
보호됨
…
공공의
함수 읽기(var Buffer; Count: Longint): Longint 추상;
함수 쓰기(const Buffer; 개수: Longint): Longint 추상;
…
끝;
메소드 정의에 추상 키워드가 있는 한 이는 추상 메소드입니다. 읽기 및 쓰기가 구현되지 않고 호출되면 예제가 나타나기 때문에 추상 클래스를 사용하여 인스턴스를 생성하는 것은 의미가 없습니다.
(미완성, Delphi의 비하인드 스토리---초보자 참고서 2부(2)를 참조하세요.)
(재인쇄가 필요한 경우 http://haitian.myrice.com 에서 출처와 저자를 명시해주세요)