2010-11-30 3 views
1

J'ai un script de base inno-setup que j'utilise comme modèle pour plusieurs programmes d'installation. Dans le cadre du script de base, j'ai un appel à la fonction d'événement, NextButtonClick.Extension des fonctions d'événement via la directive #Include

Je voudrais maintenant ajouter du code supplémentaire à l'événement NextButtonClick qui ne sera exécuté que par un de mes installateurs. Y a-t-il un moyen de "prolonger" l'événement NextButtonClick? Je pense à quelque chose dans le sens de la fonction super() de Python. Inno-setup utilise Pascal comme langage de script, donc peut-être un expert Pascal peut offrir un aperçu.

Répondre

2

Pas directement

Rappelez-vous la directive #include est juste une directive pré-compilateur qui rend le fichier inclus apparaître à la place de la directive est au compilateur de script d'installation Inno. Pour éviter d'inclure du code d'installation individuel sur le script de modèle, vous pouvez créer une convention pour appeler une procédure dans le modèle. La seule règle que vous devez suivre est que chaque installateur doit déclarer la procédure, même vide. De cette façon, vous pouvez personnaliser en fonction de l'installateur tout en conservant un modèle neutre.

Votre modèle peut être quelque chose comme:

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; 

Ensuite, les installateurs individuels peuvent ressembler à ceci:

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 

Peut-être qu'il est possible de mettre en œuvre une approche complexe, je ne peux pas me rappeler si PascalScript supporte les types procéduraux et pas le temps de vérifier avec inno.

avertissement tout le code écrit directement ici pour vous montrer l'idée, il peut ne pas compiler.

+0

+ 1 Approche intéressante. Pour ma situation, je cherche à avoir des dizaines d'installateurs individuels, avec seulement 2 ou 3 qui auront besoin de code personnalisé.Donc, pour mes besoins, ajouter 2 ou 3 sections de code supplémentaires dans le modèle de base est mieux que d'ajouter des fonctions vides à la plupart de mes installateurs individuels. Cependant, si la situation était renversée, et qu'une majorité de mes installateurs individuels avaient besoin de code personnalisé, je pense que votre proposition serait la bonne solution. – mwolfe02

0

J'utilise la solution suivante, ce qui peut rendre les choses difficiles à gérer par la suite, mais en utilisant le contrôle de version, je suis en mesure de garder une poignée là-dessus pour l'instant:

Dans mes installateurs individuels, j'ai série de #define directives. Par exemple:

#define IncludeSomeFeature 
#define IncludeSomeOtherOption 

Ensuite, dans mon modèle de base, j'utilise les #ifdef directives comprennent éventuellement des différents morceaux de code dans les événements de script Pascal:

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; 

Le seul inconvénient de cette approche est que le code que le modèle de base se remplira lentement de code qui appartient vraiment à l'installateur individuel. Cependant, comme il s'agit de directives de temps de compilation, les exécutables d'installation résultants ne devraient pas être gonflés. Vraiment, cependant, mon plus gros problème avec cette approche est qu'elle ne ressemble pas à The Right Way ™.

Questions connexes