Creazione maschere tipo "installer"

venerdì 27 marzo 2009 - 00.13

shaolin Profilo | Newbie

Ciao a tutti.
Avrei bisogno di un consiglio su come impostare un programma che abbia l'effetto tipo un classico installer, ovvero parto da una form e cliccando avanti (ed eventualmente indietro) la form si modifica con i controlli della schermata successiva (o precedente).
Vorrei fare un lavoro pulito e ordinato quindi non so se sia il caso di crearmi i controlli di tutte le videate in pannelli da rendere visibili a seconda dello step in corso o simili...
Mi sapete dare qualche indicazione?

Grazie!!

Shao.

cesconix Profilo | Junior Member

Prima che inizi a creare da zero un installer per il tuo programma, non so se ne sei al corrente ma esistono già moltissimi tool gratuiti che ti permettono di creare le interfacce di installazione personalizzate, quindi perchè reinventare la ruota?

shaolin Profilo | Newbie

A parte che è sempre un buon esercizio, poi all'interno di questo installer devo fare cose che nessun installer fa. Non devo solo copiare file, registrare componenti et simili; devo anche manipolare dei file di testo e fare altre amenità (ma questo è un altro discorso).

freeteo Profilo | Guru

Ciao,
io avevo un problema simile, ovvero in un pacchetto di setup della mia applicazione dovevo eseguire delle funzionalità particolari, quindi diciamo avevo bisogno di scrivere codice .net puro.

Alla fine l'ho risolto "artigianalmente" ossia ho fatto una WindowsForm normale, dentro alla quale ovviamente ho potuto fare tutto il codice che mi serviva, ho gestito il wizard facendo corrispondere ogni passo ad una tab di un TabContainer (e quindi al next spostare il SelectedIndex della tabcontainer) ed ho nascosto le tab mettendoci sopra una label, in modo che l'utente clicchi solo "avanti/indietro" e non sulla tab.

Il codice è più o meno questo:

[RunInstaller(true)] public partial class ProjectInstaller : Installer { public ProjectInstaller() { InitializeComponent(); } protected override void OnAfterInstall(IDictionary savedState) { base.OnAfterInstall(savedState); //--- dopo l'installazione faccio le operazioni a mano e devo impostare un thread così //--- perchè altrimenti i browserforfoder non vanno, ma dimmi te... Thread thread = new Thread(new ThreadStart(Configura)); thread.SetApartmentState(ApartmentState.STA); thread.Start(); thread.Join(); } private void Configura() { FormConfigurazione frm = new FormConfigurazione(); //--- la form mi scrive gli ini quindi devo dargli il path di installazione frm.PathDestinazione = this.Context.Parameters["assemblypath"]; frm.Focus(); frm.ShowDialog(); ....
la cosa poco elegante è che non è integrata nell'installer della mia applicazione, è una form che viene avviata sopra mentre quella di InstallShield rimane appesa sotto...però vedendo il grossisimo vantaggio che mi ha dato farmi quello che volevo dentro, ho valutato assolutamente trascurabile questa cosa...


Ciao.

Matteo Raumer
[MVP Visual C#]
http://blogs.dotnethell.it/freeteo

shaolin Profilo | Newbie

>Ciao,
>io avevo un problema simile, ovvero in un pacchetto di setup
>della mia applicazione dovevo eseguire delle funzionalità particolari,
>quindi diciamo avevo bisogno di scrivere codice .net puro.
>
>Alla fine l'ho risolto "artigianalmente" ossia ho fatto una WindowsForm
>normale, dentro alla quale ovviamente ho potuto fare tutto il
>codice che mi serviva, ho gestito il wizard facendo corrispondere
>ogni passo ad una tab di un TabContainer (e quindi al next spostare
>il SelectedIndex della tabcontainer) ed ho nascosto le tab mettendoci
>sopra una label, in modo che l'utente clicchi solo "avanti/indietro"
>e non sulla tab.
>
> [CUT]

Ciao!
Effettivamente di soluzioni ce ne sarebbero, volendo anche la più
brutta che è quella di lavorare con i controlli (visibili/invisibili)
Una variazione al tema che ho provato è quella di utilizzare UserControl
ognuno dei quali rappresenta una form. Ogni UC viene inserito nella form
principale come form figlia.
Il codice è il seguente:

public partial class FormPadre : Form
{
private int StatoAvanzamento;
private int TopFiglio;
private int LeftFiglio;
private List<UserControl> m_listaUC;

public FormPadre()
{
StatoAvanzamento = 0;
TopFiglio = 200;
LeftFiglio = 20;
InitializeComponent();
m_listaUC = new List<UserControl>();
m_listaUC.Add(new UC_Welcome(TopFiglio, LeftFiglio, this));
}

private void button1_Click(object sender, EventArgs e)
{
FormSuccessiva();
}

private void FormSuccessiva()
{
m_listaUC[StatoAvanzamento].Show();
StatoAvanzamento++;
}

private void FormPadre_Load(object sender, EventArgs e)
{
FormSuccessiva();
}
}

Creo una lista tipizzata di UC passando la posizione e il padre.
Questa classe non è ancora completa, però si può vedere che al caricamento
della form principale viene inserito e visualizzato il primo UC.

Sicuramente sarà migliorabile, anzi, se a qualcuno viene in mente qualcosa di
più bello è il ben accetto.

Max
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5