Bonjour à tous;
Suis plutôt novice en C#, mais suis parvenu à faire un petit projet de sauvegarde de répertoires vers un autre disque dur ...
Je vais essayé d'etre bref: Dans ma WinForm, j'ai deux ListBox où je choisis le Dir origine et le Dir destination (sur des disques differents)...Une fois mon choix effectué, je lance l'operation de sauvegarde sur un thred secondaire... c'est lui qui ecrit dans une autre ListBox le détail du déroulement des opérations: création ou suppression de repertoires, copie ou suppression de fichiers .... et tout cela fonctionne à merveille.
Mais je voudrai améliorer le confort de l'utisateur en le prevenant lors d'une copie de gros fichiers (video)... pour le faire patienter et lui donner l'information de copie ...
Ma première idée était d'afficher un control "textbox" et lui renvoyer l'info de la copie (Visible=true en debut de copie .. et Visible = false en fin de copie ...).Malgré la bonne éxécution du prog, aucun " textbox" ne s'affiche (j'imagine qu'il s'affiche derrière la ListBox où sont historisés le déroulement des opérations). Alors comment le faire afficher en premier plan, visible par l'utilisateur, pour info de copie ???
Ma seconde idée etait d'afficher une "MessageBox" avec la même info pour l'utisateur. Cette solution fonctionne mais je voudrais m'affranchir du click opérateur puisque le nombre de copie peut etre conséquent. Est il possible d'afficher une "MessageBox" durant quelques secondes sans intervention de l'utilisateur???? La première solution est celle que j'adopterai si ca marche...
Je vous donne le code de ma méthode dont le principe est :
- Premier appel de la méthode au début de la copie de fichier ==> affichage de la "textbox" au premier plan informant l'utilisateur.
- Déroulement de l'opération de copie de fichier par la méthode Fille::Copy(...).
- Deuxième appel de la méthode (txt = "f_e_r_m_e_r" ), en fin de copie qui doit fermer la "textbox".
public: void affich_label_de_thread( String^ txt)
{
if (this->textbox_thread->InvokeRequired)
{
MonDelegateHandler^ del_async_1 = gcnew MonDelegateHandler(this, &Form1::affich_label_de_thread);
this->textbox_thread->Invoke(del_async_1, txt);
}
else
{
if (txt->String::Contains("f_e_r_m_e_r"))
{
this->textbox_thread->Visible = false;
}
else
{
//MessageBox::Show(txt," Patience !!!");
this->textbox_thread->Enabled;
this->textbox_thread->Visible = true;
this->textbox_thread->Text = txt;
} // fin du else
} // fin du else
} //fin de la methode
Si je décoche MessageBox::Show la box s'affiche bien mais je veux affranchir l'utilisateur d'un click sur un bouton. Mais tel que, la textbox ne s'affiche pas.
Enespérant avoir été assez clair, Grand merci d'avance pour votre aide.
(Suis désolé, je n'ai pas réussi à mieux concentrer mon code , la fonction [IDENT] de l'éditeur ??? Dites moi comment procéder à l'avenir)
Le code que tu donnes n'est pas du C#, mais du C++/CLI alias C++ .Net
Dans un cas comme dans l'autre ton post n'est pas à sa place dans ce forum mais devrait se trouver dans le forum .Net. Nous avons déjà parlé de cela ensemble je crois.
Pour ton problème, comme c'est dimanche je n'ai pas eu le courage de te lire attentivement (mille pardons :oops: ) Mais je crois avoir saisi que tu veux faire apparaître un composant selon le besoin, mais depuis un thread. Si c'est bien ça, tu dois t'inspirer de la réponse que je t'ai donné à une question similaire que tu avais posée ici:
http://www.programmez.com/forum/viewtopic.php?p=3829&highlight=#3829
Avec dans ce cas la différence que Invoke doit être appelée sur la Form. je crois me souvenir que la Form hérite de la méthode Invoke via la classe Control. Si ce n'est pas le cas, tu mets TextBox dans un Panel et tu appelle Invoke depuis le Panel. Quelle m'éthode invoquer par ce biais ? Je ne sais pas, je ne l'ai pas en tête :oops: C'est dimanche matin... :oops: Un truc du genre Update ou quelque chose dans cet esprit. Tu vas bien trouver :)
A l'avenir, je compte sur toi pour poster dans le bon forum (i.e .Net)
Merci à toi FrédéricMazue;
C'est vrai, excuse, mon code est du C++/CLI...
Je developpe aussi en C# (d'ailleurs je ne vois guèrre de différence entre les deux....syntaxe qui se ressemble fort ...). Et je ne sais pas en discerner l'avantage de l'un par rapport à l'autre (ce doit être une lacune de ma part !!!).
Pour mon pb d'affichage, il faut que je déclare la ListBox du premier plan , Visible = false; pour voir la TextBox qui m'interresse.... Même les methode Invalidate() et Update(), ou encore Refresh() sur ce Control ne forcent l'affichage au premier plan...
Merci de votre aide par avance.... et promis, à l'avenir, je posterai sur le bon forum...
Non seulement il n'y a pas de lacune, mais c'est, bien au contraire, finement observé. Ils se ressemblent et on peut dire très exactement la même chose de VB .Net. La syntaxe est là un peu plus différente, mais ça ne change rien au fond et on code de la même façon avec tous ces langages. Pourquoi tant de langages identiques alors ? A mon humble avis la raison est plus marketing que technique :)
Je relis mon post d'hier et je me dis que je n'ai pas été clair. Je voulais dire à la fois affecter la propriété Visible et invoker Upadate() (ou autre) comme expliqué.
D'un autre côté je vois "premier plan" et je me dis que je n'avais pas capté la question. Tu surperposes des contrôles et que veux que l'un cache l'autre et réciproquement, c'est ça ? Bref, tu veux contrôler ce qu'on appelle le z-order, c'est à dire l'ordre d'empilement. Ca doit pouvoir se faire en .Net mais je ne sais pas comment, car je ne l'ai jamais fait.
Je dirais qu'une Form étant un "ContainerControl", elle doit détenir une liste (ou une collection pour parler .Net) de contrôles enfant (je crois que c'est Controls), et je suppose qu'en intervenant sur l'ordre dans la collection, tu interviens indirectement sur l'ordre d'affichage et donc sur le z-order.
Mais il y a peut être beaucoup plus simple et direct.
Grand merci à toi Frédéric.
Si tu confirme que je n'ai point de lacune sur l'appréciation de différence netre C++/CLI et C# , alors j'en suis ravi.
Finalement, quand à mon pb d'affichage de TextBox en "premier plan", j'ai trouvé une solution.... en disposant differemment les "Control" ListBox, Button, label.... et TextBox de telle manière que les uns s'affichent "à coté " des autres .... et cette disposition me convient parfaitement.... Mon thread secondaire éxécute la sauvegarde de répertoires ( données perso) vers un autre disque dur et historise le déroulement de sopérations dans une ListBox et suis avisé des opérations plus longues (copie de fichiers videos) dans le TextBox juste au dessus de la List Box qui n'est "Visible = true;" que durant les copies...
Voila, j'ai finalisé ce petit projet à dispoqition des adhérents du club informatique.
Encore grand merci à Frédéric pour ton ecoute.
A+++++++++++++++