Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 29-10-2006
Delar Delar is offline
Miembro
 
Registrado: oct 2006
Posts: 90
Poder: 18
Delar Va por buen camino
Duda con Buttons!

Bien, pues yo estoy creando una pequeña aplicación, y allí se crean botones en tiempo de ejecución. Entonces, he hecho que, para crearlos, lo haga con el siguiente nombre:
button[buttonv] donde button es un array de 32767 y buttonv es 1. Con esto le consigo dar todas las propiedades, pero no se como hacer que me checkee el click. Alguna solución?

Gracias por adelantado
Responder Con Cita
  #2  
Antiguo 29-10-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

En principio no tendrías que tener ningún problema en hacer algo así:

Código Delphi [-]
button[1].OnClick := ManejadorEvento;

Sin embargo... tal vez te interesara estudiar un poco el funcionamiento de objetos como "TObjectList", que te permiten mantener una lista de objetos (como pudieran ser los botones que mencionas) proporcionándote alguna funcionalidad "extra" que no contarás al tratarlos en un "Array".
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #3  
Antiguo 30-10-2006
Delar Delar is offline
Miembro
 
Registrado: oct 2006
Posts: 90
Poder: 18
Delar Va por buen camino
Que es ManejadorEvento ?
Porque si pongo por ejemplo, button[2].Caption := 'Cambiado';
me da error. Alguna solución?
Responder Con Cita
  #4  
Antiguo 30-10-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
es tu rutina Onclick, debe tener los mismos parámetros que el evento Onclick, aunque el nombre le puedes poner el que más coraje te dé.

Código Delphi [-]
TForm1 = class(TForm)

public
   procedure ManejadorClick(Sender:TObject);
end;

implementation

procedure TForm1.ManejadorClick(Sender:TObject);
begin
  ShowMessage('Pulsado el boton ' + TButton(Sender).Name;
end;

procedure TForm1.FormCreate;
begin
  button[1].OnClick := ManejadorClick;
end;

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #5  
Antiguo 30-10-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

"ManejadorEvento" es un procedimiento declarado y disponible que cumple con el prototipo del evento que se quiere "manejar". ¿Un ejemplo? El que nos ocupa, verás.

Antes de nada podemos comprobar que el evento "OnClick" es del tipo "TNotifyEvent" (muy común en Delphi) y su declaración es la siguiente:

Código Delphi [-]
TNotifyEvent = procedure(Sender: TObject) of object;

Esto quiere decir que el manejador del evento "OnClick" ha de ser un prodecimiento, mejor dicho un método (pues pertenecerá a un objeto), que cuenta con un solo parámetro de tipo "TObject".

Bastaría con declarar e implementar un método de ese tipo para poder estar al tanto cuando se dispare el evento "OnClick". Como hemos de proveer el procedimiento como un método de un objeto, lo haremos utilizando un "TForm", que puede ser un formulario de tu aplicación.

Aquí ves la declaración ("interface") de un formulario de ejemplo, tal como aparece al iniciarse un proyecto en Delphi y que no cuenta sino con un botón que luego utilizaremos para seguir con lo que nos ocupa.

Código Delphi [-]
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

Como ves dentro del formulario hay un botón y un método que responderá al evento "OnClick" de dicho botón. El código fuente anterior se encargó de escribirlo el diseñador de Delphi. Nosotros vamos a añadir por nuestra cuenta un procedimiento que se encarge del evento "OnClick" de otro botón, esta vez creado en tiempo de ejecución.

Código Delphi [-]
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    procedure ManejadorEventoOnClick(Sender: TObject);
  public
    { Public declarations }
  end;

Como puedes ver los métodos "Button1Click" y "ManejadorEventoOnClick" tienen el mismo prototipo: mismo número de parámetros, y así podrían utilizarse indistintamente, es decir, al botón que luego crearemos en tiempo de ejecución podríamos darle cualquiera de los dos métodos para que manejase su evento "OnClick", puesto que son iguales, como queda dicho.

Ahora vamos a la implementación del método. Se trata de que lo declarado en la cláusula "interfaz" de las unidades de Delphi ha de estar implementado, precisamente, en la cláusula "implementation". Lo vemos mejor en el propio código fuente, concretamente, con el de toda la unidad de nuestro formulario:

Código Delphi [-]
unit Unit1;

interface

uses
  Forms, Classes, Controls, StdCtrls, Dialogs;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    procedure ManejadorEventoOnClick(Sender: TObject);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  // Ya lo usaremos luego
end;

procedure TForm1.ManejadorEventoOnClick(Sender: TObject);
begin
  ShowMessage('¡Hola desde el manejador del evento OnClick!');
end;

end.

Ahí puedes ver que ya prepramos la implementación del método "ManejadorEventoOnClick", es decir, ya podríamos utilizarlo perfectamente. Entonces vamos a crear un botón en tiempo de ejecución y vamos a asignarle el manejador oportuno para su evento "OnClick".

Para abreviar lo haremos en el otro evento "OnClick", es decir, en el que fue creado en tiempo de diseño para el botón que también añadimos a nuestro formulario en tiempo de diseño, con ayuda de Delphi. También por abreviar, declararemos una variable "global" que se dedique a guardar la instancia de nuestro botón creado en tiempo de ejecución:

Código Delphi [-]
unit Unit1;

interface

uses
  Forms, Classes, Controls, StdCtrls, Dialogs;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    procedure ManejadorEventoOnClick(Sender: TObject);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Boton: TButton; // Nuestro botón

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  // Creamos el botón
  Boton := TButton.Create(Self);

  // Le damos un padre como tiene que ser
  Boton.Parent := Self; // Este mismo formulario

  // Lo situamos en el formulario
  Boton.SetBounds(20, 20, 100, 25);

  // Y un Caption para verlo mejor
  Boton.Caption := '¡Haz clic aquí!';

  // Y al fin un manejador para su evento "OnClick"
  Boton.OnClick := ManejadorEventoOnClick;
end;

procedure TForm1.ManejadorEventoOnClick(Sender: TObject);
begin
  ShowMessage('¡Hola desde el manejador del evento OnClick!');
end;

end.

Hecho lo anterior, cuando se haga "clic" en el botón creado en tiempo de diseño ("Button1") se disparará el evento correspondiente (asignado también en tiempo de diseño ("Button1Click") y en este instanciaremos el botón que creamos en tiempo de ejecución.

Luego de lo dicho ya podríamos ver en nuestro formulario el botón que creamos en tiempo de ejecución, además del que creamos en tiempo de diseño, y, cuando se haga "clic" en el primero se disparará su evento "OnClick", es decir, se ejecutará el código del método "ManejadorEventoOnClick" y podremos ver el mensaje "¡Hola desde el manejador del evento OnClick!".

Y eso es todo. Como al botón le dimos como padre el formulario en que se encuentra, cuando se destruya el formulario se destruirá también el botón, es decir, la instancia del botón que creamos en tiempo de ejecución será liberada de igual forma que se hará con la instancia del botón que creamos en tiempo de diseño.

Sin embargo, creo que es una buena práctica asegurarse de que las instancias de que nosotros nos hacemos cargo (en tiempo de ejecución) sean liberadas también por nuestra cuenta, para lo que podríamos utilizar el propio evento "OnDestroy" de nuestro formulario. Algo así, vaya:

Código Delphi [-]
procedure TForm1.FormDestroy(Sender: TObject);
begin
  Boton.Free; // Fue un placer Boton
end;

A continuación y cayendo en la prolijidad el código fuente de toda la unidad de nuestro formulario:

Código Delphi [-]
unit Unit1;

interface

uses
  Forms, Classes, Controls, StdCtrls, Dialogs;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
    procedure ManejadorEventoOnClick(Sender: TObject);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Boton: TButton; // Nuestro botón

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  // Creamos el botón
  Boton := TButton.Create(Self);

  // Le damos un padre como tiene que ser
  Boton.Parent := Self; // Este mismo formulario

  // Lo situamos en el formulario
  Boton.SetBounds(20, 20, 100, 25);

  // Y un Caption para verlo mejor
  Boton.Caption := '¡Haz clic aquí!';

  // Y al fin un manejador para su evento "OnClick"
  Boton.OnClick := ManejadorEventoOnClick;
end;

procedure TForm1.ManejadorEventoOnClick(Sender: TObject);
begin
  ShowMessage('¡Hola desde el manejador del evento OnClick!');
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Boton.Free; // Fue un placer Boton
end;

end.

En cuanto al error que mencionas... ah, espera, que no mencionas ningún error. Decir que te da un error no es decir mucho: expón por aquí el error que te encuentras, su mensaje, pues que puede aportar información útil para tratar de ayudarte.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #6  
Antiguo 30-10-2006
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por Delar
...si pongo por ejemplo, button[2].Caption := 'Cambiado';
me da error.
(1) ¿Que eror te da? (no somos adivinos)
(2) ¿Cómo tienes definido el array Button?
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #7  
Antiguo 30-10-2006
Delar Delar is offline
Miembro
 
Registrado: oct 2006
Posts: 90
Poder: 18
Delar Va por buen camino
A ver. Me explico. Yo lo que estoy haciendo es una DLL. Esta DLL es para crear objetos en tiempo de ejecución. Entonces, como le daria una accion a un boton creado en tiempo de ejecución?
Aquí os dejo el source de la DLL (No está acabada):
Código Delphi [-]
library GMControls;

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

var button: array[0..32767] of TButton;
var edit: array[0..32767] of TEdit;
var check: array[0..32767] of TCheckBox;
var buttonv: integer=1;
var editv: integer=1;
var checkv: integer=1;
{$R *.res}
//Button Functions
function CreateButton(pw,x,y,w,h:real):real; cdecl;
begin
button[buttonv]:= TButton.Create(application.MainForm);
button[buttonv].Left := round(x);
button[buttonv].Top := round(y);
button[buttonv].Height := round(h);
button[buttonv].Width := round(w);
button[buttonv].Caption := '';
button[buttonv].ParentWindow := round(pw);
button[buttonv].Default := False;
buttonv := buttonv+1;
Result:= buttonv-1;
end;
function ButtonSetCaption(at:double;cpt:string):double; cdecl;
begin
button[round(at)].Caption := cpt;
end;
function ButtonSetEnabled(at:double;enabled: real):real; cdecl;
begin
if enabled = 0 then
begin
button[round(at)].Enabled := false;
end
else
begin
button[round(at)].Enabled := True;
end;
Result := enabled;
end;
//Edit Functions
function CreateEdit(pw,x,y,w,h:real):real; cdecl;
begin
edit[editv]:= TEdit.Create(nil);
edit[editv].Text := '';
edit[editv].Left := round(x);
edit[editv].Top := round(y);
edit[editv].Width := round(w);
edit[editv].Height := round(h);
edit[editv].Visible := True;
edit[editv].ParentWindow := round(pw);
editv := editv+1;
Result := editv-1;
end;
function EditSetText(at:double;text:string):double; cdecl;
begin
edit[round(at)].Text := text;
end;
function EditSetEnabled(at:double;enabled: real):real; cdecl;
begin
if enabled = 0 then
begin
edit[round(at)].Enabled := false;
end
else
begin
edit[round(at)].Enabled := True;
end;
Result := enabled;
end;
//Check Functions
function CheckBoxCreate(pw,x,y,w,h:real):real; cdecl;
begin
check[checkv]:= TCheckBox.Create(nil);
check[checkv].Left := round(x);
check[checkv].Top := round(y);
check[checkv].Width := round(w);
check[checkv].Height := round(h);
check[checkv].ParentWindow := round(pw);
check[checkv].Color := clWhite;
checkv := checkv+1;
result := checkv-1;
end;
//--------------------
//Exports
exports CreateButton, ButtonSetCaption, CreateEdit, ButtonSetEnabled, EditSetText, EditSetEnabled,
CheckBoxCreate;
//--------------------
begin
end.

Saludos, y a ver si alguien lo soluciona!
PD: dec, gracias por la explición, era realmente buena.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Duda en DLL Isako API de Windows 2 04-03-2005 18:08:27
Duda alachaise PHP 1 11-01-2005 19:25:43
Duda con DBx e IB Slash Conexión con bases de datos 0 27-12-2004 16:34:24
Una duda condor Varios 8 02-06-2004 05:33:56
duda con sql merlin SQL 2 19-05-2004 16:32:13


La franja horaria es GMT +2. Ahora son las 18:28:46.


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
Copyright 1996-2007 Club Delphi