|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
[VB.NET]Limitare una sola istanza di Form
Ciao a tutti
Stavo provando a fare in modo che un'applicazione possa avere soltanto un'istanza di un form già aperto. In soldoni: Codice:
Private WithEvents myForm As MioFormPersonalizzato
'nell'evento che gestisce l'apertura del form, per esempio click in un button
If Not IsNothing(myForm) Then
If Not myForm.IsDisposed Then
myForm.BringToFront()
Else
myForm = new MioFormPersonalizzato
'blabla per l'apertura del form
End If
Else
myForm = newMioFormPersonalizzato
End If
Benone ma... ovviamente l'applicazione contiene moltissimi Form, quindi, pensavo di generalizzare il tutto creandomi una routine ad hoc, passando come miei argomenti appunto, il form in oggetto... in soldoni: Codice:
private Sub OnAperturaForm(ByVal fInstance as Form, fClass as Form)
If Not IsNothing(fInstance) Then
If Not fInstance.IsDisposed Then
fInstance.BringToFront()
else
'ecco i problemi:
fInstance = new fClass
'blablabla
in quella fase, non posso dire: New Form, dato che mi genererebbe un form generico, mentre a me serve di istanziare un nuovo MioFormPersonalizzato. C'è modo di aggirare l'ostacolo? Grazie. RaouL.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12113
|
basta che inserisci questo metodo nella classe padre da cui estendono tutti i tuoi form personalizzati e lo istanzi con l'equivalente per il vb della keyword this() del c# (che in vb non so come si chiama
__________________
|
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Quote:
Ehm.. no, ho dimenticato di postarlo ma non funziona, l'equivalente di this è Me ma con Me lui intende il form corrente, non quello che vorrei controllare.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12113
|
Quote:
a questo punto mi sfugge quello che hai fatto.. ![]() quel metodo onAperturaForm dove l'hai messo? ![]() comunque potresti fare così in sintesi: Codice:
class MyForm
{
Form form;
public MyForm()
{
if (form != null)
{
form.TopMost = true; //sarebbe l'equivalente di brongToFront credo...
}
}
}
In questo modo in teoria potresti anche istanziare il form con tipi che estendono direttamente da form in caso tu voglia utilizzare il designer per i tuoi form.
__________________
|
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
Perchè invece non includere un piccolo codice aggiuntivo in ogni oggetto di cui vuoi ottenere un comportamento a singola istanza ? Io farei così : 1. Ho una Form1 che è l'oggetto di avvio del progetto, e un semplice pulsante per verificare che di Form2 esista una sola istanza. 2. Modifica alla Sub New di Form2, in modo che non sia possibile dall'esterno crearne una o più istanze in modo incontrollato : Codice:
Public Sub New() Codice:
Private Sub New() Codice:
Private Sub New()
MyBase.New()
' Chiamata richiesta da Progettazione Windows Form.
InitializeComponent()
' Aggiungere le eventuali istruzioni di inizializzazione dopo la chiamata a InitializeComponent().
End Sub
Codice:
Private Shared Ist As Form2 = Nothing
Public Shared Function Istanza() As Form2
If Ist Is Nothing OrElse Ist.IsDisposed = True Then
Ist = New Form2
End If
Ist.BringToFront()
Return Ist
End Function
Codice:
Dim SingIstForm As Form2
SingIstForm = Form2.Istanza
SingIstForm.Show()
Codice:
Dim SingIstForm As New Form2 E il gioco è fatto ! Prova... |
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Lo provo volentieri !
nel frattempo grazie mille RaouL.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:06.





















