none
Sauvegarder et restaurer la position et les dimensions d'une fenêtre Windows Form RRS feed

  • Question

  • Bonjour à tous, et merci d'avance pour votre aide.
    Voici ci-dessous un programme qui doit sauvegarder dans My.Settings les coordonnées et la position d'une fenêtre Form, afin de les restaurer au lancement suivant.
    Mais il ne fonctionne pas.
    Pourquoi ???


    Imports System
    Imports System.Windows.forms

    Public Class Form1
       Inherits System.Windows.Forms.Form
       Public Sub New()
          MyBase.New()
       End Sub
       Public Shared Sub Main()
          Dim MainForm as new Form1()
          System.Windows.Forms.Application.Run(MainForm)
       End Sub
       Private Sub Form1_Load(ByVal sender as Object, ByVal e as System.EventArgs) Handles MyBase.Load
          If Not My.Settings.Size.IsEmpty
             Me.Location = My.Settings.Location
             Me.Size = My.Settings.Size
          End If
       End Sub
       Private Sub Form1_FormClosing(ByVal sender as Object, ByVal e as System.Windows.Forms.FormClosingEventArgs)
          if Me.WindowState = FormWindowState.Normal Then
             My.Settings.Location = Me.Location
             My.Settings.Size = Me.Size
          End If
       End Sub
    End Class

    mercredi 26 août 2009 12:54

Réponses

  • Bonjour AJD

    Est ce que tu as bien ajoutés les paramétres au projet?

    Pour ajouter des paramètres d'application dans le Concepteur de projets

    1. Sélectionnez un projet dans l'Explorateur de solutions, puis, dans le menu Projet, cliquez sur Propriétés.
      (Ou click-droit sur MyProject- et Ouvrir)

    2. Sélectionnez le volet Paramètres.

    3. Cliquez sur une ligne vide dans la grille Paramètres.

    4. Indiquez un nom pour le paramètre dans la colonne Nom. (Pour ton exemple Size et dans la ligne desous Location)
      Le nom ne peut pas contenir d'espaces.

    5. Sélectionnez un type de données pour le paramètre dans la liste déroulante Type.
      (Elargis le champ Type pour mieux voir les textes dans la liste deroulante et choisis System.Drawin.Point)

    6. Sélectionnez la portée du paramètre dans la liste déroulante Portée. La portée du paramètre peut être Application ou Utilisateur. (C'est Utilisateur qu'il te faut pour les deux) 

    Indiquez une valeur par défaut pour le paramètre dans la colonne Valeur. La valeur doit être appropriée pour le type de données sélectionné.(Si tu laisses les valeurs a 0,0 tu veras au primiére demarrage que un petit bout de la barre du fenetré tout en haut a gauche. pour eviter sa j'ai mis les valeurs par default pour Location a 30,30 et ceux de Size a 50,50)


    Dans le cas de Size et de Location le type doit être System.Drawing.Point, la portée Utilisateur

    Remarque aussi que les valeurs de changement, etant atribués dans l'evenement FormClosing, ne seront pas sauves si on arrete le debogage(L'execution de la solution) avec le bouton Arret Debogage dans l'environnement du developpeur.Dans ce cas FormClosing n'est pas appelés.

    Voici toute le code de que j'avais besoin pour fair fonctioner ca. Aucun Import ou New etc. C'est absolument tout

    Public Class Form1
    
        Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
            My.Settings.Size = Me.Size
            My.Settings.Location = Me.Location
            My.Settings.Save()
        End Sub
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            My.Settings.Reload()
            Me.Size = My.Settings.Size
            Me.Location = My.Settings.Location
        End Sub
    
    
    End Class



    cordialement heka2

    mercredi 26 août 2009 15:37
  • Salut AJD,
    La ligne
    Private Sub Form1_FormClosing (ByVal sender As Object ByVal e, Comme System.Windows.Forms.FormClosingEventArgs) 
    doit être

    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    pour que le formulaire peut traiter l'événement.
    Aussi, comme heka2 a dit, c'est mieux d'utiliser

    My.Settings.Save()
    même si ça marche sans le faire maintenant.

    Cordialement,
    Marius







    • Proposé comme réponse heka2 mercredi 26 août 2009 17:00
    • Marqué comme réponse Marius Bugiulescu jeudi 27 août 2009 09:33
    mercredi 26 août 2009 16:27

Toutes les réponses

  • Es-ce qu'il te donne un message d'erreur ou il ne fonctionne simplement pas?
    Microsoft MVP C# :: mongeon.devrpm.ca
    mercredi 26 août 2009 14:34
    Modérateur
  • Bonjour AJD

    Est ce que tu as bien ajoutés les paramétres au projet?

    Pour ajouter des paramètres d'application dans le Concepteur de projets

    1. Sélectionnez un projet dans l'Explorateur de solutions, puis, dans le menu Projet, cliquez sur Propriétés.
      (Ou click-droit sur MyProject- et Ouvrir)

    2. Sélectionnez le volet Paramètres.

    3. Cliquez sur une ligne vide dans la grille Paramètres.

    4. Indiquez un nom pour le paramètre dans la colonne Nom. (Pour ton exemple Size et dans la ligne desous Location)
      Le nom ne peut pas contenir d'espaces.

    5. Sélectionnez un type de données pour le paramètre dans la liste déroulante Type.
      (Elargis le champ Type pour mieux voir les textes dans la liste deroulante et choisis System.Drawin.Point)

    6. Sélectionnez la portée du paramètre dans la liste déroulante Portée. La portée du paramètre peut être Application ou Utilisateur. (C'est Utilisateur qu'il te faut pour les deux) 

    Indiquez une valeur par défaut pour le paramètre dans la colonne Valeur. La valeur doit être appropriée pour le type de données sélectionné.(Si tu laisses les valeurs a 0,0 tu veras au primiére demarrage que un petit bout de la barre du fenetré tout en haut a gauche. pour eviter sa j'ai mis les valeurs par default pour Location a 30,30 et ceux de Size a 50,50)


    Dans le cas de Size et de Location le type doit être System.Drawing.Point, la portée Utilisateur

    Remarque aussi que les valeurs de changement, etant atribués dans l'evenement FormClosing, ne seront pas sauves si on arrete le debogage(L'execution de la solution) avec le bouton Arret Debogage dans l'environnement du developpeur.Dans ce cas FormClosing n'est pas appelés.

    Voici toute le code de que j'avais besoin pour fair fonctioner ca. Aucun Import ou New etc. C'est absolument tout

    Public Class Form1
    
        Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
            My.Settings.Size = Me.Size
            My.Settings.Location = Me.Location
            My.Settings.Save()
        End Sub
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            My.Settings.Reload()
            Me.Size = My.Settings.Size
            Me.Location = My.Settings.Location
        End Sub
    
    
    End Class



    cordialement heka2

    mercredi 26 août 2009 15:37
  • Salut AJD,
    La ligne
    Private Sub Form1_FormClosing (ByVal sender As Object ByVal e, Comme System.Windows.Forms.FormClosingEventArgs) 
    doit être

    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    pour que le formulaire peut traiter l'événement.
    Aussi, comme heka2 a dit, c'est mieux d'utiliser

    My.Settings.Save()
    même si ça marche sans le faire maintenant.

    Cordialement,
    Marius







    • Proposé comme réponse heka2 mercredi 26 août 2009 17:00
    • Marqué comme réponse Marius Bugiulescu jeudi 27 août 2009 09:33
    mercredi 26 août 2009 16:27
  • Rebonjour!

    Marius a raison!

    Et a dire que je n'avais même pas remarque que dans ton evenement FormClosing manquait le Handle.

    Un derniere sujection quand même. Comme il s'agit de sauver les positionements et les redimensionnements fait par l'Utilisateur autant les sauver dans les evenements concernés. A dire LocationChanged et SizeChanged.

    Voici le code:

    Public Class Form1
    
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            My.Settings.Reload()
            Me.Size = My.Settings.Size
            Me.Location = My.Settings.Location
        End Sub
    
        Private Sub Form1_LocationChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.LocationChanged
            My.Settings.Location = Me.Location
            My.Settings.Save()
        End Sub
    
    
        Private Sub Form1_SizeChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.SizeChanged
            My.Settings.Size = Me.Size
            My.Settings.Save()
        End Sub
    End Class

    cordialement heka2

    mercredi 26 août 2009 17:13
  • Bonjour à tous et merci pour votre aide.
    Après avoir saisi le code ci-dessus et l'avoir testé il resulte que :
    La taille de la fenetre semble conservé mais pas sa position.
    Alors voici la solution que j'ai trouvé :

    Public Class Form1
       Inherits System.Windows.Forms.Form

       Public Shared Sub Main()
          Dim MainForm As New Form1
          System.Windows.Forms.Application.Run(MainForm)
       End Sub

       Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
          My.Settings.Reload()
          Me.Location = My.Settings.Location
          Me.Size = My.Settings.Size
       End Sub

       Private Sub Form1_LocationChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.LocationChanged
          My.Settings.Location = Me.Location

          End Sub

       Private Sub Form1_SizeChanged(Byval sender as Object, ByVal e As System.EventArgs) Handles Me.SizeChanged
          My.Settings.Size = Me.Size
       End Sub

       Private Sub Form1_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
          My.Settings.Save()
       End Sub

    End Class

    Et ça fonctionne Nickel...Sauf lorsqu'on ferme la fenetre lorsqu'elle est réduite ou agrandie au max.
    Je cherche la solution de ce petit désagrément et vous tiens informé.
    Si vous avez une idée...

    Ca y est, j'ai trouvé une solution. Il suffit de remplacer la procédure Form1_FormClosed ci dessus par celle ci-dessous.

    Private Sub Form1_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
          If Me.WindowState = System.Windows.Forms.FormWindowState.Normal Then
             My.Settings.Save()
          End If
    End Sub

    Merci à vous tous.

    • Modifié AJD._ vendredi 28 août 2009 05:59
    jeudi 27 août 2009 09:16