• Domingo 22 de Diciembre de 2024, 14:42

Autor Tema:  Llenar Un Monton De Botones  (Leído 1988 veces)

Perrero

  • Miembro MUY activo
  • ***
  • Mensajes: 209
    • Ver Perfil
Llenar Un Monton De Botones
« en: Viernes 5 de Mayo de 2006, 01:58 »
0
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
  1.  {solo metere los datos, no importa si los sumeros se repiten}
  2. Randomize();
  3. Button1.caption:= InttoStr(Random(60)+1);
  4. Button2.caption:= InttoStr(Random(60)+1);
  5. Button3.caption:= InttoStr(Random(60)+1);
  6. .
  7. .
  8. .Button25.caption:= InttoStr(Random(60)+1);
  9.  
  10.  

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

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Llenar Un Monton De Botones
« Respuesta #1 en: Viernes 5 de Mayo de 2006, 03:47 »
0
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
  1.  
  2. unit Unit1;
  3.  
  4. interface
  5.  
  6. uses
  7.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  8.   Dialogs, StdCtrls;
  9.  
  10. type
  11.   TForm1 = class(TForm)
  12.     procedure FormCreate(Sender: TObject);
  13.     procedure FormDestroy(Sender: TObject);
  14.   private
  15.     { Private declarations }
  16.   public
  17.     myButtons: array[1..5, 1..5] of TButton;
  18.     procedure myButtonClick(Sender: TObject);
  19.   end;
  20.  
  21. var
  22.   Form1: TForm1;
  23.  
  24. implementation
  25.  
  26. {$R *.dfm}
  27.  
  28. procedure TForm1.myButtonClick(Sender: TObject);
  29. begin
  30.   if Sender is TButton then
  31.   begin
  32.     ShowMessage(TButton(Sender).Caption);
  33.     //TButton(Sender).propiead es el butotn que le hicieron clik
  34.   end;
  35. end;
  36.  
  37. procedure TForm1.FormCreate(Sender: TObject);
  38. const
  39.   ConstWidth = 32;
  40.   ConstHeight = 32;
  41. var
  42.   i,j: Integer;
  43. begin
  44.   for j:=1 to 5 do
  45.     for i:=1 to 5 do
  46.     begin
  47.       myButtons[i,j] := TButton.Create(self);
  48.       myButtons[i,j].Caption := 'test';
  49.       with  myButtons[i,j] do
  50.       begin
  51.         Width := ConstWidth; // ancho
  52.         Height := ConstHeight; //alto
  53.         Left := i * ConstWidth; //posicion X
  54.         Top := j * ConstHeight; //posicion Y
  55.         Parent := Form1; //en donde se dibujan los botones
  56.         Caption := IntToStr(Random(60)+1);
  57.         onClick := myButtonClick;
  58.         Visible := True; //para que se vean
  59.       end;
  60.     end;
  61. end;
  62.  
  63. procedure TForm1.FormDestroy(Sender: TObject);
  64. var
  65.   i,j: Integer;
  66. begin
  67.   for j:=1 to 5 do
  68.     for i:=1 to 5 do
  69.       myButtons[i,j].Free;
  70. end;
  71.  
  72. end.
  73.  
  74.  

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.
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.

Perrero

  • Miembro MUY activo
  • ***
  • Mensajes: 209
    • Ver Perfil
Re: Llenar Un Monton De Botones
« Respuesta #2 en: Viernes 5 de Mayo de 2006, 04:22 »
0
Mmmmmm, entendi mas o menos, pero estas cosas no me quedaron muy claras:

Código: Text
  1. myButtons[i,j] := TButton.Create(self);
  2.  

Que significa el self?

Código: Text
  1. myButtons[i,j].Free;
  2.  

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

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Llenar Un Monton De Botones
« Respuesta #3 en: Viernes 5 de Mayo de 2006, 14:22 »
0
Para crear un boton en tiempo de ejecucion necesitas:
*Definir la variable del boton
Código: Text
  1.  
  2. var
  3.   Boton: TButton;
  4.  
  5.  
*Crear una instancia del Boton
Código: Text
  1.  
  2. Boton := TButton.Create(self);
  3. Boton := TButton.Create(From1);
  4. Boton := TButton.Create(nil);
  5.  
  6.  
*Cambiar sus propiedades
Código: Text
  1.  
  2. Width := 128;
  3. Height := 24;
  4. Parrent := Form1; //Quien es el Padre del boton, es decir, donde se va a dibujar
  5. Caption := 'Boton'
  6. onClick := Evento;
  7. Visible := True;
  8.  
  9.  
*Y finalmente liberarlo de la memoria
Código: Text
  1.  
  2. Boton.Free;
  3.  
  4.  

Los eventos en Delphi, es decir los tipo TNotifyEvent estan definidos asi>
Código: Text
  1.  
  2. type
  3.   TNotifyEvent = procedure(Sender: TObject);  
  4.  
  5.   TIntegerFunction = function: Integer;
  6.   TProcedure = procedure;
  7.   TStrProc = procedure(const S: string);
  8.   TMathFunc = function(X: Double): Double;
  9.  
  10.  

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
  1.  
  2. if Sender is TButton then
  3. begin
  4. end;
  5.  
  6.  
Si resulta que el Sender es un TButton entonces podes acceder a las propiedades del boton con>
Código: Text
  1.  
  2. TButton(Sender).
  3.  
  4.  

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
  1.  
  2. //esto te consume mucho tiempo
  3. //y no se asegura que sea un boton el sender
  4. //por eos puede haber un error en tiempo de ejecucion
  5. whith Sender as TButton do
  6. begin
  7.    Caption := 'Boton';
  8.    Visible := True;
  9. end;
  10.  
  11.  

El  Evetno seria algo asi>
Asignamos a nuestro boton, nuestro propio evento onClick
Código: Text
  1.  
  2. myButton.onClick := myClick;
  3.  
  4.  
El evento ser'ia algo asi,
Código: Text
  1.  
  2. procedure myClick(Sender:TObject);
  3. begin
  4.    //en realidad en este caso es 100% seguro de que el Sender es TButton
  5.    //porque nosotros mismos asignamos el evento a un boton
  6.   if Sender is TButton  then
  7.   begin
  8.      ...
  9.    end;
  10. end;
  11.  
  12.  

Supongo que con eso queda explicado. :P

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Llenar Un Monton De Botones
« Respuesta #4 en: Viernes 5 de Mayo de 2006, 14:23 »
0
|Por sierto, podes tener arreglos de botones, en mi caso, use una matriz por comodidad.

Código: Text
  1.  
  2. arregloBotones: array[1..10] of TButton;
  3.  
  4. arregloBotones[1] := TButton.Create, etc.....
  5.  
  6.