Criação de Componente TPanel com TImage dentro.
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:
Ocorre que queria que a propriedade IMAGE aparecesse no Object Inspector. Como fazer isso?
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
Curtidas 0
Respostas
Rodc
06/03/2008
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
Carlosib
06/03/2008
Amigos,
no código postado por ´RODC´ ele colocou um COMOBOX no object inspector.
Então alterei o construtor para:
DE:
PARA:
Ficando assim:
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?
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
Rodc
06/03/2008
Você quer acesso a todos os eventos do TImage ou apenas algum específico?
GOSTEI 0
Carlosib
06/03/2008
de todos :)
GOSTEI 0
Rodc
06/03/2008
Você pode acessar em runtime usando o código abaixo.
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.
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
Carlosib
06/03/2008
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.
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
Rodc
06/03/2008
É 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:
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