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

EDT/SwingWorker Java Discussion :

[SwingWorker]Complement d'infomation sur fonctionnement


Sujet :

EDT/SwingWorker Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2004
    Messages
    528
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2004
    Messages : 528
    Par défaut [SwingWorker]Complement d'infomation sur fonctionnement
    Bonjour à tous,

    Comme cité dans un precedent topic, j'ai un traitement lourd et un affichage à effectuer.

    On m'a conseillé le SwingWorker, je me suis donc rensigné et trouvé une faq dessus à l'adresse http://rom.developpez.com/java-swingworker/
    J'ai lu avec attention les explications, mais j'i des difficulté à partager les 2 phases differentes, à savoir la lecture de fichiers et l'affichage de la progression.

    Tout se melange dans ma lecture

    Je vois els 2 bloc:
    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
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    import java.awt.BorderLayout;
    import java.beans.PropertyChangeEvent;
    import java.beans.PropertyChangeListener;
    import java.io.File;
    import java.util.List;
     
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JProgressBar;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;
    import javax.swing.JTextField;
    import javax.swing.ScrollPaneConstants;
    import javax.swing.SwingUtilities;
    import javax.swing.SwingWorker;
     
    public class SwingWorkerDemo extends JFrame {
     
        private JTextArea textArea;
        private JTextField textField;
        private JProgressBar progressBar;
     
        class MonSwingWorker extends SwingWorker<Integer, String> {
     
            public MonSwingWorker() {
                /* On ajoute un écouteur de barre de progression. */
                addPropertyChangeListener(new PropertyChangeListener() {
                    public void propertyChange(PropertyChangeEvent evt) {
                        if("progress".equals(evt.getPropertyName())) {
                            progressBar.setValue((Integer) evt.getNewValue());
                        }
                    }
                });
            }
     
            @Override
            public Integer doInBackground() {
                File userDir = new File(System.getProperty("user.dir"));
                return getNombreDeFichiers(userDir, 0, 100);
            }
     
            /* Compte le nombre de fichiers du répertoire utilisateur. */
            private int getNombreDeFichiers(File dir, double progressStart, double progressEnd) {
                File[] files = dir.listFiles();
                int nb = 0;
                if(files.length > 0) {
                    /* Le calcul de l'avancement du traitement n'a que peu d'importance pour l'exemple. */
                    double step = (progressEnd - progressStart) / files.length;
     
                    for(File f : files) {
                        progressStart += step;
     
                        /* Transmet la nouvelle progression. */
                        setProgress((int) progressStart);
     
                        /* Ajout d'un temps d'attente pour observer les changements à l'échelle "humaine". */
                        try {
                            Thread.sleep(50);
                        } catch(InterruptedException e) {
                            e.printStackTrace();
                        }
     
                        if(f.isDirectory()) {
                            /* Publication du répertoire trouvé. */
                            publish("Exploration du répertoire " + f.getAbsolutePath() + "...");
                            nb += getNombreDeFichiers(f, progressStart, progressStart + step);
                        } else {
                            /* Publication du fichier trouvé. */
                            publish(f.getAbsolutePath());
                            nb++;
                        }
                    }
                }
                return nb;
            }
     
            @Override
            protected void process(List<String> strings) {
                /* Affichage des publications reçues dans le textarea. */
                for(String s : strings)
                    textArea.append(s + '\n');
            }
     
            @Override
            protected void done() {
                try {
                    /* Le traitement est terminé. */
                    setProgress(100);
                    /* À la fin du traitement, affichage du nombre de fichiers parcourus dans le textfield. */
                    textField.setText(String.valueOf(get()));
                } catch(Exception e) {
                    e.printStackTrace();
                }
            }
        }
     
    // FIN PREMEIR BLOC
     
        public SwingWorkerDemo() {
            /* Construction de l'interface graphique. */
            super("SwingWorkerDemo");
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            textArea = new JTextArea(12, 40);
            textArea.setEnabled(false);
            textField = new JTextField(5);
            textField.setEnabled(false);
            progressBar = new JProgressBar();
            JPanel content = new JPanel(new BorderLayout());
            content.add(new JScrollPane(textArea,
    		                            ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
    				                    ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED));
            JPanel south = new JPanel(new BorderLayout());
            south.add(progressBar);
            south.add(textField, BorderLayout.EAST);
            content.add(south, BorderLayout.SOUTH);
            setContentPane(content);
            pack();
            setLocation(100, 100);
            setVisible(true);
        }
     
        public static void main(String... args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    /* Démarrage de l'interface graphique et du SwingWorker. */
                    SwingWorkerDemo demo = new SwingWorkerDemo();
                    MonSwingWorker swingWorker = demo.new MonSwingWorker();
                    swingWorker.execute();
                }
            });
        }
     
    }
    Mais je n'arrive pas à en faire 2 class differente. J'ai l'impression que l'un est imbriqué dans l'autre.

    Quelqu'un peut-il m'aider?
    D'avance merci
    PS: pour simplifier, imaginons que mon traitement long est une simple boucle for (i=0; i<100000; i++)

  2. #2
    Membre éclairé
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2004
    Messages
    528
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2004
    Messages : 528
    Par défaut
    Rebonjour,

    Au fait, je souhaiterai subdiviser en deux la tache pour permettre une réutilisation de cette class avec differentes taches lourdes et longues.
    De ce fait, j'aurai sous la main une class me donnant un jprogress.

    D'avance merci

  3. #3
    Membre éclairé
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2004
    Messages
    528
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2004
    Messages : 528
    Par défaut
    Personne ne peut m'aider?

    D'avance merci

  4. #4
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Bonjour,

    as-tu été voir du côté du JProgressMonitor ? C'est peut-être ce que tu cherches.

    Pour répondre à ta question d'origine, afin d'avoir deux classes vraiment séparées, il faut rendre la classe SwingWorker statique. Cela va toutefois l'empêcher d'accéder aux variables de la classe qui l'englobe. Une fois que tu as résolu ces problèmes, tu peux sans encombre déplacer la classe interne dans une autre fichier.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  5. #5
    Membre éclairé
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2004
    Messages
    528
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2004
    Messages : 528
    Par défaut
    Tout d'abord merci pour la reponse

    Oui, j'avais été voir, mais là om je bloque:

    Est-ce que la JprogressBar via le Monitor prend en charge DIRECTEMENT un traitement lourd? Pour ma part, je m'en fou un peu d'avoir des % qui défile, un simple truc infini me suffit!!!! Pour l'instant, l'utilisateur n'a aucun repere pour savoir si l'application tourne ou pas, si j'ai cette bar infinie, ca lui facilitera l'attente

    Donc voila, j'ai une seule question: la prise en charge d'un triatement lourd se fait-elle automatiquement?

    D'avance merci

  6. #6
    Membre éclairé
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2004
    Messages
    528
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2004
    Messages : 528
    Par défaut
    J'arrive pas à trouver un truc simple à faire

    Au fait, je veux juste un truc qui s'affiche qui donne l'info suivante à l'utilisateur:

    Le traitement est en cours..

    Que ce soit une jprogress ou autre!

    Comment peut-on faire? Je rappel que c'est un traitement lourd, mais j'arrive pas à mettre en place le truc

    J'ai entouré l'action lourde comme 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
    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
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    import javax.swing.JFileChooser;
    import javax.swing.JFrame;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.JPopupMenu;
     
    import java.awt.BorderLayout;
    import java.awt.Cursor;
    import java.awt.Dimension;
    import java.awt.Toolkit;
     
    import javax.swing.JButton;
    import javax.swing.JFrame;
     
     
    import java.awt.Rectangle;
    import javax.swing.JTextField;
    import java.awt.Font;
    import java.awt.Color;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.StringTokenizer;
     
    import javax.swing.JProgressBar;
    import javax.swing.filechooser.FileFilter;
     
    public class AnalysePrincipale extends JFrame {
     
    	String docDejaAnalyses[];
    	private JPanel jContentPane = null;
    	private JButton jButtonFichierAnalyser = null;
    	private JTextField jTextFieldFichierAnalyser = null;
    	private JTextField jTextFieldFichier = null;
    	private JButton jButtonLancerAnalyse = null;
    	private JProgressBar jProgressBarPourcentage = null;
     
    	/**
             * This method initializes jFrame       
             *      
             * @return javax.swing.JFrame   
             */
    	 public AnalysePrincipale(String[] listeDocDejaAnalyses) {
    	      super();
    	      initialize();
    	      docDejaAnalyses = listeDocDejaAnalyses;
    	   }
    	   private void initialize() {
    		      this.setContentPane(getJContentPane());
    		      this.setSize(713, 205);
    	   }   
     
    	/**
             * This method initializes jContentPane 
             *      
             * @return javax.swing.JPanel   
             */
    	private JPanel getJContentPane() {
    		if (jContentPane == null) {
    			jContentPane = new JPanel();
    			jContentPane.setLayout(null);
    			jContentPane.setBackground(new Color(0, 204, 255));
    			jContentPane.add(getJButtonFichierAnalyser(), null);
    			jContentPane.add(getJTextFieldFichierAnalyser(), null);
    			jContentPane.add(getJTextFieldFichier(), null);
    			jContentPane.add(getJButtonLancerAnalyse(), null);
    			jContentPane.add(getJProgressBarPourcentage(), null);
    		}
    		return jContentPane;
    	}
     
    	/**
             * This method initializes jButtonFichierAnalyser       
             *      
             * @return javax.swing.JButton  
             */
    	private JButton getJButtonFichierAnalyser() {
    		if (jButtonFichierAnalyser == null) {
    			jButtonFichierAnalyser = new JButton();
    			jButtonFichierAnalyser.setBounds(new Rectangle(581, 42, 114, 21));
    			jButtonFichierAnalyser.setText("Parcourir...");
    			jButtonFichierAnalyser.addMouseListener(new java.awt.event.MouseAdapter() {
    				public void mousePressed(java.awt.event.MouseEvent e) {
    					System.out.println("mouseClicked()"); // TODO Auto-generated Event stub mouseClicked()
    					JFileChooser choix = new JFileChooser();
    					choix.setApproveButtonText("choix");
    					FileFilter doc = new FiltreSimple("Fichiers doc",".doc");
    					choix.addChoosableFileFilter(doc);
    					if (choix.showOpenDialog(jButtonLancerAnalyse)== JFileChooser.APPROVE_OPTION)
    					{
    						System.out.println("Choix :" + choix.getSelectedFile().getAbsolutePath());
    						jTextFieldFichierAnalyser.setText(choix.getSelectedFile().getAbsolutePath());
    					}
    					StringTokenizer st ;
    					String extensionFichier =""; 
    					// On verifie si c'ets bien un doc
    					st = new StringTokenizer(choix.getSelectedFile().getAbsolutePath(),".");
    					while(st.hasMoreTokens())
    					{
    						extensionFichier = st.nextToken();
    					}
    					extensionFichier = extensionFichier.toLowerCase();
    					System.out.println(extensionFichier);
    					if (extensionFichier.equals("doc") == false)
    					{
    						JOptionPane.showMessageDialog(jButtonLancerAnalyse, "Le fichier choisi n'est pas un document .doc! Veuillez refaire votre choix.");
    						jTextFieldFichierAnalyser.setText("");
    					}
     
     
    				}
    			});
    		}
    		return jButtonFichierAnalyser;
    	}
    	/**
             * This method initializes jTextFieldFichierAnalyser    
             *      
             * @return javax.swing.JTextField       
             */
    	private JTextField getJTextFieldFichierAnalyser() {
    		if (jTextFieldFichierAnalyser == null) {
    			jTextFieldFichierAnalyser = new JTextField();
    			jTextFieldFichierAnalyser.setBounds(new Rectangle(16, 45, 555, 15));
    			jTextFieldFichierAnalyser.setFont(new Font("Dialog", Font.PLAIN, 12));
    			jTextFieldFichierAnalyser.setForeground(Color.blue);
    			jTextFieldFichierAnalyser.setBackground(Color.yellow);
    			jTextFieldFichierAnalyser.setEditable(false);
    		}
    		return jTextFieldFichierAnalyser;
    	}
    	/**
             * This method initializes jTextFieldFichier    
             *      
             * @return javax.swing.JTextField       
             */
    	private JTextField getJTextFieldFichier() {
    		if (jTextFieldFichier == null) {
    			jTextFieldFichier = new JTextField();
    			jTextFieldFichier.setBounds(new Rectangle(15, 15, 252, 14));
    			jTextFieldFichier.setBackground(new Color(0, 204, 255));
    			jTextFieldFichier.setForeground(Color.black);
    			jTextFieldFichier.setFont(new Font("DialogInput", Font.BOLD, 12));
    			jTextFieldFichier.setEditable(false);
    			jTextFieldFichier.setText("Choisir le fichier à analyser: ");
    		}
    		return jTextFieldFichier;
    	}
    	/**
             * This method initializes jButtonLancerAnalyse 
             *      
             * @return javax.swing.JButton  
             */
    	private JButton getJButtonLancerAnalyse() {
    		if (jButtonLancerAnalyse == null) {
    			jButtonLancerAnalyse = new JButton();
    			jButtonLancerAnalyse.setBounds(new Rectangle(14, 76, 680, 60));
    			jButtonLancerAnalyse.setText("Lancer l'analyse");
    			jButtonLancerAnalyse.addMouseListener(new java.awt.event.MouseAdapter() {
    				public void mousePressed(java.awt.event.MouseEvent e) {
    					System.out.println("mousePressed()"); // TODO Auto-generated Event stub mousePressed()
    					System.out.println(jTextFieldFichierAnalyser.getText());
     
     
     
    					if (jTextFieldFichierAnalyser.getText().equals("") == false)
    					{
    						int dejaAnalyse =0;
    						for (int i=0; i< docDejaAnalyses.length; i++)
    						{
    							if (jTextFieldFichierAnalyser.getText().equals(docDejaAnalyses[i]))
    							{
    								dejaAnalyse =1;
    							}
    						}
    						if (dejaAnalyse == 0)
    						{
    							try
    							{												
    								String elements[] = new String[1];
    								elements[0] = jTextFieldFichierAnalyser.getText();
    								System.out.println("Avant de lancer doc");
    								//EnCours EC = new EnCours();
    								//EC.setVisible(true);									
    								//EC.setLocationRelativeTo(null);
    								JOptionPane.showMessageDialog(jButtonLancerAnalyse, "Lanalyse va débuter...elle durera quelques secondes." +
    										"\nAppuyez sur OK pour continuer...");
    								jContentPane.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
     
    //***********************************************
    int retour = Doc.doc(elements);
    //*********************************************
    								//EC.dispose();
    								if (retour != -1)
    								{									
    									JOptionPane.showMessageDialog(jButtonLancerAnalyse,"Analyse terminée avec succès.");
    									String fichierConfig = "./config.txt";
    									File fichier = new File(fichierConfig);
    									File fileDoc = new File(jTextFieldFichierAnalyser.getText());
    									// si fichier config existe pas, on le crée
    									if (fichier.exists() == false)
    									{
    										System.out.println("Le fichier " + fichierConfig + " n'existe pas");
    										try
    										{
    											fichier.createNewFile();
    										}
    										catch(IOException ee)
    										{
    											JOptionPane.showMessageDialog(jButtonLancerAnalyse, "Probleme lors de la création du fichier de configuration, veuillez contacter l'administrateur du programme.");
    										}
    									}
    									FileOutputStream fileOutConfig = new FileOutputStream(fichierConfig,true);
    									String tmp = elements[0] + "***" + fileDoc.length()/1000 + "***0***" + retour +"***0\n";
    									fileOutConfig.write(tmp.getBytes());
    									dispose();
    								}
    								else
    								{
    									JOptionPane.showMessageDialog(jButtonLancerAnalyse, "Une erreur est survenue lors de l'anlyse, veuillez contacter ladministrateur du programme.");
    									dispose();
    								}
     
     
    							}
    							catch (Exception ex)
    							{
    								JOptionPane.showMessageDialog(jButtonLancerAnalyse,"Fichier non trouvé ou problème avec le fichier en cours d'analyse. Veuillez contacter l'administrateur du programme.");
    							}
    							finally
    							{
    								jContentPane.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
    							}
    						}
    						else
    						{
    							JOptionPane.showMessageDialog(jButtonLancerAnalyse, "Le document que vous souhaitez analyser l'est deja. Une nouvelle analyse ne sera pas lancée.");
    						}
    					}
    					else
    					{
    						JOptionPane.showMessageDialog(jButtonLancerAnalyse, "Veuillez choisir un fichier .doc à analyser.");
    					}
    				}
    			});
    		}
    		return jButtonLancerAnalyse;
    	}
    	/**
             * This method initializes jProgressBarPourcentage      
             *      
             * @return javax.swing.JProgressBar     
             */
    	private JProgressBar getJProgressBarPourcentage() {
    		if (jProgressBarPourcentage == null) {
    			jProgressBarPourcentage = new JProgressBar();
    			jProgressBarPourcentage.setBounds(new Rectangle(13, 150, 677, 15));
    			jProgressBarPourcentage.setStringPainted(true);
    			jProgressBarPourcentage.setName("Progression : 0%");
    			jProgressBarPourcentage
    					.addChangeListener(new javax.swing.event.ChangeListener() {
    						public void stateChanged(javax.swing.event.ChangeEvent e) {
    							System.out.println("stateChanged()"); // TODO Auto-generated Event stub stateChanged()
    							jProgressBarPourcentage.setString("Progression :" + jProgressBarPourcentage.getPercentComplete() * 100 + "%");
    						}
    					});
     
     
    		}
    		return jProgressBarPourcentage;
    	}
     
     
    }  //  @jve:decl-index=0:visual-constraint="33,9"
    D'avance merci pour ceux qui pourront m'aider

Discussions similaires

  1. [AC-2007] Question sur fonctionnement fonction ou procédure
    Par tibofo dans le forum VBA Access
    Réponses: 5
    Dernier message: 07/05/2010, 21h41
  2. question débutant sur fonctionnement
    Par stouf() dans le forum GWT et Vaadin
    Réponses: 5
    Dernier message: 07/02/2009, 00h22
  3. eclaircissement sur fonctionnement programme c
    Par allezlolo dans le forum C
    Réponses: 13
    Dernier message: 10/10/2008, 01h04
  4. Interruption d'une tache (SwingWorker) lors du clic sur un bouton
    Par Crowell dans le forum EDT/SwingWorker
    Réponses: 3
    Dernier message: 07/05/2007, 14h55
  5. Un Hint sur un PopupMenu ne fonctionne pas !!??
    Par momox dans le forum C++Builder
    Réponses: 6
    Dernier message: 26/05/2003, 16h48

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