2012-02-13 50 views
6

Actualmente en mi programa tengo un formulario de Inicio y un formulario Principal. El formulario de inicio aparece por un segundo o dos.Forma correcta de destruir un formulario y mostrar otro en Delphi

En este momento, tengo el siguiente código dentro de un temporizador:

frmStartup.Destroy; 

    frmMain := TfrmMain.Create(Self); 
    frmMain.Show; 

En este momento, no estoy seguro si esta es la forma correcta de hacerlo .. Funciona, pero al llamar application.Terminate(); Recibo un mensaje de infracción de acceso, lo que me lleva a creer que he hecho algo mal en la destrucción del formulario de inicio.

Si alguien pudiera mostrar el procedimiento correcto para hacer lo que quiero (no modal), lo haría ser muy apreciado.

Gracias de antemano,

EDIT:

Gracias por todos los comentarios, he fijado mis violaciónes de acceso, simplemente añadiendo el código:

Action := caFree; 

en el Método frmStartup.formClose.

+2

frmStartup.Destroy debe ser frmStartup.Free o incluso frmStartup.Release Fwiw –

+1

es auto = frmStartup? –

Respuesta

8

No crea el frmStartup usando Application.CreateForm. El primer formulario creado allí se convierte en la forma principal de su aplicación, y si eso es frmStartup lo está destruyendo fuera del conocimiento Application.

lugar, utilice un Form.Create normal en su fuente del proyecto de archivo (.dpr):

var 
    frmStartup: TfrmStartup; 

begin 
    Application.Initialize; 
    Application.MainFormOnTaskBar := True; 
    frmStartup := TfrmStartup.Create(nil); // No owner assigned here! 
    frmStartup.Show; 
    frmStartup.Update; 

    Application.CreateForm(TfrmMain, frmMain); // Let Application have this for main form 
    // Delay here if needed 
    frmfrmStartup.Free; 
    Application.Run; 
end. 
+4

Para hacer el proceso lo más ajustado posible, defina un mensaje de Windows y coloque un controlador de mensajes en su formulario de inicio que lo liberará cuando se reciba el mensaje. A continuación, envíe ese mensaje desde el método OnShow de su formulario principal. – SourceMaid

+1

Lo hago en mis aplicaciones con una pantalla de bienvenida. Sin embargo, eso parecía ir más allá del alcance de esta pregunta. –

1

TFrmMain.Create (Ser) ??? ¿Qué es el "Ser"? ¿Estás haciendo eso desde adentro frmStartup? Si es así, no. Use TFrmMain.Create (NIL).

Uso frmStartup.Release para liberar frmStartup, si todo el código que se envía es dentro de un método de frmStartup, es necesario poner esa línea en la parte inferior del método.

+0

Con mi solución actual, TFrmMain.Create (nil) me da una infracción de acceso al finalizar la aplicación ..: / – James

4

Es posible que desee que su pantalla de bienvenida aparezca lo más temprano posible, por lo que idealmente debería hacerse durante la fase de inicialización, luego debería desaparecer solo cuando MainForm esté listo para hacerse cargo.

Eso es exactamente lo que hacemos en nuestra aplicación donde reutilizamos el diálogo Acerca de como una pantalla de bienvenida y luego lo lanzamos cuando MainForm le roba el foco.

En el DPR, lo más alto posible en la cláusula usos después de las unidades VCL/RTL necesario:

f_adtDlgAbout in 'f_adtDlgAbout.pas' {frmDlgAbout}, // ASAP to be used as a Splash screen 

El Sobre unidad (FYI, FormStyle es fsStayOnTop y Position es poScreenCenter):

unit f_adtDlgAbout; 

[...] 

type 
    TfrmDlgAbout = class(TForm) 

[...] 

procedure TfrmDlgAbout.SplashFormDeactivate(Sender: TObject); 
begin 
    Release; 
end; 

initialization 
    // Use it as a Splash screen 
    with TfrmDlgAbout.Create(nil) do begin 
    AlphaBlend := True; 
    AlphaBlendValue := 208; 
    BorderStyle := bsNone; 
    btnOK.Visible := False; 
    OnDeactivate := SplashFormDeactivate; 
    Show; 
    Update; 
    end; 
end. 
0

Establece frmMain como formulario principal

En frmMain.FormCreate

frmStartup := TfrmStartup.Create(nil); 
try 
    frmStartup.ShowModal; 
finally 
    frmStartup.Free; 
end; 
Cuestiones relacionadas