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