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

Langage Delphi Discussion :

comment tester si une instance d'une fiche est creer


Sujet :

Langage Delphi

  1. #1
    Futur Membre du Club
    Inscrit en
    Avril 2003
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 8
    Points : 5
    Points
    5
    Par défaut comment tester si une instance d'une fiche est creer
    Bonjour tous le monde, j ai utilise le code suivant pour creer des instances des fiche delphi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Application.CreateForm(TFParametres, FParametres);
    FParametres.Show
    ja veus tester si une instance est deja creer pour empacher de la creer une autre fois,
    Comment je peus faire se tester??
    Ou comment empecher mon code de creer une autre instance d'une fiche deja creer??

  2. #2
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    Déjà j'attribuerai un nom à cette fiche dès sa création et je testerai ensuite l'existence d'un composant dans l'application qui porte déjà ce nom.
    Attention le nom donné à la fiche doit être unique. Pas d'autre composant ne peut porter ce nom.
    Cela donne :

    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
    //Je recherche dans l'application si un composant ne porte pas le nom MaForm
      if not Assigned(Application.FindComponent('MaForm'))
        then begin
               showMessage('La fiche MaForm n''existe pas. Je la crée.');
               Application.CreateForm(TFParametres, FParametres);
               with FParametres do
               begin
                 //Je nomme FParametres avec la valeur MaForm
                 Name := 'MaForm';
                 //Je rends visible la fiche 
                 show;
               end;
             end
        else begin
               showMessage('La fiche MaForm existe déjà');
               with FParametres do
               begin
                 //Je rends visible MaForm
                 visible := true;
                 //Je la ramène au premier plan
                 BringToFront;
               end;
             end;
    Cordialement
    Pensez à utiliser les tags dans le titre.
    Avant de poser une question reportez-vous à la FAQ Delphi
    Respectez les règles du forum.

  3. #3
    Membre du Club
    Inscrit en
    Mai 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 49
    Points : 59
    Points
    59
    Par défaut
    Tu peut aussi utiliser le pattern "Singleton"

    1- pour cela tu doit déclarer dans l'unité où se trouve la declaration de ta fiche
    A- une variable qui represente le nombre de reference à ta fiche (elle sera initialisée à 0)
    B- une variable InternalInstance : TMaFiche c'est la une reference interne à ton unique instance

    2- aussi tu doit modifier le constructeur et le destructeur en diminuant leur visibilité. Mais je sais pas si c'est faisable en Delphi, tu peut au lieu de ça interdir l'appele directe des constructeur/destructeur par un petit bidouillage (illustré dans le code)

    3- Tu ajoutes deux fonctions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class function GetSingleInstance:TMaFiche;
    pour avoir une référence a ton instance unique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure ReleaseInstance;
    pour libéré une référence a ton instance


    4- pour finir voici un code d'exemple
    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    unit U_MaFiche;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs;
     
    type
     
      TMaFiche = class(TForm)
      private
        { Déclarations privées }
        class procedure AddRef;
        class procedure ReleaseRef;
      public
        // Constructeur et Destructeur protégé
        constructor Create(AOwner: TComponent); override;
        destructor Destroy; override;
        // les Methodes à utilisé a la place du constructeur et destructeur
        class function GetSingleInstance: TMaFiche;
        procedure ReleaseInstance;
      end;
     
    var
      MaFiche: TMaFiche;
     
    implementation
     
    {$R *.dfm}
     
    var
      InternalInstance: TMaFiche;
      RefCount: Integer;
      CanCallConstructor,
        CanCallDestructor: Boolean;
     
      { TMaFiche }
     
    constructor TMaFiche.Create(AOwner: TComponent);
    begin
      if CanCallConstructor then
        inherited
      else
        raise Exception.Create('Impossible d''appelé directement le constructeur');
    end;
     
    destructor TMaFiche.Destroy;
    begin
      if CanCallDestructor then
        inherited
      else
        raise Exception.Create('Impossible d''appelé directement le Destructeur');
    end;
     
    class procedure TMaFiche.AddRef;
    begin
      Inc(RefCount);
    end;
     
    class function TMaFiche.GetSingleInstance: TMaFiche;
    begin
      CanCallConstructor := True;
      try
        if not Assigned(InternalInstance) then
        begin
          RefCount := 0;
          InternalInstance := Create(nil);
        end;
        AddRef;
        Result := InternalInstance;
      finally
        CanCallConstructor := False;
      end;
    end;
     
    procedure TMaFiche.ReleaseInstance;
    begin
      CanCallDestructor := True;
      try
        ReleaseRef;
        if RefCount <= 0 then
        begin
          Free;
          InternalInstance := nil;
        end;
      finally
        CanCallDestructor := False;
      end;
    end;
     
    class procedure TMaFiche.ReleaseRef;
    begin
      Dec(RefCount);
    end;
     
    initialization
      InternalInstance := nil;
      RefCount := 0;
      CanCallConstructor := False;
      CanCallDestructor := False;
    end.
    N! c'est pas du code très securisé, je l'es ecrit juste pour illustrer mes propos.

    ==============================================
    Bonne chance

  4. #4
    Futur Membre du Club
    Inscrit en
    Avril 2003
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Merci pour votre aide, j'ai utilser la 1ere solution , ca marche, je vais essayer la 2eme pour vous donner le resutats,
    Merci une autre fois

  5. #5
    Membre éprouvé
    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
    Points : 1 177
    Points
    1 177
    Par défaut Re: comment tester si une instance d'une fiche est creer
    Ca me semble assez inhabituel de procéder ainsi à la création de form.

    Simplement, si comme à la coutumé tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FParametres := TFParametres.Create(Application);
    tu peux donc facilement tester que le champ FParametres n'est pas déjà valorisé donc au final :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if Not Assigned(FParametres) then
      FParametres := TFParametres.Create(Self);
    FParametres.Show;
    "Si vous voulez être l’esclave des banques et payer pour financer votre propre esclavage, alors laissez les banquiers créer la monnaie" - Josiah Stamp, 1920, Gouverneur de la Banque d’Angleterre
    "Qui ne peut acheter ruine qui voudrait vendre" - Jacques Duboin.
    "Nous n'héritons pas la terre de nos parents, nous l'empruntons à nos enfants." - Antoine de Saint Exupéry

Discussions similaires

  1. Utiliser une méthode d'une instance, dans une callback
    Par qdaemon_fr dans le forum Langage
    Réponses: 3
    Dernier message: 18/04/2014, 18h09
  2. [ATL] Utiliser une instance d'une règle dans une autre règle
    Par sacha33 dans le forum Eclipse Modeling
    Réponses: 0
    Dernier message: 02/06/2013, 23h41
  3. Réponses: 3
    Dernier message: 06/03/2013, 13h00
  4. Réponses: 5
    Dernier message: 11/10/2010, 09h16
  5. Comment tester si on a selectionné une ligne ou une colonne
    Par damoiselle dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 07/12/2007, 12h07

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