Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-11-2008
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 26
maeyanes Va por buen camino
Hola

Solo que un método de clase se declara como:

Código Delphi [-]
class procedure Editar(P: TPersona);

A menos que esté desactualizado



Saludos....
Responder Con Cita
  #2  
Antiguo 14-11-2008
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por maeyanes Ver Mensaje
Solo que un método de clase se declara como:
Tienes toda la razón. Ya he corregido el ejemplo.

// Saludos
Responder Con Cita
  #3  
Antiguo 14-11-2008
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.610
Poder: 32
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
¡Hola a todos!

Mi aportación.

Es un hecho que todas las variables globales están en blanco (en ceros) al inicio del programa.

Las variables locales para tipos de datos que no emplean "finalización automática" no son inicializadas. Esto ahorra instrucciones de código máquina que muchas veces no nos serán necesarias. Se entiende que, en la mayoría de los casos, si declaramos una variable local es porque vamos a asignarle algo antes de utilizarla; aunque es cierto que a veces nos gustaría que se pusieran en blanco desde el inicio de la rutina, logrando que 0, False, Nil, etc. fuera un valor automático predeterminado. Probablemente en el futuro, o en otras plataformas, esta inicialización en ceros de todas las variables locales sea una condición normal, pero de momento, en el Delphi nativo, únicamente ocurre con las cadenas largas (strings), las interfaces, los arreglos dinámicos y los variantes (probado con Delphi 7). Esto es porque la memoria de tales tipos de datos es liberada en automático —o al menos su contador de referencias es disminuido en 1— cuando la función, procedimiento o método termina.

Esta útil practicidad implícita del compilador crea la obligación, para él mismo, de agregar código máquina de "inicialización cruda" al comienzo de la rutina, que consiste simplemente en rellenar de ceros todas las variables locales que sean de esos tipos. Recordemos que una variable local no es más que un grupo de bytes en alguna posición de memoria que pudieron haber sido utilizados antes, por tanto, de entrada, una variable local sin inicializar puede arrojarnos cualquier valor que formen sus bits en ese momento. Si al empezar a ejecutarse una rutina, ésta no hiciera el blanqueo inicial (la inicialización cruda de la que hablo) de una variable local String o arreglo dinámico, por ejemplo, ¿cómo sabría si debe o no ejecutar el código máquina de finalización que el compilador agrega al final, considerando que quizá alguna condición (If) de la rutina determinó que la variable no fuese utilizada? O bien, al asignarle valor por primera vez, ¿cómo sabría el programa que lo que está actualmente en la variable es algo que debe “liberar” antes de realizar la asignación, o sólo se trata de un vestigio del uso que tuvieron esos bytes por parte de otra función?

Es por ello que tales tipos de variables locales, y sólo tales tipos, son puestas en blanco predeterminadamente.

Respecto a los constructores, es bueno aclarar que éstos no son métodos clase, si bien pueden llamarse con la sintaxis de un método clase. Un constructor puede ser llamado tanto con una clase —para crear una instancia e inicializarla— como con una variable o cualquier otra expresión de tipo objeto —para solamente (re)inicializar ese objeto, o hacer lo que está definido en el constructor—. El programa sabe cuándo la llamada ha sido hecha de una manera o de la otra gracias a una bandera interna que se maneja como parámetro implícito (con valor de 1 o 0, respectivamente).

La segunda forma de llamada necesita que la instancia sea real (no basta declarar la variable). Con la primera forma se llama en automático al método virtual NewInstance que señaló Román, para reservar el bloque de memoria donde residirán los campos del objeto, es decir, la instancia. Pero NO es verdad que la segunda forma también cree una instancia. El método NewInstance solamente es ejecutado cuando la llamada al constructor es hecha con una referencia de clase (TClaseObjeto.Create), pero no cuando se realiza con una referencia de objeto (Objeto.Create o Inherited Create). La bandera interna que mencioné antes existe básicamente para saber si NewInstance debe ser llamado o no al ejecutarse un constructor.

Cita:
Empezado por Borland
A value of False in the flag parameter of a constructor call indicates that the constructor was invoked through an instance object or using the inherited keyword. In this case, the constructor behaves like an ordinary method. A value of True in the flag parameter of a constructor call indicates that the constructor was invoked through a class reference. In this case, the constructor creates an instance of the class given by Self, and returns a reference to the newly created object in EAX.
Y en cuanto a utilizar “Assigned (Expresión)” o “Expresión <> Nil, personalmente prefiero la segunda por parecerme más clara y natural. Aunque tratándose de expresiones método siempre utilizo Assigned, más que nada por impedimentos del compilador para usar la segunda forma.

Espero haber contribuido a algo bueno.

Un abrazo instanciado.

Al González.

Última edición por Al González fecha: 14-11-2008 a las 22:03:15. Razón: Afinación semántica
Responder Con Cita
  #4  
Antiguo 14-11-2008
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Estupendas aclaraciones Al.

Había olvidado lo del NewInstance en mi afán de entender porqué la llamada a Create desde una variable podría ser válida. Como bien muestras, ni siquiera hay un objeto creado, razón de más para no usar dicha sintaxis para crear un objeto, a no ser que sea, como dices, para reinicializar el objeto.

Es cierto que un constructor no es un método de clase, aunque para los efectos que aquí tratamos, puede entenderse como tal, en el sentido de que existe independientemente de cualquier instancia.

// Saludos
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
saber si alias esta creado en el dbe Manuel Varios 2 13-10-2006 18:27:37
Como saber si un Formulario ha sido creado Durbed OOP 7 13-10-2005 13:06:28
destruir objeto creado en tiempo de ejecucuión jaime cotino Varios 5 28-06-2005 20:45:36
Saber si un formulario ya está creado o no. Tecnic2 OOP 2 27-09-2004 13:27:01
¿Cómo saber si un Form está creado? nesetru Varios 5 09-02-2004 12:59:37


La franja horaria es GMT +2. Ahora son las 18:53:04.


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
Copyright 1996-2007 Club Delphi