PDA

Ver la Versión Completa : Crear eventos


chuck
28-10-2003, 23:40:33
Hola a todos.
Tengo un problema que probablemente tendra facil solucion, pero soy navato en esto.
Necesito asignar un determinado codigo en el evento onclick de un boton. El problema que tengo es que este boton esta creado en tiempo de ejecucion y no puedo asignar el evento desde el inspector de objetos. ¿Alguien sabe como hacerlo?.

Gracias por adelantado

delphi.com.ar
29-10-2003, 00:46:19
Siempre recuerda que en Delphi los eventos, no son mas que propiedades del tipo procedure of object (Una grán mayoría del tipo TNotifyEvent), o sea que se asignan como cualquier otra propiedad:procedure TForm1.OnButtonClick(Sender: TObject);
begin
ShowMessage('Click!');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
with TButton.Create(Self) do
begin
Parent := Self;
Caption := 'Botón';
OnClick := OnButtonClick;
end;
end;


Saludos!

mRoman
29-07-2007, 01:08:42
Siempre recuerda que en Delphi los eventos, no son mas que propiedades del tipo procedure of object (Una grán mayoría del tipo TNotifyEvent), o sea que se asignan como cualquier otra propiedad:procedure TForm1.OnButtonClick(Sender: TObject);
begin
ShowMessage('Click!');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
with TButton.Create(Self) do
begin
Parent := Self;
Caption := 'Botón';
OnClick := OnButtonClick;
end;
end;


Saludos!
Hola se q este hilo es algo viejo.....pero podrias decirme como resolviste el problema -que por cierto lo tengo este momento-, para saber q boton estas pulsando???

Gracias camarada de antemano por tu tiempo q le dediques a leer esto q envio.

delphi.com.ar
29-07-2007, 01:20:29
...podrias decirme como resolviste el problema -que por cierto lo tengo este momento-, para saber q boton estas pulsando???...
Simple, si te fijas muchos eventos tienen un parámetro Sender del tipo TObject, y este objeto es el objeto que ha llamado al evento.

Saludos!

mRoman
29-07-2007, 02:07:17
Gracias por tu respuesta rapida.

En estos momentos estoy desarrollando la pantalla q tendra creacion de botones en tiempo de ejecucion, la respuesta q me das entiendo lo siguiente, el TObject es un parametro....asi lo entiendo, pero serias tan amable de mostrarme como seria con codigo, ya que desafortunadamente no lo he entendido del todo como lo planteas, un ejemplo seria mas descriptivo....

Gracias...en estos momentos estoy en linea.

Caral
29-07-2007, 03:05:18
Hola
No se si sera esto lo que preguntas, pero para saber que boton presionaste es solo cuestion de definir el nombre de la variable, algo asi:

unit Unit1;

interface

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

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

var
Form1: TForm1;
Button1,Button2: TButton;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
Button1:= TButton.Create(Self);
Button1.Parent := Self;
Button1.Caption := 'Botón';
Button1.Left:= 20;
Button1.Top:= 10;
Button1.OnClick := OnButton1Click;

Button2:= TButton.Create(Self);
Button2.Parent := Self;
Button2.Caption := 'Botón';
Button2.Left:= 100;
Button2.Top:= 10;
Button2.OnClick := OnButton2Click;
end;

procedure TForm1.OnButton1Click(Sender: TObject);
begin
ShowMessage('Presionaste el boton 1!');
end;

procedure TForm1.OnButton2Click(Sender: TObject);
begin
ShowMessage('Presionaste el boton 2!');
end;

end.

Como veras, aqui estan el boton 1 y el dos declarados y tienen un diferente evento OnClick.
Espero que te sirva.
Saludos

cHackAll
29-07-2007, 03:33:43
unit Unit1;

interface

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

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

var
Form1: TForm1;
Button1,Button2: TButton;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
Button1:= TButton.Create(Self);
Button1.Parent := Self;
Button1.Caption := 'Botón 1';
Button1.Left:= 20;
Button1.Top:= 10;
Button1.OnClick := ButtonClick;

Button2:= TButton.Create(Self);
Button2.Parent := Self;
Button2.Caption := 'Botón 2';
Button2.Left:= 100;
Button2.Top:= 10;
Button2.OnClick := ButtonClick;
end;

procedure TForm1.ButtonClick(Sender: TObject);
begin
ShowMessage('Presionaste el ' + (Sender as TButton).Caption + '!');
end;

end.

Y me parece que al no interesar más datos de los botones se podría hacer algo como ésto:

unit Unit1;

interface

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

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

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
with TButton.Create(Self) do
begin
Parent := Self;
Caption := 'Botón 1';
Left:= 20;
Top:= 10;
OnClick := ButtonClick;
end;
with TButton.Create(Self) do
begin
Parent := Self;
Caption := 'Botón 2';
Left:= 100;
Top:= 10;
OnClick := ButtonClick;
end;
end;

procedure TForm1.ButtonClick(Sender: TObject);
begin
ShowMessage('Presionaste el ' + (Sender as TButton).Caption + '!');
end;

end.

PD: Claro que hay N formas de obtener lo que quieres.

mRoman
29-07-2007, 03:33:43
Hola
No se si sera esto lo que preguntas, pero para saber que boton presionaste es solo cuestion de definir el nombre de la variable, algo asi:

unit Unit1;

interface

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

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

var
Form1: TForm1;
Button1,Button2: TButton;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
Button1:= TButton.Create(Self);
Button1.Parent := Self;
Button1.Caption := 'Botón';
Button1.Left:= 20;
Button1.Top:= 10;
Button1.OnClick := OnButton1Click;

Button2:= TButton.Create(Self);
Button2.Parent := Self;
Button2.Caption := 'Botón';
Button2.Left:= 100;
Button2.Top:= 10;
Button2.OnClick := OnButton2Click;
end;

procedure TForm1.OnButton1Click(Sender: TObject);
begin
ShowMessage('Presionaste el boton 1!');
end;

procedure TForm1.OnButton2Click(Sender: TObject);
begin
ShowMessage('Presionaste el boton 2!');
end;

end.

Como veras, aqui estan el boton 1 y el dos declarados y tienen un diferente evento OnClick.
Espero que te sirva.
Saludos

Si, Gracias CARAL por tu ayuda....pero ya lo resolvi, resulta q no sabia utilizar el SENDER del procedimiento....te comento q estoy creando botones en tiempo de ejecucion, por cada SERVICIO de lavanderia que registre el usuario es un boton, la solucion q me propones, y la cual se agradece, no me podria servir de mucho, ya que necesito dejar abierto la cantidad de botones, habra tantos de ellos como servicios haya creado el usuario.

En si lo servicios no pasaran de 10....pongo la forma en como lo solucione, para ti -si en algo te ayuda- y todos los q consultan este club.

GRACIAS !
Solucion:

procedure TfrmRegServicios.FormShow(Sender: TObject);
Var
PosY:Integer;
begin
gBoxTipoServicio.Caption:='';
qryServicios.Close;
qryServicios.Open;
PosY:=100;
n:=1;
While not qryServicios.Eof do
begin
Botones[n]:=TButton.Create(Self);
with Botones[n] do
begin
Caption:=qryServicios.fieldbyname('DESCRIPCION').AsString;
Parent:=self;
Height:=71;
Top:=PosY;
PosY:=PosY+Height+10;
Left:=16;
Width:=97;
OnClick:=OnButtonClick;
Name:='btn'+IntToStr(n);
Tag:=qryServicios.fieldbyname('CLAVE_SERVICIO').AsInteger;
end;
qryServicios.Next;
inc(n);
end;

end;

procedure TfrmRegServicios.OnButtonClick(Sender:TObject);
var
nServicio:Integer;
begin
with Sender as tButton do begin
nServicio:=(Sender as tButton).Tag;
gBoxTipoServicio.Caption:=(Sender as tButton).Caption;
end;
qryPrenda.Close;
qryPrenda.ParamByName('SERVICIO').AsInteger:=nServicio;
qryPrenda.Open;
qryPrenda.FetchAll;
end;

procedure TfrmRegServicios.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Action:=caFree;
end;


Lo resaltado con rojo es lo q andaba buscando !....SALUDOS !