Q&A

  • 정말 우끼는 경우 입니다..꼭좀 해답좀 해주세여....
음..몇가지 고민에 처했습니다..

Tlist에 관한 질문인데요...



type TAA = TMyClass

private

private

FPosX : integer;

FPosY : integer;

FBlend : Boolean;

FColorKeyUse : Boolean;

protected

public

constructor Create(); virtual;

destructor Destroy; override;

published

property PosX : integer read FPosX write FPosX;

property PosY : integer read FPosY write FPosY;

property AlphaBlend : Boolean read FBlend write FBlend;

property ColorKeyUse : Boolean read FColorKeyUse write FColorKeyUse;

end;

var

List : TList;

AA : TAA;



이런 식으로 전역 클레스를 만들었습니다..

제가 할려고 하는 작업은 이 클래스를 Tlist에 넣고 어떠한 작업을 해야 합니다.

근데 List.Add(AA) 하는 과정에서 몇가지 의문이 있습니다..



procedure AA;

var BB : TAA

begin

BB := TAA.Create;

BB.PosX := 100;

BB.PosX := 100;

BB.AlphaBlend := False;

BB.ColorKeyUse:= True;



List.Add(BB);

// BB.FREE;

end;

위 부분에서 List.Add(BB); 하면 지역으로 선언된 BB가 List에 추가 되겠죠..

그래서 BB.FREE;를 호출했죠..그랬더니 에러가 나는 겁니다.

어짜피 프로시져가 끝나면 이 지역 클래스는 소멸 된다구 생각 해서 리스트에 추가 한후

소멸 시켰는데..에러가 나는 겁니다..



왜그럴까여..?

한가지 더 예주고 싶은것은

AA : TFrom1;



AA := TFrom1.Create;

AA := TFrom1.Create;라는 식에 문장을 여러번 호출해두 에라가 안나자나여?

왜그런지두 알구 싶구여..만약 이게 당연 하다면..AA를 가지고 처음 생성된 TFrom1의 클래스와 두번째 생성된 TFrom1의 클래스를 제어 하는 법을 알고 싶네여..





3  COMMENTS
  • Profile
    코피 2001.02.23 02:21
    김진호 wrote:

    > 음..몇가지 고민에 처했습니다..

    > Tlist에 관한 질문인데요...

    >

    > type TAA = TMyClass

    > private

    > private

    > FPosX : integer;

    > FPosY : integer;

    > FBlend : Boolean;

    > FColorKeyUse : Boolean;

    > protected

    > public

    > constructor Create(); virtual;

    > destructor Destroy; override;

    > published

    > property PosX : integer read FPosX write FPosX;

    > property PosY : integer read FPosY write FPosY;

    > property AlphaBlend : Boolean read FBlend write FBlend;

    > property ColorKeyUse : Boolean read FColorKeyUse write FColorKeyUse;

    > end;

    > var

    > List : TList;

    > AA : TAA;

    >

    > 이런 식으로 전역 클레스를 만들었습니다..

    > 제가 할려고 하는 작업은 이 클래스를 Tlist에 넣고 어떠한 작업을 해야 합니다.

    > 근데 List.Add(AA) 하는 과정에서 몇가지 의문이 있습니다..

    >

    > procedure AA;

    > var BB : TAA

    > begin

    > BB := TAA.Create;

    > BB.PosX := 100;

    > BB.PosX := 100;

    > BB.AlphaBlend := False;

    > BB.ColorKeyUse:= True;

    >

    > List.Add(BB);

    > // BB.FREE;



    이부분에서 해깔려 하시는군요 Object가 Create가 되면 메모리에 상주하게 됩니다.

    TList.Add 멤버 함수에서는 BB의 포인터만 받아가는것이구요.

    인스턴스니 머니하는거는 생각지 마시구 포인터 변수에 대입핼때는 OBject가 메모리에 상주하는 첫 포인터로 상징이된다고 생각하세요 List에 입력한다고 해서 List에서 새로운 Object를 생성해서 받는게 아니라. 메모리에 상주한 첫위치의 포인터만 받아갈뿐입니다. 그러니 BB를 Free하면 List에 너은 BB도 해제가 되는것이지요 BB를 Free를 할때는 언제냐하믄 List에서 Item을 삭제 할때 해줍니다.

    TObject(List.Item[0]).Free;

    List.Delete(0);

    위와 같이요. 모두 다 삭제할경우는 하나하나 다 해줘야겠죠



    > end;



    > 위 부분에서 List.Add(BB); 하면 지역으로 선언된 BB가 List에 추가 되겠죠..

    > 그래서 BB.FREE;를 호출했죠..그랬더니 에러가 나는 겁니다.

    > 어짜피 프로시져가 끝나면 이 지역 클래스는 소멸 된다구 생각 해서 리스트에 추가 한후

    > 소멸 시켰는데..에러가 나는 겁니다..

    >

    > 왜그럴까여..?

    > 한가지 더 예주고 싶은것은

    > AA : TFrom1;

    >

    > AA := TFrom1.Create;

    > AA := TFrom1.Create;라는 식에 문장을 여러번 호출해두 에라가 안나자나여?

    이런경우는 물론 에러가 날일이 없습니다. 처음에 TFrom1클레스를 생성(메모리상주)

    하고 난다음 두번째 다시 생성하(다른위치에 상주 하더라도 문제가 안됩니다.

    단지 먼저 할당한 TForm1의 포인터를 잃어

    버리는 결과를 가지지요 메모리상에서는 노딩되어 있는 상태이구요

    그러니 먼저 할당한 TForm1 Object를 Free를 해줄수 없다는결과를 초래합니다.



    > 왜그런지두 알구 싶구여..만약 이게 당연 하다면..AA를 가지고 처음 생성된 TFrom1의 클래스와 두번째 생성된 TFrom1의 클래스를 제어 하는 법을 알고 싶네여..

    >

    >

  • Profile
    고드름 2001.02.22 23:03
    안녕하세요?

    고드름 김정입니다.



    님께서는 객체의 인스턴스와 객체의 포인터를 헷갈리고 계십니다.



    TList 의 경우,

    객체의 인스턴스를 만들어 놓고 객체의 포인터만 List에서 관리합니다.

    따라서 객체가 소멸되면 TList에 있는 포인터는 의미없는 값입니다.



    새 인스턴스를 만들고 로컬 변수로 받았다가 TList 에 넣고 함수가 끝나면,

    TList 의 포인터로만 참조가 가능합니다.



    TForm 객체를 생성하는 경우도 마찬가지 입니다.

    AA 라는 변수는 한 개이지만, TForm 의 인스턴스를 계속해서 만들어도

    에러는 발생하지 않습니다. 실제로 AA 에 새로운 인스턴스만 할당될 뿐,

    바로 직전에 사용하던 인스턴스는 메모리에 남게 됩니다.



    이런 경우 AA가 로컬 변수라면 이전의 인스턴스는 참조할 방법이 없습니다.

    이런 경우에 위의 TList 예가 필요한 겁니다.



    객체를 만들고 참조하기 위한 방법에 대해 생각해보세요. ^^;



    참고하세요.

    그럼.

  • Profile
    김진호 2001.02.23 00:52
    고드름 wrote:

    > 안녕하세요?

    > 고드름 김정입니다.

    >

    > 님께서는 객체의 인스턴스와 객체의 포인터를 헷갈리고 계십니다.

    >

    > TList 의 경우,

    > 객체의 인스턴스를 만들어 놓고 객체의 포인터만 List에서 관리합니다.

    > 따라서 객체가 소멸되면 TList에 있는 포인터는 의미없는 값입니다.

    >

    > 새 인스턴스를 만들고 로컬 변수로 받았다가 TList 에 넣고 함수가 끝나면,

    > TList 의 포인터로만 참조가 가능합니다.

    >

    > TForm 객체를 생성하는 경우도 마찬가지 입니다.

    > AA 라는 변수는 한 개이지만, TForm 의 인스턴스를 계속해서 만들어도

    > 에러는 발생하지 않습니다. 실제로 AA 에 새로운 인스턴스만 할당될 뿐,

    > 바로 직전에 사용하던 인스턴스는 메모리에 남게 됩니다.

    >

    > 이런 경우 AA가 로컬 변수라면 이전의 인스턴스는 참조할 방법이 없습니다.

    > 이런 경우에 위의 TList 예가 필요한 겁니다.

    >

    > 객체를 만들고 참조하기 위한 방법에 대해 생각해보세요. ^^;

    >

    > 참고하세요.

    > 그럼.



    네...그렇군요..

    지역이든 아님 전역이든 객체는 해제하지 않으면 결국 메모리에 그대로 할당되어

    남아 있단 말씀과 같은 뜻인가여? 제가 잘못 생각 한건가여?



    답변 감사 합니다.