2010-10-13 13 views
5

Questo deve essere un errore Delphi ...Generico definito nelle informazioni di debug delle unità

Ho un'unità che costituisce la base del mio framework di persistenza. In quell'unità ho una classe base per tutti i miei oggetti dominio, una classe lista e una classe lista generica.

Recentemente ho notato che quando eseguo il debug nell'unità durante il debug, l'esecuzione salterà a un punto un po 'più in basso nel file di quanto dovrebbe ... Forse quattro o cinque righe. Riordinare il file non fa differenza. Il codice genererebbe anche violazioni di accesso, ma solo quando l'ho debugato.

Ho provato a cercare il motivo per questo ... Sono venute in mente diverse cose, come l'iniezione di codice con il debugger (ad esempio this logitec webcam driver bug), o le informazioni di debug che non sono sincronizzate con la mia unità sorgente (es. il dcu veniva estratto da una vecchia fonte).

Alla fine ho acceso una macchina virtuale con un'installazione pulita di Windows + Delphi, ho afferrato solo ciò di cui avevo bisogno per testare l'unità e ho creato un piccolo progetto DUnit per testarlo. Stesso problema.

Quindi ho iniziato a rimuovere le cose dall'unità una alla volta finché non ha funzionato. L'unica cosa che ha fatto la differenza è stata quando ho rimosso la classe lista generica.

Qualcun altro ha visto questo problema? Qualcuno sa come aggirarlo?

Grazie in anticipo,

N @

Aggiornamento: Aggiunta del generico nell'unità rende il problema tornare, quindi non è un problema di stantio DCU.

+0

Natalie, io ho lo stesso problema che è davvero fastidioso perché ho un intero progetto sulla base di liste generiche. Quando ho iniziato il debug - sorpresa! - l'IDE Delphi si è bloccato. Ho iniziato una taglia per la tua domanda. Se hai trovato qualche soluzione per questo bug Delphi, scrivi qui. – Andrew

+0

@Andrew Ho finito per creare una seconda unità con solo i generici in essa contenuti. Aggiornerò la mia risposta per spiegarlo meglio ... – Nat

+0

Grazie per l'adapulazione molto! Ha funzionato anche per me. Questi +200 punti sono tuoi, hai risolto il mio mal di testa :) – Andrew

risposta

2

Alla fine, l'unica soluzione che ho trovato che ha funzionato è stato quello di spostare l'elenco generico fuori dell'Unità.

Aggiornamento 2011-08-03 per rimpolpare meglio la mia soluzione:

avevo la mia classe generica lista di base definita nella mia unità Domain con la mia classe di base TDomainObject e una versione non generica.

Per risolvere il problema, ho spostato il generico in una seconda unità Domain.Generics che ha risolto il problema per me.

Quindi:

unit Domain; 

interface 

type 
    TDomainObject = class 
    //blah de blah 
    end; 

    TDomainObjectList = class (TDomainObject) 
    //more stuff 
    end; 

    TDomainListEnumerator = class 
    //etc 
    end; 

E:

unit Domain.Generics; 

interface 

type 

    TDomainObjectList<T: TDomainObject> = class (TDomainObjectList) 
    //stuff 
    public 
    property Items[AIndex: integer]: T read GetItem write SetItem; 

    type 
     TEnumerator = class (TDomainListEnumerator) 
     public 
     function GetCurrent: T; 
     property Current: T read GetCurrent; 
     end; 

    public 
    function GetEnumerator: TEnumerator; 

    end; 
+0

Aggiornamento degli ultimi giorni; Ho avuto gli stessi problemi anche in Delphi 2010, ma non ho problemi nell'usare le Generic Collections in unità e nel debugging con loro in Delphi XE. Se ti sei trasferito su XE, sarei curioso di sapere se questo ti riguarda ancora. –

+0

@WarrenP Non mi sono ancora mosso, non c'è abbastanza in XE da spostare ... Aspettando il supporto a 64 bit in Commodore. Ci riproverò quando alla fine aggiornerò e aggiornerò questo post. :) – Nat

2

Avete assicurato che tutte le linee dell'unità in questione finiscano in CR LF? Il debugger non può gestire solo CR o LF mentre l'editor può. Qualcosa come Notepad ++, TextPad, ecc. Può mostrarti se c'è una miscela. Caricarlo in [Windows] NotePad e ri-salvarlo può risolverlo.

+0

In questo caso, in che modo rimuovere il generico dall'unità ha risolto il problema? – Nat

+0

Ora ho fatto come suggerito e nessun cambiamento. Se il generico è nel file, le informazioni di debug sono interrotte, se è fuori, le informazioni di debug vanno bene. Grazie per il tuo suggerimento, BTW. – Nat

0

Spesso questo stato di compilazione interno/esterno non è più sincronizzato.

Il primo passo è eliminare i file .dcu per il progetto, quindi riavviare Delphi, quindi eseguire una compilazione completa. Se il problema persiste, consulta Nick's answer.

--jeroen

+0

L'ho fatto, ecco perché ho controllato il codice su una macchina pulita con un Delphi pulito installato ... Nessuna DCU era presente sulla macchina. Dopo aver rimosso i bit dall'unità e diversi cicli di compilazione è stato solo _dopo aver rimosso il generico che ha risolto il problema ... Infatti, rimettendolo nell'unità, il problema si è ripresentato. – Nat

+0

Se è un'unità semplice, inseriscila nella domanda. Proverò a riprodurlo sia con Delphi 2010 che con Delphi XE. –

+0

Lo abbinerò ad un piccolo esempio e poi lo posterò ... Ma dovrà aspettare fino a lunedì (ora di Melbourne) ora. Grazie per il tuo consiglio finora. – Nat

Problemi correlati