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

Ian*_*oyd 12 delphi delphi-xe6

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

现在我们通过将错误的VCL源文件复制到Delphi库路径中的另一个文件夹,并将修复程序应用于这些文件来实现此目的.我们将修复程序应用于TPrinter.SetPrinter.

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

[PrintingPermission(SecurityAction.LinkDemand, Level=PrintingPermissionLevel.AllPrinting)]
procedure TPrinter.Abort;
begin
   ...
Run Code Online (Sandbox Code Playgroud)

 

[PrintingPermission(SecurityAction.LinkDemand, Level=PrintingPermissionLevel.AllPrinting)]
procedure TPrinter.EndDoc;
begin
   ...
Run Code Online (Sandbox Code Playgroud)

 

[PrintingPermission(SecurityAction.LinkDemand, Level=PrintingPermissionLevel.AllPrinting)]
procedure TPrinter.NewPage;
begin
   ...
Run Code Online (Sandbox Code Playgroud)

 

[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
   ...
Run Code Online (Sandbox Code Playgroud)

 

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

这些方法中的每一种都会引发警告:

  • [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源允许在我不使用时使用它?
  • 这些属性在做什么?
  • 谁读这些属性?
  • 删除它们有问题吗?
  • 如果删除它们没有问题,为什么它们在那里?

我真的在问:

我如何使它工作?

但我也很想知道:

为什么不起作用?

这就是为什么它会成为一个更有用的问题,但修复它会很好.

奖金Chatter

是的,我们最终计划考虑调查绕道使用的可能性.虽然大概是绕道方法应该仍然具有属性(否则为什么属性存在?)

Dav*_*nan 19

错误消息有点误导.我会尽力为你翻译.当编译器说:

不支持的语言功能:'自定义属性'

它的真正含义是:

找不到TCustomAttribute与您指定的属性名称匹配的派生类.


这些PrintingPermission属性由.net框架定义,对Delphi .net编译器有意义.Embarcadero仍然使用它来构建IDE的一部分.因此保留了条件代码,该代码打开了存在的CLR定义.当这个VCL单元由Delphi .net编译器编译时,编译器可以看到.net框架类System.Drawing.Printing.PrintingPermissionAttribute.

试图处理VCL单位的警告几乎没有什么可以获得的.这不是您的代码,修改VCL单元的目标是尽快进出.您应该致力于尽可能做出最小的改变.

所以,忽略警告.抑制您修改的VCL单元的警告和提示.填写{$W-}您编译的任何VCL单位的顶部,然后继续.或者,如果你不能让自己变得如此严苛,你可以使用{$WARN UNSUPPORTED_CONSTRUCT OFF}.


轮流提出问题:

使语言支持功能自定义属性的方法是什么?

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

为什么它不是VCL来源中的警告?

至少在为.net以外的目标进行编译时.

为什么VCL源允许在我不使用时使用它?

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

这些属性在做什么?

System.Drawing.Printing.PrintingPermissionAttribute

谁读这些属性?

.net框架.我猜.

删除它们有问题吗?

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

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

因为它们用于.net.