2012-06-25 13 views
8

¿Cómo obtengo todas las direcciones de las funciones/procedimientos/métodos que están sobrecargadas?Obtención de ubicaciones de direcciones de un método de sobrecarga

Por ejemplo, Dialogs.MessageDlgPosHelp está sobrecargado y tiene dos versiones diferentes, una sin un botón predeterminado y otra con. ¿Cómo obtendré las direcciones de las dos funciones?

+0

Obteniendo la dirección del método de clase sobrecargado se discute [aquí] (http://stackoverflow.com/questions/10083448/trttimethod-invoke-function-doesnt-work-in-overloaded-methods). Por cierto, en mi Delphi 7, MessageDlgPosHelp no está sobrecargado, y es solo una función normal, no un método. El término "Método" se refiere a la función o procedimiento de una clase. – Hendra

+1

El término 'método' para mí significa una función o procedimiento, posiblemente de una clase. He editado la pregunta para reflejar su significado del término "método". –

+1

Me gusta la respuesta de TLama (y marqué en consecuencia). Hubiera preferido algo como el modo RTTI (como lo sugiere el enlace de Hendra) que funcionaría con la versión anterior de Delphi (que no tiene RTTI extendido). –

Respuesta

15

Basado en this thread y lo que Thomas Mueller señaló allí, puede definir tipos con las mismas firmas que los métodos cuyas direcciones desea obtener (para cada sobrecarga). Si luego declaras las variables de esos tipos y les asignas punteros a los métodos, te asegurarás de que el compilador elija la sobrecarga correcta para tu tipo de variable conocido y además que no los ignorará si no se usan en ninguna parte del código. (algunas sobrecargas pueden no estar vinculadas en su binario).

Así que basado en su idea que podría busca la MessageDlgPosHelp sobrecargas función como esta:

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, esto hará el trabajo – Hendra

0

También puede crear clase derivada que expondrá estos métodos de sobrecarga como métodos sencillos con diferentes nombres, lanzar cualquier instancia de esa clase a nueva clase y usa fácilmente la dirección de tus métodos de contenedor.

+0

En este caso, los métodos sobrecargados son 'globales' metonds –

+0

Cuando dice "método global" se refirió a un procedimiento o una función de una unidad, y no a un método de ninguna clase o registro ? Para este caso, puede simplemente agregar un procedimiento o función de contenedor propio con su propio nombre y simplemente llamar a ese "método global" dentro de ellos. Sin ningún tipo de trucos de lanzamiento. – Nashev

+0

Sí - Un "método global" es una función/procedimiento de una unidad y no una clase/registro. Como este elemento tiene casi una década de antigüedad, creo que busqué una solución que redirija todos los métodos (en este caso) MessageDlg a un método personalizado, sin tener que tocar muchos archivos en la base de códigos. Al final, hemos avanzado de esta manera, cambiando las llamadas a medida que las encontramos. –

Cuestiones relacionadas