Inno setup Pytanie o zapętlenie makra, czy da się w ogóle?

0

W inno setup (task) Mam taki kod

[Tasks]
#if defined GameEXE1 && DesktopIconSelect1 != ""
Name: "DesktopIcon1"; Description: "{#DesktopIconSelect1}";
#endif
#if defined GameEXE2 && DesktopIconSelect2 != ""
Name: "DesktopIcon2"; Description: "{#DesktopIconSelect2}";
#endif
#if defined GameEXE3 && DesktopIconSelect3 != ""
Name: "DesktopIcon3"; Description: "{#DesktopIconSelect3}";
#endif
#if defined GameEXE4 && DesktopIconSelect4 != ""
Name: "DesktopIcon4"; Description: "{#DesktopIconSelect4}";
#endif
#if defined GameEXE5 && DesktopIconSelect5 != ""
Name: "DesktopIcon5"; Description: "{#DesktopIconSelect5}";
#endif
#if defined GameEXE6 && DesktopIconSelect6 != ""
Name: "DesktopIcon6"; Description: "{#DesktopIconSelect6}";
#endif
#if defined GameEXE7 && DesktopIconSelect7 != ""
Name: "DesktopIcon7"; Description: "{#DesktopIconSelect7}";
#endif
#if defined GameEXE8 && DesktopIconSelect8 != ""
Name: "DesktopIcon8"; Description: "{#DesktopIconSelect8}";
#endif
#if defined GameEXE9 && DesktopIconSelect9 != ""
Name: "DesktopIcon9"; Description: "{#DesktopIconSelect9}";
#endif
#if defined GameEXE10 && DesktopIconSelect10 != ""
Name: "DesktopIcon10"; Description: "{#DesktopIconSelect10}";
#endif

Da się to jakoś zapętlić ? Znacie sposoby?

Pozdrawiam.

2

Cześć, z tego co widzę, masz wiele definicji zadań warunkowych i szukasz sposobu na uproszczenie lub zautomatyzowanie tego za pomocą mechanizmu zapętlania?.
Ponieważ preprocesor Inno Setup nie obsługuje bezpośrednio tradycyjnych pętli, trzeba by zastosować technikę obejmującą rekurencję.

Ja użyłbym makra rekurencyjnego, aby warunkowo wygenerować te zadania.

#define NumTasks 10

[Tasks]

#define TaskEntry(Index) \
    "#if defined(GameEXE" + Str(Index) + ") && DesktopIconSelect" + Str(Index) + " != \"\" \n" + \
    "Name: \"DesktopIcon" + Str(Index) + "\"; Description: \"{#DesktopIconSelect" + Str(Index) + "}\"; \n" + \
    "#endif \n" + \
    (Index < NumTasks ? TaskEntry(Index + 1) : "")

#emit TaskEntry(1)

Jeżeli twoja wersja kompilatora nie poradzi sobie z tym kodem i nie chce sie tobie recznie wypisywac od 1 do 10 (bo widze do tylu masz), napisz w python prosty skrypt ktory wyegenruje plik GeneratedTasks.iss

num_tasks = 10

with open('GeneratedTasks.iss', 'w') as f:
    for i in range(1, num_tasks + 1):
        f.write("#if defined(GameEXE{0}) && DesktopIconSelect{0} != \"\" \n".format(i))
        f.write("Name: \"DesktopIcon{0}\"; Description: \"{{#DesktopIconSelect{0}}}\"; \n".format(i))
        f.write("#endif \n")

print("Tasks have been generated in GeneratedTasks.iss")

Po uruchomieniu tego skryptu w Pythonie otrzymasz plik o nazwie GeneratedTasks.iss zawierający definicje zadań, które można następnie włączyć do głównego skryptu Inno Setup w następujący sposób:

[Tasks]
#include "GeneratedTasks.iss"

0

Dzięki, sprawdzę, nigdy bym na to nie wpadl.

1

Możesz tez spróbować tak, dla uproszczenia (bardziej czytelne) tyle ze wiecej lini kodu. Ale to only dla przykladu:/


#define NumTasks 10

[Tasks]

#define TaskEntry(Index) \
    Local[0] = Str(Index), \
    Local[1] = "GameEXE" + Local[0], \
    Local[2] = "DesktopIconSelect" + Local[0], \
    Local[3] = "DesktopIcon" + Local[0], \
    "#if defined(" + Local[1] + ") && " + Local[2] + " != \"\" \n" + \
    "Name: \"" + Local[3] + "\"; Description: \"{#" + Local[2] + "}\"; \n" + \
    "#endif \n" + \
    (Index < NumTasks ? TaskEntry(Index + 1) : "")

#emit TaskEntry(1)

1 użytkowników online, w tym zalogowanych: 0, gości: 1