본문 바로가기
Delphi Tip/+Tip

가변 데이터의 저장 기법

by MonoSoft 2023. 7. 10.
728x90
반응형

가변 데이터의 저장 기법

 

728x90

 





 

혹시 이런 경우에 어떻게 하시나요?

우선 스트링을 10개를 저장해야 합니다.

물론 하나의 파일에 말이죠.

당연히 10개의 스트링의 길이는 가변이겠죠?

자.. 어떻게 하면 가변의 스트링을 파일에 저장하고 고스란히 불러올수 있을까요?

또 한가지 조건을 덧붙인다면 스트링의 갯수의 제한을 두지 않는다면... ^^.

어떻게든 방법이 있겠죠?

어떤방법을 동원하든지 해결을 할수 있겠지만 새로운 방법을 소개합니다.

아주 손쉽게 가변길이의 데이터를 저장하고 불러올수 있는 방법입니다.

첫번째 방법 1 ​

 

컴포넌트를 저장하고 불러오는 기능을 약간 변형하는 것입니다.

즉 우리가 저장하려는 가변의 스트링을 컴포넌트의 프로퍼티로 놓게되면

컴포넌트를 저장할때 데이터도 함께 저장하게 됩니다.

 

물론 컴포넌트를 불러올때도 우리의 데이터는 깔끔하게 로딩이 되구요.

그럼 먼저 컴포넌트의 저장 및 불러오기에 대해서 알아봅시다.

우선 'TFileStream'이라고 입력하고 헬프를 봅시다.

메소드를 잘 살펴보면 ReadComponent와 WriteComponent를 발견할 수 있죠..

말그대로 컴포넌트를 불러오고 저장하는 기능을 하는 함수입니다.

 

 

여기서 재미있는 것은 ReadComponent는 컴포넌트를 읽어서 생성까지 시켜준다는 것이죠

물론 컴포넌트의 크기는 가변일수 있지만, ​

이녀석이 알아서 저장한 컴포넌트의 갯수만큼 불러준다는 것이죠.

여기서 델파이(VCL)의 강력함을 또 한번 느끼게 됩니다.

그 밖의 자세한 내용은 헬프를 참조하시는 것이 좋을듯 합니다.

저도 사실 어설프게 밖에 모르거든요..

 

그럼 실전에 들어가 봅시다.

우선 우리의 목적인 가변의 데이터를 담을수 있는 그릇을 만들어야죠?

 

TMyData = class( TComponent )

private

  fStr : String;

  published property Str : string read fStr write fStr;

end;

아주 간단한 컴포넌트입니다.

그저 외부로 나와있는 프로퍼티로서 'Str'이라는 녀석이 있구

이 녀석의 실제 내용을 담고 있는 'FStr'을 private로 가지고 있죠.

 

이해가 되시죠?

그럼 이녀석을 어케 사용하는지를 봅시다.

 

procedure TForm1.NewBtnClick(Sender: TObject);

var

  temp : TMyData;

begin

  randomize; ​

  temp := TMyData.Create(Self);

  temp.str := 'MyCount' + IntToStr(random(100000000)); ​

  ListBox1.Items.Add( temp.Str );

end;

​보통의 컴포와 같이 생성을 합니다.

단한가지 주의할 점은 컴포를 생성한후에 해제를 하지 않아야 한다는 점이죠

당연하겠죠?

 

폼의 컴포넌트로서 살아있어야 하니깐.

'random'은 가변폭의 스트링을 만들기 위해서 이용했습니다.

 

그 다음은 저장을 해보죠 ​

 

procedure TForm1.SaveBtnClick(Sender: TObject);

var

  i : integer; s : TFileStream;

begin

  s := TFileStream.Create( 'MyData.dat', fmOpenWrite or fmCreate );

 

  try

    for i := ComponentCount-1 downto 0 do

    begin

      if Components[i] is TMyData then

      begin

      S.WriteComponent( Components[i] );

      Components[i].Free;

      end;

    end;

  finally

    s.Free;

  end;

  ListBox1.Items.Clear;

end;

우선 TFileStream을 생성 이름은 마음대로 for문을 돌릴때

주의할 점은 for문안에서 컴포의 삭제까지 해야 하므로

downto를 쓰셔야 한다는 것입니다 ​

 

한번만 생각해 보시면 아시겠죠?

폼위에 생성된 컴포넌트를 모두 뒤져서 우리가 만든

TMyData형의 컴포넌트가 있는지를 살펴봅니다.

 

Components[i]가 우리가 만든 TMyData형의 컴포라면

파일에다 저장을 하고 컴포를 없애버립니다.

 

그다음은 저장한 컴포를 불러와야죠?

procedure TForm1.LoadBtnClick(Sender: TObject);

var

  s : TFileStream;

  temp : TMyData;

begin

  s := TFileStream.Create( 'MyData.dat', fmOpenWrite or fmCreate );

  try

    while s.Position < s.Size do

    begin

      temp := TMyData( S.ReadComponent( nil ) );

      InsertComponent( temp );

      ListBox1.Items.Add( temp.Str );

    end;

  finally

    s.Free;

  end;

end;

아까와 같은 이름으로 파일은 오픈하고

파일의 끝까지 돌립시다.

 

우리가 저장한 컴포는 모두 TMyData형이므로

형검사가 필요없이 바로 TMyData에다가 넣어줍니다.

 

이때 주시해야 할 점은 우리는

새로운 컴포를 Create하지 않았다는 점입니다.

 

ReadComponent가 알아서 불러오고 컴포의 생성까지 해준다는 것이죠

이렇게 불러온 컴포를 'InsertComponent'로서 폼에 등록을 합니다.

 

ListBox1에 불러온 컴포의 데이터가 표시 될겁니다.

어때요?

상당히 간단하게 가변의 데이터의 저장및 불러오기가 구현되었죠?

만약 이걸 직접 코딩해야 한다면 우.. 머리가 한웅큼은 빠져야.

 

참 마지막으로 중요한 점 하나를 빼먹었군요

프로그램이 런타임시에 참조할 클래스의 목록을 지정해 주어야 합니다.

initialization RegisterClasses( [TMyData] ); ​

 

유닛의 초기화 루틴에 우리가 만든 TMyData라는 타입을 등록해 주어야

컴포넌트를 저장하고 불러올수가 있게 된답니다.

 

 

자 이제 끝났군요..

확인은 해보지 못했지만 프로퍼티에 지정된 데이터는 모두 저장이 가능하다는 군요..

 

가령 TBitmap이라든지, TStringList라든지..

저장하기를 원하는 데이터를 프로퍼티로 빼 놓으면

나머지는 델파이가 알아서 저장하고 불러오기를 해준답니다.

 

 

첫번째 방법 2 ​

 

델파이에서 가변 데이터를 저장하는 방법으로 동적 배열을 사용할 수 있습니다.

 

동적 배열은 크기가 동적으로 조정될 수 있는 배열입니다.

이를 통해 가변 데이터를 저장하고 필요에 따라 크기를 조절할 수 있습니다.

 

다음은 동적 배열을 사용하여 가변 데이터를 저장하는 예제입니다:

 

program DynamicArrayExample; ​

 

type

  TDynamicArray = array of Integer; // 정수형 동적 배열 선언 ​

 

var

MyArray: TDynamicArray; i: Integer; ​

begin

// 동적 배열에 데이터 추가 SetLength(MyArray, 3);

// 배열 크기 설정

MyArray[0] := 10;

MyArray[1] := 20;

MyArray[2] := 30; ​

// 배열의 크기 출력

Writeln('Array size:', Length(MyArray)); ​

// 배열의 내용 출력

for i := 0 to Length(MyArray) - 1 do

Writeln('Element', i, ':', MyArray[i]); ​

// 배열 크기 변경 SetLength(MyArray, 5);

// 배열 크기 확장

MyArray[3] := 40;

MyArray[4] := 50; ​

// 변경된 배열의 크기와 내용 출력

Writeln('Updated array size:', Length(MyArray));

for i := 0 to Length(MyArray) - 1 do

Writeln('Updated element', i, ':', MyArray[i]); ​

// 동적 배열 해제 SetLength(MyArray, 0);

end.

이 예제에서는 TDynamicArray라는 정수형 동적 배열을 선언합니다.

SetLength 함수를 사용하여 배열의 크기를 설정하고,

해당 인덱스에 값을 할당하여 데이터를 저장합니다.

 

배열의 크기 및 내용을 출력하는 방법도 포함되어 있습니다.

SetLength 함수를 사용하여 배열의 크기를 조정하여

동적으로 데이터를 추가하거나 제거할 수도 있습니다.

 

위 예제를 실행하면 배열의 크기와 내용이 출력되며,

배열의 크기를 변경한 후 변경된 크기와 내용도 출력됩니다.

마지막으로, 동적 배열을 해제하기 위해 SetLength(MyArray, 0)을 사용합니다.

 

이를 참고하여 델파이에서 가변 데이터를 저장하는 방법을 구현할 수 있습니다.

 

 

728x90
반응형

'Delphi Tip > +Tip' 카테고리의 다른 글

Drag and Drop(끌어서 놓기)  (0) 2023.07.26
델파이 암호화  (0) 2023.07.13
컨트롤의 Enter 처리  (0) 2023.07.04
프로그램 종료 막기  (0) 2023.06.29
메모 프린터 기타  (0) 2022.06.29

댓글