LazarusCompleteGuide:1.4
컴포넌트
델파이 Visual Component Library(VCL; 비주얼 컴포넌트 라이브러리)는 이름에 비주얼이라는 단어가 포함되어 있음에도 불구하고 비시각적 컴포넌트를 포함하지만 라자루스 LCL은 비주얼 컴포넌트만 포함한다. 데이터베이스 컴포넌트와 같은 비시각적 컴포넌트는 FPC에서 찾거나 외부 소스에서 이용할 수 있다. FPC에서는 이러한 컴포넌트 집단을 프리 파스칼 컴포넌트 라이브러리(FCL)라고 부른다. 일부 VCL 커포넌트는 LCL 또는 FCL에 나타나지 않지만, 델파이에서 이용할 수 없는 컴포넌트가 LCL 또는 FCL에서 나타나는 경우도 있다. 또한 컴포넌트는 에뮬레이션이 아니다-속성(property) 중 일부는 나타나지 않고, 또 일부는 다른 특성을 가진다.
모든 속성마다 라자루스 오브젝트 인스펙터의 Restricted Properties 탭은 다른 플랫폼에서 사용할 수 있는 범위를 보여준다.
LCL과 운영체제의 그래픽 사용자 인터페이스 간에 이루어지는 통신은 이벤트 위주로 되어 있다. 이벤트는 메시지 파이프(message pipe)를 이용해 교환되고 처리되는 메시지이다. 에를 들어, 사용자가 마우스를 클릭하면 마우스 조정을 포함하는 메시지가 커서 아래 창으로 전송된다.
VCL 컴포넌트는 윈도우 메시징 API를 이용해 레벨(level) 간 메시지를 전송한다. LCL은 동일한 시스템을 기반으로 하지만 메시지가 윈도우에서 직접 오지는 않는다. 대신 관련 인터페이스로부터 GTK, Qt 또는 Windows와 같은 LCL로 전송된다.
이러한 메시지들은 대개 윈도우에서는 변경되지 않은 채 전달되지만, 다른 모든 플랫폼에서는 VCL의 호환성을 위해 메시지가 인위적으로 생성된다. 모든 윈도우 API 메시지가 생성되는 것은 결코 아니며, 일부 파라미터는 다르게 작동함을 의미한다. 윈도우에서 실행되도록 쓰고 테스트한 프로그램을 다른 플랫폼에서 실행시키기 위해서는 LCL의 Windows 32/64 인터페이스가 특정 메시지만 전달하고 필요 시 일부 파라미터만 변경한다. LCL에서는 복사 가능한(portable) 메시지와 파라미터만 가능한데, 물론 라자루스 개발자가 이를 구현하고자 수고를 아끼지 않는 경우에만 존재한다. 실제로는 메시지가 LCL 컴포넌트로만 전송될 수 있음을 의미하며, LCL 인터페이스로는 전송이 불가능하다. 윈도우 API 메시지를 활용하는 델파이 컴포넌트를 전송할 때는 특별한 주의를 요한다. 서로 다른 위젯-셋에서의 이벤트가 다른 순서 또는 다른 빈도로 발생할 수 있다.
예를 들자면, 어떤 위젯-셋은 먼저 MouseDown 이벤트를 먼저 전달하고 그 이후에만 응답하는 반면 또 다른 위젯-셋은 순서를 바꿀지도 모른다. 따라서 델파이 컴포넌트를 복사할 때는 메시지를 조사하고 검사하는 데 특별한 주의를 기울여야 하는데 최선의 방법은 LCL 메소드로 대체하는 방법이다.
델파이 프로그램에서 필요로 하지만 델파이의 VCL이나 RTL에서 제공하지 않는 기능이 직접적인 윈도우 API 기능의 도움으로 구현되는 것은 자연스러운 일인데, 모든 델파이 프로그램들이 윈도우 상에서 실행되도록 개발되었기 때문이다. LCL은 델파이의 VCL과는 호환이 되지만 윈도우와는 호환되지 않고 윈도우 에뮬레이터와는 절대로 호환되지 않기 때문에 윈도우 API에 직접 의존하는 델파이 컴포넌트는 다른 플랫폼에서 사용 시 대체되어야 한다.
오픈소스 공동체에서는 이미 수많은 라이브러리를 FPC와 라자루스로 복사해왔으며, 당신이 필요로 할 거의 모든 것에 대해 플랫폼 독립적 라이브러리를 생성해왔다.
자연스럽게, 윈도우 유닛은 LCL이 있는 윈도우에서 사용할 수 있지만 이러한 경우 컴포넌트에 {$IFDEF MSWindows}라고 표시해야 한다. 리눅스용 코드 대부분은 BSD와 MacOS X 플랫폼에서도 실행되므로 Borland에서 비윈도우 코드를 표기하기 위해 {$IFDEF Linux}의 오사용을 반복하지 않길 바란다. FPC에서 더 높은 수준의 계열(higher-level family)의 적절한 이름은 unix가 되겠다.