공통 [팁] TIniFile과 TMemIniFile 사용

2019.12.04 09:45

험프리 조회 수:1473

Ini 파일 형식은 손쉽게 구성 정보를 기록할 수 있는 포맷으로 많은 곳에서 사용되고 있습니다. Ini 파일 형식은 파일을 이용해 정보를 저장해 플랫폼 종속적이지 않게 구성 정보를 관리할 수 있습니다.

 

Ini 파일은 윈도우는 물론 안드로이드, iOS, macOS, 리눅스에서도 사용할 수 있습니다.

 

RTL(RunTime Library)에서는 ini 파일 읽기와 쓰기를 간단히 할 수 있는 TIniFile과 TIniMemFile이 준비되어 있습니다.

 

TIniFile은 디스크 상의 Ini 파일을 매번 읽고 쓰지만, TMemIniFile은 생성 시 정보를 읽고, 버퍼(메모리)에 정보를 기록하는 차이가 있습니다.

 

TIniFile과 TMemIniFile은 개체 생성 시 생성자의 파라메터로 파일 경로를 전달합니다. 이 파일이 존재하지 않으면 자동으로 파일을 생성합니다.

이후 ReadString, ReadInteger, ReadDate, ReadBool 등의 다양한 메소드로 구성 정보를 읽습니다. 또는 ReadSection 메소드를 사용 섹션의 전체 정보를 읽을 수 있습니다. 마찬가지로 WriteString, WriteInteger, WriteDate, WriteBool 등의 메소드로 구성정보를 기록합니다.

 

다음 예제에서는 Ini 파일을 이용, 종료시 폼 위치를 폼 생성시 지정하는 내용을 구현할 수 있습니다.

 

Delphi:

 
 procedure TForm1.FormCreate(Sender: TObject);
 var
   Ini: TIniFile;
 begin
   Ini := TIniFile.Create( ChangeFileExt( Application.ExeName, '.INI' ) );
   try
     Top     := Ini.ReadInteger( 'Form', 'Top', 100 );
     Left    := Ini.ReadInteger( 'Form', 'Left', 100 );
     Caption := Ini.ReadString( 'Form', 'Caption', 'New Form' );
     if Ini.ReadBool( 'Form', 'InitMax', false ) then
       WindowState := wsMaximized
     else
       WindowState := wsNormal;
   finally
     Ini.Free;
   end;
 end;
 
 procedure TForm1.FormClose(Sender: TObject; var Action TCloseAction)
 var
   Ini: TIniFile;
 begin
   Ini := TIniFile.Create( ChangeFileExt( Application.ExeName, '.INI' ) );
   try
     Ini.WriteInteger( 'Form', 'Top', Top);
     Ini.WriteInteger( 'Form', 'Left', Left);
     Ini.WriteString( 'Form', 'Caption', Caption );
     Ini.WriteBool( 'Form', 'InitMax', WindowState = wsMaximized );
   finally
     Ini.Free;
   end;
 end;

C++:

 __fastcall TForm1::TForm1(TComponent *Owner) : TForm(Owner)
 {
    TIniFile *ini;
    ini = new TIniFile( ChangeFileExt( Application->ExeName, ".INI" ) );
    Top    =  ini->ReadInteger( "Form", "Top", 100 );
    Left   =  ini->ReadInteger( "Form", "Left", 100 ); 
    Caption = ini->ReadString ( "Form", "Caption", "Default Caption" );
    ini->ReadBool( "Form", "initMax", false ) ?
          WindowState = wsMaximized :
          WindowState = wsNormal;

    delete ini;
  }

  void __fastcall TForm1::FormClose)TObject *Sender, TCloseAction &Action)
  {
    TIniFile *ini;
    ini = new TIniFile(ChangeFileExt( Application->ExeName, ".INI" ) );
    ini->WriteInteger( "Form", "Top", Top );
    ini->WriteInteger( "Form", "Left", Left );
    ini->WriteString ( "Form", "Caption", Caption );
    ini->WriteBool   ( "Form", "InitMax", WindowState == wsMaximized );

  delete ini;
  }

ReadInteger 메소드의 파라메터는 "섹션, 키, 기본값"으로 파일이 없거나, 섹션 또는 키가 없을 경우 기본값을 반환합니다.

WriteInteger 메소드도 섹션과 키를 지정해 구성을 저장합니다.

 

다음과 같이 Ini 파일이 기록됩니다.

[Form]
Top=100
Left=100
Caption=Default Caption
InitMax=0

 

TMemIniFile은 생성자(Create 메소드)를 통해 IniFile의 정보를 가져와 버퍼(메모리)에 저장 후 메모리를 이용 구성을 관리합니다.

프로그램 생성 후 메모리 상에서만 구성을 관리할때 유용합니다.

 

버퍼 상의 정보를 기록하려면 UpdateFile 메소드를 호출하면 됩니다. 

만약, 종료 이전 UpdateFile 메소드를 호출하지 않으면 버퍼상의 정보는 저장되지 않습니다. 이 정보의 누락을 방지하려면 AutoSave 속성을 True로 지정해 자동저장 할 수 있습니다.

 

마지막으로, TRegistryIniFile 은 윈도우 레지스트리에 구성정보를 기록할 수 있는 클래스입니다.

다음과 같이 레지스트리 경로를 지정해 TIniFile과 동일하게 사용 가능합니다.

{ Registry mode selected: in HKEY_CURRENT_USER\Software\... }
IniFile := TRegistryIniFile.Create('Software\' + Application.Title);

참고자료


번호 제목 글쓴이 날짜 조회 수
공지 [DelphiCon 요약] 코드사이트 로깅 실전 활용 기법 (Real-world CodeSite Logging Techniques) 관리자 2021.01.19 15504
공지 [UX Summit 요약] 오른쪽 클릭은 옳다 (Right Click is Right) 관리자 2020.11.16 13974
공지 [10.4 시드니] What's NEW! 신기능 자세히 보기 관리자 2020.05.27 16509
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 22069
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 23290
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 18934
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 [1] 관리자 2015.06.30 39285
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2020년 11월 업데이트 됨) 험프리 2014.01.16 174737
803 [FireDAC Skill Sprints] 4. ArrayDML로 30배 빠르게 데이터 입력하기 Humphery 2015.03.11 1495
802 바이너리 폼파일(*.dfm)을 텍스트 폼파일로 변경하는 도구 Humphery 2015.09.15 1489
801 [발표자료] REST API 웹서비스 연동 관리자 2017.05.29 1474
» [팁] TIniFile과 TMemIniFile 사용 험프리 2019.12.04 1473
799 RAD Studio XE7에서 안드로이드 개선된 내용 [1] 관리자 2014.11.22 1470
798 [윈도우10] RAD Studio XE8로 윈도우 10 애플리케이션 만들기 file Humphery 2015.05.26 1452
797 20년된 델파이 앱을 현대식 마이크로서비스 아키텍처로 전환하기 관리자 2019.09.11 1451
796 [마이그레이션] 써드파티 컴포넌트 마이그레이션 방안 안내 험프리 2016.07.26 1443
795 [고객 사례- 델파이, 모바일, 전략] 축구 전술 기획 앱 - Soccer Playview 관리자 2021.08.20 1442
794 파이어몽키 용 그리드 컴포넌트 안내 - FirePower Humphery 2015.02.23 1441
793 센차 ExtJS 웹 클라이언트 + RAD서버 10.2.3 관리자 2018.04.24 1439
792 [마이그레이션 사례] 감리교신학대학교 험프리 2016.08.25 1438
791 [세미나 자료] 20141113 RAD Studio XE7 DeepDive file 관리자 2014.11.14 1429
790 웹에서 어플리케이션 구동하기(ActiveX 사용않고) Humphery 2015.04.09 1429
789 [10.3] 안드로이드 권한 모델 적용 방법 험프리 2019.05.17 1429
788 VCL의 유용하지만 놓칠수 있는 기능 들 Humphery 2014.12.12 1425
787 3D 애플리케이션 만들기(파이어몽키 활용): 파이어몽키 코스북 7장 file 관리자 2014.07.21 1419
786 C++빌더 VCL 애플리케이션에서 PYTHON4DELPHI 활용하기 관리자 2021.06.09 1418
785 [도서/PDF] 한 번에 개발하는 안드로이드&iOS 앱 with 델파이 1편 - 부록 관리자 2017.01.17 1416
784 코드 아카데미: 세션2. 사용자 관리-사용자 인증 및 관리방법 (2014.8.5) 관리자 2014.08.06 1394