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 :

[Débutant] Constructeur par recopie pour TComponent [Non suivi]


Sujet :

C++Builder

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juin 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 49
    Points : 27
    Points
    27
    Par défaut [Débutant] Constructeur par recopie pour TComponent
    Salut tout le monde.
    J'aurais pas du mettre [Débutant] mais plutôt [Débile], je le sens d'avance.
    Donc, au risque de passer pour un demeuré, je me lance quand même ^^

    Question toute bête: On ne peut pas instancier un nouveau composant avec un constructeur par recopie ?

    Dans le cas pratique, j'ai un TRichEdit placé sur une form, et j'aimerais en créer X autres dynamiquement qui reprennent toutes les propriétés du premier (Font, taille, etc..) Et oui, parce que d'une, je suis faignant, et de deux pour la maintenance du code, c'est mieux aussi, accessoirement.

    Par avance désolé si c'est dans la Faq, j'ai pas trouvé.
    Amicalement.

    Run.

    Ps: Ha oui, j'ai oublié de dire, j'ai pas envie de me frapper une classe dérivée si c'est possible autrement ;o

  2. #2
    Membre éclairé
    Avatar de Interruption13h
    Inscrit en
    Août 2005
    Messages
    603
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 603
    Points : 786
    Points
    786
    Par défaut
    Salut !

    Tu pourrai mettre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
     
    TRichEdit* NouveauRichEdit=new TRichEdit(this);
    NouveauRichEdit->Parent=Form1;
    NouveauRichEdit->Top=X;
    NouveauRichEdit->Left=Y;
    NouveauRichEdit->Text=RichEdit1->Text;
    NouveauRichEdit->Font=RichEdit1->Font;
    NouveauRichEdit->Width=RichEdit1->Width;
    NouveauRichEdit->Height=RichEdit1->Height;
     
    //etc...
    ++
    Plus tu prends part aux joies et chagrins des gens, plus ils te sont proches et chers. Mais c'est le chagrin et les problèmes qui vous rapprochent le plus.

    (Mark TWAIN)

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juin 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 49
    Points : 27
    Points
    27
    Par défaut
    Salut Interruption13h !

    Ouais, c'est clair, mais c'est justement ce que je voudrais éviter ;o
    C'est que j'ai un poil dans la main, et peur aussi de zapper des propriétés :]
    Mais bon, si y a pas d'autre moyen, on va faire comme ça.

    J'attends la fin de la soirée si jamais quelqu'un sait si c'est possible ou non, histoire d'être fixé une fois pour toute.

    Merci pour ta réponse en tout cas.

  4. #4
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    D'après ce que j'ai pus voir dans l'aide, cela n'est absolument pas possible, il y aurai qu'un seul constructeur avec pour paramètre le composant parent de celui que l'on déclare donc impossible de recopier les propriétées d'un composant semblable, il prendrait ce composant semblable pour sont parent, ce qui n'est pas du tout le but recherché, je sais pas si tu as tout suivit mais le raisonnement est bon , enfin d'après moi en tout cas .
    Quand une réponse vous a été utile, pensez à utiliser le nouveau système de notation

    Lisez le magazine de developpez.com.
    Mes tutos : http://pottiez.developpez.com

    La FAQ BCB -> 642 Questions/Réponses, si vous voulez participer, contactez moi. Aide de BCB6 en français

    N'oubliez pas que l'aide existe et est affichée sous simple pression de la touche F1 , une touche c'est plus rapide que tout un message .

  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
    Avec RTTI ça doit être possible :
    Le principe :
    • On Créé un Flux genre TMemoryStream
    • Avec le Flux on fait WriteComponent(LeRichEdit);
    • On remet la position du Flux à 0
    • On recupère une nouvelle instance avec la méthode ReadComponent() du Flux ( NouveauRichEdit = ReadComponent(NouvelleInstanceDeRichEditALaVolée) )

    Je ne donne pas de code, car je ne parle que Delphi, et je risque de me faire
    "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

  6. #6
    Expert éminent sénior


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

    Informations forums :
    Inscription : Octobre 2003
    Messages : 7 856
    Points : 34 380
    Points
    34 380
    Par défaut
    Citation Envoyé par neilbgr
    Je ne donne pas de code, car je ne parle que Delphi, et je risque de me faire
    Ce serais l'occasion de t'y mettre


  7. #7
    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
    Aller... après un effort surhumain, j'ai pondu ceci qui doit être vérifier par un quelqu'un qui maitrise un peu C++Builder car je suis bien partit de mon code Delphi qui fonctionne.
    Voici le code c++ avec en commentaire l'original en Delphi... Encore désolé de blasfémer sur ce forum en parlant Pascal, mais pour moi, l'aide à autrui va par-delà les clivages de langages...

    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
    /*
    function TForm1.Cloner(UnComponent: TComponent): TComponent;
    var
      vFlux: TMemoryStream;
      vName: string;
    begin
      vFlux := TMemoryStream.Create;
      try
        vName := UnComponent.Name;
        UnComponent.Name := '';
        vFlux.WriteComponent(UnComponent);
        UnComponent.Name := vName;
     
        vFlux.Position := 0;
     
        Result := TComponentClass(UnComponent.ClassType).Create(UnComponent.Owner);
        if Result is TControl then
          TControl(Result).Parent := TControl(UnComponent).Parent;
     
        vFlux.ReadComponent(Result);
      finally
        vFlux.Free;
      end;
    end;
    */
    /*Fonction de clonage pour n'importe quel TComponent :*/
    TComponent __fastcall TForm1::Cloner(TComponent *UnComponent){
     
      TMemoryStream *vFlux = new TMemoryStream;
      //try
        AnsiString vName = UnComponent->Name;
        UnComponent->Name = "";
        vFlux->WriteComponent(UnComponent);
        UnComponent->Name = vName;
     
        vFlux->Position = 0;
     
        /* Ici je ne suis pas sûr de la syntax du cast */
        TComponent Result := new static_cast<TComponentClass *>(UnComponent->ClassType)(UnComponent->Owner);
        if (Result->InheritsFrom(TControl)) {
          static_cast<TControl *>(Result)->Parent = static_cast<TControl *>(UnComponent)->Parent;
        }
     
        vFlux->ReadComponent(Result);
     
        //delete(vFlux); // Ici si pas de try..finally
        return Result;
      //finally
      delete(vFlux);
      //end;
     
      return NULL;
    }
     
    /*
    procedure TForm1.btn1Click(Sender: TObject);
    var
      vNouveauRichEdit: TRichEdit;
    begin
      vNouveauRichEdit := TRichEdit(Cloner(RichEdit1));
      vNouveauRichEdit.Left := vNouveauRichEdit.Left + 10;
      vNouveauRichEdit.Top := vNouveauRichEdit.Top + 10;
    end;
    */
    void __fastcall TForm1::btn1Click(Sender: TObject) {
      TRichEdit vNouveauRichEdit* := static_cast<TRichEdit *>(Cloner(RichEdit1));
      vNouveauRichEdit->Left = vNouveauRichEdit->Left + 10;
      vNouveauRichEdit->Top = vNouveauRichEdit->Top + 10;
    }
    Evidement, c'est à mettre dans un .cpp et qu'il faut délcarer dans le .h les prototypes...
    "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

  8. #8
    CGi
    CGi est déconnecté
    Expert éminent
    Avatar de CGi
    Inscrit en
    Mars 2002
    Messages
    1 030
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 1 030
    Points : 8 202
    Points
    8 202
    Par défaut
    Tu peut peut être faire une methode qui fait la copie
    que tu appelle pour chaque RichEdit
    Par 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
     
    void __fastcall TForm1::Duplicate(TRichEdit* Src, TRichEdit* Dest)
    {
         Dest->Font = Src->Font;
         Dest->Width = Src->Width;
         Dest->Height = Src->Height;
         Dest->Text = Src->Text;
         Dest->Parent = Src->Parent;
    }
    //-----------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
         TRichEdit *MonRichEdit1 = new TRichEdit(this);
         MonRichEdit1->Top = 10;
         MonRichEdit1->Left = 10;
         Duplicate(RichEdit1, MonRichEdit1);
     
         TRichEdit *MonRichEdit2 = new TRichEdit(this);
         MonRichEdit2->Top = 10;
         MonRichEdit2->Left = 250;
         Duplicate(RichEdit1, MonRichEdit2);
    }
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

  9. #9
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Points : 1 148
    Points
    1 148
    Par défaut
    Pour du clonage de composant...je n'avais pas réussi à le faire en C++ Builder...une histoire de différence de gestion des metaclasses entre C++ et Delphi (je crois qu'en Delphi une métaclass est aussi une classe).

    Par contre l'avantage de C++ Builder c'est qu'il comprend aussi le Pascal Objet.

    Donc j'ai pris une fonction trouvée sur le net en Delphi et ajouté à mon projet et hop ça a marché...
    Comme quoi le Delphi parfois ça sert vraiment
    Neilos

  10. #10
    Nouveau membre du Club
    Inscrit en
    Juin 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 49
    Points : 27
    Points
    27
    Par défaut
    Bonjour et merci à tous pour vos réponses
    pottiez a écrit:
    D'après ce que j'ai pus voir dans l'aide, cela n'est absolument pas possible, il y aurai qu'un seul constructeur avec pour paramètre le composant parent de celui que l'on déclare donc impossible de recopier les propriétées d'un composant semblable, il prendrait ce composant semblable pour sont parent, ce qui n'est pas du tout le but recherché, je sais pas si tu as tout suivit mais le raisonnement est bon , enfin d'après moi en tout cas .
    J'ai parfaitement suivi ton raisonnement pottiez, et vu que j'ai eu le même, si si il doit forcément être bon ^^ Bon, trève de plaisanterie.

    CGI a écrit:
    Tu peut peut être faire une methode qui fait la copie
    que tu appelle pour chaque RichEdit
    Salut CGI. Effectivement, c'est une solution envisageable, applicable seulement à un composant précis, mais c'est quand même mieux que rien.

    Et bonjour à toi neilbgr. Merci pour le bout de code que tu as passé. Je savais pas qu'on pouvait "injecter" puis "récupérer" un composant dans un flux stream en Delphi, c'est assez joli dans l'idée. En même temps, je connais pas du tout le Delphi ^^
    J'vais essayer de mettre en pratique ton code ce soir (Cette nuit ?)
    Si jamais ça ne fonctionne pas, et bien je me rabattrai sur la création d'une méthode standard, comme CGI l'a si bien dit.

    Neilos a écrit:
    Comme quoi le Delphi parfois ça sert vraiment
    Huhu, salut Neilos. Personne n'en doute hein :] Bon et bien je saurai vers quoi me tourner si jamais j'veux m'acharner à trouver une méthode qui marche pour tous les composants.
    Merci à vous tous, et à plus tard.

Discussions similaires

  1. Réponses: 8
    Dernier message: 27/10/2006, 14h36
  2. Réponses: 11
    Dernier message: 25/08/2006, 16h00
  3. Constructeur par recopie
    Par Bebert71 dans le forum C++
    Réponses: 13
    Dernier message: 18/05/2006, 15h08
  4. Constructeur par recopie
    Par KernelControl dans le forum C++
    Réponses: 2
    Dernier message: 29/12/2005, 12h24
  5. Constructeur par recopie
    Par sdebrois dans le forum Composants VCL
    Réponses: 13
    Dernier message: 21/10/2004, 14h47

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