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

Delphi Open ToolsAPI (2)

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

Delphi Open ToolsAPI

728x90

 

 

 

 

 

Delphi Open ToolsAPI 메뉴의 OnClick등의

이벤트는 오브젝트의 메쏘드를 필요로 한다.

 

따라서 무작정 빈 유닛을 기준으로 삼아 작성하기 보다는

DataModule을 기반으로 하는 것이 좋다.

 

혹은 자신이 아예 새로운 오브젝트 클래스를

작성할 생각이라면 그렇게 해도 좋다.

 

여하간 이벤트가 필요하거나 혹은 컴퍼넌트가 필요한 경우

메인모듈은 오브젝트를 기반으로 작성하는 것이 좋다.

 

필자가 제시하는 방법은 DataModule이 메인 모듈이 되고

기타 옵션적용등을 위해 필요한 폼은 메인모듈에서

생성해서 보여주는 것이다.

 

될 수 있으면 Form을 메인모듈로 잡지 않는 것이 좋다.

DataMoudle 보다 리소스를 더 많이 잡아먹을 것이기 때문이다.

 

다음의 사항을 기억하자.

 

IDE의 활성과 함께 인스톨된 패키지가 로드되고

Register 부분과 initialization, finalization이 처리된다.

 

Register 프로시져는 필요한 경우 Wizard등을 등록하도록 작성한다.

 

메인모듈의 initialization 부분에서는

필요한 초기화를 진행시키는데 주로 메인모듈을 생성시킨다.

 

메인모듈의 finalization 부분이 호출되는 시점은

IDE가 닫히는 시점, 즉 델파이를 닫은 경우 이므로

이곳을 통해 메인모듈의 해제등을 처리한다.

 

등록된 메뉴의 처리나 다른 Notifier의 처리등을 위해

하나의 DataModule이 항상 생성된 채로 남아 있는다.

 

옵션등을 위해 가시화된 윈도우를 보여줘야 할 필요가 있는 경우

메인모듈에서 생성해서 보여주고 바로 해제 시켜 버린다.

 

메인모듈은 가장 기본적인 사항만 품고 있고

사용자 반응 후의 구체적인 처리는 다른 폼등에 맡긴다.

 

메인 모듈의 작성

 

패키지 프로젝트에 하나의 데이터 모듈을 추가하고 적장한 이름으로 저장한다.

어플리케이션이 실행되는 것이 아니라 컴퍼넌트 모듈이

IDE에 의해 불리워지는 것이므로 DataModule은 initialization에서 생성하고

finalization에서 해제하도록 한다.

 

initialization

DMOTATest := TDMOTATest.Create(nil);

finalization

DMTOATest.Free;

 

이렇게 한 후 DMOTATest의 OnCreate에서 필요한 초기화를 모두 하고

OnDestroy에서 필요한 해제를 모두 진행시키면 된다.

초기화 중에는 레지스트리에서 값을 읽고 메뉴를 IDE에 등록하거나

필요한 오브젝트등을 생성시킨다.

 

작성한 테스트는 TForm이 메인모듈로 자리잡고 있는데

단지 설명의 편의를 위한 것일 뿐이고 실제로는 DataModule을 이용할 것을 권한다.

 

 

INTAServices를 이용한 메뉴 등록 

 

IDE에 메뉴를 등록하는 방법은 간단하다.

IDE의 메뉴는 우리가 일반적으로 어플리케이션 작성에서 사용하고 있는 TMainMenu다.

이것을 INTAServices를 통해 가져오면 마음대로 메뉴를 추가하고

수정하는 것이 가능하다.

 

private

FIDEMainMenu: TMainMenu;

...

FIDEMainMenu := (BorlandIDEServices as INTAServices).MainMenu;

가져온 FIDEMainMenu를 이용해 IDE의 Help 메뉴뒤에

메뉴를 추가하는 예을 살펴보자.

 

private

FMenuItem: TMenuItem;

...

FMenuItem := TMenuItem.Create(FIDEMainMenu);

with FMenuItem do

begin

Name := 'OTATestMenuItem';

Caption := '&OTA Test';

OnClick := Self.MenuItemClick;

ShortCut := TextToShortCut('CTRL+SHIFT+ALT+T');

end;

 

FIDEMainMenu.Items.Insert(FIDEMainMenu.Items.Count, FMenuItem);

 

위의 방법은 예를 든 것이고 실제로는 위의 방법으로 사용할 수 없다.

패키지를 인스톨 했을 때는 핫키가 잘 자리잡고 있다.

 

하지만 델파이를 종료하고 다시 시작하면

여러분이 지정한 핫키는 모두 사라져 버린다.

 

이것은 시점의 문제다.

여러분이 메뉴를 추가하고 핫키를 등록하는것은

IDE의 패키지 로드과정에서 이루어진다.

 

이 로드 과정이 끝나면 IDE가 각 메뉴에 Action을 부여한다.

이 과정에서 여러분이 부여한 핫키는 - 비록 중복되지 않더라도 - 사라져 버린다.

 

이런 문제를 비켜가기 위해서 필자는 Action을 이용했다.

Action을 변경하려고 할 때 OnUpdate가 호출되는데

여기서 강제적으로 다시 핫키를 부여해 버린다

물론 다른 방법이 있을 수 있을 것이다.

 

TreeView에서 특정 메뉴를 선택하고 핫키등을 부여하여

"메뉴적용" 버튼을 누르면 메뉴가 그곳에 자리잡게 된다.

 

이런 처리를 하기 위한 소스코드는 아래와 같다.

 

private

FIDEMainMenu: TMainMenu;

FMenuItem: TMenuItem;

FMenuAction: TAction;

FBeforeMenu:

string;

FShortCut:

string;

...

 

procedure TFOTASample.MenuItemClick(Sender: TObject);

begin

Self.Show;

end;

 

// 메뉴의 Caption과 핫키가 변경되지 못하게 막는다.

 

728x90
반응형

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

윈도우에 폰트 설치/제거 하기  (0) 2024.03.05
Delphi Open ToolsAPI (3)  (0) 2023.12.26
Delphi Open ToolsAPI  (0) 2023.12.14
윈도우 사용자 이름 알아내기  (0) 2023.11.17
최상위 윈도우 얻기  (0) 2023.11.01

댓글