2010-11-30 11 views
1

私はいくつかのインストーラのテンプレートとして使用する基本のinno-setupスクリプトを用意しています。基本スクリプトの一部として、私はイベント関数、NextButtonClickを呼び出しています。#Includeディレクティブを使用してイベント関数を拡張する

NextButtonClickイベントに私のインストーラーの1人だけが実行する追加のコードを追加したいと思います。 NextButtonClickイベントを「拡張する」方法はありますか?私はPythonのsuper()関数の行に沿って何かを考えています。

Inno-setupは、Pascalをスクリプト言語として使用しているため、おそらくPascalの専門家がいくつかの洞察を提供することができます。

答えて

2

未直接

は#includeディレクティブを覚えディレクティブは、Inno Setupのスクリプトコンパイラにある場所に表示されるように含まれるファイルを作るだけで、プリコンパイラ・ディレクティブです。

しかし は、テンプレートスクリプト上の個々のインストーラコードを含めないようにするには、テンプレートでプロシージャを呼び出すための規則を作成することができます。

あなたが従わなければならない唯一の規則は、すべてのインストーラが手続きを宣言しなければならないことです。これにより、中立のテンプレートを維持しながら、インストーラーごとにカスタマイズすることができます。

あなたのテンプレートのようなものかもしれ

:次に、個々のインストーラは、このように見えるかもしれ

function NextButtonClick(CurPageID: Integer): Boolean; 
begin 
    Result := BeforeNextButtonClick(CurPageID); 
    //if the per-installer code decides not to allow the change, 
    //this code prevents further execution, but you may want it to run anyway. 
    if not Result then 
    Exit; 
    //your template logic here 

    Result := Anything and More or Other; 

    //same here! 
    if not Result then 
    Exit; 

    //calling the per-installer code 
    Result := AfternextButtonClck(CurPageID); 
end; 

function BeforeNextButtonClick(CurPageID: Integer): Boolean; 
begin 
    //specific logic here 
    Result := OtherThing; 
end 

function AfterNextButtonClick(CurPageID: Integer): Boolean; 
begin 
    //and here, a blank implementation 
    Result := True; 
end; 

#include MyCodeTemplate.iss 

は、多分私だけであれば覚えていないことができ、複雑なアプローチを実現することが可能ですPascalScriptは手続き型をサポートしており、innoでチェックする時間はありません。

免責事項すべてのコードは、アイデアを示すためにここに直接書かれていますが、コンパイルできない可能性があります。

+0

+1興味深いアプローチ。私の状況では、カスタムコードが必要なのは2つまたは3つしかなく、数十人のインストーラが必要です。だから、私の目的のために、基本テンプレートに2〜3の余分なコードセクションを追加することは、私の個々のインストーラの大部分に空白の関数を追加するよりも優れています。しかし、状況が逆転し、私の個々のインストーラの大部分がカスタムコードを必要とする場合、私はあなたの提案が行く方法だと思う。 – mwolfe02

0

私は最終的に管理する事が難しいことがあり、次の回避策を使用していますが、私は今のところそれにハンドルを維持することができるよ、バージョン管理を使用して:

を私の個々のインストーラでは、私が持っています一連の#defineディレクティブです。例えば:

#define IncludeSomeFeature 
#define IncludeSomeOtherOption 

そして私の基本テンプレートで、Iは、任意に#ifdefディレクティブを使用パスカルスクリプトイベント内のコードの異なる部分を含む:

function NextButtonClick(CurPageID: Integer): Boolean; 
var 
    ResultCode: Integer; 
begin 
    Result := True; 
    if CurPageID = wpReady then begin 
    #ifdef IncludeSomeFeature 
     ... some code ... 
    #endif 
    #ifdef IncludeSomeOtherOption 
     ... some more code ... 
    #endif 
    ... code to run for every installer ... 
    end; 
end; 

このアプローチに対する1つの欠点は、そのコードであります基本テンプレートは、個々のインストーラーに実際に属しているコードでゆっくりといっぱいになるでしょう。しかし、これらはコンパイル時の指示であるため、結果として生じるセットアップ実行可能ファイルは膨大なものにならないはずです。

本当に、このアプローチの私の最大の問題は、ちょうど正しい道™のように感じられないということです。

関連する問題