2009-05-15 26 views
5

Trong Delphi 2007, làm việc trên một dự án bao gồm một thành phần tùy chỉnh, tôi nhận được bộ cảnh báo này như là bốn đầu tiên trong thông điệp khi tôi làm một bản dựng đầy đủ (nhưng không phải khi tôi làm một biên dịch thẳng):Delphi biên dịch cảnh báo trỏ đến đơn vị riêng của Delphi

[DCC Warning] Dialogs.pas(1426): W1002 Symbol 'TFileOpenDialog' is specific to a platform 
[DCC Warning] Dialogs.pas(1446): W1002 Symbol 'TFileSaveDialog' is specific to a platform 
[DCC Warning] ComCtrls.pas(6757): W1036 Variable 'Section' might not have been initialized 
[DCC Warning] ComCtrls.pas(19268): W1023 Comparing signed and unsigned types - widened both operands 

Tôi thường cố gắng loại bỏ cảnh báo trình biên dịch ở nơi có thể, nhưng đây là những đơn vị "cổ phiếu" Delphi. Những cảnh báo này có phải là kết quả gián tiếp của một thứ gì đó trong mã của tôi không? Nếu vậy, làm thế nào để tôi tìm ra những gì/ở đâu? Nếu không, tôi nên làm gì với họ?

Trả lời

11

Tôi tin rằng đó là vì bạn có mã nguồn Delphi trong đường dẫn xây dựng của mình. Nếu bạn loại bỏ các thư mục nguồn Delphi, sau đó nó sẽ xây dựng mà không có những cảnh báo này.

+0

Tôi có vấn đề này trong XE5, nhưng tôi không chắc chắn đường dẫn để loại bỏ, bạn có thể cho biết đường dẫn chính xác? – Wel

2

Tôi đã dành tuổi để nhận những vấn đề này (tốt, hai người đầu tiên của bạn dù sao) và trong sự thiếu hiểu biết của tôi thực sự đã gỡ cài đặt Delphi và cài đặt lại nó vô ích. Cuối cùng tôi thấy rằng nó là do thiếu cài đặt dự án. Ít nhất atfirst, nếu bạn di chuyển một dự án từ Delphi trước đó, các thiết lập dự án hiện tại của bạn được chuyển đổi nhưng không có lý do rõ ràng nào Delphi có thể bắt đầu quên điều này và cung cấp cho bạn một tập các cài đặt dự án 'trống'. Bạn có thể thấy điều này bằng cách mở Project-Options, nơi bạn sẽ tìm thấy Base, Release và Debug. Kiểm tra một trong những hoạt động (nó là đậm trong quản lý dự án) và bạn sẽ thấy rằng nó không có đường dẫn thư mục cũng như tất cả các gợi ý và cảnh báo tại mặc định của họ. Hầu hết các mặc định này là tốt nhưng 'Biểu tượng nền tảng' và 'Đơn vị nền tảng' sẽ bị tắt (ít nhất là đối với các công cụ của Win32). Trân trọng, Brian

5

Lý do chúng chỉ hiển thị khi thực hiện Xây dựng là lệnh biên dịch chỉ biên dịch nguồn đã thay đổi kể từ lần biên dịch trước đó. Trong khi lệnh Xây dựng biên dịch lại mọi thứ trong dự án bất kể thay đổi.

Cảnh báo rất có thể do thư mục nguồn Delphi được đưa vào đường dẫn tìm kiếm dự án. Loại bỏ nó và xóa các dcus trong thư mục của dự án của bạn sẽ cho bạn biết nếu bất cứ điều gì trong dự án yêu cầu nguồn Delphi khi bạn biên dịch lại. Theo kinh nghiệm của tôi, bạn nên cần nguồn Delphi nếu bạn đã tìm thấy một lỗi trong việc thực hiện Delphi và tạo một bản sao tùy chỉnh của một lớp Delphi để sửa lỗi. Nếu đây là trường hợp khi bạn cố gắng xây dựng mà không có nguồn Delphi, bạn thường sẽ nhận được:

Đơn vị '% s' được biên dịch với đơn vị '% s' trong '% s' nhưng phiên bản khác '% s Đã tìm thấy ' (F2446)

Trường hợp% s sẽ là một số lớp Delphi cấp thấp.

Nếu bạn không gặp phải lỗi nào, nó thực sự không cần nguồn Delphi.

Điều này cũng có thể xảy ra nếu nguồn Delphi nằm trong đường dẫn tìm kiếm .

2

Nếu bạn muốn tiếp tục biên dịch một cách rõ ràng nguồn VCL vào dự án của mình, bạn có thể sao chép các đơn vị đang tăng gợi ý/cảnh báo trình biên dịch và "sửa" các gợi ý/cảnh báo trong bản sao đó. Đặt bản sao cập nhật/"cố định" của các đơn vị VCL đó vào một thư mục khác và đảm bảo bạn thêm đường dẫn đến thư mục đó vào đường dẫn Tìm kiếm của dự án TRƯỚC KHI đường dẫn đến nguồn VCL Delphi.

Ví dụ: đường dẫn tìm kiếm dự án của tôi trông giống như sau: "C: \ Dev \ Source \ MyFixedVCLUnits; C: \ Program Files \ CodeGear \ RAD Studio \ 6.0 \ source "

Để đưa ra ví dụ về các bản sửa lỗi đơn giản cần thiết để loại bỏ các cảnh báo này, đây là một trong các chức năng trong Dialogs.pas hiện đang nằm trong thư mục " C: \ Dev \ Source \ MyFixedVCLUnits "của tôi :

{$WARNINGS OFF}
function TFileOpenDialogWrapper.CreateFileDialog: TCustomFileDialog;
begin
Result := TFileOpenDialog.Create(nil);
Result.OnExecute := OnExecuteEvent;
end;
{$WARNINGS ON}

Trong trường hợp này, chỉ cần thêm {$ CẢNH BÁO OFF} vv theo yêu cầu

1

Nếu bạn phát triển chỉ dành cho nền tảng cụ thể nguồn dự án mở và thêm

.
2

TFileOpenDialog sẽ chỉ hoạt động trên Windows Vista trở lên. Bạn nên sử dụng TOpenDialog thay vì TFileOpenDialog, trong các phiên bản Delphi mới hơn, nó sẽ phát hiện hệ điều hành nào đang chạy và hiển thị hộp thoại thích hợp.
https://forums.embarcadero.com/thread.jspa?threadID=70498

3

Hai cảnh báo đầu tiên bạn đề cập (cùng với một vài cảnh báo khác) là để bạn biết rằng mã bạn hiện đang sử dụng sẽ không biên dịch trên các nền tảng khác nhau. Đối với Delphi 2007, không có nhiều, nhưng nó mang phần còn lại của Kylix (phiên bản Linux đã biến mất) và Delphi cho .NET (cũng biến mất).

Phiên bản mới hơn của nền tảng hỗ trợ Delphi (Win32/Win64, OS X, iOS và Android), nơi các thư này có liên quan trở lại khi phát triển ứng dụng Firemonkey (hoặc ứng dụng VCL nếu có sự khác biệt giữa Win32 và Win64) . Chúng cho biết các điểm trong mã của bạn, nơi bạn sẽ phải thực hiện điều chỉnh trong mã của mình cho các hệ điều hành khác nhau. (Ví dụ, hai bạn trích dẫn là dành cho các hộp thoại dành riêng cho Windows; bạn cần phải sử dụng một hộp thoại khác dựa trên nền tảng đích và sử dụng các câu lệnh {$IFDEF} xung quanh các khu vực cụ thể theo từng nền tảng để giữ chúng không được biên dịch cho Các mã khác

Vì mã hiện tại của bạn không thể được chuyển trực tiếp (ngay cả trong phiên bản Delphi hiện đại) sang bất kỳ thứ gì ngoài Windows vì nó dựa trên VCL, bạn có thể tắt các cảnh báo đó một cách an toàn. các thông báo sau (hoặc sử dụng trình biên dịch xác định tôi đã bao gồm trong mã của bạn):

Library Symbol      {$WARN SYMBOL_LIBRARY OFF} 
Platform Symbol      {$WARN SYMBOL_PLATFORM OFF} 
Library Unit       {$WARN UNIT_LIBRARY OFF} 
Platform Unit      {$WARN UNIT_PLATFORM OFF} 
Unsafe type (.NET remnant)   {$WARN UNSAFETYPE OFF} 
Unsafe code (.NET remnant)   {$WARN UNSAFECODE OFF} 
Unsafe typecast (.NET remnant)  {$WARN UNSAFECAST OFF} 

Hai bạn vừa nói tôi không thể tái tạo với D2007 (phiên bản IDE 11 .0.2804.9245), vì vậy tôi nghi ngờ rằng câu trả lời của skamradt là chính xác - đó là vì bạn có các thư mục nguồn VCL trong đường dẫn tìm kiếm của bạn, và bạn không nên. Nó phải được đặt thành $(BDS)\Lib. Nếu bạn cần để có thể bước qua nguồn, hãy sử dụng trang Project->Options->Compiler và chọn tùy chọn Use debug DCUs theo số Debugging thay thế.

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