Tracé de fonctions en java
Répondre à la discussion
Affichage des résultats 1 à 10 sur 10

Tracé de fonctions en java



  1. #1
    Morghot

    Tracé de fonctions en java


    ------

    Bonjour,

    Je suis en licence 2 de mathématique et de physique et débutant en java ( on a commencé il y a 1 mois ).

    On écrit un programme affichant le tracer d'une fonction avec des valeurs de x minimum et maximum données par l'utilisateur ( même chose pour y ). On définit 3 possibilités avec 3 boutons sur l'interface graphique : Tracer, Imprimer et Range (ovrant une nouvelle fenêtre permettant à l'utilisateur de saisir les valeurs de xmin, xmax, etc ...).

    On a créé 3 fichiers .java :

    --> le premier définit notre classe principale qui hérite de la classe Frame où l'on définit la taille de la fenêtre, les différents éléments qui la compose ( un objet d'une classe que l'on créer dans un second fichier et qui hérite de la classe Canvas pour tracer la fonction et 3 objets de la classe Button )

    --> le second définit la classe héritant de la classe Frame pour la fenêtre qui s'ouvre lorsque l'utilisateur clique sur le bouton Range. On place les différents éléments ( Label, TexteField, etc ... )

    --> le troisième pour la classe héritant de Canvas permettant d'afficher le tracer de la fonction

    J'ai bien compris tout ça mais j'ai un petit problème : lorsque je définit la classe héritant de Canvas qui permet d'afficher le tracer de la fonction, j'ai besoin des valeurs de xmin, xmax, etc ... saisies par l'utilisateur mais je ne peux pas y accèder. Le nom de l'objet de la classe définit dans le second fichier .java est range et la variable contenant la valeur de xmin par exemple définit dans le second fichier est xmin j'écris donc "range.xmin" pour avoir sa valeur mais j'ai une erreur m'expliquant que le symbole range est inconnu. J'espère que je ne peux pas acceder à cette valeur que dans ma classe principale ?

    Merci d'avance et désolé si mon explication n'est pas très claire je débute en java comme je l'ai expliqué plus haut.

    Merci encore à tous ceux qui m'aideront.

    -----

  2. #2
    bzh_nicolas

    Re : Tracé de fonctions en java

    Ton code source nous aiderais bien à voir le problème...
    Quelques pistes sinon :
    Par défaut une classe java considère tous ces membres comme private, c'est à dire que tu ne peux pas y accéder à partir d'un autre objet.
    Tu as 2 solutions :
    La première est de passer ces membres en public. C'est surement la plus simple mais c'est "mal" en programmation orienté objet.
    La seconde est de créé des accesseurs (pour lire la valeur des variables) et des modificateurs (pour... modifier ces valeurs ).
    C'est un peu plus de travail, mais il s'agit en général de fonctions assez courtes et simples à écrire (surtout les accesseurs qui ne feront que retourner la valeur de ta variable).
    A voir maintenant si on te demande de faire de la programmation respectant strictement les rêgles ou simplement un programme qui marche.
    Dernière modification par JPL ; 05/03/2011 à 14h21. Motif: Titre

  3. #3
    Morghot

    Re : Tracé de fonctions en java

    D'abord merci de ta réponse ! Les accesseurs et modificateurs ne me disent absolument rien ... Même chose pour les membres d'une classe java; serait-ce les variables, les objets définis à l'intérieur d'une classe ? Après j'ai peut-être mal exposé mon problème ... Effectivement si je vous mets le code source que j'ai déjà fait ce sera plus simple ^_^

    Voila le lien ( j'ai mis les 3 fichiers dans une archive, les fichiers .java n'étant pas acceptés en pièce jointe ) : http://www.megaupload.com/?d=L1QWQQLN

    Merci encore !

  4. #4
    Morghot

    Re : Tracé de fonctions en java

    J'ai dait des recherches et je pense pouvoir décrire mon problème plus clairement :

    j'ai donc mon programme qui est constitué de 3 classes que je définis dans 3 fichiers .java différents. Dans la définition d'une des classe ( MonCanvas ) j'ai besoin d'accèder à un membre (l'attribut xmin) d'un objet instancié dans ma classe principale ( TraceFonction ) à partir de la dernière classe ( MonRange ). Comment faire ?

    Merci !

    PS : dans la partie de code que j'ai écrite il y a des bouts de code qui ne correspondent pas à ce que je veux faire ou qui sont faux c'est simplement des tests que j'ai fait pour comprendre comment résoudre mon problème.

  5. A voir en vidéo sur Futura
  6. #5
    bzh_nicolas

    Re : Tracé de fonctions en java

    Je ne parviens pas à voir tes fichiers, tu peux en copier-coller le contenu ici (en utilisant les balises [code] pour faciliter la lecture du code.
    La description que tu fais me fait penser au problème dont je t'ai déjà parlé.
    Fais une recherche sur google avec les mots clefs :
    java private
    Tu trouveras des liens qui t'expliqueront les notions d'accessibilité en programmation orientée objet (POO) qu'il est nécessaire de connnaitre quand on programme en java qui est un langage objet.

  7. #6
    Morghot

    Re : Tracé de fonctions en java

    Fichier traceFonction.java

    Code:
    import java.awt.*;
    import java.awt.event.*;
    
    class traceFonction extends Frame implements ActionListener,WindowListener {
    
    	Button rangeB,tracerB,imprimerB ;
    	monRange range ;
    	monCanvas canvas ;
    	
    	public traceFonction(){
    		setTitle("Trace de Fonctions");
    		setBounds(0,0,400,600);
    		setLayout(null);
    		addWindowListener(this);
    		
    		
    		int w=getBounds().width; //largeur fenetre
    		int wbutton=(w-40)/3;
    		
    		rangeB=new Button("Range");
    		rangeB.setBounds(10,40,wbutton,25);
    		rangeB.addActionListener(this);
    		add(rangeB);
    		
    		tracerB=new Button("Tracer");
    		tracerB.setBounds(20+wbutton,40,wbutton,25);
    		tracerB.addActionListener(this);
    		add(tracerB);
    		
    		imprimerB=new Button("Imprimer");
    		imprimerB.setBounds(30+2*wbutton,40,wbutton,25);
    		imprimerB.addActionListener(this);
    		add(imprimerB);
    		
    		range =new monRange();
    		
    		canvas =new monCanvas ();
    		add(canvas);
    		
    		
    	}
    	
    ///////// EVENEMENTS CLICS ////////////////
    	public void actionPerformed(ActionEvent e) {
    		if (e.getSource ()==rangeB)
    		{
    			range.setVisible (true);
    			range.xminTF.setText (""+range.xmin);
    			range.yminTF.setText (""+range.ymin);
    			range.xmaxTF.setText (""+range.xmax);
    			range.ymaxTF.setText (""+range.ymax);
    			range.nbPointsTF.setText (""+range.nbPoints);
    		}
    				
    	}		
    ////////// EVENEMENTS FENETRE /////////	
    		public void windowOpened(WindowEvent e){	
    			System.out.println("Opened");
    		}
    		public void windowClosed(WindowEvent e){
    			System.out.println("Closed");
    		}
    		public void windowClosing(WindowEvent e){
    			System.out.println("Closing");
    			System.exit(0);
    		}
    		public void windowIconified(WindowEvent e){	
    			System.out.println("Iconified");
    		}
    		public void windowDeiconified(WindowEvent e){	
    			System.out.println("Deiconified");
    		}
    		public void windowActivated(WindowEvent e){	
    			System.out.println("Activated");
    		}
    		public void windowDeactivated(WindowEvent e){	
    			System.out.println("Deactivated");
    		}
    		
    		
    public static void main (String[] args){
    	traceFonction appli=new traceFonction();
    	appli.setVisible(true);	
    	
    }	
    	
    }
    Fichier monRange.java

    Code:
    import java.awt.*;
    import java.awt.event.*;
    
    
    class monRange extends Frame implements ActionListener,WindowListener {
    	
    TextField xminTF, xmaxTF, yminTF, ymaxTF, nbPointsTF;
    Label xminL, xmaxL, yminL, ymaxL, nbPointsL;
    Button annulerB, validerB;
    double xmin=-5, xmax=5, ymin=-5, ymax=5;
    int nbPoints=100;
    
    
    	public monRange(){
    		setTitle("Range");
    		setBounds(0,0,370,400);
    		setLayout(null);
    		addWindowListener(this);
    
    xminL= new Label ("Xmin");
    xminL.setBounds (10, 40, 60, 25);
    xminL.setAlignment (Label.RIGHT);
    add (xminL);
    
    xmaxL= new Label ("Xmax");
    xmaxL.setBounds (10, 75, 60, 25);
    xmaxL.setAlignment (Label.RIGHT);
    add (xmaxL);
    
    yminL= new Label ("Ymin");
    yminL.setBounds (190, 40, 60, 25);
    yminL.setAlignment (Label.RIGHT);
    add (yminL);
    
    ymaxL= new Label ("Ymax");
    ymaxL.setBounds (190, 75, 60, 25);
    ymaxL.setAlignment (Label.RIGHT);
    add (ymaxL);
    
    xminTF= new TextField ();
    xminTF.setBounds (80, 40, 80, 25);
    add (xminTF);
    
    xmaxTF= new TextField ();
    xmaxTF.setBounds (80, 75, 80, 25);
    add (xmaxTF);
    
    yminTF= new TextField ();
    yminTF.setBounds (260, 40, 80, 25);
    add (yminTF);
    
    ymaxTF= new TextField ();
    ymaxTF.setBounds (260, 75, 80, 25);
    add (ymaxTF);
    
    
    nbPointsTF= new TextField ();
    nbPointsTF.setBounds (260, 110, 80, 25);
    add (nbPointsTF);
    
    nbPointsL= new Label ("Nombre de Points");
    nbPointsL.setBounds (10, 110, 130, 25);
    nbPointsL.setAlignment (Label.RIGHT);
    add (nbPointsL);
    	
    annulerB= new Button ("Annuler");
    annulerB.setBounds (10,145,170,25);
    annulerB.addActionListener (this);
    add (annulerB);
    
    validerB= new Button ("Valider");
    validerB.setBounds (190,145,170,25);
    validerB.addActionListener (this);
    add (validerB);
    
    
    	}
    	
    
    	
    	
    void valider () 
    {
    
    	xmin=Double.valueOf (xminTF.getText () ).doubleValue ();
    	ymin=Double.valueOf (yminTF.getText () ).doubleValue ();
    	xmax=Double.valueOf (xmaxTF.getText () ).doubleValue ();
    	ymax=Double.valueOf (ymaxTF.getText () ).doubleValue ();
    	this.setVisible (false);
    	
    }
    
    void annuler ()
    {
    			xminTF.setText (""+xmin);
    			yminTF.setText (""+ymin);
    			xmaxTF.setText (""+xmax);
    			ymaxTF.setText (""+ymax);
    			nbPointsTF.setText (""+nbPoints);
    			this.setVisible (false);
    }
    
    	
    	///////// EVENEMENTS CLICS ////////////////
    	
    	public void actionPerformed(ActionEvent e) {
    		if (e.getSource()== annulerB )
    		{
    			annuler ();
    		}
    		if (e.getSource()== validerB )
    		{
    			valider ();
    		}
    	
    	}
    	
    	
    		
        ////////// EVENEMENTS FENETRE /////////
    	
    		public void windowOpened(WindowEvent e){	
    			System.out.println("Opened");
    		}
    		public void windowClosed(WindowEvent e){
    			System.out.println("Closed");
    		}
    		public void windowClosing(WindowEvent e){
    			System.out.println("Closing");
    			System.exit(0);
    		}
    		public void windowIconified(WindowEvent e){	
    			System.out.println("Iconified");
    		}
    		public void windowDeiconified(WindowEvent e){	
    			System.out.println("Deiconified");
    		}
    		public void windowActivated(WindowEvent e){	
    			System.out.println("Activated");
    		}
    		public void windowDeactivated(WindowEvent e){	
    			System.out.println("Deactivated");
    		}
    		
    
    }
    Fichier monCanvas.java

    Code:
    import java.awt.*;
    
    class monCanvas extends Canvas {
     
    	
        public monCanvas() {
    	setBounds (10,90,380,490);
        }
    	
    	double f (double x) {
    	return Math.pow(x,2);
    	}
    	
    	public void paint(Graphics g) {
    	
    	
    	
    	}
            
    }
    Le code est pas complet. Je veux donc accèder à la valeur xmin de l'objet range de la classe monRange défini dans traceFonction.java. Oui j'ai vu ça dans mes recherches : public, private et protected. Je n'ai pas très bien saisi d'ailleurs comme les packages. Si tu pouvais m'aider la-dessus ce serait sympa ^_^ Par contre les classes filles ont un rapport avec l'instruction extends non ?

    Merci et vraiment désolé de toutes ces questions !

  8. #7
    Morghot

    Re : Tracé de fonctions en java

    J'ai résolu mon problème en appelant :
    Code:
    traceFonction.range.xmin;
    J'ai eu le message d'erreur :
    non-static variable : range. Cannot be referenced as a static context.
    Ou quelque chose comme ça.

    J'ai donc défini l'objet range dans traceFonction.java comme ceci :
    Code:
    static monRange range;
    range = new monRange();
    Et je n'ai plus de problème ... Seulement je ne comprends pas du tout ce que signifie "static" et ce que ça change. D'autant que lorsque je change la valeur de xmin en rentrant une nouvelle valeur dans la fenêtre range la valeur est bien modifiée : j'ai fait afficher la valeur xmin dans le canvas avec la méthode paint et lorsque je change la valeur dans la fenêtre et que je clique sur valider j'ai bien le changement qui s'opère dans le canvas !
    C'est pas génial d'avoir reglé mon problème sans comprendre comment ^_^

  9. #8
    bzh_nicolas

    Re : Tracé de fonctions en java

    Concernant le problème d'accès à xmin, etc...
    Par défaut, les membres d'une classe java sont en protected (si tu ne précise rien) donc il ne sont accessible que depuis la class les contenant ou une classe fille.
    C'est pour cela que tu ne peux accéder directement à ces membres dans ton code.
    Les déclarer en public (ou créé un accesseur) résoudra ce problème.

    Pour le static :
    Quand tu déclares un objet en static, tu crée un seul instance de l'objet pour toutes les instances de la class le contenant (il est partagé).
    Concrétement c'est utile, par exemple, si tu veux faire un compteur pour savoir combien d'objet d'une classe tu as créé.
    Quand tu écris
    Code:
    traceFonction.range.xmin;
    Tu fais un appel static car tu ne passe pas par un objet de type traceFonction. (un appel static est fait lorsque tu appelles un membres ou une fonction d'une classe sans passer par une instance d'un objet de cette classe)
    Contrairement à ici :
    Code:
    monTraceFonction traceFonction;
    monTraceFonction = new traceFonction;
    
    monTraceFonction.range.xmin;
    /*
    là ce n'est pas un appel  static
    je ne suis d'ailleurs pas sur que ton code marchera dans ce cas
    */
    Ce qu'il se passe (désolé, je ne me rappelle plus du nom du mécanisme en jeu) :
    range est considéré comme un membre protected de ta classe traceFonction, mais comme tu l'as déclaré en static dans ta class il considère ceci comme une sorte d'héritage et donc te donne accès aux membres protected de la classe range dont xmin fait partie.

  10. #9
    bzh_nicolas

    Re : Tracé de fonctions en java

    Oups! J'ai dit une bêtise en fait dans le dernier paragraphe : pas de notion d'héritage la dedans... (voilà ce que c'est de répondre quand on est pas complètement réveillé )
    En fait quand tu fais :
    Code:
    traceFonction.range.xmin;
    Tu appelles directement l'objet range de ta classe traceFonction donc il est normal d'avoir accès aux membres protected.
    Par contre si jamais tu essayes de créer un deuxième objet de la classe traceFonction (par exemple pour tracer un second graph), cela ne fonctionnera pas.
    L'objet range étant static, il est partagé entre toutes les instances de traceFonction...

  11. #10
    Morghot

    Re : Tracé de fonctions en java

    Voilà le code que j'écris pour tester si j'ai accès à xmin xmax etc ...

    traceFonction.java

    Code:
    import java.awt.*;
    import java.awt.event.*;
    
    class traceFonction extends Frame implements ActionListener,WindowListener {
    
    	Button rangeB,tracerB,imprimerB ;
    	monRange range ;
    	monCanvas canvas ;
    	
    	public traceFonction(){
    		setTitle("Trace de Fonctions");
    		setBounds(0,0,400,600);
    		setLayout(null);
    		addWindowListener(this);
    		
    		
    		int w=getBounds().width; //largeur fenetre
    		int wbutton=(w-40)/3;
    		
    		rangeB=new Button("Range");
    		rangeB.setBounds(10,40,wbutton,25);
    		rangeB.addActionListener(this);
    		add(rangeB);
    		
    		tracerB=new Button("Tracer");
    		tracerB.setBounds(20+wbutton,40,wbutton,25);
    		tracerB.addActionListener(this);
    		add(tracerB);
    		
    		imprimerB=new Button("Imprimer");
    		imprimerB.setBounds(30+2*wbutton,40,wbutton,25);
    		imprimerB.addActionListener(this);
    		add(imprimerB);
    		
    		range =new monRange();
    		
    		canvas =new monCanvas ();
    		add(canvas);
    		
    		
    	}
    	
    ///////// EVENEMENTS CLICS ////////////////
    	public void actionPerformed(ActionEvent e) {
    		if (e.getSource ()==rangeB)
    		{
    			range.setVisible (true);
    			range.xminTF.setText (""+range.xmin);
    			range.yminTF.setText (""+range.ymin);
    			range.xmaxTF.setText (""+range.xmax);
    			range.ymaxTF.setText (""+range.ymax);
    			range.nbPointsTF.setText (""+range.nbPoints);
    		}
    				
    	}		
    ////////// EVENEMENTS FENETRE /////////	
    		public void windowOpened(WindowEvent e){	
    			System.out.println("Opened");
    		}
    		public void windowClosed(WindowEvent e){
    			System.out.println("Closed");
    		}
    		public void windowClosing(WindowEvent e){
    			System.out.println("Closing");
    			System.exit(0);
    		}
    		public void windowIconified(WindowEvent e){	
    			System.out.println("Iconified");
    		}
    		public void windowDeiconified(WindowEvent e){	
    			System.out.println("Deiconified");
    		}
    		public void windowActivated(WindowEvent e){	
    			System.out.println("Activated");
    		}
    		public void windowDeactivated(WindowEvent e){	
    			System.out.println("Deactivated");
    		}
    		
    		
    public static void main (String[] args){
    	traceFonction appli=new traceFonction();
    	appli.setVisible(true);	
    	
    }	
    	
    }
    monRange.java

    Code:
    import java.awt.*;
    import java.awt.event.*;
    
    
    class monRange extends Frame implements ActionListener,WindowListener {
    	
    TextField xminTF, xmaxTF, yminTF, ymaxTF, nbPointsTF;
    Label xminL, xmaxL, yminL, ymaxL, nbPointsL;
    Button annulerB, validerB;
    public double xmin=-5, xmax=5, ymin=-5, ymax=5;
    int nbPoints=100;
    
    
    	public monRange(){
    		setTitle("Range");
    		setBounds(0,0,370,400);
    		setLayout(null);
    		addWindowListener(this);
    
    xminL= new Label ("Xmin");
    xminL.setBounds (10, 40, 60, 25);
    xminL.setAlignment (Label.RIGHT);
    add (xminL);
    
    xmaxL= new Label ("Xmax");
    xmaxL.setBounds (10, 75, 60, 25);
    xmaxL.setAlignment (Label.RIGHT);
    add (xmaxL);
    
    yminL= new Label ("Ymin");
    yminL.setBounds (190, 40, 60, 25);
    yminL.setAlignment (Label.RIGHT);
    add (yminL);
    
    ymaxL= new Label ("Ymax");
    ymaxL.setBounds (190, 75, 60, 25);
    ymaxL.setAlignment (Label.RIGHT);
    add (ymaxL);
    
    xminTF= new TextField ();
    xminTF.setBounds (80, 40, 80, 25);
    add (xminTF);
    
    xmaxTF= new TextField ();
    xmaxTF.setBounds (80, 75, 80, 25);
    add (xmaxTF);
    
    yminTF= new TextField ();
    yminTF.setBounds (260, 40, 80, 25);
    add (yminTF);
    
    ymaxTF= new TextField ();
    ymaxTF.setBounds (260, 75, 80, 25);
    add (ymaxTF);
    
    
    nbPointsTF= new TextField ();
    nbPointsTF.setBounds (260, 110, 80, 25);
    add (nbPointsTF);
    
    nbPointsL= new Label ("Nombre de Points");
    nbPointsL.setBounds (10, 110, 130, 25);
    nbPointsL.setAlignment (Label.RIGHT);
    add (nbPointsL);
    	
    annulerB= new Button ("Annuler");
    annulerB.setBounds (10,145,170,25);
    annulerB.addActionListener (this);
    add (annulerB);
    
    validerB= new Button ("Valider");
    validerB.setBounds (190,145,170,25);
    validerB.addActionListener (this);
    add (validerB);
    
    
    	}
    	
    
    	
    	
    void valider () 
    {
    
    	xmin=Double.valueOf (xminTF.getText () ).doubleValue ();
    	ymin=Double.valueOf (yminTF.getText () ).doubleValue ();
    	xmax=Double.valueOf (xmaxTF.getText () ).doubleValue ();
    	ymax=Double.valueOf (ymaxTF.getText () ).doubleValue ();
    	this.setVisible (false);
    	
    }
    
    void annuler ()
    {
    			xminTF.setText (""+xmin);
    			yminTF.setText (""+ymin);
    			xmaxTF.setText (""+xmax);
    			ymaxTF.setText (""+ymax);
    			nbPointsTF.setText (""+nbPoints);
    			this.setVisible (false);
    }
    
    	
    	///////// EVENEMENTS CLICS ////////////////
    	
    	public void actionPerformed(ActionEvent e) {
    		if (e.getSource()== annulerB )
    		{
    			annuler ();
    		}
    		if (e.getSource()== validerB )
    		{
    			valider ();
    		}
    	
    	}
    	
    	
    		
        ////////// EVENEMENTS FENETRE /////////
    	
    		public void windowOpened(WindowEvent e){	
    			System.out.println("Opened");
    		}
    		public void windowClosed(WindowEvent e){
    			System.out.println("Closed");
    		}
    		public void windowClosing(WindowEvent e){
    			System.out.println("Closing");
    			System.exit(0);
    		}
    		public void windowIconified(WindowEvent e){	
    			System.out.println("Iconified");
    		}
    		public void windowDeiconified(WindowEvent e){	
    			System.out.println("Deiconified");
    		}
    		public void windowActivated(WindowEvent e){	
    			System.out.println("Activated");
    		}
    		public void windowDeactivated(WindowEvent e){	
    			System.out.println("Deactivated");
    		}
    		
    
    }
    monCanvas.java

    Code:
    import java.awt.*;
    
    class monCanvas extends Canvas {
     
    	
        public monCanvas() {
    	setBounds (10,90,380,490);
        }
    	
    	double f (double x) {
    	return Math.pow(x,2);
    	}
    	
    	public void paint(Graphics g) {
    	
    	g.drawString ("xmin="+traceFonction.range.xmin,190,245);
    	g.drawString ("xmax="+traceFonction.range.xmax,190,255);
    	g.drawString ("ymin="+traceFonction.range.ymin,190,265);
    	g.drawString ("ymax="+traceFonction.range.ymax,190,275);
    	
    	}
            
    }

    Donc quand je déclare xmin, xmax etc ... en public dans monRange.java comme ceci :

    Code:
    public double xmin,xmax,ymin,ymax;
    Je n'ai rien qui s'affiche (mais pas d'erreur de compilation) donc je déclare l'objet range en public dans traceFonction.java :

    Code:
    public monRange range;
    Toujours rien ...

    Pourquoi je peux accèder à xmin, xmax, etc ... dans la classe traceFonction ? Cette classe n'est pas une classe fille de monRange ? Ou j'ai mal compris la notion de classe fille.

    Pour le static je crois que j'ai compris : je suis obligé de déclarer xmin, xmax, etc ... en static car je ne passe pas par un objet de la classe traceFonction pour y acceder mais directement par la classe.

Discussions similaires

  1. Tracé schémas / c.i.
    Par invite9b9def91 dans le forum Électronique
    Réponses: 12
    Dernier message: 28/01/2011, 10h42
  2. Tracé d'engrenages
    Par invite74009975 dans le forum Physique
    Réponses: 3
    Dernier message: 10/01/2010, 17h47
  3. maple tracé de fonctions
    Par milsabor dans le forum Mathématiques du supérieur
    Réponses: 1
    Dernier message: 28/05/2008, 22h31
  4. Java, java, java, where are you, there's a mission for you !
    Par invite1237a629 dans le forum Logiciel - Software - Open Source
    Réponses: 35
    Dernier message: 16/03/2008, 22h10
  5. Simple trace --> double trace
    Par Jean-Luc dans le forum Électronique
    Réponses: 6
    Dernier message: 18/09/2005, 23h01