2016-06-20 11 views
1

Ich habe eine Batch-Datei (Setting Changer), die Xcopy verwendet, um bestimmte Dateiformate in einem bestimmten Ordner aufzulisten, ermöglicht mir dann zu tippen In einem der Namen verwendet das Skript diesen Namen, um diese Datei an einen anderen Ort zu kopieren.Inno Setup - Erstellen Sie eine dynamische Liste von Komponenten/Typen von externen Quelle (Datei oder Ordner Inhalt)

Zuerst xcopy erstellt eine Kopie des Originals als Backup (Rollback nur 1 Kopie) dann tut die Datei kopieren (Erweiterung wird im Batch nur Körper des Dateinamens benötigt Dies funktioniert großartig, aber ich würde gerne versuchen und Tun Sie dies in Inno-Setup für eine nette saubere GUI

Ich möchte die Liste der Komponenten/Typen aus dieser Liste von Dateien in einem bestimmten festen Ordner auffüllen oder sogar eine Ini-Datei mit diesen Namen in (Extra-Schritt, aber vielleicht bessere Kontrolle). Hauptproblem, das dies verhindern könnte, ist nicht zu wissen, wie viele Einträge es ein Array wäre.Wenn nur 1 Eintrag oder Datei nur 1 Option (1 oder a) wenn 4 dann Benutzer kann auswählen ct 1 von 4 (a, b, c oder d). Ich würde den Dateinamen extrahieren, um den Namen/die Beschreibung zu erstellen.

dann nach Abschluss die gleiche Aufgabe wie meine Batch passieren würde, Backup (einfach immer den gleichen Namen wie start.ini) dann kopieren Sie die Datei z. example1.ini und überschreiben start.ini

ini könnte am flexibelsten sein, da ich mir vorstellen kann, später neue Abschnitte hinzuzufügen, um die ausgeführten Aktionen zu ändern.

Ist das möglich oder streckt dieses Programm zu weit. Keine Eile, da mein Stapel jetzt funktioniert, aber je weniger Tippen und manuelle Schritte desto besser für die weitere Verwendung.

Ich habe ein Beispiel gefunden, um den Inhalt in einem Dialogfenster aufzulisten, aber ich konnte nicht herausfinden, wie man damit Komponenten auffüllt. TLama - List all files in a directory

Antwort

1

Sie können die Komponenten nicht dynamisch zur Laufzeit erstellen (Sie können zur Kompilierzeit).


Aber es ist nicht schwierig, eine benutzerdefinierte dynamische Komponenten artige Seite mit dem CreateCustomPage und die TNewCheckListBox zu implementieren.

Dann in der CurStepChanged(ssInstall) verarbeiten Sie die ausgewählten Dateien/Komponenten wie Sie brauchen.

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

Damit konnte ich ein Skript erstellen, die eine neue ausführbare Datei zu machen bearbeitet werden, ohne dass neu kompiliert werden können, um, das ist ziemlich nah dran. Ich dachte, es könnte unmöglich sein, dynamische Laufzeitkomponenten zu machen. Vielen Dank. – CADuser

+0

Es sind nur die etwa 20 Codezeilen, um die "Komponenten" -Seite zu klonen, zusätzlich dazu, was Sie sowieso selbst programmieren müssten. –

+0

Ich hatte gehofft, ein ausführbares Skelett zu erstellen, um es an ein paar Kollegen zu übergeben und es dann mit allen externen Konfigurationen in einer INI-Datei zu fahren. Also manchmal 2 Optionen manchmal vielleicht 10 abhängig von Ini. Diese Antwort funktioniert für den persönlichen Gebrauch, da ich eine neue Datei erstellen kann, sobald ich meine Dateien repariert habe. Diese ändern sich alle paar Monate. Also, die Antwort ist gut und ich dachte mir, dass ich zu viel ohne einen gewissen Programmieraufwand wollte. – CADuser

Verwandte Themen