Programación General > Delphi
Llenar Un Monton De Botones
(1/1)
Perrero:
Tengo un programa en el cual tengo 25 botones (parecen muchos, pero esuqe lo quiero hacer asi), mi problema es que debo de meterles en su caption valores diferentes a cada uno, sin que se repita el mismo numero en cada boton, y esta es la unica manera que conozco para hacerlo:
--- Código: Text --- {solo metere los datos, no importa si los sumeros se repiten}Randomize();Button1.caption:= InttoStr(Random(60)+1);Button2.caption:= InttoStr(Random(60)+1);Button3.caption:= InttoStr(Random(60)+1);...Button25.caption:= InttoStr(Random(60)+1);
Realizarlo de esa forma me parece demasiado feo :alien: aparte de tedioso y quisiera saber si hay una manera de llenar de una manera mucho mas facil, los caption de esos butones.
Gracias de antemano :hola:
Enko:
Tendras que crear lo botones en tiempo de ejecucion y crear tu propio evento para los clicks a los botones.
Te paso un código completo de ejemplo.
--- Código: Text --- unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private declarations } public myButtons: array[1..5, 1..5] of TButton; procedure myButtonClick(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.myButtonClick(Sender: TObject);begin if Sender is TButton then begin ShowMessage(TButton(Sender).Caption); //TButton(Sender).propiead es el butotn que le hicieron clik end;end; procedure TForm1.FormCreate(Sender: TObject);const ConstWidth = 32; ConstHeight = 32;var i,j: Integer;begin for j:=1 to 5 do for i:=1 to 5 do begin myButtons[i,j] := TButton.Create(self); myButtons[i,j].Caption := 'test'; with myButtons[i,j] do begin Width := ConstWidth; // ancho Height := ConstHeight; //alto Left := i * ConstWidth; //posicion X Top := j * ConstHeight; //posicion Y Parent := Form1; //en donde se dibujan los botones Caption := IntToStr(Random(60)+1); onClick := myButtonClick; Visible := True; //para que se vean end; end;end; procedure TForm1.FormDestroy(Sender: TObject);var i,j: Integer;begin for j:=1 to 5 do for i:=1 to 5 do myButtons[i,j].Free;end; end.
Lo que hace el codigo es crear 25 botones a los cuales si haces click, te Hace un ShowMessage con la caption correspondiente al boton que se hizo click.
Perrero:
Mmmmmm, entendi mas o menos, pero estas cosas no me quedaron muy claras:
--- Código: Text ---myButtons[i,j] := TButton.Create(self);
Que significa el self?
--- Código: Text ---myButtons[i,j].Free;
El free quiere decir que los libera de la memoria?
Ah y otra cosa que derrepente parece tonta, que es y que es lo que hace el Sender.
Enko:
Para crear un boton en tiempo de ejecucion necesitas:
*Definir la variable del boton
--- Código: Text --- var Boton: TButton; *Crear una instancia del Boton
--- Código: Text --- Boton := TButton.Create(self);Boton := TButton.Create(From1);Boton := TButton.Create(nil); *Cambiar sus propiedades
--- Código: Text --- Width := 128;Height := 24;Parrent := Form1; //Quien es el Padre del boton, es decir, donde se va a dibujarCaption := 'Boton'onClick := Evento;Visible := True; *Y finalmente liberarlo de la memoria
--- Código: Text --- Boton.Free;
Los eventos en Delphi, es decir los tipo TNotifyEvent estan definidos asi>
--- Código: Text --- type TNotifyEvent = procedure(Sender: TObject); TIntegerFunction = function: Integer; TProcedure = procedure; TStrProc = procedure(const S: string); TMathFunc = function(X: Double): Double;
Asi, todos los eventos son procedimientos que tienen como parametro a "Sender" que es el que crea el evento. O sea, si hiciste click en un boton, en el evento onClick de ese boton, el Sender va a ser el boton.
Lo que pasa, es que sender es de tipo TObject, la clase padre de todas las clases. Todas las clases en Delphi estan heredadas en ella. La Classe TButton, deriva de TCustomButton y esa en algun momento de TComponent y en muchas otra vueltas, finalemnte se llega a TObject.
Como las instancias de clases (seria el objeto creado) en Delpi son punteros y no contienen al objeto en si, mediante type casing podes acceder a las propiedades del parametro Sender como si fuera un TButton (o cualquier otra cosa, siempre que lo fuera)
Todos los TButton son TObject.
Algunos TObject pueden ser TButtons, por eso, en tu propio evento deber'ias verificar si el Sender definitivamente es un TButton con>
--- Código: Text --- if Sender is TButton thenbeginend; Si resulta que el Sender es un TButton entonces podes acceder a las propiedades del boton con>
--- Código: Text --- TButton(Sender).
Existe la palabra reservada 'AS', que cumple la funcion type casing, pero es muuuuuuy lenta, y te conviene usar 'is' y luego type casing;
--- Código: Text --- //esto te consume mucho tiempo//y no se asegura que sea un boton el sender//por eos puede haber un error en tiempo de ejecucionwhith Sender as TButton dobegin Caption := 'Boton'; Visible := True;end;
El Evetno seria algo asi>
Asignamos a nuestro boton, nuestro propio evento onClick
--- Código: Text --- myButton.onClick := myClick; El evento ser'ia algo asi,
--- Código: Text --- procedure myClick(Sender:TObject);begin //en realidad en este caso es 100% seguro de que el Sender es TButton //porque nosotros mismos asignamos el evento a un boton if Sender is TButton then begin ... end;end;
Supongo que con eso queda explicado. :P
Enko:
|Por sierto, podes tener arreglos de botones, en mi caso, use una matriz por comodidad.
--- Código: Text --- arregloBotones: array[1..10] of TButton; arregloBotones[1] := TButton.Create, etc.....
Navegación
Ir a la versión completa