Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-10-2003
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 21
Giniromero Va por buen camino
NombreProcedure(Sender/owner/etc ...)??

Hola a todos,

Tengo varias dudas.


1) No tengo muy clara la diferencia que hay entre poner sender o owner, self, etc.... para un procedure que tenga esta pinta:

procedure NombreDelProcedure(Sender: Tobject);

2)Cuando y porqué es aconsejable usar, dentro de un procedure:

NombreForm := TNombreForm.Create(Self);

Yo lo uso antes del NombreForm.showmodal, pero ¿Es necesario en más casos?

3) ¿Cuando se utiliza (DataSet: TDataSet) en vez de (Sender: Tobject) en un procedure, quiero decir, en base a que, decido cual de los dos poner?

4) ¿Hay alguna manera, o método para no dejar memoria ocupada inutilmente?, ¿Algo que identifique la memoria que realmente se esta usando, y que libere la que no se necesita tener retenida?, ¿Algún consejo sobre que cosas hay que tener en cuenta para evitar problemas por reservas inutiles de memoria, que realmente no se estén usando?

He buscado en la documentación, pero lo que he encontrado no me queda claro, y la idea que tengo es muy intuitiva, e inconcreta.


Muchas gracias de antemano por la ayuda.

Saludos

Virginia
__________________
Sonrie al mundo, y el mundo te sonreirá :)
Responder Con Cita
  #2  
Antiguo 09-10-2003
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
Self, owner y sender son cosas diferentes.

Sender es el objeto que llama al evento
Self es un "auto-llamado" a la instancia que implementa de la clase.
Owner es el dueño de ese objeto, es quien se encargará de eliminar el objeto, si es que no lo eliminamos.

Un ejemplo, tengo un formulario frmPrincipal del tipo MDI que crea un frmCarga, y este último tiene un botón llamado btnAccion. En nuestro código frmPrincipal es el Owner de frmCarga:
Código:
TfrmPrincipal.mnuCargaOnClick(Sender: TObject);
begin
  TfrmCarga.Create(Self); { Crea frmCarga asignando la instancia
                            instancia de frmPrincipal como Owner}
end;
En el click del botón tenemos:
Código:
TfrmCarga.btnAccionOnClick(Sender: TObject);
begin
  if Sender = btnAccion Then
    TForm(Self).Caption := 'Hola!' { Le asigna al caption del TfrmCarga, 
                                     que e a quien pertenece el método 
                                     btnAccionOnClick, el texo 'Hola!' }
  else if Sender = btnSalir Then
    TForm(Owner).Caption := 'Salir!!' { Le asigna el Dueño (TfrmPrincipal) 
                                        el texto Salir'}
  else
    Caption := 'Chau!'; {Aca podemos ver como el Self siempre está implísito}
end;

Espero haber sido claro, igualmente te recomiendo leer la ayuda que es muy clara.

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.

Última edición por delphi.com.ar fecha: 09-10-2003 a las 17:44:48.
Responder Con Cita
  #3  
Antiguo 09-10-2003
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
Con respecto a liberar memoria, te recomiendo leer este artículo: Liberando memoria inactiva (Calling Dr. Marteens...)

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #4  
Antiguo 09-10-2003
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 21
Giniromero Va por buen camino
Hola,

Gracias por la ayuda, pero...

1)Si sender es el

Cita:
objeto que llama al evento
¿Sólo puede ponerse sender, cuando este procedure esté asociado a alguna acción relacionada con un objeto?

Quiero decir, ¿puedo poner sender en un procedure que siempre se va a llamar desde otro procedure? y en tal caso, ¿quien sería el sender? ¿El objeto que ejecutó el procedure que llama a este otro procedure, o el propio procedure que llama a este procedure?

2)
Cita:
Self es un "auto-llamado" a la instancia que implementa de la clase.
no entiendo. ¿a que te refieres con "instancia"?¿"Clase"?

De todos modos, ¿por que me da problemas si no pongo:

NombreForm := TNombreForm.Create(Self);

antes de llamar al NombreForm.showmodal ?

3)
Cita:
Owner es el dueño de ese objeto, es quien se encargará de eliminar el objeto, si es que no lo eliminamos.
Que significa esto, ¿es el único que se auto elimina? y los demás, ¿como lo hacen?,¿Cómo hacemos para que se libere el espacio en memoria que ocupan, cuando no los vamos a usar más?


En cuanto a:

Cita:
Liberando memoria inactiva (Calling Dr. Marteens...)
Gracias por el artículo, buscando sobre estos temas lo encontre ayer, pero aunque me resultó muy interesante, me pareció muy poco concreto.


Bueno, muchas gracias en cualquier caso.

Virginia
__________________
Sonrie al mundo, y el mundo te sonreirá :)
Responder Con Cita
  #5  
Antiguo 09-10-2003
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
Primero quiero recomendarte leer un poco de POO en Delphi, y en genral.
Cita:
Posteado originalmente por Giniromero
¿Sólo puede ponerse sender, cuando este procedure esté asociado a alguna acción relacionada con un objeto?
Tu puedes crear procedimientos con los parámetros que quieras, y dependerá de como lo llames con los valores que llegan. En delphi los eventos se manejan como "punteros a procedimentos" en concreto variables del tipo "procedure of object" y en su mayoría TNotifyEvent, que es el tipo de evento que solo tiene Sender: TObject como parámetro. La mayoría de los eventos son de este tipo, y dependen de como haya sido programado la clase, del valor que recibirás en el parámetro cuestionado. En los componentes que trae Delphi, siempre que tienes este parámetro en un evento, refiere a quien llamó a este evento.

Cita:
Posteado originalmente por Giniromero
De todos modos, ¿por que me da problemas si no pongo:

NombreForm := TNombreForm.Create(Self);

antes de llamar al NombreForm.showmodal ?
NombreForm es una variable del tipo TNombreForm que no contendrá nada hasta que se le asigne algo al igual que todas las variables de cualquier tipo, en este caso en particular lo que tienes que asignarle es un nuevo TNombreForm, que es lo que haces al hacer el create!
Código:
var
  NombreForm: TNombreForm;
begin
  NombreForm := TNombreForm.Create(Nil);
  try
    if NombreForm.ShowModal = mrOk Then
      ...
  finally
    NombreForm.Free;
  end;
Como podés ver en este ejemplo, no le asigno Owner ya que libero este objeto en la línea NombreForm.Free. Las clases que tienen Owner son las clases Persistentes, heredadas de la clase TPersistent, y dependerá de la lógica del progama si utilizas o no el Owner, y quién será este.


Reitero que te recomiendo leer algun libro, pues los conceptos que me preguntas son mas que básicos, y afectarán directamante la calidad del código que escribas.

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #6  
Antiguo 10-10-2003
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 21
Giniromero Va por buen camino
Hola,

lo primero, gracias por la ayuda.

Cita:
te recomiendo leer algun libro, pues los conceptos que me preguntas son mas que básicos, y afectarán directamante la calidad del código que escribas.
¿Algún libro que me recomiendes? por que los que he leido de delphi, no dejan esto muy claro que se diga.

Cita:
Como podés ver en este ejemplo, no le asigno Owner ya que libero este objeto en la línea NombreForm.Free.
¿Esto significa que cuando pongo owner, se libera el objeto cuando termina el evento asociado a él?
Es que mi mayor duda, por la que abrí este hilo, es por saber cuando o que libera los Frm que se van abriendo en los eventos, dependiendo de si pongo sender, owner, ....

Como ya comenté, tengo una idea muy intuitiva, aunque creo que no muy deshorientada, pues hago las cosas que me comentas, pero, por que sé que si no da error, o noto que se carga la memoria, más que por tener una idea clara de lo que está pasando si no lo hago. Pero quiero estar segura de usar esto bien, para no dejarme objetos sin liberar, que ya no uso.


Cita:
NombreForm := TNombreForm.Create(Nil);
¿se puede usar nil?

Disculpa si te parezco algo torpe, pero como ya te he dicho, aunque me he intentado documentar, tal vez empecé con libros que no explicaban lo básico, que tal vez es lo que habría necesitado.

Te agradezco sinceramente tu ayuda y paciencia.

Saludos

Virginia
__________________
Sonrie al mundo, y el mundo te sonreirá :)

Última edición por Giniromero fecha: 10-10-2003 a las 10:22:39.
Responder Con Cita
  #7  
Antiguo 10-10-2003
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
Cuando creas un objeto persistente, asignándole un Owner, por ejemplo:
Código:
procedure TForm1.CrearControles;
begin
  {Es dueño será la instancia de TForm1}
  with TButton.Create(Self) do 
  begin
    Parent := Self;
    Caption := 'Mi Botón';
    ...
  end;
end;
Cuando se destruya la instancia de TForm1, se destruirá el Botón, no al terminar el evento, cuando se haga destruya el owner!
Con respecto a usar nil, si puedes hacerlo, entonces nadie se encargará de eliminar tu objeto, por eso solo es recomendable si haces un Try..Finally inmediato. De todos modos, no es una práctica habitual en mi utilizar nil, suelo utilizar Application como Owner cuando un objeto persistente no pertenece en la lógica a nadie, para la práctica es casi lo mismo, porque cuando se destruye Application es cuando el proceso ha terminado y por lo tanto se liberará toda la memoria de este (Ha no ser que hagamos cosas raras).

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #8  
Antiguo 10-10-2003
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 21
Giniromero Va por buen camino
Gracias, tus explicaciones me han sido de mucha ayuda.

Virginia
__________________
Sonrie al mundo, y el mundo te sonreirá :)
Responder Con Cita
Respuesta



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


La franja horaria es GMT +2. Ahora son las 18:26:27.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi