본문 바로가기
Delphi/프로시저-함수

Delphi Open ToolsAPI

by MonoSoft 2023. 12. 14.
728x90
반응형

Delphi Open ToolsAPI

 

 

728x90

 

 

 

자고 일어나면 빌딩이 선다.

이 새삼스럽지 않은 기적은 철골구조와 조립식 컨크리트에 의해 이루어진다.

 

철골이 올라가는가 하면 금새 벽이 붙여지고 며칠 안가 빌딩이 완성된다.

이런 조립형태의 접근방식은 빠른 결과물을 보게 해준다.

 

이런 조립형태의 개발방식은 RAD(고속개발)툴의 근간을 이루고 있다.

델파이에서 조립식 컨크리트의 역할은 컴퍼넌트가 담당한다.

 

그리고 굳건하게 이런 컴퍼넌트 중심의 개발환경을 뒷받침하고 있는

철골구조가 바로 IDE(통합개발환경)이다.

 

보다 빠르고 시각화된 개발환경을 제공하기 위해서

일찌감치 IDE(통합개발환경)라는 위대한 환경을 제시해 왔다.

 

IDE를 통해 단순 컴파일러가 아니라 개발툴이라는 당시로서는

진보적 개념을 처음 도입한 것은 볼랜드였다.

 

어쩌면 IDE야 말로 오늘날 볼랜드를 있게 한 주춧돌이 아닌가 여겨진다.

여타의 컴파일러들이 Makefile을 구성하고 make나 cc등을 이용해

커맨드라인상에서 컴파일을 하던 것에 비해 볼랜드의 툴은

자체 편집기와 디버거를 포함한 통합개발환경을 제공했다.

 

이런 쉽고 간결한 접근방식은 당시 명령행 라인 방식을 사랑하고 있던

필자를 당혹하게 만들었고 C 예찬론자에게 파스칼을 쓰게 만들고

유닉스 숭배자를 윈도우즈 환경으로 끌어내어 오늘날까지 델파이를 쓰게 만들고 있다.

 

필자가 터보(당시볼랜드의 툴은 모두 터보 씨리즈였다)광이 되게 만든 것은 바로 IDE 였다.

볼랜드의 역작 델파이는 대부분의 소스를 공개하였으며 개발자들을 주어지는

환경에만 만족하는 돼지들로 키우지 않았다.

 

VCL의 소스제공은 그 구조와 용법에 익숙해진 수많은 컴퍼넌트 개발자들을 양산하였으며

델파이를 개발툴의 강자로 키우는데 일조를 담당하였다.

 

사실 컴퍼넌트를 전문으로 개발하고 있는 제3진영이야

말로 볼랜드가 가진 가장 큰 재산이라고 볼수 있다.

 

TeeChart, QuickReport, Indy등 개발자들이 델파이를 사용하면서

가장 유용하게 사용하고 있는 대부분의 컴퍼넌트는

이런 제3진영의 작품들임을 간과해서는 안된다.

 

제3진영을 위해 볼랜드가 선사한 또 다른 선물은

Open Tools API(Open Tools API)다. COM 개념을 기반으로 하고 있는

이 API는 IDE의 확장을 가능하게 해준다.

 

이 API는 각 메뉴와 편집 소스등과

연결되는 툴을 작성하기 위한 교량 역할을 해준다.

 

여러분이 Open Tools API를 통해 접근할 수 있는 부분은 상당하다.

 

기본적으로 Editor와 Debugger, 폼디자이너, 그리고 각 모듈 및 파일의 핸들링과

메뉴와 같은 사용자 인터페이스까지 모든 것에 접근할수 있다.

 

이런 접근들을 조합해 IDE상에서 직접 이용할 수 있는 툴을 작성하거나

기존 IDE의 행동방식을 변경할 수 있다.

 

결론적으로 Open Tools API를 통해 델파이는 IDE에서도

무한의 확장성을 제공하고 있는 것이다.

 

Open Tools API가 COM 기반이 된 것은 델파이4에 와서의 일이다.

 

델파이3까지는 추상클래스로 되어 있다.

델파이6에서도 델파이3까지의 Open Tools API 호환을위해

ToolServices와 TIMenuItemIntf를 지원하고는 있지만 사실 그것으로 할 수 있는 것은

Wizard나 Expert를 만드는 것 정도가 전부이다.

 

새로운 개념의 Open Tools API에서는 다른 방법으로 접근한다.

따라서, 본 강좌에서는 ToolServices나 TIMenuItemIntf를 이용한 방법은 다루지 않는다.

 

 

Services 인터페이스의 이용

 

 

Open Tools API와 관련된 소스는 {DELPHI}/Source/ToolsAPI 디렉토리에서 찾아볼 수 있다.

ToolsAPI.pas를 한번 열어보자. IOTA로 시작하는 많은 인터페이스들을 찾아볼 수 있다.

 

몇몇 INTA로 시작되는 인터페이스를 볼 수 있는데 이것은 Native Tools API이다.

이중 IOTAxxxxServices가 여러분이 처음 관심을 가져야할 인터페이스다.

 

Open Tools API는 여러개의 서비스들로 나뉘어져 있다.

IDE의 각 부분으로 연결해주는 최상위 접근점이다.

 

한 예를 들면 아래와 같다.

 

IOTAActionServices = interface(IUnknown)

['{F17A7BC9-E07D-11D1-AB0B-00C04FB16FB3}']

 

{ Action interfaces }

function CloseFile(const FileName: string): Boolean;

function OpenFile(const FileName: string): Boolean;

function OpenProject(const ProjName: string; NewProjGroup: Boolean): Boolean;

function ReloadFile(const FileName: string): Boolean;

function SaveFile(const FileName: string): Boolean;

end;

 

IOTAActionServices는 새로운 프로젝트나 모듈을 열고 닫고

저장하는 등의 역할을 하는 서비스다.

 

일반적인 OOP와 달리 오브젝트 파스칼에서는 다중상속이 금지되어 있다.

한 오브젝트는 하나의 부모만 가질 수 있다.

 

다소 치명적일 수 있는 이 제한을 오브젝트 파스칼은

interface라는 개념을 통해 어느 정도 해소하고 있다.

클래스와 유사하지만 아주 많은 제약을 담고 있는

인터페이스는 프로퍼티와 메쏘드들만 담고 있으며 필드(변수)는 가질 수 없다.

 

필드를 가질 수 없다는 점 때문에 프로퍼티의 read나 write 부분도 필드가 아닌

메쏘드를 이용해 작성해야 한다.

 

대신 클래스에서는 다수의 인터페이스를 부모로 한꺼번에 삼을 수 있다.

쉽게 말하자면 클래스의 친부모는 하나지만

양부모는 여럿을 취할 수 있다는 것이 델파이에서 이용할 수 있는

다중상속성의 편법적인 지원이다.

 

ToolsAPI.pas를 찾아보면 BorlandIDEServices라는

전역변수를 찾을 수 있는데 이를 통해 각 서비스 인터페이스를 억세스할 수 있다.

 

이 변수값은 Delphi나 C++Builder IDE가 값을 할당시킨다.

 

이 변수를 이용해 IOTAxxxxServices들을 얻어낼 수 있다.

 

각 서비스를 얻기 위해서는 QueryInterface 메쏘드나 as를 이용한다.

 

as를 이용한 방법이나 QueryInterface를 이용해 인터페이스를 찾아오는 방법은

Open Tools API에 국한된 것이 아니라 오브젝트 파스칼의

interface에서 기본적으로 이용되는 방법이다.

 

as를 통해 인터페이스에 대한 타입캐스트가 이루어진다.

 

용법은 아래와 같다.

 

object as interface

 

예를들어, 아래의 소스는

파일 오픈 다이얼로그로 선택한 파일을 파일을 새로운 소스창으로 여는 예이다.

 

BorlandIDEServices가 IOTAActionServices로 타입캐스트 되는 부분을 살펴보기 바란다.

BorlandIDEServices를 타입캐스트 해 얻을 수 있다.

 

with TOpenDialog.Create(nil) do begin

Filter := 'Delphi files|*.bpg;*.dpr;*.dpk;*.pas|All files (*.*)|*.*';

if Execute then

(BorlandIDEServices as IOTAActionServices).OpenFile(FileName);

Free;

end;

 

QueryInterface를 이용해 서비스를 얻어오는

다른 방법이 있는데 C++Builder등에서 이용하는 방법이며

델파이에서도 이용할 수 있다 .

 

아래의 예는 IOTAModuleServices를 QueryInterface 메쏘드를 통해 얻어오고

그 중 현재 편집중인 파일의 소스 에디터를 얻어내는 소스다.

 

728x90
반응형

'Delphi > 프로시저-함수' 카테고리의 다른 글

Delphi Open ToolsAPI (3)  (0) 2023.12.26
Delphi Open ToolsAPI (2)  (0) 2023.12.19
윈도우 사용자 이름 알아내기  (0) 2023.11.17
최상위 윈도우 얻기  (0) 2023.11.01
델파이 숫자 한글변환  (0) 2023.10.27

댓글