GARANTIR DESCONTO

Fórum Criação de componentes #357329

18/04/2008

0

Pessoal, estou querendo criar um componente, aonde eu vinculo um botão qualquer de um TForm, e sobrescreva a propriedade OnClick, para fazer uma validação.

O exemplo seria:
Toda vez que o usuário apertar no botão, ter uma msg.
´Você apertou um botão´

Como fazer isto?

[]s,

ET


Et.vinny

Et.vinny

Responder

Posts

22/04/2008

Rodc

Crie um novo componente descendente de TButton e sobrescreva (override) a função Click(). Não testei mas acho que deve funcionar...


Responder

Gostei + 0

22/04/2008

Et.vinny

Já tinha feito isto.
Porém, tenho a procedure abaixo, que vincula o TButton extendido, com um TButton normal da tela:

procedure TEditExt.prEscreve(Sender: TButton);
begin
TButton(FButonInsert) := Sender;
end;

Porém, FButonInsert, esá como nil:

Vai ai o código completo.


unit EditExt;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Forms, Dialogs,
  StdCtrls;

type
  TButtonControl = class(TButton)
  public
    constructor Create(AOwner : TComponent); override;
    destructor  Destroy; override;
    procedure Click; override;
  end;

  TEditExt = class(TEdit)
  private
    { Private declarations }
    FRequired : Boolean;
    FButonInsert : TButtonControl;
    FButton : TButton;

  protected
    { Protected declarations }
  public
    { Public declarations }
    constructor Create(AOwner : TComponent); override;
    destructor  Destroy; override;
  published
    { Published declarations }
    //  Indica se o campo é obrigatório ou não
    BotaoInserte : TButton;
    property Required : Boolean read  FRequired write FRequired;
    function prLe : TButton;
    procedure prEscreve(Sender : TButton);
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents(´Palheta Ext´, [TEditExt]);
end;

{ TEnterCombo }

constructor TEditExt.Create(AOwner: TComponent);
begin
  inherited;
  //  Código se necessário      ]
  FButonInsert := FButonInsert.Create(Self);
  FButonInsert := TButtonControl(BotaoInserte);
end;

destructor TEditExt.Destroy;
begin
  //  Código se necessário
  inherited;
end;


procedure TEditExt.prEscreve(Sender: TButton);
begin
  TButton(FButonInsert) := Sender;
end;

function TEditExt.prLe: TButton;
begin
  TButtonControl(FButton) := FButonInsert;
end;

{ TButtonControl }

procedure TButtonControl.Click;
begin
  ShowMessage(´Testes do cmponente´);
  inherited;
end;

constructor TButtonControl.Create(AOwner: TComponent);
begin
  inherited;
end;

destructor TButtonControl.Destroy;
begin         
  inherited;
end;

end.


[]s

ET


Responder

Gostei + 0

22/04/2008

Et.vinny

Consegui fazer de dá erro na criação do componente. Porém ele não vincula o evento.
Segue código atualizado

[]s,

ET


unit EditExt;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Forms, Dialogs,
  StdCtrls;

type
  TButtonControl = class(TButton)
  public
    constructor Create(AOwner : TComponent); override;
    destructor  Destroy; override;
    procedure Click; override;
  end;

  TEditExt = class(TEdit)
  private
    { Private declarations }
    FRequired : Boolean;
    FButonInsert : TButtonControl;
    FButton : TButton;

  protected
    { Protected declarations }
  public
    { Public declarations }
    constructor Create(AOwner : TComponent); override;
    destructor  Destroy; override;
  published
    { Published declarations }
    //  Indica se o campo é obrigatório ou não
    BotaoInserte : TButton;
    property Required : Boolean read  FRequired write FRequired;
    function prLe : TButton;
    procedure prEscreve(Sender : TButton);
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents(´Palheta Ext´, [TEditExt]);
end;

{ TEnterCombo }

constructor TEditExt.Create(AOwner: TComponent);
begin
  inherited;
  //  Código se necessário      ]
  FButonInsert := TButtonControl.Create(Self);
end;

destructor TEditExt.Destroy;
begin
  //  Código se necessário
  inherited;
end;


procedure TEditExt.prEscreve(Sender: TButton);
begin
  TButton(FButonInsert) := Sender;
end;

function TEditExt.prLe: TButton;
begin
  TButtonControl(FButton) := FButonInsert;
end;

{ TButtonControl }

procedure TButtonControl.Click;
begin
  ShowMessage(´Testes do cmponente´);
  inherited;
end;

constructor TButtonControl.Create(AOwner: TComponent);
begin
  inherited;
end;

destructor TButtonControl.Destroy;
begin         
  inherited;
end;

end.




Responder

Gostei + 0

22/04/2008

Rodc

Não entendi direito o que você está querendo fazer... mas testa este código:
unit EditExt;

interface 

uses 
  Windows, Messages, SysUtils, Classes, Graphics, Forms, Dialogs, 
  StdCtrls; 

type 
  TButtonControl = class(TButton) 
  public 
    constructor Create(AOwner : TComponent); override; 
    destructor  Destroy; override; 
    procedure Click; override; 
  end; 

  TEditExt = class(TEdit) 
  private 
    { Private declarations } 
    FRequired : Boolean; 
    FButonInsert : TButtonControl;
    FButton : TButton; 

  protected 
    { Protected declarations } 
  public 
    { Public declarations } 
    constructor Create(AOwner : TComponent); override; 
    destructor  Destroy; override; 
  published 
    { Published declarations } 
    //  Indica se o campo é obrigatório ou não 
    BotaoInserte : TButton; 
    property Required : Boolean read  FRequired write FRequired;
    property ButonInsert : TButton read  FButonInsert write FButonInsert;
    function prLe : TButton; 
    procedure prEscreve(Sender : TButton); 
  end; 

procedure Register; 

implementation 

procedure Register; 
begin 
  RegisterComponents(´Palheta Ext´, [TEditExt]); 
end; 

{ TEnterCombo } 

constructor TEditExt.Create(AOwner: TComponent); 
begin 
  inherited; 
  //  Código se necessário      ] 
  FButonInsert := FButonInsert.Create(Self);
  FButonInsert.Parent := Self;
end;

destructor TEditExt.Destroy; 
begin 
  //  Código se necessário
  if Assigned(FButonInsert) then
  FButonInsert.Free();
  inherited; 
end; 

{ TButtonControl }

procedure TButtonControl.Click; 
begin 
  ShowMessage(´Testes do cmponente´); 
  inherited; 
end; 

constructor TButtonControl.Create(AOwner: TComponent); 
begin 
  inherited; 
end; 

destructor TButtonControl.Destroy; 
begin          
  inherited; 
end; 

end.



Responder

Gostei + 0

22/04/2008

Lcfinformatica

Voce pode apenas criar um procedimento e passar ele para o OnClick do botão??

/////////////////////////////


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
procedure PersonalClick(Sender: TObject);
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.PersonalClick(Sender: TObject);
begin
ShowMessage(´Hello World!´);
end;

{ ATRUBUIR AO EVENTO ONCLICK DO BOTÃO DO FORMULARIO A PROCEDURE CRIADA }
procedure TForm1.FormCreate(Sender: TObject);
begin
Button1.OnClick := PersonalClick;
end;

end.

////////////////////////


Responder

Gostei + 0

22/04/2008

Et.vinny

Dentro de um TForm funciona. Porém não consegui fazer isto funcionar dentro do componente.


Responder

Gostei + 0

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

Aceitar