PDA

Visualizza la versione completa : [DELPHI] Access Violation inserendo oggetti in una TObjectList


re dei giovani
19-02-2007, 10:33
Ciao a tutti ho un problema con l'uso di TObjectList...
Nel mio codice ho una serie di oggetti che devo memorizzare in una TObjectlist;
Creo la mia lista TObjectList;
Con una ricorsione creo ogni volta l'oggetto che devo salvare e richiamo il metodo TObjectlist.add(oggetto); a questo punto mi compare il messaggio di errore che dice che c'è stato una violazione all'accesso in memoria .....eppure l'oggetto che gli passo esiste(ho fatto una prova stampando il contenuto...visto che potevo farlo), e la lista l'ho creata in precedenza....quindi non so che cosa possa succedere...avete qualche consiglio per come fare a capire dove è l'errore?
Grazie in anticipo Ciao

alka
19-02-2007, 11:06
Prova a postare il codice... magari si tratta di una semplice svista.

Ciao! :ciauz:

re dei giovani
19-02-2007, 11:29
Quello che ti posto di seguo è il pezzo di codice facente parte della funzione ricorsiva lettura_ciclica che vedrai viene anche qui richiamata..e che si occupa della lettura dei dati nel file che ho precedentemente aperto.....C'è da dire che il problema, come in precedenza detto non è la creazione dell'oggetto item, la quale avviene senza problemi( testato facendo un salvataggio dell'oggetto in un file salvaIcona.txt e visionando file), ma il caricamento dell'elemento item nella tObjectlist che si chiama Listasequenze....
....c'è da dire che La TObjectList, per motivi dovuti alle specifiche richieste è stata definita come variable di globale e la creo in una funzione chiamata Leggit_dataset che richiama per la prima volta la funzione lettura_ciclica(...);eccoti il pezzo di codice....

...
Item:=Tdataset.create; // creo oggetto
pItem:=@item;

//questi non sono d'interesse per il nostro scopo perchè lettura_ciclica funziona

pItemList:=@Item.lista;
pItemseq:=@Item.ListaSequenze;
uit:=filepos(fp)+lungItem;// esce quando finisce di leggere..e ha raggiunto quel valore di offset
where:=filepos(fp); // setto al valore istanteneo di offset del file



lettura_ciclica(fp,pItemList,pitemseq,where,offset ImageFile,uit,dir);

//item creato eseguo controlli per chiamare funzioni specifiche oppure per salvare item nell ListaSequenze

elemento:=item.getElemento_Dataset(item.lista,0);
letddir:= elemento.getTag;
letddir2:=torna_Gruppo(letddir);
if ((letddir2 ='0004')and dir ) then
begin
leggiDicomDir(item);
end;
if ((letddir2 ='0028')and dir) then
begin

trova:=item.lista.Count;
item.offsetImageFile:=filepos(fp);
letddir:='datasetIcona.txt';
salvaSQinFile(item,letddir); //creo file con cui ho testato item
listasequenze.add(item); //aggiungo item alla tobjectlist globale creata in precedenza......è qui che mi da errore

....ho utilizzato Search/finerror dandogli la posizione di memoria in cui ho errore e sembra sia dentro alla procedura TList.Add .....ma non riesco a capire il perchè....

Il messaggio d'errore che mi viene detto è questo:

Project visualizzatore.exe raised exception class EAccessViolation with message 'access violation at address 0041568B in module 'visualizzatore.exe'.Read of address 00000008. process stopped.Use step or run continue.

Di più al momento non so dirti
Ciao

re dei giovani
19-02-2007, 11:32
..il codice postato è solo la parte d'interesse e non tutta la funzione lettura_ciclica, quindi sembra non abbia ne capo ne coda ma in realtà ce l'ha e se togliessi Listasequenze.add(item)..il tutto funziona senza problemi

alka
19-02-2007, 12:02
Devi usare il tag [CODE ] (#) per indentare correttamente il codice, oltre al fatto che - ovviamente - mi riferivo al codice significativo, cioè quello che coinvolge gli oggetti problematici (l'oggetto da inserire nella lista o la lista stessa).

Ad esempio, manca la parte in cui l'istanza di TObjectList viene creata.

Oltre a questo, non me ne volere ma trovo che il codice sia molto caotico, con un uso "mixato" di puntatori e riferimenti, e la comprensione diventa parecchio difficile.

Procediamo per gradi: come crei la lista?

re dei giovani
19-02-2007, 12:10
Ti mando intestazione della unit dicom_dataset che contiene sia def classe Tdataset che lista oggetti dataset Lista Sequenza TobjectList:

Tdataset = Class (TObject)
lista: TList;

ListaSequenze:TObjectlist;
offsetImageFile:LongInt;
constructor create(var d:Tstringlist);overload;
constructor create;overload;
function leggiDataset(var fp:file;var dir:boolean):boolean; //leggi tags da file creando lista
function getElemento_Dataset(var list: TList; i:Integer):Tdataelement; // torna stringa dell'elemento
function getelemento(var list: TList; var TAG:String):String;
function get_DataItem(var list: TList; i:Integer):String;
function getoffsetelemento(var list: TList; VAR TAG:String;var n:Integer):longInt;
end;

procedure lettura_ciclica(var fp:File; var pList,plistseq: pointer;var where,offsetImageFile,uscitaItem:LongInt;dir:boole an);

procedure salvaSQinFile(var t:Tdataset;var nfile:String);
procedure leggiDicomdir ( var d:Tdataset);

procedure memorizzaDtasetIcone ( var icona:Tdataset);


aspetta mi sono accorto di una cosa...l'errore può essere dovuto al fatto che io ho definito listasequenze sia come attributo dell'oggetto Tdataset che come variabile globale esterna a questo ? ....ora provo

alka
19-02-2007, 12:31
Manca comunque quello che ti ho chiesto: la creazione della lista.

Aggiungo a quanto detto nel messaggio precedente il fatto che TDataSet è un nome infelice per la tua classe: esiste già una classe omonima nella VCL, e questo può generare confusione.

re dei giovani
19-02-2007, 14:32
Si scusa...è che nel momento in cui mi sono accorto di questo doppione (non intenzionale) ho subito smesso di postare codice e sono andato a verificare.....in effetti come hai detto tu all'inizio si tratta di una svista....ho dichiarato due cose uguali e lui faceva un grancasino ....ora sembra vada bene (ho eliminato una delle due dichiarazioni)...per quanto riguarda il nome dell'oggetto provvedo subito al cambiamento...non ci avevo fatto caso e avavo scelto questo nome in quanto rappresentava ciò che l'oggetto era per me una lista di dati....però non mi ha mai dato casini prob. perchè implemento costruttore "personalizzato".......grazie dell'aiuto......buona giornata :)

Loading