Domanda

Questa dovrebbe essere una semplice per qualcuno. Io proprio non riesco a capire come farlo.

Dopo l'uscita del mio programma, voglio nascondere la forma principale e fare un "Grazie" forma finale appare da solo, in questo modo:

procedure TMainForm.ExitExecute(Sender: TObject);
begin
  MainForm.Visible := false;
  ThankYouForm.Show;
  MainForm.Close;
end;

Ma quando lo faccio, ho l'eccezione:

  

EInvalid Operation: Impossibile modificare Visibile in OnShow o OnHide

Allora, come faccio mostro una forma finale, nascondendo la forma principale quando si esce di un programma in Delphi?


Conclusione: Mghie ha confermato che quello che stavo cercando era corretta e dovrebbe aver funzionato. Che indicato che ho avuto un bug da qualche parte nelle mie procedure di uscire e chiudere dalle mie forme che stava portando a questa eccezione.

Ora che so che, non mi ci vorrà molto per trovare e risolvere il problema.


trovato il problema:. Stavo chiudendo la mia forma principale dall'interno del ThankYouForm, e che in qualche modo ricollegati tramite in ExitExecute e, beh, ha ottenuto tutto pesta up

Ma tutto è bene ancora una volta. Il MainForm.Hide prima del ThankYouForm.ShowModal funziona perfettamente.

Grazie ancora, ragazzi.

È stato utile?

Soluzione

Si potrebbe fare che nel gestore OnClose del form principale. Assicurarsi di ShowModal l'altra forma, perché altrimenti sarà chiusa immediatamente quando la chiusura del form principale termina l'applicazione:

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Hide;
  with TThankYouForm.Create(nil) do try
    ShowModal;
  finally
    Free;
  end;
  Action := caFree;
end;

o anche

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Hide;
  with TThankYouForm.Create(Application) do
    ShowModal;
  Action := caFree;
end;

Ed essere sicuri di fare il comportamento opzionale -. Quando l'utente chiude l'applicazione hanno finito con esso, e non tutti sono soddisfatti con i programmi che sono così restii ad andare via

Modifica

OK, mostrando una forma alla fine del periodo di prova in effetti ha senso. E mentre io non posso davvero dire perché il codice solleva l'eccezione - si dovrebbe essere in grado di scoprire attraverso la compilazione con il debug DCU, l'impostazione di un punto di interruzione sulla linea che solleva l'eccezione, ed esaminare la traccia dello stack. Presumo una combinazione delle proprietà del modulo e il codice porta ad un altro cambiamento della proprietà Visible più in alto lo stack, e avete bisogno di scoprire che cosa è e che correggere. Il codice di cui sopra dovrebbe funzionare davvero.

Altri suggerimenti

Invece di cercare di calzascarpe qualcosa nella forma principale, andare al luogo in cui si sai esecuzione tutto il resto è finito: il punto in cui i rendimenti Application.Run. Creare una nuova procedura che crea, spettacoli, e distrugge il modulo d'addio, e quindi chiamare nel file DPR in questo modo:

begin
  Application.Initialize;
  Application.CreateForm(TMainForm, MainForm);
  Application.Run;
  TThankYouForm.Execute;
end.

La funzione di visualizzazione può essere lungo le linee di ciò che la risposta di Mghie dimostrato :

class procedure TThankYouForm.Execute;
begin
  with Create(nil) do try
    ShowModal;
  finally
    Free;
  end;
end;

Io metterei (provare) qualunque parte del codice fornito in precedenza nel caso in OnCloseQuery del form principale. Assicurare che può chiudere:. = False fino a quando si è pronti a chiudere il modulo principale

Questo può essere causato da differenza tra ordine di chiamate di metodo, con ordine di elaborazione gestore di messaggi. Dopo che il metodo ha portato a termine ci sono ancora messaggi nella coda di sistema operativo e essi vengono spediti e gestite da VCL.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top