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 17-07-2013
nickolas nickolas is offline
Miembro
NULL
 
Registrado: may 2011
Posts: 32
Poder: 0
nickolas Va por buen camino
Recorrer componentes y Destruirlos

Hola a todos, tengo una duda y seria genial que alguien me de una respuesta ya que es buscado pero sin suerte.

Estoy haciendo un sistema para una boleteria de colectivos y dependiendo de la cantidad de asiento que tenga el colectivo creo una cantidad determinada de botones que simulan los asientos. mi incoveniente se encuentra cuando tengo que cambiarles el TAG a los botones ya estos guardan los ID de los asientos que pertenecen al viajes seleccionado. El error que me ocurre es que siempre cambia el tag del ultimo Boton y no de todos uno por uno como deberia.

Este es mi codigo:

Código Delphi [-]
var
  TEMP_Asientos:Tzquery;
  I, N:Integer;
  CantidadAsientos:Integer;


begin
  I := 0;
  N := 0;

  {Creo el query Temporal para reservar el asiento}
  TEMP_Asientos := TZQuery.Create(DM_Conecciones);
  TEMP_Asientos.Connection := DM_Conecciones.Conexion;


  TEMP_Asientos.Close;
  TEMP_Asientos.SQL.Clear;
  {Cambio la consulta}
  TEMP_Asientos.SQL.Add('SELECT * '+
                        'FROM asientos '+
                        'WHERE id_viaje = :pIdViaje');
  {paso los parametros}
  TEMP_Asientos.ParamByName('pIdViaje').AsInteger := DM_Conecciones.ZQ_Boleteria.FieldByName('id_viaje').AsInteger;
  {ejecuto la consulta}
  TEMP_Asientos.Open;

  {Paso la cantidad de asiento}
  CantidadAsientos := TEMP_Asientos.RecordCount + 1;
  {Coloco el puntero en la primera posicion}
  TEMP_Asientos.First;


for N := 1 to PNL_colectivo.ComponentCount - 1 do
  begin
  if PNL_colectivo.Components[N] is TButton then
    Begin
      For I := 1 to CantidadAsientos -1 do
     begin
      Boton.Tag := TEMP_Asientos.FieldByName('id_asiento').AsInteger;


      TEMP_Asientos.Next;
      end;

    end;


Espero sus respuestass Gracias.

Última edición por ecfisa fecha: 17-07-2013 a las 02:07:01. Razón: Quitar carita del código
Responder Con Cita
  #2  
Antiguo 17-07-2013
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
Cita:
Empezado por nickolas Ver Mensaje
Estoy haciendo un sistema para una boleteria de colectivos y dependiendo de la cantidad de asiento que tenga el colectivo creo una cantidad determinada de botones que simulan los asientos. mi incoveniente se encuentra cuando tengo que cambiarles el TAG a los botones ya estos guardan los ID de los asientos que pertenecen al viajes seleccionado. El error que me ocurre es que siempre cambia el tag del ultimo Boton y no de todos uno por uno como deberia.
Hola nickolas.

No veo en ningún lado la creación de los TButtons, pero suponiendo que ya estén creados yo haría el planteo de este modo:
Código Delphi [-]
var
  TEMP_Asientos:Tzquery;
  i: Integer;
begin
  TEMP_Asientos := TZQuery.Create(DM_Conecciones);
  with TEMP_Asientos do
  try
    Connection := DM_Conecciones.Conexion;
    Close;
    // Seleccionar todos los asientos cuyo ID sea igual al buscado
    SQL.Text := 'SELECT * FROM ASIENTOS WHERE ID_VIAJE = :PIDVIAJE ORDER BY ID_VIAJE';
    ParamByName('PIDVIAJE').AsString :=
      DM_Conecciones.ZQ_Boleteria.FieldByName('id_viaje').AsInteger;
    Open;  // Abrir TEMP_Asientos
    // Recorrer los registros seleccionados
    i := 0;
    while not Eof and (i < PNL_Colectivo.ControlCount) do
    begin
      if PNL_Colectivo.Controls[i] is TButton then // ¿ Es un TButton ?
      begin                                        // Si, asignar el ID al Tag
        TButton(PNL_Colectivo.Controls[i]).Tag := FieldByName('ID_ASIENTO').AsInteger;
        Inc(i);  // Incrementar índice
      end; 
      Next;  // Siguiente registro
    end;
  finally
    Close; // Cerrar TEMP_Asientos
    Free;  // Liberar
  end;
end;
Con seguridad encuentres algún error en el código por que lo hice en el notepad (no tengo Delphi en este equipo), pero en líneas generales creo que la lógica se entiende.

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 17-07-2013
nickolas nickolas is offline
Miembro
NULL
 
Registrado: may 2011
Posts: 32
Poder: 0
nickolas Va por buen camino
Gracias por la respuesta Ecfisa ya lo resolvi de otra forma pero probare la tuya igual.

Gracias por la pronta respuesta.
Responder Con Cita
  #4  
Antiguo 19-07-2013
Avatar de gatosoft
[gatosoft] gatosoft is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Bogotá, Colombia
Posts: 833
Poder: 22
gatosoft Va camino a la fama
Bien que lo hayas solucionado, y bien por la solución de Ecfisa, pero tengo unas observaciones:

1. No haces un ordenamiento en el Select de asientos, por loq ue puedes llevarte sorpesas después de un ar de asignaciones de puestos. Es decir, podría salirte el asiento 12 de primero y despuesé el 3, etc.
2. En general las listas en Delphi comienzan a numerarse de cero, asi que cuando haces el recorrido de los componentes, con:

Código Delphi [-]
for N := 1 to PNL_colectivo.ComponentCount - 1 do

No estás teniendo en cuenta el componente cero...

3. Es una buena práctica recorrer los Datasets con While, como lo hace ecfisa en su ejemplo:


Código Delphi [-]
  ElDataset.First;
  While not ElDataset.Eof do
   Begin
        //hacer algo con el registro...
        ElDatset.Next;
  end; //while

4. No veo de donde sacas la variable "Boton", en la línea:

Código Delphi [-]
Boton.Tag := TEMP_Asientos.FieldByName('id_asiento').AsInteger;

Posiblemente esto era lo que te generaba el error que mencionas, pues debe ser una variable global que utilizas para crear los botones y puedes estar quedando con el último valor

Tal vez no te hubiera fallado si asigans el valor a la variable previmente:

Código Delphi [-]
for N := 1 to PNL_colectivo.ComponentCount - 1 do
  begin
  if PNL_colectivo.Components[N] is TButton then
    Begin
      For I := 1 to CantidadAsientos -1 do
     begin
      Boton := TButton(PNL_colectivo.Components[N]);
      Boton.Tag := TEMP_Asientos.FieldByName('id_asiento').AsInteger;


      TEMP_Asientos.Next;
      end;

    end;

otra opcion como hace ecfisa es hacer el typeCast directamente sobre la lista de componentes/controles

Código Delphi [-]
TButton(PNL_Colectivo.Controls[i]).Tag := FieldByName('ID_ASIENTO').AsInteger;
TButton(PNL_Colectivo.Controls[i]).Tag
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
recorrer componentes NEG1414 C++ Builder 12 11-12-2007 05:50:43
Recorrer los componentes de un DbCtrlGrid ? andresenlared Varios 4 18-07-2007 01:32:55
Recorrer un pchar Status Quo Varios 23 27-05-2006 19:07:55
Recorrer un archivo .rtf blamsa Varios 2 25-05-2005 11:52:48
Recorrer un Treeview mateamargo OOP 0 11-11-2003 16:53:39


La franja horaria es GMT +2. Ahora son las 10:58:56.


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