Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 강좌/문서
Delphi Programming Tutorial&Documents
[44] 중복 코드 제거를 위한 공통 이벤트 처리 방법(동적 이벤트 처리)
주정섭 [jjsverylong] 5972 읽음    2004-10-30 08:10
제목:중복 코드 제거를 위한 공통 이벤트 처리 방법(동적 이벤트 처리)

델파이 게시판에서 재밌는 질문을 하나 찾았다. 이 질문 내용을 요약하면 다음과 같다.

[질문 내용 시작]

....제목 : 동적 이벤트 Procedure할당 관련....

반복되는 코딩을 줄여 볼 방법이 없을까 요즘은 고민을 하게 되네요. 여러 폼의 OnShow 이벤트에 공통된 루틴을 실행해야할 필요가 있어서, 이를 처리하기 위해 다음과 같은 클래스를 만들었습니다.

Type
    TLibClass = class
  Public
      class procedure onshow(Sender:TObject);
    end;

Implementatin

Class procedure onshow(Sender:TObject)
begin
  공통된 내용 코드들
end;

이런식으로 클래스를 만들어 놓고 폼의 OnCreate 이벤트에서 다음과 같이 처리했습니다.

OnShow := LibClass.onshow;

요렇게 해서 중복을 피했습니다....

그런데.. 이런 꽁수를 생각하고 나니 다시 문제가 생기네요...

form1에서는 memo1.setfocus; 라는 별도의 코딩이 필요하고
form2에서는 edit1.setfocus; 라는 별도의 코딩이 필요한데....

이와 같이 form 별도 공통된 내용을 처리하면서도, 별도의 다른 내용을 처리할 수 있도록 라이브러리를 구축을 할려면 어떻게 해야 할까요?

OOP의 대가님들....도움을 부탁드립니다.

[질문 내용 끝]

이 개발자의 중복코드를 피하려는 노력은 참으로 높이 평가할 만하다. 중복 코드가 많아지면 후일 최악의 사태를 불러올 수 있기 때문에, 어떻게든 중복코드는 제거함이 바람직하다. 또한 공통 루틴 처리를 위해서 별도의 클래스까지 만든 것도 좋은 시도이다. 질문자는 꽁수라고 했지만, 이 방법은 꽁수가 아닌 정석적인 객체지향 접근법이다.

그런데, 여러 개발자들이 이 개발자처럼, 객체지향에 서서히 맛을 들이기 시작하면서, 다음 단계에서 고민하게 된다. 객체지향에서 클래스는, 관련된 코드와 데이타를 합해서 어떤 작업을 보편화(라이브러리)화 하는 것인데, 클래스의 이런 보편성을 깨지 않으면서도 특수성을 어떻게 첨가하느냐라는 것이다.

이 개발자의 질문 내용 핵심은, 꺼집어낸 공통 코드에서 특정 폼마다 특정 루틴이 별도로 필요한데, 이를 어떻게 처리하는가이다. 일단 이 개발자의 질문에 대한 처리 방법만 제시해 보도록 하자.

다음은 첨부한 프라젝트의 메인폼 소스이다.

{...중략...}

type

  TGlobalEvent = class(TComponent)
  public
    FocusControl : TWinControl; // 포커스를 줘야할 콤포넌트
    procedure DoShow(Sender:TObject);
  end;

  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

{...중략...}

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  with TGlobalEvent.Create(Self) do
  begin
    FocusControl := Edit3;
    OnShow := DoShow;
  end;
end;

{ TGlobalEvent }

procedure TGlobalEvent.DoShow(Sender: TObject);
begin
  // 공통 작업 처리 코드
  ShowMessage('Gloval Event Show is called');
  // 특정 콘트롤로 포커스 주기
  FocusControl.SetFocus;
end;

위에서 제시한 방법은 사실 최선은 아니다. 비록 원래 질문 내용인 각 폼마다 특정 콘트롤에 포커스를 주는 것은 해결되었지만, 실전 프라젝트에서는 단순히 특정 콘트롤에 포커스 주는 것 이상으로, 각 폼마다 아주 별개적이고 복잡한 루틴을 실행해야하는 경우가 많기 때문이다.

이를 객체지향적으로 어떻게 해결할지는 11월 세미나에서 다루도록 하겠다. 사실 이 내용은 무지 복잡하고 한두회의 강좌로 이해될 성격의 것도 아니다.

[노트] 예제에서는 TGlobalEvent 클래스를 메인폼 소스에 두었지만, 실전 코딩에서는 별도 유닛에 둬야할 것이다.

세미나 주제로 참으로 좋은 소재를 던져 주신, 이 질문자에게 무지 고마움을 표하면서 이글을 마칠까 한다.

http://cafe.daum.net/delphinegong 델파이 강좌 주정섭

+ -

관련 글 리스트
44 중복 코드 제거를 위한 공통 이벤트 처리 방법(동적 이벤트 처리) 주정섭 5972 2004/10/30
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.