2013年12月17日火曜日

Delphiでのrecordの便利な使い方

こんばんは
大阪本社 Mです。

今日はDelphiでのrecordの便利な使用方法を紹介します。

record型変数をTListに格納しメンバー名でアクセスする方法です。
これだけだと何のこっちゃという感じなのでサンプルコードを見てください。

■サンプルコード■
-----------------------------------------------
type
   // record型定義
   TSyainRec = record
      社員番号: integer;
      氏名: string;
   end;

   //TSyainRecのポインタ型
   PSyainRec = ^TSyainRec;

   ・
   ・
   ・
   ・

var
   SyainList:TList;
   SyainRec: PSyainRec;
   i: integer;
begin
   // リストを生成
   SyainList := TList.create;

   // 社員番号と社員名をリストに格納
   new(SyainRec);
   SyainRec^.社員番号 := 1;
   SyainRec^.氏名 := 'シンプル 太郎';
   SyainList.Add(SyainRec);

   new(SyainRec);
   SyainRec^.社員番号 := 2;
   SyainRec^.氏名 := 'シンプル 次郎';
   SyainList.Add(SyainRec);

   new(SyainRec);
   SyainRec^.社員番号 := 3;
   SyainRec^.氏名 := 'シンプル 三郎';
   SyainList.Add(SyainRec);

   // リストに追加したrecord型変数のメンバー名でアクセス
   for i := 0 to (SyainList.Count -1) do
   begin
      Writeln('社員番号:' ,PSyainRec(SyainList[i]).社員番号);
      Writeln('氏名:' ,PSyainRec(SyainList[i]).氏名);
   end;

   // 不要になったらrecord型変数を解放する必要がある。
   for i:= 0 to (SyainList.Count -1) do dispose(PSyainRec(SyainList[i]));

   //リストも開放
   SyainList.free;
end;
-----------------------------------------------

■実行結果■
-----------------------------------------------
社員番号:1
氏名:シンプル 太郎
社員番号:2
氏名:シンプル 次郎
社員番号:3
氏名:シンプル 三郎
-----------------------------------------------

ポイントはPSyainRec(SyainList[i]).社員番号のようにすることで
リストに格納したrecord型変数のメンバー名でアクセスできるところです。

データベースから取得したデータを変数に入れて扱うときなどに
record型変数のメンバー名をデータベースの列名と同じにしておけば、
非常にわかりやすくなるのではないでしょうか。

ただしこの方法の場合、不要になったrecord型変数はいちいち
開放してやる必要がある、というのが欠点でしょうか。

いちいち開放するのはめんどくさいし忘れそう、と思うのは
私だけではないと思います。

同じようなことをするのにジェネリックのTListを利用することで
record型変数を開放する必要が無くなるようなので、
次回はその方法を調べて投稿したいと思います。