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

Composants VCL Delphi Discussion :

Duplication dynamique de tabsheet


Sujet :

Composants VCL Delphi

  1. #1
    Expert confirmé
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 944
    Par défaut Duplication dynamique de tabsheet
    Bonjour à tous

    Je suis en train de concevoir un petit soft ambitieux dans lequel chaque item géré s'appuie sur un ttabsheet.

    A cet effet, j'ai peuplé le ttabsheet avec d'autres composants, et je souhaite me servir de ce ttabsheet comme d'une matrice que je duplique sur une nouvelle page dès que j'en ai besoin.

    Quels sont l'art et la manière de faire ce genre de chose ?

    Merci de vos conseils.

  2. #2
    Membre extrêmement actif
    Avatar de skywaukers
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2005
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 219
    Par défaut
    Bonjour,

    pourquoi ne pas utiliser un TFrame pour cela, je pense que ce serai plus adapté, quitte à l'afficher à l'intérieur d'un TTAbsheet.

    @++
    Dany

  3. #3
    Expert confirmé
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 944
    Par défaut
    merci pour ta réponse.

    je vais étudier...

    Cependant, si le tframe parait adapté, comment faire pour faire une création "par héritage" et profiter de la matrice ?

    Dois-je aller jusqu'à me créer un compo sous l'IDE que je pourrais ensuite créer à ma guise dans mon appli, comme on peut le faire avec les compos borland ?

  4. #4
    Membre extrêmement actif
    Avatar de skywaukers
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2005
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 219
    Par défaut
    Bonjour,

    Je n'ai peut-être pas bien compris la question. Le TFrame permet de regrouper un certains nombre de composants, c'est un peut un TForm, mais en plus léger. Ensuite le TFrame que tu as créé peut-être posé dans un TForm, un TPanel ou n'importe quel conteneur (il faut prendre le composant Cadre ou frames suivant la version de Delphi que tu as dans l'onglet Standard). Le composant que tu as alors posé peux être modifié localement, tu peux changer la position d'origine de chaque composant posé dessus, ajouter ou enlever des composants, ajouter ou enlever des évennements, sans pour autant impacter le TFrame et les instances posées sur d'autres formulaires.
    Tu peux aussi créer dynamiquement ce TFrame, comme n'importe quel autre composant.

    @++
    Dany

  5. #5
    Membre Expert

    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
    Par défaut
    Dany a raison, dans ce cas le TFrame est parfaitement adapté à ce type de situation.

    Pour aller plus loin et t'en convaincre, il te suffit de placer un TFrame dans un nouveau projet. De l'agrementer des composants que tu désires utiliser dans tes tabsheet.
    D'y enregistrer la classe dans la section initialization

    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
    unit Unit2;
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
     
    type
      TAncestorFrame = class(TFrame)
        Button1: TButton;
      private
        { Déclarations privées }
      protected
        procedure monAction;virtual;
      public
        { Déclarations publiques }
      end;
     
    implementation
    {$R *.dfm}
     
    { TAncestorFrame }
    procedure TAncestorFrame.monAction;
    begin
    end;
     
    initialization
      RegisterClass(TAncestorFrame);
    end.
    De créer ensuite la référence de classe suivante :

    TFrameClass = class of TFrame;

    Dès lors tu pourras appeler simplement et dynamiquement la frame et la placer dans le tabsheet de la façon suivante :

    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
    uses Unit2;
     
    type
      TFrameClass = class of TFrame;
     
    {$R *.dfm}
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      AFrame: TFrame;
    begin
      if Assigned(TabSheet1.FindComponent('maFrame')) then Exit;
      AFrame := TFrameClass(findClass('TAncestorFrame')).Create(TabSheet1);
      AFrame.Name := 'maFrame';
      AFrame.Parent := TabSheet1;
      AFrame.Align := alClient;
    end;
    Par ailleurs, tu pourras également dériver ta frame initiale et ainsi la doter de nouveau composants et ou de nouveau traitements.

    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
    unit Unit3;
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Unit2, StdCtrls;
     
    type
      TAncestorFrame1 = class(TAncestorFrame)
        Edit1: TEdit;
      private
        { Déclarations privées }
      protected
        procedure monAction;override;
      public
        { Déclarations publiques }
      end;
     
    var
      AncestorFrame1: TAncestorFrame1;
     
    implementation
    {$R *.dfm}
     
    { TAncestorFrame1 }
    procedure TAncestorFrame1.monAction;
    begin
      inherited;
    end;
     
    initialization
      RegisterClass(TAncestorFrame1);
    end.
    Toujours pareil, un petit RegisterClass dans la section initialization.
    Puis l'appel de cette frame dérivée de la façon suivante grâce à la référence de classe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      if Assigned(TabSheet1.FindComponent('maFrame')) then Exit;
      AFrame := TFrameClass(findClass('TAncestorFrame1')).Create(TabSheet1);
    En déclarant bien entendu unit3 dans les uses.

    Tout ceci dans le cas où tu désires créer dynamiquement ces TFrame.

    Pour les placer directement sur les TabSheet en design-time, tu utilises le composant Frames disponible dans la palette d'outils.

    Dernière solution tu peux directement ajouter ton TFrame ainsi que ses dérivés dans la palette d'outils et ainsi ils seront disponibles comme tous les composants.

  6. #6
    Expert confirmé
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 944
    Par défaut
    Ouep, ouep...

    je commence à y voir plus clair

    Question supplémentaire : comment ça se passe pour les procédures liées aux événements ?
    Ainsi, soit un bouton contenu dans un TFrame, où doit se faire le "cablage" du OnClick ?
    1/ dans le compo MonTFrame ? (pour autant que se soit possible) mais alors, comment distinguer les différents boutons des différents TFrames ?

    2/ lors de la création du tabsheet par "import" du TFrame via la pré-déclaration d'une procédure banalisée OnClick ? Mais dans ce cas, comment gérer le Sender? (peut-on avoir la main sur le name du bouton ?)

    3/ ailleurs / autrement ?

  7. #7
    Membre Expert

    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
    Par défaut
    Citation Envoyé par qi130 Voir le message
    1/ ...mais alors, comment distinguer les différents boutons des différents TFrames ?
    2/ lors de la création du tabsheet par "import" du TFrame via la pré-déclaration d'une procédure banalisée OnClick ? Mais dans ce cas, comment gérer le Sender? (peut-on avoir la main sur le name du bouton ?)
    Peut-être par le couple nom du composant et nom du tabsheet dans lequel la frame se trouve :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if Sender.ClassType.ClassNameIs('TButton')
        then begin
               showMessage(TButton(Sender).Parent.Parent.Name); //nom du tabsheet
               showMessage(TButton(Sender).Parent.Name); //nom de la frame 
               showMessage(TButton(Sender).Name); //nom du bouton
             end;
    J'ai un petite question. Dans ton applicatif, tes tabsheet seront créés dynamiquement au run-time ou alors ils seront tous définis au design-time ?

  8. #8
    Expert confirmé
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 944
    Par défaut
    Ils seront tous définis au fur et à mesure des besoins, donc au runtime.

  9. #9
    Membre Expert

    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
    Par défaut
    Est-ce de près ou de loin ce que tu désires réaliser ?
    Fichiers attachés Fichiers attachés

  10. #10
    Expert confirmé
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 944
    Par défaut
    Oui, c'est le même principe de fonctionnement.

    Au passage, (j'ai pas regardé ton code ), qd on switche entre 2 tab de type frame 2, l'edit s'enrichit tout seul...

  11. #11
    Membre Expert

    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
    Par défaut
    Citation Envoyé par qi130 Voir le message
    Oui, c'est le même principe de fonctionnement.

    Au passage, (j'ai pas regardé ton code ), qd on switche entre 2 tab de type frame 2, l'edit s'enrichit tout seul...
    Effectivement, l'edit s'enrichit

  12. #12
    Expert confirmé
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 944
    Par défaut
    Bon, j'ai jeté un œil attentif à ton projet, et c'est bien ça qu'il me faut

    Je vais donc creuser les TFrames et faire un effort supplémentaire de conception pour spécifier ma matrice "au cordeau" et câbler les événements

    Au passage, chaque frame comportera 2 TPagecontrol qui devront fonctionner avec des tabsheet dynamiques. Je serai donc amené à produire la même approche (mais je pense avoir pigé).
    Pour ces 2 "sous-frames", penses-tu possible d'avoir du code générique qui ne serait pas embarqué dans l'unité dédiée à chaque frame (genre dans un Datamodule) ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Unit ssframe1;
    use ....... , EventssFrame1; //
    A la réflexion, n'est-ce pas le rôle de l'unit4 de ton projet?

  13. #13
    Membre Expert

    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
    Par défaut
    Citation Envoyé par qi130 Voir le message
    Pour ces 2 "sous-frames", penses-tu possible d'avoir du code générique qui ne serait pas embarqué dans l'unité dédiée à chaque frame (genre dans un Datamodule) ?
    A mon avis, si le code est générique autant l'avoir dans les frames.
    Par ailleurs, et grâce à l'héritage, il est possible de redéfinir ou surcharger un ou plusieurs comportements spécifiques pour un ou plusieurs composants tout en bénéficiant de la partie générique commune aux deux classes.
    Dans l'unité Unit2 de l'exemple on définit la procédure Button1Click, en revanche dans l'unité 3 on a pas besoin de la définir, elle le sera par défaut. En modifiant seulement la procédure virtuelle monAction on redéfinit le comportement que l'on aura si l'on clique sur ce bouton.

    Citation Envoyé par qi130 Voir le message
    A la réflexion, n'est-ce pas le rôle de l'unit4 de ton projet?
    L'unité 4 recense les interfaces objets donc on définit ce que "sait faire une frame". Voir l'edit qui s'enrichit (PageControl1Changing de l'unité 1).
    Cela permet d'obtenir une sorte de signature pour chaque type de frame. Par ailleurs, on n'a pas besoin de connaître avec précision la classe de l'instance avec laquelle on travaille.
    Dans le cas de l'exemple de code que je t'ai fourni (procedure PageControl1Changing ), on récupère un TComponent puis on lui demande s'il supporte une interface objet précise.
    Si c'est le cas, on lui demande alors d'exécuter une procédure dont la "signature" est définie dans cette interface objet.

  14. #14
    Expert confirmé
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 944
    Par défaut
    Ok....

    Pour la signature que tu évoques, elle est assimilable au GUID mentionné dans ton code ?

  15. #15
    Membre Expert

    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
    Par défaut
    Citation Envoyé par qi130 Voir le message
    Ok....

    Pour la signature que tu évoques, elle est assimilable au GUID mentionné dans ton code ?
    Oui c'est grâce au GUID que la mécanique fonctionne, voir la fonction Supports. Sans GUID la fonction Supports échoue.

    Au fait, j'ai employé le terme de signature à tort, j'aurais du plutôt employer le terme de contrat.

  16. #16
    Expert confirmé
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 944
    Par défaut
    Bon, ben, yapluka

    Merci pour l'ensemble de tes apports.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Duplication Dynamique De Vignette avec XML
    Par _onWakeUp dans le forum Flash
    Réponses: 2
    Dernier message: 22/11/2007, 14h52
  2. duplication dynamique d'un DB sur un autre ordinateur
    Par eponette dans le forum Bases de données
    Réponses: 3
    Dernier message: 16/11/2006, 12h09
  3. Réponses: 5
    Dernier message: 20/07/2006, 16h50
  4. Pb de creation et destruction de tabsheet dynamique
    Par Unformatic dans le forum Composants VCL
    Réponses: 4
    Dernier message: 28/04/2006, 14h09
  5. [TPageControl] Ajouter un tabsheet dynamiquement
    Par qi130 dans le forum Langage
    Réponses: 6
    Dernier message: 29/09/2005, 20h57

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