mercredi 26 août 2009

Comment garder l’ancienne version de Live ou MSN Messenger ?

J’adore ce que fait Microsoft en général mais là je trouve qu’il y a de l’abus et ce n’est pas la première fois concernant MSN Messenger. Je craque.

La nouvelle version de MSN Messenger, nommé Live Messenger nous force à installer plein de chose sur sont poste sans qu’on les ai demandées. Ex : Je lance l’installation de Live Messenger, le setup est tout petit mais ce n’est qu’un prélude à tous les outils Live Microsoft … On décoche tous les produits en ne gardant que Live Messenger et là 70 meg à installer, il pèse lourd le bébé, on est loin des 15meg d’il y a 1 ou 2 ans. Ils travaillent fort les gars de Microsoft.

Ok, Ok, d’ac, je lance l’installation, et je regarde la barre d’avancement, et là, je vois quoi RepportError qui s’installe, j’ai jamais demandé ça moi. GGRRrrrrrr……

Ou dans le style, vous avez l’ancienne version de Live Messenger ou MSN Messenger qui répond complètement à vos besoins, vous lancez l’appli et là un super message vous dit qu’il existe une nouvelle version, vous répondez non, pas de message et pas de connexion, on recommence, et bah! zut! même chose plus possible de se connecter, cela ne marche plus, on refais qqes essai, même chose. Ils font quoi chez Bilou,  GGRRrrrrrr……

Là, sérieux, j’aime vraiment pas ces manière de faire. Par contre c'est une bonne manière pour perdre de la clientèle. Je serais eux, je ne pousserais pas trop loin le bouchon.

Ok, on se calme. Donc comment faire pour garder son ancienne version de Live ou MSN Messenger, voici la procédure :

  • Fermer votre Live ou MSN Messenger.
  • Aller dans le répertoire C:\Program Files\MSN Messenger.
  • Retrouver le fichier msnmsgr.exe.
  • Demander les Propriétés et allez dans l’onglet Compatibilité.
  • Changer le mode de compatibilité pour Windows 2000 et cliquer OK.
  • Redémarrer Live ou MSN Messenger, le programme de réparation de l’application peut démarrer, laisser le faire.
  • Redémarrer Live ou MSN Messenger une dernière fois, ca y est tout est ok maintenant.

Ça fait du bien de s’exprimer des fois :)

MAJ : 2009/09/16 Il semblerait que Microsoft force les gens à passer sous la dernière version de MSN Messenger, en bloquant définitivement avec le même message, l’utilisation des anciennes version. Encore là, l’astuce est de prendre le mode de compatibilité Windows 2000 et de fermer puis relancer votre MSN Messenger. C’est le seul qui reste opérationnel, malheureusement.

vendredi 14 août 2009

L’instruction yield pour récupérer la sélection d’éléments d’une liste

L'idée n'est pas de faire un cours sur l'instruction yield, pour cela voir les liens suivants :

http://msdn.microsoft.com/fr-fr/library/9k7k7cf0.aspx

http://romainverdier.developpez.com/articles/dotnet/le-mot-cle-yield-et-les-iterateurs-en-csharp/

Mais de donner un petit plus quand on code avec des listes et très souvent on refait la même chose à savoir récupérer la sélection d'une liste pour lui appliquer un traitement particulier.

Donc le but du jeu est ; Comment peut-on faire pour éviter la duplication des Foreach ou While ou autre afin de récupérer une sélection d’éléments ?
Pour être le plus souple possible, je propose d’utiliser une méthode, nommé Cast, qui soit le plus générique possible.

        // Méthode qui permet d'extraire les objets d'une collection.
        // Valable à partir de Framework .NET 2.0
        // On peut mettre cette méthode dans une classe d’aide(Helper)
        // de facon à l'appeler ailleur pour tout objet qui contient
        // une collection IEnumerable (listBox,)
        IEnumerable<T> Cast<T>(IEnumerable items)
        {
            foreach (object item in items)
                yield return (T)item;
        }

Dans l’exemple suivant, j’utilise une class nommé Personne comme type avec deux propriétés, à savoir : Nom et Prenom. L’utilisation d’un objet string ou autre est possible aussi (voir l’exemple dans le code complet).
Voila le code dans sa totalité.

Merci Éric pour tes idées :

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Collections;
using System.Windows.Forms;

namespace Yield_SelectedItems
{
    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();

            List<Personne> personnes = new List<Personne>();
            personnes.Add(new Personne("Hugo", "Victor"));
            personnes.Add(new Personne("Zola", "Emile"));
            personnes.Add(new Personne("Dupont", "Thomas"));
            personnes.Add(new Personne("Dupond", "Daniel"));
            personnes.Add(new Personne("Super Dupond", "Daniel"));

            listBox1.Items.Clear();
            listBox1.Items.AddRange(personnes.ToArray());

        }

        private void button1_Click(object sender, EventArgs e)
        {
            // Récupérer que les objets sélectionnés
            List<Personne> maSelections = new List<Personne>(Cast<Personne>(listBox1.SelectedItems));

            // On créer un objet list de type (chaine de caractère) pour générer
            // avec la méthode Join un saut de ligne facilement, sans avoir à 
            // gérer le premier ou le dernier retour chariot de trop.
            List<string> s = new List<string>();
            foreach (Personne onePersonne in maSelections)
            {
                s.Add(string.Format("{0} {1}", onePersonne.Prenom, onePersonne.Nom));
            }
            String nomPrenom = string.Join("\r", s.ToArray());

            // On affiche le résultat.
            System.Windows.Forms.MessageBox.Show(nomPrenom);


            // Démo avec une list de string
            ListBox mesProduits = new ListBox();
            mesProduits.SelectionMode = SelectionMode.MultiExtended;
            mesProduits.Items.Clear();

            // J'alimente ma listbox
            List<string> listProduits = new List<string>();
            listProduits.Add("Produit A");
            listProduits.Add("Produit B");
            listProduits.Add("Produit C");
            listProduits.Add("Produit D");
            listProduits.Add("Produit E");
            mesProduits.Items.Clear();
            mesProduits.Items.AddRange(listProduits.ToArray());

            // Je sinule une sélection
            mesProduits.SelectedItems.Add(listProduits[0]);
            mesProduits.SelectedItems.Add(listProduits[3]);

            // On récupère les produits sélectionnés
            List<string> monChoix = new List<string>(Cast<string>(mesProduits.SelectedItems));

            // On les affiches.
            System.Windows.Forms.MessageBox.Show(string.Join("\r", monChoix.ToArray()));


            // Lol, plus simple. Comme quoi des fois...
            Personne[] essai2 = new Personne[listBox1.SelectedItems.Count * 2]; // Je double la taille pour tester le mode Append
            listBox1.SelectedItems.CopyTo(essai2, 0);
            listBox1.SelectedItems.CopyTo(essai2, 3); // Append mode
            List<string> s2 = new List<string>();
            foreach (Personne onePersonne in essai2)
            {
                s2.Add(string.Format("{0} {1}", onePersonne.Prenom, onePersonne.Nom));
            }
            // On les affiches.
            System.Windows.Forms.MessageBox.Show(string.Join("\r", s2.ToArray()));


            // Lol, plus simple. Comme quoi des fois...
            string[] essai3 = new string[mesProduits.SelectedItems.Count];
            mesProduits.SelectedItems.CopyTo(essai3, 0);
            List<string> soluce3 = new List<string>(essai3);
            // On les affiches.
            System.Windows.Forms.MessageBox.Show(string.Join("\r", soluce3.ToArray()));

        }


        // Méthode qui permet d'extraire les objets d'une collection.
        // Valable à partir de Framework .NET 2.0
        // On peut mettre cette méthode dans une classe d’aide(Helper)
        // de facon à l'appeler ailleur pour tout objet qui contient
        // une collection IEnumerable (listBox,)
        IEnumerable<T> Cast<T>(IEnumerable items)
        {
            foreach (object item in items)
                yield return (T)item;
        }

    }


    class Personne
    {
        private string _nom;
        private string _prenom;

        public Personne()
        {
        }

        public Personne(string nom, string prenom)
        {
            Nom = nom;
            Prenom = prenom;
        }

        public string Nom
        {
            get { return _nom; }
            set { _nom = value; }
        }

        public string Prenom
        {
            get { return _prenom; }
            set { _prenom = value; }
        }

        // l'override de la méthode string est utilisé pour populer le listbox.
        public override string ToString()
        {
            return string.Format("{0} {1}", Nom, Prenom);
        }
    }

}

Membres