Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-08-2011
Avatar de richy08
richy08 richy08 is offline
Miembro
 
Registrado: may 2007
Ubicación: Bucerias, Nayarit Mexico
Posts: 529
Poder: 17
richy08 Va por buen camino
Asignar a tbitbtn evento en tiempo de ejecucion

buenas tardes compañeros les explico un poco lo que quiero hacer, con un query estoy poniendo en tiempo de ejecucion bitbtn por cada categoria que encuentro en una bd, a estos bitbtn creados en tiempo de ejecucion quiero asignarles un evento, pero dicho evento necesito que lleve como parametro el id (lo obtengo del query) de cada categoria para lo cual uso el siguiente codigo

Código Delphi [-]
       Left:=8;
       top:=8;
       Qry_Line.Close;
       Qry_Line.Open;
       Seleccion:=0;
       Seleccion:=Qry_Line.RecordCount;

       While ido
       begin
          boton := TBitBtn.Create(nil);
          boton.Name:='btb'+inttostr(Qry_Line.fieldbyname('idlinea').Value);
          boton.Hint:=Qry_Line.fieldbyname('descripcion').Value;
          boton.Left:= left;
          boton.Top:=8;
          boton.Width:=81;
          boton.Height:=57;
          boton.Parent:=Pnl_line;
          linea:= Qry_Line.fieldbyname('idlinea').AsInteger;
          boton.OnClick:=categoriallena(linea);

          if FileExists('C:\Proyectos Delphi\Zibarita TouchScreen\Image\'+inttostr(Qry_Line.fieldbyname('idlinea').Value)+'.bmp') then
          begin
            boton.Glyph.LoadFromFile('C:\Proyectos Delphi\Zibarita TouchScreen\Image\'+inttostr(Qry_Line.fieldbyname('idlinea').Value)+'.bmp');
            boton.Caption:='';
          end
          else
            boton.Caption:=Qry_Line.fieldbyname('idlinea').Value;



         Qry_Line.next;
         left:=left+86;
         i:=i+1;
       end;
      end;

pero no logro hacer que compile, el motivo de llevar el id de la categoria es por que al ejecutar un click sobre el boton quiero que en otro tpanel mostrar las diferentes sub categorias, alguien me podria indicar como ligarle correctamente el evento en tiempo de ejecucion, y como deberia ser la declaracion del procedure que se encargara de mostrar las sub categorias, ahora lo tengo asi

Código Delphi [-]
procedure TFrm_Main.categoriallena(x: integer);
begin
  showmessage(inttostr(x));

end;

gracias por cualquier comentario
Responder Con Cita
  #2  
Antiguo 08-08-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola richy08.

Cita:
quiero asignarles un evento, pero dicho evento necesito que lleve como parametro el id
Lamentablemente no podés hacerlo de ese modo.

Pero se me ocurren dos modos de obtener el valor ID en el evento OnClick del TBitBtn.
Uno del nombre que le asignas al TBitBtn (ya que incluís el ID) . Y el segundo, que creo más simple y seguro, asignando el valor ID a la propiedad Tag del BitBtn en la creación.

Ejemplo:
Código Delphi [-]
procedure TTuForm.BitBtnClick(Sender: TObject);
var
  Valor_id: Integer;
begin
  Valor_id:= StrToInt(Copy(TBitBtn(Sender).Name, 4, MaxInt));  // extraer valor  ID del nombre
  Valor_id:= TBitBtn(Sender).Tag; // extraer valor ID de Tag
  ShowMessage(IntToStr(Valor_id)); // o lo que hagas con el valor
  ...
end;

...
begin
  Left:=8;
  top:=8;
  Qry_Line.Close;
  Qry_Line.Open;
  Seleccion:=0;
  Seleccion:=Qry_Line.RecordCount;
  While ido
  begin
     boton := TBitBtn.Create(nil);
     boton.Name:='btb'+inttostr(Qry_Line.fieldbyname('idlinea').Value);
     boton.Hint:=Qry_Line.fieldbyname('descripcion').Value;
     boton.Left:= left;
     boton.Top:=8;
     boton.Width:=81;
     boton.Height:=57;
     boton.Tag:= Qry_Line.fieldbyname('idlinea').AsInteger; // Valor ID en Tag
     ...
     boton.OnClick:= BitBtnClick;
     ...

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 08-08-2011 a las 21:46:58. Razón: Agregar comentarios
Responder Con Cita
  #3  
Antiguo 08-08-2011
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 23
maeyanes Va por buen camino
Hola...

El detalle es que las propiedades que son eventos son de un tipo especial. En el caso del evento OnClick son del tipo TNotifyEvent el cual está declarado como:

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

Esto es, que a la propiedad OnClick solo le puedes asignar métodos de objeto con la misma firma que la declarada:

Código Delphi [-]
TMyForm = class(TForm)
  // Declaraciones de componentes y manejadores de eventos
private
  procedure DoOnClick(Sender: TObject);
  // ....
end;

implementation

procedure TMyForm.DoOnClick(Sender: TObject);
begin
  // Hacer algo
end;

// Asignar evento en tiempo de ejecución:
BitBtn.OnClick := DoOnClick;

Para lo que tu necesitas, podrías usar la propiedad Tag de los componentes. Esta propiedad es de tipo entero y bien podría almacenar el valor del ID.

Código Delphi [-]
while ido
  begin
    boton := TBitBtn.Create(nil);
    // inicializas propiedades
    linea := Qry_Line.fieldbyname('idlinea').AsInteger;
    boton.Tag := linea;
    boton.OnClick := DoOnClick;
    // demás código
end;

// Método DoOnClick;
procedure TMyForm.DoOnClick(Sender: TObject);
begin
  if Sender is TBitBtn then
  begin
    with TBitBtn(Sender) do
    begin
      if Tag = 1 then
        // ...
      else
        if Tag = 2 then
          // ...
    end
  end
end;

Esto es solo un ejemplo, pero podría ayudarte a resolver tu problema.



Saludos...
__________________
Lee la Guía de Estilo antes que cualquier cosa. - Twitter
Responder Con Cita
  #4  
Antiguo 08-08-2011
Avatar de richy08
richy08 richy08 is offline
Miembro
 
Registrado: may 2007
Ubicación: Bucerias, Nayarit Mexico
Posts: 529
Poder: 17
richy08 Va por buen camino
gracias a los dos por sus consejos, probare para ver cual es la mejor forma de resolverlo


saludos
Responder Con Cita
  #5  
Antiguo 08-08-2011
Avatar de richy08
richy08 richy08 is offline
Miembro
 
Registrado: may 2007
Ubicación: Bucerias, Nayarit Mexico
Posts: 529
Poder: 17
richy08 Va por buen camino
ok ya lo probe y si funciona parcialmente, digo parcialmente por que al presionar el boton me muestra ya los sub menus pero no entiendo por que desaparecen los botones de linea al ser presionados el evento que mando llamar en el onclick es este

Código Delphi [-]
procedure TFrm_Main.DoOnClick(Sender: TObject);
var
i, seleccion : integer;
botonC : tbitbtn;
left, top: integer;
begin
  if Sender is TBitBtn then                                                           
  begin
    with TBitBtn(Sender) do
    begin
       Left:=15;
       top:=16;
       Qry_Categoria.Close;
       Qry_Categoria.ParamByName('idlinea').Value:=tag;
       Qry_Categoria.Open;
       i:=0;
       Seleccion:=0;
       Seleccion:=Qry_Categoria.RecordCount;

       While ido
       begin
          botonC := TBitBtn.Create(nil);
          botonC.Name:='btbc'+inttostr(Qry_Line.fieldbyname('idlinea').Value);
          botonC.Hint:=Qry_Categoria.fieldbyname('descripcion').Value;
          botonC.Left:= left;
          botonC.Top:=top;
          botonC.Width:=81;
          botonC.Height:=57;
          botonC.Parent:=Categoria;
      //    boton.OnClick:=;

          if FileExists('C:\Proyectos Delphi\Zibarita TouchScreen\Image\'+inttostr(Qry_Categoria.fieldbyname('idcat').Value)+'.bmp') then
          begin
            botonC.Glyph.LoadFromFile('C:\Proyectos Delphi\Zibarita TouchScreen\Image\'+inttostr(Qry_Categoria.fieldbyname('idcat').Value)+'.bmp');
            botonC.Caption:='';
          end
          else
            botonC.Caption:=Qry_Categoria.fieldbyname('idcat').Value;

         Qry_Categoria.next;
         top:=top+62;
         i:=i+1;
       end;
    end;
  end;
end;

alguna idea ??, mil gracias por su tiempo

corrijo no desaparecen se cambian de posicion :S

Última edición por richy08 fecha: 08-08-2011 a las 23:45:14.
Responder Con Cita
  #6  
Antiguo 08-08-2011
Avatar de richy08
richy08 richy08 is offline
Miembro
 
Registrado: may 2007
Ubicación: Bucerias, Nayarit Mexico
Posts: 529
Poder: 17
richy08 Va por buen camino
ya encontre el detalle el codigo queda asi

Código Delphi [-]
procedure TFrm_Main.DoOnClick(Sender: TObject);
var
i, seleccion : integer;
botonC : tbitbtn;
left, top: integer;
begin
  if Sender is TBitBtn then                                                           
  begin
    with TBitBtn(Sender) do
    begin
       Qry_Categoria.Close;
       Qry_Categoria.ParamByName('idlinea').Value:=tag;
       Qry_Categoria.Open;
    end;

    
       Left:=15;
       top:=16;

       i:=0;
       Seleccion:=0;
       Seleccion:=Qry_Categoria.RecordCount;

       While ido
       begin
          botonC := TBitBtn.Create(nil);
          botonC.Name:='btbc'+inttostr(Qry_Line.fieldbyname('idlinea').Value);
          botonC.Hint:=Qry_Categoria.fieldbyname('descripcion').Value;
          botonC.Left:= left;
          botonC.Top:=top;
          botonC.Width:=81;
          botonC.Height:=57;
          botonC.Parent:=Categoria;
      //    boton.OnClick:=;

          if FileExists('C:\Proyectos Delphi\Zibarita TouchScreen\Image\'+inttostr(Qry_Categoria.fieldbyname('idcat').Value)+'.bmp') then
          begin
            botonC.Glyph.LoadFromFile('C:\Proyectos Delphi\Zibarita TouchScreen\Image\'+inttostr(Qry_Categoria.fieldbyname('idcat').Value)+'.bmp');
            botonC.Caption:='';
          end
          else
            botonC.Caption:=Qry_Categoria.fieldbyname('idcat').Value;

         Qry_Categoria.next;
         top:=top+62;
         i:=i+1;
       end;
  end;
end;



saludos
Responder Con Cita
  #7  
Antiguo 09-08-2011
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 23
maeyanes Va por buen camino
Hola...

No se exactamente que deseas hacer, lo que si te puedo decir es que tu código está propenso a que tengas pérdidas de memoria (memory leak) al momento de cerrar la aplicación.

Si no vas a guardar referencias a los botones fuera del método DoOnClick, te recomiendo que uses TBitBtn.Create(Self), para que al cerrar el formulario este destruya todos esos botones al momento de destruirse.

Otro error que encuentro es que estás usando algunas variables con el mismo nombre de propiedades (Top, Left) y esto puede producirte varios errores lógicos.


Saludos...
__________________
Lee la Guía de Estilo antes que cualquier cosa. - Twitter
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
borrar o liberar componente TBITBTN en tiempo de ejecucion Lupita Varios 4 19-07-2008 00:11:44
Asignar Evento OnClick en forma dinamica en tiempo de ejecucion delphi50jmb OOP 7 06-07-2008 03:46:02
Asignar evento OnDrawColumnCell en tiempo de ejecución gluglu OOP 6 01-06-2007 13:14:58
Asignar evento Oncalcfield en tiempo de ejecucion el_barto Conexión con bases de datos 5 06-09-2005 00:08:46
Asignar la ruta de tablas en tiempo de ejecucion tortelini Varios 2 19-03-2005 12:13:53


La franja horaria es GMT +2. Ahora son las 20:30:51.


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