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 Discussion :

Instancier plusieurs fois le même écran?


Sujet :

Delphi

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Août 2004
    Messages
    696
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 696
    Points : 225
    Points
    225
    Par défaut Instancier plusieurs fois le même écran?
    Bonjour,

    Je voudrais instancier plusieurs fois le même écran:
    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
     
    type
      TForm1 = class(TForm)
        Edit1: TEdit;
        Label1: TLabel;
        Button1: TButton;
        Button2: TButton;
        procedure Button2Click(Sender: TObject);
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
    Dans mon code (la gestion de cet écran) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    procedure lance_ecran;
    begin 
    My_Ecran := TForm1.Create(nil)
    end;
     
    procedure Libere_ecran;
    begin 
    My_Ecran.release;
    My_Ecran := Nil;
    end;
    Mon problème est le suivant si je veux instancier plusieurs fois cet écran c'est a dire que j'aurais plusieurs fois le même écran.

    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
    Ex: 
    Procedure Button1Click;
    begin
    lance_ecran;//Lance écran TForm1 -->1er  écran
    lance_ecran;//Lance écran TForm1 -->2eme écran
    .....
    end
     
    Procedure Button2Click;
    begin
    Libere_ecran;//Libére écran TForm1 -->1er  écran
     
    Libere_ecran;//Lance écran TForm1 -->2eme écran ==>exception car MY_ecran est déja libéré par le premier libere_ecran
    .....
    end
    A la libération du deuxieme écran (même nom que le premier) j'aurais une exception.

    j'ai pensé à donner des noms différents à chacun de mes écrans, mais je ne sais pas comment faire, peut être la propriété name avec un nom différents.

    j'espère que vous avez compris ce que je veux faire ?


    pouvez-vous m'aider ?
    Cordialement
    kaiss

  2. #2
    Membre chevronné Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut
    Tu veux combien d'écrans en même temps ?

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Août 2004
    Messages
    696
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 696
    Points : 225
    Points
    225
    Par défaut
    Bonjour,

    En fait autant de fois que nécessaier, c'est une messagrie, donc tant que le gestionnaire click sur la messagerie (inbox) un écran apparait avec le détails du message un peu comme outlook.

    en résumé si le gestionnaire click 20 fois il y aura 20 écrans, soit n click ==>n écrans

    merci
    Qays

  4. #4
    Membre chevronné Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut
    Bon le plus simple pour ton cas alors c'est d'utilise run TList de tes instances.
    Pour l'explication je te donnerais ma vision des choase avec un Array et si ça marche tu passes au TList.

    Par contre petite question supplémentaire : dans ton code tu as un bouton qui libère tes instances : elles sont toutes libérées en même temps ou tu peux libérer la 12 avant la 16 etc... ?

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Août 2004
    Messages
    696
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 696
    Points : 225
    Points
    225
    Par défaut
    merci de vos contribution.

    En fait j'ai pensé aussi à un tableau avec une occurence pour chaque écran alloué. mon problème est comment déterminer l'écran que je clos en effet le code est le meme pour la cloture, (c'est dire utilisation de la méthode Close de l'ecran Tform1), donc comment le code sait que je clos l'écran 16 ou l'écran 12.

    En résumé quand je clique sur le button fermer, j'appelle la methode FormClose(....), mais comment formclose sait ce qui est fermer.

    Car le code de FormClose est le suivant :

    begin
    MON_ECRAN.RELEASE;
    MON_ECRAN := Nil;
    end;
    PS, je peux cloturer l'ecran 16, puis le 5 , puis le 20 etc....

    Cordialement
    Qays

  6. #6
    Membre chevronné Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut
    Euh ... comment ton utilisateur fait pour fermer un des écrans ? (quand je le saurais je pourrais te dire comment on code).

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Août 2004
    Messages
    696
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 696
    Points : 225
    Points
    225
    Par défaut
    Imaginer outlook l'écran Inbox est instancié un fois

    Ensuite je clique sur une ligne j'ouvre un écran (écran_1) détails du message(Tform1), je clique sur une autre ligne (écran_2) détaisl du message (Tform1)etc... jusqu'a l'écran_n (Tform1).

    Une fois que j'ai lue le message je clos (bouton Fermer de mon écran) je clos l'ecran_n , l'ecran_5, l'ecran_1 etc....

    merci
    Qays

  8. #8
    Membre chevronné

    Profil pro
    Chef de Projet / Développeur
    Inscrit en
    Juin 2002
    Messages
    607
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de Projet / Développeur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2002
    Messages : 607
    Points : 2 066
    Points
    2 066
    Par défaut
    Bonjour,

    Si tu utilise la même variable pour référencer toutes tes instances, tu va forcement avoir un problème.

    Le mieux serait que ta fenêtre secondaire, soit autonome.
    Dans le FormClose, tu met Action à caFree

    Ta form principale, n'a donc pas à se souvenir (référecer) les différentes instances qu'elle a lancée.

    Tu as quelque chose du style.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure lance_ecran;
    var
       f : TForm1 ;
    begin
      f := TForm1.Create(Form_Appelante) ;
      f.Show ; 
    end;
    f est oublié dès que l'instance est lancée (puisque variable locale)
    Le fait de passer en paramètre FormAppelante, fait que dans Form1 tu pourra faire des choses du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TForm_Appelante( Owner).AppelPourNotifierUnTruc( self)
    et dans ta form appelante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TFormAppelante.AppelPourNotifierUnTruc( f : TForm);
    begin
        with f as TForm1 do begin
           ...
           ...
        end;
        // éventuellement 
        // (mais mettre Action à caHide dans FormClose de TForm1)
       TForm1( f ).Free ;
    end
    Si tu veux réellement que ta form principale connaisse toutes ses filles ...

    Il faudrait que dans ta form principale, tu ai dans le FormCreate :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ma_liste_fenetre := TObjectList.Create( false );
    et dans le FormDestroy
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ma_liste_fenetre.Free ;
    LancerEcran va devenir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure lance_ecran;
    var
       f : TForm1 ;
    begin
      f := TForm1.Create(Form_Appelante) ;
      ma_liste_fenetre.Add( f );
      f.Show ;
    end;
    LA libération va être compliqué, comme expliqué en début, la TForm1 devra appeler une procédure de FormAppelante en s'auto-référençant en paramètre.

    Il sera alors possible de faire une recherche dans la liste :

    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
    procedure TFormAppelante.AppelPourNotifierUnTruc( f : TForm);
    var
      i : integer ;
      f1 : TForm1 ;
    begin
       f1 := nil ;
       for i := 0 to ma_liste_fenetre.Count-1 do begin
          if ma_liste_fenetre.Items.Item[i] = f then begin
             f1 := TForm1( ma_liste_fenetre.Items.Item[i] );
             break ;
          end ;
       end ;
       // je peux travailler avec mon instance
       if assigned( f1 ) then begin
          f1.Ceci ;
          // et éventuellement
          ma_liste_fenetre.remove( f1 );
          f1.free ; 
       end 
       else
          ShowMessage('J''ai foiré quelque part, car je ne retouve plus ma fenêtre');
    end
    Tu pourras aussi faire un truc du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TFormAppelante.AToutesLesFilles;
    var
      i : integer ;
      f1 : TForm1 ;
    begin
       for i := 0 to ma_liste_fenetre.Count-1 do begin
          f1 := TForm1( ma_liste_fenetre.Items.Item[i] );
          // un "with as" aurait fonctionné aussi
          f1.Ceci ;
       end ;
    end
    Bon c'est de "l'à peu près" et demande à être affiné.

    Cordialement

  9. #9
    Membre chevronné Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut
    Je n'ai pas compris : pour fermer tu clique sur le bouton 'fermer' mais celui ci est t'il sur chaque écran ouvert ou sur la fenêtre principale ?

    Partons du principe que tu gères un tableau :

    SI le bouton 'fermer' est sur chaque Form Instanciée, le close de la forme instanciée va marcher, si c'est sur la fenêtre principale il faut que tu fasses une boucle qui parcours ton tableau et qui libère chaque Form <> nil.

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Août 2004
    Messages
    696
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 696
    Points : 225
    Points
    225
    Par défaut
    merci j'essaye et vous donne des nouvelles

    Cordialement
    Qays

  11. #11
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 770
    Points
    2 770

Discussions similaires

  1. Instancier plusieurs fois un même objet persisté
    Par taupinfada dans le forum Hibernate
    Réponses: 1
    Dernier message: 04/11/2011, 14h18
  2. [VBA-W] Executer plusieurs fois la même procédure
    Par delamarque dans le forum VBA Word
    Réponses: 3
    Dernier message: 05/12/2005, 13h39
  3. [JFrame] réafficher plusieurs fois un même panel à l'écran
    Par Monkeyget dans le forum Agents de placement/Fenêtres
    Réponses: 4
    Dernier message: 01/04/2005, 14h29
  4. SELECT plusieurs fois les mêmes champs
    Par aergil dans le forum Langage SQL
    Réponses: 2
    Dernier message: 22/02/2005, 12h10
  5. [VB.NET] Appliquer plusieurs fois la même fonction...
    Par MiJack dans le forum Windows Forms
    Réponses: 9
    Dernier message: 22/09/2004, 10h52

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