Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: PeppeC - Settembre 05, 2020, 05:50:19 pm

Titolo: errore violation access in progettazione su chiusura unit
Inserito da: PeppeC - Settembre 05, 2020, 05:50:19 pm
Ambiente windows, lazarus 2.0.10 + zeos 7.2.6.0
Chiedo aiuto sul problema in oggetto che in fase di progettazione, alla chiusura della unit principale causa errore violation error.
In esecuzione non sono presenti problemi evidenti, la chiusura del progetto sembra avvenire normalmente, ma in realtà il processo rimane attivo e deve essere terminato manualmente.

Ho eseguito innumerevoli prove fino allo sfinimento.
L'unico modo che ho individuato per chiudere la unit in progettazione senza errori è cancellare la proprietà "Connection" dagli oggetti TZsequence, ma chiaramente l'esecuzione non avverrebbe correttamente.
Impostando sui sequencer la proprietà Connection a run-time, riesco a chiudere e aprire correttamente la unit, ma ovviamente il problema della chiusura dall'esecuzione rimane.
Ritengo che il problema potrebbe essere nel file LFM dell'unità. Lo strumento di Lazarus "Controlla file LFM nell'editor" ha individuato e corretto un errore nella proprietà della form "Icon", ma comunque il problema permane.

Avete idee sulla possibile causa?
Titolo: Re:errore violation access in progettazione su chiusura unit
Inserito da: Stilgar - Settembre 06, 2020, 05:17:46 pm
Ciao.In genere quell'errore in chiusura avviene se viene de allocato 2 volte lo stesso puntatore.Prova a controllare se rilasci la memoria 2 volte.

Stilgar
Titolo: Re:errore violation access in progettazione su chiusura unit
Inserito da: PeppeC - Settembre 07, 2020, 04:54:13 pm
Ciao.In genere quell'errore in chiusura avviene se viene de allocato 2 volte lo stesso puntatore.Prova a controllare se rilasci la memoria 2 volte.

Stilgar
Grazie Stilgar, effettivamente chiudevo nelle innumerevoli prove con application.destroy e subito dopo application.terminate, che generava l'errore di violazione.
Eliminato application.destroy, comunque da sempre errore, ma stavolta eccezione di classe 'External: SIGSEGV all'indirizzo 1000817C7.
Lo scenario scenario è questo:
 - form di login, che viene nascosta prima di chiamare modalità normale (show) la form principale.
 - quando voglio uscire dalla form principale per chiudere, nel suo evento formClose, se metto Application.Terminate va in errore, se invece non lo ometto, non va in errore ma l'applicazione rimane sospesa per qualche processo a me sconosciuto e devo "killarla" manualmente.
E' come se la form principale non venga chiusa, ma nascosta dalla vista (hide) e quindi rimanga sospesa...
Eppure fino a poco tempo fa funzionava regolarmente, non capisco quale modifica possa generato questo effetto.
Qualche idea?
Titolo: Re:errore violation access in progettazione su chiusura unit
Inserito da: Stilgar - Settembre 08, 2020, 04:58:39 pm
Dalla descrizione stai interferendo con il normale processo di shotdown dell'applicazione.
L'applicazione si fa carico di eliminare tutte la form che sono state registrate.
Sel il login lo fai con normale flusso di creazione in avvio, poi non devi eliminarla.
Nella formClose fai da qualche parte
Codice: [Seleziona]
  CloseAction:= caFree;
Altrimenti la finestra main resta attiva ma nascosta.Questo impedisce all'applicazione di terminare.
L'applicazione termina in modo automatico quando la prima form (quella che viene registrata come main) viene rilasciata.

Stilgar
Titolo: Re:errore violation access in progettazione su chiusura unit
Inserito da: PeppeC - Settembre 08, 2020, 11:29:27 pm
Grazie ancora Stilgar, credo di aver capito. In realtà, come spiegavo prima, la mia form principale è la procedura di login (prima form del mio progetto,MainForm) e la prima ad essere avviata. Visto che la mia form principale è richiamata da quella di login in modalità Show piuttosto che in ShowModal, non ho più modo di tornare al login e quindi chiudere. Ora mi spiego perchè tutto rimane sospeso, quello che non mi spiego è perchè fino a poco tempo fa il tutto funzionava. Disgrazia vuole che poco tempo fa ho avuto problemi con il mio HD e per necessità ho reinstallato il tutto e contestualmente sono passato da Lazarus versione 2.0.6 a 2.0.8 e subito dopo a 2.0.10, così mi sono perso... 
Altri IDE, in altri linguaggi di programmazione, all'interno del progetto prevedono una serie di form e fra queste una, anche se non è la prima dell'elenco, può essere dichiarata come MainForm.
In alternativa, mi chiedo se, per evitare di fare modifiche strutturali al progetto, non esista un modo, un'istruzione, per chiudere di botto (si fa per dire), da qualsiasi punto l'applicazione?
Grazie.
Titolo: Re:errore violation access in progettazione su chiusura unit
Inserito da: Stilgar - Settembre 09, 2020, 08:58:46 am
Ciao
Se vuoi allegare il progetto, possiamo vedere di sistemarlo a tempo perso.




Stilgar
Titolo: Re:errore violation access in progettazione su chiusura unit
Inserito da: Stilgar - Settembre 09, 2020, 09:33:59 am
In alternativa.


Prova a controllare questo progetto.
Fa 2 cagatine al volo, nulla di complesso.



Titolo: Re:errore violation access in progettazione su chiusura unit
Inserito da: Stilgar - Settembre 10, 2020, 09:15:39 pm
News?
Titolo: Re:errore violation access in progettazione su chiusura unit
Inserito da: PeppeC - Settembre 11, 2020, 07:24:33 am
nessuna novità al momento. Ho provato ad esaminare il piccolo progetto che hai postato, ma credo che tu lo abbia zippato prima di salvarlo. Infatti aprendo il progetto, questo non include le unità. Ma non è questo il problema, si può ricostruire, anche se non l'ho ancora fatto...
L'unica cosa che ho afferrato del tuo progetto è la funzione "sleep", che ho tanto cercato in altre occasioni.
Sulla rete ho anche trovato come scambiare (swap) la main form con un'altra in modalità esecuzione. Ha funzionato nel senso che effettivamente la mia form principale assume il ruolo di MainForm (isMainForm=true), ma in chiusura ho sempre il solito errore anche se chiudo con CloseAction:=caFree;
Avrei quindi preso la decisione di apportare le modifiche al progetto e attivare il login dopo aver avviato la mia form principale, non è difficile, ma mi da l'idea che possa essere un problema di sicurezza violabile ancora più facilmente.
Mi sono intestardito perchè fino a poco tempo fa funzionava tutto, ho solo cambiato disco e versioni lazarus, ma in questo passaggio è successo l'imprevisto.
Dalla tua spiegazione ho capito che è una situazione del tutto normale il comportamento attuale di Lazarus e purtroppo non conoscendolo ancora nel pieno delle sue funzioni base, ho dato la caccia a errori fantasma.
Grazie.

P.S.: se dovesse servire a qualcuno, includo la procedura che imposta in esecuzione una qualsiasi form del progetto come principale:

procedure SetAsMainForm(aForm:TForm);
var
 P:Pointer;
begin
 P := @Application.Mainform;
 Pointer(P^) := aForm;
end ;   
Titolo: Re:errore violation access in progettazione su chiusura unit
Inserito da: Stilgar - Settembre 12, 2020, 10:26:10 pm
Ciao.
In termini informatici la funzione che hai postato è una mezza bestemmia.
Quella è una proprietà in sola lettura.
Se è in sola lettura un motivo ci sarà al livello di design e gestione la mainform è gestita interamente.
Potresti, in caso di necessità, giocare con la lista delle form caricate nell'applicazione.