Boa tarde pessoal; Estava fazendo um teste para customizar ums componentes do delphi. E para isto eu criei uma interface, tendo em vista que se pode ter uma infinidade de componentes em um form, mas todos eles em comum iriam ter um metodo que chamei de SetTheme.
Em algum momento entao eu preciso verificar quais objetos de um form implementam essaa determinada interface, para que eu possa chamar um procedimento que (SetTheme) entao ira ajustar as propriedades do componente. O problema é que quando chamo este metodo ele so funciona para o primeiro componente ocorrendo um access violation para o restante. (alias ele nem passa pelos outros) Alguem ai é fera em Interfaces e gostaria de me ajudar? A ideia é a seguinte. coloquei uma unit como mostro a seguir, onde declaro a interface, pra dar uma ideia...os componentes que eu estou querendo personalizar são edits, dbedtis, labels, grids... Bem no momento estou tentando apenas com ums edits (sem muito sucesso). Na verdade eu criei um pacote para instalar estes componentes e entao os mesmo implementam a IESApplicationControlTheme ...que tem o metodo settheme. Mais abaixo eu criei uma outra interface "IESApplicationTheme " que vai ser implementada na aplicacao (ai é so o exemplo...pois a real que tenho aqui tem um mundarel de coisa); Entao quando a aplicacao é executa eu verifico os objetos que implementam a interface e ajusto as propriedades que é implementado por uma outra classe na aplicacao. Mais ou menos assim ******************************** var vCont : Integer; vComp : TComponent; vObj : IESApplicationControlTheme; begin { Faz um loop nos componentes do form } for vCont := 0 to Self.ComponentCount -1 do begin { Pega a referencia a um componente } vComp := Components[vCont]; { Verifica se o objeto implementa a interface } if vComp.GetInterface( vInterface, vObj) then begin { Faço o componente aplicar o tema } (vComp as IESApplicationControlTheme).SetTheme( Theme); end; end; end; ********************************* Ex do componente personalizado ... TESEdit = class(TEdit, IESApplicationControlTheme) private FTheme : IESApplicationTheme; public procedure SetTheme( Theme : IESApplicationTheme); end; ... Implementation .... procedure TESEdit.SetTheme(Theme: IESApplicationTheme); Begin {Aqui da um access violation na segunda passagem (segundo edit do form) um detalhe interessante que é logo no begin...nem chega a linha do borderstyle } BorderStyle := bsSingle; Color := Theme.Color; BevelInner := Theme.BevelInner; BevelKind := Theme.BevelKind; BevelOuter := Theme.BevelOuter; BorderStyle := Theme.BorderStyle; end; .... ********************************** unit uCompIntf; interface Uses Windows, SysUtils, Forms, Controls, StdCtrls, Graphics; Type { Interface para o contole dos temas } IESApplicationTheme = Interface; IESApplicationControlTheme = Interface; { Interface para o controle de de componentes para os themas } IESApplicationControlTheme = Interface ['{A75E6A62-C8F2-400E-BD48-2520C6E863AB}'] procedure SetTheme( Theme : IESApplicationTheme); end; { Interface de utilizacao dos themas } IESApplicationTheme = Interface ['{CA27CAED-A861-48EB-A10F-70BFB64F2D43}'] function Color : TColor; function BevelInner : TBevelCut; function BevelKind : TBevelKind; function BevelOuter : TBevelCut; function BorderStyle : TBorderStyle; function ControlUSe3D : Boolean; end; implementation end. *********************************** Ok. Pessoal, de bom grado, este ai é apenas uma parte do codigo...mais funcional que eu posso mostrar... Já verifiquei todos os outros metodos e propriedades...e nenhum deles interferem no que tenho passado aqui. (Alias é o que eu estou testando, cheguei a criar um projeto separado so com isso daí pra ver se chegava a uma conclusao) E Desculpe pelo tamanho do Email. Atenc Elazar _______________________________________________________ Yahoo! Mail - Sempre a melhor opção para você! Experimente já e veja as novidades. http://br.yahoo.com/mailbeta/tudonovo/