cara... eu utilizo a RTTI pra fazer chamadas a métodos da classe... para manipular os métodos e propriedades eu utilizo helpers para as classes da RTTI... se eu não me engano funciona com os métodos de qualquer escopo (ou menos da strict private.. não tenho certeza)... na verdade esse código eu achei na internet.. no site da embarcadero mesmo... mas agora não consegui achar pra passar o link.. então vou colocar o exemplo de como eu utilizo aqui....
------------------------------- Uses TypInfo, ObjAuto, uRClassProperties; type // declara os helpers para a RTTI TParamInfoHelper = record helper for TParamInfo public function AsString: string; function NextParam: PParamInfo; end; TReturnInfoHelper = record helper for TReturnInfo public function AsString: string; end; TMethodInfoHeaderHelper = record helper for TMethodInfoHeader private function GetReturnInfo: PReturnInfo; public property ReturnInfo: PReturnInfo read GetReturnInfo; end; TObjectHelper = class helper for TObject public function RTTIMethodsAsString: string; end; function DescriptionOfMethod( Obj: TObject; MethodName: string ): string; implementation uses SysUtils; const SHORT_LEN = sizeof(ShortString) - 1; function DescriptionOfMethod( Obj: TObject; MethodName: string ): string; var header: PMethodInfoHeader; headerEnd: Pointer; Params, Param: PParamInfo; returnInfo: PReturnInfo; begin header := ObjAuto.GetMethodInfo( Obj, MethodName ); if Header.Len <= SizeOf(TMethodInfoHeader) - SHORT_LEN + Length(Header.Name) then begin Result := 'No rich RTTI'; exit; end; headerEnd := Pointer(Integer(header) + header^.Len); Params := PParamInfo(Integer(header) + SizeOf(header^) - SHORT_LEN + SizeOf(TReturnInfo) + Length(header^.Name)); Param := Params; Result := ''; while Integer(Param) < Integer(headerEnd) do begin Result := Result + Param.AsString + '; '; Param := Param.NextParam; end; Delete( Result, Length(Result)-1,2 ); returnInfo := header.ReturnInfo; if assigned( returnInfo.ReturnType ) then Result := Format( 'function %s( %s ): %s', [ MethodName, Result, returnInfo.AsString ] ) else Result := Format( 'procedure %s( %s )%s', [ MethodName, Result, returnInfo.AsString ] ); end; { TParamInfoHelper } function TParamInfoHelper.AsString: string; begin Result := ''; if pfResult in Flags then exit; Result := Name + ': ' + ParamType^.Name; if pfVar in self.Flags then Result := 'var ' + Result; end; function TParamInfoHelper.NextParam: PParamInfo; begin Result := PParamInfo(Integer(@self) + SizeOf(self) - SHORT_LEN + Length(Name)); end; { TMethodInfoHeaderHelper } function TMethodInfoHeaderHelper.GetReturnInfo: PReturnInfo; begin Result := PReturnInfo(Integer(@self) + SizeOf(TMethodInfoHeader) - SHORT_LEN + Length(Name)); end; { TReturnInfoHelper } function TReturnInfoHelper.AsString: string; var c: string; begin Assert( Version = 1, 'Version of ReturnInfo incorrect' ); if assigned( ReturnType ) then Result := ReturnType^.Name; Result := Result + ';'; case CallingConvention of ccRegister: ;// Default ccCdecl: c := 'cdecl'; ccPascal: c := 'pascal'; ccStdCall: c := 'stdcall'; ccSafeCall: c := 'safecall'; end; if c <> '' then Result := Result + ' ' + c + ';'; end; { TObjectHelper } function TObjectHelper.RTTIMethodsAsString: string; var MethodInfo: Pointer; Count: Integer; method: PMethodInfoHeader; i: Integer; begin MethodInfo := PPointer(Integer(PPointer(self)^) + vmtMethodTable)^; if MethodInfo <> nil then begin Count := PWord(MethodInfo)^; Inc(Integer(MethodInfo), 2); method := MethodInfo; for i := 0 to Count - 1 do begin Result := Result + DescriptionOfMethod(self, method.Name) + sLineBreak; Inc(Integer(method), PMethodInfoHeader(method)^.Len); end; end; end; ---------------------------------------------------------- feito isso, adicione essa unit a Uses que irá fazer as chamadas... e utilize normalmente os métodos da RTTI.... para recuperar as informacoes do objeto em um TreeView, por exemplo: --- procedure GenerateNodes(Obj: TObject; Node: TTreeNode); var i: byte; InternalNode1, InternalNode2, InternalNode3: TTreeNode; PropList: PPropList; PropListCount: byte; MethodInfo: Pointer; MethodListCount: byte; Method: PMethodInfoHeader; begin if Assigned(Node) then InternalNode1 := Node else InternalNode1 := TreeView1.Items.Add(nil, Obj.ClassName); //Propriedades InternalNode2 := TreeView1.Items.AddChild( InternalNode1, 'Propriedades'); PropListCount := GetPropList(Obj, PropList); for i := 0 to Pred(PropListCount) do begin InternalNode3 := TreeView1.Items.AddChild(InternalNode2, string(PropList[i].Name) + '=' + QuotedStr( string( GetPropValue( Obj, string(Proplist[i].Name) ) ) ) ); if PropType(Obj, string( PropList[i].Name )) = tkClass then GenerateNodes(GetObjectProp(Obj, string(PropList[i].Name)), InternalNode3); end; //Métodos InternalNode2 := TreeView1.Items.AddChild(InternalNode1, 'Métodos'); //MethodInfo contera toda a lista metodos encontrada na area da vmt //referente ao objeto passado no caso abaixo a variavel Obj MethodInfo := PPointer(Integer(PPointer(Obj)^) + vmtMethodTable)^; if MethodInfo <> nil then begin //Retorna a qtd de metodos encontrados MethodListCount := PWord(MethodInfo)^; Inc(Integer(MethodInfo), 2); method := MethodInfo; for i := 0 to Pred(MethodListCount) do begin TreeView1.Items.AddChild(InternalNode2, string( Method.Name )); Inc(integer(Method), PMethodInfoHeader(Method)^.Len); end; end; end; ----------------- crie uma função para executar o método: function ExecMethod(AObj: TObject; AMethodName: string; // objeto e nome do Metodo const ParamIndexes: array of Integer; // indice de parametros const Params: array of Variant): Variant; // valor dos parametros var Method: PMethodInfoHeader; begin try Method := GetMethodInfo(AObj, ShortString(AMethodName)); if Assigned( Method ) then Result := ObjectInvoke(AObj, Method, ParamIndexes, Params); finally end; end; --------------- para invocar um método, vc passa teu objeto, o nome do método e possiveis parametros, por exemplo: var Nome: string; begin Nome := VarToString(ExecMethod(AObj: TObject; 'getNomeCompleto', [], []); ShowMessage(Nome); --------------------- se não estiver conseguindo recuperar o método, tenta usar a diretiva METHODINFO na declaracao das tuas classes: {$M+} ou {$METHODINFO ON} TClasse = class end; {$M-} ou {$METHODINFO OFF} divirta-se ai... hehehe... espero q ajude.... o/ Em 19/07/2010 16:18, eric_developer escreveu: > Não consegui resolver e vou deixar isso de lado. > Talvez o delphi não permita (mesmo me parecendo tão ilógico) ou é uma > caixa preta até mesmo para uma lista de quase 5000 pessoas. > > Obrigado aquelas que tentaram ajudar, há uns dias o Bruno da > Embarcadero disse que era possivel, espero que um dia nos mostre como > rsrs, e que não seja nada que dependa do Delphi 2010 ou 2020. > > Grato, > Eric > > --- Em delphi-br@yahoogrupos.com.br > <mailto:delphi-br%40yahoogrupos.com.br>, "eric_developer" > <developer.syst...@...> escreveu > > > > Boa tarde pessoal, > > > > alguem sabe como obter o ponteiro de métodos existentes ? no > exemplo, se eu criar o método "teste" para o form2, funciona, > retornando o ponteiro. > > > > No lugar de form2, usarei componentes edit, combobox, etc e metodos > existentes. > > > > myCallMethod( edit1, 'SETFOCUS' ) ; > > myCallMethod( form3, 'SETFOCUS' ) ; > > > > procedure TForm2.teste ; > > begin > > ShowMessage('OLA'); > > end; > > > > > > procedure TForm2.Button1Click(Sender: TObject); > > var > > routine : TMethod ; > > Begin > > > > routine.data:=pointer(form2) ; > > routine.Code:=Form2.MethodAddress('teste') ; // Nome do metodo > > if routine.Code <> nil then > > begin > > ShowMessage('OK'); > > end; > > > > end; > > > > Grato, > > Eric Developer Systems > > [As partes desta mensagem que não continham texto foram removidas]