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

C++Builder Discussion :

[TTabSheet] Copie d'onglet


Sujet :

C++Builder

  1. #1
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Points : 1 007
    Points
    1 007
    Par défaut [TTabSheet] Copie d'onglet
    Bojour,
    J'ai un PageControl sur une fiche, contenant de base 2 onglets. J'insère entre eux deux un (ou plusieurs) nouvel onglet dynamiquement. Je voudrais que cet onglet ressemble à un de ceux de base.
    J'aurais aimer copier celui-ci pour obtenir les mêmes composants aux mêmes endroits. J'ai fais ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
       TTabSheet *pPage = new TTabSheet(this);
       pPage = PageControl1->Pages[PageControl1->PageCount-1];
       pPage->Caption="Device "+IntToStr(++device);
       pPage->PageControl = PageControl1;
       pPage->PageIndex = device;
    Le problème est que cela me remplace le dernier onglet.

    Est-il possible que je créé un onglet type (non visible) que je puisse copier? Comme il possible rendre invisible un onglet complet et non son contenu par le paramètre "TabVisible", cette solution doit être enviseageable, nan?

    Si quelqun voit ce que je veux faire et qu'il sait, je suis à son écoute, ou si je cherche à faire un truc impossible et qu'on veux me le dire, je le suis aussi

    Merci d'avance

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 374
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    Si j'étais à ta place... je développerais une class dérivée de TTabSheet !
    Dans le constructeur de cette classe il suffirait d'instancier tous les objets requis !

    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class jPage1 : public TTabSheet
    {
    public :
    //Les pointeurs sur les objets à créer ici
    //..
    //Pour cette exemple je mets :
    TEdit *Edit1;
     
        __fastcall jPage1(TComponent *Owner, AnsiString N);
        __fastcall ~jPage1();
    };
    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
    __fastcall jPage1::jPage1(TComponent *Owner, AnsiString N)
        : TTabSheet(Owner)
    {
    if(Owner->ClassNameIs("TPageControl"))
        {
        PageControl =  (TPageControl*)Owner;
        }
    Caption = N;
     
    //Construction des objets de la page (ce qui va sans doute paraître lourd...)
    Edit1 = new TEdit(this);
    Edit1->Parent = (TWinControl*)this;
    Edit1->SetBounds(20,20,80,23);
    }
     
    __fastcall jPage1::~jPage1()
    {
    }
    Le moment venu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new jPage1(PageControl1, "Essai");
    A plus !

  3. #3
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Points : 1 007
    Points
    1 007
    Par défaut
    Tout d'abrd merci.
    C'est une méthode qui marche très bien, seulement j'ai beaucoup de composants et je risque d'avoir beaucoup de ligne de code pour recréer ma page avec toutes les propriétées qui vont avec. De plus, comment fais tu pour y accéder (pour écrire dans ton Edit par exemple).

    Il n'existe pas de méthode pour copier des composants avec les liens de parentés qui lui sont associés, de la même manière qu'un Ctrl+C / Ctrl+V d'onglet? Ca serait plus "simple" ,enfin je pense.

    Mais si c'est la seule méthode, alors je me cracherais dans les mains et en avant ! mais je continue de chercher sur un copier/coller avant.
    Si tu vois une piste je reste preneur, ou si quelqun à une idée j'écoute aussi. Mais merci quand même pour cette solution qui reste quand même une piste de secours non négligeable.

  4. #4
    say
    say est déconnecté
    Membre expérimenté
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Points : 1 300
    Points
    1 300
    Par défaut
    hello..
    pour moi, logique que ça copie ton onglet et le remplace vu que la VCL ne se gère qu'à base de pointeur.

    en revanche, j'avais trouver une classe permettant de dupliquer un composant VCL

    DuplicateComponents...
    il me semble que c'est sur le forum que je l'ai trouvé

    bon courage
    Ils ne savaient pas que c'était impossible alors ils l'ont fait (Mark Twain)
    _ _ _ _ _ _ _ _ _

    La planète ne nous appartient pas, elle nous a été prêtée par nos enfants
    _ _ _ _ _ _ _ _ _

    Technos : Access, C++ Builder, SQL, PostgreSQL, Crystal Reports, XML entre autres

  5. #5
    say
    say est déconnecté
    Membre expérimenté
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Points : 1 300
    Points
    1 300
    Ils ne savaient pas que c'était impossible alors ils l'ont fait (Mark Twain)
    _ _ _ _ _ _ _ _ _

    La planète ne nous appartient pas, elle nous a été prêtée par nos enfants
    _ _ _ _ _ _ _ _ _

    Technos : Access, C++ Builder, SQL, PostgreSQL, Crystal Reports, XML entre autres

  6. #6
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Points : 1 007
    Points
    1 007
    Par défaut
    Merci,
    C'est tout juste la fonction que je recherche, maintenant il suffit de savoir l'utiliser et ça c'est moins marrant. Quand j'ai tenté de duppliquer mon TTabSheet, il me met une erreur au moment de la compilation:

    Cannot convert 'TComponent *' to 'TTabSheet *'

    J'ai tapé le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        TTabSheet *pPage = new TTabSheet(PageControl1);
        pPage = DuplicateComponents(PageControl1->Pages[1]);
    Pourtant tous les composents sont des descendant des TComponent.
    Sais tu comment résoudre ce problème?

  7. #7
    say
    say est déconnecté
    Membre expérimenté
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Points : 1 300
    Points
    1 300
    Par défaut
    ok, c pas drôle...mais je fatigue aujourd'hui

    alors pour répondre à ta question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    TTabSheet *pPage = new TTabSheet(PageControl1);
        pPage = dynamic_cast<TTabSheet*>DuplicateComponents(PageControl1->Pages[1]);
    pour l'explication :
    tous les composants héritent de TComponent donc tu peux mettre n'importe quel compo dans un TComponent, en revanche pour remettre dans la situation initiale, il faut le caster avec le dynamic_cast (voial c pas très clair...mais j'ai pas trop le temps de détailler là ) : il me semble que c'est ce qu'on appelle le polymorphisme...mais un doute m'étreint

    bon courage
    Ils ne savaient pas que c'était impossible alors ils l'ont fait (Mark Twain)
    _ _ _ _ _ _ _ _ _

    La planète ne nous appartient pas, elle nous a été prêtée par nos enfants
    _ _ _ _ _ _ _ _ _

    Technos : Access, C++ Builder, SQL, PostgreSQL, Crystal Reports, XML entre autres

  8. #8
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Points : 1 007
    Points
    1 007
    Par défaut
    Cool, en fait je viens juste de me faire un pti cast aussi mais pas comme toi, un peu plus "bourrin" en fait j'ai fais ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        (TComponent *)pPage = DuplicateComponents(PageControl1->Pages[1]);
    Cela reviens surement au même.

    Je suis désolé de t'avoir dérangé pour cette question idiote, mais merci quand même et encore bravo pour votre culuture et votre dévouement à toi et henderson !
    Merci encore et repose toi bien

  9. #9
    say
    say est déconnecté
    Membre expérimenté
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Points : 1 300
    Points
    1 300
    Par défaut
    en fait, non ça en revient pas au même...cf. la notion dont je retrouve plus le nom...

    toujours est -il que tu risques de perdre des propriètés propre à ton TTabSheet. le dynamic_cast est bien plus approprié.

    en le dynamic_cast permet de replacer un objet dans son type de base après l'avoir fait "passé" par un conteneur d'un type ancêtre.

    A+
    Ils ne savaient pas que c'était impossible alors ils l'ont fait (Mark Twain)
    _ _ _ _ _ _ _ _ _

    La planète ne nous appartient pas, elle nous a été prêtée par nos enfants
    _ _ _ _ _ _ _ _ _

    Technos : Access, C++ Builder, SQL, PostgreSQL, Crystal Reports, XML entre autres

  10. #10
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Points : 1 007
    Points
    1 007
    Par défaut
    Serait-il possible de rajouter cette fonction dans les trucs et astuces ou dans la FAQ, je pense qu'elle peut être utile à d'autre?

  11. #11
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 374
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    Il vaut mieux transtyper TTabSheet vers TTabSheet !!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TTabSheet * pPage = (TTabSheet*)DuplicateComponents(PageControl1->Pages[1]);
    Je ne dispose pas de cette méthode donc si tu pouvais tester pour moi !

    Normalement, dynamic cast teste si la class correspond bien à celle qui est donnée.
    Or ici... il n'y a pas de doute sur TTabSheet !


    A plus !

  12. #12
    say
    say est déconnecté
    Membre expérimenté
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Points : 1 300
    Points
    1 300
    Par défaut
    Citation Envoyé par henderson

    Normalement, dynamic cast teste si la class correspond bien à celle qui est donnée.
    Or ici... il n'y a pas de doute sur TTabSheet !
    c'est pas faux...au temps pour moi..en fait, j'ai fait des fonctions assez générique donc j'avais pris l'habitude du dynamic_cast.

    par la même occassion...te souviens tu de nom de cette notion propre à l'héritage?

    a-t-il un intérêt à choisir ta solution plutot que le dynamic_cast?
    Ils ne savaient pas que c'était impossible alors ils l'ont fait (Mark Twain)
    _ _ _ _ _ _ _ _ _

    La planète ne nous appartient pas, elle nous a été prêtée par nos enfants
    _ _ _ _ _ _ _ _ _

    Technos : Access, C++ Builder, SQL, PostgreSQL, Crystal Reports, XML entre autres

  13. #13
    say
    say est déconnecté
    Membre expérimenté
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Points : 1 300
    Points
    1 300
    Par défaut
    à priori, j'ai trouvé mes réponses ici:
    http://www.developpez.com/c/megacours/x4009.html

    bonne continuation
    Ils ne savaient pas que c'était impossible alors ils l'ont fait (Mark Twain)
    _ _ _ _ _ _ _ _ _

    La planète ne nous appartient pas, elle nous a été prêtée par nos enfants
    _ _ _ _ _ _ _ _ _

    Technos : Access, C++ Builder, SQL, PostgreSQL, Crystal Reports, XML entre autres

  14. #14
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Points : 1 007
    Points
    1 007
    Par défaut
    henderson, ta méthode marche très bien,
    Il vaut mieux transtyper TTabSheet vers TTabSheet !!!

    Code:
    TTabSheet * pPage = (TTabSheet*)DuplicateComponents(PageControl1->Pages[1]);


    Je ne dispose pas de cette méthode donc si tu pouvais tester pour moi !
    aucun problème de compilation et le résultat est le même. Cependant j'ai une autre question qui ne se pose pas dans le cas de ta première solution, c'est :

    Comment fait on pour avoir accès aux objets duppliqués ? :

    Juste avant la dupplication, je modifie un des paramètres (un Label) pour pouvoir l'identifier. Seulement, l'onglet dispose de composants propres maintenant, comment puis-je faire pour les modifier?

  15. #15
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 374
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    C'est bien pour ça que j'ai évoqué le développement à l'aide de classes.

    Je voulais justement poser la question :

    Que devient la propriété Name des composants dupliqués ?

    Il n'est guère possible de travailler en statique dans ce contexte !

    Avec une classe, tous les pointeurs vers les objets sont membres :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    jPage1 *Page  = (jPage1*)PageControl1->ActivePage; //par exemple
    Page->Edit1->Text = "Je suis sur la bonne page";
    Pour le contexte de la duplication... par contre, je ne sais pas !

    A plus !

  16. #16
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Points : 1 007
    Points
    1 007
    Par défaut
    De plus, je suppose qu'avec ta méthode il est facilement possible de créer des évènements sur les composants créés dynamiquement dans la fiche "jPage" à la manière de "MonBouton" dans les trucs et astuces.

    Par contre lors de la contruction de plusieurs onglets, comment est-il possible de les différencier ?

  17. #17
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Points : 1 007
    Points
    1 007
    Par défaut
    J'ai reconstruit mon onglet type avec ta méthode, et j'ai ajouté ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void __fastcall ButtonClick(TObject *Sender);
    dans le .h mais le soucis est qu'il me le compile mais ne l'ajoute pas dans la fonction. De plus j'ai été obligé de déclaré en externe PageControl1 pour y avoir accès avec la class jpage1.
    Je ne peux pas mettre de point d'arrêt dessus pour voir l'évènement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void __fastcall jPage1::ButtonClick(TObject *Sender)
    {
        jPage1 *Page  = (jPage1*)PageControl1->Pages[num_device_courant]; //par exemple
        Page->Label13->Caption = "test";
    }

    Vois tu une raison pour que cette évènement ne se réalise pas? Et si oui, sais tu comment résoudre se problème?

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

Discussions similaires

  1. Copie d'onglet Excel en VB
    Par Laugeek dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 10/09/2008, 14h18
  2. Excel 2007 - Copie d'onglet
    Par Martin_F dans le forum Excel
    Réponses: 2
    Dernier message: 07/12/2007, 10h05
  3. Boucle + Copie d'onglets sur Excel
    Par Marien dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 27/09/2007, 16h58
  4. [Excel] Supprimer des leins lors de copies d'onglet
    Par marsupilami34 dans le forum Excel
    Réponses: 9
    Dernier message: 26/07/2007, 10h36
  5. Réponses: 7
    Dernier message: 02/05/2006, 19h28

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