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型変数を開放する必要が無くなるようなので、
次回はその方法を調べて投稿したいと思います。

2013年12月16日月曜日

2つの単語によるgrep検索

大阪のUです。

某エディタでgrep検索しようとしたとき、
1つの単語であれば問題ないですが、2つの単語で検索しようと思うと、
間に半角空白を入れてもできません。

grepした結果に再検索すれば済む話ともいえますが、
なんとか1回で出来ないか、と考えたとき、
正規表現で簡単に出来ることに気づきました。

【正規表現】
文字列1.*文字列2

. ・・・・ 任意の1文字
* ・・・・ 直前の1文字の0回以上の繰り返し

今まで全然考えてませんでしたが、こんな簡単な記述で出来るとは。

これだけでも十分に有用ですが、
せっかくなのでもう一段階進めて考えました。

2行にまたがる2つの単語をgrep検索は出来ないのか?

プログラムやSQLを複数行にまたがって
書くことは多いからできれば検索がかなり捗る。


・・・できました。

【正規表現】
文字列1.*\n{0,1}.*文字列2

\n ・・・・ 改行
{0,1} ・・・・ 直前の1文字の0~1回の繰り返し


軽く調べてあっさり実現。
これはかなり便利なのでは。。

対象のエディタが複数行に対応してなければ
ダメかもしれませんが、使えるなら検索がかなり楽になりそうです。