Newsgroup: it.comp.lang.delphi
Titolo: Form Splashscreen errore EAccessViolation

Ciao a tutti,
sto avendo dei problemi con una form per lo splashscreen.
La storia è abbastanza lunga:
innanzitutto ho inserito lo splashscreen (come in molti altri progetti) 
senza particolari problemi.
Ho usato questo codice:
" Splash := TSplash.Create(Application);
   Splash.Show;
   Application.Initialize;
   Splash.Update;
   Application.Title := 'title';
   Application.CreateForm(TForm1, Form1);
   ...
   Splash.Hide;
   Splash.Free;
   Application.Run;"
e funzionava.
In qualche modo, un giorno ha iniziato a creare dei problemi.
Alla chiusura dell'applicazione ricevevo l'errore:
Exception EAccessViolation in module XXX at xxxxxxxx.
Access violation at address YYY in module XXX. Read of address yyyyyyyy.
Quest'errore se n'è andato appena ho commentato la linea "Splash.Show;".
Questa ovviamente non è una soluzione dato che senza quella linea non 
vedo nessuno splashscreen.
Sono poi riuscito a risolvere il problema cancellando le linee
   Splash.Hide;
   Splash.Free;
ed aggiungendo nel form principale all'evento OnResize la linea
   if Splash.Visible then Splash.Close;
Questo ha funzionato fino ad un paio d'ore fa, quando l'errore 
EAccessViolation è tornato.
Non ho cambiato praticamente niente nell'applicazione. O meglio: ho 
cambiato un sacco di cose ma niente ha causato l'errore, l'unica cosa 
che ho cambiato tra le ultime due compilazioni è la posizione di una 
label in un form secondario.
Qualche idea?
Grazie
Daniele

Splash := TSplash.Create(NIL);
A.

 
Funziona.
Grazie mille.
Daniele.

BluDes ha scritto:

OK, ho cantato vittoria troppo presto.
Un paio di compilazioni e poi tutto da capo.
Che sia questo form penso sia certo dato che commentando le linee della 
sua creazione l'errore sparisce.
Non capisco però cosa succeda.
Anche in queste compilazioni non ho fatto niente di eccezionale, ho 
cambiato un paio di caption e colori di sfondo.
La cosa strana è che adesso il solo fatto di creare il form genera 
l'errore. E non posso tornare indietro, nel senso che se rimetto il 
vecchio codice che usavo si comporta come con questo nuovo.
In pratica adesso ho lasciato solo 2 linee per la creazione dello 
splashscreen:
Splash := TSplash.Create(Application);
Splash := TSplash.Create(nil);
ma l'errore viene generato comunque.
inserire uno splash.free in mezzo alle 2 non cambia niente.
Daniele

BluDes ha scritto:
<snip>
Splash := TSplash.Create(nil);
try
  Splash.Show;
  // aspetta il tempo necessario...
  Splash.Free;
  Application.Title := 'title';
  Application.CreateForm(TForm1, Form1);
  ...
  Application.Run;
finally
  Splash.Free;
end;
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 end;
sě, il codice da te suggerito funziona, ma quello che serve a me č 
aspettare che vengano creati tutti i form dell'applicazione prima di 
nascondere lo splashscreen.
Ho provato a modificare quello che hai scritto in questo modo ma 
l'errore ritorna.
   Splash := TSplash.Create(nil);
   try
     Splash.Show;
     Application.Initialize;
     Splash.Update;
     Application.Title := 'ALSIfatturazione';
     Application.CreateForm(TForm1, Form1);
     ...  x 30 form
     Splash.Free;
     Application.Run;
   finally
     Splash.Free;
   end;
Non capisco che differenza faccia lo Splash.Free prima o dopo la 
creazione dei form.
ciao e grazie.
Daniele

 Un paio di compilazioni e poi tutto da capo.
[...]
Ritento.
Dopo il suggerimento ricevuto da Andrea Laforgia ho capito che quello 
che mi stava dicendo Alberto Salvati non era di sostituire "Splash.Free" 
con "Splash := TSplash.Create(NIL)", ma di usare questo codice per 
creare il form.
Avevo sostituito il Free perchè pensavo che l'errore alla chiusura fosse 
dato dal tentativo di eliminare un form già eliminato e che quindi 
l'errore era da cercare al momento della liberazione della memoria 
occupata dal form.
Usando questo metodo quindi riesco a far funzionare tutto correttamente:
" Splash := TSplash.Create(nil);
   Splash.Show;
   Application.Initialize;
   Splash.Update;
   Application.Title := 'title';
   Application.CreateForm(TForm1, Form1);
   ...
   Splash.Free;
   Application.Run;"
sperando di non aver cantato vittoria troppo presto una seconda volta...
ciao a tutti.
Daniele

 creazione dei form.
Scusate ma se non ho perso gli ultimi neuroni sani... io invece non 
capisco perchè chiamate, potenzialmente e quasi certamente, due volte 
free per l'oggetto splash visto che il codice nel blocco finally viene 
sempre e comunque eseguito.
Volendo distruggerla prima quantomeno servirebbe un check nel blocco 
finally.

 finally.
Hai ragione, difatti la prima Splash.Free dovrebbe essere, invece, una:
FreeAndNil(Splash);
