Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 13-04-2011
satelier.martin satelier.martin is offline
Miembro
NULL
 
Registrado: mar 2011
Posts: 10
Poder: 0
satelier.martin Va por buen camino
No se ejecuta el Destroy

Hola a todos aqui tengo un problema el cual no puedo encontrar la solucion.

Tengo este programa:
Código Delphi [-]
program L2exe;

uses Forms,ShellAPI,Windows,TLHelp32,SysUtils,Messages;

type
  TL2exe = class(TObject)
    constructor Create; virtual;
    destructor Destroy; override;
   private
  end;

constructor TL2exe.Create;
begin
  Application.MessageBox('create','Error', MB_ICONEXCLAMATION);
  inherited Create;
end;

destructor TL2exe.Destroy;
begin
  Application.MessageBox('se cerro','Error', MB_ICONEXCLAMATION);
  inherited Destroy;
end;

{$R *.res}
begin
  TL2exe.Create;
  Application.MessageBox('antes del call procces','Error', MB_ICONEXCLAMATION);
  Application.Terminate;
  end;
end.


Ejecuta bien el constructor, pero al terminar o terminar el proceso desde el administrador de windows no ejecuta el destroy. Estoy haciendo algo mal ??

Cualquier ayuda para orientarme es bienvenida.
Saludos.

Última edición por ecfisa fecha: 13-04-2011 a las 02:12:31. Razón: Agregar ETIQUETAS [DELPHI] y [/DELPHI]
Responder Con Cita
  #2  
Antiguo 13-04-2011
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
Hola...

No estás llamando el método Free del objeto:

Código Delphi [-]
begin
  TL2exe.Create;
  Application.MessageBox('antes del call procces','Error', MB_ICONEXCLAMATION);
  TL2exe.Free;
  Application.Terminate;
end;


Saludos...
__________________
Lee la Guía de Estilo antes que cualquier cosa. - Twitter
Responder Con Cita
  #3  
Antiguo 13-04-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Agrego algo a lo dicho por maeyanes que sin dudas es la solución al problema de satelier.

Se puede hacer con el método Free ,
Código Delphi [-]
begin
  with TL2exe.Create do
  try
    Application.MessageBox('antes del call procces','Error', MB_ICONEXCLAMATION);
    Application.Terminate;
  finally
    Free;
  end;
end;

o directamente con el destructor Destroy:
Código Delphi [-]
var
  L2exe: TL2exe;
begin
  L2exe:= TL2exe.Create;
  try
    Application.MessageBox('antes del call procces','Error', MB_ICONEXCLAMATION);
    Application.Terminate;
  finally
    L2exe.Destroy;
  end;
end;
Aunque conviene el método Free, ya que el código de la llamada es menor, y lo más importante: comprueba que el puntero al objeto no esté vacío.
Si se produce un error durante la creación, Delphi destruye automáticamente el objeto, es decir que usando Destroy en algunos casos corremos el riesgo de destruir un objeto inexistente.

Es por eso que en la ayuda de Delphi encontramos:
Cita:
The Destroy destructor should never be called directly. To destroy a component created with Create, call the Free method.
Un saludo.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 13-04-2011 a las 04:53:36.
Responder Con Cita
  #4  
Antiguo 13-04-2011
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Cita:
Empezado por ecfisa Ver Mensaje
[...] o directamente con el destructor Destroy:
Código Delphi [-]
var
  L2exe: TL2exe;
begin
  L2exe:= TL2exe.Create;
  try
    Application.MessageBox('antes del call procces','Error', MB_ICONEXCLAMATION);
    Application.Terminate;
  finally
    L2exe.Destroy;
  end;
end;
[...]
Si se produce un error durante la creación, Delphi destruye automáticamente el objeto [...]
Bueno, aquí mencionar que si se eleva una excepción en la sentencia que crea al objeto, ciertamente se llamará al destructor, pero eso es un mecanismo nativo e implícito que nada tiene que ver con el bloque Try-Finally del ejemplo que proporcionas (ejemplo válido, por cierto).

La sección Finally es útil en este caso para asegurarse de destruir el objeto incluso cuando ocurra una excepción en alguna de las sentencias que siguen a la instrucción Try, y no en alguna de las que le preceden (como la sentencia de creación del objeto).

Deseaba puntualizar eso. Cordiales saludos.

Al González.
Responder Con Cita
  #5  
Antiguo 13-04-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Al.

Es totalmente acertada tu observación sobre el try/finally y coincido que el ejemplo nada tiene que ver con la destruccíon en la creación debido
a una excepción. Pero eso es por que no estaba ejemplificando ese caso, sólo fué un comentario adicional sin relación con el código.

Ciertamente está muy bién que lo hayas mencionado ya que de ese modo se disipa cualquier duda que pudiera presentarse.

Un saludo.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 13-04-2011 a las 11:29:33.
Responder Con Cita
  #6  
Antiguo 14-04-2011
satelier.martin satelier.martin is offline
Miembro
NULL
 
Registrado: mar 2011
Posts: 10
Poder: 0
satelier.martin Va por buen camino
Esta muy bien lo que dicen ambos el tema es que no detecta cuando mato el proceso desde el administrador de procesos de windows, hay alguna forma de hacer eso??

Saludos. Y gracias por su respuestas.
Responder Con Cita
  #7  
Antiguo 20-12-2011
pelecho pelecho is offline
Registrado
 
Registrado: ago 2010
Ubicación: Chaco Paraguay
Posts: 9
Poder: 0
pelecho Va por buen camino
Destroy en en form Reporte

Hola a todos,
ya que se toca el tema del destroy en formularios, tengo un pequeño inconveniente con lo reportes, usando el Report (File->New..., luego en la pestaña New hay un formulario Report). Cuando llamo el evento AfterPreview, no me lo ejecuta. Necesito destruir el informe, ya que lo construyo solamente para imprimir un reporte.
Código Delphi [-]
procedure TfrmReporte.QuickRepAfterPreview(Sender: TObject); 
begin   
  frmReporte.Destroy; 
end;

Alguien tiene una idea como solucionarlo? Necesito destruir el formulario de reporte de todos modos.

Gracias y saludos,
Orlando

Última edición por ecfisa fecha: 21-12-2011 a las 01:57:26. Razón: P.D.No me esta poniendo bien el codigo como debe ser (sintaxis Delphi)
Responder Con Cita
  #8  
Antiguo 20-12-2011
pelecho pelecho is offline
Registrado
 
Registrado: ago 2010
Ubicación: Chaco Paraguay
Posts: 9
Poder: 0
pelecho Va por buen camino
Cita:
Empezado por satelier.martin Ver Mensaje
Esta muy bien lo que dicen ambos el tema es que no detecta cuando mato el proceso desde el administrador de procesos de windows, hay alguna forma de hacer eso??

Saludos. Y gracias por su respuestas.

Hay una forma para deshabilitar el administrador de tareas, etc. Una vez lo habia hecho en un sistema, pero no me acuerdo mas como fue. Voy a buscarte el codigo correspondiente y lo pongo aqui si es eso lo que necesitas.

Saludos
Responder Con Cita
  #9  
Antiguo 21-12-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por pelecho Ver Mensaje
Hola a todos,
ya que se toca el tema del destroy en formularios, tengo un pequeño inconveniente con lo reportes, usando el Report (File->New..., luego en la pestaña New hay un formulario Report). Cuando llamo el evento AfterPreview, no me lo ejecuta. Necesito destruir el informe, ya que lo construyo solamente para imprimir un reporte.
Alguien tiene una idea como solucionarlo? Necesito destruir el formulario de reporte de todos modos.
Hola pelecho.

Primero quitá QuickReport2 (o el nombre que le diste al report) de la lista en: Project -> Options -> Forms -> Auto-create forms.

Luego desde el form que deseas invocarlo una opción sería por ejemplo:
Código Delphi [-]
...
implementation

uses Unit2; // unit del QuickReport2

procedure TForm1.Button1Click(Sender: TObject);
begin
  with TQuickReport2.Create(nil) do
  try
    ...
    Preview;
  finally
    Free;
  end;
end;
...

Si deseas que dure lo que la vida del form invocador, podrías hacer:
Código Delphi [-]
...
implentation
uses Unit2; // unit del QuickReport2

procedure TForm1.FormCreate(Sender: TObject);
begin
   QuickReport2:= TQuickReport2.Create(Self); // Owner = Form1
end;
...

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 21-12-2011 a las 02:34:11.
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
con breakpoint ejecuta y sin el no lo ejecuta. pacuuy Varios 1 16-12-2007 13:41:43
Clases: Create and destroy jlrbotella OOP 5 09-03-2007 13:11:06
Destroy en OnClose de MDIChild ixMike API de Windows 6 05-10-2006 19:25:53
Destroy de mala madre... Xianto OOP 9 31-03-2005 20:24:11
Manejo Del Free Y El Destroy Robert SQL 4 19-03-2004 15:11:34


La franja horaria es GMT +2. Ahora son las 22:01:00.


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