Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Crear eventos (https://www.clubdelphi.com/foros/showthread.php?t=4795)

chuck 28-10-2003 23:40:33

Crear eventos
 
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:
Código:

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

Cita:

Empezado por delphi.com.ar
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:
Código:

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

Cita:

Empezado por mRoman
...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:
Código Delphi [-]
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

Código Delphi [-]
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:

Código Delphi [-]
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

Crear botones en ejecucion
 
Cita:

Empezado por Caral
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:
Código Delphi [-]
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:
Código Delphi [-]
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 !


La franja horaria es GMT +2. Ahora son las 22:17:26.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi