Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Recorrer componentes y Destruirlos (https://www.clubdelphi.com/foros/showthread.php?t=83700)

nickolas 17-07-2013 01:11:13

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.

ecfisa 17-07-2013 02:47:52

Cita:

Empezado por nickolas (Mensaje 463986)
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. :)

nickolas 17-07-2013 03:32:06

Gracias por la respuesta Ecfisa ya lo resolvi de otra forma pero probare la tuya igual.

Gracias por la pronta respuesta.

gatosoft 19-07-2013 04:00:22

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


La franja horaria es GMT +2. Ahora son las 04:50:54.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi