후배 김용민군이 숙제를 하나 내줬다. -,.-;
네이트온 로그인 했더니.... 아래의 쪽지가 덩그라니 날아오는군... 햐햐......
문제 하나]
어떤 사람이 procedure a1~a1000까지 맹글어놨음.
단, 파라메터는 모두 같음.
형이 그걸 써야 되는데, 루프를 써서 풀어보세용.
알고 있는거면 대략 낭패~ ㅋㅋ
문제풀이는 잠시후에~
머 풀어볼려고 한건 아닌데... 우연히 답을 알게 되버렸다...
우리 용민군이 원하는 답이 아닐수도 있겠지만.. 덕분에 좋은걸 알아버렸네..
용민군~ 고마우이~ ㅋㅋ
>> 문제 풀이 보기 (정답이 아닐수도 ㅠㅠ)
>접기
풀이]
※ 전제조건 : 모든 프로시저는 같은 Type / 같은 Parameter를 사용한다.
1. Procedure 를 published 영역에 선언한다.
2. "MethodAddress"를 이용하면 Published 영역에 선언된 메쏘드의 주소를 가져 올 수 있다.
이유는 정확히 모르지만, published는 스트림화가 가능하기 때문이라는 속설이... -_-;;;
이와는 별도로 "FieldAddress"라는 함수는 멤버변수의 주소를 참조 가능하다.
(머 용민군이 프로시져에 대해서만 문제를 냈으므로 저건 스킵 -_-;)
3. 프로시저의 주소를 가져와 프로시저를 실행하는 함수는 다음과 같이 구현한다.
실행할 프로시저가 다음과 같다고 할때.
procedure TForm1.a1;
begin
...
end;
procedure TForm1.a2;
begin
...
end;
procedure TForm1.a3;
begin
...
end;
.......
procedure TForm1.a1000;
begin
...
end;
선언한 함수의 주소를 가져와 실제로 수행하는 함수를 구현한다.
procedure TForm1.ExecLoopProc(LoopProcStr : string);
var
LoopProc: procedure; <=프로시저의 타입을 구현해준다. 파라미터가 있는경우는 그것도 처리를...
begin
// published method의 시작번지를 구한다
LoopProc:= MethodAddress(LoopProcStr );
if Assigned(LoopProc) then
LoopProc; <=프로시저 실행~~~~~~~~ 야호~
end;
4. 이제 구현한 함수를 이용해서 a1~a1000까지의 함수를 실행해보자. 잇힝~
Var
iLoop : Integer;
Begin
For iLoop := 1 To 1000 Do Begin
ExecLoopProc(Format('a%d',[iLoop]);
End;
End;