1

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

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

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

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

提前致谢!

4

2 回答 2

1

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

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

JVCL解压后在\jvcl\devtools\DFMCleaner

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

于 2021-11-22T23:37:55.187 回答
0
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;
于 2022-01-30T01:53:56.177 回答