Fórum Criação de Componente: Propriedade Picture #197144

26/11/2003

0

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

Raserafim

Responder

Posts

26/11/2003

Rafael Heise

Simplesmente cria a sua propriedade como sendo do tipo TBitmap. isso fará o delphi entender que é para colocar os ´...´ automaticamente...


Responder

Gostei + 0

26/11/2003

Beppe

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:

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.



Responder

Gostei + 0

27/11/2003

Raserafim

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?


Responder

Gostei + 0

27/11/2003

Beppe

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.


Responder

Gostei + 0

28/11/2003

Raserafim

Então apenas definir a propriedade como Picture não resolve o problema?


Responder

Gostei + 0

28/11/2003

Beppe

Não, ela é um objeto, e como tal, precisa criá-lo para usá-lo.


Responder

Gostei + 0

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

Aceitar