2012-06-25 7 views
8

Come si ottengono tutti i percorsi degli indirizzi per funzioni/procedure/metodi che sono sovraccarichi?Recupero dei percorsi degli indirizzi di un metodo di sovraccarico

Ad esempio, Dialogs.MessageDlgPosHelp è sovraccarico con due versioni diverse di esso, uno senza un pulsante predefinito e uno con. Come posso ottenere le posizioni degli indirizzi per le due funzioni?

+0

Viene discusso l'indirizzo del metodo di classe sovraccarico [qui] (http://stackoverflow.com/questions/10083448/trttimethod-invoke-function-doesnt-work-in-overloaded-methods). A proposito, nel mio Delphi 7, MessageDlgPosHelp non è sovraccarico, ed è solo una funzione normale, non un metodo. Il termine "Metodo" si riferisce alla funzione o alla procedura di una classe. – Hendra

+1

Il termine 'metodo' per me significa una funzione o una procedura, possibilmente di una classe. Ho modificato la domanda per riflettere il tuo significato del termine "metodo". –

+1

Mi piace la risposta di TLama (e ho spuntato di conseguenza). Avrei preferito qualcosa di simile al modo RTTI (come suggerito dal collegamento di Hendra) che avrebbe funzionato con la versione precedente di Delphi (che non ha RTTI esteso). –

risposta

15

In base a this thread e in base a quanto indicato da Thomas Mueller, è possibile definire tipi con le stesse firme dei metodi di cui si desidera ottenere gli indirizzi (per ciascun sovraccarico). Se dichiari quindi le variabili di questi tipi e assegni loro dei puntatori al metodo, assicurerai che il compilatore scelga il sovraccarico corretto per il tipo di variabile conosciuto e inoltre che non li ignorerà se non verrebbero utilizzati da nessuna parte nel codice (alcuni sovraccarichi potrebbero non essere collegati nel tuo binario).

Quindi, in base alla sua idea che potrebbe cerca le MessageDlgPosHelp sovraccarichi funzione come questa:

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, questo farà il lavoro – Hendra

0

Inoltre è possibile creare classe derivata che esporrà questo metodi di sovraccarico come semplici metodi con nomi diversi, lanciare qualsiasi istanza di quella classe alla nuova classe e usa facilmente l'indirizzo dei tuoi metodi di wrapper.

+0

In questo caso, i metodi sovraccaricati sono methonds "globali" –

+0

Quando si dice "metodo globale" intendevi una procedura o una funzione di un'unità, e non un metodo di alcuna classe o record ? In questo caso puoi semplicemente aggiungere la propria procedura o funzione wrapper con il proprio nome e chiamare semplicemente "metodo globale" al loro interno. Senza mai alcun casting. – Nashev

+0

Sì - Un "metodo globale" è una funzione/procedura di un'unità e non una classe/record. Dato che questo articolo è vicino a mezzo decennio, penso che cercassi una soluzione che reindirizzasse tutti (in questo caso) i metodi MessageDlg a un metodo personalizzato, senza dover toccare molti file nel codice base. Alla fine, siamo andati in questo modo, cambiando le chiamate mentre le troviamo. –

Problemi correlati