Visual Component는 실제로 클래스입니다. 클래스를 작성하려면 *.pas 파일에 직접 작성할 수 있습니다. 하지만 컨트롤을 작성하려면 패키지를 사용해야 합니다. 파일 메뉴에서 새로 만들기를 선택하여 새 패키지를 만듭니다. 이는 컨트롤을 저장하고 설치하는 데 사용되는 패키지입니다. 그런 다음 패키지 창에서 추가 버튼을 클릭하여 컴포넌트(유닛)를 추가합니다.
팝업 대화 상자 상단에서 새 구성 요소를 선택합니다. 컨트롤의 모든 속성, 메서드 및 이벤트를 직접 프로그래밍하는 것은 불가능하므로 상위 클래스(또는 "부모 클래스" 또는 "기본 클래스")를 선택한 다음 고유한 속성, 메서드 및 이벤트를 추가해야 합니다. 그것에 대한 이벤트. 조상 유형 뒤의 드롭다운 상자에서 필요한 조상 클래스를 선택합니다. 시각적 컨트롤을 작성하려면 그리기가 필요하므로 TGraphicControl이 상위 클래스로 선택됩니다. 그런 다음 클래스 이름 상자에 일반적으로 "T"로 시작하는 새 컨트롤(클래스)의 이름을 입력합니다. 팔레트 페이지는 "표준"과 같은 Delphi 창에서 새 컨트롤의 컨트롤 페이지 이름을 선택하는 데 사용됩니다. Unit File Name에 새로운 컨트롤 파일의 경로와 파일명을 추가하고 OK 버튼을 클릭합니다. 새로운 컨트롤이 추가되었습니다. 이제 컨트롤에 대한 코드를 작성할 차례입니다.
다음은 시각적 컨트롤을 작성하는 방법을 설명하기 위한 예로 그림을 사용자 정의할 수 있는 스크롤 막대를 작성하는 것입니다.
위의 방법에 따라 TGraphicControl을 조상 클래스로 선택하고 새 컨트롤의 이름은 TPigHorizontalScroller입니다. 파일 경로와 파일 이름을 선택한 후 확인 버튼을 클릭하면 코드 작성이 시작됩니다.
각 컨트롤은 생성(Create)되고 삭제(Destroy)되므로 이 두 프로세스를 먼저 작성해야 합니다. 컨트롤의 모든 절차에 대해 먼저 정의한 다음 나중에 작성해야 합니다. 정의된 프로세스 또는 속성에는 세 가지 유형이 있습니다. 1. PRivate 이후에 정의된 것들은 컨트롤에 의해 내부적으로 사용되며 컨트롤을 사용하는 사람들이 볼 수 없습니다. 2. protected 이후에 정의된 것들은 일반적으로 보이지 않으며 다음과 같은 경우에만 다른 사람들이 사용할 수 있습니다. 다른 사람들은 컨트롤을 사용합니다. 컨트롤은 다른 컨트롤을 조상 클래스로 작성할 때만 표시됩니다. 3. public 뒤에 정의된 컨트롤은 프로그램의 다른 사용자만 호출할 수 있습니다. 4. 게시된 컨트롤은 속성 창에서 볼 수 있습니다. 검사관). 생성 및 삭제 과정은 프로그래밍 과정에서 컨트롤이 생성될 때 자동으로 실행될 뿐만 아니라, 프로그램 실행 중 컨트롤이 동적으로 생성될 때 호출될 수도 있으므로 public(1) 뒤에 정의한다. (일련번호는 첨부된 소스 프로그램에서 하위 단계의 코드 위치를 의미하며 아래와 같습니다.) 어쩌면 이 두 프로세스에서 무엇을 컴파일해야 하는지, 어떻게 컴파일해야 하는지 아직 모르실 수도 있습니다. 아래에서 이에 대해 이야기하겠습니다.
먼저 이 컨트롤에 몇 가지 속성을 추가해 보겠습니다. 스크롤 막대의 최대값을 설정하거나 읽기 위해 Max 속성을 정의합니다. 속성은 일반적으로 프로그램에서 직접 사용되지 않으므로 속성에 대응하도록 변수를 정의해야 하며 해당 값을 수정하거나 읽을 수 있습니다. 컨트롤 내부에서만 사용되기 때문에 private(2) 다음에 정의합니다. (일반적으로 FMax와 같이 속성과 관련된 변수는 "F"로 시작합니다.) 변수를 정의한 후 속성을 정의합니다. 이 속성은 Object Inspector 창에 표시되어야 하므로 이를 정의하고 게시합니다(3). 정의된 구문은 다음과 같습니다.
property <속성 이름>:<유형> read <이 속성을 읽을 때 해당 변수> write <이 속성을 쓸 때 해당 변수 또는 프로시저>
다른 변수 및 속성도 유사하게 정의됩니다(예: 최소 최소값, 현재 값 값 등). 다음으로 스크롤 막대 그림을 설정하기 위한 여러 속성과 변수를 정의합니다(그림 변수는 특별하므로 이에 대해 별도로 설명하겠습니다). LeftButtonUpPicture(왼쪽 버튼 그림), LeftButtonDownPicture(왼쪽 버튼 누르기 그림) 등을 TBitmap 유형으로 정의합니다(해당 변수를 정의해야 함).
첨부된 소스 프로그램에서 이러한 속성을 정의할 때, 읽은 후 읽은 속성에 해당하는 변수는 F...인데, 쓰기 후에 지정한 속성에 해당하는 변수는 Variable이 아니고 Set 같은 것이라는 점을 아셨을 겁니다. ... 이것은 맞춤형 프로세스입니다. 함수로서의 프로세스는 다음과 같이 정의됩니다.
프로시저 <프로시저 이름>(값: <설정 중인 속성의 값 유형>)
이러한 유형의 속성을 작성할 때는 다른 작업을 수행해야 하므로 변수를 사용하여 처리할 수는 없으며 프로세스를 사용하여 처리해야 합니다. 이 프로세스는 일반적으로 protected 이후에 정의됩니다. 이러한 형태의 프로시저는 TBitmap 형태의 변수에 값을 할당하기 위해 ⑷와 같은 문을 사용한다. 이 형태의 변수에는 직접적으로 값을 할당할 수 없기 때문이다.
이러한 TBitmap 유형 변수의 속성을 정의한 후 위에서 언급한 생성 프로세스 및 삭제 프로세스에서 코드를 작성해야 합니다. TBitmap도 클래스이기 때문에 생성 프로세스(5) 중에 생성되어야 하며 삭제 프로세스(6) 중에 해제(무료)되어야 합니다. 여기서 ⑺에 언급된 상속문은 해당 프로세스가 조상 클래스로부터 상속되었음을 나타내는 데 사용됩니다. (이것을 떨어뜨리면 안 됩니다.)
시각적 컨트롤을 작성하고 있으므로 컨트롤에 그림을 그려야 합니다. 우리 컨트롤의 조상 클래스인 TGraphicControl은 Canvas(캔버스) 개체를 캡슐화하며 이를 직접 사용하여 그림을 그릴 수 있습니다. 아직 캔버스 사용법이 익숙하지 않다면 책을 찾아 읽어보는 것도 좋습니다.
다음으로 할 일은 그림을 그리는 것입니다. 컨트롤에 그림을 그리는 방법은 무엇입니까? 상위 클래스 TGraphicControl에는 컨트롤을 다시 그려야 할 때 자동으로 트리거되는 Paint 이벤트가 있습니다. 지금 우리가 해야 할 일은 이 이벤트를 위한 프로그램을 작성하는 것입니다. 먼저 보호한 후 Canvas 개체를 정의합니다. 조상 클래스에 이미 존재하므로 설명을 추가할 필요가 없습니다⑻. 이 개체를 사용하여 이미지를 그릴 것입니다. 다음으로 Paint 프로세스를 정의하고 컨트롤을 그리는 코드를 작성해야 합니다. 공개 후에 먼저 Paint 프로세스를 정의하십시오. 사용자가 호출하는 대신 상위 클래스에 의해 트리거되므로 나중에 재정의를 추가해야 합니다. 그렇지 않으면 Paint 프로세스가 호출되지 않으므로 컨트롤이 시각적 컨트롤이 되지 않습니다. 다음으로 Paint 프로세스⑽에 대한 코드를 작성하겠습니다.
본 글에 첨부된 소스 프로그램의 Paint 프로세스에 있는 T_Height 및 기타 변수는 스크롤 바의 버튼, 슬라이더 등의 크기를 저장하는 데 사용됩니다. 프로그램의 이 부분은 일반 응용 프로그램의 프로그램과 크게 다르지 않습니다. . 대부분은 캔버스 위에서 작업하기 위한 것이므로, 누구나 한 눈에 이해할 수 있을 것이라고 믿습니다. FAutoSize 변수에 대한 다음 판단은 주목할 가치가 있습니다. FAutoSize는 컨트롤의 AutoSize 속성과 관련된 부울 변수로, 컨트롤의 크기가 그림의 크기에 따라 변경되는지 여부를 설정하는 데 사용됩니다. 컨트롤 코드에서 속성은 일반적으로 직접 호출되지 않지만 해당 변수가 사용됩니다.
프로그램의 이 시점에서 마침내 새 컨트롤이 등장했지만 아직 스크롤할 수는 없습니다. 이제 이를 조작할 수 있는 마우스 이벤트를 작성해 보겠습니다. 마우스 이벤트 프로세스의 정의는 매개변수 설명을 마지막에 추가해야 한다는 점을 제외하면 Paint 프로세스와 매우 유사합니다. 마우스 이벤트는 정의 뒤에 MouseDown, MouseMove 및 MouseUp의 세 가지 유형으로 구분됩니다. 다음으로 코드를 작성해 보세요. 참고: 여기서 마우스 이벤트는 일반적인 OnMouse...가 아닌 Mouse...입니다. 그런데 ⒀의 정의는 무엇을 위해 사용되나요? 여기에 있는 이벤트 정의는 모두 사용자를 위한 것입니다. 즉, 컨트롤이 사용되면 Object Inspector의 이벤트 페이지에 표시됩니다.
이러한 마우스 이벤트에 대한 코드도 매우 간단합니다. 마우스의 좌표를 결정하고 캔버스에 해당 그림을 그리는 동시에 해당 이벤트를 트리거합니다. 사용자 정의 이벤트를 호출할 때 먼저 ⒁와 같은 문을 사용하여 사용자가 이벤트에 대한 코드를 작성했는지 확인해야 한다는 점은 주목할 가치가 있습니다. 이는 매우 중요합니다. 그렇지 않으면 오류가 발생합니다.
방금 호출한 이벤트는 모두 사용자 정의되었으며 정의된 메소드도 유형이 TNotifyEvent라는 점을 제외하면 속성 정의와 유사하다는 점을 모두가 알고 있습니다.
TNotifyEvent는 다음과 같이 정의된 기본 이벤트입니다.
TNotifyEvent = 프로시저(보내는 사람: TObject)
다른 형태의 이벤트를 정의하려면 다음을 수행해야 합니다. 먼저 이벤트를 작성한 다음 입력하세요.
<이벤트 유형 이름> = 프로시저(<매개변수>:<유형>)
예를 들어:
TCustomEvent = 프로시저(a: 정수; b:문자열);
그런 다음 공개 후에 정의하십시오.
<이벤트 이름>:<이벤트 유형 이름>
예를 들어:
AnEvent: TCustomEvent;
이 내용을 읽은 후에는 전체 절차를 이해해야 합니다. 컴파일 또는 실행 오류가 발생하는 경우 다음 사항을 확인하십시오.
1. 생성 및 삭제 프로세스에 상속된 명령문이 있습니까?
2. TBitmap 유형의 변수가 생성되고 해제되었습니까?
3. 프로세스 앞에 컨트롤 이름이 있습니까? 예: TPigHorizontalScroller.MoseMove
마우스가 컨트롤에 들어가거나 나가는지 확인하는 방법:
다음 프로세스를 정의합니다.
절차 MouseEnter(var Msg: TMessage); 메시지 CM_MOUSEENTER;
절차 MouseLeave(var Msg: TMessage) 메시지 CM_MOUSELEAVE;