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

 Delphi Discussion :

Est-il possible de faire des classes autoinstanciées ?


Sujet :

Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 59
    Points : 49
    Points
    49
    Par défaut Est-il possible de faire des classes autoinstanciées ?
    Bonjour,

    Je suis issu du C++ et je me demandait, est-il possible de faire des classes autoinstanciées en Delphi ?
    C'est à dire que si je crée une classe ARF, lorsque je fait la déclaration avec le mot clé 'VAR', je ne crée qu'une référence. Il faut donc que j'appelle la méthode .Create().
    Y a-t-il un moyen pour que la classe soit directement créé sur la pile ?

    MErci pour votre aide

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    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 447
    Points : 24 849
    Points
    24 849
    Par défaut
    tu peux instancier la variable dans la partie initialization genre

    quelque part dans l'unité (je pense juste après implementation)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    var
      _Singleton: TBidule = nil; // voir si le Create est possible ici avec les nouvelles versions, en D7 faut constante
    ------ METHODE VIA INITIALIZATION/FINALIZATION ------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    initialization
      _Singleton := TBidule.Create();
     
    finalization
      if Assigned(_Singleton) then
      begin
        _Singleton.Free();
        _Singleton := nil;
      end;
    ------ METHODE VIA METHODE DE CLASSE ------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    type
      TBidule = class(TMachin)
        class function Singleton: TBidule;
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class function TBidule .Singleton: TBidule;
    begin
      if not Assigned(_Singleton) then
        _Singleton := TBidule.Create();
     
      Result := _Singleton;
    end;
    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

  3. #3
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    En fait je pense qu'il veux parler d'un instentiation automatique a la declaration.

    J'ai en effet lut dernierement sur un bouquin de C++, que les variables de types objet instenticent l'objet lors de sa declaration.

    Pour eviter cela, on utilisertais des pointeurs sur des classes instancié via ne mot clef "new".

    Dans ce cas non.
    Il n'existe pas de methode similaire.
    C'est un des principe du Delphi : On suppose que tu ne sais pas ce que tu fais. Donc si tu veux instancier un objet, Explicite le

    Par contre, on peut en effet initialiser dans la partie Initialization/Finalization des instances globales lors du chargement/Dechargement des unitees.
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 59
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par Clorish Voir le message
    En fait je pense qu'il veux parler d'un instentiation automatique a la declaration.
    Oui c'est tout à fait ça.

    Donc tant pis, je vais me taper les Create().

    Merci à vous pour vos réponses rapides !

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    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 447
    Points : 24 849
    Points
    24 849
    Par défaut
    Effectivement, n'ayant fait que du C et du Java, tout a toujours été explicite pour le Malloc en C ou le New en Java, ... et je viens donc de comprend le fameux "Obj->Property" qui remplace le "(*Obj).Property" dans le cas d'une instanciation dynamique (via new et *) qui comme en delphi c'est un pointeur mais il est explicite alors qu'en statique (Instanciation automatique), le point suffit ...

    en fait, en C++ les objets sont créés et libérés comme les chaines longues en delphi, cela se fait tout seul ! trop fort une début de garbage

    d'aileurs, en C++, pour les string c'est toujours Char * Malloc/FreeMem ? ou il y a aussi un mécanisme automatique ?
    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

  6. #6
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Kia,
    Citation Envoyé par ShaiLeTroll Voir le message
    d'aileurs, en C++, pour les string c'est toujours Char * Malloc/FreeMem ? ou il y a aussi un mécanisme automatique ?
    En C++ "propre", on n'utilise pas de "char *" etc., mais des "string".
    Si les cons volaient, il ferait nuit à midi.

  7. #7
    Membre habitué

    Inscrit en
    Août 2005
    Messages
    253
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 253
    Points : 197
    Points
    197
    Par défaut
    Bonjour

    c'est juste pour ne pas taper les Create() ? on Gagne rien au niveau de la RAM ?

  8. #8
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    Citation Envoyé par helmis Voir le message
    Bonjour

    c'est juste pour ne pas taper les Create() ? on Gagne rien au niveau de la RAM ?
    ben non, on gagne rien

    sous Turbo Pascal (et encore sous Delphi) on a la mot clé OBJECT qui permet de déclarer un objet dont l'allocation n'est pas dynamique...Cependant son constructeur n'est pas invoqué non plus.

    à partir de Delphi "je sais pas combien mais plus que 7" on peut aussi déclarer une méthode dans un RECORD...mais là non plus pas d'invocation automatique de constructeur.

    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
     
    type
     TMonObjet=object
      i:integer;
      constructor init;
     end;
     
    constructor TMonObject.Create;
    begin
     i:=1;
    end;
     
    var
     o:TMonObject;
     po:^TMonObject;
    begin
     o.i:=1; // valide car "o" n'est pas un pointeur !
     
     new(po,Init); // allocation dynamique en précisant le constructor 
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 02/12/2011, 04h53
  2. Est-ce possible de faire des jeux pour Ipod à Molette cliquable?
    Par Jakemanga dans le forum Développement 2D, 3D et Jeux
    Réponses: 7
    Dernier message: 19/05/2010, 13h48
  3. Est il possible de faire des border raduis avec Internet Explorer
    Par Alpha14 dans le forum Mise en page CSS
    Réponses: 5
    Dernier message: 23/02/2010, 17h02
  4. Réponses: 3
    Dernier message: 22/07/2009, 12h04

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