Utilisation de nsIDictionary

Vous vous penchez sur le développement d'applications ou d'extensions pour Mozilla ? C'est alors vers ce forum que se dirigeront naturellement vos requêtes...
thebluffer
Salamandre
Messages : 21
Inscription : 26 déc. 2005, 16:52

Utilisation de nsIDictionary

Message par thebluffer »

Bonjour, je souhaiterais créer une map pour stocker le nombre d'occurences d'une donnée.
Le composant nsIDictionary me semble approprié mais je n'arrive pas à créé une instance.
J'ai un message comme quoi la classe n'a pas de propriétés.

Quelqu'un a-t-il déjà utilisé ce composant, un composant plus adapté existe-t-il ?

Je code un composant en javascript pour Mozilla Thundebird

Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR; rv:1.7.12) Gecko/20050919 Firefox/1.0.7
arno.
Varan
Messages : 1347
Inscription : 19 août 2004, 12:26

Message par arno. »

pourquoi pas une variable normale en javascript :

Code : Tout sélectionner

var une_variable = {
 prop1 : bla,
 prop2 : blo
 }

function longueur_de_la_variable() {
 var l = 0;
for (var prop in une_variable) 
  l++;
return l;
}
Message envoyé avec : Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.3) Gecko/20060326 Firefox/1.5.0.3 (Debian-1.5.dfsg+1.5.0.3-2)
thebluffer
Salamandre
Messages : 21
Inscription : 26 déc. 2005, 16:52

Message par thebluffer »

Merci Arno,

Mais je voudrais quelque chose de plus dynamique avec des accesseurs.

En fait je pense faire plutot quelque chose du genre, mais je ne suis pas un spécialiste du javascript, on peut donc sans doute faire plus beau...

Code : Tout sélectionner

var myMapObject = {
    var propNameArray = new Array;
    var propValueArray = new Array;
    i = 0

    get: function(name) {
                          for (j=0;j<i;j++) {
                           if(propNameArray[j] == name) {
                              return propValueArray[j];
                           }
                          }
                           },
    set: function(name, value) {
                                 propNameArray[i] = name;
                                 propNalueArray[i] = value;
                                 i++
                               }
}
Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.0.3) Gecko/20060426 Firefox/1.5.0.3
arno.
Varan
Messages : 1347
Inscription : 19 août 2004, 12:26

Message par arno. »

en javascript, tu peux rajouter des propriétés à la volée :

Code : Tout sélectionner

myMapObject['prop3'] = bli;
(ou bien myMapObject.prop3 = bli, c'est la même chose)
thebluffer
Salamandre
Messages : 21
Inscription : 26 déc. 2005, 16:52

Message par thebluffer »

Ok je suis démasqué, je suis plutot Java....

Effectivement ça m'a l'air plutot simple...

Un grand merci donc !

Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.0.3) Gecko/20060426 Firefox/1.5.0.3
arno.
Varan
Messages : 1347
Inscription : 19 août 2004, 12:26

Message par arno. »

D'ailleurs, nsDictionary ne fait fondamentalement pas grand chose d'autre

Code : Tout sélectionner

nsDictionary.prototype= {
    hasKey: function(key) { return this.hash.hasOwnProperty(key) },
    
    getKeys: function(count) {
        var asKeys = new Array();
        for (var sKey in this.hash) asKeys.push(sKey);
        count.value = asKeys.length;
        return asKeys;
    },  
    
    getValue: function(key) {
        if (!this.hasKey(key))
            throw Components.Exception("Key doesn't exist");
        return this.hash[key]; 
    },  
    
    setValue: function(key, value) { this.hash[key] = value; },
    
    deleteValue: function(key) {
        if (!this.hasKey(key)) 
            throw Components.Exception("Key doesn't exist");
        var oOld = this.getValue(key);
        delete this.hash[key];
        return oOld;
    },  
    
    clear: function() { this.hash = {}; },
    
    QueryInterface: function(iid) {
        if (!iid.equals(Components.interfaces.nsISupports) &&
            !iid.equals(DICTIONARY_IID))
            throw Components.results.NS_ERROR_NO_INTERFACE;
        return this;
    }                                                                                           
};
Si tu as besoin de faire d'autres trucs lorsque tu accédes à, ou modifies tes propriétés, regarde du côté des getters et setters.

http://developer.mozilla.org/en/docs/Co ... nd_Setters
thebluffer
Salamandre
Messages : 21
Inscription : 26 déc. 2005, 16:52

Message par thebluffer »

Non c'est bon en fait un bête tableau suffit à mes besoins.

Pourtant il me semblait que l'on ne pouvait pas indexer les tableaus avec des chaines de caractères... C'est surement dans un autre langage, à force de changer on s'y perd !

Et encore merci !

Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.0.3) Gecko/20060426 Firefox/1.5.0.3
thebluffer
Salamandre
Messages : 21
Inscription : 26 déc. 2005, 16:52

Message par thebluffer »

Ha heu, bon je suis embêté en fait après j'ai besoin de reparcourir le tableau sans savoir combien d'élément il y a et à quels indexs :
Je pensais faire comme suit mais après avoir rempli mon tableau, celui-ci compte toujours 0 éléments... Alors que quand j'accède à un index connu je récupère bien une valeur...

alert("Taille du tableau : " + attributeMap.length);
for(var i = 0; i < attributeMap.length; i++) {
alert(attributeMap);
}


Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.0.3) Gecko/20060426 Firefox/1.5.0.3
arno.
Varan
Messages : 1347
Inscription : 19 août 2004, 12:26

Message par arno. »

ben non, length, ça marche pas sur les tableaux associatifs. L'idée que je donne dans mon premier poste ne marche pas ?
arno.
Varan
Messages : 1347
Inscription : 19 août 2004, 12:26

Message par arno. »

ah, j'ai compris ce que tu veux faire.

for (var prop in une_variable) {
var value = variable [prop];
}

ou sinon directement

for each (var value in une_variable) {
}
Benoit
Administrateur
Messages : 4894
Inscription : 19 juil. 2003, 10:59

Message par Benoit »

C'est du PHP ça :)

En JavaScript c'est quelque chose comme

Code : Tout sélectionner

for (var i in object) {
  alert('object[\''+i+'\'] is ' + object[i]);
}
♫ Li tens s'en veit, je n'ai riens fais ;
Li tens revient, je ne fais riens. ♪
martin
Varan
Messages : 1074
Inscription : 21 janv. 2004, 16:23

Message par martin »

bonjour,

je suis d'accord avec tout ce qui t'a été dit, mais ayant récemment remis le nez dans la doc, je me permet quelques précisions, en espérant ne pas dire de bétises.
thebluffer a écrit :Pourtant il me semblait que l'on ne pouvait pas indexer les tableaus avec des chaines de caractères...
Non, effectivement on ne peut pas, même si on en a l'impression.

un Array est objet dérivé d'un Object.
Et on peut accéder aux propriétés/méthodes d'un Object avec la notation par point (myObject.property1) ou par la notation par crochet (myObject['property1']).

Un Array contient les données du tableau, accessibles par myArray[indice]. Et également la propriété length, accessible par crochet ou point, qui contient le nombre d'élément du tableau[edit]l'indice le plus grand du tableau + 1[/edit].
Si tu fait myVar['aString'] = 'aValue', tu ajoute une propriété (comme length) à ta variable, mais tu ne rajoutes pas de donnée dans le tableau...

Pour augmenter la confusion : les boucles for..in, dédiée aux Object (et dont hérite Array), permet de passer en revue tous les propriétés/méthodes d'un objet, mais on a exclue volontairement la propriété length d'un tableau de ce parcours...(de même d'ailleurs que d'autres propriétés, comme prototype et constructor)

pour être plus explicite, un peu de code :

Code : Tout sélectionner

var myVar = new Array();
myVar[0] = 'value 1';
myVar['aString'] = 'value 2';
myVar[1] = 'value 3';

var test = '';
for (var i = 0 ; i < myVar.length; i++) {
// parcourt toutes les données du tableau
  test = test + i + ' : ' + myVar[i];
}
alert(test);
// affiche ->
// 0 : value 1
// 1 : value 3


test = '';
for (var j in myVar) {
//parcourt toutes les propriétés de myVar (dont les données du tableau), sauf length
  test = test + j + ' : ' + myVar[j] + '\n';
}
alert(test);
// affiche ->
// 0 : value 1
// aString : value 2
// 1 : value 3
Dernière modification par martin le 20 mai 2006, 11:20, modifié 1 fois.
thebluffer
Salamandre
Messages : 21
Inscription : 26 déc. 2005, 16:52

Message par thebluffer »

Ha ok, je me suis il est vrai emmelé les pinceaux.

Donc c'est des propriétés que j'affecte et ce n'est donc pas un tableau du coup je n'ai surement pas besoin de déclarer un array.

La boucle for in devrait me permettre de balayer les propriétés que j'ai ajouté..

Je test ça ce soir.

Un grand merci à tous pour ces explications.

Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR; rv:1.7.12) Gecko/20050919 Firefox/1.0.7
Benoit
Administrateur
Messages : 4894
Inscription : 19 juil. 2003, 10:59

Message par Benoit »

martin a écrit :Et également la propriété length, accessible par crochet ou point, qui contient le nombre d'élément du tableau.
Si ta documentation dit ça, elle est fausse. La propriété length renvoie en fait le plus grand index du tableau + 1.

Voir : http://developer.mozilla.org/fr/docs/Un ... s_tableaux
♫ Li tens s'en veit, je n'ai riens fais ;
Li tens revient, je ne fais riens. ♪
thebluffer
Salamandre
Messages : 21
Inscription : 26 déc. 2005, 16:52

Message par thebluffer »

Benoit a écrit :
martin a écrit :Et également la propriété length, accessible par crochet ou point, qui contient le nombre d'élément du tableau.
Si ta documentation dit ça, elle est fausse. La propriété length renvoie en fait le plus grand index du tableau + 1.

Voir : http://developer.mozilla.org/fr/docs/Un ... s_tableaux
Je pense que la subtilité c'est que le tableau est étendu du nombre d'indice...

toto[0] = 1;
toto[2] = 2;

Le tableau alloué est alors de 3 indices (le toto[1] a une allocation de faite même si on l'utilise pas)...

Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.0.3) Gecko/20060426 Firefox/1.5.0.3
Répondre

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 4 invités