IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi .NET Discussion :

Créer un composant composite ?


Sujet :

Delphi .NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Jayceblaster
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    420
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 420
    Par défaut Créer un composant composite ?
    Bonjour...

    Voila mon ptit problème...

    J'ai créé un petit programme de login (mot de passe et nom utilisateur) sous delphi.NET (VCL) et je souhaiterai en faire une classe mais le problème c'est que je n'ai jamais fait de classe qui lors de son instanciation créé un objet graphique..
    En effet lorsque cette classe sera instanciée elle devra créer une form dans laquelle on sera inviter a saisir notre mot de passe.

    Je supose qu'il faut que je fasse, dans le constructeur de ma classe, une sorte de Form Create mais je sais pas du tout comment faire...

    Quelqu'un peut m'aider?

  2. #2
    Membre éclairé Avatar de Jayceblaster
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    420
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 420
    Par défaut
    Y a personne qui peut m'aider ou m'indiquer un lien vers un cours????


  3. #3
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Il existe déjà une fiche de ce type sous Delphi.

  4. #4
    Membre éclairé Avatar de Jayceblaster
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    420
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 420
    Par défaut
    Tu veux parler du menu "composant VCL"? (je suis sous Delphi 2006 pro)

    En fait moi je souhaite faire une classe qui lorsque je l'instancierai me créra une form avec des panel et des bouton... et non un composant ( c'est un objet)

    D'habitude je travaille en C# et je dispose, pour créer une classe, d'une bibliotheque de classe.

    En Delphi .net je retrouve pas cette possibilité alors comment dois je faire pour créer une classe que je pourrai par la suite instancier depuis n'importe quel projet VCL?

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Février 2006
    Messages
    624
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 624
    Par défaut
    L'une des approches possibles pour sauvegarder et restaurer une Tform est de proceder ainsi:

    Sauvegarde:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WriteComponentRes('MaForm.nfm', self)
    Restauration:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function CreateForm(FormClass: TFormClass; AOwner: TComponent; FrmFile: string): TForm;
    begin
      if FileExists(FrmFile) then
      begin
        Result:=(FormClass).CreateNew(AOwner);
        ReadComponentResFile(FrmFile, Result);
      end
      else
        Result:=(FormClass).Create(AOwner);
      end;
    end;
    Note: CreateNew crée la form mais ne la charge pas.Ce rôle est réservé à ReadComponentResFile.

  6. #6
    Membre éclairé Avatar de Jayceblaster
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    420
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 420
    Par défaut
    salut Fabrice....

    J'ai rien compris a ce que tu m'as dit (je suis débutant )...

    je rappelle que mon objectif et de faire une classe en delphi .NET que je pourrai instancier dans un projet Delphi .NET. Et, lors de cette instanciation je dois créer une forme sur laquelle il y a des Boutons...

    Voila la classe que j'ai écrite:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    unit login;
    interface
    uses
      SysUtils, Classes, System.ComponentModel, Borland.Vcl.Controls,
      Borland.Vcl.ExtCtrls, IniFiles, Borland.Vcl.StdCtrls, Borland.Vcl.Forms;
     
    type
      Tlogin = class(TForm)
        //déclaration de tout ce qu'il y a sur la form
        Label1: TLabel;
        nomUtilisateur: TComboBox;
        Label2: TLabel;
        Mot_Passe: TEdit;
        Label3: TLabel;
        Button1: TButton;
        Button2: TButton;
        Label4: TLabel;
        procedure Button2Click(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        { Déclarations privées }
      protected
        { Déclarations protégées }
      public
        { Déclarations publiques }
      published
        { Déclarations publiées }
      end;
    procedure Register;
    implementation
     
    procedure Tlogin.FormCreate(Sender: TObject);
    begin
        nomUtilisateur.Items.Add('Jean');     //ajout des noms dans la liste
        nomUtilisateur.Items.Add('Francois');
        nomUtilisateur.Items.Add('Pascal');
    end;
     
    procedure Tlogin.Button1Click(Sender: TObject);
    var
      FichierIni          : TIniFile;
      sLecture_FichierIni, sNom_Utilisateur : string;
    begin
      FichierIni := TIniFile.create('C:\Mots_Passe.ini');  //fichier mot de passe
      sLecture_FichierIni := FichierIni.ReadString('mot de passe',nomUtilisateur.Text,'Votre mot de passe est erroné. Veuillez le saisir de nouveau');
      if Mot_Passe.Text = sLecture_FichierIni then
        Application.MessageBox('le mot de passe est correct', nil)
      else
        Application.MessageBox('le mot de passe est incorrect', nil);
      FichierIni.Free;
    end;
    procedure Tlogin.Button2Click(Sender: TObject);
    begin
      Application.Free;
    end;
    end.
    le fichier mot de passe .ini est le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
     [mot de passe]
      Jean = mot_passe1
      Francois = mot_passe2
      Pascal = mot_passe3
    Mais lorsque j'instancie cette classe rien ne se passe...
    Alors deux solution sois cette classe est nulle soit je ne l'instancie pas correctement ?

  7. #7
    Membre éclairé Avatar de Jayceblaster
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    420
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 420
    Par défaut
    non en fait tu as raison maintenant avec delphi 2006 c'est plus des fichier dfm mais des nfm (bizarre ). Enfin bref....le contenu est le meme.
    Mais je ne comprend pas trop ce que tu veux que je fasse.
    Regarde moi j'ai un projet VCL avec une IHM qui contient des boutons et des zones de saisie.
    Je te redonne le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    unit login;
    interface
    uses
      SysUtils, Classes, System.ComponentModel, Borland.Vcl.Controls,
      Borland.Vcl.ExtCtrls, IniFiles, Borland.Vcl.StdCtrls, Borland.Vcl.Forms;
     
    type
      Tlogin = class(TForm)
        //déclaration de tout ce qu'il y a sur la form
        Label1: TLabel;
        nomUtilisateur: TComboBox;
        Label2: TLabel;
        Mot_Passe: TEdit;
        Label3: TLabel;
        Button1: TButton;
        Button2: TButton;
        Label4: TLabel;
     
      private
        { Déclarations privées }
      protected
        { Déclarations protégées }
      public
        procedure Button2Click(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      published
        { Déclarations publiées }
      end;
     
    implementation
     
    procedure Tlogin.FormCreate(Sender: TObject);
    begin
        nomUtilisateur.Items.Add('Jean');     //ajout des noms dans la liste
        nomUtilisateur.Items.Add('Francois');
        nomUtilisateur.Items.Add('Pascal');
    end;
     
    procedure Tlogin.Button1Click(Sender: TObject);
    var
      FichierIni          : TIniFile;
      sLecture_FichierIni, sNom_Utilisateur : string;
    begin
      FichierIni := TIniFile.create('C:\Mots_Passe.ini');  //fichier mot de passe
      sLecture_FichierIni := FichierIni.ReadString('mot de passe',nomUtilisateur.Text,'Votre mot de passe est erroné. Veuillez le saisir de nouveau');
      if Mot_Passe.Text = sLecture_FichierIni then
        Application.MessageBox('le mot de passe est correct', nil)
      else
        Application.MessageBox('le mot de passe est incorrect', nil);
      FichierIni.Free;
    end;
    procedure Tlogin.Button2Click(Sender: TObject);
    begin
      Application.Free;
    end;
    end.
    et je souhaite réutiliser ce code (avec le panel dans un autre projet VCL).
    Je fais alors:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
      //form1 est la form du nouveau projet vcl censé appelé ma fenetre de login
      procedure Form1.FormCreate(Sender: TObject);
    var
      monLogin : login.Tlogin;
    begin
       monLogin.create(self);  //création de mon objet
       monLogin.FormCreate(nil); //appel de la création de ma fenetre login
    end;
    A la suite de ce code j'espere afficher mon panel de login mais rien ne se passe.

    rem: j'ai inclu en premier un 'use login'

  8. #8
    Membre émérite
    Avatar de neilbgr
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 651
    Par défaut
    C'est ton dernier code qui nous interresse !!!
    Et donc pour créer une instance, en Pascal, c'est comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      //form1 est la form du nouveau projet vcl censé appelé ma fenetre de login
      procedure Form1.FormCreate(Sender: TObject);
    var
      monLogin : login.Tlogin;
    begin
       monLogin := login.Tlogin.create(self);  //création de mon objet
       // L'evenement FormCreate sera appelé tout seul
       // Maintenant affichons cette form :
      monLogin.Show;
    end;

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Février 2006
    Messages
    624
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 624
    Par défaut
    ok, c'est plus clair, en fait tu souhaitais juste instancier une classe.

    Par contre, dans le code de neilbgr tu peux remplacer monLogin.Show par monLogin.ShowModal
    Places la propriété ModalResult du Button1 à mrOK et celle du Button2 à mrCancel.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    procedure Tlogin.Button1Click(Sender: TObject);
    var
      FichierIni          : TIniFile;
      sLecture_FichierIni, sNom_Utilisateur : string;
     
    begin
      ModalResult := mrOK; 
      ....
     
     
    procedure Tlogin.Button2Click(Sender: TObject);
    begin
      ModalResult := mrCancel;
      Application.Terminate;
    end;
    Dans le second projet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      monLogin := Tlogin.create(self);
    ou :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      monLogin := Tlogin.create(Application);
    ou bien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      Application.CreateForm(TLogin, login);
    ou encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       monLogin := Tlogin.create(Nil);
    mais dans ce dernier cas il faudra penser à libérer explicitement la classe par un appel à "login.Free;"

    puis dans tous les cas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      monLogin.ShowModal;
    ---------

    Il faudra revoir la sécurité du mot de passe, actuellement il est en clair dans un fichier .ini,
    ce qui n'est pas acceptable.

    Finalement ton sujet c'était plutôt "comment instancier une classe TForm?" et non pas "comment créer un composant composite?"
    parce qu'entre les 2, bah il y a tout de même une certaine marge.

    Soit la fiche est auto-générée par l'application (Application.CreateForm) et c'est le cas dans ton projet contenant l'unité
    Login, soit elle est créée manuellement (monLogin := TLogin.Create(Self)) comme dans ton second projet (ajout de l'unité Login.pas).

    En revanche, si tu souhaites coder "une classe qui lorsque tu l'instancieras créera une form" alors elle devra être capable de recenser la
    form, créer un .nfm , sauvegarder et charger la form etc.
    J'ai emprunté cette voie là qui, après enquête, semble bien pénible à mettre en oeuvre...

  10. #10
    Membre éclairé Avatar de Jayceblaster
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    420
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 420
    Par défaut
    Merci pour votre aide....
    J'essaye ca demain et je vous dit quoi

    Finalement ton sujet c'était plutôt "comment instancier une classe TForm?" et non pas "comment créer un composant composite?"
    parce qu'entre les 2, bah il y a tout de même une certaine marge.
    C'est pas moi qui ai mis ce titre, il a était renommé...

  11. #11
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Jayceblaster
    C'est pas moi qui ai mis ce titre, il a était renommé...
    Un modérateur à modifiè le titre (Merlin je pense), cela permet d'avoir une base plus pertinente lors des recherches, de plus les autres membres accorderont un peu plus d'attention à ton post.

Discussions similaires

  1. Comment créer un composant graphique???
    Par Mickey.jet dans le forum Delphi .NET
    Réponses: 2
    Dernier message: 29/03/2006, 14h56
  2. [Débutant][VBS] Créer un composant signé
    Par cocula dans le forum VBScript
    Réponses: 1
    Dernier message: 13/02/2006, 12h58
  3. [List] Créer mon composant
    Par soad dans le forum Composants
    Réponses: 3
    Dernier message: 02/12/2005, 08h00
  4. [vb.net] Impossible de créer le composant ActiveX [win98]
    Par arnolem dans le forum Windows Forms
    Réponses: 10
    Dernier message: 12/07/2005, 12h09
  5. Intercepter un Message Windows ? Créer un Composant Grille !
    Par TOTO32 dans le forum Composants VCL
    Réponses: 6
    Dernier message: 21/07/2004, 13h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo