2011-11-04 14 views
5

Questo è il mio primo post qui, ma vorrei dire grazie alla comunità perché ho trovato soluzioni ai miei problemi infinite volte venendo qui e trovando una soluzione in una domanda a cui era già stata data una risposta.Creazione classe virtuale/distruzione in delphi

Detto questo, mi piacerebbe arrivare al punto. Sto lavorando a Delphi 2007 IDE di Code Gear. Sono ancora piuttosto nuovo a lavorare in Delphi, meno di 3 mesi per essere precisi, quindi ti preghiamo di tenerlo a mente perché potrei mancare qualcosa di base qui.

Per prima cosa vorrei dare un piccolo contesto al problema. Sto scrivendo un'utilità di pianificazione per l'esecuzione di attività in momenti specifici. Per ogni attività disponibile sono presenti 2 frame delphi associati associati a tale attività. Il primo frame serve per modificare i dettagli specifici per quell'attività e il secondo frame serve a visualizzare le informazioni di runtime quando le attività sono in esecuzione.

Viene mantenuto un elenco di attività in esecuzione e in una casella di scorrimento nell'utilità viene visualizzato un elenco di frame corrispondenti per le informazioni di runtime. Questi frame di runtime vengono creati e distrutti all'avvio e alla fine delle attività. Il che mi porta al mio problema.

Uso un gestore di classe virtuale per mantenere un elenco di display disponibili e modificare i frame per ogni attività e crearli al volo come necessario. Durante il runtime, tutto si comporta in modo appropriato, è quando l'applicazione si chiude effettivamente che sto vedendo il problema.

il programma restituisce un'eccezione EAccessViolation durante la chiusura. Quando ho provato a tracciare il problema utilizzando l'IDE, la riga o l'azione corrispondente al problema non esiste realmente nel mio codice. Quindi deve far parte di alcune funzionalità di pulizia che vengono eseguite in secondo piano.

L'ho ristretto al codice che crea i fotogrammi di classe virtuale al volo, perché si chiude bene quando ho il codice commentato. Quindi questo mi porta a credere che non sto eseguendo alcuna azione relativa all'uso di questo tipo di creazione di classe.

var 
    tmpCCI: TComponentClassInfExt; 
    tmpS: String; 
    tc: TComponent; 
    bf: TBaseactionedit; 
... 
begin 
... 
tc := tmpCCI.fComponentClass.Create(nil); 
if tc is TBaseactionedit then 
begin 
    bf := TBaseActionEdit(tc); 
    bf.name := tmpCCI.fComponentClass.classname+IntToStr(nameCount); 
    bf.Visible := False; 
    bf.parent := pnlActionEdit; 
    bf.Align := alClient; 
    bf.Visible := True; 
end; 
... 

Questo è l'estratto di come sto creando i telai utilizzando il gestore classe virtuale. Sto liberando istanze con FreeAndNil quando non sono più necessarie. Ho tracciato il meglio della mia capacità di assicurare che ho correttamente liberato tutte le istanze prima che l'applicazione si chiuda, ma ovviamente mi manca qualcosa.

Quindi qualcuno ha qualche idea su da dove partire per eseguire il debug di qualcosa del genere?

P.S. ancora una volta sono nuovo, quindi se c'è qualcosa che mi è mancato, nascosto, o dimenticato di aggiungere, per favore fatemelo sapere. Grazie ancora per aver letto il mio post!

+0

Ho sperimentato gli AV durante lo spegnimento se lasciate che la gerarchia 'Proprietario' distrugga tutto all'arresto. Prova a chiamare 'Free' nel tuo modulo principale (e in altri moduli che potresti avere aperto) all'arresto. Fatelo aggiungendo al file .dpr dopo la riga 'Application.Run'. –

risposta

2

Probabilmente è il genitore che libera tutti i controlli contenuti durante Destroy.

+1

Se il genitore vuole distruggerlo durante la chiusura dell'applicazione, quale sarebbe il modo corretto di distruggere il frame quando non è più necessario durante il runtime, o c'è un modo di dirlo al genitore, non deve preoccuparsi di provare distruggere il componente? – PoultrySlave

+4

@PrematureOptimization 'TWinControl' libera anche i controlli figlio, vedere [here] (http://stackoverflow.com/questions/7075637/). –

+0

@TOndrej, grazie, angolo abbastanza interessante e pericoloso di VCL –

Problemi correlati