FTP | CCD | Buscar | Trucos | Trabajo | Foros |
#1
|
|||
|
|||
Uso de nil
Saludos a todos,
Por favor, alguien podría explicarme brevemente que significa el nil? Normalmente yo acostumbro a poner por ejemplo:
pero veo a menudo que los ejemplos y la ayuda coloca:
En realidad no entiendo para que es esa comparación con nil. Gracias. |
#2
|
||||
|
||||
Hola,
La palabra reservada "nil" indica en Delphi una dirección indeterminada en la memoria. Vale asignar "nil" a un puntero, de manera que este no apunte a ninguna dirección de memoria en concreto. Una variable cuya referencia es un tipo de clase es en realidad un puntero que referencia a determinado objeto, de ahí que pueda asignarse también a este tipo de variables "nil". En el caso que te ocupa se está preguntando (más o menos) lo siguiente: "¿SerialPort apunta a alguna dirección de memoria en concreto? Sí es así, ejecútese la instrucción siguiente; si no es así deje de ejecutarse la misma". Lo mismo no me expliqué correctamente pero eso tengo yo entendido que significa la palabra reservada "nil". Por poner un ejemplo, cuando se destruye un determinado objeto su variable no apuntará ya a la dirección de memoria en que se hacía referencia (si alguna vez fue instanciada la clase de objeto en cuestión) a dicho objeto, y, por lo tanto, la variable de marras será "nil". |
#3
|
||||
|
||||
Cita:
Tambien el código: se puede traducir como: ¿el Objeto SerialPort ha sido creado previamente?: - Si, por tanto se puede acceder a su propiedad Caption, así que la modificamos. - No, entonces, si intentamos acceder a una propiedad (Caption en este caso) que en realidad no existe en memoria, estamos traspasando un puntero nulo y obtendríamos un Access Violation. Como se puede apreciar, es una pregunta de seguridad. Al tiempo de destruir el objeto SerialPort, seguro que pone FreeAndnil(SerialPort). Resumiendo: - Si declaramos una variable que desciende de Tobject, como valor primario debe tener nil (delphi ya lo hace por nosotros), aunque yo prefiero poner Objeto := nil (para clarificar el código) - Cuando vamos a crear el objeto, miramos si tiene nil:
Las funciones Assigned y FreeAndnil nos ayudan bastante en nuestro código: Assigned(objeto) es identico a poner if Objeto <> nil then
saludos |
#4
|
||||
|
||||
Hola.
Aquí dejo otro ejemplo:
En definitiva, la comparación de un objeto con nil es para saber si existe y si tiene una dirección de memoria asignada. Hasta luego..
__________________
No todo es como parece ser... |
#5
|
||||
|
||||
Cuidado con ese código, no es standard (lo digo por otro hilo que habla de stardares )
el TOracleDataset.Create está dentro del bloque try, esto quiere decir que si se produce una excepción al tiempo de crear ese objeto, irá al bloque except, e intentará liberar un objeto que aún no se ha creado. Además no se usa FreeAndNil en el except, así que de nada nos servirá Assigned. Código propuesto:
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. |
#6
|
||||
|
||||
Hola:
Lepe, Sinceramente tienes toda la razón . Saludos..
__________________
No todo es como parece ser... |
#7
|
|||
|
|||
Bueno, muchas gracias por la explicación tan detallada.
A ver si estoy en lo correcto, en conclusión nil, Assigned y Freeandnil se usan para corroborar si el objeto sobre el que se va a actuar está creado en memoria y en caso contrario actuar sobre la excepción que se generaría. Entonces mi pregunta es, en lugar del nil ¿Se puede usar un bloque de este tipo? Código:
Try sentencias... Except sentencias... Finally o Raise sentencias... end La idea no es evitar manejar el nil, sino entender bien como hacerlo y saber si este tipo de casos se puede tratar como una excepción cualquiera. Aunque me parece que no, porque haría lo indicado para cualquier tipo de excepción y no solo cuando el objeto no exista.... Si el control que estoy manejando pertenece a la forma principal de mi programa (me refiero a un control normal, que no se cree a posteriori en runtime) entonces no tendría sentido usar el nil, pues todos los controles de la forma se crean y asignan en memoria con Application.CreateForm(... antes de que delphi ejecute Application.run, ...o ¿es que no he entendido que un control puede estar mostrado en una forma pero no asignado a memoria? Gracias. |
#8
|
||||||
|
||||||
Hola,
Cita:
Cita:
Cita:
Cita:
Cita:
Cita:
|
#9
|
|||
|
|||
Gracias dec y a todos.
Quedó superclaro. Lo que más me cuesta del delphi es cambiar el modo de pensar durante la programación, y eso que me dediqué a hacer una flujograma para mi proyectito pero a pesar de eso me vuelvo un pastel con los objetos a veces. Bueno, con el tiempo y sus excelentes ayudas lo voy a superar.... Muchas Gracias. |
#10
|
||||
|
||||
Resumiendo sería: "Mas vale prevenir que curar"
Como bien has dicho, la excepción tambien puede ocurrir por otra causa; asumir que se ha producido porque el objeto no esté creado, es demasiado Cita:
Un TEdit, colocado en el form1, pertenece al Form, por tanto, al cerrar la aplicación: - Application manda destruir a todos los Forms que contiene. - Form1 manda a destruir todos los controles que contiene, entre ellos el Edit De ahí que todos los objetos que son contenedores, TForm, Tpanel, etc, tengan la propiedad Components y ComponentsCount que es una lista de los controles que ha liberar ese objeto, y el orden en el que se crearon.
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. |
|
|
|