|
|
|
![]() |
|
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: 12112
|
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: 12112
|
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: 21:09.