Overblog
Suivre ce blog Administration + Créer mon blog

Présentation

  • : Romagny13 - Du .NET,du pur .NET
  • : Cycle de progression Faire (quelque chose qui marche) -> comprendre ce que l’on fait/comment cela marche -> pousser plus loin les notions
  • Contact

Recherche

Articles RÉCents

15 juillet 2007 7 15 /07 /juillet /2007 01:46
CodeFluent - "fabrique logicielle orientée modèle" de Soft Fluent

Documentation,webcasts ,version évaluation 60j

http://www.softfluent.com/codefluent_home_fr.aspx
Partager cet article
Repost0
14 juillet 2007 6 14 /07 /juillet /2007 01:43

Webcasts OpenXml - présentation de projets autour de Open Xml

http://www.microsoft.com/france/vision/WebcastMsdn.aspx?EID=69bfdf27-55f1-4954-9e58-3f15dbdfcada

Partager cet article
Repost0
13 juillet 2007 5 13 /07 /juillet /2007 09:35
Design patterns – 1 Singleton

Singleton.JPG

Full initialization
public class Singleton
    {
        private static readonly Singleton _instance = new Singleton();
 
        private Singleton()
        { }
 
        public static Singleton GetInstance()
        {
            return _instance;
        }
    }
 
Lazy initialization
public class Singleton
    {
        private static Singleton _instance; 
  
        private Singleton()
        { } 
        public static Singleton GetInstance()
        {
            if (_instance  == null)
                _instance  = new Singleton();
            return _instance ;
        }
      }
 
Exemple :
Form1
private void button1_Click(object sender, EventArgs e)
        {
            Singleton.GetInstance().Message = "mon message";
            MessageBox.Show(Singleton.GetInstance().Message);
            Form2 oForm2 = new Form2();
            oForm2.ShowDialog();
        }
 
Form2
 private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show(Singleton.GetInstance().Message);
        }
 
Singleton utilisé
public class Singleton
    {
        private static readonly Singleton _instance = new Singleton();
 
        public string Message;
 
        private Singleton()
        { }
 
        public static Singleton GetInstance()
        {
            return _instance;
        }
    }
 

http://webman.developpez.com/articles/dotnet/patterns/singleton/
Partager cet article
Repost0
10 juillet 2007 2 10 /07 /juillet /2007 23:53
[.NET 2.0] trier et filtrer avec les generics
I – Filtrer
Le filtre consiste à comparer chacun des elements de la liste par rapport à une condition (exemple StarstWith(« A »)),selon que cette condition est est remplie ou non ,true ou false indique en retour si l’objet en cours doit etre ajouté à la liste résultat
1 – avec les méthodes anonymes
 
private void button1_Click(object sender, EventArgs e)
        {
            // 1 avec méthode anonyme
            List<Contact> result = Contacts.FindAll(delegate(Contact oContact)
            {
                return oContact.ContactAge > 20;
            });
            dataGridView1.DataSource = result;
        }
 
2 – avec les Predicates (System.Predicate<T>)
Les Predicate ne sont en fait rien d’autre que des delegues generics, qui attendent une méthode devant respectant la signature attendue , c'est-à-dire retournant un bool et recevant en paramètre un objet du typeT defini explicitement
private void button1_Click(object sender, EventArgs e)
        {
            // 2 avec un Predicate (qui est un delegue)
            // Predicate<T> predicate = new Predicate<T>(bool(T) target)
            Predicate<Contact> predicate = new Predicate<Contact>(FindContacts);
            List<Contact> result = Contacts.FindAll(predicate);
            dataGridView1.DataSource = result;
        }
        public bool FindContacts(Contact oContact)
        {
         return oContact.ContactAge > 20;
        }
 
3 – en passant tout simplement une méthode respectant la signature des predicates
private void button1_Click(object sender, EventArgs e)
        {           
            List<Contact> result = Contacts.FindAll(FindContacts);
            dataGridView1.DataSource = result;
        }
        public bool FindContacts(Contact oContact)
        {
         return oContact.ContactAge > 20;
        }
 
Format de la méthode :
        public bool nommethod(T obj)
        {
         // test
         Return booleen;
        }
 
II Trier
1 – avec les méthodes anonymes
private void button2_Click(object sender, EventArgs e)
        {          
            Contacts.Sort(delegate(Contact x, Contact y)
            {
                return Comparer<string>.Default.Compare(x.ContactName, y.ContactName);
            });
        }
 
2 – avec Comparison<T>
Ici la méthode va servir à comparer deux instances de la liste generic par rapport à un property, le résultat de la comparaison sera soit
0 (equivalents)          -1          1
private void button2_Click(object sender, EventArgs e)
        {
            // Comparison<T> comparison =new Comparison<T>(int (T,T)target);
            Comparison<Contact> comparison = new Comparison<Contact>(SortContacts);
            Contacts.Sort(comparison);
            dataGridView1.DataSource = Contacts;
        }
        public int SortContacts(Contact x, Contact y)
        {
            return Comparer<string>.Default.Compare(x.ContactName, y.ContactName);
        }
 
3 – en passant tout simplement une méthode respectant la signature de comparison<T>
private void button2_Click(object sender, EventArgs e)
        {         
            Contacts.Sort(SortContacts);
            dataGridView1.DataSource = Contacts;
        }
        public int SortContacts(Contact x, Contact y)
        {
            return Comparer<string>.Default.Compare(x.ContactName, y.ContactName);
        }
 
Format de la méthode de tri
La méthode doit retourner un int
Le type K est le type des properties comparés(c’est un type value :int,string,etc.)
        public int nommethod(T x, T y)
        {
            return Comparer<K>.Default.Compare(x.property, y.property);
        }
 
Bien sur finalement et c’est l’objectif on peut combiner le tri et le filtre de manière de plus en plus complexe
Note : Avec Linq To Objects  lorsqu’on effectue un tri (clause Where) le tri est effectué sur la liste retournée en resultat et non sur la liste d’origine
En utilisant les méthodes décrites ici on peut trier aussi une liste autre que la liste d’origine par exemple la liste obtenue après un filtre mais si on utilise un IComparer ou IComparable défni directement dans la classe (ex : dans la classe contact) alors ce sera la liste d’origine qui sera trié, c’est à savoir quand même
Partager cet article
Repost0
10 juillet 2007 2 10 /07 /juillet /2007 21:02
  
public byte[] ConvertImageTobyte(string path)
        {
            byte[] result = null;
            using (FileStream oFileStream = new FileStream(path, FileMode.Open, FileAccess.Read))
            {
                result = new byte[oFileStream.Length];
                oFileStream.Read(result, 0, (int)oFileStream.Length);
            }
 
            return result;
        }
        private Bitmap ConvertbyteToImage(byte[] ImageBuffer)
        {
            Bitmap result = null;
            using (MemoryStream oMemoryStream = new MemoryStream(ImageBuffer, true))
            {
                oMemoryStream.Write(ImageBuffer, 0, ImageBuffer.Length);
                result = new Bitmap(oMemoryStream);
            }
            return result;
        }
 
Partager cet article
Repost0
10 juillet 2007 2 10 /07 /juillet /2007 12:20
Créer des requêtes/vues Access
– 3 méthodes possibles – tour d’horizon
 
Je viens de m’apercevoir qu’il ne faut surtout pas donner le même nom à ses paramètres que celui des colonnes, bon il faut avouer qu’ils sont embettant avec leurs conventions qui changent  d’un SGBD à l’autre, aussi je fais un petit tour horizon des requetes/vues Access
Access permet de créer ses requêtes soit
Ø depuis une vue designer « Design View »
Ø soit depuis une vue « SQL View » le SQL est un peu ici à la « sauce Access » ce qui complique les choses
Ø sachez également qu’Il est tout à fait possible de créer ses requêtes avec du SQL  standard, exemple par l’intermédiaire d’ ADO.NET  depuis une application que vous vous feriez par vous-même vous pouvez très bien créer des requêtes/vues Access
vous pouvez utiliser une application que j’ai créée qui permet d’attaquer une base Access avec le SQL de la même manière qu’un SQL Server management studio
 c’est ce type de requete que je montrerai en premier
 
pour les exemples j’utilise une table plus que basique pour bien comprendre
nom de la table : Contact
champs : ID clé primaire auto int incrémentée
                ContactName texte not null
               ContactAge number null
 
access.jpg
I - requetes de mise à jour

1 - INSERT

en SQL standard
CREATE PROCEDURE INSERTContact(p1 char(255),p2 int)
AS
INSERT INTO [Contact]([ContactName],[ContactAge])
VALUES(p1,p2);
GO
 
Avec  la SQL  View
PARAMETERS p1 Text ( 255 ), p2 Long;
INSERT INTO Contact ( ContactName, ContactAge )
SELECT p1 AS Expr1, p2 AS Expr2;

Design View
 access1.jpg

2 - UPDATE
en SQL standard
CREATE PROCEDURE UPDATEContact(p1 char(255),p2 int, p3 int)
AS
UPDATE [Contact] SET [ContactName]=p1,[ContactAge]=p2
WHERE [ID]=p3
GO
 
Avec  la SQL  View  
PARAMETERS p1 Text ( 255 ), p2 Long, p3 Long;
UPDATE Contact SET Contact.ContactName = p1, Contact.ContactAge = p2
WHERE (((Contact.[ID])=[p3]));

Design View
access2.jpg 

3 - requete DELETE
en SQL standard
CREATE PROCEDURE DELETEContact(p1 int)
AS
DELETE FROM [Contact]
WHERE [ID]=p1
GO
 
Avec  la SQL  View
PARAMETERS p1 Long;
DELETE Contact.[ID]
FROM Contact
WHERE (((Contact.[ID])=[p1]));
 
Design View
access3.jpg



II Requetes selection

1 - selection de toutes les lignes
en SQL standard
CREATE PROCEDURE SELECTContacts
AS
SELECT [ID],[ContactName],[ContactAge]
FROM [Contact]
GO
 
Avec  la SQL  View
SELECT Contact.[ID], Contact.[ContactName], Contact.[ContactAge]
FROM Contact;
 
access4.jpg
2 - selection d'une ligne

en SQL standard
CREATE PROCEDURE SELECTContact(p1 int)
AS
SELECT [ID],[ContactName],[ContactAge]
FROM [Contact]
WHERE [ID]=p1
GO
 
Avec  la SQL  View
PARAMETERS p1 Long;
SELECT Contact.[ID], Contact.[ContactName], Contact.[ContactAge]
FROM Contact
WHERE (((Contact.[ID])=[p1]));

Design View
access5.jpg
Partager cet article
Repost0
9 juillet 2007 1 09 /07 /juillet /2007 23:59
Trier + Filtrer ses nœuds Xml
+ utiliser des paramètres  tout cela dans les expressions XPath
I - Tri
1 - Trie sur un XmlElement Texte > XmlDataType.Text
 
XPathDocument oXPathDocument = new XPathDocument(System.IO.Path.Combine(Environment.CurrentDirectory, "Contacts.xml"));
            XPathNavigator oXPathNavigator = oXPathDocument.CreateNavigator();
 
            XPathExpression oXPathExpression = oXPathNavigator.Compile("/Contacts/Contact");
            oXPathExpression.AddSort("FirstName", XmlSortOrder.Descending, XmlCaseOrder.None, "", XmlDataType.Text);
 
            XPathNodeIterator oXPathNodeIterator = oXPathNavigator.Select(oXPathExpression);
            while (oXPathNodeIterator.MoveNext())
            {
                listBox1.Items.Add(oXPathNodeIterator.Current.Value);
            }
 
2 - Trie sur un XmlElement nombre > XmlDataType.Number
XPathDocument oXPathDocument = new XPathDocument(System.IO.Path.Combine(Environment.CurrentDirectory, "Contacts.xml"));
            XPathNavigator oXPathNavigator = oXPathDocument.CreateNavigator();
 
            // XPathExpression
            XPathExpression oXPathExpression = oXPathNavigator.Compile("/Contacts/Contact");
            oXPathExpression.AddSort("Other/Age", XmlSortOrder.Ascending, XmlCaseOrder.None, "", XmlDataType.Number);
 
            XPathNodeIterator oXPathNodeIterator = oXPathNavigator.Select(oXPathExpression);
            while (oXPathNodeIterator.MoveNext())
            {
                listBox1.Items.Add(oXPathNodeIterator.Current.Value);
            }
 
3 - Tri sur Attribut
XPathDocument oXPathDocument = new XPathDocument(System.IO.Path.Combine(Environment.CurrentDirectory, "Contacts.xml"));
            XPathNavigator oXPathNavigator = oXPathDocument.CreateNavigator();
 
            // XPathExpression
            XPathExpression oXPathExpression = oXPathNavigator.Compile("/Contacts/Contact");
            oXPathExpression.AddSort("@ID", XmlSortOrder.Ascending, XmlCaseOrder.None, "", XmlDataType.Number);
 
            XPathNodeIterator oXPathNodeIterator = oXPathNavigator.Select(oXPathExpression);
            while (oXPathNodeIterator.MoveNext())
            {
                listBox1.Items.Add(oXPathNodeIterator.Current.Value);
            }
 
 
Note :
L’expression de tri est soit
> une valeur string (en fait expression XPath donnant le chemin vers élément ou attribut servant de champ de tri) exemple :
-          "@ID"
-          "FirstName"
-          "Other/Age"
Ø Soit une XPathExpression
oXPathExpression.AddSort("@ID", XmlSortOrder.Ascending, XmlCaseOrder.None, "", XmlDataType.Number);
 
Ø 2 sens de tri
-          XmlSortOrder.Ascending (plus petit nombre vers le plus grand,ordre alphabétique)
-          XmlSortOrder.Descending
Ø Respect de la casse des caractères
Ø La prise en charge de la langue
Ø 2 types de valeurs XmlDataType.Text et XmlDataType.Number
 
II Des paramètres dans ses expressions XPath
Pendant que j’y suis , on peut utiliser des paramètres dans ses expressions XPath un peu comme ce que l’on fait avec les bases de données … l’avantage ? entre autres cela permet d’inserer des caractères tels ‘ dans ces expressions XPath
Voila un bon lien pour mieux comprendre 
il présente 3 méthodes :
- la classique avec string.Format
- une utilisant les variables Xslt
- une utilisant Mvp.xml (projet disponible  sur CodePlex) > http://www.codeplex.com/MVPXML
Un merci aussi à Bidou de CodeS-SourceS grace à qui j’ai su comment trier « dans les règles » une collection de nœuds Xml
Donc la conclusion est simple :
On peut à la fois filtrer les noeuds grace aux expressions XPath (avec utilisation même de paramètres)
mais également trier
(et même ajouter/supprimer bien sur  des nœuds au cours de l’iteration de XPathNodeIterator)
Ce qui donnerait pour exemple (filtre et tri + variables)
public System.Collections.IEnumerable GetContacts(string FirstName)
        {
            XPathExpression oXPathExpression = System.Xml.XPath.XPathExpression.Compile("/Contacts/Contact[starts-with(FirstName, $firstname)]");
        
            CustomContext oCustomContext = new CustomContext();
            oCustomContext.AddVariable("firstname", FirstName);
 
            oXPathExpression.SetContext(oCustomContext);
            oXPathExpression.AddSort("FirstName", XmlSortOrder.Ascending, XmlCaseOrder.None, "", XmlDataType.Text);
 
            // iteration (les noeuds sont donc ici deja filtres et triés)
            System.Xml.XPath.XPathNavigator oXPathNavigator = oXPathDocument.CreateNavigator();
            System.Xml.XPath.XPathNodeIterator oXPathNodeIterator = oXPathNavigator.Select(oXPathExpression);
 
            while (oXPathNodeIterator.MoveNext())
            {
                yield return oXPathNodeIterator.Current.Value;
            }
        }
 
Le fichier Xml utilisé pour les exemples
<?xml version="1.0" encoding="utf-8" ?>
<Contacts>
 <Contact ID="1">
    <FirstName>eric</FirstName>
    <LastName>Dupond</LastName>
    <Gender>H</Gender>
    <Other>
      <Age>32</Age>
    </Other>
 </Contact>
 <Contact ID="58">
    <FirstName>Jeanne</FirstName>
    <LastName>Dupond</LastName>
    <Gender>F</Gender>
    <Other>
      <Age>20</Age>
    </Other>
 </Contact>
 <Contact ID="30">
    <FirstName>henri</FirstName>
    <LastName>Dumond</LastName>
    <Gender>H</Gender>
    <Other>
      <Age>15</Age>
    </Other>
 </Contact>
 <Contact ID="45">
    <FirstName>Paul</FirstName>
    <LastName>Durand</LastName>
    <Gender>F</Gender>
    <Other>
      <Age>28</Age>
    </Other>
 </Contact>
 <Contact ID="5">
    <FirstName>Luc</FirstName>
    <LastName>D'urand</LastName>
    <Gender>H</Gender>
   <Other>
     <Age>19</Age>
   </Other>
 </Contact>
</Contacts>
 
Et finalement Linq ne devient pas forcement necessaire, surtout que je me rends compte que Linq n’est pas dans tous les cas une avancée, mais la souplesse qu’il apporte dans la sélection des données est quand même très intéressante
 
Partager cet article
Repost0
9 juillet 2007 1 09 /07 /juillet /2007 09:27
Créer un raccourci sur le bureau
 
Ajouter un référence à IWshRuntimeLibrary (située C:WINDOWSsystem32wshom.ocx)
private void CreateShortCut(string fileName)
        {
            string Desktop = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
            WshShell oWshShell = new WshShell();
            IWshShortcut oIWshShortcut = (IWshShortcut)oWshShell.CreateShortcut(Path.Combine(Desktop, Path.GetFileNameWithoutExtension(fileName) + ".lnk"));
            oIWshShortcut.TargetPath = fileName; 
            oIWshShortcut.Save();
        }
 
Utilisation :
CreateShortCut(« C:/Documents and Settings/romagny/Mes documents/monapplication.exe »);
Partager cet article
Repost0
7 juillet 2007 6 07 /07 /juillet /2007 20:09
Une classe de tri generic
 
public class GenericComparer<T> : IComparer<T>
    {
        private string propertyName;
        private SorterMode sorterMode;
 
        public GenericComparer(string propertyName, SorterMode direction)
            : base()
        {
            this.propertyName = propertyName;
            sorterMode = direction;
        }
 
        #region IComparer<T> Members
 
        public int Compare(T x, T y)
        {
            if (x == null)
            {
                if (y != null)
                    return -1;
                return 0;
            }
            if (y == null)
                return 1;
            if ((x is T) && (y is T))
            {
                IComparable value1 = x.GetType().GetProperty(propertyName).GetValue(x, null) as IComparable;
                IComparable value2 = y.GetType().GetProperty(propertyName).GetValue(y, null) as IComparable;
 
                if (sorterMode == SorterMode.Ascending)
                    return value1.CompareTo(value2);
                else
                    return value2.CompareTo(value1);
 
            }
            return 0;
        }
 
        #endregion
    }
 
    public enum SorterMode
    {
        Ascending,
        Descending
    }
 
Utilisation
           List<Contact> Contacts = new List<Contact>();
            Contacts.Add(new Contact(1, "Romagny"));
            Contacts.Add(new Contact(2, "Bellin"));
            Contacts.Add(new Contact(3, "Mariz"));
            Contacts.Add(new Contact(4, "Benon"));
            Contacts.Add(new Contact(5, "Felin"));
 
           GenericComparer<Contact> GenericComparer = new GenericComparer<Contact>("ContactName", SorterMode.Ascending);
            Contacts.Sort(GenericComparer);
 
            dataGridView1.DataSource = Contacts;
 
Partager cet article
Repost0
29 juin 2007 5 29 /06 /juin /2007 10:11
XSD Code Generator 1.4.2.1 

un utilitaire qui permet de générér les classes (en vb ou c#) correspondantes à un schéma Xml
> après avoir installer l'utilitaire il suffit d'utiliser l'add in depuis le menu Outils de Visual Studio

http://www.microsoft.com/downloads/details.aspx?FamilyID=89e6b1e5-f66c-4a4d-933b-46222bb01eb0&DisplayLang=en
Partager cet article
Repost0