Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   ButtonGroup Onclic en Ejecucion (https://www.clubdelphi.com/foros/showthread.php?t=66902)

subzero 18-03-2010 00:04:36

ButtonGroup Onclic en Ejecucion
 
Hola.

Quisiera saber si es posible al momento de adicionar nuevos botones al componente ButtonGroup asignarle el proceso que debe realizar cuando le den clic, todo esto en tiempo de ejecución, hasta ahora creo el botón pero no se como agregarle el evento onclic.

Código Delphi [-]
BtnGroup.Items.Add.Caption := Form2.Caption;
BtnGroup.Items[BtnGroup.Items.Count-1].OnClick(); //Aqui es donde quisiera que abriera o activara una ventana

Agradezco el tiempo....

BrunoBsso 18-03-2010 00:12:45

Hola subzero.
Lo que vos necesitás es asignarle un evento al botón.
Te doy un pequeño ejemplo para que entiendas.
Código Delphi [-]
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure FormActivate(Sender: TObject);
    {Importantísimo agregarlo como un evento perteneciente al formulario}
    procedure ClickDelBoton(Sender:TObject);
    {Si lo hacés como un procedimiento normal, da error por el tipo}
    {Un evento es TNotifyEvent y un procedimiento no es más que un procedure}
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ClickDelBoton(Sender:TObject);
begin
  ShowMessage('El botón que me llamó dice '+TButton(Sender).Caption+' en su Caption.');
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
  Button1.OnClick:=ClickDelBoton;
  Button2.OnClick:=ClickDelBoton;
  Button3.OnClick:=ClickDelBoton;
end;

end.

Saludos!

subzero 18-03-2010 14:23:39

BrunoBsso, te agradezco tu aporte estuve analizando el ejemplo que me enviaste pero el comportamiento del componente ButtonGroup es diferente pués como te puedes dar cuenta es un contenedor de botones en el cual se crean como si fuese in listbox, y yo los estoy creando en tiempo de ejecución. Este comoponente no posee la caracteristica para colocarle el nombre al botón los adiciona como un item. Voy a seguir revisando y cualquier otra idea que se te ocurra seria de mucha ayuda.

roman 18-03-2010 16:34:51

Con la respuesta de BrunoBsso tienes el 98% resuelto. Ya sólo fíjate que cada ítem del ButtonGroup también tiene su evento OnClick.

// Saludos

BrunoBsso 18-03-2010 17:06:18

Es que para utilizarlo con un ButtonGroup tenés que hacer un casting con los items del grupo.
GrupoBotones.Items[X].OnCLick:=ClickDelBoton;
Es exactamente lo mismo porque cada item del grupo es de tipo TButton.
Saludos.

subzero 18-03-2010 18:05:40

no fucniona pués lo que recibe el sender no es un TButton sino un TGroupButton.... en el mensaje no me muestra el caption del componente.

subzero 18-03-2010 20:36:26

Revisando un poco el componente TButtonGroup tiene un método llamado ButtonClicked el cual tiene un parámetro llamado Index el cual es de mucha utilidad pues de esta manera se puede conocer que botón esta siendo presionado, ahora solo me queda entender como eliminar los botones en tiempo de ejecucion.....

BrunoBsso 18-03-2010 23:17:49

Bueno, corrijo todo lo que dije antes.
Vamos desde cero.
Hola subzero, acá traigo tu respuesta.
Código Delphi [-]
type
  TForm1 = class(TForm)
    Grupo: TButtonGroup;
    procedure FormActivate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure ClickBoton(Sender: TObject); //Declarar un evento para los botones
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ClickBoton(Sender: TObject); //Implementar ese evento
begin
  ShowMessage('Yo soy un botón');
end;

procedure TForm1.FormActivate(Sender: TObject);
var
  I:Integer;
begin
  for I := 0 to Grupo.Items.Count-1 do
    Grupo.Items[i].OnClick:=ClickBoton; //Asignarselo a los botones
end;
Intenté usar las propiedades del Sender en ClickBoton, pero siempre tira error o muestra la propiedad vacía(ojo, estuve haciendo casting de tipo TGrpButtonItem(Sender) así que eso está bien).
Por ejemplo, si querés mostrar el caption en ese evento, te lo muestra vacío.
Es raro, se me acabaron las ideas hasta que vuelva a mi casa.
Pero por lo menos ahí tenés como asignarle un evento en tiempo de ejecucíon.
Es lo mismo que como te lo había dicho antes, pero sin hacer casting ;)
Nos vemos.

BrunoBsso 18-03-2010 23:21:02

Cita:

Empezado por subzero (Mensaje 357473)
Revisando un poco el componente TButtonGroup tiene un método llamado ButtonClicked el cual tiene un parámetro llamado Index el cual es de mucha utilidad pues de esta manera se puede conocer que botón esta siendo presionado, ahora solo me queda entender como eliminar los botones en tiempo de ejecucion.....

Depende de con qué criterio los elimines.
Podés borrar el clickeado de esta forma:
Código Delphi [-]
procedure TForm1.GrupoButtonClicked(Sender: TObject; Index: Integer);
begin
  ShowMessage('¡Me van a borrar!');
  Grupo.Items.Delete(Index);
end;

pabloloustau 18-03-2010 23:22:07

en vez de eliminarlos ponelos invisibles.
visible en false.

BrunoBsso 18-03-2010 23:25:18

Los TGrpButtonItem no tiene esa propiedad.
En tu ButtonGroup agregá una botón (en diseño), seleccioná ese botón y fijate las propiedades que tiene.
No podés trabajar con propiedades que no existen. No es lo mismo un TGrpButtonGroup que un TButton.


La franja horaria es GMT +2. Ahora son las 18:38:54.

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