오버로드 된 함수/프로 시저/메서드의 모든 주소 위치를 얻으려면 어떻게해야합니까?오버로드 메서드의 주소 위치 얻기
예를 들어, Dialogs.MessageDlgPosHelp에는 두 가지 버전이 있습니다. 하나는 기본 버튼이없고 다른 하나는. 두 기능에 대한 주소 위치는 어떻게 얻을 수 있습니까?
오버로드 된 함수/프로 시저/메서드의 모든 주소 위치를 얻으려면 어떻게해야합니까?오버로드 메서드의 주소 위치 얻기
예를 들어, Dialogs.MessageDlgPosHelp에는 두 가지 버전이 있습니다. 하나는 기본 버튼이없고 다른 하나는. 두 기능에 대한 주소 위치는 어떻게 얻을 수 있습니까?
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;
+1이 작업을 수행 할 것입니다 – Hendra
당신은 다른 이름과 간단한 방법으로이 오버로드 방법을 노출됩니다 파생 클래스를 생성의 인스턴스를 캐스팅 할 수는 수도 자신의 아이디어를 기반으로
그래서이 같은 MessageDlgPosHelp
기능 과부하를 찾습니다 해당 클래스를 새 클래스에 추가하고 래퍼 메서드의 주소를 쉽게 사용할 수 있습니다.
오버로드 된 메서드는 '글로벌'메도입니다. –
"전역 메서드"를 사용하면 클래스 또는 레코드의 메서드가 아니라 장치의 프로 시저 또는 함수를 의미합니까? ? 이 경우에는 자체 래퍼 프로 시저 또는 함수를 자체 이름으로 추가하고 그 안에 "전역 메서드"라고 부를 수 있습니다. 캐스팅 트릭없이. – Nashev
예 - "글로벌 메소드"는 클래스/레코드가 아닌 유닛의 함수/프로 시저입니다. 이 항목은 5 년 반이 되었기 때문에 코드 기반의 많은 파일을 건드리지 않고 MessageDlg 메서드를 모든 사용자 지정 메서드로 리디렉션하는 솔루션을 수행 한 것 같습니다. 결국, 우리는 우리가 그들을 찾아 전화를 변경, 이런 식으로 갔다. –
오버로드 된 클래스 메서드의 주소를 얻는 방법은 [여기] (http://stackoverflow.com/questions/10083448/trttimethod-invoke-function-doesnt-work-in-overloaded-methods)에서 설명합니다. 그건 그렇고, 내 델파이 7, MessageDlgPosHelp 과부하되지 않습니다, 그리고 그것은 단지 함수가 아니라 메서드입니다. "방법"이란 용어는 클래스의 기능 또는 절차를 의미합니다. – Hendra
나를위한 '방법'이라는 용어는 가능한 클래스의 기능이나 절차를 의미합니다. 나는 '방법'이라는 용어의 의미를 반영하도록 질문을 편집했다. –
나는 TLama의 대답을 좋아한다. Delphi의 이전 버전 (RTTI가 확장되지 않은 버전)에서 작동하는 RTTI 방식 (Hendra의 링크에 의해 제안 된)과 같은 것을 선호했을 것입니다. –