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....)} 이런식으로 들어갈꺼구요..
누구 아시는분 손좀 ~..ㅠ_ㅠ
동적배열과 스트링(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;
^^ 항상 즐코하세요...