FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
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á :) |
#2
|
||||
|
||||
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; 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. |
#3
|
||||
|
||||
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. |
#4
|
||||
|
||||
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? 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
__________________
Sonrie al mundo, y el mundo te sonreirá :) |
#5
|
||||
|
||||
Primero quiero recomendarte leer un poco de POO en Delphi, y en genral.
Cita:
Cita:
Código:
var NombreForm: TNombreForm; begin NombreForm := TNombreForm.Create(Nil); try if NombreForm.ShowModal = mrOk Then ... finally NombreForm.Free; end; 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. |
#6
|
|||
|
|||
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
__________________
Sonrie al mundo, y el mundo te sonreirá :) Última edición por Giniromero fecha: 10-10-2003 a las 10:22:39. |
#7
|
||||
|
||||
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; 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. |
#8
|
|||
|
|||
Gracias, tus explicaciones me han sido de mucha ayuda.
Virginia
__________________
Sonrie al mundo, y el mundo te sonreirá :) |
Herramientas | Buscar en Tema |
Desplegado | |
|
|
|