2014-01-12 3 views
2

내 프레임 워크에서 양식의 디자인 타임에 삭제 된 DataSource1 인스턴스가 있습니다.
런타임 중 일부 시점에서 다른 DataSource2 (데이터 모듈)에 대한 참조로 "변환"해야합니다.다른 인스턴스의 참조로 개체 인스턴스 변환 중?

간단하게 설정되어 :

DataSource1에게 DataSource2의 참조를 할 수있을 정도로 충분한
DataSource1 := DataSource2; 

? 이 시점에서 DataSource1이 파괴되지 않는 것처럼 보입니다. DataSource2의 소유자가 파손되면 파기됩니다. 실제로 TDataSource의 인스턴스가 두 개 있습니다.

먼저 DataSource1을 먼저 명시 적으로 해제해야합니까?

DataSource1.Free; 
DataSource1 := DataSource2; 

올바른 방법은 무엇입니까? (처음에 DataSource1을 참조하는 것 외에)

+1

처음에는이 개체의 목적을 파악하는 것이 유용 할 수 있습니다. 예를 들어이 작업을하고 있습니까? 일부 "백그라운드"데이터 세트가 작동하고 작업이 완료된 후 데이터 소스를 이렇게 "다시 연결"하여 데이터를 채우고 있기 때문에? 그렇다면 데이터 소스의 데이터 세트를 다시 할당하는 것이 좋습니다. – TLama

+0

@tlama, 무슨 뜻인지 알 겠어. 문제는 DB 디자인과 관련이 없습니다. 그 목적은 설명하기가 약간 복잡합니다. 중앙 집중식 TDataSource를 기본 db-aware 컨트롤에 노출시키는 기본 클래스 형식이 있습니다. (기본적으로 지속성이 있지만) 다른 데이터 소스를 참조해야하는 경우가 있습니다. 그 영구적 인 DataSource에서 DataSet을 설정/변경할 수 있다는 것을 알았지 만 올바른 방법입니다.하지만 그 인스턴스를 참조하는 것을 알고 싶습니다. – 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'이 참조한 인스턴스에 아무 것도하지 않습니다. 질문은 포인터가 작동하는 방식을 이해합니까? –

관련 문제