PDA

Ver la Versión Completa : Recorrer componentes y Destruirlos


nickolas
17-07-2013, 01:11:13
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:

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
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:

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:

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:


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:

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:

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

TButton(PNL_Colectivo.Controls[i]).Tag := FieldByName('ID_ASIENTO').AsInteger;TButton(PNL_Colectivo.Controls[i]).Tag