2012-06-25 4 views
8

오버로드 된 함수/프로 시저/메서드의 모든 주소 위치를 얻으려면 어떻게해야합니까?오버로드 메서드의 주소 위치 얻기

예를 들어, Dialogs.MessageDlgPosHelp에는 두 가지 버전이 있습니다. 하나는 기본 버튼이없고 다른 하나는. 두 기능에 대한 주소 위치는 어떻게 얻을 수 있습니까?

+0

오버로드 된 클래스 메서드의 주소를 얻는 방법은 [여기] (http://stackoverflow.com/questions/10083448/trttimethod-invoke-function-doesnt-work-in-overloaded-methods)에서 설명합니다. 그건 그렇고, 내 델파이 7, MessageDlgPosHelp 과부하되지 않습니다, 그리고 그것은 단지 함수가 아니라 메서드입니다. "방법"이란 용어는 클래스의 기능 또는 절차를 의미합니다. – Hendra

+1

나를위한 '방법'이라는 용어는 가능한 클래스의 기능이나 절차를 의미합니다. 나는 '방법'이라는 용어의 의미를 반영하도록 질문을 편집했다. –

+1

나는 TLama의 대답을 좋아한다. Delphi의 이전 버전 (RTTI가 확장되지 않은 버전)에서 작동하는 RTTI 방식 (Hendra의 링크에 의해 제안 된)과 같은 것을 선호했을 것입니다. –

답변

15

this thread을 기준으로하고 주소가 Thomas Mueller 인 경우 주소를 얻고 자하는 메소드 (각 오버로드에 대해)와 동일한 시그니처로 유형을 정의 할 수 있습니다. 그런 다음 해당 유형의 변수를 선언하고 메소드 포인터를 할당하면 컴파일러가 알려진 변수 유형에 적합한 오버로드를 선택하고 코드의 어느 곳에서나 사용되지 않으면 무시합니다 (일부 오버로드는 바이너리에서 링크되지 않을 수도 있습니다).

또한
type 
    TMessageDlgPosHelp1 = function(const Msg: string; DlgType: TMsgDlgType; 
    Buttons: TMsgDlgButtons; HelpCtx: Longint; X, Y: Integer; 
    const HelpFileName: string): Integer; 
    TMessageDlgPosHelp2 = function(const Msg: string; DlgType: TMsgDlgType; 
    Buttons: TMsgDlgButtons; HelpCtx: Longint; X, Y: Integer; 
    const HelpFileName: string; DefaultButton: TMsgDlgBtn): Integer; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
    MessageDlgPosHelp1: TMessageDlgPosHelp1; 
    MessageDlgPosHelp2: TMessageDlgPosHelp2; 
begin 
    MessageDlgPosHelp1 := MessageDlgPosHelp; 
    MessageDlgPosHelp2 := MessageDlgPosHelp; 
    ShowMessage(Format('%p; %p', [@MessageDlgPosHelp1, @MessageDlgPosHelp2])); 
end; 
+2

+1이 작업을 수행 할 것입니다 – Hendra

0

당신은 다른 이름과 간단한 방법으로이 오버로드 방법을 노출됩니다 파생 클래스를 생성의 인스턴스를 캐스팅 할 수는 수도 자신의 아이디어를 기반으로

그래서이 같은 MessageDlgPosHelp 기능 과부하를 찾습니다 해당 클래스를 새 클래스에 추가하고 래퍼 메서드의 주소를 쉽게 사용할 수 있습니다.

+0

오버로드 된 메서드는 '글로벌'메도입니다. –

+0

"전역 메서드"를 사용하면 클래스 또는 레코드의 메서드가 아니라 장치의 프로 시저 또는 함수를 의미합니까? ? 이 경우에는 자체 래퍼 프로 시저 또는 함수를 자체 이름으로 추가하고 그 안에 "전역 메서드"라고 부를 수 있습니다. 캐스팅 트릭없이. – Nashev

+0

예 - "글로벌 메소드"는 클래스/레코드가 아닌 유닛의 함수/프로 시저입니다. 이 항목은 5 년 반이 되었기 때문에 코드 기반의 많은 파일을 건드리지 않고 MessageDlg 메서드를 모든 사용자 지정 메서드로 리디렉션하는 솔루션을 수행 한 것 같습니다. 결국, 우리는 우리가 그들을 찾아 전화를 변경, 이런 식으로 갔다. –