Accueil
Rechercher:
sur developpez.com sur les forums
Forums | Tutoriels | F.A.Q's | Participez | Hébergement | Contacts
Club Emploi Blogs   TV   Dév. Web PHP XML Python Autres 2D-3D-Jeux Sécurité Windows Linux PC Mac
Accueil Conception Java DotNET Visual Basic  C  C++ Delphi MS-Office SQL & SGBD Oracle  4D  Business Intelligence
FORUMS .NET FAQs .NET TUTORIELS .NET SOURCES .NET LIVRES .NET OUTILS .NET BLOG .NET DOTNET TV


Créer d'un composant .Net et l'intégrer dans l'EDI de C# Builder

Par CGi

Le 1er octobre 2003




Ayant survolé .Net et son langage C#, j'ai pu constater que la syntaxe des classes de ce langage notamment celle des WinForms était proche de la VCL (Librairie de Composants Visuel de Borland utilisée dans Delphi et C++ Builder). Ayant fait quelques composants avec C++ Builder, je me suis dit, pourquoi pas essayer d'en faire un pour DotNet.

Création d'un composant pas à pas :

Dans ce tutorial nous allons donc voir comment créer un composant visuel pour WinForms. (Dans l'environement .Net ce type de composant s'appelle un "Contrôle".) Quand il sera terminé, ce composant apparaîtra donc sur la palette des composants, vous n'aurez plus qu'à le poser sur une Winform pour l'utiliser. Les explications données sur l'EDI serons celle de C# Builder, le code étant le même quelque soit l'EDI. N'ayant pas Visual Studio .Net à ma disposition, je ne pourrais pas vous éclairer à ce sujet, mais je suppose que le principe est semblable. Nous créerons pour l'exemple un LabelDate, composant qui affichera la date du jour soit en chiffres soit en lettres.

Création du composant :

Sur le menu faire "Fichier" puis "Nouveau" puis "Bibliothèque de classe C#" ce qui a pour effet d'ouvrir la boîte de dialogue "Nouvelle application".

   

Nous remplacerons la valeur de son champs Nom "ProjectX" par "Composant", ce sera le nom du projet. Puis faire "Ok".
Maintenant nous avons le code source minimum pour notre composant :

Fichier Class.cs :

using System;

namespace Composant
{
  /// <summary>
  /// Description Résumé de Class.
  /// </summary>
  public class Class
  {
    public Class()
    {
      //
      // TODO: Ajouter ici la logique du constructeur
      //
    }
  }
}

Maintenant il nous faut ajouter les références aux assemblages nécessaires au projet. en l'occurrence System.Drawing et System.Windows.Forms. Pour cela faites un click droit sur le gestionnaire de projet puis sur le PopupMenu choisir "Ajouter une référence...", ce qui nous ouvre la boîte de dialogue "Ajouter une référence" (Voir image si dessous) Dans la liste du haut sélectionner System.Drawing puis faire "Ajouter référence", faire la même opération pour System.Windows.Forms, puis faire "Ok". Maintenant nos deux références sont visibles dans la liste des références du gestionnaire de projet.





Code du composant :

Class.cs :

using System;
using System.Drawing;
using System.Windows.Forms;
using System.ComponentModel;

namespace Composant
{

  public class LabelDate : Label   // Hérite de Label
  {
    private bool flettre;
    private DateTime d1;
    //--------------------------------------------------------
    // Nouvelle propriété

    [Category("Appearance"),
     Description("Affiche la date en lettres si à true sinon en chiffre."),
     DefaultValue(true)]

    public bool Lettre      // Propriété Lettre
    {
       get
       {
      return flettre;
       }
       set
       {
      flettre = value;
      SetTexte();
       }
    }
   //--------------------------------------------------------
    public LabelDate() : base()    // Constructeur
    {
      flettre = true;
      d1 = DateTime.Now;
      Size = new System.Drawing.Size(200, 30);
      TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
    }
   //--------------------------------------------------------
    protected void SetTexte()
    {
      if (flettre) Text = d1.ToLongDateString();
      else Text = d1.ToShortDateString();
    }
   //--------------------------------------------------------
    protected override void OnCreateControl()
    {
      base.OnCreateControl();
      SetTexte();
    }
   //--------------------------------------------------------
    protected override void OnTextChanged( EventArgs e )
    {
      Invalidate();
    }
  }
}

Nous y renommons la Classe "Class" en "LabelDate", ceci est important car ça sera le nom du composant. (Renommer aussi son constructeur) Elle héritera de la classe Label.
Nous y ajoutons les directives "using" pour System.Drawing, System.Windows.Forms et System.ComponentModel .
Nous déclarons deux données membres d1 de type DateTime et flettre de type bool. Le constructeur appellera le constructeur de la classe héritée. (Base) Nous y initialiserons quelques propriétés héritées(Size et TextAlign), d1 avec la date du jour actuel et flettre à true.
Nous redéfinissons la méthode OnCreateControl pour initialiser la propriété Text de notre composant (Cette propriété ne peut pas s'initialiser à la construction) par l'appel de SetTexte, dans cette dernière on affecte à Text la date en chiffres ou en lettres en fonction de la valeur de flettre.

Nouvelle propriété :
Nous allons maintenant créer la nouvelle propriété qui nous permettra d'afficher la date en chiffres ou en lettres. La valeur de cette propriété sera conservée dans la donnée membre privé "flettre". Elle aura pour nom "Lettre" et sera bien sûr du même type que la donnée membre lui correspondant, elle sera déclarée "public" pour y avoir accès de l'extérieur de la classe. Ce qui la différencie d'une donnée membre ordinaire c'est qu'elle possède deux méthodes: "get" et "set" servant à lire ou modifier sa valeur. Ce système permet de garder l'encapsulation des données tout en utilisant les propriétés comme si elles étaient des données membres déclarées public. Donc sa méthode "get" retourne la valeur contenue dans flettre et sa méthode "set" affecte la nouvelle valeur à flettre, puis rafraîchit l'affichage du composant. (On y trouve souvent la méthode Invalidate quand il s'agit de rafraîchir un dessin) Dans le cas de notre label nous appellerons SetLettre pour changer son texte en fonction de la valeur de flettre. Le rafraîchissement se fera dans la méthode OnTextChanged qui est appelée automatiquement quand le texte du label a changé.
Autre avantage d'une propriété c'est que l'on y a accès à la conception par l'intermédiaire de l'inspecteur d'objet. (Voir image ci-dessous)




Juste avant la définition de la propriété Lettre on peut voir ces lignes entre crochets :
    [Category("Appearance"),
     Description("Affiche la date en lettres si à true sinon en chiffres"),
     DefaultValue(true)]

Ce sont les Attributs de la propriété, il doivent être définis avant chaque propriété que l'on a défini dans notre composant, ici ils servent à l'agencement de la propriété dans l'inspecteur d'objet. Category sélectionne la rubrique de propriétés où l'on veut voir apparaître la propriété. (Voir liste dans l'aide : Bibliothèque de classes -> System.ComponentModel -> CategoryAttribute) Description en donne une description qui apparaîtra dans la statut bar sous l'inspecteur d'objet et DefaultValue donne sa valeur par défaut. (En leurs absences la propriété sera mise dans une catégorie nommée "Divers")
A ce stade notre composant n'est toujours pas visible dans la palette, donc il nous faut l'installer. Ce que nous allons voir dans les étapes suivantes.


Icône représentant le composant sur la palette de composants :

Avant de compiler notre composant nous allons lui ajouter une icône personnalisée qui le représentera sur la palette de composants. (Si vous ne faites pas cette opération vous aurez l'icône par défaut.) Pour cela vous devez créer une image de dimension 16 x 16 pixels et l'enregistrer au format bitmap avec le même nom que la classe, donc pour notre labelDate ça sera "LabelDate.bmp". Puis il faut l'ajouter au projet pour cela faire dans le menu : "projet" puis "Ajouter au projet..." ce qui ouvre la boîte de dialogue "ajout au projet" choisir type de fichier "Bmp (*.bmp)" puis sélectionner le fichier "LabelDate.bmp" préalablement créé et faire "Ouvrir".

Installation du composant sur la palette :

Avant de l'installer il nous faut d'abord le compiler. Pour cela faire sur le menu : "Projet" puis "Construire Composant". Si vous n'avez aucun message d'erreur, c'est que tout s'est bien passer. Un Assembly nommé "Composant.dll" a été créé. C'est lui qui contient le composant. Nous allons donc le mettre sur la Palette, pour cela sur le menu faites : "Composant" puis "Composant .Net installé..." Ce qui nous ouvre la boîte de dialogue "Composant .Net installé" Cliquer sur son bouton "Sélectionner assemblage..." ce qui nous ouvre la boîte de dialogue "Accéder à un assemblage ou exécutable" sélectionner l'Assembly "Composant.dll" créé lors de la précédente compilation et faire "Ouvrir". Maintenant votre composant va se trouver dans la liste de la boîte de dialogue "Composant .Net installé" onglet "Composant .Net installé".




Faites "Ok", votre composant est maintenant installé. Il est visible dans la palette de composants. Vous pouvez le tester sur un nouveau projet.





Bonne composition.
CGi


Avec la contribution de Stessy pour la relecture.

Télécharger les sources.





C/C++

  Les pointeurs du C/C++.   Les listes chaînées.             Liste simple.             Liste triée.             Liste double.   Le C orienté objets ?

API Windows

  1 - La fenêtre principale.   2 - Contrôles et messages.   3 - Les commandes.   4 - Dialogue std.   5 - Contexte de périph.   6 - Dessiner.   7 - Les ressources.   8 - Dialogue perso.   9 - Dialogue comm.   10 - Les accélérateurs.

C++ BUILDER

  Trucs et astuces.   Composant.   TRichEdit.   TDrawGrid.   Application MDI.   TThread.   wxWidgets.   Style Win XP.

wxWidgets

  Première application.   Construire un menu.   Dessiner.   Sisers, Timers...   Dialogues standards.   Dialogues perso.

DotNet

  Composant C# Builder.   Contrôle WinForm.   Application MDI.

Java

  Applet java.





Copyright 2002-2007 CGi - Tous droits réservés CGi. Toutes reproduction, utilisation ou diffusion de ce document par quelque moyen que ce soit autre que pour un usage personnel doit faire l'objet d'une autorisation écrite de la part de l'auteur, propriétaire des droits intellectuels.
Les codes sources de ce document sont fournis en l'état. L'utilisateur les utilise à ses risques et périls, sans garantie d'aucune sorte de la part de l'auteur. L'auteur n'est responsable d'aucun dommage subi par l'utilisateur pouvant résulter de l'utilisation ou de la distribution des codes sources de ce document.
De la même façon, l'auteur n'est en aucun cas responsable d'une quelconque perte de revenus ou de profits, ou de données, ou de tous dommages directs ou indirects, susceptibles de survenir du fait de l'utilisation des codes sources de ce document, quand bien même l'auteur aurait été averti de la possibilité de tels dommages. L'utilisation des codes sources de ce document vaut acceptation par l'utilisateur des termes de la licence ci-dessus.

Responsable bénévole de la rubrique DotNET : Jérôme Lambert (Cardi) - Contacter par EMail :
Vos questions techniques : forum d'entraide DotNET - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Copyright © 2000-2008 www.developpez.com - Legal informations.