2010-10-13 2 views
5

Это должно быть ошибкой Delphi ...Generic определен в блоке разрыва отладочной информации

У меня есть блок, который является основой моей структуры ПЕРСИСТЕНТНОСТИ. В этом блоке у меня есть базовый класс для всех моих объектов домена, класса списка и общего класса списка.

Совсем недавно я заметил, что, когда я вхожу в блок при отладке, выполнение переходит в точку чуть дальше вниз в файл, чем нужно ... Может быть, четыре или пять строк. Переупорядочение файла не имеет значения. Код также будет генерировать нарушения доступа, но только тогда, когда я его отлаживал.

Я попытался найти причину этого ... Несколько вещей пришло мне в голову, например, привинчивание кода с помощью отладчика (например, this logitec webcam driver bug) или отладочная информация не синхронизирована с моим источником устройства (например, dcu вытаскивали из какого-то старого источника).

В итоге я включил виртуальную машину с чистой установкой Windows + Delphi, схватил только то, что мне нужно для тестирования устройства, и я создал небольшой проект DUnit для его проверки. Та же проблема.

Затем я начал удалять вещи из единицы по одному, пока это не сработало. Единственное, что имело какое-либо значение, - это когда я удалил общий класс списка.

Неужели кто-нибудь еще видел эту проблему? Кто-нибудь знает, как обойти это?

Спасибо заранее,

N @

Update: Добавление родовое обратно в устройство делает проблему вернуться, так что это не проблема несвежего DCUs.

+0

Натали, у меня та же проблема, которая действительно раздражает, потому что у меня есть целый проект, основанный на общих списках. Когда я начал отлаживать сюрприз! - Delphi IDE разбилась. Я начал щедрость за ваш вопрос. Если вы установили какое-либо обходное решение для этой ошибки Delphi, напишите здесь. – Andrew

+0

@ Andrew Я закончил создание второго блока с только генериками в нем. Я уточню свой ответ, чтобы лучше объяснить это ... – Nat

+0

Спасибо за exaplanation очень много! Это сработало и для меня. Эти +200 очков заработали, вы вылечили мою головную боль :) – Andrew

ответ

2

В конце концов, единственное решение, которое я мог бы найти, что работал в том, чтобы переместить общий список из группы.

Обновление 2011-08-03 Для того, чтобы лучше конкретизировать мое решение:

я мой общий список базового класса, определенный в моем Domain блоке с моей базой TDomainObject классом и необщей версией.

Чтобы устранить проблему, я переместил общий элемент в блок Domain.Generics, который решил проблему для меня.

Итак:

unit Domain; 

interface 

type 
    TDomainObject = class 
    //blah de blah 
    end; 

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

    TDomainListEnumerator = class 
    //etc 
    end; 

И:

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

Обновление последнего дня; У меня были те же проблемы в Delphi 2010, но у меня нет проблем с использованием общих коллекций в подразделениях и отладки с ними в Delphi XE. Если вы переехали в XE, мне было бы любопытно, если это все равно повлияет на вас. –

+0

@WarrenP Я еще не продвинулся, в XE недостаточно, чтобы я мог двигаться ... Ожидание 64-битной поддержки в Commodore. Я попробую его снова, когда я в конечном итоге обновится, и я обновлю это сообщение. :) – Nat

2

Вы уверены, что все линии данного устройства заканчиваются в CR LF? Отладчик не может обрабатывать только CR или LF, пока редактор может. Что-то вроде Notepad ++, TextPad и т. Д. Может показать вам, есть ли смесь. Загрузив его в [Windows] NotePad и перезагрузив его, он сможет его решить.

+0

Если это так, то как устранить общий элемент из устройства устранил проблему? – Nat

+0

Теперь я сделал то, что вы предложили, и никаких изменений. Если общий файл находится в файле, информация об отладке ломается, если он отсутствует, информация об отладке в порядке. Спасибо за ваше предложение, BTW. – Nat

0

Часто это внутреннее/внешнее состояние компиляции, выходящее из синхронизации.

Первый шаг - избавиться от файлов .dcu для вашего проекта, а затем перезапустить Delphi, а затем выполнить полную сборку. Если проблема не устранена, проверьте Nick's answer.

--jeroen

+0

Я сделал это, поэтому я проверил код на чистой машине с чистым Delphi, установленным ... Никакие DCU не были на машине вообще. После извлечения битов из блока и нескольких циклов компиляции это было только после исчезновения родового, что фиксировало проблему ... Действительно, вернув его в блок, проблема снова возникла. – Nat

+0

Если это простой блок, поставьте его на вопрос. Я попытаюсь воспроизвести его как с Delphi 2010, так и с Delphi XE. –

+0

Я свяжу его с небольшим примером, а затем опубликую его ... Но ему придется подождать до понедельника (время в Мельбурне). Спасибо за ваш совет. – Nat

Смежные вопросы