2009-08-13 4 views
1

Je n'avais pas réalisé au moment où j'ai créé cette application particulière que je devrais réutiliser certains des composants - certains formulaires Windows et une classe ou deux.Rendre un formulaire Windows existant héritable

Maintenant que j'ai déjà créé les formes assez complexes dans un projet, quel est le moyen le plus simple de transformer ces formes en formes héritables que je peux réutiliser dans d'autres projets? Une fois cela fait, j'aimerais modifier le projet existant pour utiliser les formulaires héritables nouvellement créés.

Comment puis-je accomplir cela avec le moins de douleur possible? J'utilise C# dans Visual Studio 2008.

Répondre

2

Vous n'avez vraiment rien de spécial à faire pour cela. Votre formulaire est déjà héritable. Sur toute nouvelle forme, assurez-vous que la première ligne ressemble à ceci:

public partial class frmMyChild : frmMyInheritableForm 

au lieu de:

public partial class frmMyChild : Form 

et de faire toutes les méthodes que vous avez besoin d'accéder à de l'enfant soit « public » ou « protégé".

Mise à jour: une astuce supplémentaire consiste à définir la propriété Modificateurs de chaque contrôle de votre formulaire d'origine sur Protégé (au lieu de Privé par défaut). Dans le concepteur pour votre formulaire enfant qui hérite de ce formulaire, vous verrez tous les contrôles sur le formulaire parent et vous pouvez les déplacer et les redimensionner comme bon vous semble (cela n'affectera pas la disposition du formulaire d'origine).

Pour accéder à toute méthode mère du formulaire enfant, vous appelez simplement:

base.MyMethod(); 
+0

Cela fonctionne très bien. Comment puis-je remplacer une méthode sur le formulaire parent? – Dave

+0

Utilisez le mot-clé "new" sur la méthode enfant du même nom. Exemple: si votre parent a une méthode void nommée "DoSomething()", vous déclarez une méthode dans le formulaire enfant "public new void DoSomething()" (ceci s'appelle "cacher" plutôt que "redéfinir"). Vous pouvez toujours appeler base.DoSomething() dans la méthode DoSomething() de l'enfant, au cas où vous voudriez faire autre chose, puis appeler la méthode de base. – MusiGenesis

+0

@Musi: Pourquoi préconiseriez-vous la dissimulation (une pratique sans doute "mauvaise") plutôt que de déclarer les méthodes comme virtuelles? –

1

Déclarez simplement une classe vide qui hérite de System.Windows.Forms.Form, puis faites en sorte que votre classe "énorme" en hérite. Une fois que cela fonctionne, commencez à déplacer, une petite pièce réutilisable à la fois de votre classe "énorme" à la classe parente.

+0

Je pense que je vois un peu ce que vous dites ici, mais ce n'est pas très clair. – MusiGenesis

1

Dans votre premier projet, ajouter une nouvelle "Windows Forms Control Library" à votre solution

Faites glisser les fenêtres/classes du projet original au nouveau.

corrige les erreurs. À ce stade, vous disposez maintenant d'une bibliothèque de classes que vous pouvez inclure dans votre deuxième projet Windows. Gardez à l'esprit que vous n'avez pas besoin de concevoir vos formulaires pour qu'ils soient héritables afin de les utiliser dans d'autres projets.

+0

@Stephen - J'ai créé une nouvelle bibliothèque de contrôle Windows Forms "pour mon projet existant et y ai déplacé un formulaire, comment puis-je y accéder à partir du projet existant? – Dave

+0

ajouter une référence au NOUVEAU projet au ancien, puis où vous l'avez déclaré comme "myFormClass myForm = new myFormClass();" vous utiliseriez maintenant "myClassLibrary.myFormClass myForm = new myFormClass();" –

1

Les formulaires héritables sont des PITA, et dans toutes les circonstances, sauf les plus simples, il y a plus de problèmes qu'ils n'en valent la peine.

portable, alors la plus grande chose qui serait nécessaire est de s'assurer que vous n'exposez pas les champs internes (les contrôles sont inclus) à l'extérieur du formulaire. Si le code externe (que ce soit dans le même projet ou dans un autre) doit interagir avec le formulaire de manière visuelle ou comportementale, vous devez exposer les fonctions et les propriétés qui représentent cette fonctionnalité, plutôt que le contrôle lui-même. En dehors de la conception de la forme particulière, il serait probablement utile (si cela prend un certain temps) de déplacer ces formes communes dans une bibliothèque de contrôle séparée. Alors que vous pouvez définitivement ajouter votre.exe comme référence à un autre projet, ce n'est pas idéal (et pas totalement intuitif).

+0

Quel était PITA-like dans votre expérience avec les formes héritables? Je les ai utilisés un peu et je n'ai jamais eu de gros problèmes avec eux – MusiGenesis

+0

Ils se sont peut-être améliorés, mais je les ai utilisés dans VS 2002/2003 et ils étaient vraiment pénibles. Je pense que les choses se sont améliorées dans les versions ultérieures de VS. Une chose qui permet de s'assurer que vous avez toujours un constructeur sans paramètre, donc le concepteur peut l'appeler. Nous ne prévoyons pas de l'appeler (vous n'aurez qu'à appeler des constructeurs avec des paramètres), rendez le privé sans paramètre, mais ne le supprimez pas, sinon le concepteur vous posera des problèmes. –

Questions connexes