CreationCollege-TOP
Now Printing..
▲ C.College TOP▲ D-Tech Top.情報局2号館

∇ 脚注
※1:Windows3.1の環境データ保存方法。win.iniに、システムの重要なデータからアプリケーションの細かいデータまで一まとめにして保存していた。このファイルが壊れると当然ながらWindowsはマトモに動かなくなりました。

※2:寧ろ、気持ち悪いからとレジストリを手動で消そうとして間違ったのを消して起動しなくなるというケースの方が多いのでは。

※3:レジストリ情報が6〜10メガを超えたらWindows再インストールと思っておくと良いかもしれません。(4メガは早すぎ)

※3:そのファイルとの入出力を行うゲート番号のようなもの。Unix-Pascal用語。まあファイルポインタと同じようなものと思ってください。


∇ 感想はこちらに
クリエイターズボード(掲示板)

- Article: レジストリに情報を保存しましょ

Update: 2000/6/16


レジストリの効用

 素人ユーザは触ってはいけないレジストリ。それゆえに不用意にレジストリを操作するプログラムを書くとクレームが付きます。確かにアンインストーラの付いていないソフトは、使用しなくなってフォルダごと消してしまってもレジストリ情報が存続してしまい、確かに気持ちの良いものではありません。しかしまあ、windows.ini時代(※1)に比べれば、簡単に壊れるものじゃなくなりましたし、レジストリのゴミが残っていようが直接実害の発生するケースはあまりないわけですし(※2)、RAMが増えCPUが速くなった今では、レジストリの肥大がマシン速度の低下をもたらすという事も「そんなに」なくなったので(※3)、邪険に扱う必要はないのでは?と私は思っています。
 というか、なんでレジストリなるものが必要なの、という事を知らない人も未だいると思いますので、レジストリ操作方法の前に、ちょっと解説しておきすね。
 まず、アプリケーションというものは大概、何らかの情報を記憶する必要がある事が多いです。ユーザ情報、ライセンス情報、ソフトのバージョン情報など。ゲームの場合はセーブデータなどですね。それらは断りがない限り情報ファイルとして書き込むわけですが、見える場所に置いておくのが望ましくない事もありまして、そういう時にレジストリという闇空間に保存しておけば「何となく安心」なのです。なんだか分からないから消しちゃえ的な事も回避できます。
 続いて、レジストリという場所が「常に安心して書き込める場所である」事を利用するケース。たとえばインストール無しでCDから起動するゲームがあったとします。そのセーブデータをどこにセーブしよう、という時に、インストールしていないのでアプリケーション専用のディレクトリも存在しません。ダイアログを出してユーザに指定させるのはもってのほかです(初期のWinゲームには見られましたが…)。
 となると、ディレクトリを作らずにデータを書き込めると分かっている場所はどこになるでしょう。「C:\WINDOWS」とか「C:\TEMP」くらいになってきますが、両方ともユーザデータを置くには妥当ではないですね(^^;)。おまけにNTの人は「C:\WINNT」でしょうし、PC9801系の人はルートは「A:」だったりして、あてずっぽうで指定するのはマズいわけです。ここでレジストリ様は大活躍するわけですね。
 最後はアクセスの簡便性ですか。ファイルに書き込んだ場合、その情報を読み取るのにわざわざディスクリプタ(※4)をオープンして、そのデバイスからfread..などと面倒な事をするわけです。おまけに、データの保存フォーマットがバラバラで、不透明も良いところです。対してレジストリの形式は常に一定だし、アクセス手段もWindowsが提供しています。大概のプログラミング言語において、すいすい扱う事ができるというわけなのです。

 …と、レジストリの重要性を書いたところで、ようやくDelphiにおけるアクセス方法を紹介します。

もっとも簡単なレジストリ操作方法

 Delphiは2種類のレジストリ操作インターフェイスを提供しています。TRegistryとTRegIniFileがそうで、前者は非常に厳密な操作を要求されるもののレジストリの機能をフルに使う事ができます。後者はWin16時代のIniファイルのアクセスと「体感的に」互換性があり、レジストリの実体を知らなくても簡単に読み書きができるもので、通常は後者で充分だと思います。
 サンプルソースを付属しておきます。


// --------------- ここから -------------------

var
  Form1: TForm1;
  FReg: TRegIniFile;

implementation
{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Freg.WriteString('Test','race',Edit1.Text);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Freg := TRegIniFile.Create('Software\MyTest');
  Edit1.Text := Freg.ReadString('Test','race','none');
end;

// -------------- ここまで -------------------
 フォームは省略します。また、このソースを実行する場合は、uses節に Registryを追加しておいてください。標準状態ではレジストリ関連のコンポーネントはインプリメントされてないからです。って、この説明で分かるでしょうか(^^;)。Delphiに限らずオブジェクト指向言語は、普通使わないものは外しておいて、必要時にそれをもって来るわけですが、ラベルやボタンなど「ビジュアルコンポーネント」はパレットから持って来れるんですが、レジストリのような類のものはビジュアルを持たないものなので、パレットからフォームに貼り付ける代わりに、ソースのuses節に必要とするコンポーネント(どちらかというとユニットと呼ぶ)名を書いてあげるわけです。なお、Registryというコンポーネント名が分らなくても、上のソースをコンパイルして、「TRegIniFileなんて型知らないですぅ」とすげなく言われた際に、ヘルプで「TRegIniFile」を検索すると、「ユニット:Registry」と出ているので、これを書けばOKです。こういう手順はわりと初心者は知らない事なので一応。
 それで、レジストリ操作の基本メソッドですが、次の4つだけ覚えていればOKです。

  • Create(Key: String); //レジストリの型(キー)を生成する
  • WriteString(Session,Ident,Value: String); // 「A=..」の組で情報を書く
  • ReadString(Session,Ident,Defalut: String); // Aの値(..)を読み取る
  • DeleteKey(Session,Ident: String); // Writeで生成した組を削除する

     厳密な説明はヘルプを見たほうが良いと思うのでここでは書きません。先のソースの解説ですが、アプリの起動と同時に、まずレジストリのキーを生成します。すでにキーが生成されている場合は無視されます。そして、その中に入っている「TEST.race」の中身を読もうとします。初めてこのアプリが起動された時は何も入ってないから、Defaultに設定された「none」という文字列が返って来る事になります。
     このSession、Ident、Valueの3段構成は初めての人は混乱してしまうと思います(^^;)。Sessionが「テスト」、Identが「若島津君」、Valueが「0点」とでも覚えておきましょう(何故いまごろ若島津?)。
     さて、上のソースでは、ボタンを押すと、その時のEditコントロールの値が即座にレジストリに書き込まれます。2回目以降このアプリを起動すると、書き込んだ値がしっかりと出てくるわけです。簡単ですね。前回接続したパス情報を保持させたりと、使い方は色々です。ただし、無闇に多くなるようだったら素直にファイルに書き出して読み込む方法にした方が良いです。レジストリに比べたら面倒とはいえ、Delphiはかなり簡単なデータの読み書き方法をTRichEdit/TListBoxコンポーネントで提供していますので。

    - 鷹月ぐみな


  • .
    Copyright- 鷹月ぐみな(gumina)たかつきCOMPANY 1997-2000.▲ C.College TOP