본문 바로가기

Team Thoth

[작업일지] 그루핑 완료(alpha 0.4)

그루핑에 대한 작업이 일단락 됐다.

겹치면 그룹화 되는 좀 일반적(파워포인트 등에서는 그룹 메뉴가 있다.)이지 않은 방식이지만 편한 것 같아서 시도해 봤다.

초반에 방향을 잘못잡아 반정도 작업한 것을 완전히 갈아 엎었지만

오히려 갈아 엎으며 코드도 짧고 깨끗해 지고 

내가 모든 것을 구현하지 않고 프레임워크(파이어몽키)의 메소드들을 이용했다.

(DoAddObject, DoRemoveObject)


그리고 Unittest의 도움을 대단히 많이 봤다.(해보니 좋다 TDD)

아직은 어설프지만 리펙토링 및 대규모 코드 갈아 엎기 할때 놓치지 않아서 마음이 편하다.


어쨌든 그루핑을 끝내서 0.4 버전이 완료가 됐고

마음같아서는 다음버전 기능인 문자입력을 들어가고 싶지만 더 큰것을 준비해야 하기에 잠시 멈춰야 겠다.

다음달 20일 발표 준비를 해야겠다.


제목은 "나무를 심는 프로그래머".





글만쓰면 아쉬우니 팁을 가끔 하나씩 넣어야 겠다.


팁이라고 할것 까진 없고 인터페이스를 사용하는 이유중 하나인 implement이다.


구현하다보면 전혀 다른 객체(클래스)인데 동일한 구현이 필요한 경우 사용된다.


예를들면 

드로윙 툴(토트캔버스)에서 

아이템을 캔버스(컨텐츠)에 올릴 수도 있고 아이템위에 아이템을 올릴 수도 있다.


그리고 캔버스에서 아이템으로 부모아이템 간 옮길 수 도 있다.

즉 부모가 어떤 놈인지 구분하기 대단히 어렵다.


위 상황에서 부모(Object.Parent)의 클래스 타입에 따라 분개하는 방법도 있지만

인터페이스를 사용하면 짧고 편리하게 구현이 가능하다.


아래와 같은 구조가 있다고 치자.

아이템과 컨텐츠가 IThItemContainer라는 인터페이스를 상속 받는다.


  IThItemContainer = interface
  ['{76A11805-EA40-40B6-84A1-71B4DF277DCD}']
    procedure ContainChildren(AContainer: TThItem);
  end;

  TThItem = class(TControl, IThItem, IThItemContainer)
  public
    procedure ContainChildren(AContainer: TThItem);
  end;

  TThContents = class(TControl, IThItemContainer)
  private
    procedure ContainChildren(AContainer: TThItem);
  end;

아래와 같이 부모를 찾았는데 FindParent

부모의 타입(Parent는 TFmxObject이다) 과는 상관없이 ContainChildren 메소드를 호출한다.(15번째 줄)

팁은 Supports라는 함수이다. COM을 사용할 때 많이 사용되는 좋은 함수이다.


procedure TThCanvasEditor.MouseUp(Button: TMouseButton; Shift: TShiftState; X,  Y: Single);
var
  ItemContainer: IThItemContainer;
begin
  inherited;

  if IsDrawingItem and Assigned(FDrawItem) then
  begin
    FDrawItem.Selected := True;

    // Set Parent
    FDrawItem.Parent := FContents.FindParent(FDrawItem); // 부모 찾기

    // Contain Children
    if Supports(FDrawItem.Parent, IThItemContainer, ItemContainer) then
      ItemContainer.ContainChildren(FDrawItem);

    if Assigned(FOnItemAdded) then
      FOnItemAdded(FDrawItem);
  end;
end;

인터페이스 사용하면 어렵지만 유용한 놈입니다^^


끝~