LazarusCompleteGuide:6.2
FCL (프리 컴포넌트 라이브러리)
프리 컴포넌트 라이브러리는 라자루스 프로그래머가 사용할 수 있는 많은 클래스들을 포함하는데, 라자루스 IDE를 사용하지 않는 오브젝트 파스칼 프로그래머들도 이를 활용할 수 있다.
일반 클래스
FCL 내 모든 클래스는 비시각적 클래스이다. FCL 내의 클래스 대다수는 컴포넌트가 아니지만 (따라서 TForm 에 드롭할 수 없음) 프로그래머에 의해 생성 및 파괴된다. 오히려 이 클래스들은 직접적으로 GUI와 연관이 없는 다양한 일반 프로그래밍 작업을 처리하도록 설계된 유틸 성격의(utility) 클래스로 볼 수 있다. 아래 표는 선택된 클래스ㅡ어떤 것도 컴포넌트에 속하지 않는다ㅡ의 (완전하진 않지만) 리스트와 클래스가 구현된 유닛을 표시한다.
Name 프로퍼티에는 두 가지 중요한 제약이 있다:
- 유효한 파스칼 식별자여야 한다. 즉, 사용자는 오브젝트 인스펙터의 이름 필드에 무엇이든 입력할 수 없음을 의미한다.
- 유일해야 한다: TComponent 는 그것이 소유한 자식마다 반드시 유일한 이름을 가지도록 한다. 컴포넌트는 동일한 이름의 자식을 두 개 소유할 수 없다.
이 규칙에서 Name 프로퍼티는 예외로, 런타임 시 컴포넌트를 생성할 때 해당 프로퍼티를 비워둘(empty) 수 있다.
위 두 가지를 제약하는 이유는 무얼까? 대답은 TForm 선언에 나와 있다. 새 폼이 생성되고, 컴포넌트를 그 폼에 드롭하면 (TButton 컨트롤이라 치면 기본 값으로 Button1 이름이 붙여짐), 라자루스 IDE는 폼의 파스칼 파일에 아래와 같은 코드를 생성한다:
TForm1 = Class(TForm)
Button1 : TButton
Private
// private declarations go here
Public
// public declarations go here.
end;
코드에서 볼 수 있듯이, 폼은 TForm 클래스의 자손으로 선언되고, 폼에 드롭된 버튼은 TButton 타입의 필드로 선언되며, 필드의 이름은 버튼 컴포넌트의 이름과 동일해진다. 컴포넌트의 이름이 변경되면 IDE는 폼 선언에 필드의 이름을 자동으로 변경할 것이다.
폼의 선언에 필드로 이용할 수 있는 버튼 컴포넌트가 있다면 아래와 같은 코드를 작성할 수 있기 때문에 매우 편리하다:
begin
Button1.Caption := 'Press me';
end;
위의 경우가 아니라면, 폼의 자식 컴포넌트들 가운데 버튼을 검색하기 위한 코드를 작성해야 할 것이다:
Var B : TButton;
begin
B := FindComponent('Button1') as TButton;
B.Caption := 'Press me';
end;
보다시피 더 복잡해진다.
폼에 드롭된 각 컴포넌트는 폼의 클래스 선언에서 필드로서 선언된다. 이는 TComponent 의 모든 자식들이 유일한 이름을 가져야 하는 이유를 설명한다: 바로 폼 인스턴스가 폼에 드롭된 필드로 정의된 모든 컴포넌트를 소유하기 때문이기도 하고, 각 폼 필드는 유일한 이름을 가지므로 TComponent 의 자식들도 (이번 경우 TForm) 유일한 이름을 가져야하기 때문이다.
클래스 | 유닛 | 용도 |
TASCII85DecoderStream | ascii85 | ASCII85 포맷으로 인코딩(encode)된 데이터를 디코딩(decode)하기. |
TASCII85EncoderStream | ascii85 | ASCII85 포맷으로 데이터를 인코딩. |
TAVLTree | avl_tree | AVL 트리 구현. |
TBase64EncodingStream | base64 | Base64 (mime) 포맷으로 데이터 인코딩. |
TBase64DecodingStream | base64 | Base64 (mime) 포맷으로부터 데이터 디코딩. |
TBlowFishEncryptStream | blowfish | Blowfish cypher를 이용한 데이터 암호화(encrypting). |
TBlowFishDeCryptStream | blowfish | Blowfish cypher를 이용한 데이터 복호화(decrypting). |
TFPobjectList | contnrs | 객체 리스트 (앞서 언급한 TFPList는 포인터의 리스트). |
TObjectList | contnrs | 리스트 변경 알림이 있는 객체의 리스트. |
TComponentList | contnrs | TComponent의 리스트. |
TClassList | contnrs | TClass 클래스 포인터의 리스트. |
TStack | contnrs | 포인터의 스택. |
TObjectStack | contnrs | 객체의 스택. |
TQueue | contnrs | 포인터의 큐(queue). |
TObjectQueue | contnrs | 객체의 큐. |
TFPHashList | contnrs | 포인터를 데이터로 하는 해시(hash) 리스트. |
TFPHashObjectList | contnrs | 객체를 데이터로 하는 해시 리스트. |
TFPStringHashTable | contnrs | 문자열을 데이터로 하는 해시 리스트. |
TFPObjectHashTable | contnrs | 객체를 데이터로 하는 해시 리스트. |
TBucketList | contnrs | 포인터 데이터를 이용한 버킷 구현. |
TObjectBucketList | contnrs | 객체 데이터를 이용한 버킷 구현. |
TIDEAEncryptStream | idea | IDEA 포맷으로 데이터를 인코딩하기 위한 스트림. |
TIDEADecryptStream | idea | IDEA 포맷으로 데이터를 디코딩하기 위한 스트림. |
THashedStringList | inifiles | 빠른 검색을 위해 해시 리스트를 유지하는 TStrings 자손. |
TIniFile | inifiles | .ini 파일 관리를 위한 클래스. |
TIOStream | iostream | 표준 입/출력 파일 기술자(descriptor)를 나타내는 스트림. |
TTarArchive | libtar | tar archive로부터 데이터를 읽기 위한 클래스. |
TTarWriter | libtar | tar archive를 생성하기 위한 클래스. |
TPropsStorage | rttiutils | RTTI 정보로 쉬운 접근과 클래스의 모든 published 정보를 .ini 파일로 저장하기 위한 클래스. |
TSimpleEvent | syncobjs | 쓰레드 간 이벤트 동기화를 위한 클래스. |
TCriticalSection | syncobjs | 임계 영역(Critical section)을 위한 클래스. |
TXMLDocument | dom | XML 문서를 조작하기 위한 클래스. |
TXMLWriter | xmlwrite | XML 파일을 쓰기 위한 클래스. |
TXMLReader | xmlread | XML 파일을 읽기 위한 클래스. |
TRegistry | registry | Windows 레지스트리로 접근하기 위한 클래스 (또는 다른 플랫폼에서 에뮬레이션). |
TInputPipeStream | pipes | Pipe의 입력 끝. |
TOutputPipeStream | pipes | Pipe의 출력 끝. |
표 6.1: FLC의 클래스 |
비시각적 컴포넌트
FCL은 TComponent 자손인 비시각적 클래스도 일부 구현하므로 라자루스 컴포넌트 팔레트에서 이용할 수 있겠다:
클래스 | 유닛 | 목적 |
TProcess | process | 기타 애플리케이션을 실행 및 제어하기 위해. |
TSimpleIPCClient | simplepc | 단순한 (한방향) 프로세스 간 통신 IPC 클래스. |
TSimpleIPCServers | implepc | 단순한 (한방향) 프로세스 간 통신 IPC 서버. |
TEventLog | eventlog | 시스템 로그 서비스로 접근을 제공한다. |
표 6.2: FCL의 비시각적 컴포넌트 |
DB 클래스
FCL가 제공하는 컴포넌트 중 다수는 데이터베이스 연결 컴포넌트다. 그들은 자신만의 커다란 범주를 구성하므로 따로 구분되어 열거된다. 이러한 클래스들은 데이터베이스 연결 생성에 관한 장에서 논할 것이다. 이러한 클래스 대부분은 팔레트의 Data Access 탭과 SQLDB 탭에 표시된다. 개관을 요약하여 아래 표에 소개하겠다:
컴포넌트 | 유닛 | 목적 |
TDatasource | db | GUI 요소를 데이터베이스로 연결한다. |
TSDFDataset | sdf | CSV 파일을 처리한다. |
TFixedFormatDataset | sdf | 고정길이의 포맷 텍스트(formatted text) 파일을 처리한다. |
TParadox | paradox | Paradox 파일을 처리한다. |
TDBF | dbf | dBase(.dbf) 파일을 처리한다. |
TMemDataset | memdataset | 인 메모리(in-memory) 데이터를 처리한다. |
TSQLQuery | sqldb | 모든 SQL-데이터베이스 데이터셋. |
TSQLTransaction | sqldb | SQL 기반의 데이터베이스를 위한 트랜잭션(transaction) 제어. |
TSQLScript | sqlscript | 다중 SQL 문을 실행한다. |
TPQConnection | pqconnection | PostgreSQL 에 대한 연결을 처리한다. |
TIBConnection | ibconnection | Firebird/Interbase 에 대한 연결을 처리한다. |
TOracleConnection | oracleconnection | Oracle 에 대한 연결을 처리한다. |
TMySQL40Connection | mysql40connection | MySQL 4.0 에 대한 연결을 처리한다. |
TMySQL41Connection | mysql41connection | MySQL 4.1 에 대한 연결을 처리한다. |
TMySQL50Connection | mysql50connection | MySQL 5.0 에 대한 연결을 처리한다. |
TODBCConnection | odbcconnection | ODBC를 이용하는 모든 데이터베이스로의 연결을 처리한다. |
TSQLLite3Connection | sqliteconnection | SQLite 3.0 데이터베이스에 대한 연결을 처리한다. |
표 6.3: 데이터베이스 컴포넌트 |