Ver Mensaje Individual
  #9  
Antiguo 16-03-2005
keyboy keyboy is offline
Miembro
 
Registrado: oct 2004
Posts: 367
Reputación: 20
keyboy Va por buen camino
Cita:
Empezado por jam888
no me gusta hacer cosas y no entenderlas
¡Excelente actitud! Pero no estaría de más que te leyeras algún libro básico de Delphi. Mientras tanto te aclaro algunas cosas:

Todo método de una clase, es decir todo procedimiento o función dentro de la definición de una clase:

Código:
type
  TMiClase = class
    procedure MiMetodo(Parametro: Integer);
  end;
pasa un parámetro oculto Self que corresponde al objeto con el cual se hace la llamada. Es decir, si MiObjeto es una variable de tipo TMiClase, cuando llamas a MiObjeto.MiMetodo(84); es como si hubieras puesto:

MiObjeto.MiMetodo(MiObjeto, 84)

De esta manera es que dentro del código del método puedes hacer referencia al objeto que se está usando.

Por otra parte, las componentes (descendientes de TComponent como es el caso de un formulario) tienen una forma especial de manejar la creación y destrucción de objetos.

Toda componente tiene una propiedad Owner que indica cuál es la componente que se encarga de destruirla. En el constructor Create de una componente es donde indicas cuál va a ser el Owner (dueño).

Cuando una componente se destruye, repasa la lista de componentes que 'le pertenecen' destruyendo a su vez cada una de ellas.

En el caso de

TForm2.Create(Self)

Self es Form1 y por tanto será el dueño (Owner) de la componente TForm2 creada. Por tanto, cuando Form1 se destruya automáticamente se destruirá la instancia de TForm2 que creaste por lo cual no es necesario destruirla explícitamente.

Un objeto se destruye explícitamente llamando a su método Free, que es lo que haces en

Código:
finally
  Free;
end;
En el ejemplo en particular yo no pondría Self como parámetro de TForm2.Create ya que justamente usas Free al término del ShowModal y el uso de finally garantiza que el Free se va a ejecutar.

En estos casos yo usaría:

TForm2.Create(nil)

indicando que nil será el dueño de la componente creada. Como nil no es nada, realmente lo que estás indicando es que nadie será el dueño del objeto y que por tanto nadie se va a ocupar de destruirlo sino que lo harás tú explícitamente- como en efecto lo haces con Free.

Cuando haces

OnClose := MiProcedimiento;

estás asignado el procedimiento MiProcedimiento a OnClose. Esto parece una explicación algo boba pero el punto aquí es que los eventos en Delphi, tales como OnClose, son realmente propiedades del objeto, cuyos valores son procedimientos (más correctamente, métodos), así quela setencia anterior no es más que la asignación de un valor a una propiedad.

Cuando en el inspector de objetos das doble click a un evento como OnClose, te aparece el cuerpo del evento:

Código:
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
end;
Y Delphi se encarga automáticamente de hacer la asignación:

Form2.Onlose := FormClose

Pero en ocasiones, como en el ejemplo de Héctor, en lugar de dejar que Delphi lo haga automáticamente lo hacemos nosotros mismos. En este caso es necesario porque se está asignando un método que no pertenece a TForm2 sino a TForm1.

¿Que por qué se declara como privado? Pues es un poco cuestión de gustos, pero dado que MiProcedimiento no tiene por objeto ser usado desde fuera de Form1, es natural ponerlo como privado.

bye
Responder Con Cita