Re: RES: RES: RES: [delphi-br] MethodAddress retornando NIL
Olá Eric, meu colega topou com este link e acho que se aproxima da sua necessidade. http://blog.marcocantu.com/blog/dynamic_methods_delphi_part3.html Eu não analisei mais a fundo e não tenho a certeza se é disso que você precisa. Boa sorte! *José Mário Silva Guedes* e-mail: jmariogue...@gmail.com [As partes desta mensagem que não continham texto foram removidas]
RES: RES: RES: [delphi-br] MethodAddress retornando NIL
Se você quer usar algo parecido com macro-substituição, o Delphi não dá suporte para isso, porquê simplesmente isso não é previsto na sua arquitetura. Em linguagens interpretadas, como o PHP, ou pseudo-interpretadas, como o (ainda vivo) Clipper, isso é possível (ou seja, pode ser mamão com açúcar, pois a arquitetura dessas linguagens assim o permite. Eu entendi o seu objetivo, por isso mesmo que sugeri uma ferramenta para scripting, por ser mais fácil nessa abordagem fazer tais chamadas dinâmicas, visto que um script pode ter código que pode ser criado e atribuído aos eventos de um objeto em tempo de execução e, ainda, poder ser chamado facilmente pelo seu nome. Sds. De: delphi-br@yahoogrupos.com.br [mailto:delphi...@yahoogrupos.com.br] Em nome de eric_developer Enviada em: quinta-feira, 15 de julho de 2010 13:22 Para: delphi-br@yahoogrupos.com.br Assunto: Re: RES: RES: [delphi-br] MethodAddress retornando NIL Colega, não é executar Scripts, por favor veja o que ja postamos. o pequeno e completo exemplo que foi postado, esta bem claro e fácil, é uma pena que há restrições e não consegui montar nada equivalente. O que faço facilmente em outra linguagem estruturada com poucos recursos OOP, parece ser mosca branca de zóio verde ou extravagante demais em Delphi rsrs. Só me resta aguardar, tentar outros caminhos ou desistir disso, o que acho tão simples, é um mistérios aos demais. Fiz uma pesquisa aqui, achei um colega querendo o mesmo (tópico de uns 2 anos), entrei em contato com ele e até hoje não conseguiu. --- Em delphi-br@yahoogrupos.com.br mailto:delphi-br%40yahoogrupos.com.br , Rubem Rocha rubem.ro...@... escreveu Eric, se você pensa em implementar algum tipo de automação em seus aplicativos, envolvendo a manipulação de elementos nele contidos, sugiro você pesquisar sobre ferramentas de scripting para Delphi. Uma boa alternativa, free e de código fonte aberto, é o PascalScript, da RemObjects (http://www.remobjects.com/ps). Caso não seja essa a sua necessidade, explique-a melhor, com riqueza de detalhes, para que possamos discutir uma alternativa técnica para tal. Sds. De: delphi-br@yahoogrupos.com.br mailto:delphi-br%40yahoogrupos.com.br [mailto:delphi-br@yahoogrupos.com.br mailto:delphi-br%40yahoogrupos.com.br ] Em nome de eric_developer Enviada em: quinta-feira, 15 de julho de 2010 12:07 Para: delphi-br@yahoogrupos.com.br mailto:delphi-br%40yahoogrupos.com.br Assunto: Re: RES: [delphi-br] MethodAddress retornando NIL Alosi, Desta forma eu também já tinha encontrado na internet e na documentação. Veja que se você usar sua rotina como exemplifiquei anteriormente, não funcionará: ExecMethod( edit1, 'SETFOCUS' ) --- Em delphi-br@yahoogrupos.com.br mailto:delphi-br%40yahoogrupos.com.br mailto:delphi-br%40yahoogrupos.com.br , jalosii jalosii@ escreveu Implementei sem problemas na semana passada em um sistema meu. Qual o real problema que vc está tendo? Sua procedure seria assim: unit Unit2; interface uses ...; type TForm2 = class(TForm) ... private procedure ExecMethod(NoObjecto: TObject; Nome_Metodo: String); ... var Form2: TForm2; type //tem que ser aqui, não sei explicar por que, mas se por acima do form no mesmo type causa erro TExec = procedure of object; ... procedure TForm2.ExecMethod(NoObjecto: TObject; Nome_Metodo: String); var Rotina: TMethod; Exec: TExec; begin Rotina.Data := Pointer(NoObjeto); Rotina.Code := NoObjeto.MethodAddress(Nome_Metodo);//Aqui que causa erro pra vc? if not Assigned(Rotina.Code) then exit; Exec := TExec(Rotina); Exec; end; ... O que eu percebi é se o método que vc quer chamar nã estiver nas declarações do FORM no lugar certo, o MethodAddress não encontra, tentei por em private e não achou, troquei o local da declaração pra acima do private e funcionou, no meu caso chamo uma procedure de outro form, pra que nesse não tenha acesso a banco de dados e está funcionando. Verifique teu código e se tiver mais erros nos avise pra ver se pudemos lhe ajudar. Alosi DigitalSystem Bento Gonçalves-RS [As partes desta mensagem que não continham texto foram removidas]
Re: RES: RES: RES: [delphi-br] MethodAddress retornando NIL
Errado Rubem, quando me referi que faço (não é comum outros usarem OOP no nível que utilizo) em outra linguagem, não é via macro-substituição, e conforme o caso isso é um péssimo hábito, mas tudo isso não importa. Ficar nas teorias disso ou aquilo não vamos sair do lugar. Delphi é uma linguagem que usa muito OOP, o que quero é uma pequena manipulação que já esta no objeto, não considero nada de radical para a linguagem fazer, veja que eu estaria passando o objeto o que não tornaria o processo as cegas, não é caso para scripts. Enfim, vamos deixar isso pendente, pois mais de 2000 maneiras de não conseguir fazer é facil, o objetivo é uma que ajude a resolver. Grato, Eric --- Em delphi-br@yahoogrupos.com.br, Rubem Rocha rubem.ro...@... escreveu Se você quer usar algo parecido com macro-substituição, o Delphi não dá suporte para isso, porquê simplesmente isso não é previsto na sua arquitetura. Em linguagens interpretadas, como o PHP, ou pseudo-interpretadas, como o (ainda vivo) Clipper, isso é possível (ou seja, pode ser `mamão com açúcar', pois a arquitetura dessas linguagens assim o permite. Eu entendi o seu objetivo, por isso mesmo que sugeri uma ferramenta para scripting, por ser mais fácil nessa abordagem fazer tais chamadas dinâmicas, visto que um script pode ter código que pode ser criado e atribuído aos eventos de um objeto em tempo de execução e, ainda, poder ser chamado facilmente pelo seu nome. Sds.
RES: RES: RES: RES: [delphi-br] MethodAddress retornando NIL
Eric, Note que a função SetFocus do TWinControl é PUBLIC e não PUBLISHED. Por isso o METHODADDRESS não vai achar o método na chamada ExecMethod( edit1, 'SETFOCUS' ) []´s Sergio Uetanabaro De: delphi-br@yahoogrupos.com.br [mailto:delphi...@yahoogrupos.com.br] Em nome de eric_developer Enviada em: quinta-feira, 15 de julho de 2010 15:15 Para: delphi-br@yahoogrupos.com.br Assunto: Re: RES: RES: RES: [delphi-br] MethodAddress retornando NIL Errado Rubem, quando me referi que faço (não é comum outros usarem OOP no nível que utilizo) em outra linguagem, não é via macro-substituição, e conforme o caso isso é um péssimo hábito, mas tudo isso não importa. Ficar nas teorias disso ou aquilo não vamos sair do lugar. Delphi é uma linguagem que usa muito OOP, o que quero é uma pequena manipulação que já esta no objeto, não considero nada de radical para a linguagem fazer, veja que eu estaria passando o objeto o que não tornaria o processo as cegas, não é caso para scripts. Enfim, vamos deixar isso pendente, pois mais de 2000 maneiras de não conseguir fazer é facil, o objetivo é uma que ajude a resolver. Grato, Eric --- Em delphi-br@yahoogrupos.com.br mailto:delphi-br%40yahoogrupos.com.br , Rubem Rocha rubem.ro...@... escreveu Se você quer usar algo parecido com macro-substituição, o Delphi não dá suporte para isso, porquê simplesmente isso não é previsto na sua arquitetura. Em linguagens interpretadas, como o PHP, ou pseudo-interpretadas, como o (ainda vivo) Clipper, isso é possível (ou seja, pode ser `mamão com açúcar', pois a arquitetura dessas linguagens assim o permite. Eu entendi o seu objetivo, por isso mesmo que sugeri uma ferramenta para scripting, por ser mais fácil nessa abordagem fazer tais chamadas dinâmicas, visto que um script pode ter código que pode ser criado e atribuído aos eventos de um objeto em tempo de execução e, ainda, poder ser chamado facilmente pelo seu nome. Sds. [As partes desta mensagem que não continham texto foram removidas]
Re: RES: RES: RES: RES: [delphi-br] MethodAddress retornando NIL
Sergio, isso já sabemos, passei um exemplo prático que obviamente não funciona e para que possam entender e alguem me sugerir uma alternativa que funcione para o que eu quero, entendeu ?? --- Em delphi-br@yahoogrupos.com.br, Sérgio T. Uetanabaro s...@... escreveu Eric, Note que a função SetFocus do TWinControl é PUBLIC e não PUBLISHED. Por isso o METHODADDRESS não vai achar o método na chamada ExecMethod( edit1, 'SETFOCUS' ) []´s Sergio Uetanabaro
Re: RES: RES: RES: [delphi-br] MethodAddress retornando NIL
Olá Eric, Copiei abaixo, duas de suas mensagens: 2010/7/15 eric_developer developer.syst...@yahoo.com: Colega, não é executar Scripts, por favor veja o que ja postamos. o pequeno e completo exemplo que foi postado, esta bem claro e fácil, é uma pena que há restrições e não consegui montar nada equivalente. O que faço facilmente em outra linguagem estruturada com poucos recursos OOP, parece ser mosca branca de zóio verde ou extravagante demais em Delphi rsrs. Só me resta aguardar, tentar outros caminhos ou desistir disso, o que acho tão simples, é um mistérios aos demais. Fiz uma pesquisa aqui, achei um colega querendo o mesmo (tópico de uns 2 anos), entrei em contato com ele e até hoje não conseguiu. 2010/7/15 eric_developer developer.syst...@yahoo.com: Errado Rubem, quando me referi que faço (não é comum outros usarem OOP no nível que utilizo) em outra linguagem, não é via macro-substituição, e conforme o caso isso é um péssimo hábito, mas tudo isso não importa. Ficar nas teorias disso ou aquilo não vamos sair do lugar. Delphi é uma linguagem que usa muito OOP, o que quero é uma pequena manipulação que já esta no objeto, não considero nada de radical para a linguagem fazer, veja que eu estaria passando o objeto o que não tornaria o processo as cegas, não é caso para scripts. Enfim, vamos deixar isso pendente, pois mais de 2000 maneiras de não conseguir fazer é facil, o objetivo é uma que ajude a resolver. Primeiramente sua resposta: NÃO dá pra fazer. Agora alguns comentários: Não fiquei comparando linguagens, pois cada uma tem seus prós e contras. Então não diga é fácil em outras linguagens. Por exemplo é fácil, em outras linguagens, codificar como no Delphi? Não. Bem, você já entendeu... O Delphi possui uma linguagem FORTEMENTE TIPADA. Esse é um pró da linguagem, em vários problemas... mas também pode ser um contra quando você tenta fazer algoritmos com chamadas abstratas e/ou dinâmicas. A única possibilidade de fazer o que você quer, é utilizando métodos published, que já foi muito comentado por várias pessoas aqui. Não dá pra fazer chamadas a métodos utilizando somente uma string representando seu nome; isso vai contra a filosofia da linguagem, contra a sua base e razão de existir. Você consegue fazer isso em outras linguagens (vc não falou de nenhuma em particular) como, por exemplo, em Java. No entanto, veja que esta prática quebra o encapsulamento (um dos pilares da OOP). O mesmo podemos dizer de Ruby, Python, etc... Sugiro mais ATENÇÃO ao que o Sr. Fabrício falou no email abaixo: 2010/7/14 Fabricio Colombo fabricio.colombo@gmail.com: Para o método SetFocus, seria melhor vc chamar direto o método. Por exemplo, se vc estiver em um form, bastaria chamar Self.FocusControl(edit1) ou vc cria um método seu procedure TForm1.SetFocusComponent(AComponent: TComponent); begin if AComponent is TWinControl then TWinControl(AComponent).SetFocus; end; Que outros métodos vc precisa invocar? Praticamente todos os métodos comuns entre os componentes visuais, estão presentes em TControl e TWinControl, que são as classes base. ...não é o que vc quer (lembre-se que não é possível o que vc quer fazer com Delphi) mas chega muito perto. Em vez de vc tentar fazer chamadas à métodos através de uma string, tente saber qual o tipo de objeto vc está trabalhando (ex: obj is TEdit). Assim vc pode fazer chamadas à métodos comum entre eles, utilizando as classes ancestrais. Cordialmente, MD
RES: RES: RES: RES: RES: [delphi-br] MethodAddress retornando NIL
OK Eric. Eu entendo que a chamada dinâmica é um recurso que podemos utilizar em vários casos mas teremos limitações qto ao tipo de declaração do método o que complica ao ser utilizado nos métodos de componentes padrão do delphi. Se o problema for realizar a chamada proposta então sugiro a vc utilizar essas chamada em componentes derivados para que publiquem (PUBLISHED) os métodos que você quer utilizar. Nesse caso você terá que se atentar em chamar somente métodos com o devido atributo. Outra forma que posso sugerir é o uso de scripters e adaptar as chamadas necessárias para isso. Scripters podem te dar uma grande mão neste ponto pq você não ficará limitado as chamadas de métodos PUBLISHED. No caso de scripter uma chamada seria algo do tipo: Form.RodarScript(edit.SetFocus;); Logicamente tem outros detalhes mas chega bem perto daquilo que você deseja fazer, acredito eu. Somente descarte scripter caso vc precise de permformance na operação. Já busquei várias alternativas para chamadas dinâmicas. Já sofri bastante com esse tipo de problema pq tive que implementar chamadas de métodos pelo nome e esses métodos podiam ter parâmetros. Caso ainda não seja isso, nos explique o problema para que possamos tentar te auxiliar. Sergio Uetanabaro De: delphi-br@yahoogrupos.com.br [mailto:delphi...@yahoogrupos.com.br] Em nome de eric_developer Enviada em: quinta-feira, 15 de julho de 2010 16:16 Para: delphi-br@yahoogrupos.com.br Assunto: Re: RES: RES: RES: RES: [delphi-br] MethodAddress retornando NIL Sergio, isso já sabemos, passei um exemplo prático que obviamente não funciona e para que possam entender e alguem me sugerir uma alternativa que funcione para o que eu quero, entendeu ?? --- Em delphi-br@yahoogrupos.com.br mailto:delphi-br%40yahoogrupos.com.br , Sérgio T. Uetanabaro s...@... escreveu Eric, Note que a função SetFocus do TWinControl é PUBLIC e não PUBLISHED. Por isso o METHODADDRESS não vai achar o método na chamada ExecMethod( edit1, 'SETFOCUS' ) []´s Sergio Uetanabaro [As partes desta mensagem que não continham texto foram removidas]
Re: RES: RES: RES: [delphi-br] MethodAddress retornando NIL
Marcos, espero que esteja bem errado e dê para fazer o que preciso. Sugiro muito cuidado com certas afirmações NÃO É POSSIVEL ..., mesmo se for um expert, assim você automaticamente cria diversos limites a si mesmo. Teve situações parecidas onde um colega pediu algo e outro muito experiente e talentoso, afirmou o mesmo, e eu postei a solução (código) devidamente testada. Devido a minha experiência, acho mais fácil sempre deduzir que é possível mesmo ao que me seja totalmente alheio. Um colega disse ser possível, mas não informou como rsrs passou uma tonelada de vídeos para download, vou ver se encontro a resposta mágica. Um outro passou o código não posso testar no D2009, porque é para Delphi 2010 rsrs Tedit(sender).setfocus ou semelhante, não é o que desejo, até já criei algo parecido e vou substituir. Grato, Eric Developer Systems --- Em delphi-br@yahoogrupos.com.br, Marcos Douglas m...@... escreveu Olá Eric, Copiei abaixo, duas de suas mensagens: ... Primeiramente sua resposta: NÃO dá pra fazer. O Delphi possui uma linguagem FORTEMENTE TIPADA. Esse é um pró da linguagem, em vários problemas... mas também pode ser um contra quando você tenta fazer algoritmos com chamadas abstratas e/ou dinâmicas. A única possibilidade de fazer o que você quer, é utilizando métodos published, que já foi muito comentado por várias pessoas aqui. Não dá pra fazer chamadas a métodos utilizando somente uma string representando seu nome; isso vai contra a filosofia da linguagem, contra a sua base e razão de existir. Você consegue fazer isso em outras linguagens (vc não falou de nenhuma em particular) como, por exemplo, em Java. No entanto, veja que esta prática quebra o encapsulamento (um dos pilares da OOP). O mesmo podemos dizer de Ruby, Python, etc... Cordialmente, MD
RES: RES: RES: RES: [delphi-br] MethodAddress retornando NIL
Uma coisa que o Marcos disse é verdade. Chamadas de funções dinâmicas somente podem ser feitas em métodos PUBLISHED pois somente com esse marcador o compilador coloca na VMT da classe as informações do método. Soluções via RTTI somente com published. []´s Sergio Uetanabaro De: delphi-br@yahoogrupos.com.br [mailto:delphi...@yahoogrupos.com.br] Em nome de eric_developer Enviada em: quinta-feira, 15 de julho de 2010 17:13 Para: delphi-br@yahoogrupos.com.br Assunto: Re: RES: RES: RES: [delphi-br] MethodAddress retornando NIL Marcos, espero que esteja bem errado e dê para fazer o que preciso. Sugiro muito cuidado com certas afirmações NÃO É POSSIVEL ..., mesmo se for um expert, assim você automaticamente cria diversos limites a si mesmo. Teve situações parecidas onde um colega pediu algo e outro muito experiente e talentoso, afirmou o mesmo, e eu postei a solução (código) devidamente testada. Devido a minha experiência, acho mais fácil sempre deduzir que é possível mesmo ao que me seja totalmente alheio. Um colega disse ser possível, mas não informou como rsrs passou uma tonelada de vídeos para download, vou ver se encontro a resposta mágica. Um outro passou o código não posso testar no D2009, porque é para Delphi 2010 rsrs Tedit(sender).setfocus ou semelhante, não é o que desejo, até já criei algo parecido e vou substituir. Grato, Eric Developer Systems --- Em delphi-br@yahoogrupos.com.br mailto:delphi-br%40yahoogrupos.com.br , Marcos Douglas m...@... escreveu Olá Eric, Copiei abaixo, duas de suas mensagens: ... Primeiramente sua resposta: NÃO dá pra fazer. O Delphi possui uma linguagem FORTEMENTE TIPADA. Esse é um pró da linguagem, em vários problemas... mas também pode ser um contra quando você tenta fazer algoritmos com chamadas abstratas e/ou dinâmicas. A única possibilidade de fazer o que você quer, é utilizando métodos published, que já foi muito comentado por várias pessoas aqui. Não dá pra fazer chamadas a métodos utilizando somente uma string representando seu nome; isso vai contra a filosofia da linguagem, contra a sua base e razão de existir. Você consegue fazer isso em outras linguagens (vc não falou de nenhuma em particular) como, por exemplo, em Java. No entanto, veja que esta prática quebra o encapsulamento (um dos pilares da OOP). O mesmo podemos dizer de Ruby, Python, etc... Cordialmente, MD [As partes desta mensagem que não continham texto foram removidas]
Re: RES: RES: RES: [delphi-br] MethodAddress retornando NIL
Se não for published, não dá pra recuperar o nome. Dá uma pesquisada sobre VMT (Virtual Method Table). O delphi armazena a quantidade de métodos virtuais e os ponteiros dos respectivos métodos nessa tabela, mais o nome do método em si, só se estiver no published. Na unit JclSysUtils.pas da JVCL tem os métodos: function GetVirtualMethodCount(AClass: TClass): Integer; function GetVirtualMethod(AClass: TClass; const Index: Integer): Pointer; Além desses, tem: type PMethodEntry = ^TMethodEntry; TMethodEntry = packed record EntrySize: Word; Address: Pointer; Name: ShortString; end; PMethodTable = ^TMethodTable; TMethodTable = packed record Count: Word; FirstEntry: TMethodEntry; {Entries: array [1..65534] of TMethodEntry;} end; function GetMethodTable(AClass: TClass): PMethodTable; function GetMethodEntry(MethodTable: PMethodTable; Index: Integer): PMethodEntry; Mais o PMethodTable, por onde é possível assessar o PMethodEntry.Name, só retorna os métodos published. Faça teste e procure sobre VMT(Virtual Method Table) Em 15 de julho de 2010 17:24, Sérgio T. Uetanabaro s...@allbras.com.brescreveu: Uma coisa que o Marcos disse é verdade. Chamadas de funções dinâmicas somente podem ser feitas em métodos PUBLISHED pois somente com esse marcador o compilador coloca na VMT da classe as informações do método. Soluções via RTTI somente com published. []´s Sergio Uetanabaro De: delphi-br@yahoogrupos.com.br delphi-br%40yahoogrupos.com.br [mailto: delphi-br@yahoogrupos.com.br delphi-br%40yahoogrupos.com.br] Em nome de eric_developer Enviada em: quinta-feira, 15 de julho de 2010 17:13 Para: delphi-br@yahoogrupos.com.br delphi-br%40yahoogrupos.com.br Assunto: Re: RES: RES: RES: [delphi-br] MethodAddress retornando NIL Marcos, espero que esteja bem errado e dê para fazer o que preciso. Sugiro muito cuidado com certas afirmações NÃO É POSSIVEL ..., mesmo se for um expert, assim você automaticamente cria diversos limites a si mesmo. Teve situações parecidas onde um colega pediu algo e outro muito experiente e talentoso, afirmou o mesmo, e eu postei a solução (código) devidamente testada. Devido a minha experiência, acho mais fácil sempre deduzir que é possível mesmo ao que me seja totalmente alheio. Um colega disse ser possível, mas não informou como rsrs passou uma tonelada de vídeos para download, vou ver se encontro a resposta mágica. Um outro passou o código não posso testar no D2009, porque é para Delphi 2010 rsrs Tedit(sender).setfocus ou semelhante, não é o que desejo, até já criei algo parecido e vou substituir. Grato, Eric Developer Systems --- Em delphi-br@yahoogrupos.com.br delphi-br%40yahoogrupos.com.brmailto: delphi-br%40yahoogrupos.com.br delphi-br%2540yahoogrupos.com.br , Marcos Douglas m...@... escreveu Olá Eric, Copiei abaixo, duas de suas mensagens: ... Primeiramente sua resposta: NÃO dá pra fazer. O Delphi possui uma linguagem FORTEMENTE TIPADA. Esse é um pró da linguagem, em vários problemas... mas também pode ser um contra quando você tenta fazer algoritmos com chamadas abstratas e/ou dinâmicas. A única possibilidade de fazer o que você quer, é utilizando métodos published, que já foi muito comentado por várias pessoas aqui. Não dá pra fazer chamadas a métodos utilizando somente uma string representando seu nome; isso vai contra a filosofia da linguagem, contra a sua base e razão de existir. Você consegue fazer isso em outras linguagens (vc não falou de nenhuma em particular) como, por exemplo, em Java. No entanto, veja que esta prática quebra o encapsulamento (um dos pilares da OOP). O mesmo podemos dizer de Ruby, Python, etc... Cordialmente, MD [As partes desta mensagem que não continham texto foram removidas] [As partes desta mensagem que não continham texto foram removidas] -- FAVOR REMOVER ESTA PARTE AO RESPONDER ESTA MENSAGEM * Para ver as mensagens antigas, acesse: http://br.groups.yahoo.com/group/delphi-br/messages * Para falar com o moderador, envie um e-mail para: delphi-br-ow...@yahoogrupos.com.br Links do Yahoo! Grupos * Para visitar o site do seu grupo na web, acesse: http://br.groups.yahoo.com/group/delphi-br/ * Para sair deste grupo, envie um e-mail para: delphi-br-unsubscr...@yahoogrupos.com.br * O uso que você faz do Yahoo! Grupos está sujeito aos: http://br.yahoo.com/info/utos.html