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

Symfony PHP Discussion :

Le Composant « Process » [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 44
    Par défaut Le Composant « Process »
    Bonjour,

    Je recherche un moyen d'exécuter une commande en arrière plan.

    Je veux pouvoir avec un lien, démarrer une comparaison entre le contenu d'un dossier de photos et les photos déjà enregistrée en BDD. Puis récupérer les infos des nouvelles photos ou de celle qui auraient été modifiée pour mettre à jour la BDD.

    Ceci peut prendre du temps, et je souhaite que celà se fasse en arrière plan sur le serveur afin que je puisse continuer de naviguer sur le site ou même fermer ma fenêtre de navigation.

    J'ai commencé par utiliser un exec() avec une sortie sur un fichier txt mais je me heurte vite à un soucis: la page php que j’exécute dans ma commande est indépendante de symfony, et il me faudrait revenir à un codage classique pour me connecter à ma base de données... Je crois pas être sur la bonne piste...

    En fouinant, je croise le composant "Process" puis "PhpProcess"... Ils semble pouvoir m'aider à faire ce que je veux, mais je trouve pas suffisamment de documentation à ce sujet et je comprend pas bien comment l'utiliser...

    Un peu de code provenant de http://symfony.com/fr/doc/2.3/components/process.html modifié pour mon objectif

    Dans mon controller:

    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
    use Symfony\Component\Process\Process;
     
    public function admin_majAction()
        {
        $chemin=dirname($_SERVER['SCRIPT_FILENAME']).'/img/galerie/script/';
        $process = new Process('php'.$chemin.'maj.php');
        $process->run(function ($type, $buffer) {
            if ('err' === $type) {
                echo 'ERR > '.$buffer;
            } else {
                echo 'OUT > '.$buffer;
            }
        });
        $this->get('session')->getFlashBag()->add('maj', ' => Mise à jour en cours... ');
        return $this->redirect($this->generateUrl('gg_site_admin') );
    }
    Ce que je comprends (ou crois comprendre, vous me corrigerez ) de ce code, c'est que je démarre mon script maj.php grâce à la méthode run. Ce que je saisi pas, c'est cette fonction avec $type et $buffer. C'est elle qui doit pouvoir me permettre d'avoir des retours? Mais où est ce que je peux les récupérer? $type et $buffer, c'est quoi? où et comment dois je les déclarer?

    Dans la doc, ils disent: "Si vous voulez exécuter du code PHP de manière isolée, utilisez plutôt le PhpProcess à la place:"

    Dans ce cas, j'utiliserais plutôt:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    use Symfony\Component\Process\PhpProcess;
     
    public function admin_majAction()
        {
        $chemin=dirname($_SERVER['SCRIPT_FILENAME']).'/img/galerie/script/';
        $process = new PhpProcess(<?php include('$chemin.'maj.php'); ?>);
        $process->run();
    Je suis un peu beaucoup passionnément largué! :/

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 168
    Par défaut
    Essayes avec ce bout de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    use Symfony\Component\Process\Process;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
                    $process = new Process('ping -c15 127.0.0.1');
                    $t = array();
                    $process->run(function ($type, $buffer) {
                        if ('err' === $type) {
                            echo 'ERR > '.$buffer;
                        } else {
                           echo 'OUT > '.$buffer;
                        }
                    });
    Normalement t'as pas besoin de définir les variables.

    t'as pas oublié un espace après php ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        $process = new Process('php '.$chemin.'maj.php');

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 44
    Par défaut
    Salut Goabonga,

    Merci pour ton aide!
    En effet, il manquait un espace!

    je vais regarder ton code, mais d'entrée, je me demande ce qu'il va changer? et c quoi le tableau $t?

  4. #4
    Membre émérite
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Par défaut
    Bonjour,

    Ce lien pourrait t'intéresser
    http://techportal.inviqa.com/2013/11...2-application/

    Pour reprendre sur ta solution initiale:
    $process = new Process('php'.$chemin.'maj.php');
    $process->run(function ($type, $buffer) {
    if ('err' === $type) {
    echo 'ERR > '.$buffer;
    } else {
    echo 'OUT > '.$buffer;
    }
    });
    Tel qu'il est ton code ne vas pas lancer le process en arrière plan, le controlleur va faire des echo de ta commande puis reprendre là oû il en était dans le controlleur (pendant ce temps l'utilisateur attend que sa page se charge), il faut plutôt faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $cmd='php'.$chemin.'maj.php';
    $process = new Process($cmd);
    $process->start();
    return new Response('le process est lancée');
    D'autre part, ton process aura sans doute besoin de paramétre et service défini dans symfony.
    Plutot que de coder ces traitements dans ton fichier 'maj.php', crée plutôt une commande personalisée:
    http://symfony.com/fr/doc/current/co...e_command.html

    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
     
    namespace My/Bundle/Command;
     
    use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
     
    Class MyCommand extends ContainerAwareCommand{
     
        protected function configure()
        {
            $this
                ->setName('my:command')
                ->setDescription('comparer des répertoires de photo');
        }
     
        protected function execute(InputInterface $input, OutputInterface $output)
        {
            $logger=$this->getContainer()->get('logger');
            $logger->info('début de l execution de  la commande');
            //mon traitement trés long...
            sleep(10);
            $logger->info('fin de l execution de  la commande');
        }
    }
    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
    namespace My/Bundle/Controller;
     
    class MyController{
     
       public function comparaisonAction(){
     
               $logger=$this->get('logger');
               $logger->info('lancement du process depuis le controller');
               $cmd='app/console my:command';//la commande créé ci-dessous
               $process=new Process($cmd);
               $process->start();
               $logger->info('le process a été lancée depuis le controller');
               return new Response('process en cours');
       }
     
    }
    Le service logger va écrire les logs dans app/logs/dev.log,
    consultes ce fichier pour voir la chronologie de l'execution du programme.

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 44
    Par défaut
    Super! Merci Arnooo pour cette piste prometteuse!

    Mais je n'arrive pas a voir s'il se passe quelque chose. Au niveau de ma commande, je n'ai aucun retour dans les logs! :/

    Seul ceux de mon controller apparaissent.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [2013-12-07 20:08:26] app.INFO: lancement du process depuis le controller [] []
    [2013-12-07 20:08:26] app.INFO: le process a été lancée depuis le controller [] []
    Mon contrôleur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public function admin_majAction()
        {
            //...
     
            $logger=$this->get('logger');
            $logger->info('lancement du process depuis le controller');
            $cmd='app/console photo:maj';//la commande créé ci-dessous
            $process=new Process($cmd);
            $process->start();
            $logger->info('le process a été lancée depuis le controller');
            //return new Response('process en cours');
            $this->get('session')->getFlashBag()->add('maj', ' => Mise à jour en cours... ');
            return $this->redirect($this->generateUrl('gg_site_admin') );
        }
    Et ma command:
    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
    <?php
     
    namespace Gg\SiteBundle\Command;
     
    use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
    use Symfony\Component\Console\Input\InputArgument;
    use Symfony\Component\Console\Input\InputInterface;
    use Symfony\Component\Console\Input\InputOption;
    use Symfony\Component\Console\Output\OutputInterface;
     
     
    Class MajCommand extends ContainerAwareCommand{
     
     
        protected function configure()
        {
            $this
                ->setName('photo:maj')
                ->setDescription('Mise à jour de la base de données de photos');
        }
     
        protected function execute(InputInterface $input, OutputInterface $output)
        {
            $logger=$this->getContainer()->get('logger');
            $logger->info('début de l execution de  la commande');
            //mon traitement trés long...
            sleep(10);
            $logger->info('fin de l execution de  la commande');
        }
    }

  6. #6
    Membre émérite
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Par défaut
    la commande en elle-même fonctionne t'elle en lançant manuellement app/console photo:maj (précédé de php si tu es sur windows)?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    protected function execute(InputInterface $input, OutputInterface $output)
        {
            $output->writeln('debut de ma commande');
            $logger=$this->getContainer()->get('logger');
            $logger->info('début de l execution de  la commande');
            //mon traitement trés long...
            sleep(10);
            $logger->info('fin de l execution de  la commande');
            $output->writeln('fin de ma commande');
        }
    Ensuite lance-la depuis le controller avec ton premier code pour mieux voir ce qui se passe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $process->run(function(error,$buffer){
    ...
    });

  7. #7
    Membre averti
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 44
    Par défaut
    Merci Arnooo!

    lol, je venais éditer pour répondre à la question que je découvre!

    Donc, oui, en console, si je lance manuellement app/console photo:maj, j'ai mes infos qui apparaissent dans les logs!

    En lançant depuis le controller:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
            $cmd='app/console photo:maj';//la commande créé ci-dessous
            $process=new Process($cmd);
            //$process->start();
            $process->run(function ($type, $buffer) {
                if ('err' === $type) {
                    echo 'ERR > '.$buffer;
                }
                else {
                    echo 'OUT > '.$buffer;
                }
            });
    j'ai en reponse:
    ERR > sh: 1: app/console: not foundOUT > Could not open input file: app/console

    Oups, la boulette! :/ (jsuis sous linux)
    Je modifie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $cmd='php app/console photo:maj';
    j'ai en reponse:
    OUT > Could not open input file: app/console

    Mais... euh... Grrrr!
    Mon script s'éxécute depuis le répertoire /web/!
    Je modifie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $cmd='php ../app/console photo:maj';
    Weldone! Allélouia!

    Non seulement, ça fonctionne mais en plus, j'ai compris plein de truc!

    J'ai pu avancé dans mon traitement...
    Mais là, nouveau défis....

    Comment je récupère mes service de Doctrine???
    ERR > PHP Fatal error: Call to undefined method Gg\SiteBundle\Command\MajCommand::getDoctrine()

    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    <?php
     
    namespace Gg\SiteBundle\Command;
     
    use Gg\SiteBundle\Entity\Photo;
    use Gg\SiteBundle\Form\PhotoType;
    use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
    use Symfony\Component\Console\Input\InputArgument;
    use Symfony\Component\Console\Input\InputInterface;
    use Symfony\Component\Console\Input\InputOption;
    use Symfony\Component\Console\Output\OutputInterface;
     
    Class MajCommand extends ContainerAwareCommand{
     
        protected function configure()
        {
            $this
                ->setName('photo:maj')
                ->setDescription('Mise à jour de la base de données de photos');
        }
     
        protected function execute(InputInterface $input, OutputInterface $output)
        {
            function liste_fichiers($root = '.',$extensions_autorisees)
            {
                $fichiers  = array('fichiers'=>array(), 'dossiers'=>array());
                $directories  = array();
                $last_letter  = $root[strlen($root)-1];
                $root  = ($last_letter == '\\' || $last_letter == '/') ? $root : $root.DIRECTORY_SEPARATOR;
                $directories[]  = $root;
                while (sizeof($directories)) {
                    $dossier  = array_pop($directories);
                    if ($ressource = opendir($dossier)) {
                        while (false !== ($fichier = readdir($ressource))) {
                            if ($fichier == '.' || $fichier == '..'  || $fichier == 'script') {
                                continue;
                            }
                            $fichier  = $dossier.$fichier;
                            if (is_dir($fichier)) {
                                $directory_path = $fichier.DIRECTORY_SEPARATOR;
                                array_push($directories, $directory_path);
                                $fichiers['dossiers'][]  = $directory_path;
                            }
                            elseif (is_file($fichier)) {
                                $info =  pathinfo($fichier);
                                $extension =  $info['extension'];
                                if (in_array($extension, $extensions_autorisees)) {
                                    $fichiers['fichiers'][]  = $fichier;
                                }
                            }
                        }
                        closedir($ressource);
                    }
                }
                return $fichiers;
            }
     
            function comparaison($liste)
            {
     
            }
     
            $logger=$this->getContainer()->get('logger');
            $logger->info('début de l execution de  la commande');
     
            //mon traitement trés long...
     
            // Récupération des photos enregistrée en BDD
            $repository = $this ->getDoctrine()
                                ->getManager()
                                ->getRepository('GgSiteBundle:Photo');
            $liste_photos = $repository->findAll();
     
            // Liste des photos dans le répertoire
            $chemin=dirname(dirname(dirname(dirname(__DIR__)))).'/web/img/galerie/';
            $extensions_autorisees= array('jpg', 'jpeg', 'JPG');
            $liste=liste_fichiers($chemin,$extensions_autorisees);
     
            // Enregistrement d'un log
            $fichier_log=$chemin.'logs/LOG_'.date("Y_m_d_G_i_s").'.txt';
            $log = fopen($fichier_log, 'x+');
            fwrite($log, 'Mise à jour du '.date("j F Y G:i:s ")."\n\n".
                'Répertoire analysé: '.$chemin."\n".
                'Extensions de fichier autorisées: ');
            foreach($extensions_autorisees as $value){
                fwrite($log, $value.' ');
            }
            fwrite($log, "\n".
                count($liste['dossiers']).' dossiers explorés'."\n".
                count($liste['fichiers']).' fichiers trouvés'."\n".
                'fichiers dans le répertoire: '."\n");
            foreach ($liste['fichiers'] as $element){
                fwrite($log, $element."\n");
            }
            fwrite($log, 'photos en BDD : '."\n");
            foreach ($liste_photos as $element){
                $photo=$element->getContenu();
                fwrite($log, $photo."\n");
            }
            fwrite($log, 'FIN');
            fclose($log);
            sleep(10);
            $logger->info($fichier_log);
            $logger->info('fin de l execution de  la commande');
        }
    }

  8. #8
    Membre émérite
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Par défaut
    Comment je récupère mes service de Doctrine???
    tu recupére le service doctrine de la même façon que tu recupères le service logger.
    Il est interessant d'aller voir à quoi correspondent les méthodes fournies par le controller de base de symfony:
    https://github.com/symfony/symfony/b...ller.php#LC200

    pourquoi créer des fonctions dans une méthode, quand on peut créer plusieurs méthodes?

    le composant finder pourrait être intéressant pour ce que tu veux faire:
    http://symfony.com/fr/doc/current/co...ts/finder.html

  9. #9
    Membre averti
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 44
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            // Récupération des photos enregistrée en BDD
            //$repository = $this ->getDoctrine()
            $repository = $this ->getContainer()->get('doctrine')
                                ->getManager()
                                ->getRepository('GgSiteBundle:Photo');
            $liste_photos = $repository->findAll();
    Arf, je pensait pouvoir utiliser "getDoctrine()" en rajoutant le "use Symfony\Bundle\FrameworkBundle\Controller\Controller;"! Mais non, ça marche pas!

    Donc ce coup ci, mon code fonctionne!
    Et oui, en effet, j'ai trouvé intéressant d'aller voir à quoi correspondent les méthodes fournies par le controller de base de symfony! J'ai repéré comment raccourcir d'autre partie de mon code (mais ailleurs que celui de ce sujet!)

    Finder, je l'avais repéré. Mais ma compréhension de l'anglais est pas toujours au top et j'ai parfois l'impression de passé beaucoup trop de temps à essayer et tester des bundles super intéressant qui corresponde pas forcément à ce que je cherche. Donc, histoire d'avancé, j'ai choisi d’essayer de réinventer la roue!
    Mais je suis ravi d'avoir un avis positif (et en français) sur ce bundle...
    Je vais l'essayer!

    Encore un grand merci pour ton aide qui m'a permi non seulement d'avancer, mais également de mieux comprendre plein de choses!

    Je marque le sujet en résolu

  10. #10
    Membre averti
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 44
    Par défaut
    Après quelques heures d'élevage de cheveux blanc, j'ai réussi à pondre un truc qui semble bien vouloir fonctionner....
    Même si je pense qu'il y a encore du boulot et pas mal de modif à faire!
    Mais voici le sujet où j'ai poster le code fonctionnel: http://www.developpez.net/forums/d13...o/#post7613746

  11. #11
    Membre extrêmement actif
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Par défaut
    good job

    sympa de partager ton travail !

  12. #12
    Membre averti
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 44
    Par défaut
    Merci Dukoid,

    Je suis partageur, mais le partage n'est pas sans avantage!
    ... Si j'ai des critiques constructives qui peuvent me permettre de m'améliorer! :p

    Bon, là, c'est dimanche, je vais essayer de lâcher un peu pour faire autre chose... Mais tout ça me semble pas être dans le respect des bonnes pratiques!!!! Je pense que mon code devrait pouvoir être plus court...

    Je devrais pouvoir sortir mes 2 fonctions logs_iptc() et log() de mon execute()...

    Je pourrais définir certaines de mes actions, comme les enregistrements en BDD, dans ma class 'photo'... Mais pour l'instant, ça marche pas...
    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
    class Photo
    {
        // ....
     
        public function modif($element)
        {
            $this -> taille = setTaille($element['taille']);
            $this -> chemin = setChemin($element['chemin']);
            $this -> iptc = setIptc($element['iptc']);
            $this -> date = setDate($element['date']);
        }
     
        public function nvel($element)
        {
            $this -> setNom($element['nom']);
            modif($element);
        }
     
        // ....
    }
    Et dans ma command:

    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
    // Enregistrement en BDD
            // Les Modifs
            foreach ($modif_liste as $element){
                $em = $this ->getContainer()->get('doctrine')
                            ->getManager();
                $photo = $em ->getRepository('GgSiteBundle:Photo')
                            ->findOneBy(array('nom'=>$element['nom']));
                $photo -> modif($element);
                $em-> flush();
            }
            // Les Nouveautés
            foreach ($nvlle_liste as $element){
                $photo = new Photo();
                $photo -> nvl($element);
                $repository = $this ->getContainer()->get('doctrine')
                                    ->getManager();
                $repository ->persist($photo)
                            ->flush();
            }
    :/ Pas de modif ou nouvel entrée dans ma base de données!

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 01/09/2009, 10h17
  2. Eclipse Process Framework Composer
    Par Hotchotte dans le forum Eclipse
    Réponses: 0
    Dernier message: 10/06/2009, 15h34
  3. [C#] Anomalie du Composant Process
    Par heavydrinker dans le forum Windows Forms
    Réponses: 6
    Dernier message: 18/08/2006, 10h22
  4. Installer ses composants
    Par Geronimo dans le forum C++Builder
    Réponses: 14
    Dernier message: 18/06/2002, 14h51
  5. Re-dimensionnement automatique de composants
    Par ludo_7 dans le forum C++Builder
    Réponses: 10
    Dernier message: 16/05/2002, 16h35

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