2014-09-09 19 views
11

Tôi đang cố gắng sửa lỗi another VCL bug; lần này là Vcl.Printers.pas.Vcl.Printers.pas (888): W1025 Tính năng ngôn ngữ không được hỗ trợ: 'thuộc tính tùy chỉnh'

Hiện tại chúng tôi đang thực hiện việc này bằng cách sao chép các tệp nguồn VCL lỗi tới một thư mục khác trong đường dẫn thư viện Delphi và áp dụng các bản sửa lỗi cho các tệp đó. Chúng tôi đã áp dụng bản sửa lỗi cho TPrinter.SetPrinter.

Nhưng có sáu phương pháp trong các tập tin đó được trang trí với các thuộc tính:

[PrintingPermission(SecurityAction.LinkDemand, Level=PrintingPermissionLevel.AllPrinting)] 
procedure TPrinter.Abort; 
begin 
    ... 

 

[PrintingPermission(SecurityAction.LinkDemand, Level=PrintingPermissionLevel.AllPrinting)] 
procedure TPrinter.EndDoc; 
begin 
    ... 

 

[PrintingPermission(SecurityAction.LinkDemand, Level=PrintingPermissionLevel.AllPrinting)] 
procedure TPrinter.NewPage; 
begin 
    ... 

 

[PrintingPermission(SecurityAction.LinkDemand, Level=PrintingPermissionLevel.AllPrinting)] 
{$IF DEFINED(CLR)} 
procedure TPrinter.SetPrinter(ADevice, ADriver, APort: string; ADeviceMode: IntPtr); 
{$ELSE} 
procedure TPrinter.SetPrinter(ADevice, ADriver, APort: PChar; ADeviceMode: THandle); 
{$ENDIF} 
var 
    ... 

 

[PrintingPermission(SecurityAction.LinkDemand, Level=PrintingPermissionLevel.AllPrinting)] 
function SetPrinter(NewPrinter: TPrinter): TPrinter; 
begin 
    ... 

Mỗi phương pháp gây ra một cảnh báo:

  • [Cảnh báo dcc32] Vcl.Printers.pas (968): W1025 tính năng ngôn ngữ được hỗ trợ: 'tùy chỉnh thuộc tính'
  • [dcc32 Cảnh báo] Vcl.Printers.pas (978): W1025 Tính năng ngôn ngữ không được hỗ trợ: 'thuộc tính tùy chỉnh'
  • [Cảnh báo dcc32] Vcl. Printers.pas (1015): W1025 tính năng ngôn ngữ được hỗ trợ: 'tùy chỉnh thuộc tính'
  • [Cảnh báo dcc32] Vcl.Printers.pas (1026): W1025 tính năng ngôn ngữ được hỗ trợ: 'thuộc tính tùy chỉnh'
  • [Cảnh báo dcc32] Vcl. Printers.pas (1080): W1025 tính năng ngôn ngữ được hỗ trợ: 'tùy chỉnh thuộc tính'
  • [Cảnh báo dcc32] Vcl.Printers.pas (1599): W1025 tính năng ngôn ngữ được hỗ trợ: 'tùy chỉnh thuộc tính'

tôi có thể chỉ loại bỏ các thuộc tính. Hoặc có lẽ có một cách để ngăn chặn các cảnh báo. Nhưng tôi cho rằng các thuộc tính được thêm vào bởi Embarcadero có một số mục đích.

  • cách để làm cho ngôn ngữ hỗ trợ tính năng tùy chỉnh các thuộc tính là gì?
  • Tại sao nó không phải là cảnh báo trong nguồn VCL?
  • Tại sao nguồn VCL được phép sử dụng khi tôi không?
  • Các thuộc tính này hoạt động như thế nào?
  • Ai đọc những thông tin này?
  • Có vấn đề với việc xóa chúng không?
  • Nếu không có vấn đề gì với việc xóa chúng, tại sao chúng lại ở đó?

Tôi thực sự hỏi:

Làm thế nào để tôi làm cho nó hoạt động?

Nhưng tôi cũng rất muốn biết:

Tại sao nó không làm việc?

tại sao làm cho nó một câu hỏi nhiều hữu ích hơn, nhưng sửa chữa nó sẽ là tốt.

Bonus nhí

Yes, chúng tôi cuối cùng đã có kế hoạch để suy nghĩ về khả năng điều tra việc sử dụng các detours. Mặc dù có lẽ phương pháp đường vòng vẫn nên có thuộc tính (nếu không thì tại sao thuộc tính tồn tại?)

+1

+1 câu hỏi hay, tôi chưa bao giờ thực sự nghĩ về những cảnh báo này cho đến bây giờ, cảm ơn –

+0

Btw, điều này có nghĩa là chúng tôi đang ở cuối câu hỏi D5 của bạn? !! Nếu vậy, sau đó tôi thấy bản thân mình đáng ngạc nhiên buồn bã .... ;-) –

+0

@DavidHeffernan Bốn tuần vào cố gắng để có được phần mềm để chạy trong XE6. Không đảm bảo rằng chúng tôi sẽ không quay trở lại! –

Trả lời

16

Thông báo lỗi có một chút sai lệch. Tôi sẽ cố gắng dịch cho bạn. Khi trình biên dịch nói:

tính năng ngôn ngữ được hỗ trợ: 'tùy chỉnh thuộc tính'

những gì nó thực sự có nghĩa là:

Không thể tìm thấy một lớp học, có nguồn gốc từ TCustomAttribute, phù hợp với thuộc tính tên bạn đã chỉ định.


Những PrintingPermission thuộc tính, được định nghĩa bởi .NET Framework, có ý nghĩa đối với trình biên dịch .net Delphi. Mà vẫn được sử dụng bởi Embarcadero để xây dựng các phần của IDE. Do đó việc lưu giữ mã điều kiện chuyển sang sự hiện diện của các định nghĩa CLR. Khi đơn vị VCL này được biên dịch bởi trình biên dịch Delphi .net, trình biên dịch có thể thấy lớp khung .net System.Drawing.Printing.PrintingPermissionAttribute.

Có rất ít bạn có thể đạt được bằng cách cố gắng xử lý cảnh báo trong các đơn vị VCL. Nó không phải là mã của bạn, và mục tiêu của bạn khi sửa đổi một đơn vị VCL là để vào và ra càng nhanh càng tốt. Bạn nên đặt mục tiêu thực hiện thay đổi nhỏ nhất có thể.

Vì vậy, hãy bỏ qua các cảnh báo. Ngăn chặn các cảnh báo và gợi ý cho các đơn vị VCL mà bạn sửa đổi. Stuff {$W-} ở đầu bất kỳ đơn vị VCL nào bạn biên dịch và tiếp tục. Hoặc nếu bạn không thể mang đến cho mình một cách hoàn toàn bình thường, bạn có thể sử dụng {$WARN UNSUPPORTED_CONSTRUCT OFF}.


Lấy câu hỏi của bạn lần lượt:

cách để làm cho sự hỗ trợ ngôn ngữ các thuộc tính năng tùy chỉnh là gì?

Đó không phải là giới hạn ngôn ngữ. Chỉ là các thuộc tính này chỉ được xác định khi nhắm mục tiêu .net.

Tại sao nó không phải là cảnh báo trong nguồn VCL?

Ít nhất, khi biên dịch cho một mục tiêu khác với .net.

Tại sao nguồn VCL được phép sử dụng khi tôi không?

Bạn cũng sẽ được phép sử dụng chúng nếu bạn sử dụng trình biên dịch .net.

Các thuộc tính này đang làm gì?

System.Drawing.Printing.PrintingPermissionAttribute

Ai đọc những attribues?

Khuôn khổ .net. Tôi đoán.

Có vấn đề với việc xóa chúng?

Nó sẽ không ảnh hưởng đến đầu ra do trình biên dịch Windows tạo ra. Nó sẽ tăng khối lượng khác biệt trong hệ thống kiểm soát sửa đổi của bạn.

Nếu không có vấn đề gì với việc xóa chúng, tại sao chúng ở đó?

Vì chúng được sử dụng trên .net.

+0

Thật tuyệt khi được tái khẳng định rằng tôi không điên. Nhưng làm thế nào bạn tìm ra điều này? Làm thế nào bạn biết rằng Bo..Code ... Embarcadero biên dịch Delphi với một trình biên dịch .NET? –

+1

Họ đã nói rằng IDE có phụ thuộc vào trình biên dịch .net trong quá khứ. Không thể tìm thấy nó, nhưng nó đã được viết blog về, nhận xét trên diễn đàn. Đối với phần còn lại, tôi chỉ làm việc đó bằng một chút trực giác và một vị trí của Googling cho thuộc tính. –

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