FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Problemas con TList
Hola, resulta q quiero editar los datos de una tabla de base de datos, y bueno quiero hacerlos dinamicamente, cuando creo los TList de TLabels y de TEdit, me muestra todo bien, pero cuando quiero guardar las modificaciones, me saca un error q dice "List index out of bound (0)".
Pero eso no es todo, cuando vuelvo a ejecutar y logra guardar, me guarda valores q imagino quedaron residentes en memoria, q son distintos a los q modifique en los edit creados. Finalmente cuando cierro el form, quiero destruir las listas y me saca error de acceso o violación. Este es el codigo: por favor ayudenme con sugerencias.
Un Saludo Erik PD: perdon por colocar todo el Unit, pero no quiero q se pierda detalles Última edición por dec fecha: 18-01-2008 a las 01:58:10. |
#2
|
||||
|
||||
Bienvenido; en primer lugar nunca dejes de utilizar las etiquetas [ delphi ]
Tambien sería util que nos digas la linea donde se genera el error. Inicialmente i j k supuestamente es siempre 0... entonces para que usas h??? bueno... con mas datos podría responder "algo". Saludos |
#3
|
|||
|
|||
Gracias por la sugerencia.
Bueno i,j,k son punteros q apuntan a primer elemento de cada lista (son 3 listas) y h es un entero q ayuda a recorrer toda la lista e ir guardando en la bd cada item. En realidad el problema se da cuando presiono el Button1 (con el q guarda los cambios realizados en los valores de edit dinamicos), y el otro problema cuando trato de destruir las LISTAS con el metodo FormClose y el Button2 (Cancelar) |
#4
|
|||
|
|||
Hola de nuevo, perdonenme el hecho de no poder explicarme bien anteriormente, felizmente corregí muchos errores q tenia.
Ahora la unica pregunta q tengo es: Como se destruyen los TList. Cuando hice:
Funciona bien, pero cuando le agrego
Me sale error de Vil¡olacion de acceso Gracias nuevamente Última edición por dec fecha: 18-01-2008 a las 01:59:13. |
#5
|
||||
|
||||
A mi parecer, no tiene mucho sentido lo que haces aquí: - Pones a nil antes de hacer Free? Lo normal, seria liberar y después ponerlo a nil, pero para hacer esto, es mejor "FreeAndNil(FlabelList);" por ejemplo. - El destroy no se usa, hehe... esto te va a provocar un error. De ahí que te explote al cerrar el formulario. Saludos. |
#6
|
|||
|
|||
xEsk Gracias por la sugerencia, te cuento q en algun lugar lei q primero habia q hacer q el puntero apunte a nil y luego liberarlo, y eso fue lo q hice pero probare la alternativa q me das.
Lo q me gustaria es q me pudieran explicar un poco como funcionan esto de los punteros porq no funciona el destroy, q es lo q hace el free y cual la diferencia entre ambos. Gracias, Saludos |
#7
|
||||
|
||||
.Free -> Primero se asegura que el objeto es distinto de nil (puntero nulo), si es distinto, llama a Destroy
.Destroy -> elimina de memoria el objeto, si es un puntero nulo, dará un access violation. "FLabelList" es de por sí, un puntero. Si le asignas nil y después llamas a Flabellist.Free no hará nada, pero la memoria que tenía asignada ¡¡se queda ahí reservada!! es lo que se llama, dejar el objeto en el limbo, (la memoria queda asignada pero no puedes acceder a esos elementos para nada). Si después de todo esto, llamas a FlabelList.destroy, estás ordenando liberar la memoria de un puntero nulo, por eso casca. Tu amigo te diría al contrario, es decir: FlabelList.Free; FlabelList := nil; Si te lo dijo al revés, se le trastornó la neurona . Por supuesto, lo más cómodo, como comodon que es nuestro amigo xEsk: FreeAndnil(FlabelList); es lo que uso siempre saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. |
#8
|
|||
|
|||
Gracias Lepe por la aclaración.
te cuento q al principio cuando unicamente hice: FLabelList.Destroy en lugar de hacer el free y mandarlo a nil, igual me genero error de access violation, es por esa razon q no pude usar el Destroy, y no entiendo porq, ya q el puntero no era nulo. Inicialmente solo era esto, pero sacaba error, la pregunta es porq saca error??, si supuestamente lo unico q hago es destruir el puntero. procedure Twindow_ver_refrigerio.FormClose(Sender: TObject; var Action: TCloseAction);begin FLabelList.Destroy; FLabelList2.Destroy; FEditList.Destroy; FEditList2.Destroy;end;saludos |
#9
|
||||
|
||||
La ayuda lo dice bien claro:
Cita:
Cuando ordenas cerrar la ventana con .Close, se ejecuta el evento Twindow_refrigerio.FormClose que libera las listas, después se sigue ejecutando el Button2Click que también libera las listas de nuevo, es por ahí que da el error. Supongo que antes tendrías otros errores de diseño, de ahí que te aparecieran errores. Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. |
#10
|
|||
|
|||
Mi estimado Lepe, gracias por toda la información brindada.
Bueno sobre el error q mencionas, si me percate de ello y lo corregi tiempito atras, y simplemente me quedaban las dudas conceptuales q me las aclarastes. Muy Agradecido a todos del foro me despido. Saludos |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
ordenar un TList | elcigarra | OOP | 27 | 24-01-2009 00:22:34 |
TList Delphi | rose | Varios | 4 | 08-05-2006 16:58:30 |
Uso del Objeto TList | aromero | OOP | 10 | 21-10-2005 17:30:11 |
Problemas con TList | arantzal | .NET | 2 | 09-12-2004 09:14:37 |
TList | HERNAN | Varios | 2 | 10-10-2003 03:47:59 |
|