2010-01-26 4 views
5

Je ne sais pas comment ça s'appelle donc j'ai eu du mal à trouver une réponse de google mais j'en ai un vague souvenir depuis des jours.Est-il possible d'ajouter une référence à un code source à inclure dans un fichier source dans vb.net, winforms?

J'ai sous-classé (* voir ci-dessous) environ 8 contrôles d'infrastructure, redéfinir certaines propriétés et ajouté quelques fonctionnalités dans chacun. Les modifications que j'ai apportées sont identiques dans tous les cas. Si je fais un changement, je dois passer par chaque classe et y appliquer le même changement. J'espérais qu'il peut y avoir un mot-clé tels que < IncludeSourcefile « common.vb > que je peux mettre dans chaque classe.

hasard?

(* Note) J'utilise le terme sous surclassée mais je ne sais pas si c'est la terminologie correcte. Je l'ai aussi vu utilisé pour les rappels. est-sous-classé le terme correct à utiliser?

Répondre

1

Je doute sérieusement que ça va marcher pour vous. Vous ne pouvez pas utiliser un fichier d'inclusion pour bloquer les modifications dans les contrôles dérivés. Vous devez normalement effectuer les modifications dans une classe de base commune, dérivée de Control par exemple, puis dériver des contrôles individuels de cette classe de base. Mais cela ne fonctionnera pas si vous avez personnalisé 8 classes de contrôle distinctes. Copier-coller est votre lot.

+0

C'est dommage. Je ne peux pas penser à de nombreuses raisons pour lesquelles vous auriez besoin d'une telle fonctionnalité, mais avec cette situation particulière, c'est la seule façon d'éviter le copier-coller. – Jules

0

compiler vos classes communes dans leur propre DLL.

Ensuite, définissez la référence de votre DLL dans Visua l Studio en cliquant avec le bouton droit sur le dossier Références dans l'Explorateur de solutions.

Enfin, ajoutez des instructions Using aux classes de votre projet pour l'espace (s) de noms dans votre nouvelle DLL.

+0

Voir mon commentaire à JohnIdol ci-dessus ... erm ci-dessous, ou whereever il finit; le post frisson déplacé! – Jules

0

Vous pouvez créer un projet de bibliothèque de classes (dont la sortie sera une dll) du studio visuel:

Nouveau projet -> Bibliothèque de classes

Vous pouvez mettre tout votre code là, alors vous pouvez il suffit d'ajouter une référence à la bibliothèque de classes au projet que vous souhaitez utiliser à partir (clic droit références sur l'explorateur de solution):

références -> Ajouter une référence -> Projets -> MyClassLibrary

Pour pouvoir trouver MyClassLibrary dans l'onglet projets, les deux projets doivent être dans la même solution - sinon vous pouvez simplement aller sur 'parcourir' et pointer vers la DLL elle-même.

Puis dans le fichier .vb vous devez utiliser vos classes que vous pouvez faire une MyClassLibrary d'importation:

// assuming the namespace is MyClassLibrary 
imports MyClassLibrary 

À ce stade, vous pouvez simplement utiliser vos sous-classes et contrôles. Si vous allez MyClassLibrary. intellisense vous montrera toutes vos classes.

+0

Bonjour, je pense que vous avez mal compris ma situation. Je dérive des commandes existantes comme un bouton, une case à cocher, une étiquette, etc. L'héritage multiple n'est pas possible, et même si c'était (je ne l'ai jamais utilisé), je ne pense toujours pas qu'il s'appliquerait à ce cas. – Jules

+0

Je ne parle pas d'héritage multiple - juste vous montrant comment mettre vos classes dans une DLL et référence que du projet – JohnIdol

1

Cela pourrait être une idée folle, mais ...

  1. Créer un fichier common.vb avec le code dont vous avez besoin.
  2. Créez des fichiers de classes partielles pour chacun de vos contrôles dans lesquels vous allez ajouter l'exemple de code.
  3. Créez un fichier de commandes qui copiera les données de votre fichier common.vb dans vos classes partielles
  4. Créez une étape de pré-construction qui exécute ce fichier de commandes.

Si vous avez besoin du code copié dans les classes partielles avant la compilation, vous pouvez toujours exécuter le fichier de commandes.

Et cela, bien sûr, en supposant que VB.NET a le concept de classes partielles. Et NON, je n'ai pas essayé cela à la maison ... ;-D

+0

Salut, oui vb.net a des classes partielles. Je n'ai jamais créé ni inclus un fichier batch dans le pré-build avant. Je vais jeter un coup d'oeil à ça.Je présume cependant que le fichier batch aurait besoin d'un peu d'intelligence - comme savoir comment appeler chaque fichier partiel, ou, si ce n'est pas le cas, sachant coller le code après l'instruction de début de classe? – Jules

+0

J'appelais un fichier batch, mais si vous avez besoin d'intelligence, vous devrez peut-être créer une application pour faire ça ... Je vous ai dit que ça pourrait être une idée folle ... ;-D –

1

Je soutiendrais la réponse de nobugz. Même s'il y avait une déclaration #Include, je ne pense pas que ce soit une bonne idée. Toute modification dans le fichier d'inclusion peut facilement casser l'un de vos 8 contrôles utilisateur sous-classés.

MAIS: Qu'est-ce que pourrait travail, si tous les changements communs peuvent être intégrés dans les commandes utilisateur sous-classé par les gestionnaires d'événements, ou si les changements sont du type où vous définissez les propriétés communes de vos contrôles utilisateur à des valeurs particulières, est une classe qui applique les modifications de code à tout contrôle utilisateur qui lui est passé:

Class CommonChanges 

    Private Readonly WithEvents DerivedUserControl As Windows.Forms.Control 

    Public Sub New(ByVal derivedUserControl As Windows.Forms.Control) 
     Me.DerivedUserControl = derivedUserControl 
    End Sub 

    Private Sub DerivedUserControl_OnClick(sender As Object, e As EventArgs) _ 
       Handles DerivedUserControl.Click 
     ' ... ' 
    End Sub 

    ... ' (more event handlers with common code go here) ' 

End Class 

Ensuite, vous définissez vos 8 contrôles utilisateur personnalisés comme:

Class MyDerivedUserControl 
    Extends Button ' (or whatever control it extends) ' 

    Private ReadOnly Changes As CommonChanges 

    Public Sub New 
     Changes = New CommonChanges(Me) 
     '^'CommonChanges' will subscribe to this class's events and possibly 
     ' apply other changes to the control object 'Me'. 
     ... 
    End Sub 
End Class 

Cet objet Changes de type CommonChanges souscrira à des événements de votre MyDerivedUserControl classe et accrochez les gestionnaires définis dans CommonChanges pour eux.

De plus, vous pouvez appliquer directement des modifications à l'objet Control transmis au constructeur CommonChanges de cette manière.

+0

Salut, c'est une idée intéressante mais ça ne marchera pas. 50% du code observe les propriétés existantes afin que je puisse modifier les attributs pour les masquer de la grille et de l'éditeur de propriété. Pourquoi ne pensez-vous pas qu'une déclaration d'inclusion serait une bonne idée? Si j'avais le contrôle sur la classe de contrôle et que j'enlevais une propriété ou une méthode, ou que je changeais une signature, je casserais toutes les dépendances. C'est la même chose. (Eta c'est la même chose à l'exécution). – Jules

+0

@Jules: Si vous souhaitez masquer les propriétés de la grille des propriétés, vous pouvez peut-être jeter un oeil à 'TypeDescriptor' et' ICustomTypeDescriptor'. La mise en œuvre de cette dernière interface devrait vous permettre de contrôler comment et quelles propriétés sont exposées. Je ne l'ai pas fait moi-même, mais cela pourrait valoir la peine d'être examiné. - Et oui, vous avez probablement raison de dire que les fichiers d'inclusion fonctionneraient aussi bien. C'est juste que j'ai pris l'habitude de ne pas les utiliser, et ils ne me manquent pas. Je me souviens de mes jours C++ que changer quelque chose dans un fichier d'inclusion pourrait facilement casser plusieurs fichiers de code. – stakx

1

Je me souviens avoir lu quelque part que Microsoft avait pris une décision de conception spécifique (au moins en C#) de ne pas permettre d'inclure du code source externe de cette manière.

Nous avons estimé que l'inclusion de fichiers sources pourrait être utile en C++, mais qu'elle pourrait aussi introduire de la complexité et réduire la lisibilité.

Dans un langage OO, il existe généralement de bonnes alternatives, la plus évidente étant la composition d'objet et la délégation.

Voilà comment je l'ai traité cette situation dans le passé:

class CommonCode 
{ 
    public void HandlePaint(Control c, PaintEventArgs a) 
    { 
     // Do shared code 
    } 
    public void HandleResize(Control c) 
    { 
     // Do shared code 
    } 

} 

class MyButton : Button 
{ 
    private CommonCode m_common=null; 

    public MyButton() 
    { 
     m_common=new CommnCode();   
    } 
    protected override OnPaint(PaintEventArgs a) 
    { 
     m_common.HandlePaint(this,a); 
    } 

    protected override void OnResize(EventArgs e) 
    { 
     m_common.HandleResize(this); 
    } 

} 

class MyTextbox :Textbox 
{ 

    private CommonCode m_common=null; 

    public MyTextbox() 
    { 
     m_common=new CommnCode();   
    } 
    protected override OnPaint(PaintEventArgs a) 
    { 
     m_common.HandlePaint(this,a); 
    } 

    protected override void OnResize(EventArgs e) 
    { 
     m_common.HandleResize(this); 
    } 

} 
+0

C'est similaire à ce que j'ai suggéré. Seul votre exemple de code est beaucoup plus clair. +1 pour ça. – stakx

Questions connexes