Kline777 Posted April 2, 2013 at 03:44 PM Report #501269 Posted April 2, 2013 at 03:44 PM Boas, No .net se nós tivermos um objecto do tipo TObject podemos fazer qualquer coisa tipo InstanciaObj.ChamarFunc(); O compilador nao faz a minima ideia se esta função existe ou nao, mas deixa compilar na mesma. Existe algo semelhante no Delphi, que vi à pouco tempo mas que nao consigo recordar. Basicamente tenho uma variavel que pode ser de varios tipos diferentes, nao descendentes e quero chamar uma funçao que vou implementar nesses tipos, mas nao quero fazer os respectivos castings para evitar 'uses' desnecessarios. Obrigado
nunopicado Posted April 2, 2013 at 07:53 PM Report #501296 Posted April 2, 2013 at 07:53 PM Não percebi o que precisas... Por acaso não estás a falar do tipo Variant? "A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!" > Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.
Kline777 Posted April 2, 2013 at 09:48 PM Author Report #501310 Posted April 2, 2013 at 09:48 PM Class 1 tem um evento Chamado Func(); Class 2 tem um evento Chamado Func(); num form tenho uma variavel chama obj do tipo TObject que contem um objecto q pode ser da class 1 ou 2 mas que eu nao sei, NEM QUERO SABER de qual é. No .net posso fazer logo obj.Func(); e só na execuçao é que ele se preocupa se o obj tem de facto a func() ou nao. Ou seja, o compilador nao dá erro, porque assume que na altura da execução em que la chegar o obj será de uma class que implemente o func()
nunopicado Posted April 2, 2013 at 10:45 PM Report #501316 Posted April 2, 2013 at 10:45 PM Com typecast sei que dá TClass1(obj).Func() Sem isso, sei que dá, que também já li isso, mas também não me lembro de como era... "A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!" > Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.
Kline777 Posted April 3, 2013 at 08:16 AM Author Report #501334 Posted April 3, 2013 at 08:16 AM Pois... eu tenho a impressao que ja vi isso sem qalquer cast... mas se calhar ando a sonhar ^^
nuno.fonseca Posted April 9, 2013 at 03:59 PM Report #502359 Posted April 9, 2013 at 03:59 PM (edited) No Delphi não conheço uma forma "direta" de fazer o que pretendes. O que viste podem ter sido chamadas a funções de objectos ActiveX sem usar TypeLibrary (TLB), sabendo os nomes dos métodos que se pretendem chamar. No que pretendes fazer tens logo uma problema, que são os paramteros de chamada da função: ou são sempre os mesmos, ou então tens que saber qual a classe original do tal TObject para saberes que parametros passar. Se tens controlo sobre os objetos de que pretendes chamar os métodos/funções, então podes partir de uma classe base que declara esse(s) métodos como virtuais (ou usas um interface, que obriga à implementação dos métodos na classe de implementação do interface). Opção 1: Fazer as coisas como mandam as regras e evitando erros de runtime: - Classe Base TBaseClass = class private public procedure CallMe; virtual; end; - Classe1: TDerivedClass1 = class(TBaseClass) private public procedure CallMe; end; implementation procedure TDerivedClass1.CallMe; begin ShowMessage('Olá 1'); end; - Classe 2 TDerivedClass2 = class(TBaseClass) private public procedure CallMe; end; implementation procedure TDerivedClass2.CallMe; begin ShowMessage('Olá 2'); end; se o objeto que tens derivar de uma das duas classes, então também deriva da BaseClass e podes fazer: if obj is TBaseClass then TBaseClass(obj).CallMe; Opção 2 - usando RTTI e ponteiros, correndo os riscos inerentes à sua utilização (funciona desde o Delphi 6, possivelmente desde anteriores também): só funciona para chamar métodos published dos objetos (tipo properties), porque estamos a recorrer à rotina que o Delphi usa para "ligar" os eventos dos objetos às respetivas rotinas (ver help acerca do TObject.MethodAddress) type TProc = procedure of object; // declara um tipo que aponta para um procedure sem parametros (implementado por um objecto, daí o "of object") TFunc = function(x: integer; y: string): Boolean of object; // declara um tipo que aponta para uma função com parametros (implementado por um objecto, daí o "of object") // podem-se "juntar" os dois conceitos e declarar um tipo que aponta para um procedure com parametros ou funções sem parametros e até usar parametros com valores por defeito procedure ExecuteMethod(obj: TObject; MethodName : String); var Proc: TProc; Routine: TMethod; begin Routine.Data := Pointer(obj); // obj é o objeto que implementa o método a chamar, o tal TObject que tens Routine.Code := obj.MethodAddress(MethodName); // tenta encontrar um endereço de um método com o nome indicado if not Assigned(Routine.Code) then // se não encontrou o endereço, então o método não é publicado pelo obj (não está na secção [b]published[/b]) Exit; Proc := TProc(Routine); // aponta a variável para o endereço do método -> atenção que tem que haver compatibilidade entre o tipo da variável e o método que se pretende executar, senão dá runtime error / AV Proc; // chama o método // se fosse uma função do tipo TFunc, com o mesmo nome (MethodName) Func := TFunc(Routine); Func(10,'abcd'); end; Edited September 18, 2013 at 06:35 PM by apocsantos
Kline777 Posted April 9, 2013 at 04:38 PM Author Report #502366 Posted April 9, 2013 at 04:38 PM Pois... já ando a pensar em fazer pela primeira opçao que deste aí... até ja tenho os forms descendentes de outro, é o mais facil.
nuno.fonseca Posted April 10, 2013 at 11:36 AM Report #502506 Posted April 10, 2013 at 11:36 AM (edited) Além de mais fácil é mais seguro e resulta em código mais limpo e flexível. Edited April 10, 2013 at 11:37 AM by nuno.fonseca
Gilson Nunes Posted September 6, 2013 at 10:13 PM Report #523732 Posted September 6, 2013 at 10:13 PM apesar q seria mt melhor ele usar intefaces. pq ele teria a seu favor todo o poder da Tipagem e da verificação de assinatura de metodos. digo. interfaces
Gilson Nunes Posted September 7, 2013 at 05:20 PM Report #523783 Posted September 7, 2013 at 05:20 PM Com typecast sei que dá TClass1(obj).Func() Sem isso, sei que dá, que também já li isso, mas também não me lembro de como era... mas com isso ai ele vai chamar o Func da classe TClass1 e não o da classe real do obj. sem falar no problema q ele vai chamar o func() da TClass1 e passando o obj no EAX como se ele fosse realmente um TClass1. assim até q seria mais seguro: (obj as TClass1).Func(); pq vc teria uma verificação de tipo. 1 Report
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now