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 :

Constructeur par recopie


Sujet :

Composants VCL Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 17
    Points : 11
    Points
    11
    Par défaut Constructeur par recopie
    Je voudrais pouvoir dragger un onglet d'un TPageControl afin de le transformer en TForm à la fin du drag.

    Pour cela, j'ai créé un Frame que je peux coller sur l'onglet ou la Form suivant ce que je veux afficher. Le probleme, c'est qu'au moment de faire une copie de la frame se trouvant dans l'onglet vers la Form, j'ai l'impression que le constructeur de recopie par défaut ne fait pas son travail. J'ai bien essayé de redéfinir ce constructeur mais n'ayant pas encore l'habitude de programmer sur DELPHI, je n'y suis pas parvenu.

    Quelqu'un peut il me donner quelques indications pour réaliser cela ?
    Ou si qq connait un composant qui realise deja ca tt seul c'est encore mieux


  2. #2
    Membre expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Points : 3 256
    Points
    3 256
    Par défaut
    Salut,

    Tout d'abord Bienvenue sur le forum de Developpez.com

    Pourquoi cherches tu à recopier ton Frame ?

    En effet si ton frame est dans un TPageControl, lorsque tu fais un Drag&Drop, crées alors une Form, puis fais quelque chose dans ce style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MaFrame.Visible := False;
    MaFrame.parent := MaForm;
    MaFrame.Visible := True;
    Ainsi ta Frame aura disparu de ton TPageControl et apparu dans ta Form. Il s'agit là d'un déplacement.

    Voila, j'espère que cela répondra à tes attentes.

    A+

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    OK Pour faire disparaitre le TFrame mais je voudrais aussi détruire le tabsheet et ainsi donner l'impression que l'onglet laisse place à une form

    J'ai bien essaye ce que tu viens de me proposer mais ca fait peter la memoire...

    Pour le moment ca donne ca:

    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
     
    procedure TFormIhm.DragDropPgCtrl(Sender, Source: TObject; X, Y: Integer);
    var
      l_tbshtCourant : TTabSheet;
      l_frameModule : TFrameModule;
      l_fenetre : TFormModule;
     
    begin
    // TabSheet courant
      l_tbshtCourant := PagesModules.ActivePage;
    //Creation de la fenetre qui contiendra le frame
      l_fenetre := TFormModule.Create(Self);
    //Recopie du frame  de l'onglet grace au constructeur de recopie
      l_frameModule := TFrameModule.Creer(l_fenetre, TFrameModule(l_tbshtCourant.Controls[0]));
    //définition du nouveau parent (la form)
      l_frameModule.Parent := l_fenetre.ZoneModule;
    //Destruction de la tabsheet
      l_tbshtCourant.Destroy;
    end;

  4. #4
    Membre expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Points : 3 256
    Points
    3 256
    Par défaut
    essaie plutot ca :
    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
     
    procedure TFormIhm.DragDropPgCtrl(Sender, Source: TObject; X, Y: Integer); 
    var 
      l_tbshtCourant : TTabSheet; 
      l_frameModule : TFrameModule; 
      l_fenetre : TFormModule; 
     
    begin 
    // TabSheet courant 
      l_tbshtCourant := PagesModules.ActivePage; 
     
    //Creation de la fenetre qui contiendra le frame 
      l_fenetre := TFormModule.Create(Self); 
     
    //Recopie du frame  de l'onglet grace au constructeur de recopie (A EVITER CAR DEUX OBJETS IDENTIQUES)
    // faire plutot un déplacement
    // si l_tbshtCourant.Controls[0] est un TFrameModule alors
      l_frameModule := TFrameModule(l_tbshtCourant.Controls[0]); 
     
    //définition du nouveau parent (la form)
      l_frameModule.Visible := False;
      l_frameModule.Parent := l_fenetre.ZoneModule; 
      l_frameModule.Visible := True;
     
    //Destruction de la tabsheet 
    // je ne me souviens plus trop comment detruire la TabSheet
      l_tbshtCourant.Visible := False; 
    end;
    essaie déjà comme cela, et si cela marche alors il sera possible de résoudre les derniers petits détails.

    A+

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    Il y a bien deux objets identiques mais le premier objet sera détruit au moment ou l'on détruit l'onglet...
    Il ne restera donc qu'un seul frame.

    Je fais comme ca car j'ai l'impression que le tabsheet garde une référence de la frame meme apres avoir change le parent de celle ci.
    et donc au moment de la destruction du tabsheet, il essaye de suppromer la frame qui n'est plus la.

    Sinon, je voudrais bien détruire le tabsheet et pas le rendre invisble parce qu'au niveau des indexs ca va etre vite le bordel et en plus c'est pas tres propre

  6. #6
    Membre expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Points : 3 256
    Points
    3 256
    Par défaut
    Citation Envoyé par sdebrois
    Il y a bien deux objets identiques mais le premier objet sera détruit au moment ou l'on détruit l'onglet...
    Il ne restera donc qu'un seul frame.

    Je fais comme ca car j'ai l'impression que le tabsheet garde une référence de la frame meme apres avoir change le parent de celle ci.
    et donc au moment de la destruction du tabsheet, il essaye de suppromer la frame qui n'est plus la.
    Si tu déplace ton frame, alors ton tabsheet ne contient plus rien. Lorsque tu le détruiras, tu ne détruira pas la frame au passage car elle est ailleurs (peut etre aussi changer la propriété Owner (c'est le compo propriété de celui ci (util pour la destruction)))

    La tentative de suppression de la frame qui n'est plus la est du a sa propriété Owner (il faut affecter la nouvel form ici).

    Citation Envoyé par sdebrois
    Sinon, je voudrais bien détruire le tabsheet et pas le rendre invisble parce qu'au niveau des indexs ca va etre vite le bordel et en plus c'est pas tres propre
    Je sais bien mais je ne me souviens plus exactement de la procedure à respecter.
    Aussi, je te proposais de le cacher pour commencer, et ainsi voir si cela fonctionne.
    Tu pourras vérifier après la manière de le détruire.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 17
    Points : 11
    Points
    11
    Par défaut Propriété Owner
    Oui, mais la propriété Owner est définit au moment de la construction...
    Et ensuite on peut y avoir acces mais uniquement en lecture et non pas en écriture (à vérifier)

  8. #8
    Membre expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Points : 3 256
    Points
    3 256
    Par défaut
    A ce moment la, puisque que l'on ne perd jamais de vue le Frame, on peut procéder comme cela :

    on créer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MonFrame := TMonFrame.Create(nil);
    puis on surcharge le destructeur de la TabSheet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // dans la déclaration
      destructor destroy;override;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    destructor destroy;
    begin
    if (MonFrame <> nil) then
      if (MonFrame.Parent=MonTabSheet) then
        MonFrame.Release;
    end;
    on surcharge aussi le destructeur de la form cible
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // dans la déclaration
      destructor destroy;override;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    destructor destroy;
    begin
    if (MonFrame <> nil) then
      if (MonFrame.Parent=MaNouvelleForm) then
        MonFrame.Release;
    end;
    Comme cela, il n'y a plus besoin de propriété (Owner) et donc plus de problème...

    [Edit]A la place de surcharger les destroy tu peux utiliser ceux de l'inspecteur d'object[/Edit]

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 17
    Points : 11
    Points
    11
    Par défaut destroy
    Oui, mais la je sais pas comment faire...

    Mon Tabsheet est créer dynamiquement et ne correspond pas à une classe que j'ai créé. Comment je fais pour overrider la méthode destroy de cette classe???

  10. #10
    Membre expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Points : 3 256
    Points
    3 256
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    // déclaration
    published
      procedure MonTabSheetOnCreate(Sender: TObject);
    puis lorsque tu crées ton tabsheet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      MonTabSheet := TTabSheet.Create(....
      MonTabSheet.OnCreate = MonTabSheetOnCreate;
    puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    procedure MonTabSheetOnCreate(Sender: TObject);
    begin
      MonFrame := TMonFrame.Create(nil); 
    end;
    et pareil pour le destoy

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    OK, merci pour tes conseils avises...

  12. #12
    Membre expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Points : 3 256
    Points
    3 256
    Par défaut
    Peux tu mettre alors le tag RESOLU, stp

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    On ne peut pas surcharger l'evenement Destroy comme tu l'as indiqué...
    Est ce du au fait que le destructeur n'est pas présent dans les évenements de ce composant

  14. #14
    Membre expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Points : 3 256
    Points
    3 256
    Par défaut
    désolé, j'avais pas fais attention mais il faut dériver la classe TTabSheet

    Autre solution :
    Utiliser les onCreate et OnDestroy de ta FormPrincipale.
    A ce moment la, utilise une variable privée FMonTabSheet que tu affecteras lors de la création. Meme méthode pour la suppression de cette dernière. Ainsi tu pourras changer le parent de celle-ci facilement.

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

Discussions similaires

  1. ofstream dans le constructeur par recopie
    Par mopio dans le forum C++
    Réponses: 2
    Dernier message: 02/10/2007, 12h00
  2. Réponses: 11
    Dernier message: 25/08/2006, 17h00
  3. Constructeur par recopie
    Par Bebert71 dans le forum C++
    Réponses: 13
    Dernier message: 18/05/2006, 16h08
  4. [Débutant] Constructeur par recopie pour TComponent
    Par Runlevel dans le forum C++Builder
    Réponses: 9
    Dernier message: 06/05/2006, 17h58
  5. Constructeur par recopie
    Par KernelControl dans le forum C++
    Réponses: 2
    Dernier message: 29/12/2005, 13h24

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