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 :

A propos des mod�les d'objet (avec sources) [FAQ]


Sujet :

C++Builder

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Inactif  
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    25
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 25
    Par d�faut [R�solu] A propos des mod�les d'objet (avec sources)
    J'aimerais, un peu comme en VB, pouvoir cr�er un mod�le puis obtenir des instances de ce mod�le.

    Par exemple, si je cr�� un bouton "Button1" avec un caption "OK", j'aimerais pouvoir faire TButton *T = new Button1(). Ainsi, automatiquement, T->Caption poss�de un caption contenant "OK" comme le mod�le Button1.

    Ca me parait pratique car pour l'instant je construit tout dynamiquement

    Merci

  2. #2
    Membre chevronn�

    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Avril 2002
    Messages
    137
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 137
    Par d�faut
    tu peux cr�er une copie d'un objet avec le constructeur :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    TButton * B = new TButton(*Source);
    Tu connais le langage C++ ???

  3. #3
    Inactif  
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    25
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 25
    Par d�faut
    Je fais de l'informatique depuis une dizaine d'ann�es...
    Je connais surtout le VB mais depuis la sortie de .NET j'ai d�cid� de passer au C++. J'en ai d�j� fait un peu avec TC++ DOS 1.0 et TC++ WIN 3.0 ... Ca date un peu et j'ai pas fais de vrais programmes avec.

    Mais bon, je pr�f�re BC++ car .NET ne me satisfait vraiment pas.


  4. #4
    Membre Expert
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activit� : Responsable de compte
    Secteur : High Tech - Op�rateur de t�l�communications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Billets dans le blog
    1
    Par d�faut
    tu peux �galement cr�er un composant qui descent du type TButton avec sa property Caption fix�e a la valeur d�sir�e

    Salutations
    vous trouverez mes tutoriels � l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les r�gles du forum

  5. #5
    Inactif  
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    25
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 25
    Par d�faut
    TButton *B = new TButton(Button1);
    Ca marche pas :

    Je d�pose un TButton (Button1) sur la TForm1 (Form1)
    Dans l'evenement Click de Button1 je saisi :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
     
    TButton *T = new TButton(Button1);
    T->Parent = this;
    T->Left = 100;
    T->Top = 100;
    T->Visible = true;
    Et �a m'affiche un bouton vide � la taille par d�faut.

    :

    Ps:
    En plus, mon probl�me est plus complexe puisque j'utilise un d�riv� de TPanel qui contient plusieurs contr�les. L'objectif �tant de construire le mod�le visuellement puis de cr�er des instance de ce mod�le visuel ensuite.

  6. #6
    Inactif  
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    25
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 25
    Par d�faut ...
    Copy constructors

    Object Pascal does not have built-in copy constructors. Consequently, VCL style classes in C++Builder do not have built-in copy constructors. The following example code attempts to create a TButton pointer by using a copy constructor:

    TButton *B = new TButton(ownerCtrl);

    TButton *C = new TButton(*B); // not allowed for VCL style class objects

    Do not write code that depends upon a built-in copy constructor for VCL classes. To create a copy of a VCL style class object in C++Builder, you can write code for a member function that copies the object. Alternatively, descendants of the VCL TPersistent class can override the Assign method to copy data from one object to another. This is typically done, for example, in graphics classes such as TBitmap and TIcon that contain resource images. Ultimately, the manner of copying an object can be determined by the programmer (component writer); but be aware that some of the copy methods used in standard C++ are not available for VCL style classes.


    Enfin, bon, �a tue quand m�me de pas pouvoir dupliquer dynamiquement des controles containers. Alors que je peux faire un copier/coller avec le clavier..... Me reste plus qu'a faire des sendkey's

    HAHAHAHA dites moi que je r�ve ?

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    61
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 61
    Par d�faut
    Bonsoir � toi DevX

    Ne te d�courage pas voici une soluce qui devrait r�pondre � ton Pb

    Fichier 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
    23
    24
    25
     
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <ExtCtrls.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:	// Composants gérés par l'EDI
            TPanel *Panel1;
            TButton *Buttoncreate;
            void __fastcall ButtoncreateClick(TObject *Sender);
            void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
    private:	// Déclarations de l'utilisateur
    public:		// Déclarations de l'utilisateur
            __fastcall TForm1(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    Fichier.cpp
    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
     
    void __fastcall TForm1::ButtoncreateClick(TObject *Sender)
    {
      static short a = 10;
      TButton *Button1;
      Button1 = new TButton(Form1);
      Button1->Parent = Panel1;
      Button1->Caption = "Ok";
      Button1->Left = a;
      a+= 10;
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &)
    {
       int        i;
       TComponent *Temp;
    // Scrute les composants possèder par la forme
       for (i=0; i< Form1->ComponentCount-1; i++)
       {
         Temp = Form1->Components[i];
    // Si un composant est du type requis 
         if(dynamic_cast<TButton*>(Temp) != NULL)
         {
    // On transtype dans la classe correspondante...
           TButton *B = (TButton*)Temp;
    // On détruit le composant crée dynamiquement
           delete(B);
         }
       }
    }
    Jesp�re t'avoir aid�

    Amicalement Laurent

  8. #8
    Inactif  
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    25
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 25
    Par d�faut
    Merci Laurent, cela revient � ce que je faisais au d�part d'une fa�on diff�rente.

    J'aurais aim�, comme en VB, ajouter un TButton (Button1) et ensuite pouvoir cr�er des instances de ce Button1 en faisant, par exemple, TButton *B = new Button1; et, pareil, pour des controles containers du genre TPanel contenant divers autres controles.

    Au d�but, et bien je cr�� dynamiquement les boutons, etc que je stocke dans des structures elles m�mes contenues dans un TList. L'ennui, c'est que �a m'oblige � tout programmer. La position en pixel de tel ou tel bouton, etc....Un travail laborieux.

    Enfin, je pense tenir une piste s�rieuse car j'ai remarqu� que les TFrames peuvent jouer � la fois le role de fen�tre et de container du genre TPanel. A priori, �a devrait marcher.

    Merci pour votre aide � tous.

  9. #9
    Membre habitu�
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    11
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2002
    Messages : 11
    Par d�faut
    Dans ton cas, il serait peut-�tre int�ressant de cr�er un descendant de TPannel contennant un tableau de boutons et ayant un constructeur prenant en param�tre le nombre de boutons que celui-ci doit contenir et ar exemple la dimension des boutons (hor et vert) et calculant la position de ceux ci en fonction de le dimention du pannel. Tu pourrais ajouter comme param�tre un TString list contenant les "Captions" de chaque TButton....

  10. #10
    Inactif  
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    25
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 25
    Par d�faut MadMakII
    En fait, c'est plus compliqu� que cela. Pour �tre pr�cis, je travaille sur un logiciel d'analyse technique/graphique pour la bourse dont voici les principes de la structure.

    un formulaire MDI capable d'afficher des instances de fen�tres chaque fen�tre contient un TScrollBox

    Ce TScrollBox peut contenir un nombre ind�termin� de TPanel Chaque TPanel contient un TGraphControl pour le dessin des graphiques, plus un TScrollbar, plus un TCheckBox, plus divers TButton Chaque TPanel peut �tre ferm�, d�plac�, agrandi... C'est donc une structure relativement plus complexe qu'un TPanel avec quelques boutons, surtout que les graphiques partagent les m�mes donn�es boursi�res. Il aurait donc �t� plus pratique pour moi de concevoir visuellement ce TPanel (comme en vb) puis ensuite d'en creer des instances.... Je viens d'ailleurs de me rendre compte que TFrame ne peut r�pondre que partiellement � ce probl�me.

    Dans tout cela, ce qui m'�nerve le plus, c'est qu'avec le clavier je peut faire un copier/coller de ce TPanel et tout ce qu'il contient sans probl�me alors que mon code ne permet pas de le faire. Comme cit� plus haut dans la doc de BCB, on ne peut pas utiliser de constructeur de copie avec les classes VCL. J'ai, malheureusement, l'impression que je ne pourrais pas r�aliser cela autrement qu'en passant par le code, en placant chaque �l�ment dans le TPanel au pixel pr�t.

    Je trouve �tonnant qu'un langage aussi puissant que BCB ne soit pas capable de faire cela les doigts dans le nez......

  11. #11
    Membre habitu�
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    11
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2002
    Messages : 11
    Par d�faut
    Ton projet semble beaucoups plus complexe que ce que je pensais � la base.
    Cependant, j'essayerais de voir quels sont les composants remplissants le max de propri�t�s n�cessaires (ce doit �tre ceux �nonc�s plus haut) et j'h�riterais de ceux-ci pour travailler. Donc, pour le pannel, je persiste et signe ce que j'ai dit plus haut, parcontre, pour TScrollBox que je ne maitrise pas trop, je lui ajouterais un membre TPannel ou Tableau de
    TPannel. En fait, n'�tant pas trop courageux, j'essaie de r�cuperer un max de composants d�j� d�velopp�s par d'autres ce qui me permet en un temps reccord de faire des applications assez performantes.

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    61
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 61
    Par d�faut
    Bonjour � tous !!

    DevX, ne serait il pas plus simple en ce qui concerne ton Pb de cr�er une appli MDI et de cr�er un mod�le de "fiche enfant" ???
    Ainsi tu pourrait instancier autant de fiches que tu veux sur le mod�le cr�er
    A m�diter

    Amicalement Laurent

  13. #13
    Inactif  
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    25
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 25
    Par d�faut
    Laurent,

    non, j'ai besoin de controles qui soient pr�cisement align�s les uns par rapport aux autres.

    J'ai trouv� une r�ponse pr�cise � mon probl�me. C'est tout � fait possible de faire des instances de n'importe quel mod�le avec des objets comme TWriter, TReader, TStreamMemory, ReadComponent, etc...

    Je buche actuellement sur cette solution en esp�rant cr�er une petite fonction du genre :

    TComponent *CreateControlInstance(TComponent *Source, AnsiString &NewName)

    Cette fonction devrait alors renvoyer une instance d'un objet avec tous les objets qu'il contenait lorsqu'il � �t� cr�� visuellement en RAD.

  14. #14
    Inactif  
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    25
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 25
    Par d�faut
    Apr�s une longue recherche sur internet, j'ai trouv� une unit� �crite en pascal r�solvant, de fa�on propre, le probl�me que nous avons rencontr� au sujet des instanciations de contr�les containers.

    J'ai import� Unit2.pas dans mon projet C++. En ayant pr�alablement renomm� l'unit� et la directive Unit dans le fichier Unit2.pas avec un nom plus pratique. J'ai, ensuite, compil� l'unit�, puis j'ai fait un include du .HPP, g�n�r� par la compilation, dans mon projet et - r�sultat - �a marche tr�s bien.

    Quand j'aurais un peu de temps je l'�crirais directement en C++



  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    61
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 61
    Par d�faut
    Bonjour � tous

    Pour ceux que �a interresse, voici le source pascal trouver par DevX retraduit en C++ BUILDER

    Fichier .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
     
     
    #ifndef Unit_Duplicate_InstanceH
    #define Unit_Duplicate_InstanceH
     
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <sysutils.hpp>
     
    extern TComponent* DuplicateComponents(TComponent *AComponent);
     
     
    //---------------------------------------------------------------------------
    #endif
    Fichier .cpp
    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
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
     
    //---------------------------------------------------------------------------
    #pragma hdrstop
     
    #include "Unit_Duplicate_Instance.h"
     
    //---------------------------------------------------------------------------
     
    #pragma package(smart_init)
     
     
    class TUniqueReader : public TReader
    {
    private:
      void __fastcall SetNameUnique(TReader *Reader, TComponent *Component, AnsiString  &Name);
    public:
      TComponent *LastRead;
      void __fastcall ComponentRead(TComponent *Component);
      __fastcall virtual TUniqueReader(TStream *Stream, int BufSize);
    };
     
    //----------------------------------------------------------------------------------------------
    __fastcall TUniqueReader::TUniqueReader(TStream *Stream, int BufSize): TReader(Stream, BufSize)
    {
      OnSetName = SetNameUnique;
      LastRead = NULL;
    }
    //----------------------------------------------------------------------------------------------
    void __fastcall TUniqueReader::ComponentRead(TComponent *Component)
    {
      LastRead = Component;
    }
    //----------------------------------------------------------------------------------------------
    void __fastcall TUniqueReader::SetNameUnique(TReader *, TComponent *Component, AnsiString  &Name)
    {
      int i = 0;
      AnsiString tempname = Name;
      while(Component->Owner->FindComponent(Name)!= NULL)
      {
        i++;
        TVarRec v[2] = {tempname, i};
        Name = Sysutils::Format("%s%d", v, 2);
      }
    }
    //----------------------------------------------------------------------------------------------
    void RegisterComponentClasses(TComponent *AComponent)
    {
       int i;
       TWinControl *C;
       RegisterClass(AComponent->ClassType());
       if(dynamic_cast<TWinControl*>(AComponent)!= NULL)
       {
          C = dynamic_cast<TWinControl*>(AComponent);
          if(C->ControlCount > 0)
          {
             for (i=0; i< C->ControlCount-1; i++)
             {
                RegisterComponentClasses(C->Controls[i]);
             }
          }
       }
    }
    //----------------------------------------------------------------------------------------------
    TComponent* DuplicateComponents(TComponent *AComponent)
    {
      TMemoryStream *Stream       = NULL;
      TUniqueReader *UniqueReader = NULL;
      TWriter       *Writer       = NULL;
      TComponent    *MyComponent  = NULL;
      try
      {
        Stream = new TMemoryStream;
        RegisterComponentClasses(AComponent);
        try
          {
            Writer =  new TWriter(Stream, 4096);
            Writer->Root = AComponent->Owner;
            Writer->WriteSignature();
            Writer->WriteComponent(AComponent);
            Writer->WriteListEnd();
          }
        __finally
        {
            delete(Writer);
        }
        Stream->Position = 0;
        try
        {
          TWinControl *C = NULL;
          UniqueReader = new TUniqueReader(Stream, 4096);
          if(dynamic_cast<TWinControl*>(AComponent)!= NULL )
          {
             C = dynamic_cast<TWinControl*>(AComponent);
             UniqueReader->ReadComponents(C->Owner, C->Parent, UniqueReader->ComponentRead);
          }else UniqueReader->ReadComponents(AComponent->Owner, NULL, UniqueReader->ComponentRead);
          MyComponent = UniqueReader->LastRead;
        }
        __finally
        {
          delete(UniqueReader);
        }
      }
      __finally
      {
        delete(Stream);
      }
      return(MyComponent);
    }
    Voila

    Amicalement Laurent

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Partage des mod�les d'objets m�tier
    Par ego dans le forum Mod�lisation
    R�ponses: 3
    Dernier message: 22/12/2014, 17h03
  2. enchainer des translations d'objets avec PCVUE
    Par Angelhell dans le forum Automation
    R�ponses: 1
    Dernier message: 16/06/2011, 21h39
  3. R�ponses: 0
    Dernier message: 13/07/2010, 19h14
  4. Utiliser des fonctions non objets avec Zend
    Par jux dans le forum Zend Framework
    R�ponses: 6
    Dernier message: 08/02/2009, 11h58
  5. Comment r�aliser des mod�les de documentations avec XML ?
    Par Dams76 dans le forum XML/XSL et SOAP
    R�ponses: 6
    Dernier message: 29/08/2003, 02h15

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