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)
这些方法中的每一种都会引发警告:
我可以删除属性.或者可能有一种方法可以抑制警告.但我认为Embarcadero增加的属性有一些目的.
我真的在问:
我如何使它工作?
但我也很想知道:
为什么不起作用?
这就是为什么它会成为一个更有用的问题,但修复它会很好.
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.