GARANTIR DESCONTO

Fórum Criação de Componente TPanel com TImage dentro. #354990

06/03/2008

0

Olá pessoal,
estou criando um componente que herda de TPanel e que terá um TImage dentro.
Obs.: Futuramente ele terá um TCheckBox :)

Estou fazendo assim:

  TPanel_IMG_CeckBox = class(TPanel)
  private
    { Private declarations }
  protected
    { Protected declarations }
  public
    { Public declarations }
    img : TImage;
    constructor Create(AOwner : TComponent); override;    
    destructor Destroy; override;                         
  published
    { Published declarations }
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents(´Carlos_Pacote´, [TPanel_IMG_CeckBox]);
end;

{ TPanel_IMG_CeckBox }

constructor TPanel_IMG_CeckBox.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);       {Chama o constructor original (herdado)}
  img := TImage.Create(nil);
  img.Parent := self;
  img.Align := alTop;
  img.Visible := true;
end;

destructor TPanel_IMG_CeckBox.Destroy;
begin
  img.Free;
  inherited destroy;
end;

end.


Ocorre que queria que a propriedade IMAGE aparecesse no Object Inspector. Como fazer isso?


Carlosib

Carlosib

Responder

Posts

06/03/2008

Rodc

  TPanel_IMG_CeckBox = class(TPanel)
  private
    { Private declarations }
    FImage : TImage;
  protected
    { Protected declarations }
  public
    { Public declarations }
    constructor Create(AOwner : TComponent); override;     
    destructor Destroy; override;                         
  published
    { Published declarations }
    property Image: TImage read FImage write FImage;
  end; 

procedure Register; 

implementation 

procedure Register; 
begin 
  RegisterComponents(´Carlos_Pacote´, [TPanel_IMG_CeckBox]); 
end; 

{ TPanel_IMG_CeckBox } 

constructor TPanel_IMG_CeckBox.Create(AOwner: TComponent); 
begin 
  inherited Create(AOwner);       {Chama o constructor original (herdado)} 
  FImage := TImage.Create(nil);
  FImage.Parent := self;
  FImage.Align := alTop;
  FImage.Visible := true;
end; 

destructor TPanel_IMG_CeckBox.Destroy; 
begin 
  FImage.Free;
  inherited destroy; 
end; 

end.

É por este caminho, só que, se não me engano, quando você clicar na propriedade do object inspector irá dar erro.
Tenta dar uma olhada em como os componentes do Delphi implementam.


Responder

Gostei + 0

07/03/2008

Carlosib

Amigos,
no código postado por ´RODC´ ele colocou um COMOBOX no object inspector.

Então alterei o construtor para:

DE:
FImage := TImage.Create(nil); 


PARA:
FImage := TImage.Create(self); 


Ficando assim:
constructor TPanel_IMG_CeckBox.Create(AOwner: TComponent); 
begin 
  inherited Create(AOwner);       {Chama o constructor original (herdado)} 
  FImage := TImage.Create(SELF); 
  FImage.Parent := self; 
  FImage.Align := alTop; 
  FImage.Visible := true; 
end; 


Agora tenho acesso as propriedades do TImage no object inspector do TPanel_IMG_CheckBox porém não tenho acesso aos eventos do TImagem?

Como resolvo isso?


Responder

Gostei + 0

07/03/2008

Rodc

Você quer acesso a todos os eventos do TImage ou apenas algum específico?


Responder

Gostei + 0

07/03/2008

Carlosib

de todos :)


Responder

Gostei + 0

07/03/2008

Rodc

Você pode acessar em runtime usando o código abaixo.
SeuComponent.Image.OnClick := MeuOnClick;
.....

procedure TForm1.MeuOnClick(Sender: TObject);
begin

end;

Pelo ObjectInspector, ele não aparece um ´+´ do lado da propriedade Image? Se você clicar nesse ´mais´ aparece as propriedades do componente e na aba de Eventos aparece os eventos da imagem também. Só não aparece a imagem caso você tire o parâmetro ´write´ na declaração da propriedade Image, tornando-o ReadOnly.
property Image: TImage read FImage;



Responder

Gostei + 0

07/03/2008

Carlosib

aparece apenas as propriedades os eventos não aparecem.

No ObjectInspector tenho o IMAGE com o sinal de + apenas na aba propriedades. Na aba eventos não tenho nada relacionado ao IMAGE.


Responder

Gostei + 0

07/03/2008

Rodc

É por causa do FImage := TImage.Create(self);
Como o ´responsável´ pela imagem é o componente, ele não deixa você linkar um evento a um procedimento que não está dentro do cliente.
Uma forma de contornar é passar a ´responsabilidade´ da imagem para quem criou o seu componente usando FImage := TImage.Create(AOwner);. Mas isto não é nem de longe recomendado.

Sugiro você não criar a imagem pelo componente, deixe apenas o combobox (como estava no meu primeiro exemplo) para que o usuário possa linkar a propriedade com um TImage que já exista no formulário.

Outra opção seria você criar o evento que você quer no seu componente. Segue o exemplo para o OnClick da Imagem:
  TPanel_IMG_CeckBox = class(TPanel)
  private 
    { Private declarations } 
    FImage : TImage;
    FOnImageClick: TNotifyEvent;
    procedure MeuOnImageClick(Sender : TObject);
  protected 
    { Protected declarations } 
  public 
    { Public declarations } 
    constructor Create(AOwner : TComponent); override;     
    destructor Destroy; override;                          
  published 
    { Published declarations }
    property Image: TImage read FImage; // Note que a propriedade está ReadOnly
    property OnImageClick: TNotifyEvent read FOnImageClick write FOnImageClick;
  end; 

procedure Register;

implementation 

procedure Register; 
begin 
  RegisterComponents(´Carlos_Pacote´, [TPanel_IMG_CeckBox]); 
end; 

{ TPanel_IMG_CeckBox } 

constructor TPanel_IMG_CeckBox.Create(AOwner: TComponent); 
begin 
  inherited Create(AOwner);       {Chama o constructor original (herdado)} 
  FImage := TImage.Create(SELF); 
  FImage.Parent := self;
  FImage.Align := alTop;
  FImage.Visible := true;
  FImage.OnClick := MeuOnImageClick;
end;

destructor TPanel_IMG_CeckBox.Destroy; 
begin 
  FImage.Free; 
  inherited destroy; 
end;

procedure TPanel_IMG_CeckBox.MeuOnImageClick(Sender : TObject);
begin
if (Assigned(FOnImageClick)) then
    FOnImageClick(Self);// Aqui o Sender passa a ser o seu componente, não mais o TImage
end;

end.



Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar