From 57020f9964c9d392ea35300f2b9638c7afb65eca Mon Sep 17 00:00:00 2001 From: Davide Grilli Date: Wed, 23 Sep 2026 08:29:03 +0200 Subject: [PATCH] Aggiungi il setup per-utente e fissa il DB nella cartella di installazione MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Nuovo installer/PrepStep.iss (Inno Setup 6): installa in %LOCALAPPDATA%\Programs\PrepStep senza diritti di amministratore, con collegamenti nel menu Start al programma e al disinstallatore. Se l'app è già installata chiede se aggiornarla o disinstallarla (Inno da solo aggiornerebbe sempre); con /VERYSILENT aggiorna senza chiedere. Il DB è ora sempre cad_index.db accanto all'eseguibile, cioè nella cartella di installazione: non si ricorda più l'ultimo DB aperto (ultimo_db.txt) e "Apri DB..." vale solo per la sessione. Senza una cartella di lavoro salvata si propone la cartella di installazione invece di quella del DB. Doc aggiornati nello stesso commit: README.md, CLAUDE.md, docs/architettura.md, docs/db-cad-index.md, docs/guida-utente.md, CHANGELOG.md. Co-Authored-By: Claude Opus 5.5 (1M context) --- .gitignore | 3 ++ CHANGELOG.md | 17 +++++++++ CLAUDE.md | 16 ++++++--- PrepStep/Form1.cs | 53 +++++----------------------- README.md | 36 +++++++++++++++---- docs/architettura.md | 37 ++++++++++++++------ docs/db-cad-index.md | 26 ++++++-------- docs/guida-utente.md | 24 +++++++++++-- installer/PrepStep.iss | 78 ++++++++++++++++++++++++++++++++++++++++++ 9 files changed, 209 insertions(+), 81 deletions(-) create mode 100644 installer/PrepStep.iss diff --git a/.gitignore b/.gitignore index b8b7758..4394214 100644 --- a/.gitignore +++ b/.gitignore @@ -40,3 +40,6 @@ publish/ # Impostazioni locali dell'editor .vscode/ + +# Setup generato da Inno Setup (installer/PrepStep.iss) +installer/Output/ diff --git a/CHANGELOG.md b/CHANGELOG.md index bc72938..a55a3d0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,23 @@ Tutte le modifiche rilevanti di questo progetto sono documentate in questo file. Il formato segue [Keep a Changelog](https://keepachangelog.com/it/1.1.0/), e il progetto aderisce a [Semantic Versioning](https://semver.org/lang/it/). +## [Non rilasciato] + +### Aggiunto + +- Setup di installazione per-utente (`installer/PrepStep.iss`, Inno Setup 6): installa in + `%LOCALAPPDATA%\Programs\PrepStep` senza diritti di amministratore, con collegamento nel + menu Start e disinstallazione dal menu Start, da "App installate" o rilanciando il setup (che, se l'app è + già installata, chiede se aggiornarla o disinstallarla). + +### Modificato + +- Il database è sempre `cad_index.db` nella cartella di installazione: non viene più ricordato + l'ultimo DB aperto (`%AppData%/PrepStep/ultimo_db.txt` non è più usato) e "Apri DB..." vale + solo per la sessione. +- Senza una cartella di lavoro salvata si propone la cartella di installazione invece di quella + del DB. + ## [0.9.0] - 2026-09-23 ### Aggiunto diff --git a/CLAUDE.md b/CLAUDE.md index 7404492..d3f0918 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -29,6 +29,13 @@ Pubblicazione come eseguibile standalone (single-file, self-contained, Windows x dotnet publish -c Release -r win-x64 --self-contained true -p:PublishSingleFile=true -o publish ``` +Setup di installazione per-utente (`%LOCALAPPDATA%\Programs\PrepStep`, niente admin), dalla +root del repo dopo il publish — dettagli in `README.md` e `docs/architettura.md`: + +```powershell +& "$env:LOCALAPPDATA\Programs\Inno Setup 6\ISCC.exe" installer\PrepStep.iss +``` + `PrepStep.Tests/` (xUnit) contiene unit e integration test — vedi `dotnet test` da dentro quella cartella. Riferimento al progetto principale via `ProjectReference` + `InternalsVisibleTo` (in `PrepStep.csproj`), così @@ -76,10 +83,11 @@ designer visuale): 1. **Database** — carica/aggiorna `cad_index.db` (`Indexer.ScanAsync`, radice disco di default `X:\` hardcoded in `RadiceDiscoDefault`); un pallino verde/rosso accanto al titolo indica se un DB è caricato. La **cartella di lavoro** (destinazione di CSV/`raw/`/`step/`) - non è più mostrata qui — proposta dall'ultima usata o dalla cartella del DB se non c'è - ancora nulla di salvato, cambiabile in qualunque momento da "File → Scegli cartella di - lavoro..." — vedi `docs/db-cad-index.md` per il dettaglio di schema e risoluzione del - percorso DB. + non è più mostrata qui — proposta dall'ultima usata o dalla cartella di installazione se + non c'è ancora nulla di salvato, cambiabile in qualunque momento da "File → Scegli cartella di + lavoro..." — vedi `docs/db-cad-index.md` per il dettaglio di schema e percorso del DB + (sempre `cad_index.db` nella cartella di installazione; "Apri DB..." vale solo per la + sessione). 2. **Importa Distinta Base** — `DistintaBaseImporter.ConvertiInCsv` genera il CSV componente;descrizione nella cartella di lavoro (da file scelto o trascinato); se il file segue la convenzione del gestionale (`DBP__`), aggiunge l'assieme diff --git a/PrepStep/Form1.cs b/PrepStep/Form1.cs index 5c9b5d7..62d2b57 100644 --- a/PrepStep/Form1.cs +++ b/PrepStep/Form1.cs @@ -1130,20 +1130,18 @@ public partial class Form1 : Form private static readonly string CartellaImpostazioni = Path.Combine( Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "PrepStep"); - private static readonly string PercorsoImpostazioni = Path.Combine(CartellaImpostazioni, "ultimo_db.txt"); private static readonly string PercorsoImpostazioniCartella = Path.Combine(CartellaImpostazioni, "ultima_cartella_lavoro.txt"); /// Propone l'ultima cartella di lavoro usata (se ancora esiste su disco) o, se non - /// c'è ancora una preferenza salvata (o punta a una cartella cancellata), la cartella dove si - /// trova il DB (più sensata dell'eseguibile: quella è dove l'utente tiene il proprio lavoro, - /// non dov'è installata la app). Richiede quindi che InizializzaDatabase sia già stata - /// chiamata. Sempre modificabile con "File → Scegli cartella di lavoro...". + /// c'è ancora una preferenza salvata (o punta a una cartella cancellata), la cartella di + /// installazione (%LOCALAPPDATA%\Programs\PrepStep col setup). Sempre modificabile con + /// "File → Scegli cartella di lavoro...". private void InizializzaCartellaLavoro() { var ultima = LeggiUltimaCartellaLavoro(); _cartellaLavoro = ultima is not null && Directory.Exists(ultima) ? ultima - : (_dbPath is not null ? Path.GetDirectoryName(_dbPath) : null) ?? AppContext.BaseDirectory; + : AppContext.BaseDirectory; AggiornaStatoAvanti(); } @@ -1190,15 +1188,10 @@ public partial class Form1 : Form private void InizializzaDatabase() { - var candidati = new[] - { - LeggiUltimoDbUsato(), - Path.Combine(AppContext.BaseDirectory, "cad_index.db"), - Path.Combine(Directory.GetCurrentDirectory(), "cad_index.db"), - }; - _dbPath = candidati.FirstOrDefault(p => p is not null && File.Exists(p)); - - if (_dbPath is null) + // Il DB sta sempre nella cartella di installazione; "Apri DB..." ne carica un altro + // solo per la sessione corrente, senza ricordarlo al prossimo avvio. + string predefinito = Path.Combine(AppContext.BaseDirectory, "cad_index.db"); + if (!File.Exists(predefinito)) { _lblStatus.Text = "Database non trovato. Usa 'Apri DB...' per selezionarlo oppure 'Aggiorna indice' per crearlo."; _lblDb.Text = "Nessun database caricato. Premi 'Aggiorna indice' per crearlo da X:\\, oppure 'Apri DB...' se ne hai gi\u00e0 uno."; @@ -1209,7 +1202,7 @@ public partial class Form1 : Form return; } - CaricaDatabase(_dbPath); + CaricaDatabase(predefinito); } private void ScegliDatabase() @@ -1242,7 +1235,6 @@ public partial class Form1 : Form ? $"Ultimo aggiornamento indice: {ultimaScansione.ToLocalTime():dd/MM/yyyy HH:mm}" : "Ultimo aggiornamento indice: sconosciuto"; _lblStatus.Text = "Pronto."; - SalvaUltimoDbUsato(path); } catch (Exception ex) { @@ -1254,33 +1246,6 @@ public partial class Form1 : Form AggiornaStatoAvanti(); } - /// Ricorda l'ultimo DB caricato con successo, così al prossimo avvio si - /// ricarica automaticamente anche se l'eseguibile gira da una cartella diversa. - private static string? LeggiUltimoDbUsato() - { - try - { - return File.Exists(PercorsoImpostazioni) ? File.ReadAllText(PercorsoImpostazioni).Trim() : null; - } - catch (IOException) - { - return null; - } - } - - private static void SalvaUltimoDbUsato(string path) - { - try - { - Directory.CreateDirectory(CartellaImpostazioni); - File.WriteAllText(PercorsoImpostazioni, path); - } - catch (IOException) - { - // ponytail: non critico se non si riesce a salvare, si torna a chiedere "Apri DB..." la prossima volta - } - } - private async void AggiornaIndice() { string dbPath = _dbPath ?? Path.Combine(AppContext.BaseDirectory, "cad_index.db"); diff --git a/README.md b/README.md index 00aef79..b801d99 100644 --- a/README.md +++ b/README.md @@ -9,14 +9,14 @@ passaggio, non lo sostituisce. ## Funzionalità -1. **Indice CAD** — all'avvio carica automaticamente l'ultimo `cad_index.db` - usato (ricordato tra un avvio e l'altro). Se manca, si può selezionare un DB - esistente con **Apri DB...** o generarne uno nuovo con **Aggiorna - indice**, che scansiona il disco (di default `X:\`, tutte le cartelle di primo +1. **Indice CAD** — all'avvio carica automaticamente `cad_index.db` dalla + cartella di installazione (`%LOCALAPPDATA%\Programs\PrepStep`). Se manca, lo si + crea con **Aggiorna indice**, oppure si apre un altro DB per la sola sessione + con **Apri DB...**. **Aggiorna indice** che scansiona il disco (di default `X:\`, tutte le cartelle di primo livello che trova) e indicizza tutti i file. La **cartella di lavoro** (dove finiscono il CSV e la cartella `raw/`; gli STEP esportati con Creo vanno in - `step/`, dentro la stessa cartella) è proposta automaticamente e ricordata tra - un avvio e l'altro, modificabile in qualunque momento da **File → Scegli + `step/`, dentro la stessa cartella) è l'ultima scelta (ricordata tra un avvio e + l'altro) o, la prima volta, la cartella di installazione, modificabile in qualunque momento da **File → Scegli cartella di lavoro...**. 2. **Importa Distinta Base** — trascina (o scegli da file) l'estrazione `.xls`/`.xml` del gestionale (foglio "Distinta Base", colonne @@ -86,6 +86,30 @@ L'eseguibile risultante è in `PrepStep\publish\PrepStep.exe` — un unico file, si copia e si lancia su un'altra macchina Windows senza bisogno di .NET installato. +## Setup di installazione + +Per distribuire l'app agli utenti si genera un setup con [Inno Setup 6](https://jrsoftware.org/isinfo.php) +(una volta sola: `winget install JRSoftware.InnoSetup --scope user`). Dalla root del repo, +**dopo** il `dotnet publish` qui sopra: + +```powershell +& "$env:LOCALAPPDATA\Programs\Inno Setup 6\ISCC.exe" installer\PrepStep.iss +``` + +Produce `installer\Output\PrepStep-Setup-.exe` (versione letta dall'exe, cioè +`` del csproj). Il setup: + +- installa **solo per l'utente corrente**, in `%LOCALAPPDATA%\Programs\PrepStep`, senza + chiedere i diritti di amministratore; +- crea nel menu Start i collegamenti al programma e al disinstallatore (quello sul desktop + è facoltativo); +- compare in "Impostazioni → App installate", da cui si disinstalla. + +Se l'app è già installata, il setup chiede prima cosa fare: **Sì** aggiorna/reinstalla (DB e +impostazioni restano), **No** disinstalla, **Annulla** esce. Installazione silenziosa (aggiorna +senza chiedere) — es. per distribuirla da script: +`PrepStep-Setup-.exe /VERYSILENT /SUPPRESSMSGBOXES`. + ## Struttura del progetto Tutto il codice è in `PrepStep/` (unico progetto nella solution, GUI e diff --git a/docs/architettura.md b/docs/architettura.md index 13159ba..1826222 100644 --- a/docs/architettura.md +++ b/docs/architettura.md @@ -119,8 +119,8 @@ trascinano i `.asm` su Creo Distributed Batch, che scrive in `step/`. silenziosamente quelli irraggiungibili (share offline/permessi). - `PulisciRawEStep` — svuota `raw/` e `step/` nella cartella di lavoro (manutenzione, richiede conferma). - - `InizializzaDatabase` / `ScegliDatabase` — localizzazione del DB (ultimo usato, salvato in - `%AppData%/PrepStep/ultimo_db.txt`, o `cad_index.db` accanto all'eseguibile). + - `InizializzaDatabase` / `ScegliDatabase` — localizzazione del DB (sempre `cad_index.db` accanto + all'eseguibile; "Apri DB..." ne carica un altro solo per la sessione). - `InizializzaCartellaLavoro` / `ScegliCartellaLavoro` — stesso pattern per la cartella di lavoro (`ultima_cartella_lavoro.txt`), fallback `AppContext.BaseDirectory` se non c'è ancora nulla di salvato: nessuna dipendenza da un marker di repo, funziona identica @@ -242,21 +242,38 @@ completi". ## Persistenza - **DB** (`cad_index.db`, SQLite) — vedi tabella `files`/vista `files_ultima_versione` sopra. - Percorso ricordato tra un avvio e l'altro in `%AppData%/PrepStep/ultimo_db.txt` - (`SalvaUltimoDbUsato`/`LeggiUltimoDbUsato`), scritto ogni volta che si carica un DB - (all'avvio se già noto, oppure da "Apri DB..." o al termine di "Aggiorna indice"); se il - file non c'è o punta a un percorso cancellato, `InizializzaDatabase` ripiega su - `cad_index.db` accanto all'eseguibile o nella working directory. Radice disco di scansione + Sempre `cad_index.db` accanto all'eseguibile (`AppContext.BaseDirectory`, cioè la cartella + di installazione): `InizializzaDatabase` carica solo quello, e "Aggiorna indice" lo crea lì + se manca. "Apri DB..." carica un altro file solo per la sessione corrente, senza + ricordarlo. Radice disco di scansione di default `X:\` (`Form1.RadiceDiscoDefault`, hardcoded). -- **Cartella di lavoro** — stesso meccanismo del DB sopra, salvata in +- **Cartella di lavoro** — ricordata tra un avvio e l'altro in `%AppData%/PrepStep/ultima_cartella_lavoro.txt`; se non c'è una preferenza salvata (o punta - a una cartella cancellata) si propone la cartella del DB caricato, o in ultima istanza - `AppContext.BaseDirectory`; cambiabile in qualunque momento da "File → Scegli cartella di + a una cartella cancellata) si propone la cartella di installazione + (`AppContext.BaseDirectory`); cambiabile in qualunque momento da "File → Scegli cartella di lavoro...". Tutti i file generati a valle ci finiscono dentro: il CSV della distinta, `raw/` (CAD dei componenti e sotto-componenti); `step/` non è scritta dall'app ma è dove l'utente esporta gli STEP a mano con Creo Distributed Batch, a partire dai file trascinati da `raw/` in fase 5. +## Installazione + +`installer/PrepStep.iss` (Inno Setup 6) impacchetta `PrepStep/publish/PrepStep.exe` in un +setup **per-utente** (`PrivilegesRequired=lowest`, quindi `{autopf}` = +`%LOCALAPPDATA%\Programs`, cartella `PrepStep`): niente admin, e la cartella resta scrivibile — +cosa che serve, perché `cad_index.db` e (di default) la cartella di lavoro con `raw/` +stanno accanto all'eseguibile (`AppContext.BaseDirectory`, vedi Persistenza). In `C:\Program Files` fallirebbe per un utente +normale. Versione del setup letta dall'`exe` (ProductVersion, tolto il `+`), quindi +basta cambiare `` nel csproj. L'`AppId` fisso fa riconoscere a Windows le versioni +nuove come aggiornamento della stessa app: non va cambiato +(`AppGuid` nello script). Se l'app risulta già installata (chiave `…\Uninstall\{AppGuid}_is1` +in HKCU), `InitializeSetup` nella sezione `[Code]` chiede se aggiornare o disinstallare (lancia +l'`UninstallString`), perché Inno da solo aggiornerebbe sempre; con `/VERYSILENT` non chiede. +La disinstallazione rimuove solo +i file installati: `cad_index.db`, `raw/`/`step/`/CSV creati accanto all'exe e +`%AppData%/PrepStep/` restano. +Comandi di build del setup nel `README.md`. + ## Script standalone (`scripts/`) C# file-based apps (.NET 10, `dotnet run scripts/Nome.cs -- arg1 arg2`, nessun `.csproj`, diff --git a/docs/db-cad-index.md b/docs/db-cad-index.md index 6f294f8..e3d32b5 100644 --- a/docs/db-cad-index.md +++ b/docs/db-cad-index.md @@ -109,24 +109,20 @@ sulla share, non tipicamente cercato dalla UI). ## Come l'app trova il DB all'avvio -`Form1.InizializzaDatabase` prova, in ordine, i seguenti candidati e usa il primo che esiste -su disco: +`Form1.InizializzaDatabase` carica sempre e solo `cad_index.db` accanto all'eseguibile +(`AppContext.BaseDirectory`: con il setup è `%LOCALAPPDATA%\Programs\PrepStep`). Nessun +percorso viene ricordato fra un avvio e l'altro. -1. l'ultimo DB caricato con successo, salvato in - `%AppData%/PrepStep/ultimo_db.txt` (`Form1.LeggiUltimoDbUsato`/`SalvaUltimoDbUsato`) -2. `cad_index.db` accanto all'eseguibile (`AppContext.BaseDirectory`) -3. `cad_index.db` nella working directory corrente - -Se nessuno dei tre esiste, la fase 1 resta bloccata su "Database non trovato" finché l'utente -non preme "Apri DB..." (`Form1.ScegliDatabase`, file picker libero) o "Aggiorna indice" -(`Form1.AggiornaIndice`, che crea `cad_index.db` da zero accanto all'eseguibile se non c'è -ancora un `_dbPath`). +Se non esiste, la fase 1 resta bloccata su "Database non trovato" finché l'utente non preme +"Aggiorna indice" (`Form1.AggiornaIndice`, che crea `cad_index.db` da zero accanto +all'eseguibile) o "Apri DB..." (`Form1.ScegliDatabase`, file picker libero: il DB scelto vale +solo per la sessione corrente, e "Aggiorna indice" aggiorna quello). **Attenzione in sviluppo (dotnet run / IDE):** `AppContext.BaseDirectory` è la cartella di -build (`PrepStep/bin/Release/net10.0-windows` o `Debug/...`), non la radice del repo. Se in -quella cartella finisce per errore una copia di `cad_index.db` (es. creata lì da una vecchia -sessione), l'app la userà invece di quella nella radice del repo, e le due copie divergeranno -a ogni "Aggiorna indice" fatto nell'uno o nell'altro ambiente. Se i risultati di una ricerca +build (`PrepStep/bin/Release/net10.0-windows` o `Debug/...`), non la radice del repo. L'app usa +quindi la copia di `cad_index.db` in quella cartella (creandola lì al primo "Aggiorna +indice"), non quella nella radice del repo né quella installata: per usare un altro DB in +sviluppo va aperto con "Apri DB..." a ogni avvio. Se i risultati di una ricerca sembrano incoerenti con quello che ti aspetti di vedere sul DB "giusto", controlla con "Apri DB..." quale file è effettivamente caricato (mostrato in fase 1 accanto al conteggio dei file indicizzati) prima di sospettare un bug nella ricerca. diff --git a/docs/guida-utente.md b/docs/guida-utente.md index 7eb91fb..2c264e6 100644 --- a/docs/guida-utente.md +++ b/docs/guida-utente.md @@ -7,6 +7,23 @@ fase vedi [`architettura.md`](architettura.md); questa guida si ferma a cosa cli cosa vede l'utente. La stessa sintesi è disponibile anche dentro l'app da **Aiuto → Guida** (F1). +## Installazione + +1. Lancia `PrepStep-Setup-.exe` (non servono i diritti di amministratore). +2. Alla fine lascia spuntato "Avvia Cevolani StepPrep", oppure aprilo dal menu Start. + +Il programma si installa in `%LOCALAPPDATA%\Programs\PrepStep`. Il database `cad_index.db` sta sempre in questa cartella. + +Se il programma è già installato, il setup chiede cosa fare: + +- **Sì** — lo aggiorna (o reinstalla): database e cartella di lavoro restano quelli di prima; +- **No** — lo disinstalla; +- **Annulla** — esce senza fare nulla. + +Per **disinstallarlo** si può anche usare menu Start → "Disinstalla Cevolani StepPrep", oppure +Impostazioni → App installate → Cevolani StepPrep → Disinstalla (il +database `cad_index.db` e le impostazioni non vengono cancellati, vedi sotto). + ## Prima di iniziare - Serve accesso alla share di rete con i file CAD (di default `X:\`). @@ -39,9 +56,12 @@ file e la data dell'ultimo aggiornamento. minuto la prima volta, i giri successivi sono più veloci perché aggiornano solo quello che è cambiato. - **Se hai già un database da un'altra postazione o cartella**: premi **Apri DB...** e - selezionalo a mano. + selezionalo a mano. Vale solo finché non chiudi il programma: al prossimo avvio si riparte + dal database nella cartella di installazione. Per usarlo sempre, copialo in + `%LOCALAPPDATA%\Programs\PrepStep` come `cad_index.db`. - La **cartella di lavoro** (dove l'app scrive il CSV della distinta e la cartella - `raw/`) è scelta automaticamente e ricordata tra un avvio e l'altro; per cambiarla usa + `raw/`) è ricordata tra un avvio e l'altro; la prima volta è la cartella di installazione + (`%LOCALAPPDATA%\Programs\PrepStep`); per cambiarla usa **File → Scegli cartella di lavoro...**. Premi **Avanti** quando il database è caricato. diff --git a/installer/PrepStep.iss b/installer/PrepStep.iss new file mode 100644 index 0000000..176e22e --- /dev/null +++ b/installer/PrepStep.iss @@ -0,0 +1,78 @@ +; Setup per-utente di Cevolani StepPrep: installa in %LOCALAPPDATA%\Programs\PrepStep +; senza richiedere diritti di amministratore. +; Prima: dotnet publish (vedi README), poi: iscc installer\PrepStep.iss + +#define Exe "..\PrepStep\publish\PrepStep.exe" +; Versione letta dall'exe ( nel csproj), tolto l'eventuale "+" di .NET. +#define AppVersion GetStringFileInfo(Exe, "ProductVersion") +#if Pos("+", AppVersion) > 0 + #define AppVersion Copy(AppVersion, 1, Pos("+", AppVersion) - 1) +#endif +; Non cambiare AppGuid: è quello che fa riconoscere a Windows gli aggiornamenti come la stessa app. +#define AppGuid "FAC1B760-4735-422F-86F0-888484CF2830" + +[Setup] +AppId={{{#AppGuid}} +AppName=Cevolani StepPrep +AppVersion={#AppVersion} +AppPublisher=Cevolani +; Con PrivilegesRequired=lowest {autopf} diventa %LOCALAPPDATA%\Programs. +PrivilegesRequired=lowest +DefaultDirName={autopf}\PrepStep +DisableDirPage=yes +DisableProgramGroupPage=yes +ArchitecturesAllowed=x64compatible +ArchitecturesInstallIn64BitMode=x64compatible +SetupIconFile=..\PrepStep\app.ico +UninstallDisplayIcon={app}\PrepStep.exe +UninstallDisplayName=Cevolani StepPrep +OutputDir=Output +OutputBaseFilename=PrepStep-Setup-{#AppVersion} +Compression=lzma2 +SolidCompression=yes + +[Languages] +Name: "it"; MessagesFile: "compiler:Languages\Italian.isl" + +[Tasks] +Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked + +[Files] +Source: "{#Exe}"; DestDir: "{app}"; Flags: ignoreversion + +[Icons] +Name: "{autoprograms}\Cevolani StepPrep"; Filename: "{app}\PrepStep.exe" +Name: "{autodesktop}\Cevolani StepPrep"; Filename: "{app}\PrepStep.exe"; Tasks: desktopicon +Name: "{autoprograms}\Disinstalla Cevolani StepPrep"; Filename: "{uninstallexe}" + +[Run] +Filename: "{app}\PrepStep.exe"; Description: "{cm:LaunchProgram,Cevolani StepPrep}"; Flags: nowait postinstall skipifsilent + +[Code] +{ Se l'app è già installata, chiede se aggiornarla o disinstallarla (Inno da solo aggiornerebbe + sempre, senza offrire la disinstallazione). In modalità silenziosa aggiorna senza chiedere. } +function InitializeSetup(): Boolean; +var + Disinstallatore: String; + Codice: Integer; +begin + Result := True; + if WizardSilent then + Exit; + if not RegQueryStringValue(HKCU, + 'Software\Microsoft\Windows\CurrentVersion\Uninstall\{' + '{#AppGuid}' + '}_is1', + 'UninstallString', Disinstallatore) then + Exit; + case MsgBox('Cevolani StepPrep è già installato.' + #13#10#13#10 + + 'Sì: aggiorna / reinstalla' + #13#10 + + 'No: disinstalla' + #13#10 + + 'Annulla: esci senza fare nulla', mbConfirmation, MB_YESNOCANCEL) of + IDNO: + begin + Exec(RemoveQuotes(Disinstallatore), '', '', SW_SHOW, ewWaitUntilTerminated, Codice); + Result := False; + end; + IDCANCEL: + Result := False; + end; +end;