Criação de Componente: Propriedade Picture
Como faço para adicionar uma propriedade a um componente que estou criando para que apareça queles 3 pontinhos para esconlher uma imagem?
Raserafim
Curtidas 0
Respostas
Rafael Heise
26/11/2003
Simplesmente cria a sua propriedade como sendo do tipo TBitmap. isso fará o delphi entender que é para colocar os ´...´ automaticamente...
GOSTEI 0
Beppe
26/11/2003
Os ... aparecem quando há um editor configurado. Você pode criar um customizado, herdando de TPropertyEditor, e registre-o. Ou usar objetos de classes como TBitmap, TPciture, que já tem editores para eles.
Num painel que contém um TImage(como visto anteriormente), ele existe a imagem sozinho, e no Object Inspector o TImage aparece como uma referência. Mas para fazer como você quer, você também terá que mandar desenhar a imagem.
Use:
- TBitmap: para exibir só bitmaps;
- TIcon: para exibir ícones;
- TPicture: para exibir qualquer tipo de imagem registrada(bmp, jpeg, wmf, etc).
Digamos qu você escolha TPicture(e eu acho que devia). Você precisa ter alguns cuidados adicionais. Veja o código básico:
Num painel que contém um TImage(como visto anteriormente), ele existe a imagem sozinho, e no Object Inspector o TImage aparece como uma referência. Mas para fazer como você quer, você também terá que mandar desenhar a imagem.
Use:
- TBitmap: para exibir só bitmaps;
- TIcon: para exibir ícones;
- TPicture: para exibir qualquer tipo de imagem registrada(bmp, jpeg, wmf, etc).
Digamos qu você escolha TPicture(e eu acho que devia). Você precisa ter alguns cuidados adicionais. Veja o código básico:
unit Unit1;
interface
uses
Classes, Graphics, ExtCtrls;
type
TDrawStyle = (dsDefault, dsTiled, dsStreched);
TPicturePanel = class(TPanel)
private
FPicture: TPicture;
FStyle: TDrawStyle;
procedure PictureChanged(Sender: TObject);
procedure SetPicture(const Value: TPicture);
procedure SetStyle(const Value: TDrawStyle);
protected
procedure Paint; override;
public
constructor Create(AOwner: TObject); override;
destructor Destroy; override;
published
property Picture: TPicture read FPicture write SetPicture;
property Style: TDrawStyle read FStyle write SetStyle;
end;
implementation
{ TPicturePanel }
constructor TPicturePanel.Create(AOwner: TObject);
begin
inherited;
FPicture := TPicture.Create;
FPicture.OnChange := PictureChanged;
end;
destructor TPicturePanel.Destroy;
begin
FPicture.Free;
inherited;
end;
procedure TPicturePanel.Paint;
begin
if Picture.Graphic <> nil then
case Style of
dsDefault: Canvas.Draw(BorderWidth, BorderWidth, Picture.Graphic);
dsTiled: TileImage(Canvas, BorderWidth, BorderWidth, Width - BorderWidth,
Height - BorderWidth, Picture.Graphic);
dsStreched: Canvas.StretchDraw(Rect(BorderWidth, BorderWidth, Width - BorderWidth,
Height - BorderWidth), Picture.Graphic);
end;
end;
procedure TPicturePanel.PictureChanged(Sender: TObject);
begin
Invalidate;
end;
procedure TPicturePanel.SetPicture(const Value: TPicture);
begin
FPicture.Assign(Value);
end;
procedure TPicturePanel.SetStyle(const Value: TDrawStyle);
begin
if Style <> Value then
begin
FStyle := Value;
Invalidate;
end;
end;
end.GOSTEI 0
Raserafim
26/11/2003
Valeu mais uma vez Ataliba, ainda não testei, quando testar digo se deu tudo certo.
Mas eu havia feito como disse o nosso colega zerneo, conforme eu tinha colocado em um outro tópico:
Criei um componente baseado em um TPanel, e acrescentei uma propriedade TBitmap. Quando coloco o componente no Form e vou na propriedade TBitmap e clico nos 3 pontinhos poara selecionar uma imagem aparece um erro após escolher a imagem:
Access violation at address 51002DA5 in module ‘dclusr60.bpl’. read of address 00000000.
Não basta apenas fazer isto para que eu pudesse atribuir uma imagem a propriedade?
Mas eu havia feito como disse o nosso colega zerneo, conforme eu tinha colocado em um outro tópico:
Criei um componente baseado em um TPanel, e acrescentei uma propriedade TBitmap. Quando coloco o componente no Form e vou na propriedade TBitmap e clico nos 3 pontinhos poara selecionar uma imagem aparece um erro após escolher a imagem:
Access violation at address 51002DA5 in module ‘dclusr60.bpl’. read of address 00000000.
Não basta apenas fazer isto para que eu pudesse atribuir uma imagem a propriedade?
GOSTEI 0
Beppe
26/11/2003
Access violation at address 51002DA5 in module ‘dclusr60.bpl’. read of address 00000000.
Não basta apenas fazer isto para que eu pudesse atribuir uma imagem a propriedade?
...read of address 00000000... indica que você não criou o bitmap. Para poder dar um assign ou chamar qualquer método dele você precisar atribuir a ele uma nova instância de TBitmap.
GOSTEI 0
Raserafim
26/11/2003
Então apenas definir a propriedade como Picture não resolve o problema?
GOSTEI 0
Beppe
26/11/2003
Não, ela é um objeto, e como tal, precisa criá-lo para usá-lo.
GOSTEI 0