Q&A

  • 가변데이타 기법으로 class와 record로 저장하던중문제
type
TAData = record
a : array of string
b : array of widestring
end;

type
TBData = class(Tcomponent)
   private
      strA : String
      strB :
            .
            .
      aData : TAData
   published
            ....
end;



이런식으로
한클래스안에 동적배열을 가진 레코드를 넣어서
가변데이타 기법으로 화일을 저장하려고 합니다.

    for i := ComponentCount-1 downto 0 do
    begin
      if Components[i] is TBData then
      begin
        tmpStream.WriteComponent( Components[i] );
        Components[i].Free;
      end;
    end;

그랬더니 값은 들어가지는데 화일로는 저장이 되질않더군요
혹시 포인터값으로만 연결된 관계인가요?

하루종일 이것만 붙잡고 있군요.. 꾸벅꾸벅 졸면서.. --;;;
어떻게 해결하면 좋을까요?

클래스안에 클래스를 넣어야하는건지..
클래스를 record처럼 array of string 하면 에러가 나서..--;

데이타 구조는 {a,b,c,(1,2,3....)} 이런식으로 들어갈꺼구요..
누구 아시는분 손좀 ~..ㅠ_ㅠ
1  COMMENTS
  • Profile
    최용일 2002.12.21 04:55
    안녕하세요. 최용일입니다.

    동적배열과 스트링(Ansi String, Wide String), 포인터, 객체를 포함하는 레코드형은 파일로 저장할수 없습니다. 왜냐하면 이것들은 파일로 저장할때 참조하는 데이터의 크기를 알 수가 없기때문입니다. 이들 자료형의 크기는 모두 4바이트이지만 실질적으로 가리키는 내용들의 크기는 천차만별이죠...

    String, WideString형 대신에 ShortString이나 널종료문자열을 사용하세요...
    배열은 그 크기를 명시해주시구요...

    이런 방식이 싫으시다면 레코드를 통째로 저장하시지 마시고 레코드의 필드들을 각각 저장하세요...

    아참 컴포넌트의 데이터를 저장하는 거였네요... 쩝~

    컴포넌트의 필드들은 그냥 선언만 한다고 저장되고, 불러오고 할수없습니다. 내부적으로 따로 처리를 해주어야 합니다. 새로 만든 속성들도 published가 아니면 역시 마찬가지입니다... published절에 있는 속성들만이 자동으로 스트림화되어집니다...

    아래 세가지 메소드를 오버라이드해서 이 메소드내에서 컴포넌트의 속성이나 값들을 억세스할 수 있도록 만들어 주셔야합니다...

        procedure DefineProperties(Filer: TFiler); virtual;
        procedure ReadState(Reader: TReader); virtual;
        procedure WriteState(Writer: TWriter); virtual;

    ^^ 항상 즐코하세요...