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 copier un object dans un autre ?


Sujet :

Langage Delphi

  1. #1
    Membre actif
    Homme Profil pro
    Inscrit en
    Juin 2004
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Andorre

    Informations forums :
    Inscription : Juin 2004
    Messages : 219
    Points : 241
    Points
    241
    Par défaut Comment copier un object dans un autre ?
    Bonjour

    Je suis en train de crée dynamiquement un TPopupMenu qui doit être égal a un autre mais avec quelques option de plus.

    Maintenant je fais ça:

    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
     
    var
      aItem: TMenuItem;
     
      procedure AddMenu(aParent, Item: TMenuItem);
      var
        i: integer;
      begin
        for i := 0 to Item.Count - 1 do
        begin
          aItem := TMenuItem.Create(aParent);
          aItem.Caption := Item[i].Caption;
          aItem.Hint := Item[i].Hint;
          aItem.ImageIndex := Item[i].ImageIndex;
          aItem.OnClick := Item[i].OnClick;
          aParent.Add(aItem);
     
          if Item.Count <> 0 then AddMenu(aItem, Item[i]);
        end;
      end;
    begin
      if not Assigned(FPopup) then Exit;
     
      FOldPopup := FGrid.PopupMenu;
      AddMenu(FPopup.Items, FGrid.PopupMenu.Items);
      FGrid.PopupMenu := FPopup;
    end;
    Mais je crois qu'il doit avoir une façon meilleur de le faire. J'ai essayer avec Assign mais ça provoque l'erreur "Cannot assign a TPopupMenu to a TPopupMenu". Le code que j'utilise pour ça c'est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    begin
    ....
      FPopup.Assign(FGrid.PopupMenu);
    .....
    end;
    J'ai aussi essayer ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    begin
    ....
      FPopup.Items.Add(FGrid.PopupMenu.Items);
    .....
    end;
    mais il ne fait pas c'est que je veux exactement (il crée une nouvelle option de menu sans caption la quelle a toutes les outres options de menu).

    Aucune idée pour améliorer mon code?

    Merci en avance

    Salut!

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 16
    Points : 20
    Points
    20
    Par défaut
    Salut,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PopupMenu1.Items.Assign( PopupMenu2.items)
    ça devrait marcher. Par contre, Fais d'abord le Assign, et ensuite ajoute les options dont tu as besoin...

  3. #3
    Membre actif
    Homme Profil pro
    Inscrit en
    Juin 2004
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Andorre

    Informations forums :
    Inscription : Juin 2004
    Messages : 219
    Points : 241
    Points
    241
    Par défaut
    Bonjour

    Merci pour ta réponse, mais j'ai aussi essayer ça et il renvoi aussi l'erreur "Cannot assign a TMenuItem to a TMenuItem"

    Le code c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    begin
    ....
      FPopup.Items.Assign(FGrid.PopupMenu.Items);
    .....
    end;
    Je crois que TPopupMenu et TMenuItem n'ont pas implémenté cet méthode (override du TPersistent), mais je ne suis pas sûr.

    Et oui, je fais premièrement l'assignation des options du ancien popup et, après, je met les nouvelles options.

    Merci encore

    Salut.

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Après vérification effectivement les TMenu ne redéfinissent pas le Assign. TMenuItem le fait bien mais fonctionne de manière un peu spéciale dans le sens où il ne se réplique que si la cible est un descendant de TCustomAction (TMenuItem descend de TComponent).

    Pour faire ce que tu veux faire il va te falloir une routine de réplication des tes éléments de menu.

    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
    function DupliquerMenu( Source, Cible: TMenuItem; MenuCible: TMenu )
    var
     Cpt: Integer;
     CibleFils: TMenuItem;
    begin
      // copier les propriétées à dupliquer
      Cible.Caption := Source.Caption;
      // ...
     
      // dupliquer les fils du noeud en cours
      for Cpt := 0 to Source.Count - 1 do
      begin
        // créer le nouveau fils
        CibleFils := TMenuItem.Create( MenuCible );
        // l'ajouter au noeud Cible qui devient son parent
        Cible.Add( CibleFils );
        // appeler récursivement la méthode pour valuer les Items et dupliquer les fils de CibleFils s'il y en a
        DupliquerMenu( Source[Cpt], CibleFils, MenuCible );
      end;
     
    end;
     
    // appel
    DupliquerMenu( Menu1.Items, Menu2.Items, Menu2 );
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  5. #5
    Membre actif
    Homme Profil pro
    Inscrit en
    Juin 2004
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Andorre

    Informations forums :
    Inscription : Juin 2004
    Messages : 219
    Points : 241
    Points
    241
    Par défaut
    Bonjour

    Bon, ça c'est plus o moins ce que je fait, assigner chaque propriété et méthode une a une et c'est ce que je veux améliorée

    Merci a tous pour vos réponses

    Salut!

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Ben je ne crois pas qu'il y ait d'autre moyen d'améliorer ça, et puis de toute façon les méthodes Assign ben elles font de la recopie champ à champ en vérité elles-aussi dans la logique du système donc...
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 534
    Points : 25 082
    Points
    25 082
    Par défaut
    il y a aussi les RTTI, qui permettrait de copier toute property publiée ... voir l'unité TypInfo, je l'ai fait pour mes objets persistants (bcp de code, trop pour le mettre ici)
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  8. #8
    Membre actif
    Homme Profil pro
    Inscrit en
    Juin 2004
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Andorre

    Informations forums :
    Inscription : Juin 2004
    Messages : 219
    Points : 241
    Points
    241
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    il y a aussi les RTTI, qui permettrait de copier toute property publiée ... voir l'unité TypInfo, je l'ai fait pour mes objets persistants (bcp de code, trop pour le mettre ici)
    Oui, j'ai pensé aussi avec la RTTI mais ça c'est pour faire quelque chose plus générique que ça

    Cependant, je vais voir si c'est trop compliqué d'implémenter

    Merci a tous

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

Discussions similaires

  1. Réponses: 21
    Dernier message: 26/02/2015, 21h20
  2. Réponses: 1
    Dernier message: 29/01/2013, 10h42
  3. Comment copier une map dans une autre?
    Par Sunsawe dans le forum SL & STL
    Réponses: 4
    Dernier message: 17/11/2008, 18h41
  4. Réponses: 9
    Dernier message: 09/03/2007, 15h01
  5. Réponses: 2
    Dernier message: 28/08/2003, 00h00

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