Конвертация пользовательского компонента с delphi 5 на delphi 7

Недавно у меня появилась возможность преобразовать код 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;

person DelphiLearner    schedule 04.06.2015    source источник
comment
Вы можете объяснить, почему вы смешиваете AOwner, Owner и FFomrOwner? Откуда владелец? Для чего нужен цикл повтора?   -  person smooty86    schedule 04.06.2015
comment
Designer - это интерфейс типа IDesignerHook. Если он поддерживает IFormDesigner, вы сможете попасть туда с as актерским составом. Фактически, вы должны использовать проверенные приведения, чтобы выявлять значимые ошибки. Попробуйте ((FFormOwner as TForm).Designer) as IFormDesigner. Я не знаю тонкостей этих интерфейсов, но знаю, что использование неконтролируемых приведений делает вас невежественными, когда они идут не так, как надо. Позвольте системе шрифтов помочь вам.   -  person David Heffernan    schedule 04.06.2015
comment
@DavidHeffernan: Спасибо. Рабочий код: (((FFormOwner as TForm).Designer) as IDesigner).GetPrivateDirectory. У меня есть еще один вопрос, который я задал отдельно TypeCasting   -  person DelphiLearner    schedule 04.06.2015


Ответы (1)


Свойство Designer относится к типу IDesignerHook и не может быть жестко приведено к IDesigner. Чтобы иметь хоть какую-то надежду на успех, вам понадобится код такой формы:

(FFormOwner as TForm).Designer as IDesigner

Это выполнит запрос среды выполнения IDesignerHook интерфейса Designer и вернет интерфейс IDesigner, если этот интерфейс действительно поддерживается.

person David Heffernan    schedule 04.06.2015