2010-08-08 6 views
1

J'expérimente l'écriture de gadgets Vista/W7. Dans mon expérience, je veux écrire la date de modification de certains fichiers sur le système. Le problème est que si je veux utiliser des fonctions de manipulation de chaînes, le gadget arrête juste d'écrire sa sortie. Une partie du code du gadget ressemble à ceci:Opérations de chaîne dans le javascript du gadget Vista/W7

function format_lmd(lmd) 
    { 
    // Parse something like "Sun Aug 26 17:13:22 UTC+0200" 
    var lmdFields = lmd.split(' '); 
    //weekday = lmdFields[0]; 
    //month = lmdFields[1]; 
    //monthday = lmdFields[2]; 
    //moment = lmdFields[3]; 
    //return monthday+' '+month+' '+moment; 
    return lmd; 
    } 

    function paintGadget() 
    { 
    var fileitem = System.Shell.itemFromPath("c:\\myfile.txt"); 
    //canvas.addTextObject(' '+fileitem.modifyDate, 'Segoe UI', 9, 'white', text_offset, 21); 
    var result = null; 
    result = ' '; 
    result += format_lmd(fileitem.modifyDate); 
    canvas.addTextObject(result, 'Segoe UI', 9, 'white', text_offset, 21); 
    } 

L'appel à partager (dans la fonction format_lmd) semble arrêter le script (ou mieux: jeter une exception). Bien que la documentation semble indiquer que la fonction split peut être utilisée pour diviser une chaîne en plusieurs parties, cela ne fonctionne pas dans mon cas.

Questions:

  • Comment dois-je utiliser correctement la méthode du partage?
  • Je n'avais pas utilisé Javascript auparavant alors quand déclarer une variable avec "var" et quand cela ne reste pas un mystère pour moi. Y a-t-il une bonne introduction au Javascript qui peut être utilisé pour les gadgets?
  • Quelle est la meilleure façon de déboguer un gadget?

Merci, Patrick

EDIT: J'ai trouvé comment activer le débogueur JavaScript (voir http://msdn.microsoft.com/en-us/library/bb456467%28v=VS.85%29.aspx#_sidebar_overview_debugging_basic). Une fenêtre de débogage apparaît maintenant et dit "Objet attendu", mais cela ne m'aide pas vraiment.

+0

Je n'ai pas Vista/W7 pour tester maintenant, mais avez-vous essayé '.split (/ /)'? – kennytm

+0

La fenêtre du débogueur indique toujours "Objet attendu". J'ai essayé d'utiliser votre suggestion, mais cela n'aide pas. Merci quand même. – Patrick

+0

Qu'est-ce que 'modifyDate'? Êtes-vous sûr que c'est une chaîne? Je devine que la valeur de 'lmd' est nulle passée dans la fonction. – jtbandes

Répondre

1

C'est l'un des problèmes majeurs avec l'API Windows et Gadgets Google Desktop System.Shell espace de noms. Certaines commandes renvoient des types qui ne sont pas gérés nativement par JScript. Heureusement, ce n'est pas l'un de ces moments mais le problème est similaire. J'arriverai à la réponse, mais d'abord, un peu de remarque latérale.

Vous avez remarqué lors de la vérification typeof lmd dans la fonction, "date" est le résultat. Ce qui est étrange à ce sujet est qu'il n'y a pas de type de date natif JScript/ECMAScript - typeof new Date() entraînera "objet". La raison en est que de nombreuses méthodes System.Shell. * Sont mappées aux méthodes équivalentes .net et que le résultat est simplement renvoyé au JScript sans effort pour convertir les données en un type natif JScript. Une implémentation à très courte vue par Microsoft.

Lors de la sortie à un lmd débogueur vous verrez un résultat de chaîne, quelque chose comme:

Mer 25 novembre 11:06:30 UTC 2009

En effet, une fonction qui s'attend à ce qu'une chaîne convertisse un argument non-chaîne en chaîne. System.Debug.outputString() ne fait pas exception ici.En réalisant cela, la solution devient limpide - forcer la conversion du type « date » à une chaîne:

var lmdFields = String(lmd.split(' ')); 
// or 
var lmdFields = (lmd+"").split(' '); 

//-> ["Wed","Nov","25","11:06:30","UTC","2009"] 

Si vous voulez convertir la date à un JavaScript date objet, vous pouvez juste passer à la Date() constructeur:

var lmdFields = new Date(lmd); 
System.Debug.outputString(lmdFields.toLocaleString()); 
//-> "25 November 2009 11:06:30" 
+1

OUI, c'est tout. Désolé, je peux seulement vous donner +1 et accepter votre réponse (je voulais vraiment vous donner un +100 pour cela). Merci d'avoir répondu. – Patrick

+0

@Patrick: heureux d'aider :-) –

0

Si son une date alors peut-être cela va aider (non testé, mais un guide) ...

function format_lmd(lmd) 
    { 
    month = lmd.getMonth()+1; // returns numeric value 
    monthday = lmd.getDay(); // 0 for Sunday, 1 for Monday, 2 for Tuesday, and so on 
    // not sure what you mean for 'moment'? 
    return monthday+' '+month+' '+moment; 
    } 

Vous pouvez fournir des valeurs de mois et le jour dans un tableau et il suffit de les regarder si vous voulez.

Référence: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date#Methods

+0

J'espérais que cela fonctionnerait, mais cela donne toujours l'erreur "Objet requis" sur la ligne "month = lmd.getMonth() + 1;". Le Javascript de Microsoft pourrait-il être incompatible avec le Javascript de Mozzila? – Patrick

+0

J'en doute. Ce truc standard de JS. Sans être capable de creuser dans l'objet lmd, je suis incertain des prochaines étapes. – donohoe

Questions connexes