Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [delphi]Problemi access violation con TObjectList

    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
    re dei giovani

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,333
    Prova a postare il codice... magari si tratta di una semplice svista.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    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

  4. #4
    ..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
    re dei giovani

  5. #5
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,333
    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?
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  6. #6
    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
    re dei giovani

  7. #7
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,333
    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.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  8. #8
    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
    re dei giovani

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.