Общий, определенный в отладочной информации, нарушающей юнит - PullRequest
5 голосов
/ 13 октября 2010

Это должно быть ошибка Delphi ...

У меня есть юнит, который является основой моей системы персистентности. В этом модуле у меня есть базовый класс для всех моих доменных объектов, класс списка и универсальный класс списка.

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

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

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

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

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

Заранее спасибо,

N @

Обновление : добавление универсального элемента обратно в устройство приводит к возникновению проблемы, поэтому это не проблема устаревших DCU.

Ответы [ 3 ]

2 голосов
/ 09 декабря 2010

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

Обновление 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;
2 голосов
/ 14 октября 2010

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

0 голосов
/ 14 октября 2010

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

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

- Йерун

...