2014-01-12 5 views
2

В моих рамках у меня есть экземпляр DataSource1, который был сброшен во время разработки в форме.
В какой-то момент во время выполнения мне нужно «преобразовать» его в ссылку на другой DataSource2 (на модуле данных).Преобразование экземпляра объекта в ссылку другого экземпляра?

просто устанавливает:

DataSource1 := DataSource2; 

Достаточно, чтобы сделать DataSource1 ссылку на DataSource2? похоже, что DataSource1 не уничтожается на данный момент - он уничтожается, когда Владелец DataSource2 уничтожен, и что на самом деле есть два экземпляра TDataSource.

Или мне нужно явно освободить DataSource1?

DataSource1.Free; 
DataSource1 := DataSource2; 

Каков правильный путь? (Помимо объявления DataSource1 как ссылки в первую очередь)

+1

В первую очередь было бы полезно знать, какова цель этого. Вы делаете это, например? потому что у вас работает некоторый «базовый» набор данных, и после его работы вы заполняете свои данные путем «повторного подключения» источников данных таким образом? Если это так, то я предпочел бы повторно назначить набор данных источника данных. – TLama

+0

@TLama, я вижу, что значит. вопрос не столько связан с дизайном БД. цель немного сложна для объяснения: у нас есть форма базового класса, которая предоставляет централизованный TDataSource своим базовым элементам управления, поддерживающим db. (по умолчанию он постоянный), но иногда он должен ссылаться на другой источник данных. Я знаю, что я могу установить/изменить DataSet в этом постоянном DataSource (и это правильный путь), но мне было просто любопытно понять этот пример. – ZigiZ

ответ

4

Когда вы объявляете переменную типа, которая наследуется от TObject, вы фактически объявляете указатель.

Когда вы вызываете конструктор, вы создаете экземпляр. Конструктор возвращает указатель на этот экземпляр. Как правило, назначить этот указатель на переменную, как это:

Obj1 := TMyClass.Create; 

Вы можете сделать вторую переменную точку, или обратиться, экземпляр с простого присваивания:

Obj2 := Obj1; 

Объект уничтожен путем вызова Бесплатно:

Obj1.Free; 

В данный момент Obj2 относится к объекту, который больше не существует. Мы говорим, что Obj2 является устаревшей ссылкой.

В вашем случае вам нужно освободить первый объект:

+0

Но что происходит, когда постоянный экземпляр DataSource1 ссылается на «DataSource1: = DataSource2'? Это я не совсем понимаю. – ZigiZ

+2

@Zig ​​- То, что вы называете «постоянным DataSource1», является просто переменной поля некоторого модуля данных, указателя. После 'DataSource1: = DataSource2' у вас больше нет ссылки на объект, который был передан левой переменной/указателем. Следовательно, вы должны освободить его, прежде чем потерять ссылку или оставить ее в рамках. –

+1

'DataSource1' не является экземпляром. Это указатель на экземпляр. Когда вы пишете «DataSource1: = ...», вы ничего не делаете с экземпляром, который первоначально упоминался в DataSource1. Вопрос, я полагаю, вы понимаете, как работают указатели? –

Смежные вопросы