2014-10-21 3 views
-1

동적 객체는 런타임 중에 생성 된 객체라는 것을 알고 있습니다. 나는 프로젝트를 위해 동적 인 객체를 사용해야 만한다. 그러나 무엇을 해야할지 확실히 모른다. 동적 인 오브젝트가 실제로 정의를 제외하고 어떤 것인지 확실하지 않습니다. 예를 들어 버튼을 클릭하면 패널이 만들어 지지만 정확히 원하는 것은 아닙니다. 그것은 더 복잡하고 의미있는 것으로되어 있습니다.델파이의 동적 객체

동적 객체의 다른 예는 무엇이며 언제 어떻게 사용합니까?

+0

"개체"대신 "구성 요소"와 "컨트롤"을 사용하는 것처럼 들립니다. –

+0

이것은 많은 의미가 없습니다. 처음으로 돌아 가자. 무엇을 성취하려고합니까? –

답변

2

코드에서 런타임에 생성 된 클래스의 인스턴스이며 더 이상 필요없는 클래스는 해제됩니다. 시각적 구성 요소가 아니며 양식에 놓을 수없는 클래스의 경우 항상 이런 일이 발생합니다.

기본 예, 스레드가 TThread 일반 목록 등 TList<T>, 그리고 많은 다른 클래스를 사용하여 문자열이나 텍스트 파일, TFileStream 또는 TResourceStream 같은 TStream 후손 작업을위한 TStringList 같은 것들이다.

예를 들어, 다음과 같이 할 수있는 텍스트 파일을 동적으로 생성 된 TStringList의 예를 해결하려면 다음이 클래스 프로젝트 같은 소리

var 
    SL: TStringList; 
begin 
    SL := TStringList.Create; 
    try 
    SL.LoadFromFile('C:\Temp\MyFile.txt'); 
    SL[0] := 'I changed this line.'; 
    SL.SaveToFile('C:\Temp\MyFile.txt'); 
    finally 
    SL.Free; 
    end; 
end; 
+0

'TArray '는 객체가 아니며 실제로는'동적 배열'입니다. 'TList '을 대신 사용하셨습니까? –

+0

@ Rudy : 네가 맞아. 고정. –

+0

와우, 빨리 끝났습니다. –

1

, 당신은 몇 가지를 이해하지 않는 것 관련된 용어.

그냥 조금 일반화하면 델파이에서 정의한 ANY 클래스의 인스턴스를 동적으로 생성해야합니다. 이것은 동적으로 할당 된 것뿐만 아니라 변수로 정적으로 선언 될 수있는 레코드와는 대조적입니다.

인스턴스 (클래스 및 레코드) 모두에서 인스턴스를 동적으로 만들면 해당 인스턴스에 대한 메모리가 스택 (로컬 변수 생성)보다 힙에서 할당됩니다. 그러나 구문은 각 경우마다 다릅니다.

델파이에서는 C++ 클래스가 기본적으로 델파이 레코드와 같은 구조체이기 때문에 C++ 클래스의 인스턴스를 멤버 변수로 선언 할 수 있습니다. 즉, 스택에 메모리가 할당 된 멤버 변수로 선언 할 수 있습니다. 파스칼에서 레코드뿐만 아니라 구조체의 인스턴스를 선언 할 수있는 것과 같은 방법입니다.

그러나 구문이 같아도 델파이에서는 작동하지 않습니다. 왜냐하면 Delphi에서 클래스를 참조하는 변수는 C++에서와 같이 실제로는 포인터이지만 자동으로 참조 해제되기 때문에 마치 인스턴스에 대한 포인터가 아닌 마치 인스턴스 인 것처럼 구문 적으로 보입니다.

델파이에서는 클래스로 작업하는 경우 TMyObj.Create (...)를 호출하여 동적으로 생성해야합니다. 따라서 모든 클래스에는 이와 관련된 생성자가 있습니다. 정의하지 않으면 기본 TObject.Create 생성자가 호출됩니다. (다시 컴파일러가 필요로하는 클래스에 대해 기본 생성자를 만들고 정의되지 않은 C++과 다릅니다.)

나는 이것을 다시 반복하여 명확하게 설명 할 것입니다.델파이에 다음과 같이 정의 아무것도 :

var 
    xyz : Twhatever; // xyz is really a pointer here! It's NOT an "instance" 
begin 
    xyz := Twhatever.Create(); // you need to create an instance using the Create() method 
    try 
    // do some stuff 
    finally 
    xyz.Free; 
    end; 

하는 당신은 XYZ를 사용하지 수 없습니다

type 
    Twhatever = class(TObject) 

절대적으로이 같은 코드에서 동적으로 생성해야합니다

type 
    Twhatever = class 

이 동일하다 먼저 그것을 통해 인스턴스를 생성하지 않고 .Create 메서드를 호출합니다.