jeromedu01
Messages postés52Date d'inscriptionmercredi 21 décembre 2005StatutMembreDernière intervention23 février 2010
-
8 sept. 2008 à 09:11
cs_Amazing
Messages postés35Date d'inscriptionlundi 23 juin 2003StatutMembreDernière intervention17 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?
NHenry
Messages postés15102Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention27 mars 2024159 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.
Polack77
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 20191 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
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"
jeromedu01
Messages postés52Date d'inscriptionmercredi 21 décembre 2005StatutMembreDernière intervention23 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.
jeromedu01
Messages postés52Date d'inscriptionmercredi 21 décembre 2005StatutMembreDernière intervention23 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.
Polack77
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 20191 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"
gillardg
Messages postés3275Date d'inscriptionjeudi 3 avril 2008StatutMembreDernière intervention14 septembre 20142 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 ??
jeromedu01
Messages postés52Date d'inscriptionmercredi 21 décembre 2005StatutMembreDernière intervention23 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.
jeromedu01
Messages postés52Date d'inscriptionmercredi 21 décembre 2005StatutMembreDernière intervention23 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.