rbidocho
Messages postés41Date d'inscriptionjeudi 7 juin 2007StatutMembreDernière intervention15 septembre 2008
-
19 juin 2007 à 19:46
cs_Bidou
Messages postés5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 2013
-
19 juin 2007 à 21:35
Bonjour,
XP SP1, IDE SharpDevelop 1.1, Framework .Net 1.1
voila, après avoir réussi un programme en VB.NET, je cherche à le reprogrammer en C#.NET. Je suis débutant en C# et je ne comprend pas ce qui se passe dans le morceau de code ci dessous.
Normalement, quand je clique sur le Btn1, il me propose une boite de dialogue pour choisir un dossier et inscrire le resultat dans le textbox txtRépertoire.
Mais en compilant il me marque une erreur : "Une propriété ou un indexeurne peut pas être passé en tant que paramètre de sortie (out) ni de référence (ref)"
la question est donc pourquoi ??
-----------------------
void Btn1Click(object sender, System.EventArgs e)
{
this.ChoixDossier("Sélectionner le répertoire où sont enregistrés les fichiers contenant les données brutes",ref this.txtRépertoire.Text);
}//void BtnChangerRépertoireDonnéesBrutesClick
///<summary>
/// Fonction renvoyant le dossier selectionner à l'aide de la boite de dialogue.
///
/// Texte afficher dans la boite de dialogue pour indiquer le type de dossier recherché.
///
///</summary>
private string SelectionnerDossier(string txtDescription)
{
string tmptxt; //variable temporaire qui contiendra le chemin après le dispose
FolderBrowserDialog fBrowser = new FolderBrowserDialog(); fBrowser.RootFolder Environment.SpecialFolder.Desktop; //bureau chemin par défault
fBrowser.Description = txtDescription;//description passé en arguments
fBrowser.ShowDialog();//affichage
tmptxt = fBrowser.SelectedPath;
fBrowser.Dispose();
return tmptxt;
}//private string SelectionnerDossier(string txtDescription)
///<summary>
/// Méthode qui renvoie le chemin du dossier dans txtZoneText
/// </summary>
///
/// Variable contenant le chemin du dossier selectionner ou le chemin passé en argument si aucun dossier n'a été selectionné.
///
cs_niky
Messages postés168Date d'inscriptionjeudi 28 juin 2001StatutMembreDernière intervention18 octobre 20087 19 juin 2007 à 19:59
Salut,
Le pourquoi est un peu bizarre à expliquer... peut-être que quelqu'un le fera mieux que moi. En bref, il faut voir les accesseurs (comme Text dans this.txtRépertoire.Text) comme des méthodes :
this.txtRépertoire.getText();
et
this.txtRépertoire.setText(string value);
C'est d'ailleurs comme cela que ça marche en J# si je ne m'abuse.
Il est donc un peu compliqué pour le compilateur de passer en référence un accesseur (il faudrait plutôt passer un pointeur de fonction (cf. les délégués) mais c'est un peu trop compliqué pour ce que tu veux faire).
Pour résoudre ton problème, tu as, de mon point de vue, deux solutions :
1) soit tu changes le prototype de ChoixDossier :
string ChoixDossier(string txtDescription)
{
//... ton code
// utilises return pour renvoyer ce qui devrait être dans txtZoneText
}
2) tu modifies le code de BtnClick1 comme suit :
String temp = this.txtRépertoire.Text;
this.ChoixDossier("Sélectionner le répertoire où sont enregistrés les fichiers contenant les données brutes",ref temp);
this.txtRépertoire.Text = temp;
rbidocho
Messages postés41Date d'inscriptionjeudi 7 juin 2007StatutMembreDernière intervention15 septembre 2008 19 juin 2007 à 20:39
Merci Niky,
j'ai utilisé la deuxième méthode pour l'instant.
La deuxième est plus compliqué à mettre en oeuvre car en fait les fonctions choixdossier et selectiondossier vont être utiliser pour plusieurs boutons.
cs_Bidou
Messages postés5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 201362 19 juin 2007 à 21:35
Dans les spécifications de C#, il est indiqué que ref et out prennent des variables et pas des indexeurs (ou properties).
Plus intéressant: cette opération est tout à fait faisable en VB.NET.
Si on regarde le code généré par le compilo, on voit qu'il fait lui même le changement nécessaire en passant par une variable intermédiaire.