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 :

[BCB6] Mettre dans une TForm une autre TForm.


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 62
    Par défaut [BCB6] Mettre dans une TForm une autre TForm.
    Bonjour tout le monde.
    J’aimerais savoir si il etait possible avec BCB 6 de faire qu’une TForm soit dans une TForm de base ?

    Si cela est possible par quel biais autre que qt et wxwidget ?

    Merci beaucoup pour vos indications.
    Amitiés.

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2003
    Messages : 288
    Par défaut
    Oui c'est tout à fait possible je fait ça courrament pour gérer le contenu dynamique (j'ai BCB 5):

    Il suffit de surcharger le CreateParams:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void __fastcall TfrmViewAwk::CreateParams(TCreateParams &Params)
    {
      TForm::CreateParams(Params);
      Params.Style = WS_CHILD | WS_CLIPSIBLINGS;
      Params.WndParent = frmMain->dwAwk->Handle;
      Params.X = 0;
      Params.Y = 0;
      Params.Width = ...
      Params.Height= ...
    }
    Le host peut-être n'importe quelle TForm ou TPanel ou autre Handle.
    J'instancie les forms dynamiquement en fonction des besoins.

    Voici le code pour l'instanciation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      if (frmViewAwk==NULL) {
        frmViewAwk = new TfrmViewAwk(dwAwk);
        frmViewAwk->Parent = dwAwk;
        frmViewAwk->Show();
      }
    C'est tout, je ne crois pas qu'il en manque (sauf le delete frmViewAwk .
    Je trouve cette façon de faire tout simplement magique, et ça permet aussi d'avoir des objets indépendants ce qui est également un grand plus.

    yarp
    www.senosoft.com

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 62
    Par défaut
    Faut t il faire une form en plus de celle de base puis surcharger la form de base ou faut t il que je crée la forme avec le code directement ?

    Par ce que la pour le moment, j’ai un code de base simple

    Unit1.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    Unit1.h

    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
     
    //---------------------------------------------------------------------------
     
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:	// Composants gérés par l'EDI
    private:	// Déclarations de l'utilisateur
    public:		// Déclarations de l'utilisateur
            __fastcall TForm1(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    Bon jusque la ca me crée une fenêtre simple avec un status bar en bas, j’en aurais besoin plus tard. Mais encore que pour le moment ce n’est pas utile.

    Merci beaucoup pour tes explications et le bout de code du départ.
    Amitiés.

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2003
    Messages : 288
    Par défaut
    J'aurais du être plus clair.
    Tu n'as pas besoin de dériver TForm, il te suffit de déclarer CreateParams dans le header de ta frame (c'est une méthode overridable).

    La classe qui doit être overridée est celle de la child window.

    CreateParams -> child

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class TForm1 : public TForm
    {
    ...
    private:
      void __fastcall CreateParams(TCreateParams &Params);
    }
    Instanciation -> parent

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 62
    Par défaut
    Donc en gros, si je me doit de créer une fenêtre dans la fenêtre, je vais dans le Unit.h puis j’instancie celle-ci.

    Mais alors qu’en est t il de son remplissage ?
    Est-ce comme avec une form normal, on place les objets dedans ou alors elle se fait à l’extérieur puis appelé avec le code ?

    Je sait je pose la question de noob mais c’est important par ce qu’il peut en résulté plein de possibilités dans le futur.

    Merci pour ces indications.
    Amitiés.

  6. #6
    Membre expérimenté

    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2003
    Messages : 288
    Par défaut
    Oui c'est une form comme une autre, et tu pose les composants que tu veux dedant. Tu les géreras à partir de cette from là (les évenements et tutti quanti) de toute façon c'est l'inspecteur d'objet qui décide. C'est pour ça que je disais au début que cela crée des objets indépendants, car cela à aussi un effet structurant sur le projet. La classe/frame qui affiche les objets 3D (dans mon soft) encapsule tout le code 3D et seulement elle. En collant un TPaintBox dans la main frame la 3D aurait cotoyé la status bar, les menus, les fonctions (difficile à gérer et on s'éloigne de la philosophie de l'objet).

    ps Je précise que ce ne sera pas Unit1 puisque Unit1 est le nom de la main frame (perso je renomme toujours la main en frmMain c'est plus clair comme ça).

Discussions similaires

  1. Mettre deux figures l'une sur l'autre.
    Par mayssaMM dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 1
    Dernier message: 07/02/2014, 20h15
  2. [RegExp] Détecter des combinaisons dans une chaine une par une
    Par vermine dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 08/06/2010, 13h22
  3. Réponses: 21
    Dernier message: 20/09/2009, 10h50
  4. Réponses: 2
    Dernier message: 22/02/2008, 10h54
  5. Réponses: 3
    Dernier message: 08/06/2007, 11h24

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