2012-12-08 34 views
7

Tôi có các câu lệnh xác định khác nhau để xử lý các phiên bản Delphi khác nhau trong một tệp bao gồm. Điều này bao gồm tập tin được "bao gồm" trong một đơn vị. Trình biên dịch tôn trọng các định nghĩa được đưa ra trong tệp bao gồm nhưng IDE không. Điều này dẫn đến việc bổ sung một số đơn vị nhất định vào mệnh đề sử dụng mà có thể đã có sẵn - kèm theo trong một chỉ thị trình biên dịch DEFINE. Vì vậy, nếu một đơn vị được thêm vào mà không có sẵn trong trước Delphi XE3 bạn sẽ có một vấn đề lớn bởi vì nếu bạn để cho IDE thêm các đơn vị và không thể biên dịch nó với một phiên bản trước Delphi XE3 mà không có đơn vị đó.Cách có điều kiện bao gồm một số đơn vị

Ví dụ: một dự án với một đơn vị với một TActionList trên đó.

  1. MYINCLUDE.INC chỉ có một định nghĩa {$DEFINE DELPHIXE3}

  2. Một đơn vị mẫu có thể trông giống như

    unit Unit1; 
    
    {$I MYINCLUDE.INC}     
    
    uses 
        Winapi.Windows, 
        Winapi.Messages, 
        System.SysUtils, 
        System.Variants, 
        System.Classes, 
        Vcl.Graphics, 
        Vcl.Controls, 
        Vcl.Forms, 
        Vcl.Dialogs, 
        {$IFDEF DELPHIXE3} System.Actions, {$ENDIF} 
        Vcl.ActnList; 
        ... 
    
  3. Sau một lưu IDE thêm System.Actions thêm vào cuối danh sách sử dụng mà trong kết quả lần lượt ở số Số nhận dạng được redeclared lỗi trình biên dịch. Nếu bạn xóa nó, IDE sẽ thêm nó lần nữa vào lần lưu kế tiếp.

Tôi vừa báo cáo rằng QC#111178.

Có cách giải quyết nào cho lỗi đó không?

Christian

+1

IDE luôn là một điều kiện phân tích cú pháp tệ hại một chút. Tôi hy vọng báo cáo QC của bạn sẽ bị đóng như được thiết kế. Vấn đề đã được nâng lên một lần nữa và một lần nữa với cùng một phản ứng. –

+0

IDE luôn luôn có điều kiện bị cắt xén trong tập tin * .dpk nhưng vấn đề này là một cái gì đó mới và đáng thất vọng. – kludg

+0

@Serg Nó luôn luôn cư xử theo cách này trong tệp .pas. Không có gì mới ở đây. Được như thế này từ mãi mãi. –

Trả lời

3

Có lẽ điều dễ nhất là sử dụng tính năng bí danh đơn vị để trợ giúp. Để làm việc này, bạn cần cài đặt dự án khác nhau cho các phiên bản trình biên dịch khác nhau. Ví dụ, các tệp .dpr và .dproj khác nhau cho mỗi phiên bản trình biên dịch được hỗ trợ.

Trong dự án XE2 của bạn, bạn định nghĩa một bí danh đơn vị như sau:

System.Actions=Vcl.ActnList 

Trong dự án XE3 bạn bỏ qua bí danh đó.

Sau đó, trong tệp .pas của bạn, bạn có thể vui vẻ sử dụng System.Actions mà không gặp vấn đề gì trong phiên bản Delphi.

Một giải pháp đơn giản hơn nữa là tạo một đơn vị trống có tên System.Actions mà bạn chỉ đưa vào dự án của mình để xây dựng XE2.

+0

Có, đó là cách giải quyết dễ nhất/sạch nhất cho vấn đề đó. Cảm ơn bạn. – Christian

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