Недавно у меня появилась возможность преобразовать код delphi-5
в delphi-7
. Сначала я начал преобразовывать пользовательские компоненты в delphi-7
. При компиляции delphi-5
компонентов в delphi-7
системе возникает ошибка с указанием
«Необъявленный идентификатор: IFormDesigner».
После поиска в Google я узнал, что IFormDesigner
следует заменить на IDesigner
. Таким образом, после замены IFormDesigner
на IDesigner
и отделения кода проекта от кода времени выполнения большинство компонентов было скомпилировано. При компиляции приведенного ниже фрагмента кода он успешно компилируется. но когда я помещаю компонент в форму, система выдает ошибку нарушения доступа в
Путь: = IDesigner (TForm (FFormOwner) .Designer) .GetPrivateDirectory в 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
. Если он поддерживаетIFormDesigner
, вы сможете попасть туда сas
актерским составом. Фактически, вы должны использовать проверенные приведения, чтобы выявлять значимые ошибки. Попробуйте((FFormOwner as TForm).Designer) as IFormDesigner
. Я не знаю тонкостей этих интерфейсов, но знаю, что использование неконтролируемых приведений делает вас невежественными, когда они идут не так, как надо. Позвольте системе шрифтов помочь вам. - person David Heffernan   schedule 04.06.2015(((FFormOwner as TForm).Designer) as IDesigner).GetPrivateDirectory
. У меня есть еще один вопрос, который я задал отдельно TypeCasting а> - person DelphiLearner   schedule 04.06.2015