Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   No se ejecuta el Destroy (https://www.clubdelphi.com/foros/showthread.php?t=73289)

satelier.martin 13-04-2011 01:33:59

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

Cualquier ayuda para orientarme es bienvenida.
Saludos.

maeyanes 13-04-2011 02:52:16

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...

ecfisa 13-04-2011 04:25:36

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.

Al González 13-04-2011 06:34:50

Cita:

Empezado por ecfisa (Mensaje 396838)
[...] 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. :)

ecfisa 13-04-2011 08:57:37

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.

satelier.martin 14-04-2011 00:51:10

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

Saludos. Y gracias por su respuestas.

pelecho 20-12-2011 23:52:49

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

pelecho 20-12-2011 23:56:48

Cita:

Empezado por satelier.martin (Mensaje 397004)
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

ecfisa 21-12-2011 02:24:34

Cita:

Empezado por pelecho (Mensaje 421652)
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.


La franja horaria es GMT +2. Ahora son las 06:46:40.

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