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

Windows Forms Discussion :

[C#] Création d'un objet dateTime


Sujet :

Windows Forms

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Par défaut [C#] Création d'un objet dateTime
    Bonjour,
    Je butte sur un problème et aimerais avoir une orientation.

    J'ai plusieurs éléments:
    1. Combobox qui contient les jours de la semaine
    2. Deux numeric up down button qui permette de sélectiionner un temps (heure et minute)

    A partir de là, je récupère ces données pour les mettre dans un treeview. ça ça marche.

    Mais je voudrais aussi alimenter un fichier xml qui contiendra un string formaté que je récupérerai pour le formater en objet dateTime, c'est là que je coince.
    Pour plusieurs raisons:

    - les numeric up down button peuvent aller respectivement de 0 à 23 et 0 à 59. La valeur récupérées est donc sur 1 ou 2 digits ? COmment faire pour la metrte quoiqu'il arrive sur deux digits (je bloque avec string.format())

    - Si j'arrive à règler le problème ci-dessous et que j'obtiens un string du type
    " Monday at 02:45 ", est il possible de le formaté ensuite en objet datetime ?
    Si oui !! C# est génial !!!!!!!

    Si ce que je veux faire paraît idiot, auriez vous une autre orientation à me donner ?
    Merci grandement pour vos avis éclairés !!!!!!!!

  2. #2
    Membre émérite
    Avatar de shwin
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    568
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2003
    Messages : 568
    Par défaut
    Regarde tu coté de la class Timespan
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TimeSpan t = new TimeSpan(1, System.Convert.ToInt32(numericUpDown1.Value), System.Convert.ToInt32(numericUpDown2.Value));

  3. #3
    Membre confirmé Avatar de meli0207
    Inscrit en
    Novembre 2004
    Messages
    208
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Novembre 2004
    Messages : 208
    Par défaut
    si tu recupere heure et minute dans des int
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int heure;
    int minute;
    pour les avoir sur 2 digits tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    string sheure = heure.ToString("d2");
    string sminute = minute.ToString("d2");
    Ensuite, si tu recupere le jour de la semaine en toutes lettres, il te reste plus qu'a concaténer toutes ces chaines

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Par défaut
    Merci beaucoup pour vos réponses !!
    Pour l'affichage, j'obtiens la chaine de caractère suivante, par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Wednesday at 05:35
    C'est ce que l'utilisateur verra. J'ai utilisé ToString("d2").
    Mais pour le programme, Je vais avoir besoin de mémoriser cette date dans un fichier xml qui sera utilisé plus tard par un programme pour déclencher une action.
    Pour que la date soit le plus facilement exploitable par le programme, j'ai pensé à la convertir en minutes.
    Je ferais:

    XMLdate = jour_semaine*60*24 + heure*60 + minute
    C'est cette date que je mettrai dans le fichier.

    D'où mes 2 dernières questions:
    - Existe t'il (dans la classe timespan), la possibilité de convertir un jour(lundi à dimanche) + heure + minutes en minutes !!
    - La solution que j'envisage est elle farfelue ? y a plus simple ?


    Voilà ! Merci pour votre aide !!!

  5. #5
    Membre Expert Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Par défaut
    Existe t'il (dans la classe timespan), la possibilité de convertir un jour(lundi à dimanche) + heure + minutes en minutes !!
    Sur l'objet TimeSpan, tu as la propriété TotalMinutes

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Par défaut
    Salut Guitoux,

    J'utilise timespan ainsi donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
                TimeSpan ts = new TimeSpan(CBB.SelectedIndex, this.MyHour, this.MyMinute,0,0);
                MessageBox.Show(ts.TotalMinutes.ToString());
    ce qui revient à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    this.XML_RUN_DATE = (CBB.SelectedIndex * 60 * 24 + this.MyHour * 60 + this.MyMinute).ToString();

    Mais qui est plus joli !! enfin je crois.

    Je voudrais comparer cette somme de minutes de la semaine à la somme de minutes du temps actuel.
    J'utilise donc dateTime.now ...

    Mais je n'arrive pas à récupérer le nombre de jour de la semaine, j'arrive seulement à récupéré le jour (en texte) de la semaine:
    DateTime dt = DateTime.Now;
    messageBox.show(dt.DayOfWeek)
    Comment faire pour récupéré un nombre entre 0 et 6 (c marrant ça, de récupérer plus facilement le nom du jour que le numéro !!!)

  7. #7
    Membre Expert Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int numDay = (int)dt.DayOfWeek;
    DayOfWeek étant un type enum

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Par défaut
    Super !!
    Tout ça fonctionne maintenant !!

    Merci beaucoup !

  9. #9
    Membre émérite
    Avatar de shwin
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    568
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2003
    Messages : 568
    Par défaut
    Salut LeNeindre, tu peux donner ta solution finale ? Comme ca si qqn à le même prob que toi ... il va pouvoir avoir la solution finale

    Bonne continuation!!

    P.S. Tu as lacher le perl pour le c# à ce que je peux voir ?

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Par défaut
    Citation Envoyé par shwin
    Salut LeNeindre, tu peux donner ta solution finale ? Comme ca si qqn à le même prob que toi ... il va pouvoir avoir la solution finale

    Bonne continuation!!

    P.S. Tu as lacher le perl pour le c# à ce que je peux voir ?

    Bonjour swhin !!
    Oui, il est vrai que j'ai passé du temps chez vos amis du forum Perl (GLDavid, Djibril, 2Eurocents, Jedaï etc ...) et je me permets de vous le recommander !!

    Le code ci-dessous utilise les "objets" datetime et timestamp afin de calculer une différence de temps (en minutes) qui permettra de trouver à un automate la prochaine tâche à lancer.
    Les tâches sont placées dans un fichier xml, sous cette forme:

    <?xml version="1.0" encoding="utf-8"?>
    <Week>
    <Monday>
    <RUN>
    <TEXT>20:00-&gt; test1</TEXT>
    <NAME>1200</NAME>
    </RUN>
    <RUN>
    <TEXT>20:21-&gt; test2</TEXT>
    <NAME>1221</NAME>
    </RUN>
    </Monday>
    <Tuesday>
    </Tuesday>
    <Wednesday>
    <RUN>
    <TEXT>15:30-&gt; test5</TEXT>
    <NAME>3810</NAME>
    </RUN>
    <RUN>
    <TEXT>16:40-&gt; test6</TEXT>
    <NAME>3880</NAME>
    </RUN>
    <RUN>
    <TEXT>16:44-&gt; test7</TEXT>
    <NAME>3884</NAME>
    </RUN>
    </Wednesday>
    <Thursday>
    </Thursday>
    <Friday>
    </Friday>
    <Saturday>
    </Saturday>
    <Sunday>
    </Sunday>
    </Week>

    Au démarrage de mon application, j'appelle par l'intermédiaire d'un composant BackGroundWorker, le code suivant:

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
     
            private void EventSearcher(object sender, DoWorkEventArgs e)
            {
                //Récupération des données du fichier specific_runs.xml;
                XmlDocument xml_spec_run=new XmlDocument();
                StreamReader str = File.OpenText(new PathFile().file_specific_runs);
                xml_spec_run.Load(str);
                str.Close();
     
                //Tant qu'on reçoit pas de signal pour arrêt de la tâche de fond
                //On recherche les prochains évènements.
                while (!BGW_EventSearcher.CancellationPending) 
                {
                    //On récupère la date d'aujourd'hui puis les RUNS du jour en cours
                    DateTime now = DateTime.Now;
                    XmlNodeList DayNode = xml_spec_run.SelectNodes("/Week/" + now.DayOfWeek + "/RUN");
     
                    //On définit dans Now_in_minute le nombre de minutes écoulées de puis lundi 00:00
                    TimeSpan ts = new TimeSpan((int)now.DayOfWeek - 1, now.Hour, now.Minute, 0, 0);
                    int Now_in_minute = Convert.ToInt16(ts.TotalMinutes);
     
                    //On définit les tableaux qui contiennent le text et la date des RUNS 
                    string[] RUNS_Text = new string[DayNode.Count];
                    string[] RUNS_Name = new string[DayNode.Count];
     
                    //On fixe le minimum a 10081 (qui ne sera jamais atteint puisque 7*24*60 < 10081)
                    int min = 10081;
                    //NextRun contiendra les données du prochain RUN à éxécuter
                    string NextRun = "";
                    //difference permet de connaitre le prochain run
                    //C'est la différence entre le temps en minutes du run de la semaine et le tps en minutes d'ajourd'hui
                    //La plus petite différence donne le prochain run
                    int difference;
     
                    //Calcul de la plus petite différence
                    for (int i = 0; i < DayNode.Count; i++)
                    {
                        RUNS_Text[i] = DayNode[i].ChildNodes[0].InnerText;
                        RUNS_Name[i] = DayNode[i].ChildNodes[1].InnerText;
                        difference = Convert.ToInt16(RUNS_Name[i]) - Now_in_minute;
                        if (difference > 0 && difference < min)
                        {
                            min = difference;
                            NextRun = RUNS_Text[i];
                        }
                    }
                    // Si min ! 10081, on a trouvé un RUN que l'on affiche dans la fenêtre
                    if (min != 10081)
                    {
                        Regex r = new Regex("->");
                        string[] NextRunLabel = r.Split(NextRun);
                        this.L_NEXT_RUN_DATE.Text = NextRunLabel[0];
                        this.L_NEXT_RUN_NAME.Text = NextRunLabel[1];
                    }
                    else
                    {
                        this.L_NEXT_RUN_DATE.Text = "--:--";
                        this.L_NEXT_RUN_NAME.Text = "-----";
                    }
     
                    //Le thread s'endort 10 secondes avant de recommencé la boucle
                    Thread.Sleep(10000);
                }
            }

    Concernant le calcul des dates, ça marche bien grâce à vos explications ! Meric donc.
    En revanche je croyais que lancer backgroundworker lançait un thread qui pouvait accéder aux composants (label par exemple) de mon thread principal !! Mais visiblement, je me suis fourvoyé, et j'ai du rajouté la très mauvaise ligne de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    CheckForIllegalCrossThreadCalls = false;


    Donc si quelqu'un a une explication à cela, je suis preneur, j'utilise peut-être mal ce composant. J'aimerai ne pas avoir à passer par les delegate, que je ne connais pas ... Il serait peut-être préférable d'ouvrir un autre post pour ce nouveau problème ??

  11. #11
    Membre Expert Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Par défaut
    le backgroundworker possède des evenement permettant d'accéder aux controls de ta page. Il faut pour cela mettre true sur sa propriété WorkerReportsProgress et consommer l'événement ProgressChanged.
    C'est dans cet event que tu pourra accéder à tes controls

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Par défaut
    Citation Envoyé par guitoux1
    le backgroundworker possède des evenement permettant d'accéder aux controls de ta page. Il faut pour cela mettre true sur sa propriété WorkerReportsProgress et consommer l'événement ProgressChanged.
    C'est dans cet event que tu pourra accéder à tes controls

    Guitoux, j'ai suivi tes conseils et fais ceci.




    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
     
    ...
    ...
     
                this.BGW_EventSearcher.DoWork += new System.ComponentModel.DoWorkEventHandler(this.EventSearcher);
                this.BGW_EventSearcher.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.On_BGW_EventSearcher_Progress);
     
    ...
    ...
    BGW_EventSearcher.WorkerReportsProgress = true;
    BGW_EventSearcher.RunWorkerAsync();
    ...
    ...
            private void EventSearcher(object sender, DoWorkEventArgs e)
            {
    ...
    ...
    ...
                    string[] Labels = new string[4];
                    Labels[0] = now.DayOfWeek.ToString().Substring(0, 3) + "," + now.Month.ToString("d2") + "," + now.Day + "," + now.Year;
                    Labels[1] = now.Hour.ToString("d2") + ":" + now.Minute.ToString("d2");
                    Labels[2] = NextRunLabel[0];
                    Labels[3] = NextRunLabel[1];
                    BGW_EventSearcher.ReportProgress(1,Labels);
           }
     
            // Récupération des nouvelles valeurs pour les labels et affichage dan sla mainform.
            private void On_BGW_EventSearcher_Progress(object sender, ProgressChangedEventArgs e)
            {
                string[] BGW_Result = (string[])e.UserState;
                this.L_TODAY_DAY.Text = BGW_Result[0];
                this.L_TODAY_TIME.Text = BGW_Result[1];
                this.L_NEXT_RUN_DATE.Text = BGW_Result[2];
                this.L_NEXT_RUN_NAME.Text = BGW_Result[3];
            }
    Ceci fonctionne !! Merci

    Pourrais-je vous demander deux derniers conseils sur les BackGroundWorkers:
    1. Est-ce que la façon dont je l'ai écrite dans un post au dessus, convient, j'ai cru voir qu'il ne fallait l'utiliser comme ceci. si non, pq ?

    2. Est-ce que le BackGroundWorker est un composant lourd. Je voudrais en lancer plusieurs.


    PS: A tout hasard, on fait comment pour recopier une partie de ce thread dans un autre message. car il y a là un sujet sur les datetime et un sujet sur les BackGroundWorker.


    Bonne journée !!

  13. #13
    Membre Expert Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Par défaut
    1. Est-ce que la façon dont je l'ai écrite dans un post au dessus, convient, j'ai cru voir qu'il ne fallait l'utiliser comme ceci. si non, pq ?
    Ben préfère la seconde solution, c + propre. Le BackgroundWorker est la pour te facilité la gestion des threads pour les taches de fond, autant s'en servir
    2. Est-ce que le BackGroundWorker est un composant lourd. Je voudrais en lancer plusieurs.
    Tout dépend de combien tu veux en lancer Chaque BW lance un nouveau thread, donc forcement, ça coute un peu. Si t'en lance 1000, là c sur, ton PC va tirer la gueule je penses

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Par défaut
    Citation Envoyé par guitoux1
    Ben préfère la seconde solution, c + propre. Le BackgroundWorker est la pour te facilité la gestion des threads pour les taches de fond, autant s'en servir

    En fait je parlais de la façon d'utiliser le backGroundWorker
    J'ai lu dans msdn, ceci:

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
    // Do not access the form's BackgroundWorker reference directly.
    // Instead, use the reference provided by the sender parameter.
    BackgroundWorker bw = sender as BackgroundWorker;

    // Extract the argument.
    int arg = (int)e.Argument;

    // Start the time-consuming operation.
    e.Result = TimeConsumingOperation(bw, arg);

    // If the operation was canceled by the user,
    // set the DoWorkEventArgs.Cancel property to true.
    if (bw.CancellationPending)
    {
    e.Cancel = true;
    }
    }


    Je n'ai pas l'impression que c'est ce que je fais ...
    Que veut dire :

    // Do not access the form's BackgroundWorker reference directly.
    // Instead, use the reference provided by the sender parameter.


  15. #15
    Membre Expert Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Par défaut
    Je penses que c'est pour être sur que ça fonctionne (car la référence du BW est sur la form, or on peut pas accéder aux éléments de la form depuis le BW, car pas la même thread)

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Par défaut
    Ok, donc si j'ai bien compris, j'ai juste à rajouter cette ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    BackgroundWorker bw = sender as BackgroundWorker;
    Et ensuite quand je fais appel à une propriété ou méthode de Mon composant, j'utiliser bw au lieu de BackGroundWorker_1

  17. #17
    Membre Expert Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Par défaut
    da

  18. #18
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Par défaut
    spassiba

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Création dynamique d'objets ?
    Par Arthur A. dans le forum C++
    Réponses: 6
    Dernier message: 15/06/2005, 23h55
  2. [Open Inventor] Création d'un objet FILE
    Par seiryujay dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 16/03/2005, 18h29
  3. création dynamique d'objet, projet win32
    Par noinneh dans le forum MFC
    Réponses: 5
    Dernier message: 03/02/2005, 16h07
  4. [Reflexivite]création dynamique d'objet et Héritage
    Par norkius dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 26/10/2004, 11h37
  5. Création d'un objet d'un form a l'autre
    Par Argonz dans le forum C++Builder
    Réponses: 12
    Dernier message: 03/03/2004, 10h23

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