2016-06-20 3 views
1

xcopyを使用して特定のフォルダ内の特定のファイル形式を一覧表示するバッチファイル(設定チェンジャー)この名前を使用してそのファイルを別の場所にコピーします。Inno Setup - 外部ソース(ファイルまたはフォルダの内容)からのコンポーネント/タイプの動的リストを作成

まずXCOPYがバックアップ(ローリングバックアップのみ1コピー)は、ファイルのコピーを行うように拡張子がバッチで固定されている。このを必要なファイル名の本体だけが素晴らしい作品が、私がしようとするのが大好きだ(オリジナルのコピーを作成し、これをInno Setupで行うと、きれいなGUIが得られます。

特定の固定フォルダにあるこのファイルのリストからコンポーネント/タイプのリストを作成したいのですが、これらの名前のiniファイルを作成することもできます(余分なステップがあるかもしれませんが、おそらくコントロールをより良くしてください)これが可能にならない主な問題は、配列であるエントリの数が分からないということです1エントリまたはファイルのみ1オプション(1またはa) ct 1 of 4(a、b、cまたはd)。名前/説明を作成するためにファイル名を抽出します。

完了すると、バッチと同じタスクが実行されます(バックアップは常にstart.iniのように簡単です)。 example1.iniを上書きしてstart.iniを上書きする

iniは、後で実行されるアクションを変更するために新しいセクションを追加すると想像できるように、最も柔軟性があります。

この可能性がありますか、またはこのプログラムを伸ばしすぎていますか。私のバッチが今働いているので急いではいませんが、タイピングや手作業が少なくて済むので、継続的に使用できます。

コンテンツをダイアログウィンドウに表示する例が見つかりましたが、これを使用してコンポーネントを設定する方法を理解できませんでした。 TLama - List all files in a directory

答えて

1

実行時にコンポーネントを動的に作成することはできません(コンパイル時に行うことはできます)。


しかし、それは、CreateCustomPageTNewCheckListBoxを使用して、カスタム動的コンポーネントのようなページを実装するのは難しいことではありません。

次に、CurStepChanged(ssInstall)では、選択したファイル/コンポーネントを必要に応じて処理します。これにより

Dynamic components list

[Code] 

const 
    SourcePath = 'C:\somepath'; 

var 
    CustomSelectTasksPage: TWizardPage; 
    ComponentsList: TNewCheckListBox; 

procedure InitializeWizard(); 
var 
    FindRec: TFindRec; 
    SelectComponentsLabel: TNewStaticText; 
begin 
    CustomSelectTasksPage := 
    CreateCustomPage(
     wpSelectComponents, SetupMessage(msgWizardSelectComponents), 
     SetupMessage(msgSelectComponentsDesc)); 

    SelectComponentsLabel := TNewStaticText.Create(WizardForm); 
    SelectComponentsLabel.Parent := CustomSelectTasksPage.Surface; 
    SelectComponentsLabel.Top := 0; 
    SelectComponentsLabel.Left := 0; 
    SelectComponentsLabel.Width := CustomSelectTasksPage.Surface.Width; 
    SelectComponentsLabel.AutoSize := False; 
    SelectComponentsLabel.ShowAccelChar := False; 
    SelectComponentsLabel.WordWrap := True; 
    SelectComponentsLabel.Caption := SetupMessage(msgSelectComponentsLabel2); 
    WizardForm.AdjustLabelHeight(SelectComponentsLabel); 

    ComponentsList := TNewCheckListBox.Create(WizardForm); 
    ComponentsList.Parent := CustomSelectTasksPage.Surface; 
    ComponentsList.Top := 
    SelectComponentsLabel.Top + SelectComponentsLabel.Height + ScaleY(8); 
    ComponentsList.Left := 0; 
    ComponentsList.Width := CustomSelectTasksPage.Surface.Width; 
    ComponentsList.Height := CustomSelectTasksPage.Surface.Height - ComponentsList.Top; 

    if FindFirst(ExpandConstant(AddBackslash(SourcePath) + '*.dat'), FindRec) then 
    begin 
    try 
     repeat 
     ComponentsList.AddCheckBox(FindRec.Name, '', 0, False, True, False, False, nil); 
     until not FindNext(FindRec); 
    finally 
     FindClose(FindRec); 
    end; 
    end; 
end; 

procedure CurStepChanged(CurStep: TSetupStep); 
var 
    I: Integer; 
    FileName: string; 
    SourceFilePath: string; 
    TargetFilePath: string; 
begin 
    if CurStep = ssInstall then 
    begin 
    for I := 0 to ComponentsList.Items.Count - 1 do 
    begin 
     if ComponentsList.Checked[I] then 
     begin 
     FileName := ComponentsList.Items[I]; 
     SourceFilePath := AddBackslash(SourcePath) + FileName; 
     TargetFilePath := AddBackslash(ExpandConstant('{app}')) + FileName; 
     if FileCopy(SourceFilePath, TargetFilePath, False) then 
     begin 
      Log(Format('Installed "%s".', [FileName])); 
     end 
      else 
     begin 
      Log(Format('Failed to install "%s".', [FileName])); 
     end; 
     end; 
    end; 
    end; 
end; 
+0

私はかなり近い新しい実行ファイルを、作るために編集することを必要とせずに再コンパイルすることができますスクリプトを作成することができます。動的なランタイムコンポーネントを実行することは不可能かもしれないと私は考えました。ありがとうございました。 – CADuser

+0

「コンポーネント」ページを複製するコードは約20行です。これは、あなた自身でコードを作成する必要があります。 –

+0

私はいくつかの同僚に渡すために実行可能なスケルトンを構築し、それをiniファイルのすべての外部設定で駆動することを望んでいました。だから時にはiniに応じて2つのオプションが時には10かもしれない。この回答は個人的な使用のために働くので、私はファイルを修正してから新しいファイルを作成することができます。それらは数ヶ月ごとに変化します。だから、答えはいいですし、私は専念するプログラミングの努力なしにあまりにも多くを望んでいたと思いました。 – CADuser

関連する問題