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

Android Discussion :

AutoCompleteTextView & class Async


Sujet :

Android

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut AutoCompleteTextView & class Async
    Hello!

    Je débute sous Android et je me suis fait une petite appli basé sur les Google API 2.1.

    A ce moment là je ne savais pas encore qu'il fallait séparer les accès réseaux de l'UI.

    Depuis j'ai corrigé le tir avec des classes Async et Google API 4.0.

    Mais je bute sur un problème que je n'arrive pas à résoudre!
    -> 1 AutoCompleteTextView sur mon champs ville

    AVANT (api 2.1):
    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
    public void onTextChanged(CharSequence s, int start, int before, int count) 
    {
    String result = null;
    InputStream is = null;
    List<String> r = new ArrayList<String>();
        	
        	if (ville.enoughToFilter())		//REQUETE uniquement à partir de 'n' caractères saisis (= 4 ici dans threshold dans .XML)!
        	{
    	    	//établissement de la connexion http
    	    	is = connexionHttp(BASE_URL + "ville.php?ville=" + ville.getText());
    	    	
    	    	//récup des data brutes ~> string
    	    	result = lectureData(is);
    	        
    	        //décodage JSON de l'input stream
    	        try
    	        {        	
    	            //remplissage DATA
    	        	JSONArray jArray = new JSONArray(result);
    	          	JSONObject json_data=null;
    	           	for(int i=0;i<jArray.length();i++)
    	           	{
    	                   json_data = jArray.getJSONObject(i);  
    	                   r.add(json_data.getString("VILLE"));
    	                   a_idVil.add(json_data.getString("CLEF_VILLE"));      
    	            }
    	           	ville.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_selectable_list_item,r));
    	           	ville.setOnItemSelectedListener(new villeListener());
    	           	
    	        }
    	        catch(JSONException e1)
    	        {
    	            	Toast.makeText(getBaseContext(),e1.toString() ,Toast.LENGTH_LONG).show();
    	            	Log.d("***** TestActivity/onTextChanged: JSONException *****", "--"+e1.toString()+"--");
    	        } 
    	        catch(ParseException e1) 
    	        {
    	            	Toast.makeText(getBaseContext(),e1.toString() ,Toast.LENGTH_LONG).show();
    	            	Log.d("***** TestActivity/onTextChanged: ParseException *****", "--"+e1.toString()+"--");
    	      	}
          	}
    }
    
    public class villeListener implements OnItemSelectedListener 
    {
            public void onItemSelected(AdapterView<?> parent, View v, int pos, long row) 
            {
            	villePosition = pos; 	
            }
            public void onNothingSelected(AdapterView<?> arg0)	{	}
    }
    fonctionnement 100% normal:
    -> à partir du 4ème caractère saisi, une rqt est lancée en base pour trouver toutes les villes débutant par ces 4 caractères + affichage en liste, avec sélection de la bonne ville
    -> le listener affecte bien l'indice de la ville choisie dans la liste


    APRES (api 4.0):
    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
    public void onTextChanged(CharSequence s, int start, int before, int count) 
    {    		
    	if (ville.enoughToFilter())		//REQUETE uniquement à partir de 'n' caractères saisis (= 4 ici dans threshold dans .XML)!
    	{    		
    		new RemplirVille().execute(BASE_URL + "ville.php?ville=" + ville.getText());
    		Log.d("***********","AVANT");  
    		ville.setOnItemSelectedListener(new villeListener());
    		Log.d("***********","APRES");    		
    	}
    
    }
    public class villeListener implements OnItemSelectedListener 
    {
    	public void onItemSelected(AdapterView<?> parent, View v, int pos, long row) 
    	{
    		villePosition = pos;
    		Log.d("*************9999999", "1111111111");
    	}
    	public void onNothingSelected(AdapterView<?> arg0)	{	}
    }
    
    class RemplirVille extends AsyncTask<String, String, List<String>>
    {
    	Integer errorMsgId;
    	String  errorMsgParam;
    	
    	protected List<String> doInBackground(String... param)
    	{
    		List<String> listeAffichageVille = new ArrayList<String>();
    		ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
    
    		try 
    		{
    				 HttpClient httpclient = new DefaultHttpClient();	   
    				 HttpPost httppost = new HttpPost(param[0]);
    				 httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
    				 HttpResponse response = httpclient.execute(httppost);	   
    				 if (response.getStatusLine().getStatusCode() < 400) 
    				 {
    					  HttpEntity entity = response.getEntity();
    					  String entityStr = EntityUtils.toString(entity);
    					  JSONArray json_array = new JSONArray(entityStr);
    					
    					  for(int i=0;i<json_array.length();i++) 
    					  {
    						  JSONObject json_ligne = json_array.getJSONObject(i);                            
    						  listeAffichageVille.add(json_ligne.getString("VILLE"));
    						  a_idVil.add(json_ligne.getString("CLEF_VILLE"));
    					  }
    				} 
    				else 
    				{
    					Log.d("***** TestActivity/ASYNC RemplirVille: EXCEPTION http error *****", "--"+response.getStatusLine().toString()+"--"); 
    					this.errorMsgId = R.string.http_site_error;
    					listeAffichageVille = null;
    				}
    		} 
    		catch (Exception ex) 
    		{
    				Log.d("***** TestActivity/ASYNC RemplirVille: EXCEPTION decode error *****", "--"+ex.toString()+"--");
    				this.errorMsgId = R.string.http_decode_error;
    				this.errorMsgParam = ex.getLocalizedMessage();
    				listeAffichageVille = null;
    		}
    		return listeAffichageVille;
    	}
    	
    	protected void onProgressUpdate(String... item)	{	}
    	protected void onPreExecute(List<String> list)	{	}
    	protected void onPostExecute(List<String> list)		
    	{				
    		if (list == null)	//si NULL alors problème...
    		{
    			  if (this.errorMsgId != null) 
    			  {
    				  String msg = TestActivity.this.getString(this.errorMsgId);
    				  Toast.makeText(TestActivity.this,msg,Toast.LENGTH_LONG).show();
    			  }    
    		}
    		else				//.. SINON affecter les data à l'adapter!
    		{
    			ville.setAdapter(new ArrayAdapter<String>(TestActivity.this,android.R.layout.simple_selectable_list_item,list));
    		}
    	}	
    }
    fonctionnement dégradé:
    -> il faut saisir enoughToFilter + 1 caractères pour afficher la liste des villes débutant par ces 4+1 caractères(?)
    -> on ne passe plus dans le listener(?)


    J'ai déjà reprise le déroulement du code un bon paquet de fois, mais je ne vois pas!

    Et comme à force je connais trop bien mon source, de toute façon je ne lis plus vraiment, je survole!

    En fait enoughToFilter fonctionne bien, il déclenche bien l'exécution de la classe RemplirVille, qui fait bien son taff aussi (rqt, data ok) sauf que l'affichage de la liste des villes ne se fait pas!

    Du coup, comme la liste ne s'affiche pas, on saisi 1 car de plus:
    -> enoughToFilter toujours ok puisqu'on est à min+1
    -> RemplirVille refait la rqt, ramène encore une fois les data.... et cette fois-ci, oh miracle, affiche bien la liste de choix.

    Une idée sur la question?

  2. #2
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    à priori, pas un problème de contexte d'affichage déjà...

  3. #3
    Expert éminent

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Points : 9 149
    Points
    9 149
    Par défaut
    Bonjour,

    Et si tu force ton adpater a se rafraichir avec un notifyDataSetChanged(), ca donne quoi ?

    J'ai l'impression que tu réutilises le même adpater et qu'il a du mal a se rafraichir essaye de le forcer !

    http://developer.android.com/referen...ayAdapter.html
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

  4. #4
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    Bonne idée oui.
    Mais test fait, et toujours pareil..........

    C'est vraiment un truc de fou!!
    Y a absolument rien de logique là dedans!

  5. #5
    Expert éminent

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Points : 9 149
    Points
    9 149
    Par défaut
    Hmm

    Essaye de rajouter un invalidateViews sur ta ListView après avoir mis à jour ton adpater et notifier son changement.

    http://developer.android.com/referen...alidateViews()


    Si cela ne marche pas essaye de passer par ton propre adapter pour pouvoir le débogguer tranquillement.
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

  6. #6
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    Idem pour le invalidate().

    Par contre, et ça te donnera peut être une idée:

    1.) le nb de caractères
    -> threshold: marche pas, on est d'accord

    -> threshold + 1: marche bien (sauf point 2 ci-dessous)

    -> on supprime un caractère dans la zone de la ville pour revenir à threshold: là ça marche(???), la liste s'affiche correctement.

    2.) rappel: problème que je pense lié à la même "source"
    -> depuis Async, bien que le listenner soit bien défini
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ville.setOnItemSelectedListener(this);
    -> on ne passe JAMAIS dedans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void onItemSelected(AdapterView<?> parent,View v, int position, long id)
    {
    Log.d("********debug");
    }

  7. #7
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    Ok, les news du jour:

    -> j'ai remplacé mon Async par un Thread tout à fait normal

    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
     
    	//globales
    	private Integer errorMsgId;
            private String  errorMsgParam;
    	private List<String> listeAffichageVille = new ArrayList<String>();
     
            public void onTextChanged(CharSequence s, int start, int before, int count) 
    	{    	
    		if (ville.enoughToFilter())		//REQUETE uniquement à partir de 'n' caractères saisis (threshold = 4 ici dans .XML)!
        	        {    		
    	  	    RemplirVille2 thread = new RemplirVille2(BASE_URL + "ville.php?ville=" + ville.getText());
    		    thread.start();
    		    while (thread.isAlive())
    		    {
    		    	//rien, juste attendre fin thread pour envoyer la liste à l'adapter
    		    	//Log.d("******* RUN", "");		    	
    		    }
     
    		    //équivalent du onPostExecute d'Async
    		    if (listeAffichageVille == null)	//si NULL alors problème...
    		    {
    				  if (errorMsgId != null) 
    			          {
                 String msg = TestActivity.this.getString(this.errorMsgId);
                 Toast.makeText(TestActivity.this,msg,Toast.LENGTH_LONG).show();
     
    			          }    
    		    }
    		    else				//.. SINON affecter les data à l'adapter!
    		   {
    				ville.setAdapter(new ArrayAdapter<String>(TestActivity.this,android.R.layout.simple_selectable_list_item,listeAffichageVille));
    		   }
        	}
    }
     
    public void onItemSelected(AdapterView<?> parent,View v, int position, long id)     
    {
           coucou("*****************toto");
           Log.d("#########","onItemSelected");
           villePosition = position;
           chercher(v);
    }
    -> le run() du thread, quasi identique au doItInBackground() de Async
    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
     
    class RemplirVille2 extends Thread
    {
    	private String URL;
     
    	public RemplirVille2(String url) 
    	{
    		this.URL = url;
    	}
     
    	public void run() 
    	{
    		ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
     
    		try 
    		{
    				 HttpClient httpclient = new DefaultHttpClient();	   
    				 HttpPost httppost = new HttpPost(URL);
    				 httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
    				 HttpResponse response = httpclient.execute(httppost);
     
    				 if (response.getStatusLine().getStatusCode() < 400) 
    				 {
    					  HttpEntity entity = response.getEntity();
    					  String entityStr = EntityUtils.toString(entity);
    					  JSONArray json_array = new JSONArray(entityStr);
     
    					  for(int i=0;i<json_array.length();i++) 
    					  {
    						  JSONObject json_ligne = json_array.getJSONObject(i);                            
    						  listeAffichageVille.add(json_ligne.getString("VILLE"));
    						  a_idVil.add(json_ligne.getString("CLEF_VILLE"));                              
    					  }
    				} 
    				else 
    				{
    					Log.d("***** TestActivity/THREAD RemplirVille2: EXCEPTION http error *****", "--"+response.getStatusLine().toString()+"--"); 
    					errorMsgId = R.string.http_site_error;
    					listeAffichageVille = null;                        
    				}
    		} 
    		catch (Exception ex) 
    		{
    				Log.d("***** TestActivity/THREAD RemplirVille2: EXCEPTION decode error *****", "--"+ex.toString()+"--");
    				errorMsgId = R.string.http_decode_error;
    				errorMsgParam = ex.getLocalizedMessage();
    				listeAffichageVille = null;
    		}  
    	}
    }
    Résultat:
    1.) la liste s'affiche bien à enoughToFilter............ MAIS que si je mets ma temporisation while (thread.isAlive()) avant d'affecter la liste à l'adapter
    -> sinon comme Async, que à (enoughToFilter+1)
    -> un peu louche & bricolage je trouve

    2.) le listener: on n'y passe toujours pas, bien qu'il soit évidemment correctement activé dans mon UI

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ville.setOnItemSelectedListener(this);
    Donc la problématique maintenant c'est de faire que cet écouteur soit bien exécuté!

  8. #8
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    C'est surtout que le thread n'a aucun interêt dans ce cas là... autant tout faire dans le même thread....


    Sinon le code est complet ?
    Parceque il y a des trucs bizarres:
    Utilisation de nameValuePairs vide
    Utilisation de "POST" pour faire du "GET" en HTTP ?

    Je vois pas pourquoi la différence "API 4.0" et "API 2.1" ?
    A part que la version "4.0" est propre et que la version "2.1" est très sale (network dans le main thread, donc très sale ^^)... les deux codes devraient compiler (et marcher même la version sale ) sous Android 2.x ?

    Sinon, rajoute du log...
    Par contre, un conseil:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Log.d("***** TestActivity/onTextChanged: JSONException *****", "--"+e1.toString()+"--");
    Va simplement logger un message contenant le nom dune exception (on n'aura aucune autre information que le fait qu'il y a eu une exception), dans un "module" appelé "***** TestActivity/onTextChanged: JSONException *****"
    Essaye plutot d'utiliser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Log.d("RemplirVille2","probleme de récupération onTextChanged",ex);
    Et bim, tu auras tout, le message, le module, et surtout l'exception (et sa stacktrace complete)
    On faisait du "********" il y a 20 ans dans les logs pour bien trouver son bout de code à soi, maintenant on peut filtrer un log-cat par appli, par level, par tag même !! donc bof

    En particulier pour les AsyncTask le log est primordial:
    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
     
    public XXXX doInBackground(.....)
    {
        XXXX ret = null;
        Log.d("MyTask","Début du traitement background: "+parametres);
        try {
            ....
        } catch (...) {
            Log.w("MyTask","Erreur du traitement background",ex);
            ...
        }
        Log.d("MyTask","Fin du traitement background: "+ret);
        return ret;
    }
     
    public void onPostExecute(XXXXX ret)
    {
        Log.i("MyTask","Finalisation: "+ret);
    }
    Déjà tu verras, si RemplirVille2 est appelé / démarré ... avec quels paramètres, et quels retours....
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  9. #9
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    Citation Envoyé par nicroman Voir le message
    Parceque il y a des trucs bizarres:
    Utilisation de nameValuePairs vide
    Utilisation de "POST" pour faire du "GET" en HTTP ?
    c'est simplement ce que tu m'avais filé sur un autre topic...

    pour le Async, j'ai déjà tout logué dans tous les sens:

    -> les passages: OK
    * ca passe exactement là ou ça doit... sauf qu'au 1er passage la listview ne s'affiche pas(????)!
    * messages logués avant & après le setAdapter

    -> les variables passées à l'adapter: OK, avec les bonnes data (context, data bdd)

    ce n'est pas un truc logique et gros comme une maison, mais une petite saloperie de m**** à la c** et bien vicieuse qui doit faire également que le listenner onItemSelected ne se lance pas, bien qu'il soit déclaré correctement!

    Je vais virer maboule!!

  10. #10
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    Autre idée (à la con? les solutions logiques sont épuisées, donc...): est ce que l'UI serait trop chargée (bien que les traitements lourds type réseaux soit en Async/Thread) et que certaines lignes de codes ne soient pas exécutées, tout simplement?

    A mon sens, pas impossible... pourquoi pas... sauf que dans ce cas là, le code skippé devrait être aléatoire, pas systématiquement identique, non?

  11. #11
    Expert éminent

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Points : 9 149
    Points
    9 149
    Par défaut
    Autre idée (à la con? les solutions logiques sont épuisées, donc...): est ce que l'UI serait trop chargée (bien que les traitements lourds type réseaux soit en Async/Thread) et que certaines lignes de codes ne soient pas exécutées, tout simplement?
    Ca m'étonnerait fort quand même.

    Après comme e te l'avais proposé, créer ton propre adapter pour voir ce qu'il se passe quand il se construit.

    Pour le onItemSelected cela peut provenir d'un mauvais Context, mais vu ce que tu nous montres je ne vois pas trop le problème.

    Essaye de passer par onTouchEvent pour voir si déjà tu arrives à 'catcher' les évènements sur ta liste
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

  12. #12
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    Ok, connais pas onTouchEvent mais vais essayer de voir ça.
    merci.

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

Discussions similaires

  1. Classe pour la création d'un graphe xy
    Par Bob dans le forum MFC
    Réponses: 24
    Dernier message: 03/12/2009, 17h20
  2. Réponses: 31
    Dernier message: 30/03/2006, 16h57
  3. Sortir un typedef d'une classe
    Par Theophil dans le forum C++Builder
    Réponses: 13
    Dernier message: 03/07/2002, 17h21

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