최근 뜻한 바(?) 있어 델파이 강좌글은 더이상 쓰지 않으려 했으나, 델마당에 가보니 무척 재밌는 질문이 하나 올라와 있어서 여기 소개하고 이 문제를 여러분들과 함께 풀어 봤으면 한다.
[제목 : 함수를 변수에다 기억해서 변수로 실행하기]
그 내용인즉,
과정 1: 다음과 같은 배열 변수 정의 문이 있다고 가정하자.
a : Array[1..3] of TSomeSuperUltraType;
과정 2: 다음과 같이 a 배열의 각 요소 값으로 캔버스에 그리는 작업을 등록시킨다.
a[1]:= Image1.Canvas.Rectangle( 10, 10, 100, 100 ); // 사실 이 문법 자체가 델파이에서는 불가능하다.
a[2]:= Image1.Canvas.LineTo( 100, 100 ); //
a[3]:= Image1.Canvas.LineTo( 200, 200 ); //
과정 3 : 그리고 어딘가에서 다음과 같은 코드를 수행한다고 가정하자.
for i := Low(a) to High(a) do
Execute(a[i]);
위 코드의 실행 결과는 다음과 같이 되어야 한다.
Image1.Canvas.Rectangle( 10, 10, 100, 100 );
Image1.Canvas.LineTo( 100, 100 );
Image1.Canvas.LineTo( 200, 200 );
이 질문의 요지인즉, 실행 코드를 보관할 수 있는 데이타 타입이 델파이에 있는가이다. 불행스럽게도 그런 타입은 델파이에는 없다. 예전 DOS 시절에 Dbase나 Clipper를 사용해본 사람이라면 이 문제를 해결하려면 매크로라는 기능이 필요하다는 것을 알 것이다. DBase의 매크로란 실행 코드를 문자열로 보관하고 이를 나중에 실행하는 것이다. 예를 들어..
a = "DoSomeFunc(10, 30)"; // 실행 코드를 문자열 변수에 보관
&a // DoSomeFunc(10, 30) 이 실행된다.
클리퍼는 eval 이라는 특수한 함수가 있는데, 문자열을 나중에 실행하는데 좀더 유연한 방법을 제공했었다.
a = "DoSomeThing(x, y)"
eval(10, 20, a) <-- DoSomeThing(10, 20) 이 실행된다.
불행스럽게도 순수 컴파일러 환경인 델파이는 인터프리터나 런타임 언어에서만 가능한 이런 매크로 기능을 제공하지 않는다. 그렇다면 이 문제를 어떻게 풀어야 될까? 사실, 종종 이런 기능이 델파이에 있었으면 하는 생각이 들때가 있긴 하다.
[문제 요약]
질문자가 원하는 것은, 프로그램 실행시에 사용자가 원하는 그리기 작업들을 배열로 저장해 뒀다가, 나중에 한꺼번에 실행시키기를 원한다는 것이다. 그 그리기 작업 실행 순서는 사용자 맘대로 이며, 어떤 그리기 작업인지도 사용자가 결정한다. 따라서 이 경우 함수포인터는 별로 문제 해결에 도움이 되지 않는다.
이 문제해결책의 한 방법으로 인터프리터 패턴을 사용할 수도 있다. 예를 들면 파스칼 스크립트 같은 파스칼 인터프리터 콤포넌트를 사용하는 것이다. 그러나 외부 콤포넌트 사용없이 이 문제를 한번 풀어 보자.
여러분들은 이 문제를 어떻게 푸시겠는가? 기막힌 아이디어를 고대해 본다. 아마도 여러 델파이 개발자들을 탄복하게 할 기막힌 아이디어들이 많이 나올 것이라고 기대해 본다. 조만간 내가 생각해낸 방법도 한번 선보이도록 하겠다.
|