Phase.3 セットアップエージェントを作る(『スタパライフ』 Ver 1.01)

 Chapter.13 終了(設定保存)時の処理

 以下の処理は、『キャビネットへ登録する』ボタンを押した時の処理です。必要な手順を以下に記します。

  1. レジストリィを更新または作成する
  2. 存在しない場合、キャビネットフォルダを作成する
  3. キャビネットへエージェントを登録する
・レジストリィの登録・更新

  53:  CreateDir(DataDir + '\stpl');
  54:  userfile := DataDir + '\stpl\user.dat';
  55:  if FileExists(userfile) then
  56:    Leg:=TLegistry.Create(userfile,lmOpenReadWrite,1024,1024,nil)
  57:  else
  58:    Leg:=TLegistry.Create(userfile,lmCreate,1024,1024,nil);
  59:
  60:  Leg.Signature:='STPL_INFO';
  61:  Leg.CreateKey('/common');
  62:  Leg.WriteString('/common/url',txtURL.text);
  63:  Leg.WriteString('/common/mbox','stpl\stpl.mbx');
  64:  Leg.Free;

 レジストリィの読み込み時と同じく、TLegistryオブジェクトによってレジストリィを登録または更新することができます。上記では、レジストリィファイルが存在する場合は読み込み・書き込みモードでオープンし、存在しない場合は作成モードでオープンしています。レジストリィ上に新しくフォルダを作成する場合はCreateKeyメソッドを使い、キーに値を保存する場合は、WriteStringWriteBoolWhiteInteger等のメソッドを使用します。キーのフォルダ名と名前は、それぞれスラッシュ'/'で区切って記述します。ファイルのクローズは、読み込み時と同じくFreeメソッドで行います


・存在しない場合、キャビネットフォルダを作成する

  66:  Folder:=CabinetManager.Find('diary');
  67:  if not Assigned(Folder) then begin
  68:    Folder:=TCabinetItem.Create(CabinetManager);
  69:    Folder.ItemType:=ctFolder;
  70:    Folder.Name:='diary';
  71:    Folder.Caption:='日記';
  72:    CabinetManager.Add(nil,Folder);
  73:    FFolderCreated:=True;
  74:  end else FFolderCreated:=False;

 開始時の処理と同じ要領で、キャビネットへ『スタパライフ』エージェントが登録されるフォルダが存在するかどうか調べます。キャビネットアイテムは、フォルダかアイテムかどちらかの属性が設定されています(将来もっと増える可能性もありますね)。
 キャビネットへアイテムを追加する場合は、Addメソッドを使います。上記の処理では、キャビネットアイテム用の変数をCreateし、その変数を介してキャビネットアイテムのプロパティを設定しています。設定が終ったら、キャビネットアイテム変数の内容をAddメソッドを用いてキャビネットに登録しています。設定するプロパティはそれぞれ以下のような内容になっています。

プロパティ名 内容
ItemType フォルダ(ctFolder)かエージェント(ctPlugin)か
Name 名前
Caption キャビネットへの表示名
PluginExecFileName 『開く』に割り当てられるエージェントの名前(Pluginからの相対ファイル名)
PluginExecArg 『開く』エージェントへ渡すパラメタ
PluginAutoFileName 『巡回』に割り当てられるエージェントの名前(Pluginからの相対ファイル名)
PluginAutoArg 『巡回』エージェントへ渡すパラメタ
PluginSetupFileName『プロパティ』に割り当てられるエージェントの名前(Pluginからの相対ファイル名)
PluginSetupArg 『プロパティ』エージェントへ渡すパラメタ


・キャビネットへエージェントを登録する

  75:  if not Assigned(CabinetManager.Find('diary$stpl')) then
  76:  begin
  77:    Item:=TCabinetItem.Create(CabinetManager);
  78:    Item.ItemType:=ctPlugin;
  79:    Item.Name := 'diary$stpl';
  80:    Item.Caption:='スタパライフ';
  81:    Item.PluginExecFileName:='stpl\openstpl.rx';
  82:    Item.PluginExecArg:='';
  83:    Item.PluginAutoFileName:='stpl\autostpl.rx';
  84:    Item.PluginAutoArg:='';
  85:    Item.PluginSetupFileName:='stpl\stpl.pas';
  86:    Item.PluginSetupArg:='';
  87:    CabinetManager.AddChild(Folder,Item);
  88:    Item.Free;
  89:  end;
  90:  if FFolderCreated then Folder.Free;
  91:  if not DirectoryExists(DataDir) then begin
  92:    if not ForceDirectories(DataDir) then begin
  93:      ShowMessage('ログフォルダ "'+DataDir+'" が作成できませんでした');
  94:    end;
  95:  end;
  96:  CabinetManager.Commit;
  97:  Close;

 フォルダの時と同様に、キャビネットにアイテムが存在するかどうか調べ、存在しない場合はキャビネットアイテム(今回はエージェント属性)を追加しています。フォルダの場合と違い、『開く』『巡回』『プロパティ』のそれぞれのエージェントの名前とパラメタを設定しています。また、フォルダの子アイテムとするため、追加のメソッドにはAddChildを使用しています。
 最後に忘れず、キャビネットへの変更結果を反映するためのCommitメソッドを実行してください。このタイミングで、airWebのキャビネットも再描画されます。

 ところで、『開く』エージェントには、uniBrowserではなくopenstplというAir Cで作られたエージェントが登録されていますね? これはどういうことかというと、openstpl.rxがuniBrowserを呼び出しているのです。つまり、エージェントがエージェントを呼び出しているのですね。なぜこうしたかというと、最初は筆者の力量不足でキャビネットアイテムのプロパティを更新する方法が分からなかったのです。気が付いてみれば簡単なことだったんですけどね・・・。そこで、動的にuniBrowserへ渡すパラメタが変更されるように、Air Cのエージェントでレジストリィの値を読み込み、uniBrowserを呼び出していたのです。ちなみに、ソースはこちらです。
 最新版の『スタパライフ』では、既にこの方法は廃止され、直接uniBrowserを呼び出す形に修正されています。


 次に、『設定を保存する』ボタンを押した時の処理です。既にキャビネットへエージェントが登録されている前提ですので、この時必要になるのはレジストリィを保存する処理だけです。

・レジストリィの登録・更新

 141:  CreateDir(DataDir + '\stpl');
 142:  userfile := DataDir + '\stpl\user.dat';
 143:  if FileExists(userfile) then
 144:    Leg:=TLegistry.Create(userfile,lmOpenReadWrite,1024,1024,nil)
 145:  else
 146:    Leg:=TLegistry.Create(userfile,lmCreate,1024,1024,nil);
 147:
 148:  Leg.Signature:='STPL_INFO';
 149:  Leg.CreateKey('/common');
 150:  Leg.WriteString('/common/url',txtURL.text);
 151:  Leg.WriteString('/common/mbox','stpl\stpl.mbx');
 152:  Leg.WriteBool('/common/autobrowseropen',chkAutoBrowserOpen.Checked);
 153:  Leg.Free;
 

 『キャビネットへ登録する』ボタンを押した時のレジストリィ保存と全く同じ処理を行っています。