お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"[D4][D3]パッケージを使ったAddIn手法"



皆さん、こんにちは。謎の全知師ともうします。

市販のアプリケーションで、後から機能追加出来るように、
アドインが使えるものが有ります。Delphiのパッケージ機能
を使えば、比較的簡単にこれを実現できます。

なお、アドインをパッケージで行う場合、必ず実行時パッケー
ジを使う設定になってないといけません。



イカの例では、通常のプロジェクトでPageControlを使って
いて、この中にアドインで新規のページを作成します。

下記の様な構成になっています。

アドインを管理するパッケージ
  AddInBase.dpk
    |-ExtTabSheet.Pas   //アドインの管理ユニット
  こちらのパッケージはDelphiにインストールします。

アドインを読み込む方のプロジェクト
  Project1
    |-Unit1.Pas
  プロジェクトオプションで「実行時パッケージを使う」
  がOnになっている事。更に、その下のエディット部で、
  上記のAddInBase.dcpが追加されている事。

アドインパッケージ
  AddInPack.dpk
    |-AddInTabSheet.Pas  //アドインするTabSheet

  RequiersにAddInBase.bplが追加されている事。
  こちらはDelphiにインストールする必要無し。

-----------------ExtTabSheet.Pas始まり------------------
unit ExtTabSheet;

interface

uses
  Classes, ComCtrls;

type
  TAddTabSheetClass = class of TTabSheet;

var
  AddInList : TStringList;

implementation

initialization
  AddInList := TStringList.Create;
finalization
  AddInList.Free;
end.
-----------------ExtTabSheet.Pas終わり------------------

-----------------AddInTabSheet.Pas始まり----------------
unit AddInTabSheet;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ComCtrls, StdCtrls, ExtTabSheet;

type
  TAddInTabSheet = class(TTabSheet)
  private
    { Private 宣言 }
    Btn : TButton;
    procedure BtnClick(Sender : TObject);
  protected
    { Protected 宣言 }
    procedure SetParent(AParent : TWinControl); override;
  end;

implementation

{ TAddInTabSheet }

procedure TAddInTabSheet.BtnClick(Sender: TObject);
begin
  ShowMessage('AddIn');
end;

procedure TAddInTabSheet.SetParent(AParent: TWinControl);
begin
  inherited;
  if AParent <> nil then
  begin
    Caption := 'AddInPage';
    Btn := TButton.Create(Self);
    Btn.Parent := Self;
    Btn.Caption := 'NewButton';
    Btn.OnClick := BtnClick;
  end;
end;

initialization
  AddInList.AddObject('TAddInTabSheet', TObject(TAddInTabSheet));
finalization
  AddInList.Delete(AddInList.IndexOf('TAddInTabSheet'));
end.-----------------AddInTabSheet.Pas終わり----------------

-----------------Project1始まり-----------------------------
Form1の上に、PageControlを置き、ページを1つ作っておく。
内容はどうでも良いです。
フォームのprivate部に、

  private
    { Private 宣言 }
    Module : HModule;
    Page : TTabSheet;

ButtonとOpenDialogを置き、ButtonのOnClickイベントで、

procedure TForm1.Button2Click(Sender: TObject);
begin
  if OpenDialog1.Execute then
  begin
    Module := LoadPackage(OpenDialog1.FileName);
    Page := TAddTabSheetClass(AddInList.Objects[AddInList.Count
                                         - 1]).Create(Self);
    Page.PageControl := PageControl1;
  end;
end;

OnCloseイベントで、

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if Module <> 0 then
  begin
    Page.Free;
    UnloadPackage(Module);
  end;
end;

これを実行して、Buttonをクリックし、AddInPack.bplを選択して
やるとPageControlに新しいページが作成されています。

なお、AddInTabSheet.pasをフォームで作成すると、イベント
ハンドラなどの作成が楽になります。この場合PageControlに
組み込むには、

  AddInForm.ManualDock(PageControl);

等とします。

                                     99/07/14(水) 22:52 謎の全知師(QZE10125)

Original document by 謎の全知師      氏 ID:(QZE10125)


ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum