본문 바로가기

Delphi/C++Builder

델파이 구조체(record) 사용 팁

구조체(Record) 많이 사용하시죠?

생각보다 구조체를 사용하는 방법이 다양해서 소개하려 합니다.

우선 간단한 샘플
연/월/일 형식으로 데이터 입력 후 한번에 데이터 저장하는 코드입니다. 

type
  TRecordType = (rtData, rtStructure);

  TDateRec = record
    case TRecordType of
    rtData:       (Data: array[0..5] of Byte);
    rtStructure:  (Year, Month, Day: Word);
  end;
위와 같이 구조체가 정의 되어 있습니다.

2가지 타입(rtData, rtStructure)로 사용해 봅니다.
 
| rtStructure - 연월일 형식으로 입력
procedure TForm2.btnAddClick(Sender: TObject);
var
  Rec: TDateRec;
begin
  DecodeDate(dtpDate.Date, Rec.Year, Rec.Month, Rec.Day);

  AddDate(Rec);
end;

| rtData - 데이터 형식으로 저장
procedure TForm2.AddDate(ADate: TDateRec);
var
  FilePath: string;
  FS: TFileStream;
begin
  FilePath := ExtractFilePath(Application.ExeName) + 'test.dat';

  FS := TFileStream.Create(FilePath, IfThen(FileExists(FilePath), fmOpenReadWrite, fmCreate));
  try
    FS.Position := FS.Size;
    FS.Write(ADate.Data, SizeOf(ADate.Data));
  finally
    FS.Free;
  end;
end;

 위의 2가지 코드대로 하나의 구조체를 다양한 방식으로 사용가능합니다.
TRecordType 은 제가 임의로 2개를 정의한 것이므로, 여러개로 나누어 사용하여도 됩니다.
또한, 굳이 위 구조체가 아니어도 아래와 같은 코드로도 사용 가능합니다.

| Messages.pas의 window message record 
  TMessage = packed record
    Msg: Cardinal;
    case Integer of
      0: (
        WParam: WPARAM;
        LParam: LPARAM;
        Result: LRESULT);
      1: (
        WParamLo: Word;
        WParamHi: Word;
        LParamLo: Word;
        LParamHi: Word;
        ResultLo: Word;
        ResultHi: Word);
  end;
끝~