Delphi:EReadError,消息'Property PageNr不存在'

时间:2010-04-21 11:53:25

标签: delphi

我收到SOMETIMES错误消息:当我尝试运行自己的项目时,EReadError的消息“Property PageNr不存在”。我真的很绝望,因为我什么都没看到原因。恶魔是它有时会出现但经常出现。它涉及我自己的组件TPage。这是声明>

TPage = class(TCustomControl)   //
   private
      FPaperHeight, FPaperWidth:Integer;
      FPaperBrush:TBrush;
      FPaperSize:TPaperSize;
      FPaperOrientation:TPaperOrientation;
      FPDFDocument: TPDFDocument;
      FPageNr:integer;

      procedure PaintBasicLayout;
      procedure PaintInterior;
      procedure SetPapersize(Value: TPapersize);
      procedure SetPaperHeight(Value: Integer);
      procedure SetPaperWidth(Value: Integer);
      procedure SetPaperOrientation(value:TPaperOrientation);
      procedure SetPaperBrush(Value:TBrush);
      procedure SetPageNr(Value:Integer);
   protected
      procedure CreateParams(var Params:TCreateParams); override;
      procedure AdjustClientRect(var Rect: TRect); override;
   public
      constructor Create(AOwner: TComponent);override;
      destructor Destroy;override;
//      function GetChildOwner:TComponent; override;
      procedure DrawControl(X,Y :integer; Dx,Dy:Double; Ctrl:TControl;NewCanvas:TCanvas);
//      procedure GetChildren(Proc:TGetChildProc; Root:TComponent); override;
      procedure Loaded; override;
      procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);  override;
      procedure Paint; override;
      procedure PrintOnCanvas(X,Y:integer; rX,rY:Double; ACanvas:TCanvas);
      procedure PrintOnPDFCanvas(X,Y:integer);
      procedure PrintOnPrinterCanvas(X,Y:integer);
      procedure Resize; override;
      procedure SetPrintKind(APrintKind:TPrintKind; APrintGroupindex:Integer);
   published
      property PageNr:integer read FPageNr write SetPageNr;
      property PaperBrush: TBrush read FPaperBrush  write SetPaperBrush;
      property PaperHeight: integer read FPaperHeight write SetPaperHeight;
      property PaperWidth: integer read FPaperWidth write SetPaperWidth;
      property PaperSize: TPaperSize read FPaperSize write SetPaperSize;
      property PaperOrientation:TPaperOrientation read FPaperOrientation write SetPaperOrientation;
      property PDFDocument:TPDFDocument read FPDFDocument write FPDFDocument;
      property TabOrder;
   end;

我彻底阅读了这里描述的类似主题:

Delphi: EReadError with message 'Property Persistence does Not exist'

但这是我自己的源代码。没有第三方。有趣的是:当我在我的dfm文件(unit1.dfm)中删除PageNr属性时,弹出:EReadError,消息'Property PaperHeight不存在'。当我删除PaperHeight然后它将声明PaperWidth等等...

这是一段dfm文件:

 object pg1: TPage
    Left = 128
    Top = 144
    Width = 798
    Height = 1127
    PageNr = 0
    PaperHeight = 1123
    PaperWidth = 794
    PaperSize = psA4
    PaperOrientation = poPortrait
    TabOrder = 0
    object bscshp4: TBasicShape
      Left = 112
      Top = 64
      Width = 105
      Height = 105
      PrintKind = pkNormal
      PrintGroupIndex = 0
      Zooming = 100
      Transparent = False
      Repeating = False
      PageRepeatOffset = 1
      ShapeStyle = ssVertical
      LinePosition = 2
    end
    object bscshp5: TBasicShape
      Left = 288
      Top = 24
      Width = 105
      Height = 105
      PrintKind = pkNormal
      PrintGroupIndex = 0
      Zooming = 100
      Transparent = False

到底发生了什么???????我从未见过这个。我几次编辑了这个单元......没问题。也许原因超出了这个范围。我觉得自己完全无能为力。

2 个答案:

答案 0 :(得分:1)

您在这里遇到的是类型名称冲突。

在ExtCtrls中有一个名为TPage的类。如果ExtCtrls列在您单元的接口部分的uses子句中,Delphi将“假设”您指的是最后声明的TPage - 它将具有完全不同的属性。

如果要添加一些与TPage对象交互的代码,则类完成将显示ExtCtrls.TPage的方法和属性,而不是TPage。这就是为什么重命名为TBookPage已经解决了这个问题。

在您自己的控件上使用短前缀以避免这种情况(例如使用TLyPage)是一个好习惯。这就是大多数第三方控件使用类似方案的原因。

这可以用作重新实现控件的快捷方式 - 请参阅Deltics Blog entry以获取示例。

答案 1 :(得分:0)

检查硬盘上的.DFM文件的多个副本。当实际链接到您的可执行文件的.DFM不是您在IDE中看到的.DFM时,通常会发生这种情况。

此外,您是否使用运行时包构建?也可能是您的应用程序使用与运行时加载的软件包不同版本的软件包构建的情况。加载.DFM属性的错误可能来自包中寻找不在应用程序中的内容(或者更可能,反之亦然 - 应用程序期望在从中加载.DFM时包中不存在的内容)。 / p>