![]() |
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 |
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); Código:
TfrmCarga.btnAccionOnClick(Sender: TObject); Espero haber sido claro, igualmente te recomiendo leer la ayuda que es muy clara. Saludos! |
Con respecto a liberar memoria, te recomiendo leer este artículo: Liberando memoria inactiva (Calling Dr. Marteens...)
Saludos! |
Hola,
Gracias por la ayuda, pero... 1)Si sender es el Cita:
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:
De todos modos, ¿por que me da problemas si no pongo: NombreForm := TNombreForm.Create(Self); antes de llamar al NombreForm.showmodal ? 3) Cita:
En cuanto a: Cita:
Bueno, muchas gracias en cualquier caso. Virginia |
Primero quiero recomendarte leer un poco de POO en Delphi, y en genral.
Cita:
Cita:
Código:
var 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! |
Hola,
lo primero, gracias por la ayuda. Cita:
Cita:
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:
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 |
Cuando creas un objeto persistente, asignándole un Owner, por ejemplo:
Código:
procedure TForm1.CrearControles; 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! |
Gracias, tus explicaciones me han sido de mucha ayuda.
Virginia |
La franja horaria es GMT +2. Ahora son las 00:11:50. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi