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 :

Pointeur sur objet


Sujet :

Delphi

  1. #1
    Membre éclairé
    Profil pro
    Développeur Java
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 681
    Points
    681
    Par défaut Pointeur sur objet
    Bonjour,

    j'ai un petit problème avec les objets et les pointers. Voici un exemple de code que je souhaite faire fonctionner :

    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
    Unit Essai;
     
    interface
    ...
     
    var MaListe : TStringList ;
     
    implementation
     
    procedure MaProcedure ;
    var OldListe : TStringList ;
    begin
        OldListe := MaListe ;
        MaListe := TStringList;
     
        MaProcedureAppelee ;
     
        MaListe.Free ;
     
        MaListe := OldListe ;
    end ;
    Le problème que j'ai remarqué, c'est que MaListe et OldListe pointe sur le même pointeur et le problème c'est que la fonction MaProcedureAppelee utilise la variable MaListe. Ainsi, il suffit de modifier le pointer pour que MaProcedureAppelee traite la nouvelle liste.
    C'est ici un cas simple. Pour expliquer le pourquoi de ce choix c'est qu'en réalité j'ai de multiple fonction qui joue avec MaListe.

    J'ai essayer d'utiliser un pointeur du type ^TStringList mais lorsque je fais MaListe^.Add('coucou'); ça plante.

    Quelqu'un a-t-il une idée ? Je n'ai rien trouvé sur le net à ce sujet.

  2. #2
    Teo
    Teo est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Août 2002
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 110
    Points : 111
    Points
    111
    Par défaut
    Bjr

    Si tes TStringList ne contiennent que du texte tu as juste besoin de sauver le texte avant de lancer la manipulation,
    comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Procedure MaProcedure
    Var Ch_Init:String;
    Begin
      Ch_Init := MaListe.Text;
      MaListe.Clear;//Ta liste est vide
      ProcedureManipulMaListe;
      MaListe.Text := Ch_Init;//Tu ecrases, les eventuelles chaines par les chaines initiales
    End;
    Si tu souhaites travailler qu'avec des tStringList, moi je ferai plustot
    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
    procedure MaProcedure ;
    var OldListe : TStringList ;
    begin
        OldListe := TStringList.Create;
        OldListe.Text := MaListe.Text;
       //ou alos
        OldListe.Assign(MaListe);//J'ai un doute sur le rsultat ici, fait un F1 sur TStringList et regarde ce qu'ils disent sur Assign dans le cas de deux objets identiques
    
        MaListe.Clear; 
        MaProcedureAppelee ; 
        MaListe.Text :=  OldListe.Text ;
        Ou
        MaListe.Assign(OldListe);
     
       OldListe.Free;
    end ;
    Il me semble que assign est equivalent à une affectation qd les 2 objets sont de meme type, alors a proscrire dans ton cas F1 Sur TStringList puis Assign t'en dira plus

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 453
    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 453
    Points : 24 864
    Points
    24 864
    Par défaut
    Un Objet c'est une sorte de Pointeur (appelé Référence), ... en fait quand tu copie MaListe dans OldListe, tu ne fais que recopie l'adresse mémoire de l'un dans l'autre ... tu ne recopie pas l'objet lui même (ce qui est bcp plus compliqué et n'arrive en fait jamais, même le Sender dans une méthode c'est une adresse que tu reçois, si tu modifie le Sender cela change le composant visible à l'écran)

    tient, notre ami, l'aide, explique pour ^ (déférencement) ne fonctionne pas avec les objets

    Chaque classe (et par conséquent chaque composant) est en fait un pointeur. Le compilateur déréférence automatiquement les pointeurs de classe à votre place, aussi n'avez-vous généralement pas besoin de vous poser ces questions. Le statut des classes en tant que pointeurs devient important lorsque vous passez une classe comme paramètre. En général, vous transmettrez les classes par valeur plutôt que par référence. Car les classes sont déjà des pointeurs, c'est-à-dire des références ; transmettre une classe par référence serait transmettre une référence à une référence.
    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

  4. #4
    Membre éclairé
    Profil pro
    Développeur Java
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 681
    Points
    681
    Par défaut
    Merci de vos réponse.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    MaListe := TStringList.Create;
    // Pointeur (MaListe) vaut 425928
    MaListe := TStringList.Create;
    // Même valeur
    Pourquoi MaListe garde le même pointeur.
    Et si je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    MaListe := TStringList.Create;
    // Pointeur (MaListe) vaut 425928
    MaNouvelleListe := TStringList.Create;
    // Valeur 124675
    MaListe := MaNouvelleListe
    // MaListe vaut toujours 425928
    Or d'après ce que vous me dites, ça devrait fonctionner.

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 453
    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 453
    Points : 24 864
    Points
    24 864
    Par défaut
    Il ne faut pas confondre, l'emplacement de la variable pointerr (@MaListe) et la référence (la Valeur indiqué par MaListe), ... c'est comme pour une chaine

    tu as S une string
    @S à $425928
    PInteger(@S)^ = 12345678
    @S[1] à $12345678
    PChar(@S[1])^ = '?'


    dans la Mémoire tu as
    la Variable MaListe qui est un pointeur sur 4 octets à l'emplacement $425928
    et tu as, dans cet emplacement, la valeur entière 12345678 ...

    à l'adresse $12345678, tu as une sorte de structure (l'objet en personne) qui contient, en fait tout une série de pointeur (alors ça va de -72 à ... parmis eux sa classe, cette dernière est la "description" de l'objet, c'est grace à elle que tu peux savoir ce qu'il y a dans l'objet, en fait tout ça c'est compilé et il ne reste que des adresses mémoires et pour certaines parties le RTTI, ...), qui eux même pointe sur des pointeur et tableau de pointer ... après c'est tellement compliqué que je suis personnellement incapable de comprendre (voir l'unité system.pas, c'est un gros truc de malade)
    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
    Membre éclairé
    Profil pro
    Développeur Java
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 681
    Points
    681
    Par défaut
    D'acord, j'ai compris.

    Ca marche. Merci infiniment

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

Discussions similaires

  1. problème lecture Deque de pointeurs sur objet
    Par gonzo59 dans le forum Débuter
    Réponses: 11
    Dernier message: 14/05/2009, 14h57
  2. pointeurs sur objets en C #
    Par lemya dans le forum C#
    Réponses: 3
    Dernier message: 02/01/2008, 12h13
  3. Pointeur sur objet different
    Par peruvio dans le forum C++
    Réponses: 4
    Dernier message: 19/11/2007, 20h06
  4. Tableau de pointeurs sur objets
    Par bassim dans le forum C++
    Réponses: 11
    Dernier message: 13/12/2005, 19h45
  5. [Debutant VC++.net] Obtenir un pointeur sur objet
    Par SteelBox dans le forum MFC
    Réponses: 6
    Dernier message: 17/06/2004, 18h36

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