Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Создание сложных компонентов

302
12 июля 2004 года
Sagittarius
648 / / 12.04.2003
Кто занимался созданием сложных компонентов Delphi, может подскажите.
Есть у меня класс, допустим, Class1, и есть еще один класс, например, Class2. Причем Class2 объявлен, как published свойство в Class1. При это Class2 имеет несколько своих published свойств. Сделано это для удобства.
Так вот, о чем я... Все создается вроде, в инспекторе объектов редактируется и все такое, но когда дело доходит до сохранения или компиляции, вылетает Access violation в ide60.rtl
В чем беда, никак не могу понять
1.9K
12 июля 2004 года
AviDen
91 / / 26.12.2003
Ууу, батенька, как все запущено.....

Ты бы для начала посмотрел в исходниках VCL, как там это реализовано. Типичный пример - свойство Font.

Глюк происходит скорее всего потому, что у тебя свойство объявлено типа такого:

 
Код:
Type
  TClass1 = class
  End;

  TClass2 = class
  Private
    FObj: TClass1;
  Published
    Property Obj: TClass1 Read FObj Write FObj;
  End;


что есть совершенно неправильно, т.к. объект, предствленный в свойстве Obj может (и будет) разрушен/утерян при присвоении значения свойству.

Привильно вот так:
Код:
Type
  TClass1 = class(TPersistent)
  End;

  TClass2 = class(TPersistent)
  Private
    FObj: TClass1;
    Procedure SetObj(Const Value: TClass1);
  Public
    Constructor Create;
    Destructor Destroy; Override;
  Published
    Property Obj: TClass1 Read FObj Write SetObj;
  End;

Constructor TClass2.Create;
Begin
  FObj:= TClass2.Create;
End;

Destructor TClass2.Destroy; Override;
Begin
  FObj.Destroy;
  Inherited;
End;

Procedure TClass2.SetObj(Const Value: TClass1);
Begin
  FObj.Assign(Value);
End;


При этом TClass1 должен корректно поддерживать метод Assign (если ты знаешь, для чего он служит).
302
13 июля 2004 года
Sagittarius
648 / / 12.04.2003
Спасибо за ответ, я уже разобрался, поковырявшись, по вашему меткому замечанию, в VCL. Одна из проблем, и в самом деле, была в необходимости реализации метода Assign. Вторая проблема крылась в повторном удалении уже удаленного объекта. После того как я перенес деструктивные действия из метода Free в деструктор Destroy, все стало чики-пыки.
Всякое бывает. Кто не ошибается в этой жизни? :) Как говорится, на ошибках учатся.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог