Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   NombreProcedure(Sender/owner/etc ...)?? (https://www.clubdelphi.com/foros/showthread.php?t=4296)

Giniromero 09-10-2003 15:47:44

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

delphi.com.ar 09-10-2003 16:04:12

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 09-10-2003 16:05:50

Con respecto a liberar memoria, te recomiendo leer este artículo: Liberando memoria inactiva (Calling Dr. Marteens...)

Saludos!

Giniromero 09-10-2003 18:47:55

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?:confused:

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

delphi.com.ar 09-10-2003 19:39:04

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!

Giniromero 10-10-2003 10:18:43

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

delphi.com.ar 10-10-2003 16:48:48

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!

Giniromero 10-10-2003 18:45:35

Gracias, tus explicaciones me han sido de mucha ayuda.

Virginia


La franja horaria es GMT +2. Ahora son las 08:49:14.

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