【问题标题】:How to change a .dfm property with compiler directives?如何使用编译器指令更改 .dfm 属性?
【发布时间】:2022-01-01 11:54:09
【问题描述】:

是否可以为 Delphi 11 上引入的 .dfm 属性创建编译器指令,例如

  {$IFDEF CompilerVersion > 34.0}
  PixelsPerInch = 96
  {$ENDIF}

所以其他使用 10.4.2 或更低版本的开发人员能够使用相同的单元而不必忽略错误和/或提交没有该属性的表单?

尝试按照上面列出的确切方式进行操作,但无法编译,它会在条件行引发链接器错误。

提前致谢!

【问题讨论】:

  • IFDEF 不起作用,因为编译器根本不查看 DFM。
  • 我经常在 Delphi 11 和更早的版本中打开我的项目,尤其是。我的 Android 项目,我只是“忍受”这些属性被删除和重新添加。 IDE 还要求保存未以任何方式更改的单元。我也忍受着这个。
  • 如果您确实需要您的项目支持多个版本,请考虑让 TForm 覆盖虚拟 DefineProperties() 以为旧版本提供虚拟属性,然后您可以根据需要对该代码进行 IFDEF。
  • 查看文档,问题似乎在于 Delphi 11 中的属性 PixelsPerInch 现在被声明为 Public 而不再是 Published。我猜您可以通过在表单定义中创建Published 部分然后在其中添加property PixelsPerInch 手动将ypur 表单的PixelsPerInch 属性可见性更改为Published 来解决此问题。这应该确保可以在运行时从 DFM 填充所述属性。但我不确定这是否会对设计时的 Delphi 11 产生任何影响。所以它可能仍然会从 DFM 中删除上述属性
  • 在 Embarcadero 质量中心提出这个问题也可能很好,因为将 PixelsPerInch 属性从 Published 更改为 Public 可见性可能不是故意的。

标签: delphi compiler-directives delphi-11-alexandria


【解决方案1】:

一种选择是使用包含在JVCL: JEDI Visual Component Library 中的DFMCleaner

DFMCleaner 是一种从 DFM 中删除不受支持的属性的工具。如果 您将 dfm 文件保存在一个版本的 Delphi 中,并希望在 早期版本,可能有一些不受支持的属性 它,在 Delphi 中打开表单时会产生错误。甚至是什么 更糟糕的是,如果 dfm 是设计时包的一部分,Delphi 将 安装软件包时没有错误,但是当您尝试访问表单时 在设计时(例如,如果表单被属性编辑器使用), Delphi 会生成一个 AV。

JVCL解压后在\jvcl\devtools\DFMCleaner

还有其他此类实用程序可用。如果您担心它会丢失,您可以围绕 OnCreate 中的代码 $IFDEF 以确保在较新的 Delphi 版本中按照您想要的方式设置属性。

【讨论】:

    【解决方案2】:
    TDataModule.PixelsPerInch implementation: 
    First...`enter code here`
    
    Search Find in files.... => "= class(TDataModule)"
    
    
    After... implement each DataModule .pas
    
      private
        { Private declarations }
        FPixelsPerInch: Integer;
        //
        ...
        //
        procedure ReadPixelsPerInch(Reader: TReader);
        procedure WritePixelsPerInch(Writer: TWriter);
        //
        ....
    
    
    
      protected
        procedure DefineProperties(Filer: TFiler); override;
      .... 
    
    
    
      public
        { Public declarations }
        property PixelsPerInch: Integer read FPixelsPerInch write FPixelsPerInch;
        //
        ...
    
    
    
    
    
    
    
    procedure TDm?????.DefineProperties(Filer: TFiler);
    var
      Ancestor: TDataModule;
    begin
      inherited;
      Ancestor := TDataModule(Filer.Ancestor);
      Filer.DefineProperty('PixelsPerInch', ReadPixelsPerInch, WritePixelsPerInch, True);
    end;
    
    procedure TDm?????.ReadPixelsPerInch(Reader: TReader);
    begin
      FPixelsPerInch := Reader.ReadInteger;
    end;
    
    procedure TDm?????.WritePixelsPerInch(Writer: TWriter);
    begin
      Writer.WriteInteger(FPixelsPerInch);
    end;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-11
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多