4

ソースから Inno Setup をビルドする際に少し問題があります。TNewButton型を変更して、セットアップ ボタンにもう少し機能を追加したいと考えています。たとえば、型宣言を次のように変更しました

TNewButton = class(TButton)
protected
  procedure CreateParams(var Params: TCreateParams); override;
end;

TNewButton = class(TButton)
  procedure CMDialogChar( var Msg: TCMDialogChar); message cm_DialogChar;
private
  FNoShortcut : Boolean;
protected
  procedure CreateParams(var Params: TCreateParams); override;
public
  property NoShortcut : Boolean read FNoShortcut write FNoShortcut;
end;

そのため、パブリック プロパティNoShortcutを介してアクセスされ、手順CMDialogCharで使用されるプライベート属性NoShortを作成しました(特定の状況でボタンをショートカットでアクティブにできるようにしたい)。他にも実装したいことがいくつかありますが、同じ問題が発生します。

これらの変更を加えた Inno Setup を問題なくコンパイルでき ( Unicode サポートを取得するためにDelphi 2009を使用しています)、インストーラーを作成することもできます。しかし、.iss ファイルの新しいプロパティNoShortcutにアクセスしようとすると (例: "WizardForm.NextButton.NoShortcut := true;")、Inno コンパイラがエラーで停止します。

Unknown Identifier 'NOSHORTCUT'

これらの新しい属性とプロパティを iss-Files で使用するには、特別な方法で登録する必要がありますか? どんな助けでも大歓迎です:D

4

1 に答える 1

4

TLama が指摘したように、新しい識別子は と の両方に登録する必要がScriptClasses_C.pasありScriptClasses_R.pasます。質問の問題でもう少し具体的に言うと:

ボタンの新しい識別子をコンパイラに知らせるScriptClasses_C.pas手順を作成しました。RegisterTNewButton_C

procedure RegisterTNewButton_C(Cl: TPSPascalCompiler);
begin
  with Cl.AddClassN(Cl.FindClass('TButton'), 'TNewButton') do
  begin
    RegisterProperty('NoShortcut', 'Boolean', iptrw);
  end;
end;

基本的に同じScriptClasses_R.pasことを行いますが、新しい識別子のゲッターとセッターを追加で実装する必要がありました。

procedure TNewButtonNoShortcut_R(Self: TNewButton; var T: Boolean); 
begin 
  T := Self.NoShortcut;
end;

procedure TNewButtonNoShortcut_W(Self: TNewButton; const T: Boolean); 
begin 
  Self.NoShortcut := T; 
end;

procedure RegisterTNewButton_R(CL: TPSRuntimeClassImporter);
begin
  with CL.Add(TNewButton) do
  begin
    RegisterPropertyHelper(@TNewButtonNoShortcut_R,@TNewButtonNoShortcut_W,'NoShortcut');
  end;
end;

最終的に機能RegisterTNewButton_Cさせるには、メソッドScriptClassesLibraryRegister_CとそれRegisterTNewButton_RScriptClassesLibraryRegister_R応じて呼び出す必要があります。

さらに、コンポーネントが 2 回登録されたときに発生する可能性のあるエラーを回避するために、以前に TNewButton を登録した行 (RegisterBidiCtrls_Cおよび) を削除/コメントしました。RegisterBidiCtrls_Rしかし、これが必要かどうかはわかりません。

于 2013-08-12T13:41:37.987 に答える