안녕하세여.. 타락임다..^^
제가 원시초보일때부터 궁금해왔던건데, 아직도 모르겠어여...
도저히 이해가 안가서 그런 문장 볼때마다 머리에 안들어 갈려구 빠작빠작 거려서
억지로 집어넣느라구 피곤합니다..
부디 자세한 답변 바람다..꾸벅..
":=" 는 왼쪽 변수(변수, 함수포인터 등등)에 오른쪽 변수를 대입하는(쉽게 말해 집어
넣는) Operator 이자나여..
보통 서브클래싱 할때 ":=" 오른쪽에 메세지 받을 함수를 적져..
Application.OnMessage := AppMessage;
":=" 왼쪽이 원래 함수고, 오른쪽이 새로운 함수져..
그동안 곰곰히 생각해봤는데,
전 이런류의 문장이 도저히~ 이해가 안가여..ㅠㅠ
문장을 보면, Application.OnMessage 함수 포인터에 AppMessage 함수포인터를
넣는 다는 의미자나여.
그렇다면 기능을 본다면 Application.OnMessage가 AppMessage로 작동하겠져.--
그리고 AppMessage 는 변함이 없겠져..-- 그렇게 본다면,
AppMessage := Application.OnMessage;
라고 사용되야 한다구 생각하는데.....ㅠㅠ
가능하면 메모리와 어드레스로 설명해 주심 제가 쉽게 이해할수 있을거 같은데여..^^;;;
꼭 답변 바랍니다..
결론부터 말하자면 가능합니다. 때론 그렇게 사용해야 될 때도 있구요...
델파이에서는 함수포인터라고 하는 변수형을 지원합니다. 볼랜드파스칼에서도 있었던
데이타형인데요. 이건 함수(procedure, function)처럼 단독으로 실행도 가능하고요
변수처럼 연산식의 오른쪽, 왼쪽 어디에도 쓸수가 있습니다. 여기에 어떤 값을 대입하는
것도 가능하고요. 델파이에서의 이벤트 메소드는 모두 이 함수포인터입니다. 변수선언은
아래와 같은 방식으로하고요.
type
TIntegerFunction = function: Integer;
TProcedure = procedure;
TStrProc = procedure(const S: string);
TMathFunc = function(X: Double): Double;
var
F: TIntegerFunction;
Proc: TProcedure;
SP: TStrProc;
M: TMathFunc;
사용할 때는 이벤트메소드처럼 Proc := SomeProcedure이런식으로 대입할 수도 있고요
begin
Proc := SomeProcedure;
Proc; // SomeProcedure가 실행되겠죠...
end;
위와 같이 서브루틴(procedure, function)처럼 단독으로도 실행할 수 있습니다.
AppMessage := Application.OnMessage; 를 예를 들었는데 AppMessage가 함수포인터라면
가능합니다. Application.OnMessage이 메소드값을 원래대로 복원시켜야될때는 이렇게
많이 사용하죠. 이런 경우는 변수로서의 기능을 하는것입니다.
Application이 메세지를 받으면 OnMessage메소드를 실행함니다. 여기에 어떤 함수포인터가
대입되어 있으면 그 함수가 실행이 되겠죠... 아래처럼...
begin
Proc := SomeProcedure;
Proc; // SomeProcedure가 실행되겠죠...
end;
아래의 경우는 단지 AppMessage에 Application.OnMessage가 대입되는것밖에 없습니다.
AppMessage := Application.OnMessage;
이렇게 한다고 해서 Application이 AppMessage를 호출하는 것이 아니라 OnMessage에
들어가 있는 함수포인터를 실행합니다. 그냥 변수의 예를 들면 A := B; 하고 B := A;하고
다른 것과 같습니다.
흠... 말이 좀 횡설수설했는데요..
A := B;하고 B := A;가 다르다는 것만 아시면 둘의 차이점이 이해가 가시리라고 생각됩니다.
^^ 이해가 되셨나요? 되셨으면... 허허...
^^ 항상 즐코하세요.
타락천사 wrote:
> 안녕하세여.. 타락임다..^^
>
> 제가 원시초보일때부터 궁금해왔던건데, 아직도 모르겠어여...
>
> 도저히 이해가 안가서 그런 문장 볼때마다 머리에 안들어 갈려구 빠작빠작 거려서
>
> 억지로 집어넣느라구 피곤합니다..
>
> 부디 자세한 답변 바람다..꾸벅..
>
> ":=" 는 왼쪽 변수(변수, 함수포인터 등등)에 오른쪽 변수를 대입하는(쉽게 말해 집어
>
> 넣는) Operator 이자나여..
>
> 보통 서브클래싱 할때 ":=" 오른쪽에 메세지 받을 함수를 적져..
>
> Application.OnMessage := AppMessage;
>
> ":=" 왼쪽이 원래 함수고, 오른쪽이 새로운 함수져..
>
> 그동안 곰곰히 생각해봤는데,
>
> 전 이런류의 문장이 도저히~ 이해가 안가여..ㅠㅠ
>
> 문장을 보면, Application.OnMessage 함수 포인터에 AppMessage 함수포인터를
>
> 넣는 다는 의미자나여.
>
> 그렇다면 기능을 본다면 Application.OnMessage가 AppMessage로 작동하겠져.--
>
> 그리고 AppMessage 는 변함이 없겠져..-- 그렇게 본다면,
>
> AppMessage := Application.OnMessage;
>
> 라고 사용되야 한다구 생각하는데.....ㅠㅠ
>
>
> 가능하면 메모리와 어드레스로 설명해 주심 제가 쉽게 이해할수 있을거 같은데여..^^;;;
>
> 꼭 답변 바랍니다..