2016-09-01 3 views
2

of object 절로 선언 된 델파이 대리인을위한 조상이 있습니까?델파이의 객체 대리자에 대한 공통 조상

나는 TNotifyEvent 내 사용자 정의 위임에 대한 공통 조상을 찾을 필요가 :

TMyEvent = procedure(Sender: TObject; msg: stringh); of object; 

는 이러한 이벤트를 발사하기위한 보편적 인 방법을 만들 수 있습니다.

포인터를 사용해야합니까? 또는 TObject?

+0

당신이하려는 일의 예를 들려 줄 수 있습니까? 현재 필요한 매개 변수를 모두 제공하지 않고 메서드를 호출하여 발 안에 자신을 쏘려고하는 것처럼 보입니다. – Johan

+1

나는 당신이 '객체의 프로 시저 (송신자 : TObject)'와 '객체의 프로 시저 (송신자 : TObject, xyz : TSomehting)'가 어떻게 든 호환된다는 잘못된 가정하에 있다고 생각한다. 그들은 그렇지 않습니다! 전화 할 때 올바른 서명이없는 한 실패로 끝나는 잘못된 매개 변수를 전달합니다. – Johan

+0

제네릭을 사용하여 솔루션을 제안하고 싶습니다. 그러나 나는 완전한 답을 공식화하기에 충분한 정보가 없습니다. 'TList '을 만들고 나서 호출 할 수 있습니까? 네가하려는 일 이니? 그렇다면 그 문제에 대한 쉬운 대답을 얻었습니다. – Johan

답변

6

구현 세부 사항이 method pointers 인 경우 아래로 더러워 져야합니다. 이들은 더블 포인터 값으로 저장됩니다. 메소드 호출의 주제 (인스턴스)에 대한 포인터 하나와 메소드 자체에 대한 포인터 (코드).

System 단위의 유형 TMethod을 사용하여 메소드 포인터를 나타낼 수 있습니다. 당신은 이러한 유형의 사이 할당을 확인하기 위해 배역을 사용할 필요가

type 
    TMethod = record 
    Code, Data: Pointer; 
    end; 

:

uses 
    System.Classes; 

var 
    Event: TNotifyEvent; 
    Method: TMethod; 

begin 
    Method := TMethod(Event); 
    TMethod(Event) := Method; 
end. 

은 분명히이 중 어느 것도 입력 - 안전하지 그 선언은 (단순 제거 비교 연산자와)과 같이 보이는 그래서 당신은 정확성을 보장해야합니다. 컴파일러는 당신을 도울 수 없습니다. 메서드 포인터로 작업 할 때 확인 된 유형 변환 연산자 인 as과 같은 것은 없습니다. 즉, TMethod에서 특정 메서드 포인터 유형으로 캐스트 할 때 TMethod 인스턴스가 실제로 캐스팅 할 메서드 포인터 유형의 인스턴스인지 확인해야합니다. 이 전체 과정을 유형이 지정된 포인터에서 유형이 지정되지 않은 포인터로 변환 한 다음 다시 원래대로 변환하는 것과 유사하다고 생각하십시오.

이제 임의의 메소드 포인터를 TMethod 인스턴스에 저장하려고한다면 괜찮습니다. 그러나 이후에 이러한 메서드를 실행해야 할 때 어떻게됩니까? 각 TMethod 인스턴스 뒤에 실제로 어떤 유형의 메소드 포인터가 있는지 알아야합니다. 그래서 어떻게 던지기, 필요한 인자들, 그리고 어떻게 호출해야 하는지를 알 수 있습니다. 이것은 원시 메소드 자체와 함께 메소드의 실제 유형에 대한 추가 정보를 저장해야 함을 의미합니다.

그래서 저는 여러분이 물어 본 질문에 아마도 대답했을 것이라고 생각하지만, 여러분에게 많은 도움이 될지 확신하지 못합니다. 귀하가 성취하고자하는 바와 귀하가 보유한 정보에 대해 더 많이 알 필요가 있다고 생각합니다.

예를 들어, 메서드를 저장할 필요가있을 때 메서드에 전달할 인수를 알고 있으면 변수 캡처를 사용하여 익명 메서드로 래핑 할 수 있습니다. 그렇게하면 타입 안전성을 유지하고 위에서 설명한 모호한 캐스트를 피할 수 있습니다. 아마도 동일하지 않은 메소드 포인터를 동일한 인터페이스로 변형하는 수단으로 partial application이 필요합니다. 다시 익명 메소드가 도움이 될 수 있습니다.

+0

예, 맞습니다. Esp 타입의 안전성에 비추어 볼 때, 당신은 앞뒤로 답이 있다고 생각합니다. 형식 안전 옵션을 먼저 사용하고 실패 할 경우에만 TMethod 형식 해킹을 제안해야합니다. – Johan

+2

아마, 근본적인 문제가 무엇인지 확실하지 않아 실제 질문에 집중했습니다. 그리고 이미 많은 돈을 벌어들이는 데 더 많은 시간을 할애해야합니다! –

+0

대답은 필요한 것보다 많은 정보를 제공합니다. 즉, TMethod에 대한 형식 변환을 통해 목록에 넣고 PMyEvent (listItem)^PMyEvent =^TMyEvent를 통해 목록에서 호출합니다. – Paul

관련 문제