Fórum Criação de Componente TPanel com TImage dentro. #354990
06/03/2008
0
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
Curtir tópico
+ 0Posts
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.
Gostei + 0
07/03/2008
Carlosib
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?
Gostei + 0
07/03/2008
Rodc
Gostei + 0
07/03/2008
Carlosib
Gostei + 0
07/03/2008
Rodc
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;
Gostei + 0
07/03/2008
Carlosib
No ObjectInspector tenho o IMAGE com o sinal de + apenas na aba propriedades. Na aba eventos não tenho nada relacionado ao IMAGE.
Gostei + 0
07/03/2008
Rodc
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.Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)