自定义组件从 delphi 5 转换为 delphi 7
Custom component Convertion from delphi 5 to delphi 7
最近我有机会将 delphi-5
代码转换为 delphi-7
。起初我开始将自定义组件转换为 delphi-7
。在 delphi-7
系统中编译 delphi-5
组件时抛出错误
"Undeclared identifier: IFormDesigner".
谷歌搜索后我才知道 IFormDesigner
应该替换为 IDesigner
。因此,在将 IFormDesigner
替换为 IDesigner
并将设计代码与运行时代码分开后,大部分组件都得到了编译。在编译下面的代码时,它已成功编译。但是当我将组件放在表单系统上时,系统会在
处抛出访问冲突错误
Path:=IDesigner(TForm(FFormOwner).Designer).GetPrivateDirectory in
delphi7.
下面是我的组件代码。
constructor TsampleComponent.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FFormOwner:=TForm(Owner);
if not (Owner is TForm) then
repeat
FFormOwner:=TForm(FFormOwner.Owner);
until (FFormOwner is TForm) or (FFormOwner.Owner=nil);
if (csDesigning in ComponentState) then
//Path:=IFormDesigner(TForm(FFormOwner).Designer).GetPrivateDirectory-- delphi 5 code
Path:=IDesigner(TForm(FFormOwner).Designer).GetPrivateDirectory
else
Path:=ExtractFilePath(Application.EXEName);
.
.
end;
Designer
属性 是 IDesignerHook
类型,不能硬转换为 IDesigner
。要有成功的希望,您需要这种形式的代码:
(FFormOwner as TForm).Designer as IDesigner
这将执行 IDesignerHook
接口 Designer
和 return IDesigner
接口的运行时查询(如果确实支持该接口)。
最近我有机会将 delphi-5
代码转换为 delphi-7
。起初我开始将自定义组件转换为 delphi-7
。在 delphi-7
系统中编译 delphi-5
组件时抛出错误
"Undeclared identifier: IFormDesigner".
谷歌搜索后我才知道 IFormDesigner
应该替换为 IDesigner
。因此,在将 IFormDesigner
替换为 IDesigner
并将设计代码与运行时代码分开后,大部分组件都得到了编译。在编译下面的代码时,它已成功编译。但是当我将组件放在表单系统上时,系统会在
Path:=IDesigner(TForm(FFormOwner).Designer).GetPrivateDirectory in delphi7.
下面是我的组件代码。
constructor TsampleComponent.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FFormOwner:=TForm(Owner);
if not (Owner is TForm) then
repeat
FFormOwner:=TForm(FFormOwner.Owner);
until (FFormOwner is TForm) or (FFormOwner.Owner=nil);
if (csDesigning in ComponentState) then
//Path:=IFormDesigner(TForm(FFormOwner).Designer).GetPrivateDirectory-- delphi 5 code
Path:=IDesigner(TForm(FFormOwner).Designer).GetPrivateDirectory
else
Path:=ExtractFilePath(Application.EXEName);
.
.
end;
Designer
属性 是 IDesignerHook
类型,不能硬转换为 IDesigner
。要有成功的希望,您需要这种形式的代码:
(FFormOwner as TForm).Designer as IDesigner
这将执行 IDesignerHook
接口 Designer
和 return IDesigner
接口的运行时查询(如果确实支持该接口)。