Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: schumi - Luglio 08, 2015, 04:27:46 pm

Titolo: Access Violation dopo chiusura di una form
Inserito da: schumi - Luglio 08, 2015, 04:27:46 pm
sto impazzendo per un errore che capita qualche volta chiudendo una form ad un cliente, il programma è ancora una beta ma lo usano già come gestionale aziendale.
premetto che non riesco a replicarlo nel mio pc e quindi vado a tentativi. ???

come posso trovare il problema?
Grazie

Exception class: EAccessViolation
Message: Access violation
  $005A939F
  $005AAC70
  $00429F64
  $0042C774
  $00429AD4
  $0047AD02
  $005AA888
  $0047AA66
  $00578F24
  $0059709F
  $005977F8
  $005860B1
  $00596FAA
  $0040C496
  $0056C781
  $005D706B
  $0052E2E9
Titolo: Re:Access Violation dopo chiusura di una form
Inserito da: nomorelogic - Luglio 08, 2015, 04:44:24 pm
potrebbe essere un evento sollevato dopo la chiusura in cui utilizzi un puntatore

se ad esempio hai un datamodule e da qualche parte fai qualcosa tipo
Codice: [Seleziona]
  MyDatamodule.Table1.First;

dovresti correggere con:
Codice: [Seleziona]
  if not Assigned(MyDatamodule) then exit;
  if not Assigned(MyDatamodule.Table1) then exit;

  MyDatamodule.Table1.First;
Titolo: Re:Access Violation dopo chiusura di una form
Inserito da: schumi - Luglio 09, 2015, 05:41:02 pm
ho un datamodule, questo viene creato in automatico all'apertura dell'applicazione (progetto-opzioni-form), non so se sia il modo migliore.
utilizzo la tua superclasse nella (versione da svn) come base per le form

nel FormCreate apro le tabelle con una procedura nel datamodule (mydatamodule.table1.open)
nel FormCloseQuery le chiudo con un altra procedura (mydatamodule.table1.close)
nel FormClose lancio self.release
nel FormDestroy lancio if assigned(form1) then form1:=nil (oppure form1.free)

l'errore è successivo al form destroy, mai riscontrato nelle mie prove, il cliente apre e chiude la form 50 volte al giorno, almeno 1 volta da errore.

un errore non replicabile è la peggiore delle piaghe dell'informatica :'(

grazie
Titolo: Re:Access Violation dopo chiusura di una form
Inserito da: nomorelogic - Luglio 09, 2015, 06:11:59 pm
nel FormDestroy lancio if assigned(form1) then form1:=nil (oppure form1.free)

questa non l'ho capita...
nell'evento FormDestroy tenti di autodistruggere il form che si sta distruggendo da solo?


il datamodule è in autocreate?
chi lo rilascia?
Titolo: Re:Access Violation dopo chiusura di una form
Inserito da: schumi - Luglio 10, 2015, 10:58:58 am
il codice nel destroy era un vano tentativo leggendo qua e la sul forum ufficiale.

si, il datamodule è in autocreate, dici che può essere quello il problema? non ho trovato nessun tutorial serio sull'argomento

ho un datamodule principale con la connessione al DB, poi altri dm specifici.
la connessione al DB avviene all'apertura del prg

magari a voi sembrano banalità ma per me è tutto "nuovo" dopo anni di FoxPro
questo è il mio primo programma complesso con lazarus, mai usato neanche delphi in vita mia

grazie
Titolo: Re:Access Violation dopo chiusura di una form
Inserito da: schumi - Luglio 10, 2015, 11:12:09 am
volendo avere meno cose inutili in memoria, se creo il datamodule nel formcreate con Tmydatamodule.Create(self) e lo distruggo nel formdestroy con mydatamodule.free è corretto?
il datamodule principale invece vorrei lasciarlo nell'autocreate per testare la connessione al DB come prima cosa.
voi che mi consigliate?

grazie
Titolo: Re:Access Violation dopo chiusura di una form
Inserito da: nomorelogic - Luglio 10, 2015, 12:02:22 pm
In linea di massima in autocreate io preferisco tenerci solo il form principale e poi creo/distruggo a seconda delle necessità da dentro il form.

Nell'evento OnCreate del form puoi tranquillamente (1) creare il datamodule principale e (2) testare la connessione del DB e, se fallisce, lanci Application.Terminate (che se non ricordo male dovrebbe richiamare OnDestroy del form).

Nell'OnDestroy del form, distruggi il datamodule con:
if Assigned(MyDataModule) then
   MyDataModule.Free;

Non so se è il modo migliore ma è il modo che mi risulta più chiaro personalmente e che mi permette di fare tutto.
Titolo: Re:Access Violation dopo chiusura di una form
Inserito da: schumi - Luglio 10, 2015, 03:35:52 pm
Citazione
n linea di massima in autocreate io preferisco tenerci solo il form principale e poi creo/distruggo a seconda delle necessità da dentro il form.

Nell'evento OnCreate del form puoi tranquillamente (1) creare il datamodule principale e (2) testare la connessione del DB e, se fallisce, lanci Application.Terminate (che se non ricordo male dovrebbe richiamare OnDestroy del form).

Nell'OnDestroy del form, distruggi il datamodule con:
if Assigned(MyDataModule) then
   MyDataModule.Free;

Non so se è il modo migliore ma è il modo che mi risulta più chiaro personalmente e che mi permette di fare tutto.

farò anch'io cosi, ora che ho un po' di tempo
come logica mi piace di più, solitamente meno oggetti in memoria =più performance e meno conflitti

comunque un tutorial avanzato in rete non l'ho trovato, ne per Delphi ne per FP

grazie
Titolo: Re:Access Violation dopo chiusura di una form
Inserito da: schumi - Febbraio 18, 2016, 02:51:37 pm
rispolvero la questione, dopo aver "sistemato" il codice come consigli sopra il problema si è drasticamente ridotto, però sporadicamente riappare.
come faccio a fare un debug efficacie? mi arrangio con un file di log o c'è qualche metodo + intelligente su Lazy 8) 8) 8)
Titolo: Re:Access Violation dopo chiusura di una form
Inserito da: nomorelogic - Febbraio 18, 2016, 05:59:52 pm
il problema è che appare "sporadicamente"

se riesci a trovare un modo per farlo fare *sistematicamente* quando fai certe azioni sarebbe meglio
poi vai di debug :)