2005年08月12日

プログラムに必要なパラメータをINIファイルから読込む方法

あなたがつくるアプリケーションプログラムは、
プログラムの動作や振舞いなどに必要な
パラメータをどのように読込み設定しているでしょうか?
INI形式やXML形式でファイルに持たせますか、
或いはレジストリに格納したり、
DBに格納したりと方法は幾つか考えられます。

Windowsのアプリケーションであれば、
パラメータをレジストリに格納することも可能ですが、
UnixやLinuxプラットフォーム上では、
レジストリの概念が無いので使用できません。
また、複数の端末で同じアプリケーションを稼動させる場合、
パラメータがDBで一元管理されているか、そうでないかで、
後の運用工数は大きく変わることでしょう。
どのような形でパラメータを設定し読込むかは、
アプリケーションの機能、各種制約、
運用などを十分検討して下さい。

前置はこれくらいにして、
とにかく手っ取り早く済ませたいと思うななたに、
今回はシンプルで使い勝手がよい、
INI形式のファイルを読込む方法を紹介します。

「Delphi」または「Kylix」の「IniFiles」ユニットにある、
「TIniFile」クラスを利用すると、
WindowsやLinuxといったプラットフォームを意識することなく、
いとも容易くINI形式のファイルが読込めます。
早速、お試しあれ!

全ソースは【続きを読む】をクリック!

使用例
procedure TForm1.btnReadIniFileClick(Sender: TObject);
var
 lSec,
 lItm: TStringList;
 lVal: String;
begin
 lSec := Nil;
 lItm := Nil;
 try
  memINI.Clear;
  if (FIni <> Nil) then FIni.Free;
  // INIファイルオブジェクトを作成する
  FIni := TIniFile.Create(
   ExtractFilePath(Application.ExeName) + edtIniFileName.Text);
  // セクション/アイテムデータを格納するため、
  // ストリングオブジェクトを作成する

  lSec := TStringList.Create;
  lItm := TStringList.Create;
  // セクションを読込み、
  // セクション分のループを実行し
  // 画面にINIファイルの内容を表示する

  FIni.ReadSections(lSec);
  while (lSec.Count > 0) do
  begin
   lItm.Clear;
   // セクション配下のアイテム情報を読込み、
   // アイテム分のループを実行し
   // 画面にINIファイルの内容を表示する

   FIni.ReadSection(lSec[0], lItm);
   memINI.Lines.Add(Format('[%s]', [lSec[0]]));
   while (lItm.Count > 0) do
   begin
    lVal := FIni.ReadString(lSec[0], lItm[0], '');
    memINI.Lines.Add(Format(' %s="%s"', [lItm[0], lVal]));
    lItm.Delete(0);
   end;
   lSec.Delete(0);
  end;
 finally
  if (lSec <> Nil) then lSec.Free;
  if (lItm <> Nil) then lItm.Free;
 end;
end;


【画面イメージ】

INIFileTester.gif

関連書籍


Copyright guy@かしらもんじ でぇ〜

続きを読む
posted by guy at 06:24 | 起動編

2005年08月08日

アプリケーションの二重起動を抑制する方法

同じアプリケーションを複数起動し、
負荷分散や可用性を目的としたシステムもあれば、
同じアプリケーションが
二重起動されると困るシステムもあります。

今回はミューテックス(mutually exclusive)オブジェクトを利用し、
アプリケーションの二重起動を抑制する方法を紹介します。

一般的にミューテックスオブジェクトは、
マルチCPUプラットフォームをターゲットにした
複数のスレッドを並行処理させるアプリケーションで、
共有メモリなどの共有リソースを、
同時にアクセスさせないよう排他制御で使用します。

サンプルプログラムで利用するCreateMutex関数は、
名前付きまたは名前なしの
ミューテックスオブジェクトを作成または開きます。
関数が成功すると、
ミューテックスオブジェクトのハンドルが返ります。
この関数を呼び出す以前に
そのミューテックスオブジェクトが存在する場合は、
この関数は既存のオブジェクトに対するハンドルを返し、
GetLastError関数は「ERROR_ALREADY_EXISTS」を返します。

アプリケーションはCreateMutex関数を呼出す際に、
ミューテックスオブジェクトの名前を指定し、
同じアプリケーションが
この関数を以前に呼び出したか否かを判断し、
アプリケーションの二重起動であるか否かを判定します。

それではサンプルプログラムを参照し、
二重起動させない方法をお試し下さい。

使用例
unit DupCheckUnit;

interface

uses
 Classes, Controls, Dialogs, Forms,
 Graphics, Messages, SysUtils, Variants, Windows;

const
 WM_INITIALIZE = WM_USER + 101;

type
 TForm1 = class(TForm)
  procedure FormCreate(Sender: TObject);
  procedure FormDestroy(Sender: TObject);
 private
  FApName: String;
  FMutex: THandle;
  procedure OnMessage(
   var
pMsg: TMsg; var pHandled: Boolean); virtual;
  procedure Initialize;
 public
 end
;

var
 Form1: TForm1;

implementation

{$R *.dfm}

//--------------------------------------
procedure TForm1.FormCreate(Sender: TObject);
begin
 // アプリケーション変数を初期化する
 FMutex := 0;
 FApName := 'YourApplicationName';
 Application.OnMessage := Self.OnMessage;
 // 初期化イベントを自分自身に発生させる
 PostMessage(Self.Handle, WM_INITIALIZE, 0, 0);
end;

//--------------------------------------
procedure TForm1.FormDestroy(Sender: TObject);
begin
 // アプリケーションが使用したリソースを開放する
 if (FMutex <> 0) then
  CloseHandle(FMutex);
end;

//--------------------------------------
procedure TForm1.OnMessage(
 var pMsg: TMsg; var pHandled: Boolean);
begin
 Case pMsg.message of
 // 初期化イベントをハンドリングする
 WM_INITIALIZE:
  begin
   pHandled := True;
   Self.Initialize;
  end;
 end;
end;

//--------------------------------------
procedure TForm1.Initialize;
begin
 FMutex := CreateMutex(0, False, PChar(FApName));
 // この関数を呼び出す以前に
 // ミューテックスオブジェクトが存在する場合、
 // GetLastErrorは
 // ERROR_ALREADY_EXISTSを戻すので、
 // 既に同じアプリケーションが起動されていることになる

 if (GetLastError = ERROR_ALREADY_EXISTS) then
 begin
  MessageDlg(Format(
   'There is another instance of %s of running.',
    [FApName]), mtError, [mbOk], 0);
  PostMessage(Self.Handle, WM_QUIT, 0, 0);
 end;
end;

end.


関連書籍


Copyright guy@かしらもんじ でぇ〜

posted by guy at 07:19 | 起動編

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は1年以上新しい記事の投稿がないブログに表示されております。