Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2010年01月05日] [更新 2017年03月13日] Delphi サンプルプログラム集
048_列挙型の保存と読み出し
動作確認等 Windows 7 U64(SP1) + Delphi XE(UP1) Pro
048_EnumeratedType.zip [1,083 KB] 2017年03月13日版 (EXE 同梱)







01_列挙型の保存と読み出し - TWindowState 型の例


列挙型の値の保存と読み出しのサンプルです.
ここでは,フォームの WindowState プロパティの値を Ini ファイルに保存し,次回起動時にこのプロパティの値でフォームを表示します.このプロパティは,TWindowState の列挙型です.
このサンプルプログラムは,GetEnumValue 関数と,GetEnumName 関数を使用して,
  • 列挙型の値 (定数名) を文字列として取得する
  • 列挙型の定数名を文字列にしたものを,列挙型のプロパティの値に変換する
方法の参考コードともなっています.


図1
設計時画面
図2
保存した値の例

リスト1
フォームの WindowState の保存と読み出し-列挙型の保存・読み出し
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private 宣言 }
    IniFileName : String;
    StrWinState : String;
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

uses
  IniFiles,
  TypInfo;

{$R *.DFM}

//=============================================================================
//  フォームのCreate時に保存したWindowStateの値を読み出して設定
//  このサンプルは.列挙型の値の保存と読み出しの方法の1つの例
//
//  ただし,このサンプルでは,最小化して保存し,次回最小化の状態で起動すると
//  タスクバーにアイコンが表示されない場合があるので注意
//
//  Iniファイル関係の操作にはusesにIniFilesが必要
//  TyppeInfoの使用にはusesにTypInfoが必要
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
var
  LIniFile : TInifile;
begin
  IniFileName := ExtractFilePath(Application.ExeName) + 'FormInfo.ini';
  LIniFile    := TIniFile.Create(IniFileName);
  try
   if FileExists(IniFileName) then begin
     //保存してあるWindowStateの値を文字列として読み出す
     StrWinState := LIniFile.ReadString('AppInfo', 'WindowState', '');

     //その文字列をTWindowState型の値に変換する
     WindowState := TWindowState(GetEnumValue(TypeInfo(TWindowState), StrWinState));
   end;
  finally
    FreeAndNil(LIniFile);
  end;
end;

//=============================================================================
//  フォームを閉じる時は,WindowsStateの値をIniファイルに保存
//  Iniファイル関係の操作にはusesにIniFilesが必要
//  TyppeInfoの使用にはusesにTypInfoが必要
//=============================================================================
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
  LIniFile : TInifile;
begin
  //このフォームのWindowStateプロパティの値を文字列に変換
  StrWinState := GetEnumName(TypeInfo(TWindowState), Ord(WindowState));

  //その文字列をIniファイルに保存
  LIniFile := TIniFile.Create(IniFileName);
  try
    try
      LIniFile.WriteString('AppInfo', 'WindowState', StrWinState);
    except
    end;
  finally
    FreeAndNil(LIniFile);
  end;
end;

end.




02_列挙型のメンバーの値を列挙


列挙型のメンバの値を取得する例です.上と同じ TWindowState 型のメンバの値を列挙します.
TWindowState という列挙型は次のように定義されています.

  TWindowState = (wsNormal, wsMinimized, wsMaximized);



図3
実行結果

リスト2
TWindowState 列挙型のメンバーのリストを取得
uses
  TypInfo;

{$R *.DFM}

//=============================================================================
//  列挙体の値をリストするサンプル
//  ここではTWindowState型のメンバの値を列挙
//
//  usesにTypInfoが必要
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  LpInfo : PTypeInfo;
  LpData : PTypeData;
  i     : Integer;
begin
  Memo1.Clear;

  LpInfo := TypeInfo(TWindowState);

  //列挙型であれば調査
  if LpInfo^.Kind = tkEnumeration then begin
    LpData := GetTypeData(LpInfo);
    for i := LpData^.MinValue to LpData^.MaxValue do begin
      Memo1.Lines.Add(GetEnumName(LpInfo, i));
    end;
  end;
end;