Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

RETROUVER LES FONCTIONNALITÉS DE VB6


Information sur la source

Catégorie :Formulaire Source .NET ( DotNet ) Niveau : Débutant Date de création : 21/05/2004 Date de mise à jour : 21/05/2004 23:13:24 Vu : 8 145

Note :
9 / 10 - par 1 personne
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (16)
Ajouter un commentaire et/ou une note

Description

Cliquez pour voir la capture en taille normale
Lors de ma migration vers .net j'ai remarqué enormément de changement dont un qui me rendais malade, je m'explique :

J'ai fait mon logiciel d'entreprise en mode MDI et dans certain cas selon que j'écrivais un trucs dans une feuille une autre recevais dès le lostfocus la même valeur que j'avais entrée.

En VB6 celà était très simple à faire puisque je mettais par exemple

form1.NomVille.text = me.RechercheVille.text

En .net impossible de faire ça en mode de feuille MDI :'(
Je veux dire par là impossible d'accéder a un control d'une autre form pour lui attribuer une valeur.  Si ce n'est que par la solution suivante mais malheureusement non applicable dans le context MDI :((( :

Dim form1 as New Form1
form1.NomVille.text = Me.rechercheVille.text

Donc j'ai fouillé fouillé sur le net pour trouver la solution, pas trouvé malheureusement alors j'ai tout simplement fait en vb6 l'application basic de ce que je voulais faire et puis j'ai demander à vb.net de me convertir l'application.

Stupéfaction il ma générer un code que je vous livre ci-dessous et qui rends en standart toute les commande de vb6


Une capture d'écran avec une petite explication est fournie :o)

 

Source

  • ' Dans le " Windows Form Designer generated code "
  • ' vous avez ceci de base :
  • Public Sub New()
  • MyBase.New()
  • InitializeComponent()
  • End Sub
  • ' Ajouter ceci avant le InitializeComponent()
  • If m_vb6FormDefInstance Is Nothing Then
  • If m_InitializingDefInstance Then
  • m_vb6FormDefInstance = Me
  • Else
  • Try
  • 'For the start-up form, the first instance created is the default instance.
  • If System.Reflection.Assembly.GetExecutingAssembly.EntryPoint.DeclaringType Is Me.GetType Then
  • m_vb6FormDefInstance = Me
  • End If
  • Catch
  • End Try
  • End If
  • End If
  • ' Fermé la région " Windows Form Designer generated code "
  • 'Ajouter maintenant cette région :
  • #Region "Upgrade Support form VB6"
  • ' Attention à Form1 remplacer par le nom de votre feuille
  • Private Shared m_vb6FormDefInstance As Form1
  • Private Shared m_InitializingDefInstance As Boolean
  • Public Shared Property DefInstance() As Form1
  • Get
  • If m_vb6FormDefInstance Is Nothing OrElse m_vb6FormDefInstance.IsDisposed Then
  • m_InitializingDefInstance = True
  • m_vb6FormDefInstance = New Form1
  • m_InitializingDefInstance = False
  • End If
  • DefInstance = m_vb6FormDefInstance
  • End Get
  • Set(ByVal Value As Form1)
  • m_vb6FormDefInstance = Value
  • End Set
  • End Property
  • #End Region
' Dans le " Windows Form Designer generated code "
' vous avez ceci de base :

    Public Sub New()

        MyBase.New()

        InitializeComponent()

    End Sub

' Ajouter ceci avant le InitializeComponent()

        If m_vb6FormDefInstance Is Nothing Then
            If m_InitializingDefInstance Then
                m_vb6FormDefInstance = Me    
            Else
                Try
                    'For the start-up form, the first instance created is the default instance.
                    If System.Reflection.Assembly.GetExecutingAssembly.EntryPoint.DeclaringType Is Me.GetType Then
                        m_vb6FormDefInstance = Me
                    End If
                Catch
                End Try
            End If
        End If

' Fermé la région " Windows Form Designer generated code "

'Ajouter maintenant cette région : 

#Region "Upgrade Support form VB6"

                 '   Attention à Form1 remplacer par le nom de votre feuille

    Private Shared m_vb6FormDefInstance As Form1
    Private Shared m_InitializingDefInstance As Boolean
    Public Shared Property DefInstance() As Form1
        Get
            If m_vb6FormDefInstance Is Nothing OrElse m_vb6FormDefInstance.IsDisposed Then
                m_InitializingDefInstance = True
                m_vb6FormDefInstance = New Form1
                m_InitializingDefInstance = False
            End If
            DefInstance = m_vb6FormDefInstance
        End Get
        Set(ByVal Value As Form1)
            m_vb6FormDefInstance = Value
        End Set
    End Property
#End Region

Conclusion

Avec ça plus de problème toute les manip de vb6 sont disponible :o)

Maintenant pour avoir l'accès au control d'une autre form faite :

Exemple , une statusbar dans la feuille MDI principal appellée form1

Vous voulez au départ d'une feuille fille changer le statut d'un panneaux ou il est écrit par exemple INACTIF en ACTIF

Au départ de n'importe quel form faite :

form1.DefInstance.statusbar1.panels(0).text = "ACTIF"

Vous l'aurez compris c'est le DefInstance qui nous donne l'accès :o)

Voilà si j'ai pas été claire ou que vous ne comprenner pas n'hésiter pas a me le dire, si il faut je ferais un petit zip avec une application en exemple claire et commenté.

Bien à vous

Didier

 

Commentaires et avis

signaler à un administrateur
Commentaire de spy166 le 21/05/2004 23:40:12

Bonne idée de mettre ça ici, je suis sur que ça va aider beaucoup de monde.
J'ai fait pareil que toi pour trouver cette astuce (vb6-->vb.net), ce moyen marche plutôt bien en général.
@+

signaler à un administrateur
Commentaire de bubble44 le 22/05/2004 06:51:29

Je vais bientot passer en vb.net, et ca me semble etonnant de lire des "En .net impossible de faire ça en mode de feuille MDI :'".

Y a pas des specialistes ici en vb.net qui pourraient expliquer en qqs mots, une bonne methode (si on decide de programmer en vb.net on fait un point d'honneur a coder dans les regles), car ca me semble un peu "triste" d'utiliser vb.net et de coder ca a la vb6.

signaler à un administrateur
Commentaire de bouv le 22/05/2004 17:49:10

d'accord avec bubble44.
Mais si la traduction est faite par .net, elle doit surement etre tres bonne ?!?!
++

signaler à un administrateur
Commentaire de labout le 22/05/2004 21:12:51

Je ne note pas la source.

La traduction marche en effet mais les m_vb6FormDefInstance
sont bien lourd et l'exécution lent et il faut absolument les abandonner (voir les références ajoutées).
Il ne faut absolument pas écrire en VB opuis traduire en NET ce n'est pas la meilleure manière d'aborder VB.NET.
Pour débuter je conseille de télécharger les 101 exemples de Microsoft et de le étudier.
http://msdn.microsoft.com/vbasic/downloads/samples/default.aspx

Personnellement j'ai récrit entièrement mes appli VB 6 en pur VB.NET.
Il ne s'agit que d'un conseil d'un spécialiste de VB6 passé en VB.NET depuis 7 mois et qui ne le regrette pas du tout. VB.NET est FABULEUX
@+

signaler à un administrateur
Commentaire de MrDogbert le 23/05/2004 02:19:06

en même temps, tu rajoutais juste un getter (  public function getBidule as bidule) dans ta class et c'était réglé ...

signaler à un administrateur
Commentaire de spy166 le 23/05/2004 03:44:18

labout, ça marche juste si on ajoute ça au code :
    Private Shared m_vb6FormDefInstance As Form1
    Private Shared m_InitializingDefInstance As Boolean
    Public Shared Property DefInstance() As Form1
        Get
            If m_vb6FormDefInstance Is Nothing OrElse m_vb6FormDefInstance.IsDisposed Then
                m_InitializingDefInstance = True
                m_vb6FormDefInstance = New Form1
                m_InitializingDefInstance = False
            End If
            DefInstance = m_vb6FormDefInstance
        End Get
        Set(ByVal Value As Form1)
            m_vb6FormDefInstance = Value
        End Set
    End Property

Donc, pas besoin des références.

signaler à un administrateur
Commentaire de ledev le 23/05/2004 09:52:31

Juste comme ça, t'aurai crée un module et mis:
public form1 as new form1
et tu y accedais comme tu voulais. Ton probléme c'est que désormait les feuilles sont de simple classe, et que la variable contenant l'objet Form1 n'a pas sa porter partout. Avec un module comme ci-dessus elle l'a.

Mais bon, la logique de programmation en vb.net est complétement différente de celle de vb6(d'oû les difficulter à migrer des applis, et les routines et autre classe de compatibilité du .Net), mieux vos donc "pensé .net" et faire un programme dans sa logique à lui.

signaler à un administrateur
Commentaire de tno le 23/05/2004 11:43:25

Il faudrait générer un événement (contenant toutes les infos) lors du lostfocus de ta form1 , puis le récupérer dans ta form2...

signaler à un administrateur
Commentaire de ABL-Online le 23/05/2004 16:42:32

Aucune des propostions faire ici notament par ledev et MrDogbert ne fonctionne donc j'en reste a ma procédure qui me semble la meilleur solution pour l'instant.

signaler à un administrateur
Commentaire de marcA le 24/05/2004 08:01:29

Bonjour,

Je n'aimes pas beaucoup une méthode pareille : En programmation orientée objet, on ne peut pas accéder aux propriétés (contrôles) d'un autre objet. Juste des méthodes. C'est un peu comme si on utilisait toujours des goto et gosub en VB 6

Pour accéder à un texte d'une autre forme, je ferais une méthode qui renvoit le texte à la rigueur, mais pas d'accès direct. Par contre, on peut se demander pourquoi accéder à un texte d'une autre form. Est-ce que le texte de l'autre forme ne devrait pas envoyer un message avec le changement qui lui est apporté à toutes les autres fenêtre MDI, et les autres fenêtres se servent du nouveau texte si elles en ont besoin?

signaler à un administrateur
Commentaire de alicvb le 24/05/2004 18:49:22

A mon avis, tu ne prends pas les choses dans le bon sens :
Pour afficher la form mdi de saisie des informations, tu dois nécessairement l'instancier (la déclarer avec new) non ?
dès lors, tu peux stocker en variables publiques ces forms :
dans un module : public f1 as form1
au moment où tu veux afficher form1 : f1=new form1


et tu peux basculer de l'une à l'autre sans problèmes, utiliser les valeurs de l'une pour écrire sur l'autre et vice-versa

du coup tu peux directement écrire :
f1.NomVille.text = Me.rechercheVille.text
sans réinstancier form1, car f1 est une varibale publique, et donc accéssible de partout...

essaie et tiens moi au courant...

signaler à un administrateur
Commentaire de Yopyop le 24/05/2004 19:28:59

marcA

D'accord avec toi... en poo il y a les objets business.
Donc dans ce cas:
la form2 change la valeur de l'objet
lorsque la form1 reçoit le focus, elle peut se rafraîchir avec les nouvelles valueurs de l'objet (apr example).

On peut également utiliser des delegates

Mais apparemment, les personnes qui passent de VB à VB.NET ne font pas la poo...malheureusement :(

Qu'en penses-tu ?

signaler à un administrateur
Commentaire de spy166 le 24/05/2004 20:56:55

Ben on fait bien comme on veut.
Personnellement je n'ai jamais utilisé cette méthode car je n'en ai pas l'utilité, mais je pense que ça peut être assez utile tout de même.
Par exemple pour une feuille d'options ou de paramètres avec un bouton "Appliquer".

signaler à un administrateur
Commentaire de marcA le 25/05/2004 08:12:00

Je crois aussi que c'est dommage de passer en VB.Net et de ne pas profiter de ses nouvelles possibilités. Je travailles toujours en VB6, mais j'essaye déjà de faire de l'orienté objet (seules des méthodes changent des propriétés...). Je ne vois pas du tout l'avantage de passer en VB.Net si ce n'est pour profiter des avantages de l'OO. D'un autre coté, il faut mieux analyser ce que l'on veut faire avant de le faire en orienté objet, donc l'avantage n'est pas toujours évident. Par contre, une bonne analyse permet de gérer des modifications dans des autres fenêtres que celle que l'utilisateur change automatiquement...

signaler à un administrateur
Commentaire de Yopyop le 25/05/2004 17:38:51

à nouveau d'accord avec toi marcA :)
la poo a ses avantages et ses 'inconvénients' (notemment il faut savoir l'utiliser correctement pour profiter de ses avantages :) ).
Pour la migration VB -> VB.NET, si c'est une migration 1:1 (pas de modification des fonctionnalités de l'application) c'est inutile !! Quels sont les avantages ? Un responsable Microsoft te dira même que c'est 'stupide' (et je ne l'invente pas, je suis fréquemment en réunion avec eux...).
Quel est l'avantage de passer d'une '2CV' à une 'Porsche' si on continue à conduire mal et lentement ?

spy166: on fait comme on veut ok, mais appliquer un modèle MVC t'évite pas mal d'ennuis (à moins que ton application n'évolue plus.. ce qui n'est pas souvent le cas).

yop

signaler à un administrateur
Commentaire de chiffre le 19/01/2007 20:35:41

Bonjour...

J'essayais de comprendre vb6 fr.
Un de mes amis pas conseiller de transférer en vb.net 2005 fr.
Je suis en train de migrer vers vb.net.

Je crois que c'est mieux mais ca prend beaucoup de patience car pour moi le pire c'est d'attendre toujours à minute que tu changes de quoi et enregistre ca prend un éternité 2 minute et plus souvent

Si tu fait 50 changement ca veut dire pratiquement d'attende en tout.Tu vient de perdre 1 heure et plus.

J'ai hate de ne plus avoir d'erreur de conversion de vb6 en vb.net

Pourtant j'ai 512 Mod de RAM

En passant j'avais faite une gestion d'erreur complet pour vb6
qui fonctionnait très bien, et ca ne fonctionne pas ou en partie,
en vb.net

C'est qui me froisse le plus c'est que je veut avoir le numéro de ligne qui fait l'erreur et je n'ai pas trouver le moyen encore.

Merci

Jean-Marc

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,296 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.