Vcl.Printers.pas(888):W1025不支持的语言功能:“自定义属性”

问题描述 投票:0回答:1

我正在尝试修复另一个 VCL 错误;这次在

Vcl.Printers.pas

目前,我们通过将有问题的 VCL 源文件复制到 Delphi 库路径中的另一个文件夹,并对这些文件应用修复来实现此目的。我们对

TPrinter.SetPrinter
应用了修复。

但是文件中有六个方法是用属性修饰的:

[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
   ...

这些方法中的每一种都会导致警告:

  • [dcc32 警告] Vcl.Printers.pas(968): W1025 不支持的语言功能:“自定义属性”
  • [dcc32 警告] Vcl.Printers.pas(978): W1025 不支持的语言功能:“自定义属性”
  • [dcc32 警告] Vcl.Printers.pas(1015): W1025 不支持的语言功能:“自定义属性”
  • [dcc32 警告] Vcl.Printers.pas(1026): W1025 不支持的语言功能:“自定义属性”
  • [dcc32 警告] Vcl.Printers.pas(1080): W1025 不支持的语言功能:“自定义属性”
  • [dcc32 警告] Vcl.Printers.pas(1599): W1025 不支持的语言功能:“自定义属性”

我可以删除这些属性。或者大概有一种方法可以抑制警告。但我认为 Embarcadero 添加的属性有一定的用途。

  • 如何让语言支持特性自定义属性
  • 为什么VCL源代码中没有警告?
  • 为什么 VCL 源代码可以使用而我却不允许?
  • 这些属性有什么作用?
  • 谁会阅读这些属性?
  • 删除它们有问题吗?
  • 如果删除它们没有问题,为什么它们还在那里?

我真的想问:

我该如何让它发挥作用?

但我也很想知道:

为什么不起作用?

“为什么”使它成为一个更有用的问题,但“修复它”会很好。 奖金喋喋不休

是的

,我们最终计划考虑调查使用

detours

的可能性。虽然大概绕道方法应该仍然具有该属性(否则为什么该属性会存在?) 错误消息有点误导。我会尽力为您翻译。当编译器说:

delphi delphi-xe6
1个回答
20
投票
不支持的语言功能:“自定义属性”

它的真正含义是:

找不到派生自

TCustomAttribute

且与您指定的属性名称匹配的类。


这些

PrintingPermission
属性由 .net 框架定义,对于 Delphi .net 编译器有意义。 Embarcadero 仍然使用它来构建 IDE 的某些部分。因此,保留了条件代码,该代码会打开
CLR

定义的存在。当这个VCL单元被Delphi .net编译器编译时,编译器可以看到.net框架类

System.Drawing.Printing.PrintingPermissionAttribute


尝试处理 VCL 单元中的警告不会有什么收获。这不是您的代码,您修改 VCL 单元时的目标是尽快进入和退出。您应该致力于做出尽可能最小的改变。 
因此,请忽略警告。抑制您修改的 VCL 单元的警告和提示。在您编译的任何 VCL 单元的顶部添加

{$W-}

,然后继续。或者,如果您无法让自己变得如此严厉,您可以使用

{$WARN UNSUPPORTED_CONSTRUCT OFF}


依次回答您的问题:


如何让语言支持特性自定义属性?

这不是语言限制。只是这些属性仅在针对 .net 时定义。

为什么VCL源代码中没有警告?

是的,至少在针对 .net 以外的目标进行编译时是这样。

为什么 VCL 源代码可以使用而我却不允许?

如果您使用 .net 编译器,您也可以使用它们。

这些属性有什么作用?

System.Drawing.Printing.PrintingPermissionAttribute

  
谁会阅读这些属性?

.net 框架。我猜。

删除它们有问题吗?

它不会影响Windows编译器产生的输出。它会增加版本控制系统中的差异量。

如果删除它们没有问题,为什么它们还在那里?

因为它们是在.net上使用的。

© www.soinside.com 2019 - 2024. All rights reserved.