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# Discussion :

Comment savoir ce qui différencie deux objets ?


Sujet :

C#

  1. #1
    Membre habitué Avatar de Antho42
    Profil pro
    Inscrit en
    Février 2009
    Messages
    173
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 173
    Points : 161
    Points
    161
    Par défaut Comment savoir ce qui différencie deux objets ?
    Bonjour,

    Petite question du jour :
    J'ai à un moment deux Table dans mon programme. (Microsoft.Office.Interop.Word.Table pour être plus explicite)

    Or à un moment j'ai besoin de comparer deux Table pour savoir si elles sont les même et selon le résultat effectuer un traitement ou un autre.

    J'ai donc, bien évidemment, utilisé la méthode de la classe Object comme je fais pour tout autre objet...

    Seulement, le hic, c'est que ça me renvoie toujours false, alors que je suis kasi certain d'avoir deux tables identiques !!

    Donc, en mettant un point d'arrêt sur la méthode Equals(), je regarde les deux tables et je vois qu'elles ont tous leurs membres et autre propriétés identiques ... mais Equals() me renvoi quand même false

    Vu le grand nombre de membres et propriétés, peut-être que je passe à coté d'un mais je ne vois pas lequel et ni pourquoi il serait différent.

    Alors je me demande s'il existe une méthode ou une technique qui me permet de savoir ce qui différencie deux objets ?

    Merci d'avance

  2. #2
    Membre éclairé Avatar de ppphil
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 612
    Points : 685
    Points
    685
    Par défaut
    Equals() te retourne true si les deux objets sont les mêmes, c'est à dire s'il s'agit "de deux pointeurs qui pointent sur le même objet".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    object a = new object();
    object b = new object();
    b.Equals(a); // -> false
    b = a
    b.Equals(a); // -> true
    Pour comparer tes tables tu dois probablement comparer leur contenu...

  3. #3
    Membre habitué Avatar de Antho42
    Profil pro
    Inscrit en
    Février 2009
    Messages
    173
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 173
    Points : 161
    Points
    161
    Par défaut
    Citation Envoyé par ppphil Voir le message
    Equals() te retourne true si les deux objets sont les mêmes, c'est à dire s'il s'agit "de deux pointeurs qui pointent sur le même objet".
    Oui et c'est ce qu'il me semblait dans mon cas.
    J'imagine donc (je vois pas ce que ca pourrait être d'autre a part une des deux tables nulles, mais ce n'est pas le cas) que ça ne pointe pas sur le même objet mais je ne comprends pas pourquoi puisque ça devrait être le cas.

    Si je dois comparer le contenu j'ai pas fini ...
    Et il est possible d'avoir deux tables avec le même contenu mais qui ne sont pas les "mêmes" donc c'est un coup dans l'eau à ne même pas essayer.

    Ces Table me semblent rempli de comportement bizarres.
    ( Exemple parmis d'autre, assigner un ID à une table ne provoque pas d'erreur mais quand on veut le relire ça renvoi toujours 0 ou vide )

  4. #4
    Membre éclairé Avatar de ppphil
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 612
    Points : 685
    Points
    685
    Par défaut
    Comment tu instancie tes deux tables ?

  5. #5
    Membre habitué Avatar de Antho42
    Profil pro
    Inscrit en
    Février 2009
    Messages
    173
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 173
    Points : 161
    Points
    161
    Par défaut
    Citation Envoyé par ppphil Voir le message
    Comment tu instancie tes deux tables ?
    En fait je récupère la table actuellement sélectionnée, je l'assigne a une variable "tab" d'une classe (qui a donc un membre de type Table).
    Et un peu plus tard je récupère de nouveau la table sélectionnée et je veux la comparer avec celle préalablement stockée

    ( En écrivant ces lignes j'ai maintenant un énorme doute sur le fait que ca "pointe" au même endroit, bien que Equals() ne fasse pas toujours par rapport aux endroits pointés, par exemple avec les string )

    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
     
    Table t1 = this.Application.Selection.Tables[1];
    MaClass mclass = new MaClass();
    mclass.tab = t1;
     
    ...
     
    Table t2 = this.Application.Selection.Tables[1];
     
    if(t2.Equals(mclass.tab))
    {  
    }
    else
    {
    }

  6. #6
    Membre éclairé Avatar de ppphil
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 612
    Points : 685
    Points
    685
    Par défaut
    Citation Envoyé par Antho42 Voir le message
    bien que Equals() ne fasse pas toujours par rapport aux endroits pointés, par exemple avec les string )
    Oui, mais avec un string ça paraît clair. C'est documenté. Par contre, le Equals du Table ne parait pas overridé en tous cas selon la documentation et il s'agirait du Equals de Object...
    Désolé, je ne me sens pas plus au clair que toi....

  7. #7
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Points : 2 927
    Points
    2 927
    Par défaut
    Citation Envoyé par Antho42 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Table t1 = this.Application.Selection.Tables[1];
    MaClass mclass = new MaClass();
    mclass.tab = t1;
     
    ...
     
    Table t2 = this.Application.Selection.Tables[1];
    Si this.Application.Selection est modifié, il est possible que Tables[1] ne soit plus la même instance.
    Que fais-tu avec l'instance mclass ?

  8. #8
    Membre habitué Avatar de Antho42
    Profil pro
    Inscrit en
    Février 2009
    Messages
    173
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 173
    Points : 161
    Points
    161
    Par défaut
    Je ne sais pas exactement si this.Application.Selection change, mais le this.Application.Selection.Tables[1] lui change étant donné qu'on sélectionne telle ou telle table.

    En fait je voudrais que lorsque l'utilisateur choisisse un tableau, j'effectue un traitement sur ce tableau (typiquement un redimensionnement par rapport à une colonne) !

    Je me suis donc dit , j'ai une class (statique) avec une List<Objet> et une méthode statique permettant d'ajouter à cette List et de la récupérer.
    Objet à un membre de type Table, j'en profite donc pour stocker cette table et une valeur de colonne.

    Donc pendant l'utilisation normale de l'application, je viens a remplir (pas tout d'un coup) cette List<Objet> et donc chaque Objet contient en fait , entre autre, un tableau correspondant a une Table existante dans le document (puisqu'il y en a plusieurs) et qui ont déjà été traitées.

    Donc, plus tard je veux que qd l'utilisateur sélectionne une table et qu'il veut la redimensionner, regarder si cette table avait déja été traitée auparavant, afin de la connaitre et donc de connaitre aussi son numéro de colonne et de pouvoir la redimensionner.

    Je faisais donc :

    - Recuperer la List<Objet>
    - Pour chaque Objet dans la liste, regarder le membre Table
    - Si ce membre est égale au tableau que je viens de sélectionner, alors c est bon .. etc

    Mais ça ne fonctionne pas :\
    Peut-être je devrais faire directement une List<Table> et pas une Liste<Objet> avec Objet contenant une Table.

    Je m'interroge.

  9. #9
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Points : 2 927
    Points
    2 927
    Par défaut
    Les objets Word sont interopérés.
    C'est du code non managé derrière l'interface COM (Microsoft.Office.Interop.Word), donc cela ne m'étonnerais pas que Equals() renvoie un résultat incorrect (mais je ne saurais pas l'expliquer).

    Essaye de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Table t1 = this.Application.Selection.Tables[1];
    Table t2 = this.Application.Selection.Tables[1];
    Console.WriteLine(t1.Equals(t2));
    Tu devrais avoir True.

  10. #10
    Membre habitué Avatar de Antho42
    Profil pro
    Inscrit en
    Février 2009
    Messages
    173
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 173
    Points : 161
    Points
    161
    Par défaut
    Citation Envoyé par Skalp Voir le message
    Les objets Word sont interopérés.
    C'est du code non managé derrière l'interface COM (Microsoft.Office.Interop.Word), donc cela ne m'étonnerais pas que Equals() renvoie un résultat incorrect (mais je ne saurais pas l'expliquer).

    Essaye de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Table t1 = this.Application.Selection.Tables[1];
    Table t2 = this.Application.Selection.Tables[1];
    Console.WriteLine(t1.Equals(t2));
    Tu devrais avoir True.
    Ben non justement ça me renvoie False ce "simple" test.
    Le seul Equals() que j'ai trouvé qui me renvoyait True c'est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Table t1=this.Application.Selection.Tables[1];
    t1.Equals(t1)


    Franchement bizarre, je vois pas comment contourner le problème :\
    A moins de faire une classe avec le stockage d'un maximum d'informations et une List<DeCetteClass> et encore je pense pas que ça ira parce qu'il se peut que j'ai des table fort semblables voir les mêmes mais qui ne sont pas les mêmes point de vue Document.

    Vraiment spécial le comportement autour de ces objets

  11. #11
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Points : 2 927
    Points
    2 927
    Par défaut
    Citation Envoyé par Antho42 Voir le message
    Franchement bizarre, je vois pas comment contourner le problème :\
    Essaye de revoir la conception :
    Citation Envoyé par Antho42 Voir le message
    En fait je voudrais que lorsque l'utilisateur choisisse un tableau, j'effectue un traitement sur ce tableau (typiquement un redimensionnement par rapport à une colonne) !

    Donc, plus tard je veux que qd l'utilisateur sélectionne une table et qu'il veut la redimensionner, regarder si cette table avait déja été traitée auparavant, afin de la connaitre et donc de connaitre aussi son numéro de colonne et de pouvoir la redimensionner.
    Est-ce indispensable de retenir la liste des tableaux qui ont déjà été traités ?

  12. #12
    Membre habitué Avatar de Antho42
    Profil pro
    Inscrit en
    Février 2009
    Messages
    173
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 173
    Points : 161
    Points
    161
    Par défaut
    Citation Envoyé par Skalp Voir le message
    Essaye de revoir la conception :
    Est-ce indispensable de retenir la liste des tableaux qui ont déjà été traités ?
    Ben je le contourne "temporairement" en demandant à chaque fois à l'utilisateur d'entrer le numéro de colonne à partir duquel faire le redimensionnement mais c'est pas très pratique et pas trop apprécié par les personnes me demandant de réaliser ça (stage inside ~o~ )

    En plus le redimensionnement est dans les 2 sens, donc si je sais pas "identifier une table d'une autre", au moment ou il veut dimensionner, il faut le numéro de colonne et quand il veut revenir à la normale il doit de nouveau entrer ce numéro (puisque je suis incapable de savoir si ce tableau à déjà été traité)
    Pas très pratique tout ça...

    J'essaye de penser à une autre conception mais je sèche un peu depuis qqes jours déjà alors j'avais mis ça de coté et j'y reviens à présent car il est temps.

    La seul solution valable que je vois est une cellule spéciale dans le tableau me permettant de servir de "ID" de table, de stocker les tables et au moment ou je veux voir si la table a déjà été traitée je vais voir s'il existe un ID correspondant dans la liste par rapport à celui en cours.

    Seul hic, et de taille : la cellule spéciale, ça ne plait pas trop. Les tableaux contiennent en fait des informations spéciales représentant des fonctions d'automates de l'entreprise et qui sont stocker dans une AF, une AF comportant un grand nombre de tableaux.

    C'est la joiiiiiie

  13. #13
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Points : 2 927
    Points
    2 927
    Par défaut
    Tu pilotes Word avec les VSTO ou par "simple" automation ?

  14. #14
    Membre habitué Avatar de Antho42
    Profil pro
    Inscrit en
    Février 2009
    Messages
    173
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 173
    Points : 161
    Points
    161
    Par défaut
    Citation Envoyé par Skalp Voir le message
    Tu pilotes Word avec les VSTO ou par "simple" automation ?
    Je fais un projet "Complément Word 2003"
    Donc du VSTO

Discussions similaires

  1. [Débutant] Comment comparer la valeur de deux objets (type Object)
    Par r0d dans le forum C#
    Réponses: 5
    Dernier message: 10/12/2014, 11h20
  2. [WD17] Comment savoir ce qui a été modifié par l'utilisateur ?
    Par meganulos dans le forum WinDev
    Réponses: 8
    Dernier message: 24/10/2013, 16h32
  3. Comment savoir ce qui fait crasher mon application
    Par rdeumil dans le forum Android
    Réponses: 4
    Dernier message: 03/05/2013, 16h50
  4. [CSS] Comment savoir ce qui est faisable?
    Par cladsam dans le forum Mise en page CSS
    Réponses: 13
    Dernier message: 07/02/2006, 13h06
  5. [Jawin][VB]comment savoir ce que contient un objet ?
    Par blaz dans le forum API standards et tierces
    Réponses: 15
    Dernier message: 22/08/2005, 12h27

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