Afficher des form lorsque l'on utilise Public Shared Sub Main

Résolu
jeromedu01 Messages postés 52 Date d'inscription mercredi 21 décembre 2005 Statut Membre Dernière intervention 23 février 2010 - 8 sept. 2008 à 09:11
cs_Amazing Messages postés 35 Date d'inscription lundi 23 juin 2003 Statut Membre Dernière intervention 17 avril 2010 - 1 oct. 2008 à 13:20
Bonjour,
Une petite question qui me permettra peut etre de comprendre davantage forrm, class,module...

Je demarre mon appli avec le code suivant :
Public

Class MainClass

Public
Shared
Sub Main()

Dim CurrentClass
As
New MainClassCurrentClass.CreateControls()

Application.Run()

End
SubSub

CreateControls()
dim A as new MyForm
MyForm.showdialog

......

End
SubEnd

Class
Mon probleme est qu'apres utilisation de ce demarrage je ne peut plus utiliser les methodes d'affichage de mes forms classiques. 
C'est a dire :  myForm.showdialog .
Je suis oblige d'ecrire dim A as new myForm et apres d'ecrire A.showdialog.

Ce qui me gene le plus la dedans c'est qu'avec le new a chaque fois que j'affiche une form les saisies precedentes (Controls enfants de cette form) ont bien evidement disparues.

Ma question est donc la suivante:
Comment utiliser cette methode de demarrage et de continuer a utiliser myForm.showdialog sans avoir a definir des nouvelles classes  (dim toto as new form)?
Ou si obligatoire comment faire pour reafficher des forms cachees sans avoir a les reinitialiser?

Merci beaucoup par avance,
Jerome.
A voir également:

14 réponses

NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
8 sept. 2008 à 12:44
Bonjour,

Cela est dû au fait que pour démarrer sur un Main perso, tu désactive le Main de l'architecture Graphique (Propriété du projet), donc, il ne précharge pas les Forms au démarrage et elles ne sont pas accessible par My.Forms.

Voir l'aide.

http://nhen0039.chez-alice.fr/index.php
3
gillardg Messages postés 3275 Date d'inscription jeudi 3 avril 2008 Statut Membre Dernière intervention 14 septembre 2014 2
8 sept. 2008 à 12:49
Public








Class

Form1



' If you just want the hot key, with no modifier








' use zero for the fsModifiers value (But this is a BAD IDEA).








Private





Const

NoModKey


As





Integer

= 0



' Modifier key constants








Private





Const

MOD_ALT


As





Integer

= 1



Private





Const

MOD_CONTROL


As





Integer

= 2



Private





Const

MOD_SHIFT


As





Integer

= 4



Private





Const

MOD_WIN


As





Integer

= 8



' Value indicating Windows Message is a hot key.








Protected





Friend





Const

WM_HOTKEY


As





Integer

= 786



' Unique ID for the atomic hot key.








Protected





Friend

hotkeyID


As





Short








' Register hotkey








Protected





Friend





Declare





Function

RegisterHotKey


Lib





"user32"

(


ByVal

hwnd


As

IntPtr,


ByVal

id


As





Integer

,


ByVal

fsModifiers


As





Integer

,


ByVal

vk


As

Keys)


As





Integer








' Add global name for hotkey








Protected





Friend





Declare





Function

GlobalAddAtomA


Lib





"kernel32"

(


ByVal

lpString


As





String

)


As





Short








' Delete hotkey atom.








Protected





Friend





Declare





Function

GlobalDeleteAtom


Lib





"kernel32"

(


ByVal

nAtom


As





Integer

)


As





Short








' Unregister hotkey.








Protected





Friend





Declare





Function

UnregisterHotKey


Lib





"user32"

(


ByVal

hwnd


As

IntPtr,


ByVal

id


As





Integer

)


As





Integer 

 










Private





Sub

hotkey_Load()



' GlobalAddAtom adds the String to the System global








' atom table, and returns a unique number to identify








' it the atom table.


hotkeyID = GlobalAddAtomA(





"GlobalHotKeyFor_MyUniqueAppName"

)



If

hotkeyID = 0


Then


MessageBox.Show(





"Unable to generate the requested hotkey unique ID."

,


"Error Making Hotkey ID"

)



Else








' Register the hot key combo used to show the form.








' I used Alt key modifier and the F1 key, Alt + F1,








' but you can use any key combo.








If

RegisterHotKey(


Me

.Handle, hotkeyID, MOD_ALT, Keys.Delete) = 0


Then


MessageBox.Show(





"Unable to register the requested hotkey."

,


"Error Registering Hotkey"

)



Else








'mettre la ligne suivante en commentaire pour la production


MessageBox.Show(





"The following Hotkey was registered for this application: "

&


"Keys: Alt + F1"

,


"Hot Key Registered"

)



End





If








End





If








End





Sub








Private





Sub

Form1_Closing(


ByVal

sender


As





Object

,


ByVal

e


As

System.ComponentModel.CancelEventArgs)


Handles





MyBase

.Closing



' READ ME:








' You MUST unregister your Hot Key, or your application will leak memory. 

 










If





Me

.hotkeyID <> 0


Then


UnregisterHotKey(





Me

.Handle, hotkeyID)



' Also delete the hot key atom.


GlobalDeleteAtom(hotkeyID)








End





If








End





Sub 

 










Protected





Overrides





Sub

WndProc(


ByRef

m


As

System.Windows.Forms.Message)



' Check for our Windows Message Hotkey.








If

m.Msg = WM_HOTKEY


Then








' Do something.








Me

.Show()



Me

.TopLevel =


True








End





If








' Return key messages to the application.








MyBase

.WndProc(m)



End





Sub








Private





Sub

Form1_Load(


ByVal

sender


As

System.Object,


ByVal

e


As

System.EventArgs)


Handles





MyBase

.Load



Me

.TopLevel =


False








' invisible dans la barre de taches et dans la liste des programmes ouvert


hotkey_Load()








'n'oublie pas d'ajouter un notifye icon sur ta form et un menu a ce notifye icon sinon ca sert à rien








Me

.NotifyIcon1.Icon =


Me

.Icon



End





SubEnd







Class













Bonjour chez vous !
3
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
8 sept. 2008 à 09:42
Pour ta méthode d'ouverture (CurrentClass.CreateControls()
) à vrais dire je n'en sait rien je ne l'es jamais utilisé .
Perso je fait toujours sa :

Dans mon form new j'ai :
-------------------------------------------------
Public Sub New()
        ' This call is required by the Windows Form Designer.
        InitializeComponent()
        [...] 'Traitement si besoin (exemple moi je configure des TableLayoutPanel pour y insérer des labels et des progresses barre en fonction du nombre d'élément d'une collection, tu peut bien sure appélé une fonction à la place ^^)
For Each Clef As String In Obj_SourceDeDonnees.ODic_SourceType.Keys
            Me.TableLayoutPanelLectureFichier.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100 / Me.TableLayoutPanelLectureFichier.ColumnCount))
            Dim LabelFichier As Label
            Dim TableLayoutPanelFichier As TableLayoutPanel
            Dim ProgressBarFichier As ProgressBar

            TableLayoutPanelFichier = New TableLayoutPanel()
            TableLayoutPanelFichier.ColumnCount = 1
            TableLayoutPanelFichier.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100.0!))
            TableLayoutPanelFichier.RowCount = 2
            TableLayoutPanelFichier.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100))
            TableLayoutPanelFichier.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20))
            TableLayoutPanelFichier.Dock = DockStyle.Fill
            TableLayoutPanelFichier.Name = "Panel_" & Clef

            LabelFichier = New Label()
            LabelFichier.Text = Clef
            LabelFichier.Name = "LabelFichier_" & Clef
            LabelFichier.Visible = True
            LabelFichier.AutoSize = False
            LabelFichier.Dock = DockStyle.Fill
            LabelFichier.TextAlign = ContentAlignment.MiddleCenter
            LabelFichier.Font = LabelFontFileLabel.Font
            TableLayoutPanelFichier.Controls.Add(LabelFichier, 0, 0)

            ProgressBarFichier = New ProgressBar()
            ProgressBarFichier.Minimum = 0
            ProgressBarFichier.Maximum = 1000
            ProgressBarTotalLectureFicheir.Maximum += ProgressBarFichier.Maximum
            ProgressBarFichier.Dock = System.Windows.Forms.DockStyle.Fill
            ProgressBarFichier.Margin = New System.Windows.Forms.Padding(1)
            ProgressBarFichier.Name = "ProgressBarFichier_" & Clef
            TableLayoutPanelFichier.Controls.Add(ProgressBarFichier, 0, 1)
            ProgressBarsFichiers.Add(Clef, ProgressBarFichier)

            Me.TableLayoutPanelLectureFichier.Controls.Add(TableLayoutPanelFichier, Compteur, 0)
            Compteur += 1
        Next
End Sub
-------------------------------------------------
Puis pour appelé ma form c'est tout comme l'habitué du coup :
FormExemple.Show()

Pour rendre une form visible/invisible joué sur la propriété "Visible" sa ne suffirais pas ?
Amicalement
Pensez "Réponse acceptée"
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
8 sept. 2008 à 09:48
Oups un oublie (Déjà Bonjour )

Bien sur tu peut toujours aussi faire
Dim toto as new FormExemple()
toto.show (ou toto.ShowDialog bien sure ^^)

Bonne prog
Amicalement
Pensez "Réponse acceptée"
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jeromedu01 Messages postés 52 Date d'inscription mercredi 21 décembre 2005 Statut Membre Dernière intervention 23 février 2010
8 sept. 2008 à 09:50
Merci de cette prompt reponse.

Malheureusement ceci fonctionne (FormExemple.show) si tu demarres pas l'appli par le public shared sub Main ().
Justement c'est la le probleme je demarre par celui-ci et n'est que la possibilite suivante pour l'affichage:

Dim A as new formExample

A.Showdialog
ou
A.Show

Malheureusement cette methode ne permet pas la concervation des informations ecrites prcedemment dans les ccontrols.

Merci,
Jerome.
0
gillardg Messages postés 3275 Date d'inscription jeudi 3 avril 2008 Statut Membre Dernière intervention 14 septembre 2014 2
8 sept. 2008 à 10:12
définis tes form dans le  designer, quand tu as besoin de ta form tu la .show
puis tu la .hide  puis tu la .show....

Bonjour chez vous !
0
jeromedu01 Messages postés 52 Date d'inscription mercredi 21 décembre 2005 Statut Membre Dernière intervention 23 février 2010
8 sept. 2008 à 10:19
Bonjour,
Merci de ces reponses.
Gillardg, pourrais-tu m'en dire davantage sur "definir la form dans le designer"?
Je suis desle mais ne sais pas ce qu'est le designer. est-ce le MyForm.designer.vb dans l'explorateur de solution ? si oui commment pourrais-je definir mes form la dedans?
merci beaucoup par avance.
Jerome.
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
8 sept. 2008 à 10:22
Haaaaaaa ok sa y est je comprend ton problème.

Pour la conservation des informations écrites précédemment à mon havie tu à deux choix.
Choix 1:
Range tes variable dans une collection (ou un dico, perso je préfère les dico car ils sont pré-typer niveau object reçu et clef, "System.Collections.Generic.Dictionary"). Tu joue simplement sur la propriété Visible pour les rendre visible ou non. Mais si tu à BEAUCOUP de form vue que tu les range en mémoire sa peut possé problème.

Choix 2:
La serialisation. Pour sa il faut ajouté à la déclaration de la class form le mot clef ("<Serializable()>") (attention su tu à des class ou des structure déclarer à l'intérieur de la classe que tu veut serialisé il faut ajouté le mot clef seralisable à toute les déclaration, si non sa ne marche pas (erreur à la compil ou à l'execution même j crois) !)
Exemple :
<Serializable()> Public Class FormExemple
   <Serializable()> Private class ObjInterne
   end class
[...]
end class

Ensuite tu crée un formateur (qui vas te convertire ton form en données binaires)
Tu écrit dans un fichier ton objet
Pour le lire tu ouvre le fichier et désérialise tes données.
Exemple serialisation/déserialisation :
public const CoSt_ExtentionFichierTemp as string = ".tmp"

Public Sub SauveForm(byref FormASauv as form, byval Id as string)
        Dim AccesseurAuFichier As New System.IO.FileStream(My.Application.Info.DirectoryPath & "\Temp" & Id & CoSt_ExtentionFichierTemp, IO.FileMode.OpenOrCreate)
        Dim Formateur As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
        Formateur.Serialize(AccesseurAuFichier, FormASauv)
        AccesseurAuFichier.Close()
    End Sub
    Public Sub LoadConfigGenerale(byref FormALoad as form, byval Id as string)
        Dim AccesseurAuFichier As New System.IO.FileStream(My.Application.Info.DirectoryPath & "\Temp" & Id & CoSt_ExtentionFichierTemp, IO.FileMode.Open)
        Dim Formateur As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
        FormALoad = Formateur.Deserialize(AccesseurAuFichier)
        AccesseurAuFichier.Close()
    End Sub

PS :
Tu peut rangé plussieur obj dans un fichier mais il faudras les lire dans le même ordre ou tu les à écrit si non tu risque des erreur

Voila je pense qu'avec sa tu dervais t'en sortire
Amicalement
Pensez "Réponse acceptée"
0
gillardg Messages postés 3275 Date d'inscription jeudi 3 avril 2008 Statut Membre Dernière intervention 14 septembre 2014 2
8 sept. 2008 à 10:46
quand je dis dans le designer je parle de l'ide comme ça tes form sont déjà faites et pas besoin d'un new
au fait pourquoi démmarer ton prog par sub main ??

Bonjour chez vous !
0
jeromedu01 Messages postés 52 Date d'inscription mercredi 21 décembre 2005 Statut Membre Dernière intervention 23 février 2010
8 sept. 2008 à 11:12
Merci pour ces reponses,
Polak77, je suis un peu confut car je ne pensais pas que cela soit si difficile (pour moi debutant)

Je vais resumer ce que je cherche a faire.

Je demarre mon appli par public shared sub main car je ne souhaite pas afficher de form (existante dans mon explorateur de solution) au demarrage de mon appli (c'est la solution que l'on m'a conseillee) ( je peu ainsi choisir de demarrer sur le public shared sub main a la place d'une form qui apparaitra forcement ) mais peut etre y a t il d'autre solution....
Cette appli permet d'afficher des rappels configures au prealable donc au demarrage j'ai simplement un timer gerant les rappels.
Par contre j'ai besoin d'afficher des forms pour configurer mes rappels (jours date evenements). ces forms ne doivent s'afficher que sur demande de l'utilisateur (Pour mon cas RMB dans le sytemtray / configurer)

Aussi j'aimerai bien que cela fonctionne ainsi:

MaFormExistanteDansLExplorateurDeProjet.Show
mais dans ce cas il me retourne Null expection....

Je suis oblige de faire cela:

dim a as new MaFormExistanteDansLExplorateurDeProjet
a.Show

Le probleme dans ce cas c'est que je n'ai plus acces aux controles precedement renseignes car a chaque fois ma fenetre apparait comme une nouvelle.
Gillardg, je suis desole mais qu'appelles tu l'IDE?
J'espere que vous comprendrez ce que je veux dire.

Merci,
Jerome.
0
gillardg Messages postés 3275 Date d'inscription jeudi 3 avril 2008 Statut Membre Dernière intervention 14 septembre 2014 2
8 sept. 2008 à 11:26
démarrer avec une form ne veut pas dire qu'elle soit forcément visible

tu démarre de là de toute façon tu as besoin d'une form pour mettre  le contextmenu de ton systrayicon


alors je vois pas à quoi ça serrt de te compliquer la vie avec autre chose qu'une form invisible qui n'apparait pas dans la barre de taches


propriétes de ta form
visible=false
showintaskbar=false










Bonjour chez vous !
0
jeromedu01 Messages postés 52 Date d'inscription mercredi 21 décembre 2005 Statut Membre Dernière intervention 23 février 2010
8 sept. 2008 à 11:36
Gillardg,
Je vien de reessaye ce que tu m'a conseille mais le visible = false est completement ignore si tu demarre sur cette meme form.
Voici un exemple que tu pourras tester en creant simplement un nouveau projet application Windows.

Private
Sub Form1_Load(
ByVal sender
As System.Object,
ByVal e
As System.EventArgs)
Handles
MyBase.Load

Me.Visible =
False

Me.Hide()

Me.Enabled =
FalseMyTimer()

End
Sub

Sub MyTimer()

Dim myTimerControl
As
New Windows.Forms.TimermyTimerControl.Start()

End
SubEnd

ClassC'est pour cette raison que je suis parti sur la solution public shared sub main. Mais bien sur que si tu as une autre methode je suis prenneur.

Merci,
Jerome.
0
jeromedu01 Messages postés 52 Date d'inscription mercredi 21 décembre 2005 Statut Membre Dernière intervention 23 février 2010
8 sept. 2008 à 13:07
Genial cela fonctionne !!!!
Dire que cela provenait seulement d'un me.toplevel = false....
Merci encore beaucoup pour cette aide indispensable !!!

Merci,
Jerome.
0
cs_Amazing Messages postés 35 Date d'inscription lundi 23 juin 2003 Statut Membre Dernière intervention 17 avril 2010 2
1 oct. 2008 à 13:20
Bonjour,

lorsque je souhaite afficher une form en passant par la methode sub main
je defini ma form comme etant global
dans un module:
Dim myForm as Form1

Puis dans une Classe

   Public sub main

      MyForm= new Form1
      application.run(myform)

   end sub

Tu pourras cacher,afficher ta form comme tu veux

Dans une class
Class ManipForm
   Public sub Cacher
      MyForm.hide
   end sub
   Public sub Afficher
      MyForm.show
   end sub
end class

Cordialement
Amazing
0
Rejoignez-nous