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/

Responder a