2013-06-05 39 views
8

Tôi đang cố gắng sử dụng TDRecLstTDSplyCm đơn vị từ mã kèm The Tomes of Delphi, nhưng tôi nhận được một lỗi biên dịch trong TDBasics.pas:Tại sao không mã từ biên dịch "Tomes of Delphi"?

Identifier expected but 'CONST' found

tôi nhận được một tương tự lỗi trong TDStrRes.inc:

Same error as above

Có gì sai và cách khắc phục?

The code có sẵn từ tác giả.

+1

Tôi nghĩ câu hỏi này rất hay. Các poster "không thể biên dịch chương trình và không hiểu tại sao". Bạn cần thêm gì nữa à? Mọi thông tin bổ sung có thể thiên vị các phản ứng có thể xảy ra. Dù sao, 10 chống lại 1 nó là một con đường tìm kiếm/đơn vị không tìm thấy vấn đề. Ví dụ, để biên dịch TDRecList.pas, các tệp TDBasics.pas và TDDefine.inc phải có mặt trong đường dẫn tìm kiếm. – Igor

+0

Igor, cảm ơn bạn! Tôi cũng không hiểu ... Có đơn vị (xem liên kết tại bài của tôi). Tôi thêm đơn vị vào chương trình. Có rõ không? Tôi không thể biên dịch mã. Lỗi: http://i.stack.imgur.com/VIM6x.png http://i.stack.imgur.com/7i3To.png – tbutton

+2

@Igor, bạn chính xác rằng nhiều thông tin hơn sẽ thiên vị các phản hồi; nó sẽ thiên vị họ hướng tới * hữu ích * thay vì chỉ bắn trong bóng tối. Phần thông tin thiếu cơ bản nhất trong câu hỏi này là * thông báo lỗi *. –

Trả lời

13

Bạn rõ ràng đang sử dụng phiên bản Delphi mới hơn Delphi 6. Mặc dù được cập nhật vào năm 2005, mã từ cuốn sách đó chỉ phát hiện lên phiên bản Delphi đó. TDDefine.inc xác định một số biểu tượng trình biên dịch dựa trên phiên bản nó phát hiện, nhưng khi phiên bản bạn đang sử dụng không phải là bất kỳ thứ gì nó nhận ra, nó xác định các ký hiệu không có. Điều đó cuối cùng dẫn đến các vấn đề sau này khi trình biên dịch gặp mã như thế này trong TDBasics.pas;

implementation 

uses 
    {$IFDEF Delphi1} 
    WinTypes, WinProcs; 
    {$ENDIF} 
    {$IFDEF Delphi2Plus} 
    Windows; 
    {$ENDIF} 
    {$IFDEF Kylix1Plus} 
    Types, Libc; 
    {$ENDIF} 

{$IFDEF Delphi1} 
{$R TDStrRes.r16} 
{$ENDIF} 
{$IFDEF Delphi2Plus} 
{$R TDStrRes.r32} 
{$ENDIF} 
{$IFDEF Kylix1Plus} 
{$R TDStrRes.r32} 
{$ENDIF} 

const 
    UnitName = 'TDBasics'; 

Kể từ khi không ai trong số Delphi1, Delphi2Plus, hoặc Kylix1Plus được xác định, mệnh đề uses trống. Khi chúng tôi bỏ qua tất cả các chỉ thị biên dịch và khối mã không hoạt động, trình biên dịch cuối cùng nhìn thấy mã như thế này:

implementation 

uses 

const 
    UnitName = 'TDBasics'; 

Đó là lý do tại sao các trình biên dịch phàn nàn về mong đợi một định danh thay vì const.

Để khắc phục sự cố, bạn cần phải dạy TDDefine.inc để nhận dạng phiên bản Delphi của bạn. Mặc dù vậy, dễ dàng hơn, có thể là bỏ qua tất cả mã phát hiện phiên bản và mã hóa cứng tất cả các ký hiệu áp dụng cho phiên bản bạn đang sử dụng. Miễn là bạn không bao giờ sử dụng bất kỳ phiên bản nào cũ hơn Delphi 6, tất cả, các ký hiệu sẽ áp dụng cho tất cả các phiên bản của bạn.

Tìm khối mã sau đây trong TDDefine.pas:

{$IFDEF VER140} 
    {$DEFINE Delphi6} 
    {$DEFINE Delphi1Plus} 
    {$DEFINE Delphi2Plus} 
    {$DEFINE Delphi3Plus} 
    {$DEFINE Delphi4Plus} 
    {$DEFINE Delphi5Plus} 
    {$DEFINE Delphi6Plus} 
    {$DEFINE HasAssert} 
{$ENDIF} 

Tháo dòng đầu tiên và cuối cùng để các $DEFINE hướng dẫn còn lại được xử lý vô điều kiện.

+0

Cảm ơn bạn! Để giải quyết vấn đề để thêm {$ ifdef VER150} {$ DEFINE Delphi7} {$ DEFINE Delphi1Plus} {$ DEFINE Delphi2Plus} {$ DEFINE Delphi3Plus} {$ DEFINE Delphi4Plus} {$ DEFINE Delphi5Plus} { $ DEFINE Delphi6Plus} {$ DEFINE HasAssert} {$ ENDIF} trong TDDefine.inc (Delphi 7) – tbutton

+0

Nhưng chúng ta nên thêm gì cho Delphi XE hoặc XE4? – tbutton

+0

Ai quan tâm? Phần còn lại của mã của cuốn sách không bao giờ kiểm tra bất kỳ phiên bản Delphi bổ sung nào, vậy tại sao phải thêm dòng và dòng mã để phát hiện chúng? Nếu bạn thực sự phải biết, hãy kiểm tra [danh sách đầy đủ các định nghĩa cho các phiên bản Delphi] (http://stackoverflow.com/q/750801/33732), và sau đó điều chỉnh mã của bạn để sử dụng các biểu tượng được xác định ở đó thay vì các ký hiệu của cuốn sách tác giả đã chọn. –

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