From YYpBD's MediaWiki
[강좌] 델파이 IDE를 확장해주는 ToolsAPI를 배워보자
이 강좌는 델파이5를 기준으로 작성했습니다.
ToolsAPI는 스탠다드, 프로페셔날, 엔터프라이즈 모두 공통으로 사용되며 대부분 C++빌더에서도 사용될수 있으나 언어적특성으로 인한 차이는 있습니다.
이 강좌를 작성하는데 참조한 내용은 델파이5에 들어있는 소스코드와 데모 외에는 아무것도 없으며 서적이나 인터넷사이트등 그 어떤것도 참조하지 않았습니다.
이 강좌는 무료사이트에 한해서 수정없이 퍼갈수 있습니다.
이 강좌를 양병규의 승낙없이 유료사이트나 집필등에 이용하시면 이젠 가만있지 않겠습니다.
(무단으로 사용하는 것은 정보공유가 아니라 저작권침해입니다. 무단 복제당하는데 이젠 질렸습니다. 제발좀…)
이 강좌에 대한 의문사항이나 질문등은 일체 받지 않습니다.
양 병 규 bkyang@inprise.co.kr
ToolsAPI 강좌를 시작하며....
ToolsAPI라는것이 델파이,C++빌더에 있는지 조차도 모르는사람이 상당히 많습니다.
그도 그럴 것이 도움말에도 없고 볼랜드사이트에도 관련된 정보가 그다지 많지 않기때문일것입니다.
하지만 델파이안에 관련소스코드가 들어있고 데모도 무려(?) 네 가지나 있어서 조금만 관심을 가지면 쉽게 배울수 있을것입니다.
이번 강좌를 통해서 ToolsAPI를 배워보고 자신만의 델파이 환경을 구축해 보시기 바랍니다.
이 강좌에서는 ToolsAPI의 모든 부분을 다 하진 못합니다. 생각보다 양이 많거든요 예제 몇 개를 만들어보는것으로 ToolsAPI를 이해하고 만드는 방법을 알수 있도록 할것입니다.
● ToolsAPI란?
델파이와 C++빌더는 사용자가 임의의 기능을 추가 할 수 있도록 ToolsAPI란 것을 제공합니다.
이런 방식은 오토 캐드와 같은 다른 프로그램에서도 간혹 볼 수 있었으나 델파이는 전문 소프트웨어 개발툴답게 사용자가 직접 코딩을해서 기능을 추가 할 수 있도록 만들어져있습니다.
● ToolsAPI를 사용해서 델파이 IDE의 기능을 추가하기위해 알아야 할 것은...
1. ToolsAPI는 콤포넌트패키지를 이용하게되므로 콤포넌트를 만들 줄 알아야 하겠습니다. 콤포넌트 자체가 필요한 게 아니라 콤포넌트패키지가 필요한 것이므로 실제로 콤포넌트는 만들 줄 몰라도 될 것 같습니다.
2. ToolsAPI는 OLE인터페이스를 사용합니다. 그러므로 OLE인터페이스를 기초적인 수준에서 다룰 줄 알아야 하겠습니다. 하지만 OLE인터페이스를 모른다고 해서 전혀 겁낼 필요는 없습니다. 일반적인 클래스와 크게 다를 게 없거든요... ToolsAPI는 OLE인터페이스로 되어있지만 델파이는 윈도의 OLE기능을 사용하진 않고 모두 자체 구현된 것입니다.
3. ToolsAPI는 당연한 얘기지만 폼디자이너 같이 비주얼 하게 디자인하는 부분은 전혀 없습니다. 오로지 코딩으로만 이루어집니다. 마치 콤포넌트 맹글듯이요..
4. ToolsAPI는 악용 될 소지가 있습니다. 작업중인 파일들을 특정인에게 메일로 전송한다거나 작업중인 파일안에 바이러스와 같은 것 들을 강제로 코딩 해 넣게 한다거나 하는 등등의 나쁜 사람들 머리로 상상 할 수 있는 대부분의 일들을 할 수가 있습니다. ToolsAPI를 이용하는 개발자는 개발자이기 이전에 델파이를 사랑하고 아끼는 사람이어야 겠습니다.
● ToolsAPI의 구성
┏━━━━━━━━━━━━━━━━┓
┃ 델파이엔진 ┃
┃ ┌──────────┐ ┃
┃ │ 서버인터페이스 │ ┃ (컴파일러,다이나믹파서,파일IO등)
┗━━┷━━━━┳━━━━━┷━━┛
┏━━━━━━━┻━━━━━━━━┓
┃ ToolsAPI엔진 ┃ (OLE와 같은 역할)
┗━━━━━━━┳━━━━━━━━┛
┏━━┯━━━━┻━━━━━┯━━┓
┃ │클라이언트인터페이스│ ┃ (메인폼,폼디자이너,오브젝트인스펙터,
┃ └──────────┘ ┃ 소스코드에디터,프로젝트매니져,사용자정의폼등)
┃ 델파이 IDE ┃
┗━━━━━━━━━━━━━━━━┛
이 그림에서 가장 밑에있는 부분이 바로 델파이의 IDE입니다. 델파이 IDE는 미리 정의되어있는 인터페이스를 이용해서 ToolsAPI엔진과 연결이 되고 ToolsAPI엔진은 역시 똑 같은 구조의 인터페이스를 통해서 델파이엔진과 연결이 되는 방식입니다.
여기서 우리가 배워야 할 부분은 이미 정의되어있는 ToolsAPI 인터페이스의 종류와 사용법을 배우고 그것을 통해서 IDE를 구성하는 방법을 배울것입니다.
● 인터페이스를 사용하지 않는 방식…
델파이에는 Application, Screen과 같이 프로젝트 전역변수로 선언되어져있는 것들이 있습니다. 아시다시피 델파이의 IDE 도 모두 TCustomForm으로부터 상속되어졌기 때문에 IDE폼들이 생성될 때 Screen의 Forms에 등록됩니다. 그러므로 우리는 델파이의 Application과 Screen을 이용하면 현재 델파이가 사용하는 폼들을 다룰수 있게됩니다. 예컨데 Application.MainForm은 델파이의 메인폼, 즉 TAppBuilder를 가리키게되고 Application.MainForm.Left := 0; 과 같이 작성하면 델파이의 메인폼의 Left가 0 위치로 이동 됩니다.
이 방식은 새로운 기능을 추가하는 것보다는 이미 만들어져 있는 폼들의 기능을 변경하거나 모양새를 바꿀 때 사용합니다.
● 간단한 예제따라 해 보기…
우선 위에서 말한 예를 한 번 해보도록 하겠습니다.
1. 델파이5를 실행합니다.
2. 새 패키지를 만듭니다. File -> New 를 클릭해서 New페이지에 있는 Package를 선택하고 OK를 클릭하면 새 패키지가 만들어집니다.
우선 기본적인 정보부터 작성하도록 하겠습니다.
3. Options버튼을 클릭합니다.
4. Description에 적당한 제목을 써 넣습니다. 예컨데 “델파이 ToolsAPI 예제” 와 같이. 이 내용은 Component -> Install Packages를 클릭하면 나오는 패키지목록에 나타나게 되므로 이쁘게 지어야 합니다.
5. Usage Options를 Designtile only로 체크합니다. 말그대로 이 패키지는 디자인타임에만 사용하도록 하는겁니다.
6. 저장을 합니다. ToolsAPITest.dpk로 저장했다고 치겠습니다.
7. 새 유닛을 하나 만들어서 패키지파일이 저장된 경로에 저장합니다. ToolsAPIMain.pas로 저장했다고 치겠습니다.
8. 패키지폼에서 Add를 클릭해서 금방 저장한 ToolsAPIMain.pas를 패키지에 추가합니다. 이 때 주의할점은 Add 버튼을 클릭할 때 밑에 있는 트리뷰에서 포커스가 반드시 Contains에 가 있어야 합니다. 포커스가 Contains나 그 하위 노드에 있는 상태에서 Add를 클릭하면 패키지에 유닛을 추가한다는것이고 Requires나 그 하위 노드에 포커스가 있을 때 Add를 클릭하면 현재 패키지에서 다른 패키지를 사용하게 합니다.
9. ToolsAPIMain.pas가 열려있는 상태겠죠? 안열려 있으면 여세요…
10. ToolsAPIMain.pas의 implementation밑에 uses 를 써넣고 Forms를 uses에 추가합니다.
11. ToolsAPIMain.pas에 다음 두 라인을 추가합니다.
initialization
finalization
그러면 이렇게 되겠지요
unit ToolsAPIMain;
interface
implementation
uses
Forms;
initialization
finalization
end.
12. initialization 밑에 다음 코드를 작성합니다.
Application.MainForm.Left := Application.MainForm.Left + 100;
13. 이제 패키지폼의 Install을 클릭합니다. 그러면 컴파일이 되고 패키지가 등록이됩니다. 등록이 되는 순간 ToolsAPIMain.pas의 initialization에 있는 루틴이 실행됩니다.
제대로 했다면 컴파일이 완료되면 델파이의 메인폼이 오른쪽으로 100픽셀만큼 이동할것입니다.
Component -> Install Packages를 클릭하면 패키지리스트가 나오는데 “델파이 ToolsAPI 예제”가 추가되어있는 것을 볼수 있을겁니다. “델파이 ToolsAPI 예제”의 체크박스를 True로 했다가 False로 했다가 해보십시오 체크가 될때마다 델파이의 메인폼이 이동하는 것을 볼수 있을겁니다.
모든 ToolsAPI는 이런 구조로 만들어집니다. 패키지를 하나 만들어서 유닛을 추가하고 그 유닛의 초기화루틴이나 콤포넌트 등록할 때 사용하는 Register프로시져등에서 동작을 하게끔 만들어집니다.
● 유닛셀렉터를 만들어보자..
Ctrl + F12을 누르면 유닛리스트가 나오고 Shift + F12를 누르면 폼리스트가 나옵니다.
이와 비슷한기능을 가진놈을 하나 맹글어보겠습니다.
한가지 다름점이 있다면 유닛과 폼을 동시에 처리해서 폼이 있는 유닛은 폼이 뜨도록하고 폼이 없는 유닛은 그냥 소스코드에디터가 뜨도록 만들어보겠습니다.
먼저 새 패키지를 하나 만듭시다 별써 까먹진 않았겠죠? 위의 <간단한 예제따라 해 보기>의 1-6번항목까지 그대로 하시면 되겠죠?
그 다음 새 폼을 하나 만들어서 패키지와 같은 경로에 저장하고 패키지에 추가합니다.
폼에다가 리스트박스 하나, 버튼 두 개를 올려놓습니다.
버튼 한 개는 확인, 한 개는 취소로 쓸겁니다.
확인버튼의 ModalResult는 mrOK, 취소버튼은 mrCancel로 지정합니다.
우선 uses에가다 Exptintf, ToolIntf, Menus 이렇게 세 개의 유닛을 추가합니다. 밑에다가 말고 위에있는 uses에다가 추가하세요..
이제 폼의 private에 procedure InitFileList;를 추가 합니다.
이 프로시져는 이름그대로 현재프로젝트의 유닛목록을 얻어오는 역할을 할겁니다. 물론 이 패키지의 핵심이 되는 부분입니다. 이 프로시져의 구현부에는 이렇게 적어넣습니다.
procedure TUnits_Form.InitFileList;
var
i: Integer;
Strings: TStringList;
FileExt: String;
begin
ListBox.Items.BeginUpdate;
try
ListBox.Items.Clear;
Strings := TStringList.Create;
try
ToolServices.GetVcsList( Strings );
if Strings.Count > 0 then
for i := 0 to Strings.Count - 1 do
begin
FileExt := UpperCase( ExtractFileExt( Strings[ i ] ) );
if ( FileExt = '.DPR' ) or ( FileExt = '.PAS' ) then
ListBox.Items.Add( Strings[ i ] );
end;
finally
Strings.Free;
end;
finally
ListBox.Items.EndUpdate;
end;
end;
핵심이 되는 부분은 ToolServices.GetVcsList( Strings );입니다. ToolServices는 Exptintf.pas에 전역으로 선언되어져 있는 놈인데… 프로젝트를 열고, 닫고, 저장하고 유닛을 추가하고 삭제하고 하는 등등의 기능을 가지고 있습니다.
GetVcsList메소드는 현재 프로젝트에서 다루어지는 모든 파일의 목록을 TStringList에다가 얻어다 줍니다. 유닛뿐만 아니라 폼파일, 환경파일등까지 모두 포함됩니다.
나머지 루틴은 그렇게얻은 파일목록중에서 확장자가 DPR, PAS인것만 리스트박스에 추가하는 루틴입니다.
이제 유닛목록을 얻었으니 이 폼을 띄워주고 유닛을 여는 루틴을 만들면 되겠네요…
우선 유닛을 여는 루틴을 먼저 해봅시다..
역시 private에다가 procedure OpenUnit;라는 프로시져를 하나 맹급시다… 그리고 구현부에는 이렇게 써넣읍시다..
procedure TUnits_Form.OpenUnit;
begin
if ListBox.ItemIndex >= 0 then
ToolServices.OpenFile( ListBox.Items[ ListBox.ItemIndex ] );
end;
ToolServices의 OpenFile메소드를 사용해서 유닛을 열었습니다.
이젠 뭐가 남았죠?
폼을 띄워주는 부분을 해야하는데…
가장 간편한 방법이 메인숏컷을 하나 만드는게 좋습니다.
ToolServices는 델파이의 메뉴를 TIMenuItemIntf형을 통해서 다룰수 있게 해 줍니다.
델파이 메뉴의 아이템하나가 하나의 TIMenuItemIntf형으로 처리됩니다.
TIMenuItemIntf형에는 Insert라는 메소드가 있지요
그러니깐 델파이메인메뉴 TIMenuItemIntf형을 얻어서 그 놈의 Insert메소드를 이용해서 메뉴를 하나 추가하면 됩니다.
Insert메소드는 새로 추가된 메뉴아이템을 다시 TIMenuItemIntf형으로 리턴해줍니다. 그러므로 해제할때는 그 TIMenuItemIntf형을 Free하면 됩니다.
그럼 세가지가 필요하겠네요 새로추가된 메뉴아이템을 보관할 TIMenuItemIntf형변수하나, 메뉴를 추가하는 프로시져하나 삭제하는 프로시져하나…
자 해봅시다…
private에다가 MenuItemIntf: TIMenuItemIntf;을 선언해 놓고
procedure CreateShortCut;
procedure DeleteShortCut;
procedure MenuClick(Sender: TIMenuItemIntf);
이렇게 세 개의 프로시져를 만듭니다.
마지막 MenuClick은 새로 생긴 메뉴의 OnClick 이벤트로 사용할 프로시져입니다.
그리고 구현은 이렇게…
procedure TUnits_Form.CreateShortCut;
var
FileMenuItemIntf: TIMenuItemIntf;
begin
FileMenuItemIntf := ToolServices.GetMainMenu.FindMenuItem( 'FileMenu' );
if FileMenuItemIntf <> nil then
MenuItemIntf := FileMenuItemIntf.InsertItem( 0, '유닛리스트', 'UnitsListMenu', '', TextToShortCut( 'Ctrl+Shift+F12' ), 0, 0, [mfEnabled], MenuClick );
end;
procedure TUnits_Form.DeleteShortCut;
begin
if MenuItemIntf <> nil then
MenuItemIntf.Free;
end;
procedure TUnits_Form.MenuClick(Sender: TIMenuItemIntf);
begin
if ShowModal = mrOK then OpenUnit;
end;
이렇게해서 메뉴를 추가하고 삭제합니다. 이 메뉴의 숏컷을 'Ctrl+Shift+F12'로 지정했습니다.
이제 이벤트를 연결해 봅시다.
폼이 생성될 때 메뉴를 추가하고 폼이 해제될 때 메뉴를 삭제하고 폼이 쇼될 때 유닛목록을 얻어오면 되겠지요…
procedure TUnits_Form.FormCreate(Sender: TObject);
begin
CreateShortCut;
end;
procedure TUnits_Form.FormShow(Sender: TObject);
begin
InitFileList;
end;
procedure TUnits_Form.FormDestroy(Sender: TObject);
begin
DeleteShortCut;
end;
이제 마지막…
initialization
Units_Form := TUnits_Form.Create( nil );
finalization
Units_Form.Free;
end.
이렇게 해서 패키지가 등록되면 폼이생성되고 패키지가 제거되면 폼도제거되게 해줍니다.
이제 Install을 클릭해보세요..
그리고 새 프로젝트를 해서 Ctrl+Shift+F12를 누르면 유닛리스트가 뜨고 하나를 선택한후 확인을 클릭하면 해당 유닛이 열릴겁니다.
전체 유닛입니다.
unit Unit_Frm;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, ToolWin, ImgList, StdCtrls, ExtCtrls,
Exptintf, ToolIntf, Menus;
type
TUnits_Form = class(TForm)
ListBox: TListBox;
Panel1: TPanel;
Button2: TButton;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
MenuItemIntf: TIMenuItemIntf;
procedure CreateShortCut;
procedure DeleteShortCut;
procedure InitFileList;
procedure MenuClick(Sender: TIMenuItemIntf);
procedure OpenUnit;
public
end;
var
Units_Form: TUnits_Form;
implementation
{$R *.DFM}
procedure TUnits_Form.CreateShortCut;
var
FileMenuItemIntf: TIMenuItemIntf;
begin
FileMenuItemIntf := ToolServices.GetMainMenu.FindMenuItem( 'FileMenu' );
if FileMenuItemIntf <> nil then
MenuItemIntf := FileMenuItemIntf.InsertItem( 0, '유닛리스트', 'UnitsListMenu', '', TextToShortCut( 'Ctrl+Shift+F12' ), 0, 0, [mfEnabled], MenuClick );
end;
procedure TUnits_Form.DeleteShortCut;
begin
if MenuItemIntf <> nil then
MenuItemIntf.Free;
end;
procedure TUnits_Form.InitFileList;
var
i: Integer;
Strings: TStringList;
FileExt: String;
begin
ListBox.Items.BeginUpdate;
try
ListBox.Items.Clear;
Strings := TStringList.Create;
try
ToolServices.GetVcsList( Strings );
if Strings.Count > 0 then
for i := 0 to Strings.Count - 1 do
begin
FileExt := UpperCase( ExtractFileExt( Strings[ i ] ) );
if ( FileExt = '.DPR' ) or ( FileExt = '.PAS' ) then
ListBox.Items.Add( Strings[ i ] );
end;
finally
Strings.Free;
end;
finally
ListBox.Items.EndUpdate;
end;
end;
procedure TUnits_Form.OpenUnit;
begin
if ListBox.ItemIndex >= 0 then
ToolServices.OpenFile( ListBox.Items[ ListBox.ItemIndex ] );
end;
procedure TUnits_Form.FormCreate(Sender: TObject);
begin
CreateShortCut;
end;
procedure TUnits_Form.FormShow(Sender: TObject);
begin
InitFileList;
end;
procedure TUnits_Form.FormDestroy(Sender: TObject);
begin
DeleteShortCut;
end;
procedure TUnits_Form.MenuClick(Sender: TIMenuItemIntf);
begin
if ShowModal = mrOK then OpenUnit;
end;
initialization
Units_Form := TUnits_Form.Create( nil );
finalization
Units_Form.Free;
end.
● 유용한 기능들….
ToolsAPI는 생각보다 많은 기능을 가지고있습니다. 그도그럴것이 델파이 자체가 워낙 많을 일을 하고 있기 때문에 그렇겠지요….
지금부터는 부분부분 별로 짤막짤막하게 기능별로 설명을 하겠습니다. 주로 소스코드를 나열할 테니 따라해보시기 바랍니다.
◆ Help 메뉴에 메뉴아이템을 추가하려면….
TNotifierObject와 IOTAWIzard, IOTAMenuWizard를 모두 다중으로 상속받아서 새로운 클래스를 만들어서 처리한다…
이 새로운 클래스는 Register프로시져에서 RegisterPackageWizard를 이용해서 등록한다.
unit Main_Unit;
interface
procedure Register;
implementation
uses
Windows, Classes, Forms, Menus, ToolsAPI, ActiveX, Controls;
type
TMyMenu = class(TNotifierObject, IOTAWIzard, IOTAMenuWizard)
public
function GetMenuText: String;
function GetIDString: String;
function GetName: String;
function GetState: TWizardState;
procedure Execute;
end;
procedure Register;
begin
RegisterPackageWizard( TMyMenu.Create as IOTAWizard );
end;
procedure TMyMenu.Execute;
begin
//이 메뉴의 온클릭이다.
//여기에다가 원하는 일을 한다.
end;
//새 메뉴아이템의 ID. 임의대로 붙여주면된다.
function TMyMenu.GetIDString: String;
begin
Result := 'MyMenu';
end;
//새 메뉴아이템의 캡션
function TMyMenu.GetMenuText: String;
begin
Result := '메뉴의 캡션';
end;
//세 메뉴아이템의 Name
function TMyMenu.GetName: String;
begin
Result := 'MyMenu';
end;
//새 메뉴아이템의 상태
function TMyMenu.GetState: TWizardState;
begin
Result := [wsEnabled]
end;
end.
◆ 콤포넌트 팔레트를 tsFlatButtons타입으로 바꿀려면…
이런경우는 ToolsAPI로 직접처리가 되지 않으므로 Application.MainForm을 이용하여 탭콘트롤을 찾아서 바꿔주면됩니다.
procedure ChangeTabStyle;
var
TabControl: TTabControl;
i: Integer;
begin
for i := 0 to Application.MainForm.ComponentCount - 1 do
if Application.MainForm.Components[ i ] is TTabControl then
begin
TabControl := TTabControl( Application.MainForm.Components[ i ] );
TabControl.Style := tsFlatButtons;
Break;
end;
end;
initialization
ChangeTabStyle;
end.
◆ 소스코드에디터에 글씨를 써넣으려면…
활성화되어있는 소스코드에디터에 캐럿이 있는 위치에 글씨는 써 넣는 방법입니다.
procedure WriteSourceCode( S: String );
var
ModuleServices: IOTAModuleServices;
SourceEditor: IOTASourceEditor;
EditView: IOTAEditView;
EditPosition: IOTAEditPosition;
begin
if BorlandIDEServices.QueryInterface(IOTAModuleServices, ModuleServices) = S_OK then
begin
if ModuleServices.CurrentModule.GetModuleFileEditor( 0 ).QueryInterface(
IOTASourceEditor, SourceEditor) = S_OK then
begin
EditView := SourceEditor.GetEditView( 0 );
EditPosition := EditView.Position;
EditPosition.InsertText( S );
end;
end;
EditPosition := nil;
EditView := nil;
SourceEditor := nil;
ModuleServices := nil;
end;
◆ 소스코드에디터에 핫키를 추가하려면
델파이 소스코드에디터에는 핫키가 많이 있습니다. 예컨데 Ctrl+Shift+I, Ctrl+Shift+R 등등 과 같은…
자신만의 기능을 추가하기위해 새로운 핫키를 추가하려면
TNotifierObject, IUnknown, IOTANotifier, IOTAKeyboardBinding등을 다중으로 상속받아서 새 클래스를 만들고 Register프로시져에서 등록합니다.
이렇게 만들어진 놈은 Tools -> Editor Options를 클릭하면 나오는 Editor Properties폼의 Key Mappings페이지의 Enhancement modules에 추가됩니다.
unit Main;
interface
procedure Register;
implementation
uses
Windows, Classes, Menus, ToolsAPI, ActiveX, Controls;
type
TMyHotKey = class(TNotifierObject, IUnknown, IOTANotifier, IOTAKeyboardBinding)
procedure MyHotKeyProc(const Context: IOTAKeyContext; KeyCode: TShortCut;
var BindingResult: TKeyBindingResult);
function GetBindingType: TBindingType;
function GetDisplayName: string;
function GetName: string;
procedure BindKeyboard(const BindingServices: IOTAKeyBindingServices);
end;
//핫키를 지정한다 첫번째인자가 핫키, 두번째는 실행할 메소드...
procedure TMyHotKey.BindKeyboard(const BindingServices: IOTAKeyBindingServices);
begin
BindingServices.AddKeyBinding( [ ShortCut( Ord( 'S' ), [ ssCtrl, ssShift ] ) ], MyHotKeyProc, nil );
end;
//핫키를 눌렀을때 실행될 메소드
procedure TMyHotKey.MyHotKeyProc(const Context: IOTAKeyContext; KeyCode: TShortCut;
var BindingResult: TKeyBindingResult);
var
Key: Word;
Shift: TShiftState;
begin
ShortCutToKey( KeyCode, Key, Shift );
if ( IsCtrl and IsShift ) and ( Key = Ord( 'S' ) ) then
begin
ShowMessage( '콘트롤+시프트+S를 눌렀다' );
end;
BindingResult := krHandled;
end;
function TMyHotKey.GetBindingType: TBindingType;
begin
Result := btPartial;
end;
//Editor Properties폼 에보여질 제목
function TMyHotKey.GetDisplayName: string;
begin
Result := '나만의 에디터 핫키';
end;
function TMyHotKey.GetName: string;
begin
Result := 'MyHotKey';
end;
procedure Register;
begin
( BorlandIDEServices as IOTAKeyBoardServices ).AddKeyboardBinding( TMyHotKey.Create );
end;
end.
◆ 현재 프로젝트에 새 폼을 추가하려면
ToolServices.CreateCppModule( '', '', 'Form', '', nil, nil, nil,
[ cmAddToProject, cmNewForm, cmShowForm, cmUnNamed ] );
◆ 현재 프로젝트에 새 유닛을 추가하려면
ToolServices.CreateCppModule( '', '', '', '', nil, nil, nil,
[ cmAddToProject, cmNewUnit, cmShowSource, cmUnNamed ] );
● 마치며…
마칩니다.
이 강좌의 내용은 ToolsAPI 전체의 100분의 1정도밖에 되지 않습니다.
나머지 100분의 99는 숙제….
델/파/이/만/세