2010-10-13 23 views
5

Đây phải là lỗi Delphi ...Chung được xác định trong thông tin gỡ lỗi vi phạm đơn vị

Tôi có một đơn vị làm cơ sở cho khung kiên trì của mình. Trong đơn vị đó tôi có một lớp cơ sở cho tất cả các đối tượng miền của tôi, một lớp danh sách và một lớp danh sách chung.

Chỉ gần đây tôi nhận thấy rằng khi tôi bước vào đơn vị khi gỡ lỗi, thực thi sẽ nhảy tới một điểm xa hơn một chút trong tệp hơn là ... Có thể bốn hoặc năm dòng. Sắp xếp lại các tập tin không có sự khác biệt. Mã cũng sẽ tạo ra các vi phạm truy cập, nhưng chỉ khi tôi gỡ lỗi nó.

Tôi cố gắng tìm lý do cho điều này ... Một số điều cần lưu ý, giống như một số đoạn mã vặn vít với trình gỡ lỗi (ví dụ: this logitec webcam driver bug) hoặc thông tin gỡ lỗi không đồng bộ với nguồn đơn vị của tôi (ví dụ: các dcu đã được kéo từ một số nguồn cũ).

Cuối cùng, tôi khởi động máy ảo có cài đặt Windows + Delphi sạch, chỉ lấy những gì tôi cần để kiểm tra thiết bị và tôi đã tạo một dự án DUnit nhỏ để kiểm tra nó. Cùng một vấn đề.

Sau đó, tôi bắt đầu xóa mọi thứ khỏi đơn vị từng lúc cho đến khi nó hoạt động. Điều duy nhất tạo ra bất kỳ sự khác biệt nào là khi tôi loại bỏ lớp danh sách chung.

Có ai khác đã gặp sự cố này không? Có ai biết làm thế nào để có được xung quanh nó?

Cảm ơn trước,

N @

Cập nhật: Bổ sung thêm generic trở lại bộ phận làm cho vấn đề trở lại, do đó, nó không phải là một vấn đề cũ DCUs.

+0

Natalie, tôi có cùng một vấn đề mà thực sự gây phiền nhiễu bởi vì tôi có một dự án hoàn toàn dựa trên danh sách chung. Khi tôi bắt đầu gỡ lỗi - bất ngờ! - IDE Delphi bị hỏng. Tôi bắt đầu một tiền thưởng cho câu hỏi của bạn. Nếu bạn đã thiết lập bất kỳ giải pháp nào cho lỗi Delphi này, vui lòng viết xuống đây. – Andrew

+0

@Andrew Tôi đã kết thúc việc tạo ra một đơn vị thứ hai chỉ với các generics trong đó. Tôi sẽ cập nhật câu trả lời của mình để giải thích rõ hơn về nó ... – Nat

+0

Cảm ơn sự ngoại lệ rất nhiều! Nó cũng làm việc cho tôi. Những 200 điểm này là của bạn, bạn đã chữa khỏi đau đầu của tôi :) – Andrew

Trả lời

2

Cuối cùng, giải pháp duy nhất tôi có thể tìm được đã làm việc để chuyển danh sách chung ra khỏi thiết bị.

Cập nhật 2011/08/03 Để xác thịt tốt hơn ra giải pháp của tôi:

tôi đã chung lớp danh sách cơ sở của tôi theo quy định tại đơn vị Domain tôi với lớp cơ sở TDomainObject tôi và một phiên bản không-generic.

Để khắc phục sự cố, tôi đã chuyển bản gốc thành đơn vị Domain.Generics thứ hai đã giải quyết được sự cố cho tôi.

Vì vậy:

unit Domain; 

interface 

type 
    TDomainObject = class 
    //blah de blah 
    end; 

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

    TDomainListEnumerator = class 
    //etc 
    end; 

Và:

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

Cập nhật ngày sau; Tôi đã có cùng một vấn đề trong Delphi 2010 là tốt, nhưng không có bất kỳ vấn đề bằng cách sử dụng bộ sưu tập chung trong các đơn vị, và gỡ lỗi với họ, trong Delphi XE. Nếu bạn đã chuyển đến XE, tôi sẽ tò mò nếu điều này vẫn ảnh hưởng đến bạn. –

+0

@WarrenP Tôi chưa chuyển lên, chưa đủ XE cho tôi di chuyển ... Đang chờ hỗ trợ 64bit tại Commodore. Tôi sẽ thử lại lần nữa khi tôi nâng cấp và tôi sẽ cập nhật bài đăng này. :) – Nat

2

Bạn đã đảm bảo rằng tất cả các dòng của đơn vị được đề cập kết thúc bằng CR LF? Trình gỡ lỗi không thể xử lý chỉ CR hoặc LF trong khi trình chỉnh sửa có thể. Một cái gì đó như Notepad ++, TextPad, vv có thể cho bạn thấy nếu có một hỗn hợp. Tải nó lên trong [Windows] NotePad và tái lưu nó có thể giải quyết nó.

+0

Nếu trường hợp đó xảy ra, làm cách nào để loại bỏ chung chung khỏi thiết bị đã khắc phục được sự cố? – Nat

+0

Tôi hiện đã thực hiện như bạn đã đề xuất và không thay đổi. Nếu chung chung là trong tập tin, thông tin gỡ lỗi bị hỏng, nếu nó ra, thông tin gỡ lỗi là tốt. Cảm ơn đề xuất của bạn, BTW. – Nat

0

Thường thì trạng thái biên dịch bên trong/bên ngoài này không đồng bộ.

Bước đầu tiên là loại bỏ các tệp .dcu cho dự án của bạn, sau đó khởi động lại Delphi, sau đó thực hiện xây dựng đầy đủ. Nếu sự cố vẫn tiếp diễn, hãy xem Nick's answer.

--jeroen

+0

Tôi đã làm điều đó, đó là lý do tại sao tôi đã kiểm tra mã trên một máy sạch với một Delphi sạch cài đặt ... Không DCU của trên máy tính ở tất cả. Sau khi loại bỏ các bit khỏi thiết bị, và một số chu kỳ biên dịch nó chỉ là _after_ loại bỏ các generic mà cố định vấn đề ... Thật vậy, đưa nó trở lại vào đơn vị đã làm cho vấn đề xảy ra. – Nat

+0

Nếu nó là một đơn vị đơn giản, đặt nó trong câu hỏi. Tôi sẽ cố gắng để tái sản xuất nó với cả hai Delphi 2010 và Delphi XE. –

+0

Tôi sẽ ghép nó xuống một ví dụ nhỏ và sau đó đăng nó ... Nhưng nó sẽ phải chờ đến thứ hai (giờ Melbourne) bây giờ. Cảm ơn lời khuyên của bạn cho đến nay. – Nat

Các vấn đề liên quan